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

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

Changes to XTIDE Universal BIOS:

  • Greatly improved Hotkey Bar is displayed during drive detection.
  • 8k builds no longer include boot menu.
  • Boot menu is displayed only if F2 is pressed during drive detection.
  • Some changes to directory structure.


File size: 13.9 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    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    call    FloppyDrive_GetCountToAX
69    test    ax, ax      ; Any Floppy Drives?
70    jz      SHORT .SkipFloppyDriveHotkeys
71
72    mov     di, DEFAULT_FLOPPY_DRIVE_LETTER | (ANGLE_QUOTE_RIGHT<<8)
73    mov     cl, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bFddLetter]
74    mov     si, g_szFDD
75    call    FormatDriveHotkeyString
76
77.SkipFloppyDriveHotkeys:
78    ; Fall to .PrintHardDriveHotkeys
79
80;--------------------------------------------------------------------
81; .PrintHardDriveHotkeys
82;   Parameters:
83;       DS:     RAMVARS segment
84;       ES:     BDA segment (zero)
85;   Returns:
86;       Nothing
87;   Corrupts registers:
88;       AX, CX, DX, SI, DI
89;--------------------------------------------------------------------
90    call    HotkeyBar_GetLetterForFirstHardDriveToAX
91    mov     ah, ANGLE_QUOTE_RIGHT
92    xchg    di, ax
93    mov     cl, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bHddLetter]
94    mov     si, 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     ah, BOOT_MENU_HOTKEY_SCANCODE
110    mov     di, 'F' | ('2'<<8)      ; F2
111    mov     si, g_szBootMenu
112    call    FormatFunctionHotkeyString
113%endif
114    ; Fall to .PrintRomBootHotkey
115
116;--------------------------------------------------------------------
117; .PrintRomBootHotkey
118;   Parameters:
119;       ES:     BDA segment (zero)
120;   Returns:
121;       Nothing
122;   Corrupts registers:
123;       AX, CX, DX, SI, DI
124;--------------------------------------------------------------------
125.PrintRomBootHotkey:
126    mov     ah, ROM_BOOT_HOTKEY_SCANCODE
127    mov     di, 'F' | ('8'<<8)      ; F8
128    mov     si, g_szRomBoot
129    call    FormatFunctionHotkeyString
130    ; Fall to .EndHotkeyBarRendering
131
132;--------------------------------------------------------------------
133; .EndHotkeyBarRendering
134;   Parameters:
135;       Stack:  Screen coordinates before drawing Hotkey Bar
136;   Returns:
137;       Nothing
138;   Corrupts registers:
139;       AX, CX, DI
140;--------------------------------------------------------------------
141.EndHotkeyBarRendering:
142    call    HotkeyBar_ClearRestOfTopRow
143    pop     ax
144    jmp     SHORT HotkeyBar_RestoreCursorCoordinatesFromAX
145
146
147;--------------------------------------------------------------------
148; HotkeyBar_ClearRestOfTopRow
149;   Parameters:
150;       Nothing
151;   Returns:
152;       Nothing
153;   Corrupts registers:
154;       AX, CX, DI
155;--------------------------------------------------------------------
156HotkeyBar_ClearRestOfTopRow:
157    CALL_DISPLAY_LIBRARY    GetColumnsToALandRowsToAH
158    eMOVZX  cx, al
159    CALL_DISPLAY_LIBRARY    GetSoftwareCoordinatesToAX
160    sub     cl, al
161    mov     al, ' '
162    CALL_DISPLAY_LIBRARY    PrintRepeatedCharacterFromALwithCountInCX
163    ret
164
165
166;--------------------------------------------------------------------
167; FormatDriveHotkeyString
168;   Parameters:
169;       CL:         Drive letter hotkey from BOOTVARS
170;       DI low:     First character for drive key string
171;       DI high:    Second character for drive key string (ANGLE_QUOTE_RIGHT)
172;       SI:         Offset to hotkey description string
173;       ES:         BDA segment (zero)
174;   Returns:
175;       Nothing
176;   Corrupts registers:
177;       AX, CX, DX, SI, DI
178;--------------------------------------------------------------------
179FormatDriveHotkeyString:
180    ePUSH_T ax, PushHotkeyParamsAndFormat
181    jmp     SHORT GetNonSelectedHotkeyDescriptionAttributeToDX
182
183
184;--------------------------------------------------------------------
185; FormatFunctionHotkeyString
186;   Parameters:
187;       AH:         Hotkey scancode to compare with BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode
188;       SI:         Offset to hotkey description string
189;       DI low:     First character for drive key string
190;       DI high:    Second character for drive key string
191;       ES:         BDA segment (zero)
192;   Returns:
193;       Nothing
194;   Corrupts registers:
195;       AX, CX, DX, SI, DI
196;--------------------------------------------------------------------
197FormatFunctionHotkeyString:
198    ePUSH_T ax, PushHotkeyParamsAndFormat
199    mov     cx, g_szBoot        ; Description parameter string
200    cmp     [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode], ah
201    jne     SHORT GetNonSelectedHotkeyDescriptionAttributeToDX
202    ; Fall to GetSelectedHotkeyDescriptionAttributeToDX
203
204
205;--------------------------------------------------------------------
206; GetSelectedHotkeyDescriptionAttributeToDX
207; GetNonSelectedHotkeyDescriptionAttributeToDX
208;   Parameters:
209;       CF:     Set if selected hotkey
210;               Cleared if unselected hotkey
211;   Returns:
212;       DX:     Description Attribute
213;   Corrupts registers:
214;       AX
215;--------------------------------------------------------------------
216%ifdef MODULE_BOOT_MENU
217GetSelectedHotkeyDescriptionAttributeToDX:
218    push    si
219    mov     si, ATTRIBUTE_CHARS.cHurryTimeout       ; Selected hotkey
220    jmp     SHORT GetDescriptionAttributeToDX
221
222GetNonSelectedHotkeyDescriptionAttributeToDX:
223    push    si
224    mov     si, ATTRIBUTE_CHARS.cHighlightedItem    ; Unselected hotkey
225
226    ; Display Library should not be called like this
227GetDescriptionAttributeToDX:
228    call    MenuAttribute_GetToAXfromTypeInSI
229    pop     si
230    xchg    dx, ax                  ; DX = Description attribute
231    ret
232
233%else   ; No boot menu so use simpler attributes
234
235GetSelectedHotkeyDescriptionAttributeToDX:
236    mov     dl, MONO_REVERSE_BLINK
237    ret
238
239GetNonSelectedHotkeyDescriptionAttributeToDX:
240    mov     dl, MONO_REVERSE
241    ret
242%endif
243
244
245;--------------------------------------------------------------------
246; PushHotkeyParamsAndFormat
247;   Parameters:
248;       DI low:     First character
249;       DI high:    Second character
250;       DX:         Description Attribute
251;       CX:         Description string parameter
252;       CS:SI:      Description string
253;   Returns:
254;       Nothing
255;   Corrupts registers:
256;       AX, SI, DI
257;--------------------------------------------------------------------
258PushHotkeyParamsAndFormat:
259    push    bp
260    mov     bp, sp
261
262    mov     ax, MONO_BRIGHT
263    push    ax              ; Key attribute
264    xchg    ax, di
265    push    ax              ; First character
266    xchg    al, ah
267    push    ax              ; Second character
268
269    push    dx              ; Description attribute
270    push    si              ; Description string
271    push    cx              ; Description string parameter
272
273    push    di              ; Key attribute for last space
274    mov     si, g_szHotkey
275    jmp     DetectPrint_FormatCSSIfromParamsInSSBP
276
277
278;--------------------------------------------------------------------
279; MoveCursorToScreenTopLeftCorner
280;   Parameters:
281;       Nothing
282;   Returns:
283;       Nothing
284;   Corrupts registers:
285;       AX, DI
286;--------------------------------------------------------------------
287MoveCursorToScreenTopLeftCorner:
288    xor     ax, ax          ; Top left corner (0, 0)
289    ; Fall to HotkeyBar_RestoreCursorCoordinatesFromAX
290
291
292;--------------------------------------------------------------------
293; HotkeyBar_RestoreCursorCoordinatesFromAX
294;   Parameters:
295;       Nothing
296;   Returns:
297;       Nothing
298;   Corrupts registers:
299;       AX, DI
300;--------------------------------------------------------------------
301HotkeyBar_RestoreCursorCoordinatesFromAX:
302    CALL_DISPLAY_LIBRARY    SetCursorCoordinatesFromAX
303    ret
304
305
306;--------------------------------------------------------------------
307; ScanHotkeysFromKeyBufferAndStoreToBootvars
308;   Parameters:
309;       DS:     RAMVARS segment
310;       ES:     BDA segment (zero)
311;   Returns:
312;       Nothing
313;   Corrupts registers:
314;       AX, CX
315;--------------------------------------------------------------------
316ScanHotkeysFromKeyBufferAndStoreToBootvars:
317    call    Keyboard_GetKeystrokeToAX
318    jz      SHORT NoHotkeyToProcess
319
320    ePUSH_T cx, ScanHotkeysFromKeyBufferAndStoreToBootvars
321    ; Fall to HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
322
323
324;--------------------------------------------------------------------
325; HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
326;   Parameters:
327;       AL:     Hotkey ASCII code
328;       AH:     Hotkey Scancode
329;       DS:     RAMVARS segment
330;       ES:     BDA segment (zero)
331;   Returns:
332;       CF:     Set if valid keystroke
333;               Clear if invalid keystroke
334;   Corrupts registers:
335;       AX, CX, DI
336;--------------------------------------------------------------------
337HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX:
338    ; Boot menu
339%ifdef MODULE_BOOT_MENU
340    cmp     ah, BOOT_MENU_HOTKEY_SCANCODE   ; Display Boot Menu?
341    je      SHORT .StoreFunctionHotkeyFromAH
342%endif
343
344    ; ROM Boot
345    cmp     ah, ROM_BOOT_HOTKEY_SCANCODE    ; ROM Boot?
346    je      SHORT .StoreFunctionHotkeyFromAH
347
348    ; Drive letter hotkeys remaining, allow 'a' to 'z'
349    call    Char_IsLowerCaseLetterInAL
350    jnc     SHORT .KeystrokeIsNotValidHotkey
351    call    Char_ChangeCaseInAL     ; We want to print upper case letters
352
353    ; Clear HD First flag to assume Floppy Drive hotkey
354    mov     di, BOOTVARS.hotkeyVars+HOTKEYVARS.bFlags
355    and     BYTE [es:di], ~FLG_HOTKEY_HD_FIRST
356
357    ; Determine if Floppy or Hard Drive hotkey
358    eMOVZX  cx, al                  ; Clear CH to clear scancode
359    call    HotkeyBar_GetLetterForFirstHardDriveToAX
360    cmp     cl, al
361    jb      SHORT .StoreDriveLetter ; Store Floppy Drive letter
362
363    ; Store Hard Drive letter
364    or      BYTE [es:di], FLG_HOTKEY_HD_FIRST
365
366.StoreDriveLetter:
367    adc     di, BYTE 0          ; Add 1 if Floppy Drive
368    xchg    ax, cx
369    mov     [es:di+1], al       ; AH = zero to clear function hotkey
370
371.StoreFunctionHotkeyFromAH:
372    mov     [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode], ah
373    stc     ; Valid hotkey
374
375.KeystrokeIsNotValidHotkey:
376NoHotkeyToProcess:
377    ret
378
379
380;--------------------------------------------------------------------
381; HotkeyBar_GetSecondaryBootDriveNumberToDL
382; HotkeyBar_GetPrimaryBootDriveNumberToDL
383;   Parameters:
384;       DS:     RAMVARS segment
385;       ES:     BDA segment (zero)
386;   Returns:
387;       DL:     Drive selected as boot device
388;   Corrupts registers:
389;       AX, DH
390;--------------------------------------------------------------------
391HotkeyBar_GetSecondaryBootDriveNumberToDL:
392    mov     dx, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.wHddAndFddLetters]
393    xchg    dl, dh
394    jmp     SHORT GetBootDriveNumberFromLettersInDX
395
396HotkeyBar_GetPrimaryBootDriveNumberToDL:
397    mov     dx, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.wHddAndFddLetters]
398GetBootDriveNumberFromLettersInDX:
399    test    BYTE [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bFlags], FLG_HOTKEY_HD_FIRST
400    eCMOVZ  dl, dh
401    ; Fall to ConvertDriveLetterInDLtoDriveNumber
402
403
404;--------------------------------------------------------------------
405; ConvertDriveLetterInDLtoDriveNumber
406;   Parameters:
407;       DS:     RAMVARS segment
408;       DL:     Drive letter ('A'...)
409;   Returns:
410;       DL:     Drive number (0xh for Floppy Drives, 8xh for Hard Drives)
411;   Corrupts registers:
412;       AX, DH
413;--------------------------------------------------------------------
414ConvertDriveLetterInDLtoDriveNumber:
415    call    HotkeyBar_GetLetterForFirstHardDriveToAX
416    cmp     dl, al
417    jb      SHORT .ConvertLetterInDLtoFloppyDriveNumber
418
419    ; Convert letter in DL to Hard Drive number
420    sub     dl, al
421    or      dl, 80h
422    ret
423
424.ConvertLetterInDLtoFloppyDriveNumber:
425    sub     dl, DEFAULT_FLOPPY_DRIVE_LETTER
426    ret
427
428
429;--------------------------------------------------------------------
430; HotkeyBar_ConvertDriveNumberFromDLtoDriveLetter
431;   Parameters:
432;       DL:     Drive number (0xh for Floppy Drives, 8xh for Hard Drives)
433;       DS:     RAMVARS Segment
434;   Returns:
435;       DL:     Drive letter ('A'...)
436;       CF:     Set if Hard Drive
437;               Clear if Floppy Drive
438;   Corrupts registers:
439;       AX
440;--------------------------------------------------------------------
441HotkeyBar_ConvertDriveNumberFromDLtoDriveLetter:
442    test    dl, dl
443    jns     SHORT .GetDefaultFloppyDrive
444
445    ; Store default hard drive to boot from
446    call    HotkeyBar_GetLetterForFirstHardDriveToAX
447    sub     dl, 80h
448    add     dl, al
449    stc
450    ret
451
452.GetDefaultFloppyDrive:
453    add     dl, DEFAULT_FLOPPY_DRIVE_LETTER     ; Clears CF
454    ret
455
456
457;--------------------------------------------------------------------
458; Returns letter for first hard disk. Usually it will be 'C' but it
459; can be higher if more than two floppy drives are found.
460;
461; HotkeyBar_GetLetterForFirstHardDriveToAX
462;   Parameters:
463;       DS:     RAMVARS segment
464;   Returns:
465;       AX:     Upper case letter for first hard disk
466;   Corrupts registers:
467;       Nothing
468;--------------------------------------------------------------------
469HotkeyBar_GetLetterForFirstHardDriveToAX:
470    call    FloppyDrive_GetCountToAX
471    add     al, DEFAULT_FLOPPY_DRIVE_LETTER
472    MAX_U   al, DEFAULT_HARD_DRIVE_LETTER
473    ret
Note: See TracBrowser for help on using the repository browser.