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

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

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

File size: 6.9 KB
RevLine 
[41]1; File name : DisplayCharOut.asm
2; Project name : Assembly Library
3; Created date : 26.6.2010
[47]4; Last update : 4.10.2010
[41]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;--------------------------------------------------------------------
[42]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;--------------------------------------------------------------------
[41]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
[42]56 WAIT_RETRACE_IF_NECESSARY_THEN stosw
[41]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
[42]112; DS: BDA segment (zero)
[41]113; ES:DI: Ptr to video memory where to output
114; Returns:
115; DI: Incremented for next character
116; Corrupts registers:
[42]117; AX, DX
[41]118;--------------------------------------------------------------------
119ALIGN JUMP_ALIGN
120DisplayCharOut_Attribute:
121 xchg al, ah ; Swap character and attribute
122 inc di ; Skip character
[42]123 WAIT_RETRACE_IF_NECESSARY_THEN stosb
[41]124 ret
125
126ALIGN JUMP_ALIGN
127DisplayCharOut_Character:
[42]128 WAIT_RETRACE_IF_NECESSARY_THEN stosb
[41]129 inc di ; Skip attribute
130 ret
131
132ALIGN JUMP_ALIGN
133DisplayCharOut_CharacterWithAttribute:
[42]134 WAIT_RETRACE_IF_NECESSARY_THEN stosw
[41]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
[42]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:
[47]171; Nothing
[42]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:
[47]202 call DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA
[42]203 jne SHORT .StosbWithoutWaitSinceUnknownPort
204
205 mov ah, al
[47]206 cli ; Interrupt request would mess up timing
[42]207 WAIT_UNTIL_SAFE_CGA_WRITE
208 mov al, ah
[47]209.StosbWithoutWaitSinceUnknownPort:
[42]210 stosb
211 sti
212 ret
213
214ALIGN JUMP_ALIGN
215StoswWithoutCgaSnow:
[47]216 push bx
217 call DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA
[42]218 jne SHORT .StoswWithoutWaitSinceUnknownPort
219
220 xchg bx, ax
[47]221 cli ; Interrupt request would mess up timing
[42]222 WAIT_UNTIL_SAFE_CGA_WRITE
223 xchg ax, bx
[47]224.StoswWithoutWaitSinceUnknownPort:
[42]225 stosw
226 pop bx
227 sti
228 ret
229
[47]230
[42]231;--------------------------------------------------------------------
[47]232; DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA
[42]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
[47]242DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA:
[42]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.