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

Last change on this file since 399 was 376, checked in by gregli@…, 13 years ago

WIDE checkin... Added copyright and license information to sorce files, as per the GPL instructions for usage.

File size: 12.4 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%ifndef MODULE_STRINGS_COMPRESSED
112;--------------------------------------------------------------------
113; DisplayPrint_WordFromAXWithBaseInBX
114; Parameters:
115; AX: Word to display
116; BX: Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
117; DS: BDA segment (zero)
118; ES:DI: Ptr to cursor location in video RAM
119; Returns:
120; DI: Updated offset to video RAM
121; Corrupts registers:
122; AX, DX
123;--------------------------------------------------------------------
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;--------------------------------------------------------------------
155; DisplayPrint_QWordFromSSBPwithBaseInBX
156; Parameters:
157; SS:BP: QWord to display
158; BX: Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
159; DS: BDA segment (zero)
160; ES:DI: Ptr to cursor location in video RAM
161; Returns:
162; DI: Updated offset to video RAM
163; Corrupts registers:
164; AX, DX, [SS:BP]
165;--------------------------------------------------------------------
166%ifndef EXCLUDE_FROM_XTIDECFG ; Not used in XTIDECFG
167ALIGN DISPLAY_JUMP_ALIGN
168DisplayPrint_QWordFromSSBPwithBaseInBX:
169 push cx
170 push bx
171
172 mov cx, bx ; CX = Integer base
173 xor bx, bx ; BX = Character count
174ALIGN DISPLAY_JUMP_ALIGN
175.DivideLoop:
176 call Math_DivQWatSSBPbyCX; Divide by base
177 push dx ; Push remainder
178 inc bx ; Increment character count
179 cmp WORD [bp], BYTE 0 ; All divided?
180 jne SHORT .DivideLoop ; If not, loop
181 mov cx, bx ; Character count to CX
182 jmp SHORT PrintAllPushedDigits
183%endif ; EXCLUDE_FROM_XTIDECFG
184
185%endif ; MODULE_STRINGS_COMPRESSED
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;--------------------------------------------------------------------
234ALIGN DISPLAY_JUMP_ALIGN
235DisplayPrint_ClearScreenWithCharInALandAttributeInAH:
236 push di
237 push cx
238
239 xchg cx, ax
240 xor ax, ax
241 call DisplayCursor_SetCoordinatesFromAX ; Updates DI
242 call DisplayPage_GetColumnsToALandRowsToAH
243 mul ah ; AX = AL*AH = Characters on screen
244 xchg cx, ax ; AX = Char+Attr, CX = WORDs to store
245 rep stosw
246
247 pop cx
248 pop di
249 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], di
250 ret
251
252
253;--------------------------------------------------------------------
254; DisplayPrint_ClearAreaWithHeightInAHandWidthInAL
255; Parameters:
256; AH: Area height
257; AL: Area width
258; DS: BDA segment (zero)
259; ES:DI: Ptr to cursor location in video RAM
260; Returns:
261; DI: Updated offset to video RAM
262; Corrupts registers:
263; AX, DX
264;--------------------------------------------------------------------
265%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
266ALIGN DISPLAY_JUMP_ALIGN
267DisplayPrint_ClearAreaWithHeightInAHandWidthInAL:
268 push si
269 push cx
270 push bx
271
272 xchg bx, ax ; Area size to BX
273 call DisplayCursor_GetSoftwareCoordinatesToAX
274 xchg si, ax ; Software (Y,X) coordinates now in SI
275 xor cx, cx
276
277ALIGN DISPLAY_JUMP_ALIGN
278.ClearRowLoop:
279 mov cl, bl ; Area width now in CX
280 mov al, SCREEN_BACKGROUND_CHARACTER
281 call DisplayPrint_RepeatCharacterFromALwithCountInCX
282
283 xchg ax, si ; Coordinates to AX
284 inc ah ; Increment row
285 mov si, ax
286 call DisplayCursor_SetCoordinatesFromAX
287 dec bh ; Decrement rows left
288 jnz SHORT .ClearRowLoop
289
290 pop bx
291 pop cx
292 pop si
293 ret
294%endif
295
296
297;--------------------------------------------------------------------
298; DisplayPrint_RepeatCharacterFromALwithCountInCX
299; Parameters:
300; AL: Character to display
301; CX: Repeat count
302; DS: BDA segment (zero)
303; ES:DI: Ptr to cursor location in video RAM
304; Returns:
305; DI: Updated offset to video RAM
306; Corrupts registers:
307; DX
308;--------------------------------------------------------------------
309ALIGN DISPLAY_JUMP_ALIGN
310DisplayPrint_RepeatCharacterFromALwithCountInCX:
311 jcxz .NothingToRepeat
312 push cx
313
314ALIGN DISPLAY_JUMP_ALIGN
315.RepeatCharacter:
316 push ax
317 call DisplayPrint_CharacterFromAL
318 pop ax
319 loop .RepeatCharacter
320
321 pop cx
322.NothingToRepeat:
323 ret
324
325
326;--------------------------------------------------------------------
327; DisplayPrint_NullTerminatedStringFromCSSI
328; Parameters:
329; CS:SI: Ptr to NULL terminated string
330; DS: BDA segment (zero)
331; ES:DI: Ptr to cursor location in video RAM
332; Returns:
333; DI: Updated offset to video RAM
334; Corrupts registers:
335; AX, DX
336;--------------------------------------------------------------------
337%ifndef MODULE_STRINGS_COMPRESSED
338;;;
339;;; Take care when using this routine with compressed strings (which is why it is disabled).
340;;; All strings in CSSI should go through the DisplayFormatCompressed code to be decoded.
341;;;
342ALIGN DISPLAY_JUMP_ALIGN
343DisplayPrint_NullTerminatedStringFromCSSI:
344 push bx
345 mov bx, cs
346 call DisplayPrint_NullTerminatedStringFromBXSI
347 pop bx
348 ret
349%endif
350
351
352;;;
353;;; Note that the following routines need to be at the bottom of this file
354;;; to accomodate short jumps from the next file (DisplayFormat/DisplayFormatCompressed)
355;;;
356
357;--------------------------------------------------------------------
358; DisplayPrint_Newline
359; Parameters:
360; DS: BDA segment (zero)
361; ES:DI: Ptr to cursor location in video RAM
362; Returns:
363; DI: Updated offset to video RAM
364; Corrupts registers:
365; AX, DX
366;--------------------------------------------------------------------
367%ifdef MODULE_STRINGS_COMPRESSED
368ALIGN DISPLAY_JUMP_ALIGN
369DisplayPrint_Newline_FormatAdjustBP:
370 inc bp ; we didn't need a parameter after all, readjust BP
371 inc bp
372 ; fall through to DisplayPrint_Newline
373%endif
374
375ALIGN DISPLAY_JUMP_ALIGN
376DisplayPrint_Newline:
377 mov al, LF
378 call DisplayPrint_CharacterFromAL
379 mov al, CR
380 ; Fall to DisplayPrint_CharacterFromAL
381
382;--------------------------------------------------------------------
383; DisplayPrint_CharacterFromAL
384; Parameters:
385; AL: Character to display
386; Zero value is ignored (no characer is printed)
387; DS: BDA segment (zero)
388; ES:DI: Ptr to cursor location in video RAM
389; Returns:
390; DI: Updated offset to video RAM
391; Corrupts registers:
392; AX, DX
393;--------------------------------------------------------------------
394ALIGN DISPLAY_JUMP_ALIGN
395DisplayPrint_CharacterFromAL:
396 test al,al
397 jz DisplayPrint_Ret
398
399 mov ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
400 jmp [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut]
401
402
403;--------------------------------------------------------------------
404; DisplayPrint_NullTerminatedStringFromBXSI
405; Parameters:
406; DS: BDA segment (zero)
407; BX:SI: Ptr to NULL terminated string
408; ES:DI: Ptr to cursor location in video RAM
409; Returns:
410; DI: Updated offset to video RAM
411; Corrupts registers:
412; AX, DX
413;--------------------------------------------------------------------
414ALIGN DISPLAY_JUMP_ALIGN
415DisplayPrint_NullTerminatedStringFromBXSI:
416 push si
417 push cx
418
419 xor cx, cx
420ALIGN DISPLAY_JUMP_ALIGN
421.PrintNextCharacter:
422 mov ds, bx ; String segment to DS
423 lodsb
424 mov ds, cx ; BDA segment to DS
425 test al, al ; NULL?
426 jz SHORT .EndOfString
427 call DisplayPrint_CharacterFromAL
428 jmp SHORT .PrintNextCharacter
429
430ALIGN DISPLAY_JUMP_ALIGN
431.EndOfString:
432 pop cx
433 pop si
434
435DisplayPrint_Ret: ; random ret to jump to
436 ret
437
Note: See TracBrowser for help on using the repository browser.