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

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

Removed the dependency between MODULE_BOOT_MENU and MODULE_HOTKEYS. With these changes, 0, 1, or 2 of them can be included in a build. This change also means that the hotkeys don't work while the menu is up. But the most important hotkey there was for Rom Boot, and that has been added to the menu as a choice proper. Lots of changes across the board in the hotkeys code - even if we eventually back this change out (becaue, for example we want hotkeys to work in the menu) we should probably start from this base and add that functionality back in, as these changes results in approximately 120 bytes of savings and includes new functionality, such as the Rom Boot menu item and the Com Detect hotkey.

File size: 12.6 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-2012 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:
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    %ifdef MODULE_HOTKEYS
301        %undef EXCLUDE
302    %endif
303    %ifdef MODULE_BOOT_MENU
304        %undef EXCLUDE
305    %endif
306%endif
307
308%ifndef EXCLUDE             
309;--------------------------------------------------------------------
310; DisplayPrint_RepeatCharacterFromALwithCountInCX
311;   Parameters:
312;       AL:     Character to display
313;       CX:     Repeat count
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;       DX
320;--------------------------------------------------------------------
321ALIGN DISPLAY_JUMP_ALIGN
322DisplayPrint_RepeatCharacterFromALwithCountInCX:
323    jcxz    .NothingToRepeat
324    push    cx
325
326ALIGN DISPLAY_JUMP_ALIGN
327.RepeatCharacter:
328    push    ax
329    call    DisplayPrint_CharacterFromAL
330    pop     ax
331    loop    .RepeatCharacter
332
333    pop     cx
334.NothingToRepeat:
335    ret
336%endif
337%undef EXCLUDE
338
339;--------------------------------------------------------------------
340; DisplayPrint_NullTerminatedStringFromCSSI
341;   Parameters:
342;       CS:SI:  Ptr to NULL terminated string
343;       DS:     BDA segment (zero)
344;       ES:DI:  Ptr to cursor location in video RAM
345;   Returns:
346;       DI:     Updated offset to video RAM
347;   Corrupts registers:
348;       AX, DX
349;--------------------------------------------------------------------
350%ifndef MODULE_STRINGS_COMPRESSED
351;;;
352;;; Take care when using this routine with compressed strings (which is why it is disabled).
353;;; All strings in CSSI should go through the DisplayFormatCompressed code to be decoded.
354;;;
355ALIGN DISPLAY_JUMP_ALIGN
356DisplayPrint_NullTerminatedStringFromCSSI:
357    push    bx
358    mov     bx, cs
359    call    DisplayPrint_NullTerminatedStringFromBXSI
360    pop     bx
361    ret
362%endif
363
364
365;;;
366;;; Note that the following routines need to be at the bottom of this file
367;;; to accomodate short jumps from the next file (DisplayFormat/DisplayFormatCompressed)
368;;;
369
370;--------------------------------------------------------------------
371; DisplayPrint_Newline
372;   Parameters:
373;       DS:     BDA segment (zero)
374;       ES:DI:  Ptr to cursor location in video RAM
375;   Returns:
376;       DI:     Updated offset to video RAM
377;   Corrupts registers:
378;       AX, DX
379;--------------------------------------------------------------------
380%ifdef MODULE_STRINGS_COMPRESSED
381ALIGN DISPLAY_JUMP_ALIGN
382DisplayPrint_Newline_FormatAdjustBP:
383    inc     bp                  ; we didn't need a parameter after all, readjust BP
384    inc     bp
385    ; fall through to DisplayPrint_Newline
386%endif
387
388ALIGN DISPLAY_JUMP_ALIGN
389DisplayPrint_Newline:
390    mov     al, LF
391    call    DisplayPrint_CharacterFromAL
392    mov     al, CR
393    ; Fall to DisplayPrint_CharacterFromAL
394
395;--------------------------------------------------------------------
396; DisplayPrint_CharacterFromAL
397;   Parameters:
398;       AL:     Character to display
399;               Zero value is ignored (no characer is printed)
400;       DS:     BDA segment (zero)
401;       ES:DI:  Ptr to cursor location in video RAM
402;   Returns:
403;       DI:     Updated offset to video RAM
404;   Corrupts registers:
405;       AX, DX
406;--------------------------------------------------------------------
407ALIGN DISPLAY_JUMP_ALIGN
408DisplayPrint_CharacterFromAL:
409    test    al,al
410    jz      DisplayPrint_Ret
411
412    mov     ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
413    jmp     [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut]
414
415
416;--------------------------------------------------------------------
417; DisplayPrint_NullTerminatedStringFromBXSI
418;   Parameters:
419;       DS:     BDA segment (zero)
420;       BX:SI:  Ptr to NULL terminated string
421;       ES:DI:  Ptr to cursor location in video RAM
422;   Returns:
423;       DI:     Updated offset to video RAM
424;   Corrupts registers:
425;       AX, DX
426;--------------------------------------------------------------------
427ALIGN DISPLAY_JUMP_ALIGN
428DisplayPrint_NullTerminatedStringFromBXSI:
429    push    si
430    push    cx
431
432    xor     cx, cx
433ALIGN DISPLAY_JUMP_ALIGN
434.PrintNextCharacter:
435    mov     ds, bx              ; String segment to DS
436    lodsb
437    mov     ds, cx              ; BDA segment to DS
438    test    al, al              ; NULL?
439    jz      SHORT .EndOfString
440    call    DisplayPrint_CharacterFromAL
441    jmp     SHORT .PrintNextCharacter
442
443ALIGN DISPLAY_JUMP_ALIGN
444.EndOfString:
445    pop     cx
446    pop     si
447
448DisplayPrint_Ret:               ; random ret to jump to
449    ret
450
Note: See TracBrowser for help on using the repository browser.