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

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

Spaces can now be generated before format specifier when printing formatted string.
Background character and attribute can now be easily specified before compiling.

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 : 22.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%%WaitUntilNextRetraceStarts:
183 in al, dx
184 shr al, 1
185 jnc SHORT %%WaitUntilNextRetraceStarts
186%endmacro
187
188;--------------------------------------------------------------------
189; StosbWithoutCgaSnow
190; StoswWithoutCgaSnow
191; Parameters:
192; AL: Character to output
193; AH: Attribute to output (StoswWithoutCgaSnow only)
194; DS: BDA segment (zero)
195; ES:DI: Ptr to video memory where to output
196; Returns:
197; DI: Incremented for next character
198; Corrupts registers:
199; AX, DX
200;--------------------------------------------------------------------
201ALIGN JUMP_ALIGN
202StosbWithoutCgaSnow:
203 call LoadAndVerifyStatusRegisterFromBDA
204 jne SHORT .StosbWithoutWaitSinceUnknownPort
205
206 mov ah, al
207 WAIT_UNTIL_SAFE_CGA_WRITE
208 mov al, ah
209 stosb
210 sti
211 ret
212ALIGN JUMP_ALIGN
213.StosbWithoutWaitSinceUnknownPort:
214 stosb
215 ret
216
217ALIGN JUMP_ALIGN
218StoswWithoutCgaSnow:
219 call LoadAndVerifyStatusRegisterFromBDA
220 jne SHORT .StoswWithoutWaitSinceUnknownPort
221
222 push bx
223 xchg bx, ax
224 WAIT_UNTIL_SAFE_CGA_WRITE
225 xchg ax, bx
226 stosw
227 pop bx
228 sti
229 ret
230ALIGN JUMP_ALIGN
231.StoswWithoutWaitSinceUnknownPort:
232 stosw
233 ret
234
235;--------------------------------------------------------------------
236; LoadAndVerifyStatusRegisterFromBDA
237; Parameters:
238; DS: BDA segment (zero)
239; Returns:
240; DX: CGA Status Register Address
241; ZF: Set if CGA Base Port found in BDA
242; Corrupts registers:
243; Nothing
244;--------------------------------------------------------------------
245ALIGN JUMP_ALIGN
246LoadAndVerifyStatusRegisterFromBDA:
247 mov dx, [BDA.wVidPort]
248 add dl, OFFSET_TO_CGA_STATUS_REGISTER
249 cmp dx, CGA_STATUS_REGISTER
250 ret
251
252%endif ; ELIMINATE_CGA_SNOW
Note: See TracBrowser for help on using the repository browser.