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

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