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

Last change on this file since 237 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
RevLine 
[41]1; Project name : Assembly Library
2; Description : Functions for display output.
3
4; Section containing code
5SECTION .text
6
[223]7
[41]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.
[48]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.
[162]28;
[41]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
[186]64
[41]65 ret
66
67
68;--------------------------------------------------------------------
[44]69; DisplayPrint_SignedWordFromAXWithBaseInBX
[41]70; Parameters:
71; AX: Word to display
[44]72; BX: Integer base (binary=2, octal=8, decimal=10, hexadecimal=16)
[41]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;--------------------------------------------------------------------
[134]80%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[41]81ALIGN JUMP_ALIGN
[44]82DisplayPrint_SignedWordFromAXWithBaseInBX:
83 test ax, ax
84 jns SHORT DisplayPrint_WordFromAXWithBaseInBX
[41]85
86 push ax
87 mov al, '-'
88 call DisplayPrint_CharacterFromAL
89 pop ax
90 neg ax
[44]91 ; Fall to DisplayPrint_WordFromAXWithBaseInBX
[134]92%endif
[41]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;--------------------------------------------------------------------
[223]106
[186]107%ifndef MODULE_STRINGS_COMPRESSED
[223]108
[41]109ALIGN JUMP_ALIGN
110DisplayPrint_WordFromAXWithBaseInBX:
111 push cx
[44]112 push bx
[41]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
[44]123
124 mov bx, .rgcDigitToCharacter
[41]125ALIGN JUMP_ALIGN
[44]126.PrintNextDigit:
127 pop ax ; Pop digit
[223]128 cs xlatb
[41]129 call DisplayPrint_CharacterFromAL
[44]130 loop .PrintNextDigit
[41]131
[44]132 pop bx
[41]133 pop cx
134 ret
135.rgcDigitToCharacter: db "0123456789ABCDEF"
[186]136
137%endif ; MODULE_STRINGS_COMPRESSED
[41]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;--------------------------------------------------------------------
[223]152%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[41]153ALIGN JUMP_ALIGN
154DisplayPrint_CharacterBufferFromBXSIwithLengthInCX:
[44]155 jcxz .NothingToPrintSinceZeroLength
156 push si
[41]157 push cx
158
159ALIGN JUMP_ALIGN
[44]160.PrintNextCharacter:
161 mov ds, bx
162 lodsb
163 LOAD_BDA_SEGMENT_TO ds, dx
164 call DisplayPrint_CharacterFromAL
165 loop .PrintNextCharacter
166
[41]167 pop cx
[44]168 pop si
169.NothingToPrintSinceZeroLength:
[41]170 ret
[194]171%endif
[41]172
[186]173
[41]174;--------------------------------------------------------------------
[67]175; DisplayPrint_ClearScreenWithCharInALandAttributeInAH
[41]176; Parameters:
[67]177; AL: Character to clear with
178; AH: Attribute to clear with
[41]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
[67]187DisplayPrint_ClearScreenWithCharInALandAttributeInAH:
[41]188 push di
[67]189 push cx
190
191 xchg cx, ax
[41]192 xor ax, ax
[67]193 call DisplayCursor_SetCoordinatesFromAX ; Updates DI
[41]194 call DisplayPage_GetColumnsToALandRowsToAH
[67]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
[41]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:
[42]213; DI: Updated offset to video RAM
[41]214; Corrupts registers:
215; AX, DX
216;--------------------------------------------------------------------
[134]217%ifndef EXCLUDE_FROM_XTIDE_UNIVERSAL_BIOS
[41]218ALIGN JUMP_ALIGN
219DisplayPrint_ClearAreaWithHeightInAHandWidthInAL:
[42]220 push si
[41]221 push cx
222 push bx
223
[42]224 xchg bx, ax ; Area size to BX
[41]225 call DisplayCursor_GetSoftwareCoordinatesToAX
[42]226 xchg si, ax ; Software (Y,X) coordinates now in SI
227 xor cx, cx
[41]228
229ALIGN JUMP_ALIGN
[42]230.ClearRowLoop:
231 mov cl, bl ; Area width now in CX
[44]232 mov al, SCREEN_BACKGROUND_CHARACTER
[42]233 call DisplayPrint_RepeatCharacterFromALwithCountInCX
[41]234
[42]235 xchg ax, si ; Coordinates to AX
236 inc ah ; Increment row
237 mov si, ax
[41]238 call DisplayCursor_SetCoordinatesFromAX
[42]239 dec bh ; Decrement rows left
240 jnz SHORT .ClearRowLoop
[41]241
242 pop bx
243 pop cx
[42]244 pop si
[41]245 ret
[134]246%endif
[42]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:
[181]259; DX
[42]260;--------------------------------------------------------------------
261ALIGN JUMP_ALIGN
262DisplayPrint_RepeatCharacterFromALwithCountInCX:
[44]263 jcxz .NothingToRepeat
264 push cx
265
266ALIGN JUMP_ALIGN
267.RepeatCharacter:
[42]268 push ax
269 call DisplayPrint_CharacterFromAL
270 pop ax
[44]271 loop .RepeatCharacter
272
273 pop cx
274.NothingToRepeat:
[42]275 ret
[223]276
[186]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.
[223]293;;;
[186]294ALIGN JUMP_ALIGN
295DisplayPrint_NullTerminatedStringFromCSSI:
296 push bx
297 mov bx, cs
298 call DisplayPrint_NullTerminatedStringFromBXSI
299 pop bx
300 ret
301%endif
[42]302
303
[186]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)
[223]307;;;
[186]308
[42]309;--------------------------------------------------------------------
[44]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;--------------------------------------------------------------------
[186]319%ifdef MODULE_STRINGS_COMPRESSED
[44]320ALIGN JUMP_ALIGN
[186]321DisplayPrint_Newline_FormatAdjustBP:
[223]322 inc bp ; we didn't need a parameter after all, readjust BP
[186]323 inc bp
[194]324 ; fall through to DisplayPrint_Newline
[186]325%endif
326
[223]327ALIGN JUMP_ALIGN
[44]328DisplayPrint_Newline:
[52]329 mov al, LF
330 call DisplayPrint_CharacterFromAL
[44]331 mov al, CR
332 ; Fall to DisplayPrint_CharacterFromAL
333
334;--------------------------------------------------------------------
[42]335; DisplayPrint_CharacterFromAL
336; Parameters:
337; AL: Character to display
[186]338; Zero value is ignored (no characer is printed)
[42]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:
[186]348%ifdef MODULE_STRINGS_COMPRESSED
349 test al,al
350 jz DisplayPrint_Ret
351%endif
[42]352 mov ah, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bAttribute]
353 jmp [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.fnCharOut]
[186]354
[223]355
[186]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
[223]387
388DisplayPrint_Ret: ; random ret to jump to
[186]389 ret
390
Note: See TracBrowser for help on using the repository browser.