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

Last change on this file since 44 was 44, checked in by Tomi Tilli, 14 years ago

Spaces can now be generated before format specifier when printing formatted string.
Background character and attribute can now be easily specified before compiling.

File size: 9.2 KB
Line 
1; File name : Display.asm
2; Project name : Assembly Library
3; Created date : 26.6.2010
4; Last update : 27.9.2010
5; Author : Tomi Tilli
6; Description : Functions for display output.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; Supports following formatting types:
13; %a Specifies attribute for next character
14; %A Specifies attribute for remaining string (or until next %A)
15; %d Prints signed 16-bit decimal integer
16; %u Prints unsigned 16-bit decimal integer
17; %x Prints 16-bit hexadecimal integer
18; %s Prints string (from CS segment)
19; %S Prints string (far pointer)
20; %c Prints character
21; %t Prints character number of times (character needs to be pushed first, then repeat times)
22; %% Prints '%' character (no parameter pushed)
23;
24; Any placeholder can be set to minimum length by specifying
25; minimum number of characters. For example %8d would append spaces
26; after integer so that at least 8 characters would be printed.
27;
28; DisplayPrint_FormattedNullTerminatedStringFromCSSI
29; Parameters:
30; BP: SP before pushing parameters
31; DS: BDA segment (zero)
32; CS:SI: Pointer to string to format
33; ES:DI: Ptr to cursor location in video RAM
34; Stack: Parameters for formatting placeholders.
35; Parameter for first placeholder must be pushed first.
36; Low word must pushed first for placeholders requiring
37; 32-bit parameters (two words).
38; Returns:
39; DI: Updated offset to video RAM
40; Corrupts registers:
41; AX, DX
42;--------------------------------------------------------------------
43ALIGN JUMP_ALIGN
44DisplayPrint_FormattedNullTerminatedStringFromCSSI:
45 push bp
46 push si
47 push cx
48 push bx
49 push WORD [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
50
51 dec bp ; Point BP to...
52 dec bp ; ...first stack parameter
53 call DisplayFormat_ParseCharacters
54
55 ; Pop original character attribute
56 pop ax
57 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute], al
58
59 pop bx
60 pop cx
61 pop si
62 pop bp
63 ret
64
65
66;--------------------------------------------------------------------
67; DisplayPrint_SignedWordFromAXWithBaseInBX
68; Parameters:
69; AX: Word to display
70; BX: Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
71; DS: BDA segment (zero)
72; ES:DI: Ptr to cursor location in video RAM
73; Returns:
74; DI: Updated offset to video RAM
75; Corrupts registers:
76; AX, DX
77;--------------------------------------------------------------------
78ALIGN JUMP_ALIGN
79DisplayPrint_SignedWordFromAXWithBaseInBX:
80 test ax, ax
81 jns SHORT DisplayPrint_WordFromAXWithBaseInBX
82
83 push ax
84 mov al, '-'
85 call DisplayPrint_CharacterFromAL
86 pop ax
87 neg ax
88 ; Fall to DisplayPrint_WordFromAXWithBaseInBX
89
90;--------------------------------------------------------------------
91; DisplayPrint_WordFromAXWithBaseInBX
92; Parameters:
93; AX: Word to display
94; BX: Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
95; DS: BDA segment (zero)
96; ES:DI: Ptr to cursor location in video RAM
97; Returns:
98; DI: Updated offset to video RAM
99; Corrupts registers:
100; AX, DX
101;--------------------------------------------------------------------
102ALIGN JUMP_ALIGN
103DisplayPrint_WordFromAXWithBaseInBX:
104 push cx
105 push bx
106
107 xor cx, cx
108ALIGN JUMP_ALIGN
109.DivideLoop:
110 xor dx, dx ; DX:AX now holds the integer
111 div bx ; Divide DX:AX by base
112 push dx ; Push remainder
113 inc cx ; Increment character count
114 test ax, ax ; All divided?
115 jnz SHORT .DivideLoop ; If not, loop
116
117 mov bx, .rgcDigitToCharacter
118ALIGN JUMP_ALIGN
119.PrintNextDigit:
120 pop ax ; Pop digit
121 eSEG cs
122 xlatb
123 call DisplayPrint_CharacterFromAL
124 loop .PrintNextDigit
125
126 pop bx
127 pop cx
128 ret
129.rgcDigitToCharacter: db "0123456789ABCDEF"
130
131
132;--------------------------------------------------------------------
133; DisplayPrint_CharacterBufferFromBXSIwithLengthInCX
134; Parameters:
135; CX: Buffer length (characters)
136; BX:SI: Ptr to NULL terminated string
137; DS: BDA segment (zero)
138; ES:DI: Ptr to cursor location in video RAM
139; Returns:
140; DI: Updated offset to video RAM
141; Corrupts registers:
142; AX, DX
143;--------------------------------------------------------------------
144ALIGN JUMP_ALIGN
145DisplayPrint_CharacterBufferFromBXSIwithLengthInCX:
146 jcxz .NothingToPrintSinceZeroLength
147 push si
148 push cx
149
150ALIGN JUMP_ALIGN
151.PrintNextCharacter:
152 mov ds, bx
153 lodsb
154 LOAD_BDA_SEGMENT_TO ds, dx
155 call DisplayPrint_CharacterFromAL
156 loop .PrintNextCharacter
157
158 LOAD_BDA_SEGMENT_TO ds, dx
159 pop cx
160 pop si
161.NothingToPrintSinceZeroLength:
162 ret
163
164
165;--------------------------------------------------------------------
166; DisplayPrint_NullTerminatedStringFromCSSI
167; Parameters:
168; CS:SI: Ptr to NULL terminated string
169; DS: BDA segment (zero)
170; ES:DI: Ptr to cursor location in video RAM
171; Returns:
172; DI: Updated offset to video RAM
173; Corrupts registers:
174; AX, DX
175;--------------------------------------------------------------------
176ALIGN JUMP_ALIGN
177DisplayPrint_NullTerminatedStringFromCSSI:
178 push bx
179 mov bx, cs
180 call DisplayPrint_NullTerminatedStringFromBXSI
181 pop bx
182 ret
183
184
185;--------------------------------------------------------------------
186; DisplayPrint_NullTerminatedStringFromBXSI
187; Parameters:
188; DS: BDA segment (zero)
189; BX:SI: Ptr to NULL terminated string
190; ES:DI: Ptr to cursor location in video RAM
191; Returns:
192; DI: Updated offset to video RAM
193; Corrupts registers:
194; AX, DX
195;--------------------------------------------------------------------
196ALIGN JUMP_ALIGN
197DisplayPrint_NullTerminatedStringFromBXSI:
198 push si
199 push cx
200
201 xor cx, cx
202ALIGN JUMP_ALIGN
203.PrintNextCharacter:
204 mov ds, bx ; String segment to DS
205 lodsb
206 mov ds, cx ; BDA segment to DS
207 test al, al ; NULL?
208 jz SHORT .EndOfString
209 call DisplayPrint_CharacterFromAL
210 jmp SHORT .PrintNextCharacter
211
212ALIGN JUMP_ALIGN
213.EndOfString:
214 pop cx
215 pop si
216 ret
217
218
219;--------------------------------------------------------------------
220; DisplayPrint_ClearScreen
221; Parameters:
222; DS: BDA segment (zero)
223; ES:DI: Ptr to cursor location in video RAM
224; Returns:
225; Nothing
226; Corrupts registers:
227; AX, DX
228;--------------------------------------------------------------------
229ALIGN JUMP_ALIGN
230DisplayPrint_ClearScreen:
231 push di
232 xor ax, ax
233 call DisplayCursor_SetCoordinatesFromAX
234 call DisplayPage_GetColumnsToALandRowsToAH
235 call DisplayPrint_ClearAreaWithHeightInAHandWidthInAL
236 pop di
237 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], di
238 ret
239
240
241;--------------------------------------------------------------------
242; DisplayPrint_ClearAreaWithHeightInAHandWidthInAL
243; Parameters:
244; AH: Area height
245; AL: Area width
246; DS: BDA segment (zero)
247; ES:DI: Ptr to cursor location in video RAM
248; Returns:
249; DI: Updated offset to video RAM
250; Corrupts registers:
251; AX, DX
252;--------------------------------------------------------------------
253ALIGN JUMP_ALIGN
254DisplayPrint_ClearAreaWithHeightInAHandWidthInAL:
255 push si
256 push cx
257 push bx
258
259 xchg bx, ax ; Area size to BX
260 call DisplayCursor_GetSoftwareCoordinatesToAX
261 xchg si, ax ; Software (Y,X) coordinates now in SI
262 xor cx, cx
263
264ALIGN JUMP_ALIGN
265.ClearRowLoop:
266 mov cl, bl ; Area width now in CX
267 mov al, SCREEN_BACKGROUND_CHARACTER
268 call DisplayPrint_RepeatCharacterFromALwithCountInCX
269
270 xchg ax, si ; Coordinates to AX
271 inc ah ; Increment row
272 mov si, ax
273 call DisplayCursor_SetCoordinatesFromAX
274 dec bh ; Decrement rows left
275 jnz SHORT .ClearRowLoop
276
277 pop bx
278 pop cx
279 pop si
280 ret
281
282
283;--------------------------------------------------------------------
284; DisplayPrint_RepeatCharacterFromALwithCountInCX
285; Parameters:
286; AL: Character to display
287; CX: Repeat count
288; DS: BDA segment (zero)
289; ES:DI: Ptr to cursor location in video RAM
290; Returns:
291; DI: Updated offset to video RAM
292; Corrupts registers:
293; AX, DX
294;--------------------------------------------------------------------
295ALIGN JUMP_ALIGN
296DisplayPrint_RepeatCharacterFromALwithCountInCX:
297 jcxz .NothingToRepeat
298 push cx
299
300ALIGN JUMP_ALIGN
301.RepeatCharacter:
302 push ax
303 call DisplayPrint_CharacterFromAL
304 pop ax
305 loop .RepeatCharacter
306
307 pop cx
308.NothingToRepeat:
309 ret
310
311
312;--------------------------------------------------------------------
313; DisplayPrint_Newline
314; Parameters:
315; DS: BDA segment (zero)
316; ES:DI: Ptr to cursor location in video RAM
317; Returns:
318; DI: Updated offset to video RAM
319; Corrupts registers:
320; AX, DX
321;--------------------------------------------------------------------
322ALIGN JUMP_ALIGN
323DisplayPrint_Newline:
324 mov al, CR
325 call DisplayPrint_CharacterFromAL
326 mov al, LF
327 ; Fall to DisplayPrint_CharacterFromAL
328
329
330;--------------------------------------------------------------------
331; DisplayPrint_CharacterFromAL
332; Parameters:
333; AL: Character to display
334; DS: BDA segment (zero)
335; ES:DI: Ptr to cursor location in video RAM
336; Returns:
337; DI: Updated offset to video RAM
338; Corrupts registers:
339; AX, DX
340;--------------------------------------------------------------------
341ALIGN JUMP_ALIGN
342DisplayPrint_CharacterFromAL:
343 mov ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
344 jmp [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut]
Note: See TracBrowser for help on using the repository browser.