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

Last change on this file since 596 was 596, checked in by Krister Nordvall, 6 years ago

Changes:

  • Made changes to HotkeyBar.asm to give the Boot Menu and Hotkey Bar a more consistent look. It will probably seem a bit strange at first to people used to the classic theme.
  • Added the missing parts of USE_NEC_V that should have been committed with the rest in r593.
  • Removed DEFINES_ALL_FEATURES from the BIOS makefile. It didn't work anymore and never really made sense anyway. Added all the official builds to 'make unused' instead which actually uncovered some unused code in the Tiny build.
  • XTIDECFG will no longer load color themes from unrecognized versions of the BIOS.
  • Other fixes in comments and some minor optimizations.
File size: 14.3 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-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; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; Scans key presses and draws any hotkey changes.
25;
26; HotkeyBar_UpdateDuringDriveDetection
27; Parameters:
28; DS: RAMVARS segment
29; ES: BDA segment (zero)
30; Returns:
31; Nothing
32; Corrupts registers:
33; AX, CX, DX, SI, DI
34;--------------------------------------------------------------------
35HotkeyBar_UpdateDuringDriveDetection:
36 call ScanHotkeysFromKeyBufferAndStoreToBootvars
37 ; Fall to HotkeyBar_DrawToTopOfScreen
38
39
40;--------------------------------------------------------------------
41; HotkeyBar_DrawToTopOfScreen
42; Parameters:
43; DS: RAMVARS segment
44; ES: BDA segment (zero)
45; Returns:
46; Nothing
47; Corrupts registers:
48; AX, CX, DX, SI, DI
49;--------------------------------------------------------------------
50HotkeyBar_DrawToTopOfScreen:
51 ; Store current screen coordinates to be restored
52 ; when Hotkey Bar is rendered
53 call DetectPrint_GetSoftwareCoordinatesToAX
54 push ax
55
56 call MoveCursorToScreenTopLeftCorner
57 ; Fall to .PrintFloppyDriveHotkeys
58
59;--------------------------------------------------------------------
60; .PrintFloppyDriveHotkeys
61; Parameters:
62; DS: RAMVARS segment
63; ES: BDA segment (zero)
64; Returns:
65; Nothing
66; Corrupts registers:
67; AX, CX, DX, SI, DI
68;--------------------------------------------------------------------
69.PrintFloppyDriveHotkeys:
70 call FloppyDrive_GetCountToAX
71 xchg cx, ax ; Any Floppy Drives?
72 jcxz .SkipFloppyDriveHotkeys
73
74 mov ax, (ANGLE_QUOTE_RIGHT << 8) | DEFAULT_FLOPPY_DRIVE_LETTER
75 mov cl, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bFddLetter]
76 mov di, g_szFDD
77
78 ; Clear CH if floppy drive is selected for boot
79 mov ch, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bFlags]
80; and ch, FLG_HOTKEY_HD_FIRST ; Needed if more flags are added
81 call FormatDriveHotkeyString
82
83.SkipFloppyDriveHotkeys:
84 ; Fall to .PrintHardDriveHotkeys
85
86;--------------------------------------------------------------------
87; .PrintHardDriveHotkeys
88; Parameters:
89; DS: RAMVARS segment
90; ES: BDA segment (zero)
91; Returns:
92; Nothing
93; Corrupts registers:
94; AX, CX, DX, SI, DI
95;--------------------------------------------------------------------
96 call BootVars_GetLetterForFirstHardDriveToAX
97 mov ah, ANGLE_QUOTE_RIGHT
98 mov cx, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.wHddLetterAndFlags] ; Letter to CL, flags to CH
99; and ch, FLG_HOTKEY_HD_FIRST ; Needed if more flags are added
100 xor ch, FLG_HOTKEY_HD_FIRST ; Clear CH if HD is selected for boot, set otherwise
101 mov di, g_szHDD
102 call FormatDriveHotkeyString
103 ; Fall to .PrintBootMenuHotkey
104
105;--------------------------------------------------------------------
106; .PrintBootMenuHotkey
107; Parameters:
108; ES: BDA segment (zero)
109; Returns:
110; Nothing
111; Corrupts registers:
112; AX, CX, DX, SI, DI
113;--------------------------------------------------------------------
114.PrintBootMenuHotkey:
115%ifdef MODULE_BOOT_MENU
116 mov ax, BOOT_MENU_HOTKEY_SCANCODE | ('2' << 8)
117 mov di, g_szBootMenu
118 call FormatFunctionHotkeyString
119%endif
120 ; Fall to .PrintComDetectHotkey
121
122;--------------------------------------------------------------------
123; .PrintComDetectHotkey
124; Parameters:
125; ES: BDA segment (zero)
126; Returns:
127; Nothing
128; Corrupts registers:
129; AX, CX, DX, SI, DI
130;--------------------------------------------------------------------
131.PrintComDetectHotkey:
132%ifdef MODULE_SERIAL
133 mov ax, COM_DETECT_HOTKEY_SCANCODE | ('6' << 8)
134 mov di, g_szHotComDetect
135 call FormatFunctionHotkeyString
136%endif
137 ; Fall to .PrintRomBootHotkey
138
139;--------------------------------------------------------------------
140; .PrintRomBootHotkey
141; Parameters:
142; ES: BDA segment (zero)
143; Returns:
144; Nothing
145; Corrupts registers:
146; AX, CX, DX, SI, DI
147;--------------------------------------------------------------------
148.PrintRomBootHotkey:
149 mov ax, ROM_BOOT_HOTKEY_SCANCODE | ('8' << 8)
150 mov di, g_szRomBoot
151 call FormatFunctionHotkeyString
152 ; Fall to .EndHotkeyBarRendering
153
154;--------------------------------------------------------------------
155; .EndHotkeyBarRendering
156; Parameters:
157; Stack: Screen coordinates before drawing Hotkey Bar
158; Returns:
159; Nothing
160; Corrupts registers:
161; AX, CX, DI
162;--------------------------------------------------------------------
163.EndHotkeyBarRendering:
164 call HotkeyBar_ClearRestOfTopRow
165 pop ax
166 jmp SHORT HotkeyBar_RestoreCursorCoordinatesFromAX
167
168
169;--------------------------------------------------------------------
170; HotkeyBar_ClearRestOfTopRow
171; Parameters:
172; Nothing
173; Returns:
174; Nothing
175; Corrupts registers:
176; AX, CX, DI
177;--------------------------------------------------------------------
178HotkeyBar_ClearRestOfTopRow:
179 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
180 eMOVZX cx, al
181 CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
182 sub cl, al
183 mov al, ' '
184 JMP_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
185
186
187;--------------------------------------------------------------------
188; FormatDriveHotkeyString
189; Parameters:
190; CH: Zero if letter in CL is selected for boot
191; CL: Drive letter hotkey from BOOTVARS
192; AL: First character for drive key string
193; AH: Second character for drive key string (ANGLE_QUOTE_RIGHT)
194; SI: Offset to hotkey description string
195; ES: BDA segment (zero)
196; Returns:
197; Nothing
198; Corrupts registers:
199; AX, CX, DX, SI, DI
200;--------------------------------------------------------------------
201FormatDriveHotkeyString:
202 ; Invalid scancodes are filtered on HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
203 ; so here we have either drive letter or function key pressed. If latter, draw
204 ; drive letters as unselected
205 cmp BYTE [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode], FIRST_FUNCTION_KEY_SCANCODE
206 jae SHORT GetNonSelectedHotkeyDescriptionAttributeToDX
207
208 ; Drive selected to boot from?
209 test ch, ch
210 jnz SHORT GetNonSelectedHotkeyDescriptionAttributeToDX
211 jmp SHORT GetSelectedHotkeyDescriptionAttributeToDX
212
213
214;--------------------------------------------------------------------
215; FormatFunctionHotkeyString
216; Parameters:
217; AL: Scancode of function key, to know which if any to show as selected
218; Later replaced with an 'F' for the call to the output routine
219; AH: Second character for drive key string
220; SI: Offset to hotkey description string
221; ES: BDA segment (zero)
222; Returns:
223; Nothing
224; Corrupts registers:
225; AX, CX, DX, SI, DI
226;--------------------------------------------------------------------
227FormatFunctionHotkeyString:
228 xor cx, cx ; Null character, eaten in output routines
229
230 cmp [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode], al
231 mov al, 'F' ; Replace scancode with character for output
232
233%ifdef MODULE_BOOT_MENU
234
235GetSelectedHotkeyDescriptionAttributeToDX:
236 mov si, ATTRIBUTE_CHARS.cHighlightedItem ; Selected hotkey
237 je SHORT GetDescriptionAttributeToDX ; From compare with bScancode above and from FormatDriveHotkeyString
238
239GetNonSelectedHotkeyDescriptionAttributeToDX:
240 mov si, ATTRIBUTE_CHARS.cItem ; Unselected hotkey
241
242 ; Display Library should not be called like this
243GetDescriptionAttributeToDX:
244 xchg dx, ax
245 call MenuAttribute_GetToAXfromTypeInSI
246 xchg dx, ax ; DX = Description attribute
247 ;; fall through to PushHotkeyParamsAndFormat
248
249
250%else ; if no MODULE_BOOT_MENU - No boot menu so use simpler attributes
251
252GetSelectedHotkeyDescriptionAttributeToDX:
253 mov dx, (COLOR_ATTRIBUTE(COLOR_YELLOW, COLOR_CYAN) << 8) | MONO_REVERSE_BLINK
254 je SHORT SelectAttributeFromDHorDLbasedOnVideoMode ; From compare with bScancode above and from FormatDriveHotkeyString
255
256GetNonSelectedHotkeyDescriptionAttributeToDX:
257 mov dx, (COLOR_ATTRIBUTE(COLOR_BLACK, COLOR_CYAN) << 8) | MONO_REVERSE
258
259SelectAttributeFromDHorDLbasedOnVideoMode:
260 mov ch, [es:BDA.bVidMode] ; We only need to preserve CL
261 shr ch, 1
262 jnc SHORT .AttributeLoadedToDL ; Black & White modes
263 shr ch, 1
264 jnz SHORT .AttributeLoadedToDL ; MDA
265 mov dl, dh
266.AttributeLoadedToDL:
267 ;; fall through to PushHotkeyParamsAndFormat
268
269%endif ; MODULE_BOOT_MENU
270
271
272;--------------------------------------------------------------------
273; PushHotkeyParamsAndFormat
274; Parameters:
275; AL: First character
276; AH: Second character
277; DX: Description Attribute
278; CX: Description string parameter
279; CS:DI: Description string
280; Returns:
281; Nothing
282; Corrupts registers:
283; AX, SI, DI
284;--------------------------------------------------------------------
285PushHotkeyParamsAndFormat:
286 push bp
287 mov bp, sp
288
289 mov si, MONO_BRIGHT
290
291 push si ; Key attribute
292 push ax ; First Character
293 mov al, ah
294 push ax ; Second Character
295
296 push dx ; Description attribute
297 push di ; Description string
298 push cx ; Description string parameter
299
300 push si ; Key attribute for last space
301
302 mov si, g_szHotkey
303 jmp DetectPrint_FormatCSSIfromParamsInSSBP
304
305
306;--------------------------------------------------------------------
307; MoveCursorToScreenTopLeftCorner
308; Parameters:
309; Nothing
310; Returns:
311; Nothing
312; Corrupts registers:
313; AX, DI
314;--------------------------------------------------------------------
315MoveCursorToScreenTopLeftCorner:
316 xor ax, ax ; Top left corner (0, 0)
317 ; Fall to HotkeyBar_RestoreCursorCoordinatesFromAX
318
319
320;--------------------------------------------------------------------
321; HotkeyBar_RestoreCursorCoordinatesFromAX
322; Parameters:
323; Nothing
324; Returns:
325; Nothing
326; Corrupts registers:
327; AX, DI
328;--------------------------------------------------------------------
329HotkeyBar_RestoreCursorCoordinatesFromAX:
330 JMP_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
331
332
333;--------------------------------------------------------------------
334; HotkeyBar_StoreHotkeyToBootvarsForDriveNumberInDL
335; Parameters:
336; DS: RAMVARS segment
337; ES: BDA segment (zero)
338; DL: Drive Number
339; Returns:
340; Nothing
341; Corrupts registers:
342; AX, CX, DL, DI
343;--------------------------------------------------------------------
344HotkeyBar_StoreHotkeyToBootvarsForDriveNumberInDL:
345 call DriveXlate_ConvertDriveNumberFromDLtoDriveLetter
346 ; Fall to StoreHotkeyToBootvarsForDriveLetterInDL
347
348
349;--------------------------------------------------------------------
350; StoreHotkeyToBootvarsForDriveLetterInDL
351; Parameters:
352; DS: RAMVARS segment
353; ES: BDA segment (zero)
354; DL: Drive Letter ('A'...)
355; Returns:
356; Nothing
357; Corrupts registers:
358; AX, CX, DI
359;--------------------------------------------------------------------
360StoreHotkeyToBootvarsForDriveLetterInDL:
361 eMOVZX ax, dl
362 or al, 32 ; Upper case drive letter to lower case keystroke
363 jmp SHORT HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
364
365
366;--------------------------------------------------------------------
367; ScanHotkeysFromKeyBufferAndStoreToBootvars
368; Parameters:
369; DS: RAMVARS segment
370; ES: BDA segment (zero)
371; Returns:
372; AL: Last scancode value
373; Corrupts registers:
374; AH, CX
375;--------------------------------------------------------------------
376ScanHotkeysFromKeyBufferAndStoreToBootvars:
377 call Keyboard_GetKeystrokeToAX
378 jz SHORT NoHotkeyToProcess
379
380 ; Prepare to read another key from buffer
381 ePUSH_T cx, ScanHotkeysFromKeyBufferAndStoreToBootvars
382 ; Fall to HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
383
384
385;--------------------------------------------------------------------
386; HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
387; Parameters:
388; AL: Hotkey ASCII code
389; AH: Hotkey Scancode
390; DS: RAMVARS segment
391; ES: BDA segment (zero)
392; Returns:
393; AL: Last scancode seen
394; CF: Set if valid hotkey in AL
395; Clear if scancode in AL is not for any hotkey
396; Corrupts registers:
397; AH, CX, DI
398;--------------------------------------------------------------------
399HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX:
400 mov di, BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode
401
402 ; All scancodes are saved, even if it wasn't a drive letter,
403 ; which also covers our function key case. Invalid function keys
404 ; will not do anything (won't be printed, won't be accepted as input)
405 mov [es:di], ah
406
407 ; Drive letter hotkeys remaining, allow 'a' to 'z'
408 call Char_IsLowerCaseLetterInAL
409 jnc SHORT .KeystrokeIsNotValidDriveLetter
410 and al, ~32 ; We want to print upper case letters
411
412 ; Clear HD First flag to assume Floppy Drive hotkey
413 dec di
414 and BYTE [es:di], ~FLG_HOTKEY_HD_FIRST
415
416 ; Determine if Floppy or Hard Drive hotkey
417 xchg cx, ax
418 call BootVars_GetLetterForFirstHardDriveToAX
419 cmp cl, al
420 jb SHORT .StoreDriveLetter ; Store Floppy Drive letter
421
422 ; Store Hard Drive letter
423 or BYTE [es:di], FLG_HOTKEY_HD_FIRST
424
425.StoreDriveLetter:
426 sbb di, BYTE 1 ; Sub CF if Floppy Drive
427 xchg ax, cx
428 stosb
429 stc ; Valid hotkey scancode returned in AL
430
431.KeystrokeIsNotValidDriveLetter:
432NoHotkeyToProcess:
433 mov al, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode]
434 ret
435
436
437;--------------------------------------------------------------------
438; HotkeyBar_GetBootDriveNumbersToDX
439; Parameters:
440; DS: RAMVARS segment
441; ES: BDA segment (zero)
442; Returns:
443; DX: Drives selected as boot device, DL is primary
444; Corrupts registers:
445; AX
446;--------------------------------------------------------------------
447HotkeyBar_GetBootDriveNumbersToDX:
448 mov dx, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.wFddAndHddLetters]
449 test BYTE [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bFlags], FLG_HOTKEY_HD_FIRST
450 jnz .noflip
451 xchg dl, dh
452.noflip:
453 call DriveXlate_ConvertDriveLetterInDLtoDriveNumber
454 xchg dl, dh
455 ; Fall to HotkeyBar_FallThroughTo_DriveXlate_ConvertDriveLetterInDLtoDriveNumber
456
457HotkeyBar_FallThroughTo_DriveXlate_ConvertDriveLetterInDLtoDriveNumber:
458
Note: See TracBrowser for help on using the repository browser.