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

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

Changes to XTIDE Universal BIOS:

  • Swapping Floppy and Hard Drives at the same time work again (broke in r492).
  • Hotkeys again work in boot menu (broke in r492).
File size: 13.4 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
71    test    ax, ax      ; Any Floppy Drives?
72    jz      SHORT .SkipFloppyDriveHotkeys
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
[392]77    call    FormatDriveHotkeyString
78
79.SkipFloppyDriveHotkeys:
80    ; Fall to .PrintHardDriveHotkeys
81
82;--------------------------------------------------------------------
83; .PrintHardDriveHotkeys
84;   Parameters:
85;       DS:     RAMVARS segment
86;       ES:     BDA segment (zero)
87;   Returns:
88;       Nothing
89;   Corrupts registers:
90;       AX, CX, DX, SI, DI
91;--------------------------------------------------------------------
[492]92    call    DriveXlate_GetLetterForFirstHardDriveToAX
[392]93    mov     ah, ANGLE_QUOTE_RIGHT
[500]94    mov     cl, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bHddLetter]
[492]95    mov     di, g_szHDD
[392]96    call    FormatDriveHotkeyString
97    ; Fall to .PrintBootMenuHotkey
98
99;--------------------------------------------------------------------
100; .PrintBootMenuHotkey
101;   Parameters:
102;       ES:     BDA segment (zero)
103;   Returns:
104;       Nothing
105;   Corrupts registers:
106;       AX, CX, DX, SI, DI
107;--------------------------------------------------------------------
108.PrintBootMenuHotkey:
109%ifdef MODULE_BOOT_MENU
[492]110    mov     ax, BOOT_MENU_HOTKEY_SCANCODE | ('2' << 8)
111    mov     di, g_szBootMenu
[392]112    call    FormatFunctionHotkeyString
113%endif
[492]114    ; Fall to .PrintComDetectHotkey
[392]115
116;--------------------------------------------------------------------
[492]117; .PrintComDetectHotkey
118;   Parameters:
119;       ES:     BDA segment (zero)
120;   Returns:
121;       Nothing
122;   Corrupts registers:
123;       AX, CX, DX, SI, DI
124;--------------------------------------------------------------------
125.PrintComDetectHotkey:
126%ifdef MODULE_SERIAL
127    mov     ax, COM_DETECT_HOTKEY_SCANCODE | ('6' << 8)
128    mov     di, g_szHotComDetect
129    call    FormatFunctionHotkeyString
130%endif
[505]131    ; Fall to .PrintRomBootHotkey
[492]132
133;--------------------------------------------------------------------
[392]134; .PrintRomBootHotkey
135;   Parameters:
136;       ES:     BDA segment (zero)
137;   Returns:
138;       Nothing
139;   Corrupts registers:
140;       AX, CX, DX, SI, DI
141;--------------------------------------------------------------------
142.PrintRomBootHotkey:
[492]143    mov     ax, ROM_BOOT_HOTKEY_SCANCODE | ('8' << 8)
144    mov     di, g_szRomBoot
[392]145    call    FormatFunctionHotkeyString
146    ; Fall to .EndHotkeyBarRendering
147
148;--------------------------------------------------------------------
149; .EndHotkeyBarRendering
150;   Parameters:
151;       Stack:  Screen coordinates before drawing Hotkey Bar
152;   Returns:
153;       Nothing
154;   Corrupts registers:
155;       AX, CX, DI
156;--------------------------------------------------------------------
157.EndHotkeyBarRendering:
158    call    HotkeyBar_ClearRestOfTopRow
159    pop     ax
160    jmp     SHORT HotkeyBar_RestoreCursorCoordinatesFromAX
161
162
163;--------------------------------------------------------------------
164; HotkeyBar_ClearRestOfTopRow
165;   Parameters:
166;       Nothing
167;   Returns:
168;       Nothing
169;   Corrupts registers:
170;       AX, CX, DI
171;--------------------------------------------------------------------
172HotkeyBar_ClearRestOfTopRow:
[505]173    CALL_DISPLAY_LIBRARY GetColumnsToALandRowsToAH
[392]174    eMOVZX  cx, al
[505]175    CALL_DISPLAY_LIBRARY GetSoftwareCoordinatesToAX
[392]176    sub     cl, al
177    mov     al, ' '
[505]178    JMP_DISPLAY_LIBRARY PrintRepeatedCharacterFromALwithCountInCX
[392]179
180
181;--------------------------------------------------------------------
182; FormatDriveHotkeyString
183;   Parameters:
184;       CL:         Drive letter hotkey from BOOTVARS
[492]185;       AL:         First character for drive key string
186;       AH:         Second character for drive key string (ANGLE_QUOTE_RIGHT)
[392]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;--------------------------------------------------------------------
[492]194;; No work to do before going into FormatFunctionHotkeyString
195FormatDriveHotkeyString  equ  GetNonSelectedHotkeyDescriptionAttributeToDX
[392]196
197;--------------------------------------------------------------------
198; FormatFunctionHotkeyString
199;   Parameters:
[492]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
[392]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:
[492]211    xor     cx, cx      ; Null character, eaten in output routines
[392]212
[492]213    cmp     [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode], al
214    mov     al, 'F'     ; Replace scancode with character for output
[392]215
216%ifdef MODULE_BOOT_MENU
[492]217
[392]218    mov     si, ATTRIBUTE_CHARS.cHurryTimeout       ; Selected hotkey
[505]219    je      SHORT GetDescriptionAttributeToDX       ; From compare with bScancode above
[392]220
221GetNonSelectedHotkeyDescriptionAttributeToDX:
222    mov     si, ATTRIBUTE_CHARS.cHighlightedItem    ; Unselected hotkey
223
224    ; Display Library should not be called like this
225GetDescriptionAttributeToDX:
[492]226    xchg    dx, ax
[392]227    call    MenuAttribute_GetToAXfromTypeInSI
228    xchg    dx, ax                  ; DX = Description attribute
[505]229    ;;  fall through to PushHotkeyParamsAndFormat
[392]230
231
[500]232%else ; if no MODULE_BOOT_MENU - No boot menu so use simpler attributes
233
[410]234    mov     dx, (COLOR_ATTRIBUTE(COLOR_YELLOW, COLOR_CYAN) << 8) | MONO_REVERSE_BLINK
[505]235    je      SHORT SelectAttributeFromDHorDLbasedOnVideoMode     ; From compare with bScancode above
[392]236
237GetNonSelectedHotkeyDescriptionAttributeToDX:
[410]238    mov     dx, (COLOR_ATTRIBUTE(COLOR_BLACK, COLOR_CYAN) << 8) | MONO_REVERSE
[492]239
[410]240SelectAttributeFromDHorDLbasedOnVideoMode:
[500]241    mov     ch, [es:BDA.bVidMode]       ; We only need to preserve CL
242    shr     ch, 1
[410]243    jnc     SHORT .AttributeLoadedToDL  ; Black & White modes
[500]244    shr     ch, 1
[410]245    jnz     SHORT .AttributeLoadedToDL  ; MDA
246    mov     dl, dh
247.AttributeLoadedToDL:
[505]248    ;;  fall through to PushHotkeyParamsAndFormat
[410]249
[492]250%endif ; MODULE_BOOT_MENU
[392]251
252
253;--------------------------------------------------------------------
254; PushHotkeyParamsAndFormat
255;   Parameters:
[500]256;       AL:         First character
257;       AH:         Second character
[392]258;       DX:         Description Attribute
259;       CX:         Description string parameter
[492]260;       CS:DI:      Description string
[392]261;   Returns:
262;       Nothing
263;   Corrupts registers:
264;       AX, SI, DI
265;--------------------------------------------------------------------
266PushHotkeyParamsAndFormat:
267    push    bp
268    mov     bp, sp
269
[492]270    mov     si, MONO_BRIGHT
[392]271
[492]272    push    si              ; Key attribute
273    push    ax              ; First Character
274    mov     al, ah
275    push    ax              ; Second Character
276
[392]277    push    dx              ; Description attribute
[492]278    push    di              ; Description string
[392]279    push    cx              ; Description string parameter
[505]280
[492]281    push    si              ; Key attribute for last space
[392]282
283    mov     si, g_szHotkey
284    jmp     DetectPrint_FormatCSSIfromParamsInSSBP
285
286
287;--------------------------------------------------------------------
288; MoveCursorToScreenTopLeftCorner
289;   Parameters:
290;       Nothing
291;   Returns:
292;       Nothing
293;   Corrupts registers:
294;       AX, DI
295;--------------------------------------------------------------------
296MoveCursorToScreenTopLeftCorner:
297    xor     ax, ax          ; Top left corner (0, 0)
298    ; Fall to HotkeyBar_RestoreCursorCoordinatesFromAX
299
300
301;--------------------------------------------------------------------
302; HotkeyBar_RestoreCursorCoordinatesFromAX
303;   Parameters:
304;       Nothing
305;   Returns:
306;       Nothing
307;   Corrupts registers:
308;       AX, DI
309;--------------------------------------------------------------------
310HotkeyBar_RestoreCursorCoordinatesFromAX:
[505]311    JMP_DISPLAY_LIBRARY SetCursorCoordinatesFromAX
[392]312
313
314;--------------------------------------------------------------------
[528]315; HotkeyBar_StoreHotkeyToBootvarsForDriveNumberInDL
[395]316;   Parameters:
317;       DS:     RAMVARS segment
318;       ES:     BDA segment (zero)
[528]319;       DL:     Drive Number
320;   Returns:
321;       Nothing
322;   Corrupts registers:
323;       AX, CX, DL, DI
324;--------------------------------------------------------------------
325HotkeyBar_StoreHotkeyToBootvarsForDriveNumberInDL:
326    call    DriveXlate_ConvertDriveNumberFromDLtoDriveLetter
327    ; Fall to StoreHotkeyToBootvarsForDriveLetterInDL
328
329
330;--------------------------------------------------------------------
331; StoreHotkeyToBootvarsForDriveLetterInDL
332;   Parameters:
333;       DS:     RAMVARS segment
334;       ES:     BDA segment (zero)
[395]335;       DL:     Drive Letter ('A'...)
336;   Returns:
337;       Nothing
338;   Corrupts registers:
339;       AX, CX, DI
340;--------------------------------------------------------------------
[528]341StoreHotkeyToBootvarsForDriveLetterInDL:
[395]342    eMOVZX  ax, dl
[505]343    or      al, 32  ; Upper case drive letter to lower case keystroke
[395]344    jmp     SHORT HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
345
346
347;--------------------------------------------------------------------
[528]348; ScanHotkeysFromKeyBufferAndStoreToBootvars
[392]349;   Parameters:
350;       DS:     RAMVARS segment
351;       ES:     BDA segment (zero)
352;   Returns:
[492]353;       AL:     Last scancode value
[392]354;   Corrupts registers:
[492]355;       AH, CX
[392]356;--------------------------------------------------------------------
[528]357ScanHotkeysFromKeyBufferAndStoreToBootvars:
[392]358    call    Keyboard_GetKeystrokeToAX
359    jz      SHORT NoHotkeyToProcess
360
[528]361    ; Prepare to read another key from buffer
362    ePUSH_T cx, ScanHotkeysFromKeyBufferAndStoreToBootvars
[392]363    ; Fall to HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
364
365
366;--------------------------------------------------------------------
367; HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
368;   Parameters:
369;       AL:     Hotkey ASCII code
370;       AH:     Hotkey Scancode
371;       DS:     RAMVARS segment
372;       ES:     BDA segment (zero)
373;   Returns:
[492]374;       AL:     Last scancode seen
[528]375;       CF:     Set if valid hotkey in AL
376;               Clear if scancode in AL is not for any hotkey
[392]377;   Corrupts registers:
[492]378;       AH, CX, DI
[392]379;--------------------------------------------------------------------
380HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX:
[492]381    mov     di, BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode
[392]382
[492]383    ; All scancodes are saved, even if it wasn't a drive letter,
384    ; which also covers our function key case.  Invalid function keys
[505]385    ; will not do anything (won't be printed, won't be accepted as input)
[492]386    mov     [es:di], ah
[505]387
[392]388    ; Drive letter hotkeys remaining, allow 'a' to 'z'
389    call    Char_IsLowerCaseLetterInAL
[492]390    jnc     SHORT .KeystrokeIsNotValidDriveLetter
[505]391    and     al, ~32                 ; We want to print upper case letters
[392]392
393    ; Clear HD First flag to assume Floppy Drive hotkey
[492]394    dec     di
[392]395    and     BYTE [es:di], ~FLG_HOTKEY_HD_FIRST
396
397    ; Determine if Floppy or Hard Drive hotkey
[505]398    xchg    cx, ax
[492]399    call    DriveXlate_GetLetterForFirstHardDriveToAX
[392]400    cmp     cl, al
401    jb      SHORT .StoreDriveLetter ; Store Floppy Drive letter
402
403    ; Store Hard Drive letter
404    or      BYTE [es:di], FLG_HOTKEY_HD_FIRST
405
406.StoreDriveLetter:
[505]407    sbb     di, BYTE 1              ; Sub CF if Floppy Drive
[392]408    xchg    ax, cx
[505]409    mov     [es:di], al
[528]410    stc                             ; Valid hotkey scancode returned in AL
[392]411
[505]412.KeystrokeIsNotValidDriveLetter:
[392]413NoHotkeyToProcess:
[492]414    mov     al, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode]
[392]415    ret
416
[528]417
[392]418;--------------------------------------------------------------------
[492]419; HotkeyBar_GetBootDriveNumbersToDX
[392]420;   Parameters:
421;       DS:     RAMVARS segment
422;       ES:     BDA segment (zero)
423;   Returns:
[492]424;       DX:     Drives selected as boot device, DL is primary
[392]425;   Corrupts registers:
[492]426;       AX
[392]427;--------------------------------------------------------------------
[492]428HotkeyBar_GetBootDriveNumbersToDX:
[500]429    mov     dx, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.wFddAndHddLetters]
[505]430    test    BYTE [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bFlags], FLG_HOTKEY_HD_FIRST
[492]431    jnz     .noflip
[392]432    xchg    dl, dh
[505]433.noflip:
[492]434    call    DriveXlate_ConvertDriveLetterInDLtoDriveNumber
435    xchg    dl, dh
[505]436    ; Fall to HotkeyBar_FallThroughTo_DriveXlate_ConvertDriveLetterInDLtoDriveNumber
[392]437
[505]438HotkeyBar_FallThroughTo_DriveXlate_ConvertDriveLetterInDLtoDriveNumber:
439
Note: See TracBrowser for help on using the repository browser.