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

Last change on this file since 496 was 492, checked in by gregli@…, 12 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
RevLine 
[41]1; Project name : Assembly Library
2; Description : Functions for display output.
3
[376]4;
[491]5; XTIDE Universal BIOS and Associated Tools
[376]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.
[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
[323]139PrintAllPushedDigits:
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
300 %ifdef MODULE_HOTKEYS
301 %undef EXCLUDE
302 %endif
303 %ifdef MODULE_BOOT_MENU
304 %undef EXCLUDE
305 %endif
306%endif
[42]307
[492]308%ifndef EXCLUDE
[42]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:
[181]319; DX
[42]320;--------------------------------------------------------------------
[369]321ALIGN DISPLAY_JUMP_ALIGN
[42]322DisplayPrint_RepeatCharacterFromALwithCountInCX:
[44]323 jcxz .NothingToRepeat
324 push cx
325
[369]326ALIGN DISPLAY_JUMP_ALIGN
[44]327.RepeatCharacter:
[42]328 push ax
329 call DisplayPrint_CharacterFromAL
330 pop ax
[44]331 loop .RepeatCharacter
332
333 pop cx
334.NothingToRepeat:
[42]335 ret
[492]336%endif
337%undef EXCLUDE
[223]338
[186]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;--------------------------------------------------------------------
[376]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;;;
[369]355ALIGN DISPLAY_JUMP_ALIGN
[186]356DisplayPrint_NullTerminatedStringFromCSSI:
357 push bx
358 mov bx, cs
359 call DisplayPrint_NullTerminatedStringFromBXSI
360 pop bx
361 ret
[376]362%endif
[42]363
364
[376]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
[42]370;--------------------------------------------------------------------
[44]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;--------------------------------------------------------------------
[376]380%ifdef MODULE_STRINGS_COMPRESSED
[369]381ALIGN DISPLAY_JUMP_ALIGN
[376]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
[369]388ALIGN DISPLAY_JUMP_ALIGN
[44]389DisplayPrint_Newline:
[52]390 mov al, LF
391 call DisplayPrint_CharacterFromAL
[44]392 mov al, CR
393 ; Fall to DisplayPrint_CharacterFromAL
394
395;--------------------------------------------------------------------
[42]396; DisplayPrint_CharacterFromAL
397; Parameters:
398; AL: Character to display
[376]399; Zero value is ignored (no characer is printed)
[42]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;--------------------------------------------------------------------
[369]407ALIGN DISPLAY_JUMP_ALIGN
[42]408DisplayPrint_CharacterFromAL:
[376]409 test al,al
410 jz DisplayPrint_Ret
411
[42]412 mov ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
413 jmp [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut]
[223]414
[376]415
[186]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;--------------------------------------------------------------------
[369]427ALIGN DISPLAY_JUMP_ALIGN
[186]428DisplayPrint_NullTerminatedStringFromBXSI:
429 push si
430 push cx
431
432 xor cx, cx
[369]433ALIGN DISPLAY_JUMP_ALIGN
[186]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
[369]443ALIGN DISPLAY_JUMP_ALIGN
[186]444.EndOfString:
445 pop cx
446 pop si
[376]447
448DisplayPrint_Ret: ; random ret to jump to
[186]449 ret
450
Note: See TracBrowser for help on using the repository browser.