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

Last change on this file since 51 was 51, checked in by aitotat, 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.