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

Last change on this file since 596 was 596, checked in by krille_n_, 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
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]
[596]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
[596]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
[593]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:
[596]236    mov     si, ATTRIBUTE_CHARS.cHighlightedItem    ; Selected hotkey
[593]237    je      SHORT GetDescriptionAttributeToDX       ; From compare with bScancode above and from FormatDriveHotkeyString
[392]238
239GetNonSelectedHotkeyDescriptionAttributeToDX:
[596]240    mov     si, ATTRIBUTE_CHARS.cItem               ; Unselected hotkey
[392]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.