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

Last change on this file since 280 was 181, checked in by krille_n_@…, 13 years ago

Changes to all parts of the project:

  • Size optimizations.
  • Added a define (EXCLUDE_FROM_XTIDECFG) to exclude unused library code from XTIDECFG.
  • Tried to minimize time spent with interrupts disabled.
  • Some minor attempts to improve speed (reordering instructions etc).
  • Tried to improve readability, did some cleanup and fixed some errors in comments.
File size: 4.8 KB
Line 
1; Project name : Assembly Library
2; Description : Functions for splitting menu lines during character output.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; CharOutLineSplitter_PrepareForPrintingTextLines
9; Parameters:
10; SS:BP: Ptr to MENU
11; Returns:
12; Nothing
13; Corrupts registers:
14; AX, DX, DI
15;--------------------------------------------------------------------
16ALIGN JUMP_ALIGN
17CharOutLineSplitter_PrepareForPrintingTextLines:
18 ; Get first text line column offset to DX
19 call CharOutLineSplitter_GetFirstBorderLineColumnOffsetToAX
20 add al, MENU_TEXT_COLUMN_OFFSET<<1
21 xchg dx, ax
22
23 ; Get last text line column offset to AX
24 call MenuLocation_GetMaxTextLineLengthToAX
25 shl ax, 1 ; Characters to BYTEs
26 add ax, dx
27
28 xchg ax, dx ; AL = First text line column offset
29 mov ah, dl ; AH = Last text line column offset
30 CALL_DISPLAY_LIBRARY SetCharacterOutputParameterFromAX
31 ret
32
33
34;--------------------------------------------------------------------
35; CharOutLineSplitter_GetFirstBorderLineColumnOffsetToAX
36; Parameters:
37; SS:BP: Ptr to MENU
38; Returns:
39; AX: Offset to end of text line (first border area character)
40; Corrupts registers:
41; Nothing
42;--------------------------------------------------------------------
43ALIGN JUMP_ALIGN
44CharOutLineSplitter_GetFirstBorderLineColumnOffsetToAX:
45 call MenuLocation_GetTitleBordersTopLeftCoordinatesToAX
46 xor ah, ah
47 shl ax, 1
48 ret
49
50
51;--------------------------------------------------------------------
52; CharOutLineSplitter_IsCursorAtTheEndOfTextLine
53; Parameters:
54; DS: BDA segment (zero)
55; ES:DI: Ptr to cursor location in video memory
56; Returns:
57; CF: Set if end of text line
58; Clear if more characters fit on current text line
59; Corrupts registers:
60; DX
61;--------------------------------------------------------------------
62ALIGN JUMP_ALIGN
63CharOutLineSplitter_IsCursorAtTheEndOfTextLine:
64 push ax
65
66 mov dl, [VIDEO_BDA.wColumns]
67 shl dl, 1 ; DX = bytes per row
68 mov ax, di
69 div dl ; AL = row index, AH = column index
70 cmp [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam+1], ah
71
72 pop ax
73 ret
74
75
76;--------------------------------------------------------------------
77; CharOutLineSplitter_MovePartialWordToNewTextLine
78; Parameters:
79; AL: Character to output
80; AH: Attribute to output
81; DS: BDA segment (zero)
82; ES:DI: Ptr to end of text line in video memory
83; Returns:
84; DI: Updated to next character for new text line
85; Corrupts registers:
86; AX, DX
87;--------------------------------------------------------------------
88ALIGN JUMP_ALIGN
89CharOutLineSplitter_MovePartialWordToNewTextLine:
90 push si
91 push cx
92 push ax
93 ; Fall to .GetOffsetToPartialWordToSIandSizeToCX
94
95;--------------------------------------------------------------------
96; .GetOffsetToPartialWordToSIandSizeToCX
97; Parameters:
98; ES:DI: Ptr to space before border character
99; Returns:
100; CX: Number of bytes that needs to be moved
101; ES:SI: Ptr to beginning of partial word that needs to be moved to new line
102; Corrupts registers:
103; Nothing
104;--------------------------------------------------------------------
105.GetOffsetToPartialWordToSIandSizeToCX:
106 mov cx, di
107 mov si, di
108ALIGN JUMP_ALIGN
109.ScanNextCharacter: ; Space will always be found since one comes after border
110 dec si
111 dec si
112 cmp BYTE [es:si], ' '
113 jne SHORT .ScanNextCharacter
114 inc si
115 inc si ; SI now points one past space
116 sub cx, si
117 ; Fall to .ChangeLine
118
119;--------------------------------------------------------------------
120; .ChangeLine
121; Parameters:
122; Nothing
123; Returns:
124; Nothing
125; Corrupts registers:
126; AX, DX
127;--------------------------------------------------------------------
128.ChangeLine:
129 call MenuCharOut_PrintLFCRandAdjustOffsetForStartOfLine
130 jcxz .ReturnFromMovePartialWordToNewTextLine
131 ; Fall to .MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX
132
133;--------------------------------------------------------------------
134; .MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX
135; Parameters:
136; CX: Number of BYTEs in partial word
137; DS: BDA segment (zero)
138; ES:SI: Ptr to partial word on previous line
139; ES:DI: Ptr to new empty line
140; Returns:
141; ES:DI: Ptr where to store next character
142; Corrupts registers:
143; AX, CX, DX, SI
144;--------------------------------------------------------------------
145.MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX:
146 push si
147 push cx
148 WAIT_RETRACE_IF_NECESSARY_THEN rep movsb
149 pop cx
150 pop si
151
152 xchg di, si
153 shr cx, 1 ; Bytes to characters
154 mov al, ' '
155 call DisplayPrint_RepeatCharacterFromALwithCountInCX
156 mov di, si
157
158.ReturnFromMovePartialWordToNewTextLine:
159 pop ax
160 pop cx
161 pop si
162 ret
Note: See TracBrowser for help on using the repository browser.