source: xtideuniversalbios/trunk/Assembly_Library/Src/Menu/CharOutLineSplitter.asm@ 524

Last change on this file since 524 was 505, checked in by krille_n_@…, 12 years ago

Changes:

  • Reverted the changes to MenuEvents.inc done in r492 since they broke the F1 key function in XTIDECFG.
  • Added a tail-call optimized variant of the CALL_DISPLAY_LIBRARY macro (JMP_DISPLAY_LIBRARY).
  • Put a block size limit in AH1Eh_ChangeXTCFmodeBasedOnControlRegisterInAL. I think it's needed but if not, it's easy to remove.
  • Other optimizations and fixes.
File size: 5.5 KB
Line 
1; Project name : Assembly Library
2; Description : Functions for splitting menu lines during character output.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
12;
13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20
21; Section containing code
22SECTION .text
23
24;--------------------------------------------------------------------
25; CharOutLineSplitter_PrepareForPrintingTextLines
26; Parameters:
27; SS:BP: Ptr to MENU
28; Returns:
29; Nothing
30; Corrupts registers:
31; AX, DX, DI
32;--------------------------------------------------------------------
33ALIGN MENU_JUMP_ALIGN
34CharOutLineSplitter_PrepareForPrintingTextLines:
35 ; Get first text line column offset to DX
36 call CharOutLineSplitter_GetFirstBorderLineColumnOffsetToAX
37 add al, MENU_TEXT_COLUMN_OFFSET<<1
38 xchg dx, ax
39
40 ; Get last text line column offset to AX
41 call MenuLocation_GetMaxTextLineLengthToAX
42 eSHL_IM ax, 1 ; Characters to BYTEs
43 add ax, dx
44
45 xchg ax, dx ; AL = First text line column offset
46 mov ah, dl ; AH = Last text line column offset
47 JMP_DISPLAY_LIBRARY SetCharacterOutputParameterFromAX
48
49
50;--------------------------------------------------------------------
51; CharOutLineSplitter_GetFirstBorderLineColumnOffsetToAX
52; Parameters:
53; SS:BP: Ptr to MENU
54; Returns:
55; AX: Offset to end of text line (first border area character)
56; Corrupts registers:
57; Nothing
58;--------------------------------------------------------------------
59ALIGN MENU_JUMP_ALIGN
60CharOutLineSplitter_GetFirstBorderLineColumnOffsetToAX:
61 call MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
62 xor ah, ah
63 eSHL_IM ax, 1
64 ret
65
66
67;--------------------------------------------------------------------
68; CharOutLineSplitter_IsCursorAtTheEndOfTextLine
69; Parameters:
70; DS: BDA segment (zero)
71; ES:DI: Ptr to cursor location in video memory
72; Returns:
73; CF: Set if end of text line
74; Clear if more characters fit on current text line
75; Corrupts registers:
76; DX
77;--------------------------------------------------------------------
78ALIGN MENU_JUMP_ALIGN
79CharOutLineSplitter_IsCursorAtTheEndOfTextLine:
80 push ax
81
82 mov dl, [VIDEO_BDA.wColumns]
83 eSHL_IM dl, 1 ; DX = bytes per row
84 mov ax, di
85 div dl ; AL = row index, AH = column index
86 cmp [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam+1], ah
87
88 pop ax
89 ret
90
91
92;--------------------------------------------------------------------
93; CharOutLineSplitter_MovePartialWordToNewTextLine
94; Parameters:
95; AL: Character to output
96; AH: Attribute to output
97; DS: BDA segment (zero)
98; ES:DI: Ptr to end of text line in video memory
99; Returns:
100; DI: Updated to next character for new text line
101; Corrupts registers:
102; AX, DX
103;--------------------------------------------------------------------
104ALIGN MENU_JUMP_ALIGN
105CharOutLineSplitter_MovePartialWordToNewTextLine:
106 push si
107 push cx
108 push ax
109 ; Fall to .GetOffsetToPartialWordToSIandSizeToCX
110
111;--------------------------------------------------------------------
112; .GetOffsetToPartialWordToSIandSizeToCX
113; Parameters:
114; ES:DI: Ptr to space before border character
115; Returns:
116; CX: Number of bytes that needs to be moved
117; ES:SI: Ptr to beginning of partial word that needs to be moved to new line
118; Corrupts registers:
119; Nothing
120;--------------------------------------------------------------------
121.GetOffsetToPartialWordToSIandSizeToCX:
122 mov cx, di
123 mov si, di
124ALIGN MENU_JUMP_ALIGN
125.ScanNextCharacter: ; Space will always be found since one comes after border
126 dec si
127 dec si
128 cmp BYTE [es:si], ' '
129 jne SHORT .ScanNextCharacter
130 inc si
131 inc si ; SI now points one past space
132 sub cx, si
133 ; Fall to .ChangeLine
134
135;--------------------------------------------------------------------
136; .ChangeLine
137; Parameters:
138; Nothing
139; Returns:
140; Nothing
141; Corrupts registers:
142; AX, DX
143;--------------------------------------------------------------------
144.ChangeLine:
145 call MenuCharOut_PrintLFCRandAdjustOffsetForStartOfLine
146 jcxz .ReturnFromMovePartialWordToNewTextLine
147 ; Fall to .MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX
148
149;--------------------------------------------------------------------
150; .MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX
151; Parameters:
152; CX: Number of BYTEs in partial word
153; DS: BDA segment (zero)
154; ES:SI: Ptr to partial word on previous line
155; ES:DI: Ptr to new empty line
156; Returns:
157; ES:DI: Ptr where to store next character
158; Corrupts registers:
159; AX, CX, DX, SI
160;--------------------------------------------------------------------
161.MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX:
162 push si
163 push cx
164 WAIT_RETRACE_IF_NECESSARY_THEN rep movsb
165 pop cx
166 pop si
167
168 xchg di, si
169 shr cx, 1 ; Bytes to characters
170 mov al, ' '
171 call DisplayPrint_RepeatCharacterFromALwithCountInCX
172 mov di, si
173
174.ReturnFromMovePartialWordToNewTextLine:
175 pop ax
176 pop cx
177 pop si
178 ret
Note: See TracBrowser for help on using the repository browser.