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

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

Changes:

  • Renamed MODULE_FEATURE_SETS to MODULE_POWER_MANAGEMENT.
  • Renamed MODULE_VERY_LATE_INITIALIZATION to MODULE_VERY_LATE_INIT and removed it from the official builds.
  • Removed the code that skips detection of slave drives on XT-CF controllers since slave drives can be used with Lo-tech ISA CompactFlash boards.
  • Added autodetection of the SVC ADP50L controller to XTIDECFG.
  • The autodetection of XT-CF controllers now requires MODULE_8BIT_IDE_ADVANCED in the loaded BIOS.
  • Fixed a bug in XTIDECFG from r502 where the "Base (cmd block) address" menu option would be displayed when a serial device was selected as the IDE controller.
  • XTIDECFG would display the "Enable interrupt" menu option for the XTIDE r1 but not for the XTIDE r2. It's now displayed for both controller types.
  • Disabled the "Internal Write Cache" menu option in the Master/Slave Drive menus for serial device type drives.
  • Optimizations and other 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
[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
[567]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.