source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int19h.asm @ 492

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

Removed the dependency between MODULE_BOOT_MENU and MODULE_HOTKEYS. With these changes, 0, 1, or 2 of them can be included in a build. This change also means that the hotkeys don't work while the menu is up. But the most important hotkey there was for Rom Boot, and that has been added to the menu as a choice proper. Lots of changes across the board in the hotkeys code - even if we eventually back this change out (becaue, for example we want hotkeys to work in the menu) we should probably start from this base and add that functionality back in, as these changes results in approximately 120 bytes of savings and includes new functionality, such as the Rom Boot menu item and the Com Detect hotkey.

File size: 7.6 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Int 19h Handler (Boot Loader).
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; Int19h_BootLoaderHandler
25;   Parameters:
26;       Nothing
27;   Returns:
28;       Never returns (loads operating system)
29;--------------------------------------------------------------------
30Int19h_BootLoaderHandler:
31    sti                                 ; Enable interrupts
32    cld                                 ; String instructions to increment pointers
33    LOAD_BDA_SEGMENT_TO es, ax          ; Load BDA segment (zero) to ES
34    ; Fall to .PrepareBootLoaderStack
35
36
37;--------------------------------------------------------------------
38; Drive detection and boot menu use lots of stack so it is
39; wise to relocate stack. Otherwise something important from
40; interrupt vectors are likely corrupted, likely our own DPTs if
41; they are located to 30:0h.
42;
43; .PrepareBootLoaderStack
44;   Parameters:
45;       ES:     BDA and interrupt vector segment (zero)
46;   Returns:
47;       Never returns (loads operating system)
48;--------------------------------------------------------------------
49.PrepareBootLoaderStack:
50    STORE_POST_STACK_POINTER
51    SWITCH_TO_BOOT_MENU_STACK
52    ; Fall to .InitializeDisplay
53
54
55;--------------------------------------------------------------------
56; .InitializeDisplay
57;   Parameters:
58;       ES:     BDA and interrupt vector segment (zero)
59;   Returns:
60;       Never returns (loads operating system)
61;--------------------------------------------------------------------
62.InitializeDisplay:
63    ; Change display mode if necessary
64    mov     ax, [cs:ROMVARS.wDisplayMode]   ; AH 00h = Set Video Mode
65    cmp     al, DEFAULT_TEXT_MODE
66    je      SHORT .InitializeDisplayLibrary
67    int     BIOS_VIDEO_INTERRUPT_10h
68.InitializeDisplayLibrary:
69    call    DetectPrint_InitializeDisplayContext
70    ; Fall to .InitializeBiosAndDetectDrives
71
72
73;--------------------------------------------------------------------
74; .InitializeBiosAndDetectDrives
75;   Parameters:
76;       ES:     BDA and interrupt vector segment (zero)
77;   Returns:
78;       DS:     RAMVARS segment
79;--------------------------------------------------------------------
80%ifdef MODULE_HOTKEYS
81    call    TimerTicks_ReadFromBdaToAX
82    add     ax, MIN_TIME_TO_DISPLAY_HOTKEY_BAR
83    mov     [es:BOOTVARS.hotkeyVars+HOTKEYVARS.wTimeToClose], ax
84%endif
85
86    call    Initialize_AndDetectDrives
87
88%ifdef MODULE_HOTKEYS
89.WaitUntilTimeToCloseHotkeyBar:
90    call    TimerTicks_ReadFromBdaToAX
91    cmp     ax, [es:BOOTVARS.hotkeyVars+HOTKEYVARS.wTimeToClose]
92    jb      SHORT .WaitUntilTimeToCloseHotkeyBar
93%endif
94    ; Fall to SelectDriveToBootFrom
95
96
97;--------------------------------------------------------------------
98; SelectDriveToBootFrom
99;   Parameters:
100;       DS:     RAMVARS segment
101;       ES:     BDA and interrupt vector segment (zero)
102;   Returns:
103;       Never returns (loads operating system)
104;--------------------------------------------------------------------
105SelectDriveToBootFrom:
106
107; The following macro could be easily inlined below.  Why a macro?  Depending on the combination
108; of MODULE_HOTKEYS or MODULE_BOOT_MENU, this code needs to either come before or after the
109; call to the boot menu. 
110;
111%macro TRY_TO_BOOT_DL_AND_DH_DRIVES 0
112    push    dx                                  ; it's OK if this is left on the stack, if we are
113                                                ; are successful, the following call does not return
114    call    TryToBootFromPrimaryOrSecondaryBootDevice_AndBoot
115    pop     dx
116    mov     dl, dh
117    call    TryToBootFromPrimaryOrSecondaryBootDevice_AndBoot
118%endmacro
119               
120%ifdef MODULE_HOTKEYS
121    call    HotkeyBar_ScanHotkeysFromKeyBufferAndStoreToBootvars       
122    cmp     al, ROM_BOOT_HOTKEY_SCANCODE
123    jz      JumpToBootSector_or_RomBoot         ; CF clear so ROM boot
124%ifdef MODULE_BOOT_MENU
125    cmp     al, BOOT_MENU_HOTKEY_SCANCODE
126    jz      .BootMenu
127%endif
128    call    HotkeyBar_GetBootDriveNumbersToDX
129.TryUsingHotKeysCode:
130    TRY_TO_BOOT_DL_AND_DH_DRIVES
131    ;; falls through to boot menu, if it is present.  If not present, falls through to rom boot.
132%endif
133
134%ifdef MODULE_BOOT_MENU
135.BootMenu:     
136    call    BootMenu_DisplayAndReturnDriveInDLRomBootClearCF
137    jnc     JumpToBootSector_or_RomBoot         ; CF clear so ROM boot
138
139    mov     dh, dl                              ; Setup for secondary drive
140    not     dh                                  ; Floppy goes to HD, or vice veras
141    and     dh, 080h                            ; Go to first drive of the floppy or HD set
142
143%ifdef MODULE_HOTKEYS
144    jmp     .TryUsingHotKeysCode
145%else
146    TRY_TO_BOOT_DL_AND_DH_DRIVES       
147    jmp     .BootMenu
148%endif
149%endif
150
151%ifndef MODULE_HOTKEYS
152%ifndef MODULE_BOOT_MENU
153    xor     dl, dl          ; Try to boot from Floppy Drive A
154    call    TryToBootFromPrimaryOrSecondaryBootDevice_AndBoot
155    mov     dl, 80h         ; Try to boot from Hard Drive C
156    call    TryToBootFromPrimaryOrSecondaryBootDevice_AndBoot
157%endif
158%endif
159
160%ifndef MODULE_BOOT_MENU
161    clc     ;  fall through with flag for ROM boot.  Boot Menu goes back to menu and doesn't fall through.
162%endif     
163
164;--------------------------------------------------------------------
165; JumpToBootSector_or_RomBoot
166;
167; Switches back to the POST stack, clears the DS and ES registers,
168; and either jumps to the MBR (Master Boot Record) that was just read,
169; or calls the ROM's boot routine on interrupt 18.
170;
171;   Parameters:
172;       DL:     Drive to boot from (translated, 00h or 80h)
173;       CF:     Set for Boot Sector Boot 
174;               Clear for ROM Boot
175;       ES:BX:  (if CF set) Ptr to boot sector
176;
177;   Returns:
178;       Never returns
179;--------------------------------------------------------------------
180JumpToBootSector_or_RomBoot:
181    mov     cx, es      ; Preserve MBR segment (can't push because of stack change)
182    mov     ax, 0       ; NOTE: can't use XOR (LOAD_BDA_SEGMENT_TO) as it impacts CF
183    SWITCH_BACK_TO_POST_STACK
184
185; clear segment registers before boot sector or rom call
186    mov     ds, ax     
187    mov     es, ax
188%ifdef USE_386
189    mov     fs, ax
190    mov     gs, ax
191%endif
192    jnc     SHORT .romboot
193
194; jump to boot sector
195    push    cx          ; sgment address for MBR
196    push    bx          ; offset address for MBR
197    retf                ; NOTE: DL is set to the drive number
198
199; Boot by calling INT 18h (ROM Basic of ROM DOS)
200.romboot:
201    int     BIOS_BOOT_FAILURE_INTERRUPT_18h ; Never returns 
202
203
204;--------------------------------------------------------------------
205; TryToBootFromPrimaryOrSecondaryBootDevice
206;   Parameters
207;       DL:     Drive selected as boot device
208;       DS:     RAMVARS segment
209;       ES:     BDA and interrupt vector segment (zero)
210;   Returns:
211;       DL:     Drive to boot from (translated, 00h or 80h)
212;       CF:     Set for Boot Sector Boot
213;               Clear for ROM Boot
214;       ES:BX:  (if CF set) Ptr to boot sector
215;   Corrupts registers:
216;       AX, CX, DH, SI, DI, (DL if failed to read boot sector)
217;--------------------------------------------------------------------
218%ifndef MODULE_DRIVEXLATE
219TryToBootFromPrimaryOrSecondaryBootDevice_AndBoot   EQU     BootSector_TryToLoadFromDriveDL_AndBoot
220
221%else
222TryToBootFromPrimaryOrSecondaryBootDevice_AndBoot:
223    call    DriveXlate_SetDriveToSwap
224    call    DriveXlate_ToOrBack
225    ; fall through to TryToBoot_FallThroughTo_BootSector_TryToLoadFromDriveDL_AndBoot
226
227TryToBoot_FallThroughTo_BootSector_TryToLoadFromDriveDL_AndBoot:
228; fall through to BootSector_TryToLoadFromDriveDL_AndBoot               
229%endif
230       
231
Note: See TracBrowser for help on using the repository browser.