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

Last change on this file since 520 was 505, checked in by krille_n_@…, 12 years ago

Changes:

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