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

Last change on this file since 561 was 532, checked in by krille_n_@…, 12 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
RevLine 
[41]1; Project name : Assembly Library
2; Description : Functions for display output.
3
[376]4;
[491]5; XTIDE Universal BIOS and Associated Tools
[526]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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.
[491]12;
[376]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
[491]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[491]18;
[376]19
[41]20; Section containing code
21SECTION .text
22
[376]23
[41]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.
[48]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.
[162]44;
[41]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;--------------------------------------------------------------------
[369]60ALIGN DISPLAY_JUMP_ALIGN
[41]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
[376]80
[41]81 ret
82
83
84;--------------------------------------------------------------------
[44]85; DisplayPrint_SignedWordFromAXWithBaseInBX
[41]86; Parameters:
87; AX: Word to display
[44]88; BX: Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
[41]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;--------------------------------------------------------------------
[134]96%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]97ALIGN DISPLAY_JUMP_ALIGN
[44]98DisplayPrint_SignedWordFromAXWithBaseInBX:
99 test ax, ax
100 jns SHORT DisplayPrint_WordFromAXWithBaseInBX
[41]101
102 push ax
103 mov al, '-'
104 call DisplayPrint_CharacterFromAL
105 pop ax
106 neg ax
[44]107 ; Fall to DisplayPrint_WordFromAXWithBaseInBX
[134]108%endif
[41]109
[376]110
[41]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
[376]122;--------------------------------------------------------------------
[491]123%ifndef MODULE_STRINGS_COMPRESSED
[369]124ALIGN DISPLAY_JUMP_ALIGN
[41]125DisplayPrint_WordFromAXWithBaseInBX:
126 push cx
[44]127 push bx
[41]128
129 xor cx, cx
[369]130ALIGN DISPLAY_JUMP_ALIGN
[41]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
[44]138
[532]139PrintAllPushedDigits: ; Unused entrypoint OK
[323]140 mov bx, g_rgcDigitToCharacter
[369]141ALIGN DISPLAY_JUMP_ALIGN
[44]142.PrintNextDigit:
143 pop ax ; Pop digit
[376]144 cs xlatb
[41]145 call DisplayPrint_CharacterFromAL
[44]146 loop .PrintNextDigit
[41]147
[44]148 pop bx
[41]149 pop cx
150 ret
[341]151
[323]152g_rgcDigitToCharacter: db "0123456789ABCDEF"
[341]153
[491]154%endif ; MODULE_STRINGS_COMPRESSED
155
[341]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;--------------------------------------------------------------------
[491]168%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS OR EXCLUDE_FROM_XTIDECFG
[369]169ALIGN DISPLAY_JUMP_ALIGN
[341]170DisplayPrint_QWordFromSSBPwithBaseInBX:
171 push cx
172 push bx
173
174 mov cx, bx ; CX = Integer base
175 xor bx, bx ; BX = Character count
[369]176ALIGN DISPLAY_JUMP_ALIGN
[341]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
[491]185%endif
[41]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;--------------------------------------------------------------------
[223]200%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]201ALIGN DISPLAY_JUMP_ALIGN
[41]202DisplayPrint_CharacterBufferFromBXSIwithLengthInCX:
[44]203 jcxz .NothingToPrintSinceZeroLength
204 push si
[41]205 push cx
206
[369]207ALIGN DISPLAY_JUMP_ALIGN
[44]208.PrintNextCharacter:
209 mov ds, bx
210 lodsb
211 LOAD_BDA_SEGMENT_TO ds, dx
212 call DisplayPrint_CharacterFromAL
213 loop .PrintNextCharacter
214
[41]215 pop cx
[44]216 pop si
217.NothingToPrintSinceZeroLength:
[41]218 ret
[376]219%endif
[41]220
[376]221
[41]222;--------------------------------------------------------------------
[67]223; DisplayPrint_ClearScreenWithCharInALandAttributeInAH
[41]224; Parameters:
[67]225; AL: Character to clear with
226; AH: Attribute to clear with
[41]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;--------------------------------------------------------------------
[491]234%ifdef INCLUDE_MENU_LIBRARY
[369]235ALIGN DISPLAY_JUMP_ALIGN
[67]236DisplayPrint_ClearScreenWithCharInALandAttributeInAH:
[41]237 push di
[67]238 push cx
239
240 xchg cx, ax
[41]241 xor ax, ax
[67]242 call DisplayCursor_SetCoordinatesFromAX ; Updates DI
[41]243 call DisplayPage_GetColumnsToALandRowsToAH
[67]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
[41]249 pop di
250 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], di
251 ret
[489]252%endif
[491]253
254
[41]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:
[42]263; DI: Updated offset to video RAM
[41]264; Corrupts registers:
265; AX, DX
266;--------------------------------------------------------------------
[134]267%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]268ALIGN DISPLAY_JUMP_ALIGN
[41]269DisplayPrint_ClearAreaWithHeightInAHandWidthInAL:
[42]270 push si
[41]271 push cx
272 push bx
273
[42]274 xchg bx, ax ; Area size to BX
[41]275 call DisplayCursor_GetSoftwareCoordinatesToAX
[42]276 xchg si, ax ; Software (Y,X) coordinates now in SI
277 xor cx, cx
[41]278
[369]279ALIGN DISPLAY_JUMP_ALIGN
[42]280.ClearRowLoop:
281 mov cl, bl ; Area width now in CX
[44]282 mov al, SCREEN_BACKGROUND_CHARACTER
[42]283 call DisplayPrint_RepeatCharacterFromALwithCountInCX
[41]284
[42]285 xchg ax, si ; Coordinates to AX
286 inc ah ; Increment row
287 mov si, ax
[41]288 call DisplayCursor_SetCoordinatesFromAX
[42]289 dec bh ; Decrement rows left
290 jnz SHORT .ClearRowLoop
[41]291
292 pop bx
293 pop cx
[42]294 pop si
[41]295 ret
[134]296%endif
[42]297
[492]298%ifdef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
299 %define EXCLUDE
[532]300 %ifndef MODULE_STRINGS_COMPRESSED
301 %undef EXCLUDE
302 %endif
[492]303 %ifdef MODULE_HOTKEYS
304 %undef EXCLUDE
305 %endif
306 %ifdef MODULE_BOOT_MENU
307 %undef EXCLUDE
308 %endif
309%endif
[42]310
[505]311%ifndef EXCLUDE
[42]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:
[181]322; DX
[42]323;--------------------------------------------------------------------
[369]324ALIGN DISPLAY_JUMP_ALIGN
[42]325DisplayPrint_RepeatCharacterFromALwithCountInCX:
[44]326 jcxz .NothingToRepeat
327 push cx
328
[369]329ALIGN DISPLAY_JUMP_ALIGN
[44]330.RepeatCharacter:
[42]331 push ax
332 call DisplayPrint_CharacterFromAL
333 pop ax
[44]334 loop .RepeatCharacter
335
336 pop cx
337.NothingToRepeat:
[42]338 ret
[492]339%endif
340%undef EXCLUDE
[223]341
[186]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;--------------------------------------------------------------------
[376]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;;;
[369]358ALIGN DISPLAY_JUMP_ALIGN
[186]359DisplayPrint_NullTerminatedStringFromCSSI:
360 push bx
361 mov bx, cs
362 call DisplayPrint_NullTerminatedStringFromBXSI
363 pop bx
364 ret
[376]365%endif
[42]366
367
[376]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
[42]373;--------------------------------------------------------------------
[44]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;--------------------------------------------------------------------
[376]383%ifdef MODULE_STRINGS_COMPRESSED
[369]384ALIGN DISPLAY_JUMP_ALIGN
[376]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
[369]391ALIGN DISPLAY_JUMP_ALIGN
[44]392DisplayPrint_Newline:
[52]393 mov al, LF
394 call DisplayPrint_CharacterFromAL
[44]395 mov al, CR
396 ; Fall to DisplayPrint_CharacterFromAL
397
398;--------------------------------------------------------------------
[42]399; DisplayPrint_CharacterFromAL
400; Parameters:
401; AL: Character to display
[505]402; Zero value is ignored (no character is printed)
[42]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;--------------------------------------------------------------------
[369]410ALIGN DISPLAY_JUMP_ALIGN
[42]411DisplayPrint_CharacterFromAL:
[505]412 test al, al
[376]413 jz DisplayPrint_Ret
414
[42]415 mov ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
416 jmp [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut]
[223]417
[376]418
[186]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;--------------------------------------------------------------------
[369]430ALIGN DISPLAY_JUMP_ALIGN
[186]431DisplayPrint_NullTerminatedStringFromBXSI:
432 push si
433 push cx
434
435 xor cx, cx
[369]436ALIGN DISPLAY_JUMP_ALIGN
[186]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
[369]446ALIGN DISPLAY_JUMP_ALIGN
[186]447.EndOfString:
448 pop cx
449 pop si
[376]450
451DisplayPrint_Ret: ; random ret to jump to
[186]452 ret
453
Note: See TracBrowser for help on using the repository browser.