source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Boot/BootMenuEvent.asm@ 135

Last change on this file since 135 was 135, checked in by Tomi Tilli, 14 years ago

Changes to XTIDE Universal BIOS:

  • Boot menu now displays drive number (untested)
  • Timeout counter implemented to boot menu (untested)
File size: 5.2 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Boot Menu event handler for menu library callbacks.
3
4; Section containing code
5SECTION .text
6
7struc ITEM_TYPE_REFRESH
8 .HardDisk resb 2
9 .FloppyDrive resb 2
10endstruc
11
12
13;--------------------------------------------------------------------
14; BootMenuEvent_Handler
15; Common parameters for all events:
16; BX: Menu event (anything from MENUEVENT struct)
17; SS:BP: Menu library handle
18; Common return values for all events:
19; CF: Set if event processed
20; Cleared if event not processed
21; Corrupts registers:
22; All
23;--------------------------------------------------------------------
24ALIGN JUMP_ALIGN
25BootMenuEvent_Handler:
26 cmp bx, BYTE MENUEVENT.RefreshItemFromCX ; Above last supported item?
27 ja SHORT .EventNotHandled
28 jmp [cs:bx+.rgfnEventSpecificHandlers]
29.EventNotHandled:
30 clc
31 ret
32
33ALIGN WORD_ALIGN
34.rgfnEventSpecificHandlers:
35 dw .InitializeMenuinitFromDSSI ; MENUEVENT.InitializeMenuinitFromDSSI
36 dw .EventCompleted ; MENUEVENT.ExitMenu
37 dw .EventNotHandled ; MENUEVENT.IdleProcessing
38 dw .ItemHighlightedFromCX ; MENUEVENT.ItemHighlightedFromCX
39 dw .ItemSelectedFromCX ; MENUEVENT.ItemSelectedFromCX
40 dw .KeyStrokeInAX ; MENUEVENT.KeyStrokeInAX
41 dw BootMenuPrint_TitleStrings ; MENUEVENT.RefreshTitle
42 dw .RefreshInformation ; MENUEVENT.RefreshInformation
43 dw .RefreshItemFromCX ; MENUEVENT.RefreshItemFromCX
44
45
46; Parameters:
47; DS:SI: Ptr to MENUINIT struct to initialize
48; Returns:
49; DS:SI: Ptr to initialized MENUINIT struct
50ALIGN JUMP_ALIGN
51.InitializeMenuinitFromDSSI:
52 push ds
53 call RamVars_GetSegmentToDS
54 call .GetDefaultMenuitemToDX
55 call BootMenu_GetMenuitemCountToAX
56 pop ds
57 mov [si+MENUINIT.wItems], ax
58 mov [si+MENUINIT.wHighlightedItem], dx
59 mov WORD [si+MENUINIT.wTitleAndInfoLines], BOOT_MENU_TITLE_AND_INFO_LINES
60 mov BYTE [si+MENUINIT.bWidth], BOOT_MENU_WIDTH
61 call BootMenu_GetHeightToAHwithItemCountInAL
62 mov [si+MENUINIT.bHeight], ah
63 mov al, TICKS_PER_SECOND
64 mul BYTE [cs:ROMVARS.bBootDelay]
65 CALL_MENU_LIBRARY StartSelectionTimeoutWithTicksInAX
66 stc
67 ret
68
69ALIGN JUMP_ALIGN
70.GetDefaultMenuitemToDX:
71 mov dl, [cs:ROMVARS.bBootDrv] ; Default boot drive
72 call BootMenu_IsDriveInSystem
73 jnc SHORT .DoNotSetDefaultMenuitem
74 call DriveXlate_SetDriveToSwap
75 jmp BootMenu_GetMenuitemToDXforDriveInDL
76ALIGN JUMP_ALIGN
77.DoNotSetDefaultMenuitem:
78 xor dx, dx ; Whatever appears first on boot menu
79 ret
80
81
82; Parameters:
83; CX: Index of new highlighted item
84; DX: Index of previously highlighted item or NO_ITEM_HIGHLIGHTED
85ALIGN JUMP_ALIGN
86.ItemHighlightedFromCX:
87 push cx
88 push dx
89 call RamVars_GetSegmentToDS
90 call DriveXlate_Reset
91 call BootMenu_GetDriveToDXforMenuitemInCX
92 call DriveXlate_SetDriveToSwap
93 pop ax ; Update previous item
94 CALL_MENU_LIBRARY RefreshItemFromAX
95 pop ax ; Update new item
96 CALL_MENU_LIBRARY RefreshItemFromAX
97 CALL_MENU_LIBRARY RefreshInformation
98 stc
99 ret
100
101
102; Parameters:
103; AL: ASCII character for the key
104; AH: Keyboard library scan code for the key
105ALIGN JUMP_ALIGN
106.KeyStrokeInAX:
107 cmp ah, ROM_BOOT_HOTKEY_SCANCODE
108 jne SHORT .CheckDriveHotkeys
109 jmp Int19hMenu_RomBoot
110ALIGN JUMP_ALIGN
111.CheckDriveHotkeys:
112 call BootMenu_GetMenuitemToAXforAsciiHotkeyInAL
113 cmp ax, [bp+MENUINIT.wItems]
114 jae SHORT .EventCompleted ; Invalid key
115 CALL_MENU_LIBRARY HighlightItemFromAX
116 ; Fall to .ItemSelectedFromCX
117
118
119; Parameters:
120; CX: Index of selected item
121ALIGN JUMP_ALIGN
122.ItemSelectedFromCX:
123 CALL_MENU_LIBRARY Close
124.EventCompleted:
125 stc
126 ret
127
128
129; Parameters:
130; CX: Index of item to refresh
131; Cursor has been positioned to the beginning of item line
132ALIGN JUMP_ALIGN
133.RefreshItemFromCX:
134 mov bx, .rgwItemTypeRefresh
135 jmp SHORT .RefreshItemOrInformationWithJumpTableInCSBX
136
137
138; Parameters:
139; CX: Index of highlighted item
140; Cursor has been positioned to the beginning of first line
141ALIGN JUMP_ALIGN
142.RefreshInformation:
143 mov bx, .rgwInformationItemTypeRefresh
144 ; Fall to .RefreshItemOrInformationWithJumpTableInCSBX
145
146;--------------------------------------------------------------------
147; RefreshItemOrInformationWithJumpTableInCSBX
148; Parameters:
149; CX: Index of selected menuitem
150; CS:BX: Ptr to ITEM_TYPE_REFRESH jump table
151; Returns:
152; CF: set since event processed
153;--------------------------------------------------------------------
154.RefreshItemOrInformationWithJumpTableInCSBX:
155 cmp cl, NO_ITEM_HIGHLIGHTED
156 je SHORT .EventCompleted
157
158 call RamVars_GetSegmentToDS
159 call BootMenu_GetDriveToDXforMenuitemInCX
160 test dl, dl ; Floppy drive?
161 jns SHORT .DrawFloppyDrive
162 jmp [cs:bx+ITEM_TYPE_REFRESH.HardDisk]
163ALIGN JUMP_ALIGN
164.DrawFloppyDrive:
165 jmp [cs:bx+ITEM_TYPE_REFRESH.FloppyDrive]
166
167; Jump tables for .RefreshItemOrInformationWithJumpTableInCSBX
168ALIGN WORD_ALIGN
169.rgwItemTypeRefresh:
170istruc ITEM_TYPE_REFRESH
171 at ITEM_TYPE_REFRESH.HardDisk, dw BootMenuPrint_HardDiskMenuitem
172 at ITEM_TYPE_REFRESH.FloppyDrive, dw BootMenuPrint_FloppyMenuitem
173iend
174.rgwInformationItemTypeRefresh:
175istruc ITEM_TYPE_REFRESH
176 at ITEM_TYPE_REFRESH.HardDisk, dw BootMenuPrint_HardDiskMenuitemInformation
177 at ITEM_TYPE_REFRESH.FloppyDrive, dw BootMenuPrint_FloppyMenuitemInformation
178iend
Note: See TracBrowser for help on using the repository browser.