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
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.