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

Last change on this file since 44 was 44, checked in by aitotat, 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.