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

Last change on this file since 498 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
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.