source: xtideuniversalbios/trunk/Assembly_Library/Src/Display/DisplayCharOut.asm@ 42

Last change on this file since 42 was 42, checked in by Tomi Tilli, 14 years ago

Display Library no more produces CGA snow.

File size: 7.0 KB
Line 
1; File name : DisplayCharOut.asm
2; Project name : Assembly Library
3; Created date : 26.6.2010
4; Last update : 18.9.2010
5; Author : Tomi Tilli
6; Description : Functions for outputting characters to video memory.
7; These functions are meant to be called by Display_CharacterFromAL
8; and Display_RepeatCharacterFromAL using function pointer
9; stored in DISPLAY_CONTEXT.
10
11; Section containing code
12SECTION .text
13
14;--------------------------------------------------------------------
15; WAIT_RETRACE_IF_NECESSARY_THEN
16; Parameters:
17; AL: Character to output
18; AH: Attribute to output (stosw only)
19; DS: BDA segment (zero)
20; ES:DI: Ptr to video memory where to output
21; Returns:
22; DI: Incremented for next character
23; Corrupts registers:
24; AX, DX
25;--------------------------------------------------------------------
26%macro WAIT_RETRACE_IF_NECESSARY_THEN 1
27%ifdef ELIMINATE_CGA_SNOW
28 %ifidn %1, stosb
29 call StosbWithoutCgaSnow
30 %else
31 call StoswWithoutCgaSnow
32 %endif
33%else
34 %1 ; STOSB or STOSW
35%endif
36%endmacro
37
38
39;--------------------------------------------------------------------
40; DisplayCharOut_TeletypeOutputWithAttribute
41; DisplayCharOut_TeletypeOutput
42; Parameters:
43; AL: Character to output
44; AH: Attribute to output
45; DS: BDA segment (zero)
46; ES:DI: Ptr to video memory where to output
47; Returns:
48; DI: Incremented for next character
49; Corrupts registers:
50; AX, DX
51;--------------------------------------------------------------------
52ALIGN JUMP_ALIGN
53DisplayCharOut_TeletypeOutputWithAttribute:
54 cmp al, ' ' ; Printable character?
55 jb SHORT DisplayCharOut_BiosTeletypeOutput
56 WAIT_RETRACE_IF_NECESSARY_THEN stosw
57 ret
58
59ALIGN JUMP_ALIGN
60DisplayCharOut_TeletypeOutput:
61 cmp al, ' ' ; Printable character?
62 jae SHORT DisplayCharOut_Character
63 ; Fall to DisplayCharOut_BiosTeletypeOutput
64
65;--------------------------------------------------------------------
66; DisplayCharOut_BiosTeletypeOutput
67; Parameters:
68; AL: Control character
69; DS: BDA segment (zero)
70; ES:DI: Ptr to video memory where to output
71; Returns:
72; DI: Incremented for next character
73; Corrupts registers:
74; AX, DX
75;--------------------------------------------------------------------
76ALIGN JUMP_ALIGN
77DisplayCharOut_BiosTeletypeOutput:
78 push ax
79 call DisplayCursor_SynchronizeCoordinatesToHardware
80 pop ax
81 call .OutputCharacterWithBIOS
82 call DisplayCursor_GetHardwareCoordinatesToAX
83 jmp DisplayCursor_SetCoordinatesFromAX
84
85;--------------------------------------------------------------------
86; .OutputCharacterWithBIOS
87; Parameters:
88; AL: Character to output
89; DS: BDA segment
90; Returns:
91; Nothing
92; Corrupts registers:
93; AX
94;--------------------------------------------------------------------
95ALIGN JUMP_ALIGN
96.OutputCharacterWithBIOS:
97 push bx
98 mov ah, TELETYPE_OUTPUT
99 mov bh, [VIDEO_BDA.bActivePage]
100 int BIOS_VIDEO_INTERRUPT_10h
101 pop bx
102 ret
103
104
105;--------------------------------------------------------------------
106; DisplayCharOut_Attribute
107; DisplayCharOut_Character
108; DisplayCharOut_CharacterWithAttribute
109; Parameters:
110; AL: Character to output
111; AH: Attribute to output
112; DS: BDA segment (zero)
113; ES:DI: Ptr to video memory where to output
114; Returns:
115; DI: Incremented for next character
116; Corrupts registers:
117; AX, DX
118;--------------------------------------------------------------------
119ALIGN JUMP_ALIGN
120DisplayCharOut_Attribute:
121 xchg al, ah ; Swap character and attribute
122 inc di ; Skip character
123 WAIT_RETRACE_IF_NECESSARY_THEN stosb
124 ret
125
126ALIGN JUMP_ALIGN
127DisplayCharOut_Character:
128 WAIT_RETRACE_IF_NECESSARY_THEN stosb
129 inc di ; Skip attribute
130 ret
131
132ALIGN JUMP_ALIGN
133DisplayCharOut_CharacterWithAttribute:
134 WAIT_RETRACE_IF_NECESSARY_THEN stosw
135 ret
136
137
138;--------------------------------------------------------------------
139; DisplayCharOut_WriteCharacterToBuffer
140; Parameters:
141; AL: Character to output
142; DS: BDA segment (zero)
143; ES:DI: Ptr to destination string buffer
144; DISPLAY_CONTEXT.wCharOutParam: Offset to end of buffer (one past last)
145; Returns:
146; ES:DI: Updated for next character
147; Corrupts registers:
148; AX, DX
149;--------------------------------------------------------------------
150ALIGN JUMP_ALIGN
151DisplayCharOut_WriteCharacterToBuffer:
152 cmp di, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam]
153 jae SHORT .BufferFull
154 stosb
155.BufferFull:
156 ret
157
158
159; STOSB and STOSW replacement functions to prevent CGA snow. These will slow
160; drawing a lot so use them only if it is necessary to eliminate CGA snow.
161%ifdef ELIMINATE_CGA_SNOW
162
163OFFSET_TO_CGA_STATUS_REGISTER EQU 6 ; Base port 3D4h + 6 = 3DAh
164CGA_STATUS_REGISTER EQU 3DAh
165
166;--------------------------------------------------------------------
167; WAIT_UNTIL_SAFE_CGA_WRITE
168; Parameters:
169; DX: CGA Status Register Address (3DAh)
170; Returns:
171; Interrupts disabled
172; Corrupts registers:
173; AL
174;--------------------------------------------------------------------
175%macro WAIT_UNTIL_SAFE_CGA_WRITE 0
176 cli ; Interrupt request would mess up timing
177%%WaitUntilNotInRetrace:
178 in al, dx
179 shr al, 1 ; 1 = Bit 0: A 1 indicates that regen-buffer memory access can be
180 ; made without interfering with the display. (H or V retrace)
181 jc SHORT %%WaitUntilNotInRetrace
182 sti
183 nop ; Should have time to serve IRQ here
184 cli
185%%WaitUntilNextRetraceStarts:
186 in al, dx
187 shr al, 1
188 jnc SHORT %%WaitUntilNextRetraceStarts
189%endmacro
190
191;--------------------------------------------------------------------
192; StosbWithoutCgaSnow
193; StoswWithoutCgaSnow
194; Parameters:
195; AL: Character to output
196; AH: Attribute to output (StoswWithoutCgaSnow only)
197; DS: BDA segment (zero)
198; ES:DI: Ptr to video memory where to output
199; Returns:
200; DI: Incremented for next character
201; Corrupts registers:
202; AX, DX
203;--------------------------------------------------------------------
204ALIGN JUMP_ALIGN
205StosbWithoutCgaSnow:
206 call LoadAndVerifyStatusRegisterFromBDA
207 jne SHORT .StosbWithoutWaitSinceUnknownPort
208
209 mov ah, al
210 WAIT_UNTIL_SAFE_CGA_WRITE
211 mov al, ah
212 stosb
213 sti
214 ret
215ALIGN JUMP_ALIGN
216.StosbWithoutWaitSinceUnknownPort:
217 stosb
218 ret
219
220ALIGN JUMP_ALIGN
221StoswWithoutCgaSnow:
222 call LoadAndVerifyStatusRegisterFromBDA
223 jne SHORT .StoswWithoutWaitSinceUnknownPort
224
225 push bx
226 xchg bx, ax
227 WAIT_UNTIL_SAFE_CGA_WRITE
228 xchg ax, bx
229 stosw
230 pop bx
231 sti
232 ret
233ALIGN JUMP_ALIGN
234.StoswWithoutWaitSinceUnknownPort:
235 stosw
236 ret
237
238;--------------------------------------------------------------------
239; LoadAndVerifyStatusRegisterFromBDA
240; Parameters:
241; DS: BDA segment (zero)
242; Returns:
243; DX: CGA Status Register Address
244; ZF: Set if CGA Base Port found in BDA
245; Corrupts registers:
246; Nothing
247;--------------------------------------------------------------------
248ALIGN JUMP_ALIGN
249LoadAndVerifyStatusRegisterFromBDA:
250 mov dx, [BDA.wVidPort]
251 add dl, OFFSET_TO_CGA_STATUS_REGISTER
252 cmp dx, CGA_STATUS_REGISTER
253 ret
254
255%endif ; ELIMINATE_CGA_SNOW
Note: See TracBrowser for help on using the repository browser.