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

Last change on this file since 61 was 61, checked in by aitotat, 13 years ago

Changes to XTIDE Universal BIOS:

  • AA55h signature no longer required when booting from floppy drives. This should make booter games work.
File size: 6.4 KB
Line 
1; File name     :   Int19h.asm
2; Project name  :   IDE BIOS
3; Created date  :   3.8.2007
4; Last update   :   28.11.2010
5; Author        :   Tomi Tilli
6; Description   :   Int 19h BIOS functions (Boot Strap Loader).
7
8; Section containing code
9SECTION .text
10
11B_READ_RETRY_TIMES  EQU 3   ; Number of times to retry
12
13
14;--------------------------------------------------------------------
15; Int 19h software interrupt handler for late initialization.
16; Calls actual Int 19h after initialization is complete.
17;
18; Int19h_LateInitialization
19;   Parameters:
20;       Nothing
21;   Returns:
22;       Never returns
23;--------------------------------------------------------------------
24ALIGN JUMP_ALIGN
25Int19h_LateInitialization:
26    call    Initialize_ShouldSkip           ; Skip initialization?
27    jc      SHORT .SkipInitialization
28    call    Initialize_AndDetectDrives
29    int     INTV_BOOTSTRAP                  ; Call actual boot loader
30.SkipInitialization:
31    call    RamVars_Initialize              ; RAMVARS must be initialized even for simple boot loader
32    ; Fall to Int19h_SimpleBootLoader
33
34;--------------------------------------------------------------------
35; Simple boot loader.
36; Boot sequence is fixed to 00h, 80h and INT 18h.
37;
38; Int19h_SimpleBootLoader
39;   Parameters:
40;       Nothing
41;   Returns:
42;       Never returns
43;--------------------------------------------------------------------
44ALIGN JUMP_ALIGN
45Int19h_SimpleBootLoader:
46    sti                                     ; Enable interrupts
47    call    RamVars_GetSegmentToDS
48    xor     dx, dx
49    call    Int19h_TryToLoadBootSectorFromDL
50    jc      SHORT Int19h_JumpToBootSector
51    mov     dl, 80h
52    call    Int19h_TryToLoadBootSectorFromDL
53    jc      SHORT Int19h_JumpToBootSector
54    call    Int19h_BootFailure              ; Should never return       
55    jmp     SHORT Int19h_SimpleBootLoader
56
57;--------------------------------------------------------------------
58; Boots if boot sector is successfully read from the drive.
59;
60; Int19h_TryToLoadBootSectorFromDL
61;   Parameters:
62;       DL:     Drive to boot from (translated, 00h or 80h)
63;       DS:     RAMVARS segment
64;   Returns:
65;       ES:BX:  Ptr to boot sector (if successfull)
66;       CF:     Set if boot sector loaded succesfully
67;               Cleared if failed to load boot sector
68;   Corrupts registers:
69;       AX, CX, DH, DI, (DL if failed to read boot sector)
70;--------------------------------------------------------------------
71ALIGN JUMP_ALIGN
72Int19h_TryToLoadBootSectorFromDL:
73    call    BootPrint_TryToBootFromDL
74    call    Int19h_LoadFirstSectorFromDL
75    jc      SHORT .FailedToLoadFirstSector
76
77    test    dl, 80h
78    jz      SHORT .AlwaysBootFromFloppyDriveForBooterGames
79    cmp     WORD [es:bx+510], 0AA55h        ; Valid boot sector?
80    jne     SHORT .FirstHardDiskSectorNotBootable
81.AlwaysBootFromFloppyDriveForBooterGames:
82    call    BootPrint_BootSectorLoaded
83    stc
84    ret
85.FailedToLoadFirstSector:
86    call    BootPrint_FailedToLoadFirstSector
87    clc
88    ret
89.FirstHardDiskSectorNotBootable:
90    call    BootPrint_FirstSectorNotBootable
91    clc
92    ret
93
94;--------------------------------------------------------------------
95; Reads first sector (boot sector) from drive DL.
96;
97; Int19h_LoadFirstSectorFromDL
98;   Parameters:
99;       DL:     Drive to boot from (translated, 00h or 80h)
100;   Returns:
101;       AH:     INT 13h error code
102;       ES:BX:  Ptr to boot sector (if successfull)
103;       CF:     Cleared if read successfull
104;               Set if any error
105;   Corrupts registers:
106;       AL, CX, DH, DI
107;--------------------------------------------------------------------
108ALIGN JUMP_ALIGN
109Int19h_LoadFirstSectorFromDL:
110    LOAD_BDA_SEGMENT_TO es, bx              ; ES:BX now points to...
111    mov     bx, BOOTVARS.rgbBootSect        ; ...boot sector location
112    mov     di, B_READ_RETRY_TIMES          ; Retry counter
113ALIGN JUMP_ALIGN
114.ReadRetryLoop:
115    call    .ResetBootDriveFromDL
116    call    .LoadFirstSectorFromDLtoESBX
117    jnc     SHORT .Return
118    dec     di                              ; Decrement retry counter
119    jnz     SHORT .ReadRetryLoop            ; Loop while retries left
120    stc
121ALIGN JUMP_ALIGN
122.Return:
123    ret
124
125;--------------------------------------------------------------------
126; .ResetBootDriveFromDL
127;   Parameters:
128;       DL:     Drive to boot from (translated, 00h or 80h)
129;   Returns:
130;       AH:     INT 13h error code
131;       CF:     Cleared if read successfull
132;               Set if any error
133;   Corrupts registers:
134;       AL
135;--------------------------------------------------------------------
136ALIGN JUMP_ALIGN
137.ResetBootDriveFromDL:
138    xor     ax, ax                          ; AH=0h, Disk Controller Reset
139    test    dl, 80h                         ; Floppy drive?
140    jz      SHORT .ResetDriveFromDL         ;  If so, jump to reset
141    mov     ah, 0Dh                         ; AH=Dh, Reset Hard Disk (Alternate reset)
142.ResetDriveFromDL:
143    int     INTV_DISK_FUNC
144    ret
145
146;--------------------------------------------------------------------
147; Reads first sector (boot sector) from drive DL to ES:BX.
148;
149; .LoadFirstSectorFromDLtoESBX
150;   Parameters:
151;       DL:     Drive to boot from (translated, 00h or 80h)
152;       ES:BX:  Destination buffer for boot sector
153;   Returns:
154;       AH:     INT 13h error code
155;       ES:BX:  Ptr to boot sector
156;       CF:     Cleared if read successfull
157;               Set if any error
158;   Corrupts registers:
159;       AL, CX, DH
160;--------------------------------------------------------------------
161ALIGN JUMP_ALIGN
162.LoadFirstSectorFromDLtoESBX:
163    mov     ax, 0201h                       ; Read 1 sector
164    mov     cx, 1                           ; Cylinder 0, Sector 1
165    xor     dh, dh                          ; Head 0
166    int     INTV_DISK_FUNC
167    ret
168
169
170;--------------------------------------------------------------------
171; Jumps to boot sector pointed by ES:BX.
172;
173; Int19h_JumpToBootSector
174;   Parameters:
175;       DL:     Drive to boot from (translated, 00h or 80h)
176;       ES:BX:  Ptr to boot sector
177;   Returns:
178;       Never returns
179;--------------------------------------------------------------------
180ALIGN JUMP_ALIGN
181Int19h_JumpToBootSector:
182    push    es                              ; Push boot sector segment
183    push    bx                              ; Push boot sector offset
184    call    Int19h_ClearSegmentsForBoot
185    xor     dh, dh                          ; Device supported by INT 13h
186    retf
187
188;--------------------------------------------------------------------
189; Clears DS and ES registers to zero.
190;
191; Int19h_ClearSegmentsForBoot
192;   Parameters:
193;       Nothing
194;   Returns:
195;       DS=ES:  Zero
196;   Corrupts registers:
197;       AX
198;--------------------------------------------------------------------
199ALIGN JUMP_ALIGN
200Int19h_ClearSegmentsForBoot:
201    xor     ax, ax
202    mov     ds, ax
203    mov     es, ax
204    ret
205
206
207;--------------------------------------------------------------------
208; Calls INT 18h (ROM Basic or Boot Failure). Called after booting from
209; floppy drive or hard disk fails.
210;
211; Int19h_BootFailure
212;   Parameters:
213;       Nothing
214;   Returns:
215;       Should never return (but might)
216;--------------------------------------------------------------------
217ALIGN JUMP_ALIGN
218Int19h_BootFailure:
219    call    Int19h_ClearSegmentsForBoot
220    int     INTV_BOOT_FAILURE
221    ret
Note: See TracBrowser for help on using the repository browser.