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

Last change on this file since 513 was 505, checked in by krille_n_@…, 12 years ago

Changes:

  • Reverted the changes to MenuEvents.inc done in r492 since they broke the F1 key function in XTIDECFG.
  • Added a tail-call optimized variant of the CALL_DISPLAY_LIBRARY macro (JMP_DISPLAY_LIBRARY).
  • Put a block size limit in AH1Eh_ChangeXTCFmodeBasedOnControlRegisterInAL. I think it's needed but if not, it's easy to remove.
  • Other optimizations and fixes.
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 character 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.