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

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

Changes:

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