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

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

Added floppy drive emulation over the serial connection (MODULE_SERIAL_FLOPPY). Along the way, various optimizations were made to stay within the 8K ROM size target. Also, serial code now returns the number of sectors transferred.

File size: 5.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.FirstEvent
24    jmp     bx
25
26MENUEVENT_InitializeMenuinitFromDSSI equ  (BootMenuEvent_Handler.InitializeMenuinitFromDSSI - BootMenuEvent_Handler.FirstEvent)
27MENUEVENT_ExitMenu equ  (BootMenuEvent_EventCompleted - BootMenuEvent_Handler.FirstEvent)
28MENUEVENT_ItemHighlightedFromCX equ (BootMenuEvent_Handler.ItemHighlightedFromCX - BootMenuEvent_Handler.FirstEvent)
29MENUEVENT_ItemSelectedFromCX equ (BootMenuEvent_Handler.ItemSelectedFromCX - BootMenuEvent_Handler.FirstEvent)
30MENUEVENT_KeyStrokeInAX equ (BootMenuEvent_Handler.KeyStrokeInAX - BootMenuEvent_Handler.FirstEvent)
31MENUEVENT_RefreshTitle equ (BootMenuPrint_TitleStrings - BootMenuEvent_Handler.FirstEvent)
32MENUEVENT_RefreshInformation equ (BootMenuPrint_RefreshInformation - BootMenuEvent_Handler.FirstEvent)
33MENUEVENT_RefreshItemFromCX equ (BootMenuPrint_RefreshItem - BootMenuEvent_Handler.FirstEvent)
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      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
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.FirstEvent:   
70.InitializeMenuinitFromDSSI:
71    push    ds
72    call    RamVars_GetSegmentToDS
73    call    .GetDefaultMenuitemToDX
74    call    BootMenu_GetMenuitemCountToAX
75    pop     ds
76    mov     [si+MENUINIT.wItems], ax
77    mov     [si+MENUINIT.wHighlightedItem], dx
78    mov     WORD [si+MENUINIT.wTitleAndInfoLines], BOOT_MENU_TITLE_AND_INFO_LINES
79    mov     BYTE [si+MENUINIT.bWidth], BOOT_MENU_WIDTH
80    call    BootMenu_GetHeightToAHwithItemCountInAL
81    mov     [si+MENUINIT.bHeight], ah
82    mov     ax, [cs:ROMVARS.wBootTimeout]
83    CALL_MENU_LIBRARY StartSelectionTimeoutWithTicksInAX
84    stc
85    ret
86
87ALIGN JUMP_ALIGN
88.GetDefaultMenuitemToDX:
89    mov     dl, [cs:ROMVARS.bBootDrv]   ; Default boot drive
90    call    BootMenu_IsDriveInSystem
91    jnc     SHORT .DoNotSetDefaultMenuitem
92    call    DriveXlate_SetDriveToSwap
93    jmp     BootMenu_GetMenuitemToDXforDriveInDL
94ALIGN JUMP_ALIGN
95.DoNotSetDefaultMenuitem:
96    xor     dx, dx                      ; Whatever appears first on boot menu
97    ret
98
99
100; Parameters:
101;   CX:         Index of new highlighted item
102;   DX:         Index of previously highlighted item or NO_ITEM_HIGHLIGHTED
103ALIGN JUMP_ALIGN
104.ItemHighlightedFromCX:
105    push    cx
106    call    BootMenu_GetDriveToDXforMenuitemInCX_And_RamVars_GetSegmentToDS     
107    call    DriveXlate_Reset
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    ;; NOTE: carry flag will be clear after compare above that resulted in zero
131    jmp     Int19hMenu_JumpToBootSector_or_RomBoot     
132ALIGN JUMP_ALIGN
133.CheckDriveHotkeys:
134    call    BootMenu_GetMenuitemToAXforAsciiHotkeyInAL
135    cmp     ax, [bp+MENUINIT.wItems]
136    jae     SHORT BootMenuEvent_EventCompleted  ; Invalid key
137
138    ; Highlighting new item resets drive translation and we do not want that.
139    ; We must be able to translate both floppy drive and hard drive when using hotkey.
140    call    RamVars_GetSegmentToDS 
141    mov     dx, [RAMVARS.xlateVars+XLATEVARS.wFDandHDswap]
142    CALL_MENU_LIBRARY HighlightItemFromAX
143    or      [RAMVARS.xlateVars+XLATEVARS.wFDandHDswap], dx
144    ; Fall to .ItemSelectedFromCX
145
146
147; Parameters:
148;   CX:         Index of selected item
149ALIGN JUMP_ALIGN
150.ItemSelectedFromCX:
151    CALL_MENU_LIBRARY Close
152
153BootMenuEvent_EventCompleted:
154    stc
155    ret
156
Note: See TracBrowser for help on using the repository browser.