source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Libraries/menu/menucrsr.asm@ 88

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

Size optimizations in various files in the XTIDE BIOS.
Also added a new include file for generic macros (macros.inc).

File size: 7.2 KB
RevLine 
[3]1; Project name : Menu library
2; Description : ASM library to menu system.
3; Contains menu cursor functions.
4
5;--------------- Equates -----------------------------
6
7W_OFF_CRSR_STR EQU 0102h ; User string cursor offset
8
9
10;-------------- Private global variables -------------
11; Section containing initialized data
12;SECTION .data
13
14
15;-------------- Public functions ---------------------
16; Section containing code
17SECTION .text
18
19;--------------------------------------------------------------------
20; Returns X and Y coordinates for menu top left corner.
21; This function is used for calculating initial coordinates when
22; initializing menu for first time.
23; Parameters:
24; SS:BP: Ptr to MENUVARS
25; Returns:
26; DL: X coordinate for centered menu
27; DH: Y coordinate for centered menu
28; Corrupts registers:
29; AX, BX
30;--------------------------------------------------------------------
31ALIGN JUMP_ALIGN
32MenuCrsr_GetCenter:
33 mov ah, 0Fh ; Get Current Video Mode
34 int 10h
35 mov dl, ah ; Copy column count to DL
36 sub dl, [bp+MENUVARS.bWidth] ; Subtract menu width from columns
37 shr dl, 1 ; Divide by 2 for start X
38 mov dh, CNT_SCRN_ROW ; Load row count
39 sub dh, [bp+MENUVARS.bHeight] ; Subtract menu height from rows
40 shr dh, 1 ; Divide by 2 for start y
41 ret
42
43
44;--------------------------------------------------------------------
45; Sets cursor to start of menu string.
46; MenuCrsr_Point1stItem Sets cursor to first menuitem string
47; MenuCrsr_PointInfo Sets cursor to info string
48; MenuCrsr_PointTitle Sets cursor to title string
49; Parameters:
50; SS:BP: Ptr to MENUVARS
51; Returns:
52; Nothing
53; Corrupts registers:
54; AX, BX, CX, DX
55;--------------------------------------------------------------------
56ALIGN JUMP_ALIGN
57MenuCrsr_Point1stItem:
58 xor dx, dx ; Zero DX
59 call MenuCrsr_PointItemBrdr ; Point to item border (left)
60 mov cx, W_OFF_CRSR_STR & 0FFh ; Offset to user string (move X only)
61 jmp MenuCrsr_Move ; Move cursor
62ALIGN JUMP_ALIGN
63MenuCrsr_PointInfo:
64 xor dx, dx ; Zero DX
65 call MenuCrsr_PointNfoBrdr ; Point to Info border (top left)
66 mov cx, W_OFF_CRSR_STR ; Movement from border to user str
67 jmp MenuCrsr_Move ; Move cursor
68ALIGN JUMP_ALIGN
69MenuCrsr_PointTitle:
70 xor dx, dx ; Zero DX
71 call MenuCrsr_PointTitleBrdr ; Point to Title border (top left)
72 mov cx, W_OFF_CRSR_STR ; Movement from border to user str
73 jmp MenuCrsr_Move ; Move cursor
74
75
76;--------------------------------------------------------------------
77; Sets cursor to start of wanted menuitem string.
78;
79; MenuCrsr_PointNthItem
80; Parameters:
81; CX: Menuitem index where to set cursor
82; SS:BP: Ptr to MENUVARS
83; Returns:
84; Nothing
85; Corrupts registers:
86; AX, BX, DX
87;--------------------------------------------------------------------
88ALIGN JUMP_ALIGN
89MenuCrsr_PointNthItem:
90 push cx
91 push cx
92 call MenuCrsr_Point1stItem ; Point to topmost menuitem
93 pop cx
94 sub cx, [bp+MENUVARS.wItemTop] ; Number of newlines needed
95 jcxz .Return
96ALIGN JUMP_ALIGN
97.NewLineLoop:
98 call MenuDraw_NewlineStr
99 loop .NewLineLoop
100ALIGN JUMP_ALIGN
101.Return:
102 pop cx
103 ret
104
105
106;--------------------------------------------------------------------
107; Sets cursor to start of menu border.
108; MenuCrsr_PointBelowBrdr Sets cursor to below menu bottom border
109; MenuCrsr_PointNfoBrdr Sets cursor to top left corner of info borders
110; MenuCrsr_PointItemBrdr Sets cursor to first menuitem left border
111; MenuCrsr_PointTitleBrdr Sets cursor to top left corner of title borders
112; Parameters:
113; DX: 0
114; SS:BP: Ptr to MENUVARS
115; Returns:
116; Nothing
117; Corrupts registers:
118; AX, BX, DX
119;--------------------------------------------------------------------
120ALIGN JUMP_ALIGN
121MenuCrsr_PointBelowBrdr:
122 mov dh, [bp+MENUVARS.bInfoH] ; Load info height without borders
123 test dh, dh ; Info displayed?
124 jz .BottomOnly ; If not, continue
125 inc dh ; Increment Y for top border
126ALIGN JUMP_ALIGN
127.BottomOnly:
128 inc dh ; Increment Y for bottom border
129ALIGN JUMP_ALIGN
130MenuCrsr_PointNfoBrdr:
131 add dh, [bp+MENUVARS.bVisCnt] ; Load max number of visible menuitems
132ALIGN JUMP_ALIGN
133MenuCrsr_PointItemBrdr:
134 inc dh ; Add title top border
135 mov al, [bp+MENUVARS.bTitleH] ; Load title height
136 add dh, al ; Add title height to DH
137 test al, al ; Title visible?
138 jz MenuCrsr_PointTitleBrdr ; If not, jump to set cursor
139 inc dh ; Title bottom border
140ALIGN JUMP_ALIGN
141MenuCrsr_PointTitleBrdr:
142 add dx, [bp+MENUVARS.wInitCrsr] ; Add initial cursor position
143 ; Fall to MenuCrsr_SetCursor
144
145
146;--------------------------------------------------------------------
147; Sets cursor position in DX.
148; Parameters:
149; DL: Cursor X coordinate
150; DH: Cursor Y coordinate
151; Returns:
152; Nothing
153; Corrupts registers:
154; AX, BX
155;--------------------------------------------------------------------
156ALIGN JUMP_ALIGN
157MenuCrsr_SetCursor:
158 mov ah, 02h ; Set Cursor Position and Size
[86]159 SKIP2B bx ; mov bx, <next instruction>
160 ; Fall through to MenuCrsr_GetCursor
[3]161
162
163;--------------------------------------------------------------------
164; Return cursor position in DX.
165; Parameters:
166; Nothing
167; Returns:
168; CL: Cursor start scan line
169; CH: Cursor end scan line
170; DL: Cursor X coordinate
171; DH: Cursor Y coordinate
172; Corrupts registers:
173; AX, BX
174;--------------------------------------------------------------------
[86]175;ALIGN JUMP_ALIGN
[3]176MenuCrsr_GetCursor:
[86]177 mov ah, 03h ; Get Cursor Position and Size
[3]178 xor bx, bx ; Zero page
179 int 10h
180 ret
181
182
183;--------------------------------------------------------------------
184; Moves cursor from current location.
185; Parameters:
186; CL: Cursor X coordinate movement (can be negative)
187; CH: Cursor Y coordinate movement (can be negative)
188; Returns:
189; Nothing
190; Corrupts registers:
191; AX, BX, DX
192;--------------------------------------------------------------------
193ALIGN JUMP_ALIGN
194MenuCrsr_Move:
195 push cx
196 call MenuCrsr_GetCursor ; Get cursor position to DX
197 pop cx
198 add dl, cl ; Move X
199 add dh, ch ; Move Y
200 jmp MenuCrsr_SetCursor
201
202
203;--------------------------------------------------------------------
204; Shows cursor that has been hidden.
205; Parameters:
206; Nothing
207; Returns:
208; Nothing
209; Corrupts registers:
210; AX, CX
211;--------------------------------------------------------------------
212ALIGN JUMP_ALIGN
213MenuCrsr_Show:
214 mov cx, 0607h ; Two line cursor near or at the bottom of cell
215 jmp MenuCrsr_SetShape
216
217
218;--------------------------------------------------------------------
219; Hides cursor.
220; Parameters:
221; Nothing
222; Returns:
223; Nothing
224; Corrupts registers:
225; AX, CX
226;--------------------------------------------------------------------
227ALIGN JUMP_ALIGN
228MenuCrsr_Hide:
229 mov cx, 2000h
230 ; Fall to MenuCrsr_SetShape
231
232;--------------------------------------------------------------------
233; Sets cursor shape.
234; Parameters:
235; CL: Cursor start scan line
236; CH: Cursor end scan line
237; Returns:
238; Nothing
239; Corrupts registers:
240; AX
241;--------------------------------------------------------------------
242ALIGN JUMP_ALIGN
243MenuCrsr_SetShape:
244 mov ax, 0103h ; Set Text-Mode Cursor Shape
245 ; AL=assumed video mode to prevent lock ups on some BIOSes
246 int 10h
247 ret
Note: See TracBrowser for help on using the repository browser.