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

Last change on this file since 532 was 532, checked in by krille_n_@…, 11 years ago

Changes:

  • Changed unused.pl to remove a false positive when MODULE_STRINGS_COMPRESSED is not included ('loop PrependOrAppendSpaces' in DisplayFormat.asm).
  • XTIDECFG: Moved the contents of all text files under Help into Strings.asm to simplify editing and to avoid them being "out of sight and forgotten", essentially making it easier to keep strings up to date. Also made changes to some strings in the process (spelling mistakes etc).
  • Other minor fixes and optimizations to the BIOS.
File size: 12.7 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Functions for display output.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing code
21SECTION .text
22
23
24;--------------------------------------------------------------------
25; Supports following formatting types:
26;   %a      Specifies attribute for next character
27;   %A      Specifies attribute for remaining string (or until next %A)
28;   %d      Prints signed 16-bit decimal integer
29;   %u      Prints unsigned 16-bit decimal integer
30;   %x      Prints 16-bit hexadecimal integer
31;   %s      Prints string (from CS segment)
32;   %S      Prints string (far pointer)
33;   %c      Prints character
34;   %t      Prints character number of times (character needs to be pushed first, then repeat times)
35;   %%      Prints '%' character (no parameter pushed)
36;
37;   Any placeholder can be set to minimum length by specifying
38;   minimum number of characters. For example %8d would append spaces
39;   after integer so that at least 8 characters would be printed.
40;
41;   When placing '-' after number, then spaces will be used for prepending.
42;   For example %8-d would prepend integer with spaces so that at least
43;   8 characters would be printed.
44;
45; DisplayPrint_FormattedNullTerminatedStringFromCSSI
46;   Parameters:
47;       BP:     SP before pushing parameters
48;       DS:     BDA segment (zero)
49;       CS:SI:  Pointer to string to format
50;       ES:DI:  Ptr to cursor location in video RAM
51;       Stack:  Parameters for formatting placeholders.
52;               Parameter for first placeholder must be pushed first.
53;               Low word must pushed first for placeholders requiring
54;               32-bit parameters (two words).
55;   Returns:
56;       DI:     Updated offset to video RAM
57;   Corrupts registers:
58;       AX, DX
59;--------------------------------------------------------------------
60ALIGN DISPLAY_JUMP_ALIGN
61DisplayPrint_FormattedNullTerminatedStringFromCSSI:
62    push    bp
63    push    si
64    push    cx
65    push    bx
66    push    WORD [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
67
68    dec     bp                  ; Point BP to...
69    dec     bp                  ; ...first stack parameter
70    call    DisplayFormat_ParseCharacters
71
72    ; Pop original character attribute
73    pop     ax
74    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute], al
75
76    pop     bx
77    pop     cx
78    pop     si
79    pop     bp
80
81    ret
82
83
84;--------------------------------------------------------------------
85; DisplayPrint_SignedWordFromAXWithBaseInBX
86;   Parameters:
87;       AX:     Word to display
88;       BX:     Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
89;       DS:     BDA segment (zero)
90;       ES:DI:  Ptr to cursor location in video RAM
91;   Returns:
92;       DI:     Updated offset to video RAM
93;   Corrupts registers:
94;       AX, DX
95;--------------------------------------------------------------------
96%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
97ALIGN DISPLAY_JUMP_ALIGN
98DisplayPrint_SignedWordFromAXWithBaseInBX:
99    test    ax, ax
100    jns     SHORT DisplayPrint_WordFromAXWithBaseInBX
101
102    push    ax
103    mov     al, '-'
104    call    DisplayPrint_CharacterFromAL
105    pop     ax
106    neg     ax
107    ; Fall to DisplayPrint_WordFromAXWithBaseInBX
108%endif
109
110
111;--------------------------------------------------------------------
112; DisplayPrint_WordFromAXWithBaseInBX
113;   Parameters:
114;       AX:     Word to display
115;       BX:     Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
116;       DS:     BDA segment (zero)
117;       ES:DI:  Ptr to cursor location in video RAM
118;   Returns:
119;       DI:     Updated offset to video RAM
120;   Corrupts registers:
121;       AX, DX
122;--------------------------------------------------------------------
123%ifndef MODULE_STRINGS_COMPRESSED
124ALIGN DISPLAY_JUMP_ALIGN
125DisplayPrint_WordFromAXWithBaseInBX:
126    push    cx
127    push    bx
128
129    xor     cx, cx
130ALIGN DISPLAY_JUMP_ALIGN
131.DivideLoop:
132    xor     dx, dx              ; DX:AX now holds the integer
133    div     bx                  ; Divide DX:AX by base
134    push    dx                  ; Push remainder
135    inc     cx                  ; Increment character count
136    test    ax, ax              ; All divided?
137    jnz     SHORT .DivideLoop   ;  If not, loop
138
139PrintAllPushedDigits:           ; Unused entrypoint OK
140    mov     bx, g_rgcDigitToCharacter
141ALIGN DISPLAY_JUMP_ALIGN
142.PrintNextDigit:
143    pop     ax                  ; Pop digit
144    cs xlatb
145    call    DisplayPrint_CharacterFromAL
146    loop    .PrintNextDigit
147
148    pop     bx
149    pop     cx
150    ret
151
152g_rgcDigitToCharacter:  db  "0123456789ABCDEF"
153
154%endif ; MODULE_STRINGS_COMPRESSED
155
156;--------------------------------------------------------------------
157; DisplayPrint_QWordFromSSBPwithBaseInBX
158;   Parameters:
159;       SS:BP:  QWord to display
160;       BX:     Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
161;       DS:     BDA segment (zero)
162;       ES:DI:  Ptr to cursor location in video RAM
163;   Returns:
164;       DI:     Updated offset to video RAM
165;   Corrupts registers:
166;       AX, DX, [SS:BP]
167;--------------------------------------------------------------------
168%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS OR EXCLUDE_FROM_XTIDECFG
169ALIGN DISPLAY_JUMP_ALIGN
170DisplayPrint_QWordFromSSBPwithBaseInBX:
171    push    cx
172    push    bx
173
174    mov     cx, bx              ; CX = Integer base
175    xor     bx, bx              ; BX = Character count
176ALIGN DISPLAY_JUMP_ALIGN
177.DivideLoop:
178    call    Math_DivQWatSSBPbyCX; Divide by base
179    push    dx                  ; Push remainder
180    inc     bx                  ; Increment character count
181    cmp     WORD [bp], BYTE 0   ; All divided?
182    jne     SHORT .DivideLoop   ;  If not, loop
183    mov     cx, bx              ; Character count to CX
184    jmp     SHORT PrintAllPushedDigits
185%endif
186
187
188;--------------------------------------------------------------------
189; DisplayPrint_CharacterBufferFromBXSIwithLengthInCX
190;   Parameters:
191;       CX:     Buffer length (characters)
192;       BX:SI:  Ptr to NULL terminated string
193;       DS:     BDA segment (zero)
194;       ES:DI:  Ptr to cursor location in video RAM
195;   Returns:
196;       DI:     Updated offset to video RAM
197;   Corrupts registers:
198;       AX, DX
199;--------------------------------------------------------------------
200%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
201ALIGN DISPLAY_JUMP_ALIGN
202DisplayPrint_CharacterBufferFromBXSIwithLengthInCX:
203    jcxz    .NothingToPrintSinceZeroLength
204    push    si
205    push    cx
206
207ALIGN DISPLAY_JUMP_ALIGN
208.PrintNextCharacter:
209    mov     ds, bx
210    lodsb
211    LOAD_BDA_SEGMENT_TO ds, dx
212    call    DisplayPrint_CharacterFromAL
213    loop    .PrintNextCharacter
214
215    pop     cx
216    pop     si
217.NothingToPrintSinceZeroLength:
218    ret
219%endif
220
221
222;--------------------------------------------------------------------
223; DisplayPrint_ClearScreenWithCharInALandAttributeInAH
224;   Parameters:
225;       AL:     Character to clear with
226;       AH:     Attribute to clear with
227;       DS:     BDA segment (zero)
228;       ES:DI:  Ptr to cursor location in video RAM
229;   Returns:
230;       Nothing
231;   Corrupts registers:
232;       AX, DX
233;--------------------------------------------------------------------
234%ifdef INCLUDE_MENU_LIBRARY
235ALIGN DISPLAY_JUMP_ALIGN
236DisplayPrint_ClearScreenWithCharInALandAttributeInAH:
237    push    di
238    push    cx
239
240    xchg    cx, ax
241    xor     ax, ax
242    call    DisplayCursor_SetCoordinatesFromAX      ; Updates DI
243    call    DisplayPage_GetColumnsToALandRowsToAH
244    mul     ah      ; AX = AL*AH = Characters on screen
245    xchg    cx, ax  ; AX = Char+Attr, CX = WORDs to store
246    rep stosw
247
248    pop     cx
249    pop     di
250    mov     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], di
251    ret
252%endif
253
254
255;--------------------------------------------------------------------
256; DisplayPrint_ClearAreaWithHeightInAHandWidthInAL
257;   Parameters:
258;       AH:     Area height
259;       AL:     Area width
260;       DS:     BDA segment (zero)
261;       ES:DI:  Ptr to cursor location in video RAM
262;   Returns:
263;       DI:     Updated offset to video RAM
264;   Corrupts registers:
265;       AX, DX
266;--------------------------------------------------------------------
267%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
268ALIGN DISPLAY_JUMP_ALIGN
269DisplayPrint_ClearAreaWithHeightInAHandWidthInAL:
270    push    si
271    push    cx
272    push    bx
273
274    xchg    bx, ax                          ; Area size to BX
275    call    DisplayCursor_GetSoftwareCoordinatesToAX
276    xchg    si, ax                          ; Software (Y,X) coordinates now in SI
277    xor     cx, cx
278
279ALIGN DISPLAY_JUMP_ALIGN
280.ClearRowLoop:
281    mov     cl, bl                          ; Area width now in CX
282    mov     al, SCREEN_BACKGROUND_CHARACTER
283    call    DisplayPrint_RepeatCharacterFromALwithCountInCX
284
285    xchg    ax, si                          ; Coordinates to AX
286    inc     ah                              ; Increment row
287    mov     si, ax
288    call    DisplayCursor_SetCoordinatesFromAX
289    dec     bh                              ; Decrement rows left
290    jnz     SHORT .ClearRowLoop
291
292    pop     bx
293    pop     cx
294    pop     si
295    ret
296%endif
297
298%ifdef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
299    %define EXCLUDE
300    %ifndef MODULE_STRINGS_COMPRESSED
301        %undef EXCLUDE
302    %endif
303    %ifdef MODULE_HOTKEYS
304        %undef EXCLUDE
305    %endif
306    %ifdef MODULE_BOOT_MENU
307        %undef EXCLUDE
308    %endif
309%endif
310
311%ifndef EXCLUDE
312;--------------------------------------------------------------------
313; DisplayPrint_RepeatCharacterFromALwithCountInCX
314;   Parameters:
315;       AL:     Character to display
316;       CX:     Repeat count
317;       DS:     BDA segment (zero)
318;       ES:DI:  Ptr to cursor location in video RAM
319;   Returns:
320;       DI:     Updated offset to video RAM
321;   Corrupts registers:
322;       DX
323;--------------------------------------------------------------------
324ALIGN DISPLAY_JUMP_ALIGN
325DisplayPrint_RepeatCharacterFromALwithCountInCX:
326    jcxz    .NothingToRepeat
327    push    cx
328
329ALIGN DISPLAY_JUMP_ALIGN
330.RepeatCharacter:
331    push    ax
332    call    DisplayPrint_CharacterFromAL
333    pop     ax
334    loop    .RepeatCharacter
335
336    pop     cx
337.NothingToRepeat:
338    ret
339%endif
340%undef EXCLUDE
341
342;--------------------------------------------------------------------
343; DisplayPrint_NullTerminatedStringFromCSSI
344;   Parameters:
345;       CS:SI:  Ptr to NULL terminated string
346;       DS:     BDA segment (zero)
347;       ES:DI:  Ptr to cursor location in video RAM
348;   Returns:
349;       DI:     Updated offset to video RAM
350;   Corrupts registers:
351;       AX, DX
352;--------------------------------------------------------------------
353%ifndef MODULE_STRINGS_COMPRESSED
354;;;
355;;; Take care when using this routine with compressed strings (which is why it is disabled).
356;;; All strings in CSSI should go through the DisplayFormatCompressed code to be decoded.
357;;;
358ALIGN DISPLAY_JUMP_ALIGN
359DisplayPrint_NullTerminatedStringFromCSSI:
360    push    bx
361    mov     bx, cs
362    call    DisplayPrint_NullTerminatedStringFromBXSI
363    pop     bx
364    ret
365%endif
366
367
368;;;
369;;; Note that the following routines need to be at the bottom of this file
370;;; to accomodate short jumps from the next file (DisplayFormat/DisplayFormatCompressed)
371;;;
372
373;--------------------------------------------------------------------
374; DisplayPrint_Newline
375;   Parameters:
376;       DS:     BDA segment (zero)
377;       ES:DI:  Ptr to cursor location in video RAM
378;   Returns:
379;       DI:     Updated offset to video RAM
380;   Corrupts registers:
381;       AX, DX
382;--------------------------------------------------------------------
383%ifdef MODULE_STRINGS_COMPRESSED
384ALIGN DISPLAY_JUMP_ALIGN
385DisplayPrint_Newline_FormatAdjustBP:
386    inc     bp                  ; we didn't need a parameter after all, readjust BP
387    inc     bp
388    ; fall through to DisplayPrint_Newline
389%endif
390
391ALIGN DISPLAY_JUMP_ALIGN
392DisplayPrint_Newline:
393    mov     al, LF
394    call    DisplayPrint_CharacterFromAL
395    mov     al, CR
396    ; Fall to DisplayPrint_CharacterFromAL
397
398;--------------------------------------------------------------------
399; DisplayPrint_CharacterFromAL
400;   Parameters:
401;       AL:     Character to display
402;               Zero value is ignored (no character is printed)
403;       DS:     BDA segment (zero)
404;       ES:DI:  Ptr to cursor location in video RAM
405;   Returns:
406;       DI:     Updated offset to video RAM
407;   Corrupts registers:
408;       AX, DX
409;--------------------------------------------------------------------
410ALIGN DISPLAY_JUMP_ALIGN
411DisplayPrint_CharacterFromAL:
412    test    al, al
413    jz      DisplayPrint_Ret
414
415    mov     ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
416    jmp     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut]
417
418
419;--------------------------------------------------------------------
420; DisplayPrint_NullTerminatedStringFromBXSI
421;   Parameters:
422;       DS:     BDA segment (zero)
423;       BX:SI:  Ptr to NULL terminated string
424;       ES:DI:  Ptr to cursor location in video RAM
425;   Returns:
426;       DI:     Updated offset to video RAM
427;   Corrupts registers:
428;       AX, DX
429;--------------------------------------------------------------------
430ALIGN DISPLAY_JUMP_ALIGN
431DisplayPrint_NullTerminatedStringFromBXSI:
432    push    si
433    push    cx
434
435    xor     cx, cx
436ALIGN DISPLAY_JUMP_ALIGN
437.PrintNextCharacter:
438    mov     ds, bx              ; String segment to DS
439    lodsb
440    mov     ds, cx              ; BDA segment to DS
441    test    al, al              ; NULL?
442    jz      SHORT .EndOfString
443    call    DisplayPrint_CharacterFromAL
444    jmp     SHORT .PrintNextCharacter
445
446ALIGN DISPLAY_JUMP_ALIGN
447.EndOfString:
448    pop     cx
449    pop     si
450
451DisplayPrint_Ret:               ; random ret to jump to
452    ret
453
Note: See TracBrowser for help on using the repository browser.