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

Last change on this file since 594 was 593, checked in by Tomi Tilli, 6 years ago

Flashing now works again.
Hack to get Windows 95 to work properly (MODULE_WIN95_CMOS_HACK included for 386 builds by default).
Edited makefile to produce large 386 build.
Fixed recovery time for QDI Vision VLB-IDE controllers.
No more warnings with Nasm 2.13.xx and later.
File dialog now properly restores default drive when file selection is cancelled.

File size: 14.3 KB
RevLine 
[392]1; Project name : XTIDE Universal BIOS
2; Description : Hotkey Bar related functions.
3
4;
[399]5; XTIDE Universal BIOS and Associated Tools
[526]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[392]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.
[399]12;
[392]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.
[399]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
[392]19
20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
[528]24; Scans key presses and draws any hotkey changes.
25;
[392]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:
[528]36 call ScanHotkeysFromKeyBufferAndStoreToBootvars
[392]37 ; Fall to HotkeyBar_DrawToTopOfScreen
[505]38
39
[392]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
[568]71 xchg cx, ax ; Any Floppy Drives?
72 jcxz .SkipFloppyDriveHotkeys
[392]73
[492]74 mov ax, (ANGLE_QUOTE_RIGHT << 8) | DEFAULT_FLOPPY_DRIVE_LETTER
[500]75 mov cl, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bFddLetter]
[492]76 mov di, g_szFDD
[593]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
[392]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;--------------------------------------------------------------------
[547]96 call BootVars_GetLetterForFirstHardDriveToAX
[392]97 mov ah, ANGLE_QUOTE_RIGHT
[593]98 mov cx, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bHddLetter] ; 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
[492]101 mov di, g_szHDD
[392]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
[492]116 mov ax, BOOT_MENU_HOTKEY_SCANCODE | ('2' << 8)
117 mov di, g_szBootMenu
[392]118 call FormatFunctionHotkeyString
119%endif
[492]120 ; Fall to .PrintComDetectHotkey
[392]121
122;--------------------------------------------------------------------
[492]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
[505]137 ; Fall to .PrintRomBootHotkey
[492]138
139;--------------------------------------------------------------------
[392]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:
[492]149 mov ax, ROM_BOOT_HOTKEY_SCANCODE | ('8' << 8)
150 mov di, g_szRomBoot
[392]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:
[505]179 CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
[392]180 eMOVZX cx, al
[505]181 CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
[392]182 sub cl, al
183 mov al, ' '
[505]184 JMP_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
[392]185
186
187;--------------------------------------------------------------------
188; FormatDriveHotkeyString
189; Parameters:
[593]190; CH: Zero if letter in CL is selected for boot
[392]191; CL: Drive letter hotkey from BOOTVARS
[492]192; AL: First character for drive key string
193; AH: Second character for drive key string (ANGLE_QUOTE_RIGHT)
[392]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;--------------------------------------------------------------------
[593]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
[392]207
[593]208 ; Drive selected to boot from?
209 test ch, ch
210 jnz SHORT GetNonSelectedHotkeyDescriptionAttributeToDX
211 jmp SHORT GetSelectedHotkeyDescriptionAttributeToDX
212
213
[392]214;--------------------------------------------------------------------
215; FormatFunctionHotkeyString
216; Parameters:
[492]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
[392]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:
[492]228 xor cx, cx ; Null character, eaten in output routines
[392]229
[492]230 cmp [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode], al
231 mov al, 'F' ; Replace scancode with character for output
[392]232
233%ifdef MODULE_BOOT_MENU
[492]234
[593]235GetSelectedHotkeyDescriptionAttributeToDX:
[392]236 mov si, ATTRIBUTE_CHARS.cHurryTimeout ; Selected hotkey
[593]237 je SHORT GetDescriptionAttributeToDX ; From compare with bScancode above and from FormatDriveHotkeyString
[392]238
239GetNonSelectedHotkeyDescriptionAttributeToDX:
240 mov si, ATTRIBUTE_CHARS.cHighlightedItem ; Unselected hotkey
241
242 ; Display Library should not be called like this
243GetDescriptionAttributeToDX:
[492]244 xchg dx, ax
[392]245 call MenuAttribute_GetToAXfromTypeInSI
246 xchg dx, ax ; DX = Description attribute
[505]247 ;; fall through to PushHotkeyParamsAndFormat
[392]248
249
[500]250%else ; if no MODULE_BOOT_MENU - No boot menu so use simpler attributes
251
[593]252GetSelectedHotkeyDescriptionAttributeToDX:
[410]253 mov dx, (COLOR_ATTRIBUTE(COLOR_YELLOW, COLOR_CYAN) << 8) | MONO_REVERSE_BLINK
[593]254 je SHORT SelectAttributeFromDHorDLbasedOnVideoMode ; From compare with bScancode above and from FormatDriveHotkeyString
[392]255
256GetNonSelectedHotkeyDescriptionAttributeToDX:
[410]257 mov dx, (COLOR_ATTRIBUTE(COLOR_BLACK, COLOR_CYAN) << 8) | MONO_REVERSE
[492]258
[410]259SelectAttributeFromDHorDLbasedOnVideoMode:
[500]260 mov ch, [es:BDA.bVidMode] ; We only need to preserve CL
261 shr ch, 1
[410]262 jnc SHORT .AttributeLoadedToDL ; Black & White modes
[500]263 shr ch, 1
[410]264 jnz SHORT .AttributeLoadedToDL ; MDA
265 mov dl, dh
266.AttributeLoadedToDL:
[505]267 ;; fall through to PushHotkeyParamsAndFormat
[410]268
[492]269%endif ; MODULE_BOOT_MENU
[392]270
271
272;--------------------------------------------------------------------
273; PushHotkeyParamsAndFormat
274; Parameters:
[500]275; AL: First character
276; AH: Second character
[392]277; DX: Description Attribute
278; CX: Description string parameter
[492]279; CS:DI: Description string
[392]280; Returns:
281; Nothing
282; Corrupts registers:
283; AX, SI, DI
284;--------------------------------------------------------------------
285PushHotkeyParamsAndFormat:
286 push bp
287 mov bp, sp
288
[492]289 mov si, MONO_BRIGHT
[392]290
[492]291 push si ; Key attribute
292 push ax ; First Character
293 mov al, ah
294 push ax ; Second Character
295
[392]296 push dx ; Description attribute
[492]297 push di ; Description string
[392]298 push cx ; Description string parameter
[505]299
[492]300 push si ; Key attribute for last space
[392]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:
[505]330 JMP_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
[392]331
332
333;--------------------------------------------------------------------
[528]334; HotkeyBar_StoreHotkeyToBootvarsForDriveNumberInDL
[395]335; Parameters:
336; DS: RAMVARS segment
337; ES: BDA segment (zero)
[528]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)
[395]354; DL: Drive Letter ('A'...)
355; Returns:
356; Nothing
357; Corrupts registers:
358; AX, CX, DI
359;--------------------------------------------------------------------
[528]360StoreHotkeyToBootvarsForDriveLetterInDL:
[395]361 eMOVZX ax, dl
[505]362 or al, 32 ; Upper case drive letter to lower case keystroke
[395]363 jmp SHORT HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
364
365
366;--------------------------------------------------------------------
[528]367; ScanHotkeysFromKeyBufferAndStoreToBootvars
[392]368; Parameters:
369; DS: RAMVARS segment
370; ES: BDA segment (zero)
371; Returns:
[492]372; AL: Last scancode value
[392]373; Corrupts registers:
[492]374; AH, CX
[392]375;--------------------------------------------------------------------
[528]376ScanHotkeysFromKeyBufferAndStoreToBootvars:
[392]377 call Keyboard_GetKeystrokeToAX
378 jz SHORT NoHotkeyToProcess
379
[528]380 ; Prepare to read another key from buffer
381 ePUSH_T cx, ScanHotkeysFromKeyBufferAndStoreToBootvars
[392]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:
[567]393; AL: Last scancode seen
[528]394; CF: Set if valid hotkey in AL
395; Clear if scancode in AL is not for any hotkey
[392]396; Corrupts registers:
[492]397; AH, CX, DI
[392]398;--------------------------------------------------------------------
399HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX:
[492]400 mov di, BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode
[392]401
[492]402 ; All scancodes are saved, even if it wasn't a drive letter,
403 ; which also covers our function key case. Invalid function keys
[505]404 ; will not do anything (won't be printed, won't be accepted as input)
[492]405 mov [es:di], ah
[505]406
[392]407 ; Drive letter hotkeys remaining, allow 'a' to 'z'
408 call Char_IsLowerCaseLetterInAL
[492]409 jnc SHORT .KeystrokeIsNotValidDriveLetter
[505]410 and al, ~32 ; We want to print upper case letters
[392]411
412 ; Clear HD First flag to assume Floppy Drive hotkey
[492]413 dec di
[392]414 and BYTE [es:di], ~FLG_HOTKEY_HD_FIRST
415
416 ; Determine if Floppy or Hard Drive hotkey
[505]417 xchg cx, ax
[547]418 call BootVars_GetLetterForFirstHardDriveToAX
[392]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:
[505]426 sbb di, BYTE 1 ; Sub CF if Floppy Drive
[392]427 xchg ax, cx
[592]428 stosb
[528]429 stc ; Valid hotkey scancode returned in AL
[392]430
[505]431.KeystrokeIsNotValidDriveLetter:
[392]432NoHotkeyToProcess:
[492]433 mov al, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode]
[392]434 ret
435
[528]436
[392]437;--------------------------------------------------------------------
[492]438; HotkeyBar_GetBootDriveNumbersToDX
[392]439; Parameters:
440; DS: RAMVARS segment
441; ES: BDA segment (zero)
442; Returns:
[492]443; DX: Drives selected as boot device, DL is primary
[392]444; Corrupts registers:
[492]445; AX
[392]446;--------------------------------------------------------------------
[492]447HotkeyBar_GetBootDriveNumbersToDX:
[500]448 mov dx, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.wFddAndHddLetters]
[505]449 test BYTE [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bFlags], FLG_HOTKEY_HD_FIRST
[492]450 jnz .noflip
[392]451 xchg dl, dh
[505]452.noflip:
[492]453 call DriveXlate_ConvertDriveLetterInDLtoDriveNumber
454 xchg dl, dh
[505]455 ; Fall to HotkeyBar_FallThroughTo_DriveXlate_ConvertDriveLetterInDLtoDriveNumber
[392]456
[505]457HotkeyBar_FallThroughTo_DriveXlate_ConvertDriveLetterInDLtoDriveNumber:
458
Note: See TracBrowser for help on using the repository browser.