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

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

Changes to XTIDE Universal BIOS:

  • Booting with hotkey now properly maintains FD and HD drive swappings (it is now again possible to boot with both translated FD and HD drives).
  • Had to change file orders so compressed strings could be included after recent changes to Assembly Library size.
File size: 5.2 KB
RevLine 
[88]1; Project name  :   XTIDE Universal BIOS
[3]2; Description   :   Boot Menu event handler for menu library callbacks.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; BootMenuEvent_Handler
[88]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
[3]15;   Corrupts registers:
[88]16;       All
[3]17;--------------------------------------------------------------------
18ALIGN JUMP_ALIGN
19BootMenuEvent_Handler:
[202]20
[183]21%ifdef MENUEVENT_INLINE_OFFSETS
[202]22
[183]23    add     bx, BootMenuEvent_Handler
24    jmp     bx
[3]25
[183]26MENUEVENT_InitializeMenuinitFromDSSI equ  (BootMenuEvent_Handler.InitializeMenuinitFromDSSI - BootMenuEvent_Handler)
[241]27MENUEVENT_ExitMenu equ  (BootMenuEvent_EventCompleted - BootMenuEvent_Handler)
[183]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)
[241]32MENUEVENT_RefreshInformation equ (BootMenuPrint_RefreshInformation - BootMenuEvent_Handler)
33MENUEVENT_RefreshItemFromCX equ (BootMenuPrint_RefreshItem - BootMenuEvent_Handler)
[202]34;
35; Note that there is no entry for MENUEVENT_IdleProcessing.  If MENUEVENT_IDLEPROCESSING_ENABLE is not %defined,
[189]36; then the entry point will not be called (saving memory on this end and at the CALL point).
37;
[202]38
[183]39%else
[202]40
[189]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
[202]48
[3]49ALIGN WORD_ALIGN
[88]50.rgfnEventSpecificHandlers:
[241]51    dw      .InitializeMenuinitFromDSSI         ; MENUEVENT.InitializeMenuinitFromDSSI
52    dw      BootMenuEvent_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      BootMenuPrint_RefreshInformation    ; MENUEVENT.RefreshInformation
59    dw      BootMenuPrint_RefreshItem           ; MENUEVENT.RefreshItemFromCX
[202]60
[183]61%endif
[3]62
63
[88]64; Parameters:
65;   DS:SI:      Ptr to MENUINIT struct to initialize
66; Returns:
67;   DS:SI:      Ptr to initialized MENUINIT struct
[3]68ALIGN JUMP_ALIGN
[88]69.InitializeMenuinitFromDSSI:
70    push    ds
71    call    RamVars_GetSegmentToDS
72    call    .GetDefaultMenuitemToDX
[124]73    call    BootMenu_GetMenuitemCountToAX
[88]74    pop     ds
[124]75    mov     [si+MENUINIT.wItems], ax
[88]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
[124]79    call    BootMenu_GetHeightToAHwithItemCountInAL
[88]80    mov     [si+MENUINIT.bHeight], ah
[137]81    mov     ax, [cs:ROMVARS.wBootTimeout]
[135]82    CALL_MENU_LIBRARY StartSelectionTimeoutWithTicksInAX
[88]83    stc
[3]84    ret
85
[88]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
[124]92    jmp     BootMenu_GetMenuitemToDXforDriveInDL
[88]93ALIGN JUMP_ALIGN
94.DoNotSetDefaultMenuitem:
95    xor     dx, dx                      ; Whatever appears first on boot menu
96    ret
[3]97
[88]98
99; Parameters:
100;   CX:         Index of new highlighted item
101;   DX:         Index of previously highlighted item or NO_ITEM_HIGHLIGHTED
[3]102ALIGN JUMP_ALIGN
[88]103.ItemHighlightedFromCX:
104    push    cx
[241]105    call    BootMenu_GetDriveToDXforMenuitemInCX_And_RamVars_GetSegmentToDS     
[3]106    call    DriveXlate_Reset
107    call    DriveXlate_SetDriveToSwap
[140]108
109    xor     ax, ax  ; Update first floppy drive (for translated drive number)
[88]110    CALL_MENU_LIBRARY RefreshItemFromAX
[140]111    mov     dl, 80h
112    call    BootMenu_GetMenuitemToDXforDriveInDL
113    xchg    ax, dx  ; Update first hard disk (for translated drive number)
[88]114    CALL_MENU_LIBRARY RefreshItemFromAX
[140]115    pop     ax      ; Update new item (for translated drive number)
116    CALL_MENU_LIBRARY RefreshItemFromAX
[88]117    CALL_MENU_LIBRARY RefreshInformation
118    stc
[3]119    ret
120
121
[88]122; Parameters:
123;   AL:         ASCII character for the key
124;   AH:         Keyboard library scan code for the key
[3]125ALIGN JUMP_ALIGN
[88]126.KeyStrokeInAX:
[92]127    cmp     ah, ROM_BOOT_HOTKEY_SCANCODE
128    jne     SHORT .CheckDriveHotkeys
[212]129    ;; NOTE: carry flag will be clear after compare above that resulted in zero
130    jmp     Int19hMenu_JumpToBootSector_or_RomBoot     
[92]131ALIGN JUMP_ALIGN
132.CheckDriveHotkeys:
[130]133    call    BootMenu_GetMenuitemToAXforAsciiHotkeyInAL
134    cmp     ax, [bp+MENUINIT.wItems]
[241]135    jae     SHORT BootMenuEvent_EventCompleted  ; Invalid key
[248]136
137    ; Highlighting new item resets drive translation and we do not want that.
138    ; We must be able to translate both floppy drive and hard drive when using hotkey.
139    call    RamVars_GetSegmentToDS 
140    mov     dx, [RAMVARS.xlateVars+XLATEVARS.wFDandHDswap]
[88]141    CALL_MENU_LIBRARY HighlightItemFromAX
[248]142    or      [RAMVARS.xlateVars+XLATEVARS.wFDandHDswap], dx
[88]143    ; Fall to .ItemSelectedFromCX
[3]144
145
[88]146; Parameters:
147;   CX:         Index of selected item
[3]148ALIGN JUMP_ALIGN
[88]149.ItemSelectedFromCX:
150    CALL_MENU_LIBRARY Close
[248]151
[241]152BootMenuEvent_EventCompleted:
[88]153    stc
[3]154    ret
155
Note: See TracBrowser for help on using the repository browser.