source: xtideuniversalbios/trunk/Assembly_Library/Src/Display/DisplayPrint.asm @ 41

Last change on this file since 41 was 41, checked in by aitotat, 14 years ago

Initial commit for Assembly Library.

File size: 10.2 KB
Line 
1; File name     :   Display.asm
2; Project name  :   Assembly Library
3; Created date  :   26.6.2010
4; Last update   :   10.8.2010
5; Author        :   Tomi Tilli
6; Description   :   Functions for display output.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; Supports following formatting types:
13;   %a      Specifies attribute for next character
14;   %A      Specifies attribute for remaining string (or until next %A)
15;   %d      Prints signed 16-bit decimal integer
16;   %u      Prints unsigned 16-bit decimal integer
17;   %x      Prints 16-bit hexadecimal integer
18;   %s      Prints string (from CS segment)
19;   %S      Prints string (far pointer)
20;   %c      Prints character
21;   %t      Prints character number of times (character needs to be pushed first, then repeat times)
22;   %%      Prints '%' character (no parameter pushed)
23;
24;   Any placeholder can be set to minimum length by specifying
25;   minimum number of characters. For example %8d would append spaces
26;   after integer so that at least 8 characters would be printed.
27; 
28; DisplayPrint_FormattedNullTerminatedStringFromCSSI
29;   Parameters:
30;       BP:     SP before pushing parameters
31;       DS:     BDA segment (zero)
32;       CS:SI:  Pointer to string to format
33;       ES:DI:  Ptr to cursor location in video RAM
34;       Stack:  Parameters for formatting placeholders.
35;               Parameter for first placeholder must be pushed first.
36;               Low word must pushed first for placeholders requiring
37;               32-bit parameters (two words).
38;   Returns:
39;       DI:     Updated offset to video RAM
40;   Corrupts registers:
41;       AX, DX
42;--------------------------------------------------------------------
43ALIGN JUMP_ALIGN
44DisplayPrint_FormattedNullTerminatedStringFromCSSI:
45    push    bp
46    push    si
47    push    cx
48    push    bx
49    push    WORD [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
50
51    dec     bp                  ; Point BP to...
52    dec     bp                  ; ...first stack parameter
53    call    DisplayFormat_ParseCharacters
54
55    ; Pop original character attribute
56    pop     ax
57    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute], al
58
59    pop     bx
60    pop     cx
61    pop     si
62    pop     bp
63    ret
64
65
66;--------------------------------------------------------------------
67; DisplayPrint_SignedDecimalIntegerFromAX
68;   Parameters:
69;       AX:     Word to display
70;       DS:     BDA segment (zero)
71;       ES:DI:  Ptr to cursor location in video RAM
72;   Returns:
73;       BX:     Number of characters printed
74;       DI:     Updated offset to video RAM
75;   Corrupts registers:
76;       AX, DX
77;--------------------------------------------------------------------
78ALIGN JUMP_ALIGN
79DisplayPrint_SignedDecimalIntegerFromAX:
80    mov     bx, 10
81    test    ah, 1<<7            ; Sign bit set?
82    jz      SHORT DisplayPrint_WordFromAXWithBaseInBX
83
84    push    ax
85    mov     al, '-'
86    call    DisplayPrint_CharacterFromAL
87    pop     ax
88    neg     ax
89    call    DisplayPrint_WordFromAXWithBaseInBX
90    inc     bx                  ; Increment character count for '-'
91    ret
92
93
94;--------------------------------------------------------------------
95; DisplayPrint_WordFromAXWithBaseInBX
96;   Parameters:
97;       AX:     Word to display
98;       BX:     Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
99;       DS:     BDA segment (zero)
100;       ES:DI:  Ptr to cursor location in video RAM
101;   Returns:
102;       BX:     Number of characters printed
103;       DI:     Updated offset to video RAM
104;   Corrupts registers:
105;       AX, DX
106;--------------------------------------------------------------------
107ALIGN JUMP_ALIGN
108DisplayPrint_WordFromAXWithBaseInBX:
109    push    cx
110
111    xor     cx, cx
112ALIGN JUMP_ALIGN
113.DivideLoop:
114    xor     dx, dx              ; DX:AX now holds the integer
115    div     bx                  ; Divide DX:AX by base
116    push    dx                  ; Push remainder
117    inc     cx                  ; Increment character count
118    test    ax, ax              ; All divided?
119    jnz     SHORT .DivideLoop   ;  If not, loop
120    mov     dx, cx              ; Character count to DX
121ALIGN JUMP_ALIGN
122.PrintLoop:
123    pop     bx                  ; Pop digit
124    mov     al, [cs:bx+.rgcDigitToCharacter]
125    call    DisplayPrint_CharacterFromAL
126    loop    .PrintLoop
127    mov     bx, dx              ; Return characters printed
128
129    pop     cx
130    ret
131.rgcDigitToCharacter:   db  "0123456789ABCDEF"
132
133
134;--------------------------------------------------------------------
135; DisplayPrint_CharacterBufferFromBXSIwithLengthInCX
136;   Parameters:
137;       CX:     Buffer length (characters)
138;       BX:SI:  Ptr to NULL terminated string
139;       DS:     BDA segment (zero)
140;       ES:DI:  Ptr to cursor location in video RAM
141;   Returns:
142;       BX:     Number of characters printed
143;       DI:     Updated offset to video RAM
144;   Corrupts registers:
145;       AX, DX
146;--------------------------------------------------------------------
147ALIGN JUMP_ALIGN
148DisplayPrint_CharacterBufferFromBXSIwithLengthInCX:
149    push    cx
150
151    mov     es, bx                  ; Buffer now in ES:SI
152    xor     bx, bx                  ; Zero character counter
153    jcxz    .BufferPrinted
154ALIGN JUMP_ALIGN
155.CharacterOutputLoop:
156    mov     al, [es:bx+si]
157    inc     bx
158    call    LoadDisplaySegmentAndPrintCharacterFromAL
159    loop    .CharacterOutputLoop
160.BufferPrinted:
161    mov     es, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2]
162    pop     cx
163    ret
164
165
166;--------------------------------------------------------------------
167; DisplayPrint_NullTerminatedStringFromCSSI
168;   Parameters:
169;       CS:SI:  Ptr to NULL terminated string
170;       DS:     BDA segment (zero)
171;       ES:DI:  Ptr to cursor location in video RAM
172;   Returns:
173;       BX:     Number of characters printed
174;       DI:     Updated offset to video RAM
175;   Corrupts registers:
176;       AX, DX
177;--------------------------------------------------------------------
178ALIGN JUMP_ALIGN
179DisplayPrint_NullTerminatedStringFromCSSI:
180    mov     bx, cs
181    ; Fall to DisplayPrint_NullTerminatedStringFromBXSI
182
183;--------------------------------------------------------------------
184; DisplayPrint_NullTerminatedStringFromBXSI
185;   Parameters:
186;       DS:     BDA segment (zero)
187;       BX:SI:  Ptr to NULL terminated string
188;       ES:DI:  Ptr to cursor location in video RAM
189;   Returns:
190;       BX:     Number of characters printed
191;       DI:     Updated offset to video RAM
192;   Corrupts registers:
193;       AX, DX
194;--------------------------------------------------------------------
195ALIGN JUMP_ALIGN
196DisplayPrint_NullTerminatedStringFromBXSI:
197    mov     es, bx                  ; String now in ES:SI
198    xor     bx, bx                  ; Zero character counter
199ALIGN JUMP_ALIGN
200.CharacterOutputLoop:
201    mov     al, [es:bx+si]
202    test    al, al
203    jz      SHORT .AllCharacterPrinted
204    inc     bx
205
206    call    LoadDisplaySegmentAndPrintCharacterFromAL
207    jmp     SHORT .CharacterOutputLoop
208ALIGN JUMP_ALIGN
209.AllCharacterPrinted:
210    mov     es, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2]
211    ret
212
213;--------------------------------------------------------------------
214; LoadDisplaySegmentAndPrintCharacterFromAL
215;   Parameters:
216;       AL:     Character to print
217;       DI:     Offset to cursor location in video RAM
218;       DS:     BDA segment (zero)
219;   Returns:
220;       DI:     Updated offset to video RAM
221;   Corrupts registers:
222;       AX, DX
223;--------------------------------------------------------------------
224ALIGN JUMP_ALIGN
225LoadDisplaySegmentAndPrintCharacterFromAL:
226    push    es
227    mov     es, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition+2]
228    call    DisplayPrint_CharacterFromAL
229    pop     es
230    ret
231
232
233;--------------------------------------------------------------------
234; DisplayPrint_Newline
235;   Parameters:
236;       DS:     BDA segment (zero)
237;       ES:DI:  Ptr to cursor location in video RAM
238;   Returns:
239;       DI:     Updated offset to video RAM
240;   Corrupts registers:
241;       AX, DX
242;--------------------------------------------------------------------
243ALIGN JUMP_ALIGN
244DisplayPrint_Newline:
245    mov     al, CR
246    call    DisplayPrint_CharacterFromAL
247    mov     al, LF
248    jmp     SHORT DisplayPrint_CharacterFromAL
249
250
251;--------------------------------------------------------------------
252; DisplayPrint_RepeatCharacterFromALwithCountInCX
253;   Parameters:
254;       AL:     Character to display
255;       CX:     Repeat count
256;       DS:     BDA segment (zero)
257;       ES:DI:  Ptr to cursor location in video RAM
258;   Returns:
259;       DI:     Updated offset to video RAM
260;   Corrupts registers:
261;       AX, DX
262;--------------------------------------------------------------------
263ALIGN JUMP_ALIGN
264DisplayPrint_RepeatCharacterFromALwithCountInCX:
265    push    ax
266    call    DisplayPrint_CharacterFromAL
267    pop     ax
268    loop    DisplayPrint_RepeatCharacterFromALwithCountInCX
269    ret
270
271
272;--------------------------------------------------------------------
273; DisplayPrint_CharacterFromAL
274;   Parameters:
275;       AL:     Character to display
276;       DS:     BDA segment (zero)
277;       ES:DI:  Ptr to cursor location in video RAM
278;   Returns:
279;       DI:     Updated offset to video RAM
280;   Corrupts registers:
281;       AX, DX
282;--------------------------------------------------------------------
283ALIGN JUMP_ALIGN
284DisplayPrint_CharacterFromAL:
285    mov     ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
286    jmp     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut]
287
288
289;--------------------------------------------------------------------
290; DisplayPrint_ClearScreen
291;   Parameters:
292;       DS:     BDA segment (zero)
293;       ES:DI:  Ptr to cursor location in video RAM
294;   Returns:
295;       Nothing
296;   Corrupts registers:
297;       AX, DX
298;--------------------------------------------------------------------
299ALIGN JUMP_ALIGN
300DisplayPrint_ClearScreen:
301    push    di
302    xor     ax, ax
303    call    DisplayCursor_SetCoordinatesFromAX
304    call    DisplayPage_GetColumnsToALandRowsToAH
305    call    DisplayPrint_ClearAreaWithHeightInAHandWidthInAL
306    pop     di
307    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], di
308    ret
309
310
311;--------------------------------------------------------------------
312; DisplayPrint_ClearAreaWithHeightInAHandWidthInAL
313;   Parameters:
314;       AH:     Area height
315;       AL:     Area width
316;       DS:     BDA segment (zero)
317;       ES:DI:  Ptr to cursor location in video RAM
318;   Returns:
319;       Nothing
320;   Corrupts registers:
321;       AX, DX
322;--------------------------------------------------------------------
323ALIGN JUMP_ALIGN
324DisplayPrint_ClearAreaWithHeightInAHandWidthInAL:
325    push    cx
326    push    bx
327    push    di
328
329    xchg    bx, ax                          ; Move parameters to BX
330    call    DisplayCursor_GetSoftwareCoordinatesToAX
331    xchg    dx, ax                          ; Coordinates now in DX
332    xor     cx, cx                          ; Zero CX
333
334ALIGN JUMP_ALIGN
335.ClearRowFromArea:
336    mov     al, ' '                         ; Clear with space
337    mov     ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
338    mov     cl, bl                          ; Area width = WORDs to clear
339    rep stosw
340    dec     bh
341    jz      SHORT .AreaCleared
342
343    inc     dh                              ; Increment row
344    push    dx
345    xchg    ax, dx
346    call    DisplayCursor_SetCoordinatesFromAX
347    pop     dx
348    jmp     SHORT .ClearRowFromArea
349
350ALIGN JUMP_ALIGN
351.AreaCleared:
352    pop     di
353    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], di
354    pop     bx
355    pop     cx
356    ret
Note: See TracBrowser for help on using the repository browser.