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

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

Assembly Library:
CGA snow prevention now works when copying strings on formatted printing.

File size: 6.9 KB
Line 
1; File name : DisplayCharOut.asm
2; Project name : Assembly Library
3; Created date : 26.6.2010
4; Last update : 4.10.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; Nothing
172; Corrupts registers:
173; AL
174;--------------------------------------------------------------------
175%macro WAIT_UNTIL_SAFE_CGA_WRITE 0
176%%WaitUntilNotInRetrace:
177 in al, dx
178 shr al, 1 ; 1 = Bit 0: A 1 indicates that regen-buffer memory access can be
179 ; made without interfering with the display. (H or V retrace)
180 jc SHORT %%WaitUntilNotInRetrace
181%%WaitUntilNextRetraceStarts:
182 in al, dx
183 shr al, 1
184 jnc SHORT %%WaitUntilNextRetraceStarts
185%endmacro
186
187;--------------------------------------------------------------------
188; StosbWithoutCgaSnow
189; StoswWithoutCgaSnow
190; Parameters:
191; AL: Character to output
192; AH: Attribute to output (StoswWithoutCgaSnow only)
193; DS: BDA segment (zero)
194; ES:DI: Ptr to video memory where to output
195; Returns:
196; DI: Incremented for next character
197; Corrupts registers:
198; AX, DX
199;--------------------------------------------------------------------
200ALIGN JUMP_ALIGN
201StosbWithoutCgaSnow:
202 call DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA
203 jne SHORT .StosbWithoutWaitSinceUnknownPort
204
205 mov ah, al
206 cli ; Interrupt request would mess up timing
207 WAIT_UNTIL_SAFE_CGA_WRITE
208 mov al, ah
209.StosbWithoutWaitSinceUnknownPort:
210 stosb
211 sti
212 ret
213
214ALIGN JUMP_ALIGN
215StoswWithoutCgaSnow:
216 push bx
217 call DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA
218 jne SHORT .StoswWithoutWaitSinceUnknownPort
219
220 xchg bx, ax
221 cli ; Interrupt request would mess up timing
222 WAIT_UNTIL_SAFE_CGA_WRITE
223 xchg ax, bx
224.StoswWithoutWaitSinceUnknownPort:
225 stosw
226 pop bx
227 sti
228 ret
229
230
231;--------------------------------------------------------------------
232; DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA
233; Parameters:
234; DS: BDA segment (zero)
235; Returns:
236; DX: CGA Status Register Address
237; ZF: Set if CGA Base Port found in BDA
238; Corrupts registers:
239; Nothing
240;--------------------------------------------------------------------
241ALIGN JUMP_ALIGN
242DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA:
243 mov dx, [BDA.wVidPort]
244 add dl, OFFSET_TO_CGA_STATUS_REGISTER
245 cmp dx, CGA_STATUS_REGISTER
246 ret
247
248%endif ; ELIMINATE_CGA_SNOW
Note: See TracBrowser for help on using the repository browser.