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

Last change on this file since 583 was 580, checked in by krille_n_@…, 10 years ago

Changes:

  • XTIDECFG: Fixed a bug from r459 where the menu option for selection of default boot drive would be missing if the BIOS had been built without MODULE_HOTKEYS. The menu option is now visible if either or both of MODULE_HOTKEYS and MODULE_BOOT_MENU is available.
  • BIOS: Disabled ATA-ID validation by adding a new define (NO_ATAID_VALIDATION) and making it the default for all builds since at least two WD Caviar drive models are incompatible with it.
  • Fixed the "No Fixed Disk Present in FDISK"-bug introduced in r551 which means the Tiny build now works without including MODULE_DRIVEXLATE.
  • Fixed a bug from r528 where pressing hotkey F6 would not initiate detection of serial drives.
  • Fixed a bug from r186 in DisplayFormatCompressed.asm where the boot menu would print the IRQ in hexadecimal format when it should be in decimal format.
  • Optimizations and fixes.
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
127
128 xor cx, cx
[369]129ALIGN DISPLAY_JUMP_ALIGN
[41]130.DivideLoop:
[580]131 inc cx ; Increment character count
[41]132 xor dx, dx ; DX:AX now holds the integer
133 div bx ; Divide DX:AX by base
134 push dx ; Push remainder
135 test ax, ax ; All divided?
136 jnz SHORT .DivideLoop ; If not, loop
[44]137
[580]138ALIGN DISPLAY_JUMP_ALIGN
[532]139PrintAllPushedDigits: ; Unused entrypoint OK
[44]140.PrintNextDigit:
141 pop ax ; Pop digit
[580]142 cmp al, 10 ; Convert binary digit in AL to ASCII hex digit ('0'-'9' or 'A'-'F')
143 sbb al, 69h
144 das
[41]145 call DisplayPrint_CharacterFromAL
[44]146 loop .PrintNextDigit
[41]147
148 pop cx
149 ret
[580]150%endif ; ~MODULE_STRINGS_COMPRESSED
[341]151
152;--------------------------------------------------------------------
153; DisplayPrint_QWordFromSSBPwithBaseInBX
154; Parameters:
155; SS:BP: QWord to display
156; BX: Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
157; DS: BDA segment (zero)
158; ES:DI: Ptr to cursor location in video RAM
159; Returns:
160; DI: Updated offset to video RAM
161; Corrupts registers:
162; AX, DX, [SS:BP]
163;--------------------------------------------------------------------
[491]164%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS OR EXCLUDE_FROM_XTIDECFG
[369]165ALIGN DISPLAY_JUMP_ALIGN
[341]166DisplayPrint_QWordFromSSBPwithBaseInBX:
167 push cx
168
169 mov cx, bx ; CX = Integer base
170 xor bx, bx ; BX = Character count
[369]171ALIGN DISPLAY_JUMP_ALIGN
[341]172.DivideLoop:
173 call Math_DivQWatSSBPbyCX; Divide by base
174 push dx ; Push remainder
175 inc bx ; Increment character count
176 cmp WORD [bp], BYTE 0 ; All divided?
177 jne SHORT .DivideLoop ; If not, loop
[580]178 xchg cx, bx ; Character count to CX, Integer base to BX
[341]179 jmp SHORT PrintAllPushedDigits
[491]180%endif
[41]181
182
183;--------------------------------------------------------------------
184; DisplayPrint_CharacterBufferFromBXSIwithLengthInCX
185; Parameters:
186; CX: Buffer length (characters)
187; BX:SI: Ptr to NULL terminated string
188; DS: BDA segment (zero)
189; ES:DI: Ptr to cursor location in video RAM
190; Returns:
191; DI: Updated offset to video RAM
192; Corrupts registers:
193; AX, DX
194;--------------------------------------------------------------------
[223]195%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]196ALIGN DISPLAY_JUMP_ALIGN
[41]197DisplayPrint_CharacterBufferFromBXSIwithLengthInCX:
[44]198 jcxz .NothingToPrintSinceZeroLength
199 push si
[41]200 push cx
201
[369]202ALIGN DISPLAY_JUMP_ALIGN
[44]203.PrintNextCharacter:
204 mov ds, bx
205 lodsb
206 LOAD_BDA_SEGMENT_TO ds, dx
207 call DisplayPrint_CharacterFromAL
208 loop .PrintNextCharacter
209
[41]210 pop cx
[44]211 pop si
212.NothingToPrintSinceZeroLength:
[41]213 ret
[376]214%endif
[41]215
[376]216
[41]217;--------------------------------------------------------------------
[67]218; DisplayPrint_ClearScreenWithCharInALandAttributeInAH
[41]219; Parameters:
[67]220; AL: Character to clear with
221; AH: Attribute to clear with
[41]222; DS: BDA segment (zero)
223; ES:DI: Ptr to cursor location in video RAM
224; Returns:
225; Nothing
226; Corrupts registers:
227; AX, DX
228;--------------------------------------------------------------------
[491]229%ifdef INCLUDE_MENU_LIBRARY
[369]230ALIGN DISPLAY_JUMP_ALIGN
[67]231DisplayPrint_ClearScreenWithCharInALandAttributeInAH:
[41]232 push di
[67]233 push cx
234
235 xchg cx, ax
[41]236 xor ax, ax
[67]237 call DisplayCursor_SetCoordinatesFromAX ; Updates DI
[41]238 call DisplayPage_GetColumnsToALandRowsToAH
[67]239 mul ah ; AX = AL*AH = Characters on screen
240 xchg cx, ax ; AX = Char+Attr, CX = WORDs to store
241 rep stosw
242
243 pop cx
[41]244 pop di
245 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], di
246 ret
[489]247%endif
[491]248
249
[41]250;--------------------------------------------------------------------
251; DisplayPrint_ClearAreaWithHeightInAHandWidthInAL
252; Parameters:
253; AH: Area height
254; AL: Area width
255; DS: BDA segment (zero)
256; ES:DI: Ptr to cursor location in video RAM
257; Returns:
[42]258; DI: Updated offset to video RAM
[41]259; Corrupts registers:
260; AX, DX
261;--------------------------------------------------------------------
[134]262%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[369]263ALIGN DISPLAY_JUMP_ALIGN
[41]264DisplayPrint_ClearAreaWithHeightInAHandWidthInAL:
[42]265 push si
[41]266 push cx
267 push bx
268
[42]269 xchg bx, ax ; Area size to BX
[41]270 call DisplayCursor_GetSoftwareCoordinatesToAX
[42]271 xchg si, ax ; Software (Y,X) coordinates now in SI
272 xor cx, cx
[41]273
[369]274ALIGN DISPLAY_JUMP_ALIGN
[42]275.ClearRowLoop:
276 mov cl, bl ; Area width now in CX
[44]277 mov al, SCREEN_BACKGROUND_CHARACTER
[42]278 call DisplayPrint_RepeatCharacterFromALwithCountInCX
[41]279
[42]280 xchg ax, si ; Coordinates to AX
281 inc ah ; Increment row
282 mov si, ax
[41]283 call DisplayCursor_SetCoordinatesFromAX
[42]284 dec bh ; Decrement rows left
285 jnz SHORT .ClearRowLoop
[41]286
287 pop bx
288 pop cx
[42]289 pop si
[41]290 ret
[134]291%endif
[42]292
[492]293%ifdef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
294 %define EXCLUDE
[532]295 %ifndef MODULE_STRINGS_COMPRESSED
296 %undef EXCLUDE
297 %endif
[492]298 %ifdef MODULE_HOTKEYS
299 %undef EXCLUDE
300 %endif
301 %ifdef MODULE_BOOT_MENU
302 %undef EXCLUDE
303 %endif
304%endif
[42]305
[505]306%ifndef EXCLUDE
[42]307;--------------------------------------------------------------------
308; DisplayPrint_RepeatCharacterFromALwithCountInCX
309; Parameters:
310; AL: Character to display
311; CX: Repeat count
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:
[181]317; DX
[42]318;--------------------------------------------------------------------
[369]319ALIGN DISPLAY_JUMP_ALIGN
[42]320DisplayPrint_RepeatCharacterFromALwithCountInCX:
[44]321 jcxz .NothingToRepeat
322 push cx
323
[369]324ALIGN DISPLAY_JUMP_ALIGN
[44]325.RepeatCharacter:
[42]326 push ax
327 call DisplayPrint_CharacterFromAL
328 pop ax
[44]329 loop .RepeatCharacter
330
331 pop cx
332.NothingToRepeat:
[42]333 ret
[492]334%endif
335%undef EXCLUDE
[223]336
[186]337;--------------------------------------------------------------------
338; DisplayPrint_NullTerminatedStringFromCSSI
339; Parameters:
340; CS:SI: Ptr to NULL terminated string
341; DS: BDA segment (zero)
342; ES:DI: Ptr to cursor location in video RAM
343; Returns:
344; DI: Updated offset to video RAM
345; Corrupts registers:
346; AX, DX
347;--------------------------------------------------------------------
[376]348%ifndef MODULE_STRINGS_COMPRESSED
349;;;
350;;; Take care when using this routine with compressed strings (which is why it is disabled).
351;;; All strings in CSSI should go through the DisplayFormatCompressed code to be decoded.
352;;;
[369]353ALIGN DISPLAY_JUMP_ALIGN
[186]354DisplayPrint_NullTerminatedStringFromCSSI:
355 push bx
356 mov bx, cs
357 call DisplayPrint_NullTerminatedStringFromBXSI
358 pop bx
359 ret
[376]360%endif
[42]361
362
[376]363;;;
364;;; Note that the following routines need to be at the bottom of this file
365;;; to accomodate short jumps from the next file (DisplayFormat/DisplayFormatCompressed)
366;;;
367
[42]368;--------------------------------------------------------------------
[44]369; DisplayPrint_Newline
370; Parameters:
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;--------------------------------------------------------------------
[376]378%ifdef MODULE_STRINGS_COMPRESSED
[369]379ALIGN DISPLAY_JUMP_ALIGN
[376]380DisplayPrint_Newline_FormatAdjustBP:
381 inc bp ; we didn't need a parameter after all, readjust BP
382 inc bp
383 ; fall through to DisplayPrint_Newline
384%endif
385
[369]386ALIGN DISPLAY_JUMP_ALIGN
[44]387DisplayPrint_Newline:
[52]388 mov al, LF
389 call DisplayPrint_CharacterFromAL
[44]390 mov al, CR
391 ; Fall to DisplayPrint_CharacterFromAL
392
393;--------------------------------------------------------------------
[42]394; DisplayPrint_CharacterFromAL
395; Parameters:
396; AL: Character to display
[567]397; Zero value is ignored (no character is printed)
[42]398; DS: BDA segment (zero)
399; ES:DI: Ptr to cursor location in video RAM
400; Returns:
401; DI: Updated offset to video RAM
402; Corrupts registers:
403; AX, DX
404;--------------------------------------------------------------------
[369]405ALIGN DISPLAY_JUMP_ALIGN
[42]406DisplayPrint_CharacterFromAL:
[505]407 test al, al
[376]408 jz DisplayPrint_Ret
409
[42]410 mov ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
411 jmp [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut]
[223]412
[376]413
[186]414;--------------------------------------------------------------------
415; DisplayPrint_NullTerminatedStringFromBXSI
416; Parameters:
417; DS: BDA segment (zero)
418; BX:SI: Ptr to NULL terminated string
419; ES:DI: Ptr to cursor location in video RAM
420; Returns:
421; DI: Updated offset to video RAM
422; Corrupts registers:
423; AX, DX
424;--------------------------------------------------------------------
[369]425ALIGN DISPLAY_JUMP_ALIGN
[186]426DisplayPrint_NullTerminatedStringFromBXSI:
427 push si
428 push cx
429
430 xor cx, cx
[369]431ALIGN DISPLAY_JUMP_ALIGN
[186]432.PrintNextCharacter:
433 mov ds, bx ; String segment to DS
434 lodsb
435 mov ds, cx ; BDA segment to DS
436 test al, al ; NULL?
437 jz SHORT .EndOfString
438 call DisplayPrint_CharacterFromAL
439 jmp SHORT .PrintNextCharacter
440
[369]441ALIGN DISPLAY_JUMP_ALIGN
[186]442.EndOfString:
443 pop cx
444 pop si
[376]445
446DisplayPrint_Ret: ; random ret to jump to
[186]447 ret
448
Note: See TracBrowser for help on using the repository browser.