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

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

Removed align directives for initalization code and added define for align in boot-time calls to the assembly library (defaulting to 1), resulting in a significant savings for the AT and 386 builds. Fixed a bug with switch command line handling in the serial server. Put in CR characters in licesnse.txt, so that it properly displays on Windows. In the configurator, added default values for user supplied CHS and LBA values, defaulting to values within range when those features are enabled. Updated the copyright message in the configurator as the literal word Copyright is important.

File size: 11.6 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;--------------------------------------------------------------------
[369]44ALIGN DISPLAY_JUMP_ALIGN
[41]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
[369]81ALIGN DISPLAY_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
[323]94
95%ifndef MODULE_STRINGS_COMPRESSED
[41]96;--------------------------------------------------------------------
97; DisplayPrint_WordFromAXWithBaseInBX
98;   Parameters:
99;       AX:     Word to display
100;       BX:     Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
101;       DS:     BDA segment (zero)
102;       ES:DI:  Ptr to cursor location in video RAM
103;   Returns:
104;       DI:     Updated offset to video RAM
105;   Corrupts registers:
106;       AX, DX
[323]107;--------------------------------------------------------------------
[369]108ALIGN DISPLAY_JUMP_ALIGN
[41]109DisplayPrint_WordFromAXWithBaseInBX:
110    push    cx
[44]111    push    bx
[41]112
113    xor     cx, cx
[369]114ALIGN DISPLAY_JUMP_ALIGN
[41]115.DivideLoop:
116    xor     dx, dx              ; DX:AX now holds the integer
117    div     bx                  ; Divide DX:AX by base
118    push    dx                  ; Push remainder
119    inc     cx                  ; Increment character count
120    test    ax, ax              ; All divided?
121    jnz     SHORT .DivideLoop   ;  If not, loop
[44]122
[323]123PrintAllPushedDigits:
124    mov     bx, g_rgcDigitToCharacter
[369]125ALIGN DISPLAY_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
[341]135
[323]136g_rgcDigitToCharacter:  db  "0123456789ABCDEF"
[341]137
138;--------------------------------------------------------------------
139; DisplayPrint_QWordFromSSBPwithBaseInBX
140;   Parameters:
141;       SS:BP:  QWord to display
142;       BX:     Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
143;       DS:     BDA segment (zero)
144;       ES:DI:  Ptr to cursor location in video RAM
145;   Returns:
146;       DI:     Updated offset to video RAM
147;   Corrupts registers:
148;       AX, DX, [SS:BP]
149;--------------------------------------------------------------------
150%ifndef EXCLUDE_FROM_XTIDECFG   ; Not used in XTIDECFG
[369]151ALIGN DISPLAY_JUMP_ALIGN
[341]152DisplayPrint_QWordFromSSBPwithBaseInBX:
153    push    cx
154    push    bx
155
156    mov     cx, bx              ; CX = Integer base
157    xor     bx, bx              ; BX = Character count
[369]158ALIGN DISPLAY_JUMP_ALIGN
[341]159.DivideLoop:
160    call    Math_DivQWatSSBPbyCX; Divide by base
161    push    dx                  ; Push remainder
162    inc     bx                  ; Increment character count
163    cmp     WORD [bp], BYTE 0   ; All divided?
164    jne     SHORT .DivideLoop   ;  If not, loop
165    mov     cx, bx              ; Character count to CX
166    jmp     SHORT PrintAllPushedDigits
167%endif  ; EXCLUDE_FROM_XTIDECFG
[186]168
169%endif  ; MODULE_STRINGS_COMPRESSED
[41]170
171
172;--------------------------------------------------------------------
173; DisplayPrint_CharacterBufferFromBXSIwithLengthInCX
174;   Parameters:
175;       CX:     Buffer length (characters)
176;       BX:SI:  Ptr to NULL terminated string
177;       DS:     BDA segment (zero)
178;       ES:DI:  Ptr to cursor location in video RAM
179;   Returns:
180;       DI:     Updated offset to video RAM
181;   Corrupts registers:
182;       AX, DX
183;--------------------------------------------------------------------
[223]184%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]185ALIGN DISPLAY_JUMP_ALIGN
[41]186DisplayPrint_CharacterBufferFromBXSIwithLengthInCX:
[44]187    jcxz    .NothingToPrintSinceZeroLength
188    push    si
[41]189    push    cx
190
[369]191ALIGN DISPLAY_JUMP_ALIGN
[44]192.PrintNextCharacter:
193    mov     ds, bx
194    lodsb
195    LOAD_BDA_SEGMENT_TO ds, dx
196    call    DisplayPrint_CharacterFromAL
197    loop    .PrintNextCharacter
198
[41]199    pop     cx
[44]200    pop     si
201.NothingToPrintSinceZeroLength:
[41]202    ret
[194]203%endif
[41]204
[186]205
[41]206;--------------------------------------------------------------------
[67]207; DisplayPrint_ClearScreenWithCharInALandAttributeInAH
[41]208;   Parameters:
[67]209;       AL:     Character to clear with
210;       AH:     Attribute to clear with
[41]211;       DS:     BDA segment (zero)
212;       ES:DI:  Ptr to cursor location in video RAM
213;   Returns:
214;       Nothing
215;   Corrupts registers:
216;       AX, DX
217;--------------------------------------------------------------------
[369]218ALIGN DISPLAY_JUMP_ALIGN
[67]219DisplayPrint_ClearScreenWithCharInALandAttributeInAH:
[41]220    push    di
[67]221    push    cx
222
223    xchg    cx, ax
[41]224    xor     ax, ax
[67]225    call    DisplayCursor_SetCoordinatesFromAX      ; Updates DI
[41]226    call    DisplayPage_GetColumnsToALandRowsToAH
[67]227    mul     ah      ; AX = AL*AH = Characters on screen
228    xchg    cx, ax  ; AX = Char+Attr, CX = WORDs to store
229    rep stosw
230
231    pop     cx
[41]232    pop     di
233    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], di
234    ret
235
236
237;--------------------------------------------------------------------
238; DisplayPrint_ClearAreaWithHeightInAHandWidthInAL
239;   Parameters:
240;       AH:     Area height
241;       AL:     Area width
242;       DS:     BDA segment (zero)
243;       ES:DI:  Ptr to cursor location in video RAM
244;   Returns:
[42]245;       DI:     Updated offset to video RAM
[41]246;   Corrupts registers:
247;       AX, DX
248;--------------------------------------------------------------------
[134]249%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]250ALIGN DISPLAY_JUMP_ALIGN
[41]251DisplayPrint_ClearAreaWithHeightInAHandWidthInAL:
[42]252    push    si
[41]253    push    cx
254    push    bx
255
[42]256    xchg    bx, ax                          ; Area size to BX
[41]257    call    DisplayCursor_GetSoftwareCoordinatesToAX
[42]258    xchg    si, ax                          ; Software (Y,X) coordinates now in SI
259    xor     cx, cx
[41]260
[369]261ALIGN DISPLAY_JUMP_ALIGN
[42]262.ClearRowLoop:
263    mov     cl, bl                          ; Area width now in CX
[44]264    mov     al, SCREEN_BACKGROUND_CHARACTER
[42]265    call    DisplayPrint_RepeatCharacterFromALwithCountInCX
[41]266
[42]267    xchg    ax, si                          ; Coordinates to AX
268    inc     ah                              ; Increment row
269    mov     si, ax
[41]270    call    DisplayCursor_SetCoordinatesFromAX
[42]271    dec     bh                              ; Decrement rows left
272    jnz     SHORT .ClearRowLoop
[41]273
274    pop     bx
275    pop     cx
[42]276    pop     si
[41]277    ret
[134]278%endif
[42]279
280
281;--------------------------------------------------------------------
282; DisplayPrint_RepeatCharacterFromALwithCountInCX
283;   Parameters:
284;       AL:     Character to display
285;       CX:     Repeat count
286;       DS:     BDA segment (zero)
287;       ES:DI:  Ptr to cursor location in video RAM
288;   Returns:
289;       DI:     Updated offset to video RAM
290;   Corrupts registers:
[181]291;       DX
[42]292;--------------------------------------------------------------------
[369]293ALIGN DISPLAY_JUMP_ALIGN
[42]294DisplayPrint_RepeatCharacterFromALwithCountInCX:
[44]295    jcxz    .NothingToRepeat
296    push    cx
297
[369]298ALIGN DISPLAY_JUMP_ALIGN
[44]299.RepeatCharacter:
[42]300    push    ax
301    call    DisplayPrint_CharacterFromAL
302    pop     ax
[44]303    loop    .RepeatCharacter
304
305    pop     cx
306.NothingToRepeat:
[42]307    ret
[223]308
[186]309
310;--------------------------------------------------------------------
311; DisplayPrint_NullTerminatedStringFromCSSI
312;   Parameters:
313;       CS:SI:  Ptr to NULL terminated string
314;       DS:     BDA segment (zero)
315;       ES:DI:  Ptr to cursor location in video RAM
316;   Returns:
317;       DI:     Updated offset to video RAM
318;   Corrupts registers:
319;       AX, DX
320;--------------------------------------------------------------------
321%ifndef MODULE_STRINGS_COMPRESSED
322;;;
323;;; Take care when using this routine with compressed strings (which is why it is disabled).
324;;; All strings in CSSI should go through the DisplayFormatCompressed code to be decoded.
[223]325;;;
[369]326ALIGN DISPLAY_JUMP_ALIGN
[186]327DisplayPrint_NullTerminatedStringFromCSSI:
328    push    bx
329    mov     bx, cs
330    call    DisplayPrint_NullTerminatedStringFromBXSI
331    pop     bx
332    ret
333%endif
[42]334
335
[186]336;;;
337;;; Note that the following routines need to be at the bottom of this file
338;;; to accomodate short jumps from the next file (DisplayFormat/DisplayFormatCompressed)
[223]339;;;
[186]340
[42]341;--------------------------------------------------------------------
[44]342; DisplayPrint_Newline
343;   Parameters:
344;       DS:     BDA segment (zero)
345;       ES:DI:  Ptr to cursor location in video RAM
346;   Returns:
347;       DI:     Updated offset to video RAM
348;   Corrupts registers:
349;       AX, DX
350;--------------------------------------------------------------------
[186]351%ifdef MODULE_STRINGS_COMPRESSED
[369]352ALIGN DISPLAY_JUMP_ALIGN
[186]353DisplayPrint_Newline_FormatAdjustBP:
[223]354    inc     bp                  ; we didn't need a parameter after all, readjust BP
[186]355    inc     bp
[194]356    ; fall through to DisplayPrint_Newline
[186]357%endif
358
[369]359ALIGN DISPLAY_JUMP_ALIGN
[44]360DisplayPrint_Newline:
[52]361    mov     al, LF
362    call    DisplayPrint_CharacterFromAL
[44]363    mov     al, CR
364    ; Fall to DisplayPrint_CharacterFromAL
365
366;--------------------------------------------------------------------
[42]367; DisplayPrint_CharacterFromAL
368;   Parameters:
369;       AL:     Character to display
[186]370;               Zero value is ignored (no characer is printed)
[42]371;       DS:     BDA segment (zero)
372;       ES:DI:  Ptr to cursor location in video RAM
373;   Returns:
374;       DI:     Updated offset to video RAM
375;   Corrupts registers:
376;       AX, DX
377;--------------------------------------------------------------------
[369]378ALIGN DISPLAY_JUMP_ALIGN
[42]379DisplayPrint_CharacterFromAL:
[186]380    test    al,al
381    jz      DisplayPrint_Ret
[241]382
[42]383    mov     ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
384    jmp     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut]
[186]385
[223]386
[186]387;--------------------------------------------------------------------
388; DisplayPrint_NullTerminatedStringFromBXSI
389;   Parameters:
390;       DS:     BDA segment (zero)
391;       BX:SI:  Ptr to NULL terminated string
392;       ES:DI:  Ptr to cursor location in video RAM
393;   Returns:
394;       DI:     Updated offset to video RAM
395;   Corrupts registers:
396;       AX, DX
397;--------------------------------------------------------------------
[369]398ALIGN DISPLAY_JUMP_ALIGN
[186]399DisplayPrint_NullTerminatedStringFromBXSI:
400    push    si
401    push    cx
402
403    xor     cx, cx
[369]404ALIGN DISPLAY_JUMP_ALIGN
[186]405.PrintNextCharacter:
406    mov     ds, bx              ; String segment to DS
407    lodsb
408    mov     ds, cx              ; BDA segment to DS
409    test    al, al              ; NULL?
410    jz      SHORT .EndOfString
411    call    DisplayPrint_CharacterFromAL
412    jmp     SHORT .PrintNextCharacter
413
[369]414ALIGN DISPLAY_JUMP_ALIGN
[186]415.EndOfString:
416    pop     cx
417    pop     si
[223]418
419DisplayPrint_Ret:               ; random ret to jump to
[186]420    ret
421
Note: See TracBrowser for help on using the repository browser.