source: xtideuniversalbios/trunk/Assembly_Library/Src/Menu/MenuCharOut.asm@ 51

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

Changes to Assembly Library:
File handle is now properly returned when opening file.
Added function for getting file size by using file handle.

File size: 6.9 KB
RevLine 
[41]1; File name : MenuCharOut.asm
2; Project name : Assembly Library
3; Created date : 15.7.2010
[51]4; Last update : 10.10.2010
[41]5; Author : Tomi Tilli
6; Description : Character out function for printing withing menu window.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; MenuCharOut_MenuBorderTeletypeOutputWithAttribute
13; Parameters:
14; AL: Character to output
15; AH: Attribute to output
16; DS: BDA segment (zero)
17; ES:DI: Ptr to video memory where to output
18; Returns:
19; DI: Incremented for next character
20; Corrupts registers:
21; AX, DX
22;--------------------------------------------------------------------
23ALIGN JUMP_ALIGN
24MenuCharOut_MenuBorderTeletypeOutputWithAttribute:
25 cmp al, CR ; Carriage return?
26 je SHORT .PrintCRandAdjustColumnToMenuBorders
27 jmp DisplayCharOut_TeletypeOutputWithAttribute
28
29ALIGN JUMP_ALIGN
30.PrintCRandAdjustColumnToMenuBorders:
[48]31 call DisplayCharOut_BiosTeletypeOutput
[41]32 xor ax, ax ; No offset, cursor to start of border
33 jmp SHORT SetCursorToNextMenuLine
34
35
36;--------------------------------------------------------------------
[48]37; MenuCharOut_MenuTextTeletypeOutputWithAttributeAndAutomaticLineChange
[41]38; MenuCharOut_MenuTextTeletypeOutputWithAttribute
39; Parameters:
40; AL: Character to output
41; AH: Attribute to output
42; DS: BDA segment (zero)
43; ES:DI: Ptr to video memory where to output
44; Returns:
45; DI: Incremented for next character
46; Corrupts registers:
47; AX, DX
48;--------------------------------------------------------------------
49ALIGN JUMP_ALIGN
[48]50MenuCharOut_MenuTextTeletypeOutputWithAttributeAndAutomaticLineChange:
51 push di
52 push ax
53 mov al, DOUBLE_VERTICAL
54 add di, BYTE MENU_TEXT_COLUMN_OFFSET ; Border char comes after space
55 WAIT_RETRACE_IF_NECESSARY_THEN scasb
56 pop ax
57 pop di
58 je SHORT MovePartialWordToNewTextLineAndPrintCharacterFromAX
59 ; Fall to MenuCharOut_MenuTextTeletypeOutputWithAttribute
60
61ALIGN JUMP_ALIGN
[41]62MenuCharOut_MenuTextTeletypeOutputWithAttribute:
63 cmp al, CR ; Carriage return?
[48]64 je SHORT PrintCRfromALandAdjustColumnToMenuText
[41]65 jmp DisplayCharOut_TeletypeOutputWithAttribute
66
[48]67
68;--------------------------------------------------------------------
69; MovePartialWordToNewTextLineAndPrintCharacterFromAX
70; Parameters:
71; AL: Character to output
72; AH: Attribute to output
73; DS: BDA segment (zero)
74; ES:DI: Ptr to end of text line in video memory
75; Returns:
76; DI: Incremented for next character
77; Corrupts registers:
78; AX, DX
79;--------------------------------------------------------------------
[41]80ALIGN JUMP_ALIGN
[48]81MovePartialWordToNewTextLineAndPrintCharacterFromAX:
[51]82 cmp al, ' ' ; Space or any control character
83 jb SHORT .MoveCursorInDItoBeginningOfNextLine
[48]84 push si
85 push cx
86 push ax
87
88 call .GetOffsetToPartialWordToSIandSizeToCX
89 call .MoveCursorInDItoBeginningOfNextLine
90 jcxz .NothingToMove
91 call .MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX
92.NothingToMove:
93 pop ax
94 pop cx
95 pop si
96 jmp DisplayCharOut_TeletypeOutputWithAttribute
97
98;--------------------------------------------------------------------
99; .GetOffsetToPartialWordToSIandSizeToCX
100; Parameters:
101; ES:DI: Ptr to space before border character
102; Returns:
103; CX: Number of bytes that needs to be moved
104; ES:SI: Ptr to beginning of partial word that needs to be moved to new line
105; Corrupts registers:
106; Nothing
107;--------------------------------------------------------------------
108ALIGN JUMP_ALIGN
109.GetOffsetToPartialWordToSIandSizeToCX:
110 xor cx, cx
111 mov si, di
112ALIGN JUMP_ALIGN
113.ScanNextCharacter: ; Space will always be found since one comes after border
114 dec si
115 dec si
116 cmp BYTE [es:si], ' '
117 je SHORT .PartialWordFound
118 inc cx
119 jmp SHORT .ScanNextCharacter
120ALIGN JUMP_ALIGN
121.PartialWordFound:
122 inc si
123 inc si ; SI now points one past space
124 shl cx, 1 ; Characters to bytes
125 ret
126
127;--------------------------------------------------------------------
128; .MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX
129; Parameters:
130; CX: Number of bytes in partial word
131; DS: BDA segment (zero)
132; ES:SI: Ptr to partial word on previous line
133; ES:DI: Ptr to new empty line
134; Returns:
135; ES:DI: Ptr where to store next character
136; Corrupts registers:
137; AX, CX, DX, SI
138;--------------------------------------------------------------------
139ALIGN JUMP_ALIGN
140.MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX:
141 push si
142 push cx
143 WAIT_RETRACE_IF_NECESSARY_THEN rep movsb
144 pop cx
145 pop si
146 xchg di, si
147 shr cx, 1 ; Bytes to characters
148 mov al, ' '
149 call DisplayPrint_RepeatCharacterFromALwithCountInCX
150 mov di, si
151 ret
152
153;--------------------------------------------------------------------
154; .MoveCursorInDItoBeginningOfNextLine
155; Parameters:
156; DS: BDA segment (zero)
157; ES:DI: Ptr to cursor location
158; Returns:
159; ES:DI: Ptr to beginning of new line
160; Corrupts registers:
161; AX, DX
162;--------------------------------------------------------------------
163ALIGN JUMP_ALIGN
164.MoveCursorInDItoBeginningOfNextLine:
165 mov al, LF
166 call DisplayCharOut_BiosTeletypeOutput
167 mov al, CR
168 ; Fall to PrintCRfromALandAdjustColumnToMenuText
169
170
171;--------------------------------------------------------------------
172; PrintCRfromALandAdjustColumnToMenuText
173; Parameters:
174; AL: Character to output (CR)
175; DS: BDA segment (zero)
176; ES:DI: Ptr to video memory where to output
177; Returns:
178; DI: Incremented for next text line
179; Corrupts registers:
180; AX, DX
181;--------------------------------------------------------------------
182ALIGN JUMP_ALIGN
183PrintCRfromALandAdjustColumnToMenuText:
184 call DisplayCharOut_BiosTeletypeOutput
[41]185 mov al, MENU_TEXT_COLUMN_OFFSET ; Offset to start of text
186 ; Fall to SetCursorToNextMenuLine
187
188;--------------------------------------------------------------------
189; SetCursorToNextMenuLine
190; Parameters:
191; AL: Column offset from start of borders
192; DS: BDA segment (zero)
193; ES:DI: Ptr to video memory where to output
194; Returns:
195; DI: Adjusted for next line
196; Corrupts registers:
197; AX, DX
198;--------------------------------------------------------------------
199ALIGN JUMP_ALIGN
200SetCursorToNextMenuLine:
201 push bp
202
203 mov bp, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam]
204 call .AddCoordinatesForNewBorderLineToAX
205 call DisplayCursor_SetCoordinatesFromAX ; Updates DI
206
207 pop bp
208 ret
209
210;--------------------------------------------------------------------
211; .AddCoordinatesForNewBorderLineToAX
212; Parameters:
213; AL: Column offset from start of borders
214; DS: BDA segment (zero)
215; SS:BP: Ptr to MENU
216; Returns:
217; AX: Coordinates for new line
218; Corrupts registers:
219; DX
220;--------------------------------------------------------------------
221ALIGN JUMP_ALIGN
222.AddCoordinatesForNewBorderLineToAX:
223 call MenuLocation_AddTitleBordersTopLeftCoordinatesToAX
224 push ax
225 call DisplayCursor_GetSoftwareCoordinatesToAX
226 pop dx
227 mov al, dl ; Adjust column to borders
228 ret
Note: See TracBrowser for help on using the repository browser.