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

Last change on this file since 224 was 223, checked in by krille_n_@…, 13 years ago

Changes:

  • Fixed what appears to be a mistake in EBIOS.inc
  • Added a 'release' option to the makefile of the Serial Server (invokes UPX)
  • Some very minor optimizations
  • Removed the eSEG macro and did some other cleanups (fixed typos etc)
File size: 10.5 KB
Line 
1; Project name : Assembly Library
2; Description : Functions for display output.
3
4; Section containing code
5SECTION .text
6
7
8;--------------------------------------------------------------------
9; Supports following formatting types:
10; %a Specifies attribute for next character
11; %A Specifies attribute for remaining string (or until next %A)
12; %d Prints signed 16-bit decimal integer
13; %u Prints unsigned 16-bit decimal integer
14; %x Prints 16-bit hexadecimal integer
15; %s Prints string (from CS segment)
16; %S Prints string (far pointer)
17; %c Prints character
18; %t Prints character number of times (character needs to be pushed first, then repeat times)
19; %% Prints '%' character (no parameter pushed)
20;
21; Any placeholder can be set to minimum length by specifying
22; minimum number of characters. For example %8d would append spaces
23; after integer so that at least 8 characters would be printed.
24;
25; When placing '-' after number, then spaces will be used for prepending.
26; For example %8-d would prepend integer with spaces so that at least
27; 8 characters would be printed.
28;
29; DisplayPrint_FormattedNullTerminatedStringFromCSSI
30; Parameters:
31; BP: SP before pushing parameters
32; DS: BDA segment (zero)
33; CS:SI: Pointer to string to format
34; ES:DI: Ptr to cursor location in video RAM
35; Stack: Parameters for formatting placeholders.
36; Parameter for first placeholder must be pushed first.
37; Low word must pushed first for placeholders requiring
38; 32-bit parameters (two words).
39; Returns:
40; DI: Updated offset to video RAM
41; Corrupts registers:
42; AX, DX
43;--------------------------------------------------------------------
44ALIGN JUMP_ALIGN
45DisplayPrint_FormattedNullTerminatedStringFromCSSI:
46 push bp
47 push si
48 push cx
49 push bx
50 push WORD [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
51
52 dec bp ; Point BP to...
53 dec bp ; ...first stack parameter
54 call DisplayFormat_ParseCharacters
55
56 ; Pop original character attribute
57 pop ax
58 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute], al
59
60 pop bx
61 pop cx
62 pop si
63 pop bp
64
65 ret
66
67
68;--------------------------------------------------------------------
69; DisplayPrint_SignedWordFromAXWithBaseInBX
70; Parameters:
71; AX: Word to display
72; BX: Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
73; DS: BDA segment (zero)
74; ES:DI: Ptr to cursor location in video RAM
75; Returns:
76; DI: Updated offset to video RAM
77; Corrupts registers:
78; AX, DX
79;--------------------------------------------------------------------
80%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
81ALIGN JUMP_ALIGN
82DisplayPrint_SignedWordFromAXWithBaseInBX:
83 test ax, ax
84 jns SHORT DisplayPrint_WordFromAXWithBaseInBX
85
86 push ax
87 mov al, '-'
88 call DisplayPrint_CharacterFromAL
89 pop ax
90 neg ax
91 ; Fall to DisplayPrint_WordFromAXWithBaseInBX
92%endif
93
94;--------------------------------------------------------------------
95; DisplayPrint_WordFromAXWithBaseInBX
96; Parameters:
97; AX: Word to display
98; BX: Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
99; DS: BDA segment (zero)
100; ES:DI: Ptr to cursor location in video RAM
101; Returns:
102; DI: Updated offset to video RAM
103; Corrupts registers:
104; AX, DX
105;--------------------------------------------------------------------
106
107%ifndef MODULE_STRINGS_COMPRESSED
108
109ALIGN JUMP_ALIGN
110DisplayPrint_WordFromAXWithBaseInBX:
111 push cx
112 push bx
113
114 xor cx, cx
115ALIGN JUMP_ALIGN
116.DivideLoop:
117 xor dx, dx ; DX:AX now holds the integer
118 div bx ; Divide DX:AX by base
119 push dx ; Push remainder
120 inc cx ; Increment character count
121 test ax, ax ; All divided?
122 jnz SHORT .DivideLoop ; If not, loop
123
124 mov bx, .rgcDigitToCharacter
125ALIGN JUMP_ALIGN
126.PrintNextDigit:
127 pop ax ; Pop digit
128 cs xlatb
129 call DisplayPrint_CharacterFromAL
130 loop .PrintNextDigit
131
132 pop bx
133 pop cx
134 ret
135.rgcDigitToCharacter: db "0123456789ABCDEF"
136
137%endif ; MODULE_STRINGS_COMPRESSED
138
139
140;--------------------------------------------------------------------
141; DisplayPrint_CharacterBufferFromBXSIwithLengthInCX
142; Parameters:
143; CX: Buffer length (characters)
144; BX:SI: Ptr to NULL terminated string
145; DS: BDA segment (zero)
146; ES:DI: Ptr to cursor location in video RAM
147; Returns:
148; DI: Updated offset to video RAM
149; Corrupts registers:
150; AX, DX
151;--------------------------------------------------------------------
152%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
153ALIGN JUMP_ALIGN
154DisplayPrint_CharacterBufferFromBXSIwithLengthInCX:
155 jcxz .NothingToPrintSinceZeroLength
156 push si
157 push cx
158
159ALIGN JUMP_ALIGN
160.PrintNextCharacter:
161 mov ds, bx
162 lodsb
163 LOAD_BDA_SEGMENT_TO ds, dx
164 call DisplayPrint_CharacterFromAL
165 loop .PrintNextCharacter
166
167 pop cx
168 pop si
169.NothingToPrintSinceZeroLength:
170 ret
171%endif
172
173
174;--------------------------------------------------------------------
175; DisplayPrint_ClearScreenWithCharInALandAttributeInAH
176; Parameters:
177; AL: Character to clear with
178; AH: Attribute to clear with
179; DS: BDA segment (zero)
180; ES:DI: Ptr to cursor location in video RAM
181; Returns:
182; Nothing
183; Corrupts registers:
184; AX, DX
185;--------------------------------------------------------------------
186ALIGN JUMP_ALIGN
187DisplayPrint_ClearScreenWithCharInALandAttributeInAH:
188 push di
189 push cx
190
191 xchg cx, ax
192 xor ax, ax
193 call DisplayCursor_SetCoordinatesFromAX ; Updates DI
194 call DisplayPage_GetColumnsToALandRowsToAH
195 mul ah ; AX = AL*AH = Characters on screen
196 xchg cx, ax ; AX = Char+Attr, CX = WORDs to store
197 rep stosw
198
199 pop cx
200 pop di
201 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], di
202 ret
203
204
205;--------------------------------------------------------------------
206; DisplayPrint_ClearAreaWithHeightInAHandWidthInAL
207; Parameters:
208; AH: Area height
209; AL: Area width
210; DS: BDA segment (zero)
211; ES:DI: Ptr to cursor location in video RAM
212; Returns:
213; DI: Updated offset to video RAM
214; Corrupts registers:
215; AX, DX
216;--------------------------------------------------------------------
217%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
218ALIGN JUMP_ALIGN
219DisplayPrint_ClearAreaWithHeightInAHandWidthInAL:
220 push si
221 push cx
222 push bx
223
224 xchg bx, ax ; Area size to BX
225 call DisplayCursor_GetSoftwareCoordinatesToAX
226 xchg si, ax ; Software (Y,X) coordinates now in SI
227 xor cx, cx
228
229ALIGN JUMP_ALIGN
230.ClearRowLoop:
231 mov cl, bl ; Area width now in CX
232 mov al, SCREEN_BACKGROUND_CHARACTER
233 call DisplayPrint_RepeatCharacterFromALwithCountInCX
234
235 xchg ax, si ; Coordinates to AX
236 inc ah ; Increment row
237 mov si, ax
238 call DisplayCursor_SetCoordinatesFromAX
239 dec bh ; Decrement rows left
240 jnz SHORT .ClearRowLoop
241
242 pop bx
243 pop cx
244 pop si
245 ret
246%endif
247
248
249;--------------------------------------------------------------------
250; DisplayPrint_RepeatCharacterFromALwithCountInCX
251; Parameters:
252; AL: Character to display
253; CX: Repeat count
254; DS: BDA segment (zero)
255; ES:DI: Ptr to cursor location in video RAM
256; Returns:
257; DI: Updated offset to video RAM
258; Corrupts registers:
259; DX
260;--------------------------------------------------------------------
261ALIGN JUMP_ALIGN
262DisplayPrint_RepeatCharacterFromALwithCountInCX:
263 jcxz .NothingToRepeat
264 push cx
265
266ALIGN JUMP_ALIGN
267.RepeatCharacter:
268 push ax
269 call DisplayPrint_CharacterFromAL
270 pop ax
271 loop .RepeatCharacter
272
273 pop cx
274.NothingToRepeat:
275 ret
276
277
278;--------------------------------------------------------------------
279; DisplayPrint_NullTerminatedStringFromCSSI
280; Parameters:
281; CS:SI: Ptr to NULL terminated string
282; DS: BDA segment (zero)
283; ES:DI: Ptr to cursor location in video RAM
284; Returns:
285; DI: Updated offset to video RAM
286; Corrupts registers:
287; AX, DX
288;--------------------------------------------------------------------
289%ifndef MODULE_STRINGS_COMPRESSED
290;;;
291;;; Take care when using this routine with compressed strings (which is why it is disabled).
292;;; All strings in CSSI should go through the DisplayFormatCompressed code to be decoded.
293;;;
294ALIGN JUMP_ALIGN
295DisplayPrint_NullTerminatedStringFromCSSI:
296 push bx
297 mov bx, cs
298 call DisplayPrint_NullTerminatedStringFromBXSI
299 pop bx
300 ret
301%endif
302
303
304;;;
305;;; Note that the following routines need to be at the bottom of this file
306;;; to accomodate short jumps from the next file (DisplayFormat/DisplayFormatCompressed)
307;;;
308
309;--------------------------------------------------------------------
310; DisplayPrint_Newline
311; Parameters:
312; DS: BDA segment (zero)
313; ES:DI: Ptr to cursor location in video RAM
314; Returns:
315; DI: Updated offset to video RAM
316; Corrupts registers:
317; AX, DX
318;--------------------------------------------------------------------
319%ifdef MODULE_STRINGS_COMPRESSED
320ALIGN JUMP_ALIGN
321DisplayPrint_Newline_FormatAdjustBP:
322 inc bp ; we didn't need a parameter after all, readjust BP
323 inc bp
324 ; fall through to DisplayPrint_Newline
325%endif
326
327ALIGN JUMP_ALIGN
328DisplayPrint_Newline:
329 mov al, LF
330 call DisplayPrint_CharacterFromAL
331 mov al, CR
332 ; Fall to DisplayPrint_CharacterFromAL
333
334;--------------------------------------------------------------------
335; DisplayPrint_CharacterFromAL
336; Parameters:
337; AL: Character to display
338; Zero value is ignored (no characer is printed)
339; DS: BDA segment (zero)
340; ES:DI: Ptr to cursor location in video RAM
341; Returns:
342; DI: Updated offset to video RAM
343; Corrupts registers:
344; AX, DX
345;--------------------------------------------------------------------
346ALIGN JUMP_ALIGN
347DisplayPrint_CharacterFromAL:
348%ifdef MODULE_STRINGS_COMPRESSED
349 test al,al
350 jz DisplayPrint_Ret
351%endif
352 mov ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
353 jmp [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut]
354
355
356;--------------------------------------------------------------------
357; DisplayPrint_NullTerminatedStringFromBXSI
358; Parameters:
359; DS: BDA segment (zero)
360; BX:SI: Ptr to NULL terminated string
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;--------------------------------------------------------------------
367ALIGN JUMP_ALIGN
368DisplayPrint_NullTerminatedStringFromBXSI:
369 push si
370 push cx
371
372 xor cx, cx
373ALIGN JUMP_ALIGN
374.PrintNextCharacter:
375 mov ds, bx ; String segment to DS
376 lodsb
377 mov ds, cx ; BDA segment to DS
378 test al, al ; NULL?
379 jz SHORT .EndOfString
380 call DisplayPrint_CharacterFromAL
381 jmp SHORT .PrintNextCharacter
382
383ALIGN JUMP_ALIGN
384.EndOfString:
385 pop cx
386 pop si
387
388DisplayPrint_Ret: ; random ret to jump to
389 ret
390
Note: See TracBrowser for help on using the repository browser.