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

Last change on this file since 597 was 597, checked in by aitotat, 6 years ago

Windows 95 CMOS hack now works with Award BIOSes.
Some small optimizations to INT 19h and INT 19h reset handlers.
Added menuitem to configurator for clearing BDA drive count.

File size: 3.8 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Reading and jumping to boot sector.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 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; BootSector_TryToLoadFromDriveDL_AndBoot
25;   Parameters:
26;       DL:     Drive to boot from (translated, 00h or 80h)
27;       DS:     RAMVARS segment
28;   Returns:
29;       ES:BX:  Ptr to boot sector (if successful)
30;       CF:     Set if boot sector loaded successfully
31;               Cleared if failed to load boot sector
32;   Corrupts registers:
33;       AX, CX, DH, SI, DI, (DL if failed to read boot sector)
34;--------------------------------------------------------------------
35BootSector_TryToLoadFromDriveDL_AndBoot:
36    call    DetectPrint_TryToBootFromDL
37    call    BootSector_LoadFirstSectorFromDriveDL
38    jnc     SHORT .FirstSectorLoadedToESBX
39
40    ; Do not display timeout error (80h) for floppy drives since
41    ; it most likely mean no diskette in drive. This way we do not
42    ; display error code every time user intends to boot from hard disk
43    ; when A then C boot order is used.
44    test    dl, dl
45    js      SHORT .PrintFailedToLoadErrorCode   ; Hard Drive
46    cmp     ah, RET_HD_TIMEOUT
47    je      SHORT .ReturnWithCFclearSinceFailedToLoadBootSector
48    cmp     ah, RET_HD_NOMEDIA
49    je      SHORT .ReturnWithCFclearSinceFailedToLoadBootSector
50.PrintFailedToLoadErrorCode:
51    call    DetectPrint_FailedToLoadFirstSector
52    jmp     SHORT .ReturnWithCFclearSinceFailedToLoadBootSector
53
54
55.FirstSectorLoadedToESBX:
56    test    dl, dl
57    jns     SHORT .AlwaysBootFromFloppyDriveForBooterGames
58    cmp     WORD [es:bx+510], 0AA55h        ; Valid boot sector?
59    jne     SHORT .FirstHardDiskSectorNotBootable
60.AlwaysBootFromFloppyDriveForBooterGames:
61    clc     ; Boot Sector loaded successfully
62    jmp     SHORT Int19h_JumpToBootSectorInESBXOrRomBoot
63
64.FirstHardDiskSectorNotBootable:
65    mov     si, g_szBootSectorNotFound
66    call    DetectPrint_NullTerminatedStringFromCSSI
67.ReturnWithCFclearSinceFailedToLoadBootSector:
68    clc
69    ret
70
71
72;--------------------------------------------------------------------
73; BootSector_LoadFirstSectorFromDriveDL
74;   Parameters:
75;       DL:     Drive to boot from (translated, 00h or 80h)
76;   Returns:
77;       AH:     INT 13h error code
78;       ES:BX:  Ptr to boot sector (if successful)
79;       CF:     Cleared if read successful
80;               Set if any error
81;   Corrupts registers:
82;       AL, CX, DH, DI
83;--------------------------------------------------------------------
84BootSector_LoadFirstSectorFromDriveDL:
85    LOAD_BDA_SEGMENT_TO es, bx              ; ES:BX now points to...
86    mov     bx, BOOTVARS.rgbBootSect        ; ...boot sector location
87    mov     di, BOOT_READ_RETRY_TIMES       ; Initialize retry counter
88
89.ReadRetryLoop:
90    mov     ax, 0201h                       ; Read 1 sector
91    mov     cx, 1                           ; Cylinder 0, Sector 1
92    xor     dh, dh                          ; Head 0
93    int     BIOS_DISK_INTERRUPT_13h
94    jc      SHORT .FailedToLoadFirstSector
95.Return:
96    ret
97
98.FailedToLoadFirstSector:
99    dec     di                              ; Decrement retry counter (preserve CF)
100    jz      SHORT .Return                   ; Loop while retries left
101
102    ; Reset drive and retry
103    xor     ax, ax                          ; AH=00h, Disk Controller Reset
104    test    dl, dl                          ; Floppy drive?
105    eCMOVS  ah, RESET_HARD_DISK             ; AH=0Dh, Reset Hard Disk (Alternate reset)
106    int     BIOS_DISK_INTERRUPT_13h
107    jmp     SHORT .ReadRetryLoop
108
Note: See TracBrowser for help on using the repository browser.