source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Menus/HotkeyBar.asm@ 492

Last change on this file since 492 was 492, checked in by gregli@…, 12 years ago

Removed the dependency between MODULE_BOOT_MENU and MODULE_HOTKEYS. With these changes, 0, 1, or 2 of them can be included in a build. This change also means that the hotkeys don't work while the menu is up. But the most important hotkey there was for Rom Boot, and that has been added to the menu as a choice proper. Lots of changes across the board in the hotkeys code - even if we eventually back this change out (becaue, for example we want hotkeys to work in the menu) we should probably start from this base and add that functionality back in, as these changes results in approximately 120 bytes of savings and includes new functionality, such as the Rom Boot menu item and the Com Detect hotkey.

File size: 12.8 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Hotkey Bar related functions.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 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; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; HotkeyBar_UpdateDuringDriveDetection
25; Parameters:
26; DS: RAMVARS segment
27; ES: BDA segment (zero)
28; Returns:
29; Nothing
30; Corrupts registers:
31; AX, CX, DX, SI, DI
32;--------------------------------------------------------------------
33HotkeyBar_UpdateDuringDriveDetection:
34 call HotkeyBar_ScanHotkeysFromKeyBufferAndStoreToBootvars
35 ; Fall to HotkeyBar_DrawToTopOfScreen
36
37
38;--------------------------------------------------------------------
39; HotkeyBar_DrawToTopOfScreen
40; Parameters:
41; DS: RAMVARS segment
42; ES: BDA segment (zero)
43; Returns:
44; Nothing
45; Corrupts registers:
46; AX, CX, DX, SI, DI
47;--------------------------------------------------------------------
48HotkeyBar_DrawToTopOfScreen:
49 ; Store current screen coordinates to be restored
50 ; when Hotkey Bar is rendered
51 call DetectPrint_GetSoftwareCoordinatesToAX
52 push ax
53
54 call MoveCursorToScreenTopLeftCorner
55 ; Fall to .PrintFloppyDriveHotkeys
56
57;--------------------------------------------------------------------
58; .PrintFloppyDriveHotkeys
59; Parameters:
60; DS: RAMVARS segment
61; ES: BDA segment (zero)
62; Returns:
63; Nothing
64; Corrupts registers:
65; AX, CX, DX, SI, DI
66;--------------------------------------------------------------------
67.PrintFloppyDriveHotkeys:
68 mov cx, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.wHddAndFddLetters]
69
70 call FloppyDrive_GetCountToAX
71 test ax, ax ; Any Floppy Drives?
72 jz SHORT .SkipFloppyDriveHotkeys
73
74 mov ax, (ANGLE_QUOTE_RIGHT << 8) | DEFAULT_FLOPPY_DRIVE_LETTER
75 mov di, g_szFDD
76 call FormatDriveHotkeyString
77
78.SkipFloppyDriveHotkeys:
79 ; Fall to .PrintHardDriveHotkeys
80
81;--------------------------------------------------------------------
82; .PrintHardDriveHotkeys
83; Parameters:
84; DS: RAMVARS segment
85; ES: BDA segment (zero)
86; Returns:
87; Nothing
88; Corrupts registers:
89; AX, CX, DX, SI, DI
90;--------------------------------------------------------------------
91 call DriveXlate_GetLetterForFirstHardDriveToAX
92 mov ah, ANGLE_QUOTE_RIGHT
93 mov cl, ch
94 mov di, g_szHDD
95 call FormatDriveHotkeyString
96 ; Fall to .PrintBootMenuHotkey
97
98;--------------------------------------------------------------------
99; .PrintBootMenuHotkey
100; Parameters:
101; ES: BDA segment (zero)
102; Returns:
103; Nothing
104; Corrupts registers:
105; AX, CX, DX, SI, DI
106;--------------------------------------------------------------------
107.PrintBootMenuHotkey:
108%ifdef MODULE_BOOT_MENU
109 mov ax, BOOT_MENU_HOTKEY_SCANCODE | ('2' << 8)
110 mov di, g_szBootMenu
111 call FormatFunctionHotkeyString
112%endif
113 ; Fall to .PrintComDetectHotkey
114
115;--------------------------------------------------------------------
116; .PrintComDetectHotkey
117; Parameters:
118; ES: BDA segment (zero)
119; Returns:
120; Nothing
121; Corrupts registers:
122; AX, CX, DX, SI, DI
123;--------------------------------------------------------------------
124.PrintComDetectHotkey:
125%ifdef MODULE_SERIAL
126 mov ax, COM_DETECT_HOTKEY_SCANCODE | ('6' << 8)
127 mov di, g_szHotComDetect
128 call FormatFunctionHotkeyString
129%endif
130 ; Fall to .PrintRomBootHotkey
131
132;--------------------------------------------------------------------
133; .PrintRomBootHotkey
134; Parameters:
135; ES: BDA segment (zero)
136; Returns:
137; Nothing
138; Corrupts registers:
139; AX, CX, DX, SI, DI
140;--------------------------------------------------------------------
141.PrintRomBootHotkey:
142 mov ax, ROM_BOOT_HOTKEY_SCANCODE | ('8' << 8)
143 mov di, g_szRomBoot
144 call FormatFunctionHotkeyString
145 ; Fall to .EndHotkeyBarRendering
146
147;--------------------------------------------------------------------
148; .EndHotkeyBarRendering
149; Parameters:
150; Stack: Screen coordinates before drawing Hotkey Bar
151; Returns:
152; Nothing
153; Corrupts registers:
154; AX, CX, DI
155;--------------------------------------------------------------------
156.EndHotkeyBarRendering:
157 call HotkeyBar_ClearRestOfTopRow
158 pop ax
159 jmp SHORT HotkeyBar_RestoreCursorCoordinatesFromAX
160
161
162;--------------------------------------------------------------------
163; HotkeyBar_ClearRestOfTopRow
164; Parameters:
165; Nothing
166; Returns:
167; Nothing
168; Corrupts registers:
169; AX, CX, DI
170;--------------------------------------------------------------------
171HotkeyBar_ClearRestOfTopRow:
172 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
173 eMOVZX cx, al
174 CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
175 sub cl, al
176 mov al, ' '
177 CALL_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
178 ret
179
180
181;--------------------------------------------------------------------
182; FormatDriveHotkeyString
183; Parameters:
184; CL: Drive letter hotkey from BOOTVARS
185; AL: First character for drive key string
186; AH: Second character for drive key string (ANGLE_QUOTE_RIGHT)
187; SI: Offset to hotkey description string
188; ES: BDA segment (zero)
189; Returns:
190; Nothing
191; Corrupts registers:
192; AX, CX, DX, SI, DI
193;--------------------------------------------------------------------
194;; No work to do before going into FormatFunctionHotkeyString
195FormatDriveHotkeyString equ GetNonSelectedHotkeyDescriptionAttributeToDX
196
197;--------------------------------------------------------------------
198; FormatFunctionHotkeyString
199; Parameters:
200; AL: Scancode of function key, to know which if any to show as selected
201; Later replaced with an 'F' for the call to the output routine
202; AH: Second character for drive key string
203; SI: Offset to hotkey description string
204; ES: BDA segment (zero)
205; Returns:
206; Nothing
207; Corrupts registers:
208; AX, CX, DX, SI, DI
209;--------------------------------------------------------------------
210FormatFunctionHotkeyString:
211 xor cx, cx ; Null character, eaten in output routines
212
213 cmp [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode], al
214 mov al, 'F' ; Replace scancode with character for output
215
216%ifdef MODULE_BOOT_MENU
217
218 mov si, ATTRIBUTE_CHARS.cHurryTimeout ; Selected hotkey
219 jz SHORT GetDescriptionAttributeToDX ; From compare with bScancode above
220
221GetNonSelectedHotkeyDescriptionAttributeToDX:
222 mov si, ATTRIBUTE_CHARS.cHighlightedItem ; Unselected hotkey
223
224 ; Display Library should not be called like this
225GetDescriptionAttributeToDX:
226 xchg dx, ax
227 call MenuAttribute_GetToAXfromTypeInSI
228 xchg dx, ax ; DX = Description attribute
229 ;; fall through to PushHotkeyParamsAndFormat
230
231%else ; MODULE_BOOT_MENU - No boot menu so use simpler attributes
232
233 mov dx, (COLOR_ATTRIBUTE(COLOR_YELLOW, COLOR_CYAN) << 8) | MONO_REVERSE_BLINK
234 jz SHORT SelectAttributeFromDHorDLbasedOnVideoMode ; From compare with bScancode above
235
236GetNonSelectedHotkeyDescriptionAttributeToDX:
237 mov dx, (COLOR_ATTRIBUTE(COLOR_BLACK, COLOR_CYAN) << 8) | MONO_REVERSE
238
239SelectAttributeFromDHorDLbasedOnVideoMode:
240 mov al, [es:BDA.bVidMode]
241 shr al, 1
242 jnc SHORT .AttributeLoadedToDL ; Black & White modes
243 shr al, 1
244 jnz SHORT .AttributeLoadedToDL ; MDA
245 mov dl, dh
246.AttributeLoadedToDL:
247 ;; fall through to PushHotkeyParamsAndFormat
248
249%endif ; MODULE_BOOT_MENU
250
251
252;--------------------------------------------------------------------
253; PushHotkeyParamsAndFormat
254; Parameters:
255; BL: First character
256; BH: Second character
257; DX: Description Attribute
258; CX: Description string parameter
259; CS:DI: Description string
260; Returns:
261; Nothing
262; Corrupts registers:
263; AX, SI, DI
264;--------------------------------------------------------------------
265PushHotkeyParamsAndFormat:
266 push bp
267 mov bp, sp
268
269 mov si, MONO_BRIGHT
270
271 push si ; Key attribute
272 push ax ; First Character
273 mov al, ah
274 push ax ; Second Character
275
276 push dx ; Description attribute
277 push di ; Description string
278 push cx ; Description string parameter
279
280 push si ; Key attribute for last space
281
282 mov si, g_szHotkey
283 jmp DetectPrint_FormatCSSIfromParamsInSSBP
284
285
286;--------------------------------------------------------------------
287; MoveCursorToScreenTopLeftCorner
288; Parameters:
289; Nothing
290; Returns:
291; Nothing
292; Corrupts registers:
293; AX, DI
294;--------------------------------------------------------------------
295MoveCursorToScreenTopLeftCorner:
296 xor ax, ax ; Top left corner (0, 0)
297 ; Fall to HotkeyBar_RestoreCursorCoordinatesFromAX
298
299
300;--------------------------------------------------------------------
301; HotkeyBar_RestoreCursorCoordinatesFromAX
302; Parameters:
303; Nothing
304; Returns:
305; Nothing
306; Corrupts registers:
307; AX, DI
308;--------------------------------------------------------------------
309HotkeyBar_RestoreCursorCoordinatesFromAX:
310 CALL_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
311 ret
312
313
314;--------------------------------------------------------------------
315; HotkeyBar_StoreHotkeyToBootvarsForDriveLetterInDL
316; Parameters:
317; DS: RAMVARS segment
318; ES: BDA segment (zero)
319; DL: Drive Letter ('A'...)
320; Returns:
321; Nothing
322; Corrupts registers:
323; AX, CX, DI
324;--------------------------------------------------------------------
325HotkeyBar_StoreHotkeyToBootvarsForDriveLetterInDL:
326 eMOVZX ax, dl
327 xor al, 32 ; Upper case drive letter to lower case keystroke
328 jmp SHORT HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
329
330
331;--------------------------------------------------------------------
332; HotkeyBar_ScanHotkeysFromKeyBufferAndStoreToBootvars
333; Parameters:
334; DS: RAMVARS segment
335; ES: BDA segment (zero)
336; Returns:
337; AL: Last scancode value
338; Corrupts registers:
339; AH, CX
340;--------------------------------------------------------------------
341HotkeyBar_ScanHotkeysFromKeyBufferAndStoreToBootvars:
342 call Keyboard_GetKeystrokeToAX
343 jz SHORT NoHotkeyToProcess
344
345 ePUSH_T cx, HotkeyBar_ScanHotkeysFromKeyBufferAndStoreToBootvars
346 ; Fall to HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
347
348
349;--------------------------------------------------------------------
350; HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
351; Parameters:
352; AL: Hotkey ASCII code
353; AH: Hotkey Scancode
354; DS: RAMVARS segment
355; ES: BDA segment (zero)
356; Returns:
357; AL: Last scancode seen
358; Corrupts registers:
359; AH, CX, DI
360;--------------------------------------------------------------------
361HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX:
362 mov di, BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode
363
364 ; All scancodes are saved, even if it wasn't a drive letter,
365 ; which also covers our function key case. Invalid function keys
366 ; will not do anything (won't be printed, won't be accepted as input)
367 mov [es:di], ah
368
369 ; Drive letter hotkeys remaining, allow 'a' to 'z'
370 call Char_IsLowerCaseLetterInAL
371 jnc SHORT .KeystrokeIsNotValidDriveLetter
372 xor al, 32 ; We want to print upper case letters
373
374 ; Clear HD First flag to assume Floppy Drive hotkey
375 dec di
376 and BYTE [es:di], ~FLG_HOTKEY_HD_FIRST
377
378 ; Determine if Floppy or Hard Drive hotkey
379 eMOVZX cx, al ; Clear CH to clear scancode
380 call DriveXlate_GetLetterForFirstHardDriveToAX
381 cmp cl, al
382 jb SHORT .StoreDriveLetter ; Store Floppy Drive letter
383
384 ; Store Hard Drive letter
385 or BYTE [es:di], FLG_HOTKEY_HD_FIRST
386
387.StoreDriveLetter:
388 sbb di, BYTE 1 ; Sub CF if Floppy Drive
389 xchg ax, cx
390 mov [es:di], al ; AH = zero to clear function hotkey
391
392.KeystrokeIsNotValidDriveLetter:
393NoHotkeyToProcess:
394 mov al, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode]
395 ret
396
397;--------------------------------------------------------------------
398; HotkeyBar_GetBootDriveNumbersToDX
399; Parameters:
400; DS: RAMVARS segment
401; ES: BDA segment (zero)
402; Returns:
403; DX: Drives selected as boot device, DL is primary
404; Corrupts registers:
405; AX
406;--------------------------------------------------------------------
407HotkeyBar_GetBootDriveNumbersToDX:
408 mov dx, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.wHddAndFddLetters]
409 test BYTE [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bFlags], FLG_HOTKEY_HD_FIRST
410 jnz .noflip
411 xchg dl, dh
412.noflip:
413 call DriveXlate_ConvertDriveLetterInDLtoDriveNumber
414 xchg dl, dh
415 ; Fall to HotkeyBar_FallThroughTo_DriveXlate_ConvertDriveLetterInDLtoDriveNumber
416
417HotkeyBar_FallThroughTo_DriveXlate_ConvertDriveLetterInDLtoDriveNumber:
418
Note: See TracBrowser for help on using the repository browser.