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
Line 
1; File name : MenuCharOut.asm
2; Project name : Assembly Library
3; Created date : 15.7.2010
4; Last update : 10.10.2010
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:
31 call DisplayCharOut_BiosTeletypeOutput
32 xor ax, ax ; No offset, cursor to start of border
33 jmp SHORT SetCursorToNextMenuLine
34
35
36;--------------------------------------------------------------------
37; MenuCharOut_MenuTextTeletypeOutputWithAttributeAndAutomaticLineChange
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
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
62MenuCharOut_MenuTextTeletypeOutputWithAttribute:
63 cmp al, CR ; Carriage return?
64 je SHORT PrintCRfromALandAdjustColumnToMenuText
65 jmp DisplayCharOut_TeletypeOutputWithAttribute
66
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;--------------------------------------------------------------------
80ALIGN JUMP_ALIGN
81MovePartialWordToNewTextLineAndPrintCharacterFromAX:
82 cmp al, ' ' ; Space or any control character
83 jb SHORT .MoveCursorInDItoBeginningOfNextLine
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
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.