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

Last change on this file since 241 was 241, checked in by gregli@…, 12 years ago

Space optimizations in the Boot Menu and BootInfo routines, taking advantage of nested %s. Optimization in the init of RamVars to avoid writing the signature twice. Preparing for addition of serial floppy support, starting to break the assumption that our drives are always 80h or higher.

File size: 10.4 KB
RevLine 
[41]1; Project name  :   Assembly Library
2; Description   :   Functions for display output.
3
4; Section containing code
5SECTION .text
6
[223]7
[41]8;--------------------------------------------------------------------
9; Supports following formatting types:
10;   %a      Specifies attribute for next character
11;   %A      Specifies attribute for remaining string (or until next %A)
12;   %d      Prints signed 16-bit decimal integer
13;   %u      Prints unsigned 16-bit decimal integer
14;   %x      Prints 16-bit hexadecimal integer
15;   %s      Prints string (from CS segment)
16;   %S      Prints string (far pointer)
17;   %c      Prints character
18;   %t      Prints character number of times (character needs to be pushed first, then repeat times)
19;   %%      Prints '%' character (no parameter pushed)
20;
21;   Any placeholder can be set to minimum length by specifying
22;   minimum number of characters. For example %8d would append spaces
23;   after integer so that at least 8 characters would be printed.
[48]24;
25;   When placing '-' after number, then spaces will be used for prepending.
26;   For example %8-d would prepend integer with spaces so that at least
27;   8 characters would be printed.
[162]28;
[41]29; DisplayPrint_FormattedNullTerminatedStringFromCSSI
30;   Parameters:
31;       BP:     SP before pushing parameters
32;       DS:     BDA segment (zero)
33;       CS:SI:  Pointer to string to format
34;       ES:DI:  Ptr to cursor location in video RAM
35;       Stack:  Parameters for formatting placeholders.
36;               Parameter for first placeholder must be pushed first.
37;               Low word must pushed first for placeholders requiring
38;               32-bit parameters (two words).
39;   Returns:
40;       DI:     Updated offset to video RAM
41;   Corrupts registers:
42;       AX, DX
43;--------------------------------------------------------------------
44ALIGN JUMP_ALIGN
45DisplayPrint_FormattedNullTerminatedStringFromCSSI:
46    push    bp
47    push    si
48    push    cx
49    push    bx
50    push    WORD [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
51
52    dec     bp                  ; Point BP to...
53    dec     bp                  ; ...first stack parameter
54    call    DisplayFormat_ParseCharacters
55
56    ; Pop original character attribute
57    pop     ax
58    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute], al
59
60    pop     bx
61    pop     cx
62    pop     si
63    pop     bp
[186]64
[41]65    ret
66
67
68;--------------------------------------------------------------------
[44]69; DisplayPrint_SignedWordFromAXWithBaseInBX
[41]70;   Parameters:
71;       AX:     Word to display
[44]72;       BX:     Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
[41]73;       DS:     BDA segment (zero)
74;       ES:DI:  Ptr to cursor location in video RAM
75;   Returns:
76;       DI:     Updated offset to video RAM
77;   Corrupts registers:
78;       AX, DX
79;--------------------------------------------------------------------
[134]80%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[41]81ALIGN JUMP_ALIGN
[44]82DisplayPrint_SignedWordFromAXWithBaseInBX:
83    test    ax, ax
84    jns     SHORT DisplayPrint_WordFromAXWithBaseInBX
[41]85
86    push    ax
87    mov     al, '-'
88    call    DisplayPrint_CharacterFromAL
89    pop     ax
90    neg     ax
[44]91    ; Fall to DisplayPrint_WordFromAXWithBaseInBX
[134]92%endif
[41]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;       DI:     Updated offset to video RAM
103;   Corrupts registers:
104;       AX, DX
105;--------------------------------------------------------------------
[223]106
[186]107%ifndef MODULE_STRINGS_COMPRESSED
[223]108
[41]109ALIGN JUMP_ALIGN
110DisplayPrint_WordFromAXWithBaseInBX:
111    push    cx
[44]112    push    bx
[41]113
114    xor     cx, cx
115ALIGN JUMP_ALIGN
116.DivideLoop:
117    xor     dx, dx              ; DX:AX now holds the integer
118    div     bx                  ; Divide DX:AX by base
119    push    dx                  ; Push remainder
120    inc     cx                  ; Increment character count
121    test    ax, ax              ; All divided?
122    jnz     SHORT .DivideLoop   ;  If not, loop
[44]123
124    mov     bx, .rgcDigitToCharacter
[41]125ALIGN JUMP_ALIGN
[44]126.PrintNextDigit:
127    pop     ax                  ; Pop digit
[223]128    cs xlatb
[41]129    call    DisplayPrint_CharacterFromAL
[44]130    loop    .PrintNextDigit
[41]131
[44]132    pop     bx
[41]133    pop     cx
134    ret
135.rgcDigitToCharacter:   db  "0123456789ABCDEF"
[186]136
137%endif  ; MODULE_STRINGS_COMPRESSED
[41]138
139
140;--------------------------------------------------------------------
141; DisplayPrint_CharacterBufferFromBXSIwithLengthInCX
142;   Parameters:
143;       CX:     Buffer length (characters)
144;       BX:SI:  Ptr to NULL terminated string
145;       DS:     BDA segment (zero)
146;       ES:DI:  Ptr to cursor location in video RAM
147;   Returns:
148;       DI:     Updated offset to video RAM
149;   Corrupts registers:
150;       AX, DX
151;--------------------------------------------------------------------
[223]152%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[41]153ALIGN JUMP_ALIGN
154DisplayPrint_CharacterBufferFromBXSIwithLengthInCX:
[44]155    jcxz    .NothingToPrintSinceZeroLength
156    push    si
[41]157    push    cx
158
159ALIGN JUMP_ALIGN
[44]160.PrintNextCharacter:
161    mov     ds, bx
162    lodsb
163    LOAD_BDA_SEGMENT_TO ds, dx
164    call    DisplayPrint_CharacterFromAL
165    loop    .PrintNextCharacter
166
[41]167    pop     cx
[44]168    pop     si
169.NothingToPrintSinceZeroLength:
[41]170    ret
[194]171%endif
[41]172
[186]173
[41]174;--------------------------------------------------------------------
[67]175; DisplayPrint_ClearScreenWithCharInALandAttributeInAH
[41]176;   Parameters:
[67]177;       AL:     Character to clear with
178;       AH:     Attribute to clear with
[41]179;       DS:     BDA segment (zero)
180;       ES:DI:  Ptr to cursor location in video RAM
181;   Returns:
182;       Nothing
183;   Corrupts registers:
184;       AX, DX
185;--------------------------------------------------------------------
186ALIGN JUMP_ALIGN
[67]187DisplayPrint_ClearScreenWithCharInALandAttributeInAH:
[41]188    push    di
[67]189    push    cx
190
191    xchg    cx, ax
[41]192    xor     ax, ax
[67]193    call    DisplayCursor_SetCoordinatesFromAX      ; Updates DI
[41]194    call    DisplayPage_GetColumnsToALandRowsToAH
[67]195    mul     ah      ; AX = AL*AH = Characters on screen
196    xchg    cx, ax  ; AX = Char+Attr, CX = WORDs to store
197    rep stosw
198
199    pop     cx
[41]200    pop     di
201    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], di
202    ret
203
204
205;--------------------------------------------------------------------
206; DisplayPrint_ClearAreaWithHeightInAHandWidthInAL
207;   Parameters:
208;       AH:     Area height
209;       AL:     Area width
210;       DS:     BDA segment (zero)
211;       ES:DI:  Ptr to cursor location in video RAM
212;   Returns:
[42]213;       DI:     Updated offset to video RAM
[41]214;   Corrupts registers:
215;       AX, DX
216;--------------------------------------------------------------------
[134]217%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[41]218ALIGN JUMP_ALIGN
219DisplayPrint_ClearAreaWithHeightInAHandWidthInAL:
[42]220    push    si
[41]221    push    cx
222    push    bx
223
[42]224    xchg    bx, ax                          ; Area size to BX
[41]225    call    DisplayCursor_GetSoftwareCoordinatesToAX
[42]226    xchg    si, ax                          ; Software (Y,X) coordinates now in SI
227    xor     cx, cx
[41]228
229ALIGN JUMP_ALIGN
[42]230.ClearRowLoop:
231    mov     cl, bl                          ; Area width now in CX
[44]232    mov     al, SCREEN_BACKGROUND_CHARACTER
[42]233    call    DisplayPrint_RepeatCharacterFromALwithCountInCX
[41]234
[42]235    xchg    ax, si                          ; Coordinates to AX
236    inc     ah                              ; Increment row
237    mov     si, ax
[41]238    call    DisplayCursor_SetCoordinatesFromAX
[42]239    dec     bh                              ; Decrement rows left
240    jnz     SHORT .ClearRowLoop
[41]241
242    pop     bx
243    pop     cx
[42]244    pop     si
[41]245    ret
[134]246%endif
[42]247
248
249;--------------------------------------------------------------------
250; DisplayPrint_RepeatCharacterFromALwithCountInCX
251;   Parameters:
252;       AL:     Character to display
253;       CX:     Repeat count
254;       DS:     BDA segment (zero)
255;       ES:DI:  Ptr to cursor location in video RAM
256;   Returns:
257;       DI:     Updated offset to video RAM
258;   Corrupts registers:
[181]259;       DX
[42]260;--------------------------------------------------------------------
261ALIGN JUMP_ALIGN
262DisplayPrint_RepeatCharacterFromALwithCountInCX:
[44]263    jcxz    .NothingToRepeat
264    push    cx
265
266ALIGN JUMP_ALIGN
267.RepeatCharacter:
[42]268    push    ax
269    call    DisplayPrint_CharacterFromAL
270    pop     ax
[44]271    loop    .RepeatCharacter
272
273    pop     cx
274.NothingToRepeat:
[42]275    ret
[223]276
[186]277
278;--------------------------------------------------------------------
279; DisplayPrint_NullTerminatedStringFromCSSI
280;   Parameters:
281;       CS:SI:  Ptr to NULL terminated string
282;       DS:     BDA segment (zero)
283;       ES:DI:  Ptr to cursor location in video RAM
284;   Returns:
285;       DI:     Updated offset to video RAM
286;   Corrupts registers:
287;       AX, DX
288;--------------------------------------------------------------------
289%ifndef MODULE_STRINGS_COMPRESSED
290;;;
291;;; Take care when using this routine with compressed strings (which is why it is disabled).
292;;; All strings in CSSI should go through the DisplayFormatCompressed code to be decoded.
[223]293;;;
[186]294ALIGN JUMP_ALIGN
295DisplayPrint_NullTerminatedStringFromCSSI:
296    push    bx
297    mov     bx, cs
298    call    DisplayPrint_NullTerminatedStringFromBXSI
299    pop     bx
300    ret
301%endif
[42]302
303
[186]304;;;
305;;; Note that the following routines need to be at the bottom of this file
306;;; to accomodate short jumps from the next file (DisplayFormat/DisplayFormatCompressed)
[223]307;;;
[186]308
[42]309;--------------------------------------------------------------------
[44]310; DisplayPrint_Newline
311;   Parameters:
312;       DS:     BDA segment (zero)
313;       ES:DI:  Ptr to cursor location in video RAM
314;   Returns:
315;       DI:     Updated offset to video RAM
316;   Corrupts registers:
317;       AX, DX
318;--------------------------------------------------------------------
[186]319%ifdef MODULE_STRINGS_COMPRESSED
[44]320ALIGN JUMP_ALIGN
[186]321DisplayPrint_Newline_FormatAdjustBP:
[223]322    inc     bp                  ; we didn't need a parameter after all, readjust BP
[186]323    inc     bp
[194]324    ; fall through to DisplayPrint_Newline
[186]325%endif
326
[223]327ALIGN JUMP_ALIGN
[44]328DisplayPrint_Newline:
[52]329    mov     al, LF
330    call    DisplayPrint_CharacterFromAL
[44]331    mov     al, CR
332    ; Fall to DisplayPrint_CharacterFromAL
333
334;--------------------------------------------------------------------
[42]335; DisplayPrint_CharacterFromAL
336;   Parameters:
337;       AL:     Character to display
[186]338;               Zero value is ignored (no characer is printed)
[42]339;       DS:     BDA segment (zero)
340;       ES:DI:  Ptr to cursor location in video RAM
341;   Returns:
342;       DI:     Updated offset to video RAM
343;   Corrupts registers:
344;       AX, DX
345;--------------------------------------------------------------------
346ALIGN JUMP_ALIGN
347DisplayPrint_CharacterFromAL:
[186]348    test    al,al
349    jz      DisplayPrint_Ret
[241]350
[42]351    mov     ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
352    jmp     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut]
[186]353
[223]354
[186]355;--------------------------------------------------------------------
356; DisplayPrint_NullTerminatedStringFromBXSI
357;   Parameters:
358;       DS:     BDA segment (zero)
359;       BX:SI:  Ptr to NULL terminated string
360;       ES:DI:  Ptr to cursor location in video RAM
361;   Returns:
362;       DI:     Updated offset to video RAM
363;   Corrupts registers:
364;       AX, DX
365;--------------------------------------------------------------------
366ALIGN JUMP_ALIGN
367DisplayPrint_NullTerminatedStringFromBXSI:
368    push    si
369    push    cx
370
371    xor     cx, cx
372ALIGN JUMP_ALIGN
373.PrintNextCharacter:
374    mov     ds, bx              ; String segment to DS
375    lodsb
376    mov     ds, cx              ; BDA segment to DS
377    test    al, al              ; NULL?
378    jz      SHORT .EndOfString
379    call    DisplayPrint_CharacterFromAL
380    jmp     SHORT .PrintNextCharacter
381
382ALIGN JUMP_ALIGN
383.EndOfString:
384    pop     cx
385    pop     si
[223]386
387DisplayPrint_Ret:               ; random ret to jump to
[186]388    ret
389
Note: See TracBrowser for help on using the repository browser.