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

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

Changes:

  • Added a new define (USE_UNDOC_INTEL) that enables optimizations possible by using undocumented instructions available on all Intel processors and truly compatible clones. AFAIK the only exceptions are the NEC V-series and the Sony CXQ70108 processors so this option should be safe for use on the AT builds.
  • Building BIOSDRVS or the BIOS without MODULE_STRINGS_COMPRESSED would fail due to the recent code exclusions so I changed them a bit. Also fixed the mistaken change to Main.asm
  • Changed the Tandy specific info in Configuration_FullMode.txt so it matches the info in the Wiki.
  • Optimizations and fixes in general.
File size: 14.8 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;       ES:     BDA segment (zero)
212;   Returns:
213;       DX:     Description Attribute
214;   Corrupts registers:
215;       AX
216;--------------------------------------------------------------------
217%ifdef MODULE_BOOT_MENU
218GetSelectedHotkeyDescriptionAttributeToDX:
219    push    si
220    mov     si, ATTRIBUTE_CHARS.cHurryTimeout       ; Selected hotkey
221    jmp     SHORT GetDescriptionAttributeToDX
222
223GetNonSelectedHotkeyDescriptionAttributeToDX:
224    push    si
225    mov     si, ATTRIBUTE_CHARS.cHighlightedItem    ; Unselected hotkey
226
227    ; Display Library should not be called like this
228GetDescriptionAttributeToDX:
229    call    MenuAttribute_GetToAXfromTypeInSI
230    pop     si
231    xchg    dx, ax                  ; DX = Description attribute
232    ret
233
234%else   ; No boot menu so use simpler attributes
235
236GetSelectedHotkeyDescriptionAttributeToDX:
237    mov     dx, (COLOR_ATTRIBUTE(COLOR_YELLOW, COLOR_CYAN) << 8) | MONO_REVERSE_BLINK
238    jmp     SHORT SelectAttributeFromDHorDLbasedOnVideoMode
239
240GetNonSelectedHotkeyDescriptionAttributeToDX:
241    mov     dx, (COLOR_ATTRIBUTE(COLOR_BLACK, COLOR_CYAN) << 8) | MONO_REVERSE
242SelectAttributeFromDHorDLbasedOnVideoMode:
243    mov     al, [es:BDA.bVidMode]
244    shr     al, 1
245    jnc     SHORT .AttributeLoadedToDL  ; Black & White modes
246    shr     al, 1
247    jnz     SHORT .AttributeLoadedToDL  ; MDA
248    mov     dl, dh
249.AttributeLoadedToDL:
250    ret
251
252%endif
253
254
255;--------------------------------------------------------------------
256; PushHotkeyParamsAndFormat
257;   Parameters:
258;       DI low:     First character
259;       DI high:    Second character
260;       DX:         Description Attribute
261;       CX:         Description string parameter
262;       CS:SI:      Description string
263;   Returns:
264;       Nothing
265;   Corrupts registers:
266;       AX, SI, DI
267;--------------------------------------------------------------------
268PushHotkeyParamsAndFormat:
269    push    bp
270    mov     bp, sp
271
272    mov     ax, MONO_BRIGHT
273    push    ax              ; Key attribute
274    xchg    ax, di
275    push    ax              ; First character
276    xchg    al, ah
277    push    ax              ; Second character
278
279    push    dx              ; Description attribute
280    push    si              ; Description string
281    push    cx              ; Description string parameter
282
283    push    di              ; Key attribute for last space
284    mov     si, g_szHotkey
285    jmp     DetectPrint_FormatCSSIfromParamsInSSBP
286
287
288;--------------------------------------------------------------------
289; MoveCursorToScreenTopLeftCorner
290;   Parameters:
291;       Nothing
292;   Returns:
293;       Nothing
294;   Corrupts registers:
295;       AX, DI
296;--------------------------------------------------------------------
297MoveCursorToScreenTopLeftCorner:
298    xor     ax, ax          ; Top left corner (0, 0)
299    ; Fall to HotkeyBar_RestoreCursorCoordinatesFromAX
300
301
302;--------------------------------------------------------------------
303; HotkeyBar_RestoreCursorCoordinatesFromAX
304;   Parameters:
305;       Nothing
306;   Returns:
307;       Nothing
308;   Corrupts registers:
309;       AX, DI
310;--------------------------------------------------------------------
311HotkeyBar_RestoreCursorCoordinatesFromAX:
312    CALL_DISPLAY_LIBRARY    SetCursorCoordinatesFromAX
313    ret
314
315
316;--------------------------------------------------------------------
317; HotkeyBar_StoreHotkeyToBootvarsForDriveLetterInDL
318;   Parameters:
319;       DS:     RAMVARS segment
320;       ES:     BDA segment (zero)
321;       DL:     Drive Letter ('A'...)
322;   Returns:
323;       Nothing
324;   Corrupts registers:
325;       AX, CX, DI
326;--------------------------------------------------------------------
327HotkeyBar_StoreHotkeyToBootvarsForDriveLetterInDL:
328    eMOVZX  ax, dl
329    xor     al, 32  ; Upper case drive letter to lower case keystroke
330    jmp     SHORT HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
331
332
333;--------------------------------------------------------------------
334; ScanHotkeysFromKeyBufferAndStoreToBootvars
335;   Parameters:
336;       DS:     RAMVARS segment
337;       ES:     BDA segment (zero)
338;   Returns:
339;       Nothing
340;   Corrupts registers:
341;       AX, CX
342;--------------------------------------------------------------------
343ScanHotkeysFromKeyBufferAndStoreToBootvars:
344    call    Keyboard_GetKeystrokeToAX
345    jz      SHORT NoHotkeyToProcess
346
347    ePUSH_T cx, ScanHotkeysFromKeyBufferAndStoreToBootvars
348    ; Fall to HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
349
350
351;--------------------------------------------------------------------
352; HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX
353;   Parameters:
354;       AL:     Hotkey ASCII code
355;       AH:     Hotkey Scancode
356;       DS:     RAMVARS segment
357;       ES:     BDA segment (zero)
358;   Returns:
359;       CF:     Set if valid keystroke
360;               Clear if invalid keystroke
361;   Corrupts registers:
362;       AX, CX, DI
363;--------------------------------------------------------------------
364HotkeyBar_StoreHotkeyToBootvarsIfValidKeystrokeInAX:
365    ; Boot menu
366%ifdef MODULE_BOOT_MENU
367    cmp     ah, BOOT_MENU_HOTKEY_SCANCODE   ; Display Boot Menu?
368    je      SHORT .StoreFunctionHotkeyFromAH
369%endif
370
371    ; ROM Boot
372    cmp     ah, ROM_BOOT_HOTKEY_SCANCODE    ; ROM Boot?
373    je      SHORT .StoreFunctionHotkeyFromAH
374
375    ; Drive letter hotkeys remaining, allow 'a' to 'z'
376    call    Char_IsLowerCaseLetterInAL
377    jnc     SHORT .KeystrokeIsNotValidHotkey
378    xor     al, 32                  ; We want to print upper case letters
379
380    ; Clear HD First flag to assume Floppy Drive hotkey
381    mov     di, BOOTVARS.hotkeyVars+HOTKEYVARS.bFlags
382    and     BYTE [es:di], ~FLG_HOTKEY_HD_FIRST
383
384    ; Determine if Floppy or Hard Drive hotkey
385    eMOVZX  cx, al                  ; Clear CH to clear scancode
386    call    HotkeyBar_GetLetterForFirstHardDriveToAX
387    cmp     cl, al
388    jb      SHORT .StoreDriveLetter ; Store Floppy Drive letter
389
390    ; Store Hard Drive letter
391    or      BYTE [es:di], FLG_HOTKEY_HD_FIRST
392
393.StoreDriveLetter:
394    adc     di, BYTE 1          ; Add CF if Floppy Drive
395    xchg    ax, cx
396    mov     [es:di], al         ; AH = zero to clear function hotkey
397
398.StoreFunctionHotkeyFromAH:
399    mov     [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bScancode], ah
400    stc     ; Valid hotkey
401
402.KeystrokeIsNotValidHotkey:
403NoHotkeyToProcess:
404    ret
405
406
407;--------------------------------------------------------------------
408; HotkeyBar_GetSecondaryBootDriveNumberToDL
409; HotkeyBar_GetPrimaryBootDriveNumberToDL
410;   Parameters:
411;       DS:     RAMVARS segment
412;       ES:     BDA segment (zero)
413;   Returns:
414;       DL:     Drive selected as boot device
415;   Corrupts registers:
416;       AX, DH
417;--------------------------------------------------------------------
418HotkeyBar_GetSecondaryBootDriveNumberToDL:
419    mov     dx, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.wHddAndFddLetters]
420    xchg    dl, dh
421    jmp     SHORT GetBootDriveNumberFromLettersInDX
422
423HotkeyBar_GetPrimaryBootDriveNumberToDL:
424    mov     dx, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.wHddAndFddLetters]
425GetBootDriveNumberFromLettersInDX:
426    test    BYTE [es:BOOTVARS.hotkeyVars+HOTKEYVARS.bFlags], FLG_HOTKEY_HD_FIRST
427    eCMOVZ  dl, dh
428    ; Fall to HotkeyBar_ConvertDriveLetterInDLtoDriveNumber
429
430
431;--------------------------------------------------------------------
432; HotkeyBar_ConvertDriveLetterInDLtoDriveNumber
433;   Parameters:
434;       DS:     RAMVARS segment
435;       DL:     Drive letter ('A'...)
436;   Returns:
437;       DL:     Drive number (0xh for Floppy Drives, 8xh for Hard Drives)
438;   Corrupts registers:
439;       AX, DH
440;--------------------------------------------------------------------
441HotkeyBar_ConvertDriveLetterInDLtoDriveNumber:
442    call    HotkeyBar_GetLetterForFirstHardDriveToAX
443    cmp     dl, al
444    jb      SHORT .ConvertLetterInDLtoFloppyDriveNumber
445
446    ; Convert letter in DL to Hard Drive number
447    sub     dl, al
448    or      dl, 80h
449    ret
450
451.ConvertLetterInDLtoFloppyDriveNumber:
452    sub     dl, DEFAULT_FLOPPY_DRIVE_LETTER
453    ret
454
455
456;--------------------------------------------------------------------
457; HotkeyBar_ConvertDriveNumberFromDLtoDriveLetter
458;   Parameters:
459;       DL:     Drive number (0xh for Floppy Drives, 8xh for Hard Drives)
460;       DS:     RAMVARS Segment
461;   Returns:
462;       DL:     Drive letter ('A'...)
463;       CF:     Set if Hard Drive
464;               Clear if Floppy Drive
465;   Corrupts registers:
466;       AX
467;--------------------------------------------------------------------
468HotkeyBar_ConvertDriveNumberFromDLtoDriveLetter:
469    test    dl, dl
470    jns     SHORT .GetDefaultFloppyDrive
471
472    ; Store default hard drive to boot from
473    call    HotkeyBar_GetLetterForFirstHardDriveToAX
474    sub     dl, 80h
475    add     dl, al
476    stc
477    ret
478
479.GetDefaultFloppyDrive:
480    add     dl, DEFAULT_FLOPPY_DRIVE_LETTER     ; Clears CF
481    ret
482
483
484;--------------------------------------------------------------------
485; Returns letter for first hard disk. Usually it will be 'C' but it
486; can be higher if more than two floppy drives are found.
487;
488; HotkeyBar_GetLetterForFirstHardDriveToAX
489;   Parameters:
490;       DS:     RAMVARS segment
491;   Returns:
492;       AX:     Upper case letter for first hard disk
493;   Corrupts registers:
494;       Nothing
495;--------------------------------------------------------------------
496HotkeyBar_GetLetterForFirstHardDriveToAX:
497    call    FloppyDrive_GetCountToAX
498    add     al, DEFAULT_FLOPPY_DRIVE_LETTER
499    MAX_U   al, DEFAULT_HARD_DRIVE_LETTER
500    ret
Note: See TracBrowser for help on using the repository browser.