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

Last change on this file since 190 was 190, checked in by gregli@…, 12 years ago

More comments for changes to BootMenuEvent and BootMenuPrint.

File size: 6.3 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
7;--------------------------------------------------------------------
8; BootMenuEvent_Handler
9;   Common parameters for all events:
10;       BX:         Menu event (anything from MENUEVENT struct)
11;       SS:BP:      Menu library handle
12;   Common return values for all events:
13;       CF:         Set if event processed
14;                   Cleared if event not processed
15;   Corrupts registers:
16;       All
17;--------------------------------------------------------------------
18ALIGN JUMP_ALIGN
19BootMenuEvent_Handler:
20       
21%ifdef MENUEVENT_INLINE_OFFSETS
22       
23    add     bx, BootMenuEvent_Handler
24    jmp     bx
25
26MENUEVENT_InitializeMenuinitFromDSSI equ  (BootMenuEvent_Handler.InitializeMenuinitFromDSSI - BootMenuEvent_Handler)
27MENUEVENT_ExitMenu equ  (BootMenuEvent_Handler.EventCompleted - BootMenuEvent_Handler)
28MENUEVENT_ItemHighlightedFromCX equ (BootMenuEvent_Handler.ItemHighlightedFromCX - BootMenuEvent_Handler)
29MENUEVENT_ItemSelectedFromCX equ (BootMenuEvent_Handler.ItemSelectedFromCX - BootMenuEvent_Handler)
30MENUEVENT_KeyStrokeInAX equ (BootMenuEvent_Handler.KeyStrokeInAX - BootMenuEvent_Handler)
31MENUEVENT_RefreshTitle equ (BootMenuPrint_TitleStrings - BootMenuEvent_Handler)
32MENUEVENT_RefreshInformation equ (BootMenuEvent_Handler.RefreshInformation - BootMenuEvent_Handler)
33MENUEVENT_RefreshItemFromCX equ (BootMenuEvent_Handler.RefreshItemFromCX - BootMenuEvent_Handler)
34; 
35; Note that there is no entry for MENUEVENT_IdleProcessing.  If MENUEVENT_IDLEPROCESSING_ENABLE is not %defined, 
36; then the entry point will not be called (saving memory on this end and at the CALL point).
37;
38       
39%else
40       
41    cmp     bx, BYTE MENUEVENT.RefreshItemFromCX    ; Above last supported item?
42    ja      SHORT .EventNotHandled
43    jmp     [cs:bx+.rgfnEventSpecificHandlers]
44
45.EventNotHandled:
46    clc
47    ret
48       
49ALIGN WORD_ALIGN
50.rgfnEventSpecificHandlers:
51    dw      .InitializeMenuinitFromDSSI ; MENUEVENT.InitializeMenuinitFromDSSI
52    dw      .EventCompleted             ; MENUEVENT.ExitMenu
53    dw      .EventNotHandled            ; MENUEVENT.IdleProcessing
54    dw      .ItemHighlightedFromCX      ; MENUEVENT.ItemHighlightedFromCX
55    dw      .ItemSelectedFromCX         ; MENUEVENT.ItemSelectedFromCX
56    dw      .KeyStrokeInAX              ; MENUEVENT.KeyStrokeInAX
57    dw      BootMenuPrint_TitleStrings  ; MENUEVENT.RefreshTitle
58    dw      .RefreshInformation         ; MENUEVENT.RefreshInformation
59    dw      .RefreshItemFromCX          ; MENUEVENT.RefreshItemFromCX
60       
61%endif
62
63
64; Parameters:
65;   DS:SI:      Ptr to MENUINIT struct to initialize
66; Returns:
67;   DS:SI:      Ptr to initialized MENUINIT struct
68ALIGN JUMP_ALIGN
69.InitializeMenuinitFromDSSI:
70    push    ds
71    call    RamVars_GetSegmentToDS
72    call    .GetDefaultMenuitemToDX
73    call    BootMenu_GetMenuitemCountToAX
74    pop     ds
75    mov     [si+MENUINIT.wItems], ax
76    mov     [si+MENUINIT.wHighlightedItem], dx
77    mov     WORD [si+MENUINIT.wTitleAndInfoLines], BOOT_MENU_TITLE_AND_INFO_LINES
78    mov     BYTE [si+MENUINIT.bWidth], BOOT_MENU_WIDTH
79    call    BootMenu_GetHeightToAHwithItemCountInAL
80    mov     [si+MENUINIT.bHeight], ah
81    mov     ax, [cs:ROMVARS.wBootTimeout]
82    CALL_MENU_LIBRARY StartSelectionTimeoutWithTicksInAX
83    stc
84    ret
85
86ALIGN JUMP_ALIGN
87.GetDefaultMenuitemToDX:
88    mov     dl, [cs:ROMVARS.bBootDrv]   ; Default boot drive
89    call    BootMenu_IsDriveInSystem
90    jnc     SHORT .DoNotSetDefaultMenuitem
91    call    DriveXlate_SetDriveToSwap
92    jmp     BootMenu_GetMenuitemToDXforDriveInDL
93ALIGN JUMP_ALIGN
94.DoNotSetDefaultMenuitem:
95    xor     dx, dx                      ; Whatever appears first on boot menu
96    ret
97
98
99; Parameters:
100;   CX:         Index of new highlighted item
101;   DX:         Index of previously highlighted item or NO_ITEM_HIGHLIGHTED
102ALIGN JUMP_ALIGN
103.ItemHighlightedFromCX:
104    push    cx
105    call    RamVars_GetSegmentToDS
106    call    DriveXlate_Reset
107    call    BootMenu_GetDriveToDXforMenuitemInCX
108    call    DriveXlate_SetDriveToSwap
109
110    xor     ax, ax  ; Update first floppy drive (for translated drive number)
111    CALL_MENU_LIBRARY RefreshItemFromAX
112    mov     dl, 80h
113    call    BootMenu_GetMenuitemToDXforDriveInDL
114    xchg    ax, dx  ; Update first hard disk (for translated drive number)
115    CALL_MENU_LIBRARY RefreshItemFromAX
116    pop     ax      ; Update new item (for translated drive number)
117    CALL_MENU_LIBRARY RefreshItemFromAX
118    CALL_MENU_LIBRARY RefreshInformation
119    stc
120    ret
121
122
123; Parameters:
124;   AL:         ASCII character for the key
125;   AH:         Keyboard library scan code for the key
126ALIGN JUMP_ALIGN
127.KeyStrokeInAX:
128    cmp     ah, ROM_BOOT_HOTKEY_SCANCODE
129    jne     SHORT .CheckDriveHotkeys
130    jmp     Int19hMenu_RomBoot
131ALIGN JUMP_ALIGN
132.CheckDriveHotkeys:
133    call    BootMenu_GetMenuitemToAXforAsciiHotkeyInAL
134    cmp     ax, [bp+MENUINIT.wItems]
135    jae     SHORT .EventCompleted   ; Invalid key
136    CALL_MENU_LIBRARY HighlightItemFromAX
137    ; Fall to .ItemSelectedFromCX
138
139
140; Parameters:
141;   CX:         Index of selected item
142ALIGN JUMP_ALIGN
143.ItemSelectedFromCX:
144    CALL_MENU_LIBRARY Close
145.EventCompleted:
146    stc
147    ret
148
149
150; Parameters:
151;   CX:         Index of item to refresh
152;   Cursor has been positioned to the beginning of item line
153ALIGN JUMP_ALIGN
154.RefreshItemFromCX:
155    mov     bl,00h      ; will result in SF being clear in .RefreshItemOrInformation...
156    SKIP2B  dx          ; dx corrupted below by BootMenu_GetDriveToDXforMenuitemInCX
157    ; Fall to .RefreshInformation
158       
159; Parameters:
160;   CX:         Index of highlighted item
161;   Cursor has been positioned to the beginning of first line
162; NO ALIGN - in the shadow of SKIP2B
163.RefreshInformation:
164    mov     bl,040h     ;  will result in SF being set in .RefreshItemOrInformation...
165    ; Fall to .RefreshItemOrInformationWithJumpTableInCSBX
166
167;--------------------------------------------------------------------
168; RefreshItemOrInformationWithJumpTableInCSBX
169;   Parameters:
170;       CX:     Index of selected menuitem
171;       CS:BX:  Ptr to ITEM_TYPE_REFRESH jump table
172;   Returns:
173;       CF:     set since event processed
174;--------------------------------------------------------------------
175.RefreshItemOrInformationWithJumpTableInCSBX:
176    cmp     cl, NO_ITEM_HIGHLIGHTED
177    je      SHORT .EventCompleted
178
179    call    RamVars_GetSegmentToDS
180    call    BootMenu_GetDriveToDXforMenuitemInCX
181    or      bl,dl               ;  or drive number with bit from .RefreshItemFromCX or .RefreshInformation
182    shl     bl,1                ;  drive letter high order bit to CF, Item/Information bit to SF
183    jc      SHORT BootMenuPrint_HardDiskMenuitem
184       
185;;; 
186;;; Fall-through (to BootMenuPrint_FloppyMenuitem)
187;;; (checked at assembler time with the code after BootMenuPrint_FloppyMenuitem)
188;;;
189ALIGN JUMP_ALIGN
190BootMenuEvent_FallThroughToFloppyMenuitem: 
191
Note: See TracBrowser for help on using the repository browser.