source: xtideuniversalbios/trunk/Assembly_Library/Src/Display/DisplayFormat.asm@ 85

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

Changes to Assembly Library:
Added functions to clear Menu Title and Information areas.
Implemented automatic line change when writing Menu Title and Information areas.
CGA snow related functions have been moved to CgaSnow.asm.
Keyboard input functions no longer produce beep for backspace.

File size: 10.5 KB
Line 
1; File name : DisplayFormat.asm
2; Project name : Assembly Library
3; Created date : 29.6.2010
4; Last update : 8.10.2010
5; Author : Tomi Tilli
6; Description : Functions for displaying formatted strings.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; DisplayFormat_ParseCharacters
13; Parameters:
14; DS: BDA segment (zero)
15; SS:BP: Pointer to first format parameter (-=2 updates to next parameter)
16; CS:SI: Pointer to string to format
17; ES:DI: Ptr to cursor location in video RAM
18; Returns:
19; CS:SI: Ptr to end of format string (ptr to one past NULL)
20; DI: Updated offset to video RAM
21; Corrupts registers:
22; AX, BX, CX, DX, BP
23;--------------------------------------------------------------------
24ALIGN JUMP_ALIGN
25DisplayFormat_ParseCharacters:
26 call ReadCharacterAndTestForNull
27 jz SHORT .QuitCharacterParsing
28
29 ePUSH_T cx, DisplayFormat_ParseCharacters ; Return address
30 xor cx, cx ; Initial placeholder size
31 cmp al, '%' ; Format specifier?
32 je SHORT ParseFormatSpecifier
33 jmp DisplayPrint_CharacterFromAL
34
35ALIGN JUMP_ALIGN
36.QuitCharacterParsing:
37 ret
38
39
40;--------------------------------------------------------------------
41; ParseFormatSpecifier
42; Parameters:
43; CX: Placeholder size
44; DS: BDA segment (zero)
45; SS:BP: Pointer to first format parameter (-=2 for next parameter)
46; CS:SI: Pointer to string to format
47; ES:DI: Ptr to cursor location in video RAM
48; Returns:
49; SI: Updated to first unparsed character
50; DI: Updated offset to video RAM
51; BP: Updated to next format parameter
52; Corrupts registers:
53; AX, BX, CX, DX
54;--------------------------------------------------------------------
55ALIGN JUMP_ALIGN
56ParseFormatSpecifier:
57 call ReadCharacterAndTestForNull
58 call Char_IsDecimalDigitInAL
59 jc SHORT .ParsePlaceholderSizeDigitFromALtoCX
60 call GetFormatSpecifierParserToAX
61 call ax ; Parser function
62 dec bp
63 dec bp ; SS:BP now points to next parameter
64 test cx, cx
65 jnz SHORT PrependOrAppendSpaces
66 ret
67
68;--------------------------------------------------------------------
69; .ParsePlaceholderSizeDigitFromALtoCX
70; Parameters:
71; AL: Digit character from format string
72; CX: Current placeholder size
73; DS: BDA segment (zero)
74; Returns:
75; CX: Current placeholder size
76; Jumps back to ParseFormatSpecifier
77; Corrupts registers:
78; AX
79;--------------------------------------------------------------------
80ALIGN JUMP_ALIGN
81.ParsePlaceholderSizeDigitFromALtoCX:
82 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition], di
83 sub al, '0' ; Digit '0'...'9' to integer 0...9
84 mov ah, cl ; Previous number parameter to AH
85 aad ; AL += (AH * 10)
86 mov cl, al ; Updated number parameter now in CX
87 jmp SHORT ParseFormatSpecifier
88
89
90;--------------------------------------------------------------------
91; ReadCharacterAndTestForNull
92; Parameters:
93; CS:SI: Pointer next character from string
94; Returns:
95; AL: Character from string
96; SI: Incremented to next character
97; ZF: Set if NULL, cleared if valid character
98; Corrupts registers:
99; Nothing
100;--------------------------------------------------------------------
101ALIGN JUMP_ALIGN
102ReadCharacterAndTestForNull:
103 eSEG cs
104 lodsb ; Load from CS:SI to AL
105 test al, al ; NULL to end string?
106 ret
107
108
109;--------------------------------------------------------------------
110; GetFormatSpecifierParserToAX
111; Parameters:
112; AL: Format specifier character
113; Returns:
114; AX: Offset to parser function
115; Corrupts registers:
116; AX, BX
117;--------------------------------------------------------------------
118ALIGN JUMP_ALIGN
119GetFormatSpecifierParserToAX:
120 mov bx, .rgcFormatCharToLookupIndex
121ALIGN JUMP_ALIGN
122.CheckForNextSpecifierParser:
123 cmp al, [cs:bx]
124 je SHORT .ConvertIndexToFunctionOffset
125 inc bx
126 cmp bx, .rgcFormatCharToLookupIndexEnd
127 jb SHORT .CheckForNextSpecifierParser
128 mov ax, c_FormatCharacter
129 ret
130ALIGN JUMP_ALIGN
131.ConvertIndexToFunctionOffset:
132 sub bx, .rgcFormatCharToLookupIndex
133 shl bx, 1 ; Shift for WORD lookup
134 mov ax, [cs:bx+.rgfnFormatSpecifierParser]
135 ret
136
137.rgcFormatCharToLookupIndex:
138 db "aAduxsSct-+%"
139.rgcFormatCharToLookupIndexEnd:
140ALIGN WORD_ALIGN
141.rgfnFormatSpecifierParser:
142 dw a_FormatAttributeForNextCharacter
143 dw A_FormatAttributeForRemainingString
144 dw d_FormatSignedDecimalWord
145 dw u_FormatUnsignedDecimalWord
146 dw x_FormatHexadecimalWord
147 dw s_FormatStringFromSegmentCS
148 dw S_FormatStringFromFarPointer
149 dw c_FormatCharacter
150 dw t_FormatRepeatCharacter
151 dw PrepareToPrependParameterWithSpaces
152 dw PrepareToAppendSpacesAfterParameter
153 dw percent_FormatPercent
154
155
156;--------------------------------------------------------------------
157; PrependOrAppendSpaces
158; Parameters:
159; CX: Minimum length for format specifier in characters
160; DS: BDA segment (zero)
161; ES:DI: Ptr to cursor location in video RAM
162; Returns:
163; Nothing
164; Corrupts registers:
165; AX, BX, CX, DX
166;--------------------------------------------------------------------
167ALIGN JUMP_ALIGN
168PrependOrAppendSpaces:
169 mov ax, di
170 sub ax, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition]
171 test cx, cx
172 js SHORT .PrependWithSpaces
173 ; Fall to .AppendSpaces
174
175;--------------------------------------------------------------------
176; .AppendSpaces
177; Parameters:
178; AX: Number of format parameter BYTEs printed
179; CX: Minimum length for format specifier in characters
180; DS: BDA segment (zero)
181; ES:DI: Ptr to cursor location in video RAM
182; Returns:
183; Nothing
184; Corrupts registers:
185; AX, CX, DX
186;--------------------------------------------------------------------
187.AppendSpaces:
188 call DisplayContext_GetCharacterOffsetToAXfromByteOffsetInAX
189 sub cx, ax
190 jle SHORT .NothingToAppendOrPrepend
191 mov al, ' '
192 jmp DisplayPrint_RepeatCharacterFromALwithCountInCX
193
194;--------------------------------------------------------------------
195; .PrependWithSpaces
196; Parameters:
197; AX: Number of format parameter BYTEs printed
198; CX: Negative minimum length for format specifier in characters
199; DS: BDA segment (zero)
200; ES:DI: Ptr to cursor location in video RAM
201; Returns:
202; Nothing
203; Corrupts registers:
204; AX, BX, CX, DX
205;--------------------------------------------------------------------
206ALIGN JUMP_ALIGN
207.PrependWithSpaces:
208 xchg ax, cx
209 neg ax
210 call DisplayContext_GetByteOffsetToAXfromCharacterOffsetInAX
211 sub ax, cx ; AX = BYTEs to prepend, CX = BYTEs to move
212 jle SHORT .NothingToAppendOrPrepend
213
214 std
215 push si
216
217 lea si, [di-1] ; SI = Offset to last byte formatted
218 add di, ax ; DI = Cursor location after preceeding completed
219 push di
220 dec di ; DI = Offset where to move last byte formatted
221 xchg bx, ax ; BX = BYTEs to prepend
222 call .ReverseCopyCXbytesFromESSItoESDI
223 xchg ax, bx
224 call .ReversePrintAXspacesStartingFromESDI
225
226 pop di
227 pop si
228 cld ; Restore DF
229.NothingToAppendOrPrepend:
230 ret
231
232;--------------------------------------------------------------------
233; .ReverseCopyCXbytesFromESSItoESDI
234; Parameters:
235; CX: Number of bytes to copy
236; DS: BDA segment (zero)
237; ES:SI: Ptr to old location
238; ES:DI: Ptr to new location
239; Returns:
240; DI: Updated to before last character copied
241; Corrupts registers:
242; AX, CX, DX, SI
243;--------------------------------------------------------------------
244ALIGN JUMP_ALIGN
245.ReverseCopyCXbytesFromESSItoESDI:
246 test BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], FLG_CONTEXT_ATTRIBUTES
247 jz SHORT .CopyWithoutDisplayProcessing
248
249 WAIT_RETRACE_IF_NECESSARY_THEN rep movsb
250 dec di ; Point to preceeding character instead of attribute
251 ret
252ALIGN JUMP_ALIGN
253.CopyWithoutDisplayProcessing:
254 eSEG_STR rep, es, movsb
255 ret
256
257;--------------------------------------------------------------------
258; .ReversePrintAXspacesStartingFromESDI
259; Parameters:
260; AX: Number of spaces to print
261; DS: BDA segment (zero)
262; ES:DI: Ptr to destination in video RAM
263; Returns:
264; DI: Updated
265; Corrupts registers:
266; AX, CX, DX
267ALIGN JUMP_ALIGN
268.ReversePrintAXspacesStartingFromESDI:
269 call DisplayContext_GetCharacterOffsetToAXfromByteOffsetInAX
270 xchg cx, ax ; CX = Spaces to prepend
271 mov al, ' '
272 jmp DisplayPrint_RepeatCharacterFromALwithCountInCX
273
274
275
276;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
277; Formatting functions
278; Parameters:
279; DS: BDA segment (zero)
280; SS:BP: Pointer to next format parameter (-=2 updates to next parameter)
281; ES:DI: Ptr to cursor location in video RAM
282; Returns:
283; SS:BP: Points to last WORD parameter used
284; Corrupts registers:
285; AX, BX, DX
286;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
287ALIGN JUMP_ALIGN
288a_FormatAttributeForNextCharacter:
289 mov bl, [bp]
290 xchg bl, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
291 push bx
292 push cx
293 push di
294 call DisplayFormat_ParseCharacters ; Recursive call
295 pop WORD [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fpCursorPosition]
296 pop cx
297 pop bx
298 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute], bl
299 ret
300
301ALIGN JUMP_ALIGN
302A_FormatAttributeForRemainingString:
303 mov al, [bp]
304 mov [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute], al
305 ret
306
307ALIGN JUMP_ALIGN
308d_FormatSignedDecimalWord:
309 mov ax, [bp]
310 mov bx, 10
311 jmp DisplayPrint_SignedWordFromAXWithBaseInBX
312
313ALIGN JUMP_ALIGN
314u_FormatUnsignedDecimalWord:
315 mov ax, [bp]
316 mov bx, 10
317 jmp DisplayPrint_WordFromAXWithBaseInBX
318
319ALIGN JUMP_ALIGN
320x_FormatHexadecimalWord:
321 mov ax, [bp]
322 mov bx, 16
323 call DisplayPrint_WordFromAXWithBaseInBX
324 mov al, 'h'
325 jmp DisplayPrint_CharacterFromAL
326
327ALIGN JUMP_ALIGN
328s_FormatStringFromSegmentCS:
329 xchg si, [bp]
330 call DisplayPrint_NullTerminatedStringFromCSSI
331 mov si, [bp]
332 ret
333
334ALIGN JUMP_ALIGN
335S_FormatStringFromFarPointer:
336 mov bx, [bp-2]
337 xchg si, [bp]
338 call DisplayPrint_NullTerminatedStringFromBXSI
339 mov si, [bp]
340 dec bp
341 dec bp
342 ret
343
344ALIGN JUMP_ALIGN
345c_FormatCharacter:
346 mov al, [bp]
347 jmp DisplayPrint_CharacterFromAL
348
349ALIGN JUMP_ALIGN
350t_FormatRepeatCharacter:
351 push cx
352 mov cx, [bp-2]
353 mov al, [bp]
354 call DisplayPrint_RepeatCharacterFromALwithCountInCX
355 pop cx
356 dec bp
357 dec bp
358 ret
359
360ALIGN JUMP_ALIGN
361percent_FormatPercent:
362 mov al, '%'
363 jmp DisplayPrint_CharacterFromAL
364
365ALIGN JUMP_ALIGN
366PrepareToPrependParameterWithSpaces:
367 neg cx
368 ; Fall to PrepareToAppendSpacesAfterParameter
369
370ALIGN JUMP_ALIGN
371PrepareToAppendSpacesAfterParameter:
372 add sp, BYTE 2 ; Remove return offset
373 jmp ParseFormatSpecifier
Note: See TracBrowser for help on using the repository browser.