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

Last change on this file since 526 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
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-2013 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.