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

Last change on this file since 538 was 526, checked in by krille_n_@…, 11 years ago

Changes:

  • Update of the copyright notices to include the year 2013.
File size: 5.5 KB
RevLine 
[52]1; Project name : Assembly Library
2; Description : Functions for splitting menu lines during character output.
3
[376]4;
[445]5; XTIDE Universal BIOS and Associated Tools
[526]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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.
[445]12;
[376]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
[445]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
[445]20
[52]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;--------------------------------------------------------------------
[369]33ALIGN MENU_JUMP_ALIGN
[52]34CharOutLineSplitter_PrepareForPrintingTextLines:
[104]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
[52]39
[104]40 ; Get last text line column offset to AX
[52]41 call MenuLocation_GetMaxTextLineLengthToAX
[445]42 eSHL_IM ax, 1 ; Characters to BYTEs
[104]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
[505]47 JMP_DISPLAY_LIBRARY SetCharacterOutputParameterFromAX
[52]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;--------------------------------------------------------------------
[369]59ALIGN MENU_JUMP_ALIGN
[52]60CharOutLineSplitter_GetFirstBorderLineColumnOffsetToAX:
61 call MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
62 xor ah, ah
[445]63 eSHL_IM ax, 1
[52]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;--------------------------------------------------------------------
[369]78ALIGN MENU_JUMP_ALIGN
[52]79CharOutLineSplitter_IsCursorAtTheEndOfTextLine:
80 push ax
81
82 mov dl, [VIDEO_BDA.wColumns]
[445]83 eSHL_IM dl, 1 ; DX = bytes per row
[52]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;--------------------------------------------------------------------
[369]104ALIGN MENU_JUMP_ALIGN
[52]105CharOutLineSplitter_MovePartialWordToNewTextLine:
106 push si
107 push cx
108 push ax
[104]109 ; Fall to .GetOffsetToPartialWordToSIandSizeToCX
[52]110
111;--------------------------------------------------------------------
[104]112; .GetOffsetToPartialWordToSIandSizeToCX
[52]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;--------------------------------------------------------------------
[104]121.GetOffsetToPartialWordToSIandSizeToCX:
[181]122 mov cx, di
[52]123 mov si, di
[369]124ALIGN MENU_JUMP_ALIGN
[52]125.ScanNextCharacter: ; Space will always be found since one comes after border
126 dec si
127 dec si
128 cmp BYTE [es:si], ' '
[181]129 jne SHORT .ScanNextCharacter
[52]130 inc si
131 inc si ; SI now points one past space
[181]132 sub cx, si
[104]133 ; Fall to .ChangeLine
[52]134
[104]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
[52]148
149;--------------------------------------------------------------------
[104]150; .MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX
[52]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;--------------------------------------------------------------------
[104]161.MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX:
[52]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
[104]173
174.ReturnFromMovePartialWordToNewTextLine:
175 pop ax
176 pop cx
177 pop si
[52]178 ret
Note: See TracBrowser for help on using the repository browser.