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
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.