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

Last change on this file since 48 was 48, checked in by aitotat, 14 years ago

Changes to Assembly Library:
Added functions to clear Menu Title and Information areas.
Implemented automatic line change when writing Menu Title and Information areas.
CGA snow related functions have been moved to CgaSnow.asm.
Keyboard input functions no longer produce beep for backspace.

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   :   8.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, ' '
83    je      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.