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

Last change on this file since 84 was 84, checked in by krille_n_@…, 13 years ago

Minor size optimizations in various files.

File size: 6.5 KB
Line 
1; File name     :   Int19h.asm
2; Project name  :   IDE BIOS
3; Created date  :   3.8.2007
4; Last update   :   14.1.2011
5; Author        :   Tomi Tilli,
6;               :   Krister Nordvall (optimizations)
7; Description   :   Int 19h BIOS functions (Boot Strap Loader).
8
9; Section containing code
10SECTION .text
11
12B_READ_RETRY_TIMES  EQU 3   ; Number of times to retry
13
14
15;--------------------------------------------------------------------
16; Int 19h software interrupt handler for late initialization.
17; Calls actual Int 19h after initialization is complete.
18;
19; Int19h_LateInitialization
20;   Parameters:
21;       Nothing
22;   Returns:
23;       Never returns
24;--------------------------------------------------------------------
25ALIGN JUMP_ALIGN
26Int19h_LateInitialization:
27    call    Initialize_ShouldSkip           ; Skip initialization?
28    jc      SHORT .SkipInitialization
29    call    Initialize_AndDetectDrives
30    int     INTV_BOOTSTRAP                  ; Call actual boot loader
31.SkipInitialization:
32    call    RamVars_Initialize              ; RAMVARS must be initialized even for simple boot loader
33    ; Fall to Int19h_SimpleBootLoader
34
35;--------------------------------------------------------------------
36; Simple boot loader.
37; Boot sequence is fixed to 00h, 80h and INT 18h.
38;
39; Int19h_SimpleBootLoader
40;   Parameters:
41;       Nothing
42;   Returns:
43;       Never returns
44;--------------------------------------------------------------------
45ALIGN JUMP_ALIGN
46Int19h_SimpleBootLoader:
47    sti                                     ; Enable interrupts
48    call    RamVars_GetSegmentToDS
49    xor     dx, dx
50    call    Int19h_TryToLoadBootSectorFromDL
51    jc      SHORT Int19h_JumpToBootSector
52    mov     dl, 80h
53    call    Int19h_TryToLoadBootSectorFromDL
54    jc      SHORT Int19h_JumpToBootSector
55    call    Int19h_BootFailure              ; Should never return       
56    jmp     SHORT Int19h_SimpleBootLoader
57
58;--------------------------------------------------------------------
59; Boots if boot sector is successfully read from the drive.
60;
61; Int19h_TryToLoadBootSectorFromDL
62;   Parameters:
63;       DL:     Drive to boot from (translated, 00h or 80h)
64;       DS:     RAMVARS segment
65;   Returns:
66;       ES:BX:  Ptr to boot sector (if successfull)
67;       CF:     Set if boot sector loaded succesfully
68;               Cleared if failed to load boot sector
69;   Corrupts registers:
70;       AX, CX, DH, DI, (DL if failed to read boot sector)
71;--------------------------------------------------------------------
72ALIGN JUMP_ALIGN
73Int19h_TryToLoadBootSectorFromDL:
74    call    BootPrint_TryToBootFromDL
75    call    Int19h_LoadFirstSectorFromDL
76    jc      SHORT .FailedToLoadFirstSector
77
78    test    dl, 80h
79    jz      SHORT .AlwaysBootFromFloppyDriveForBooterGames
80    cmp     WORD [es:bx+510], 0AA55h        ; Valid boot sector?
81    jne     SHORT .FirstHardDiskSectorNotBootable
82.AlwaysBootFromFloppyDriveForBooterGames:
83    call    BootPrint_BootSectorLoaded
84    stc
85    ret
86.FailedToLoadFirstSector:
87    call    BootPrint_FailedToLoadFirstSector
88    clc
89    ret
90.FirstHardDiskSectorNotBootable:
91    call    BootPrint_FirstSectorNotBootable
92    clc
93    ret
94
95;--------------------------------------------------------------------
96; Reads first sector (boot sector) from drive DL.
97;
98; Int19h_LoadFirstSectorFromDL
99;   Parameters:
100;       DL:     Drive to boot from (translated, 00h or 80h)
101;   Returns:
102;       AH:     INT 13h error code
103;       ES:BX:  Ptr to boot sector (if successfull)
104;       CF:     Cleared if read successfull
105;               Set if any error
106;   Corrupts registers:
107;       AL, CX, DH, DI
108;--------------------------------------------------------------------
109ALIGN JUMP_ALIGN
110Int19h_LoadFirstSectorFromDL:
111    LOAD_BDA_SEGMENT_TO es, bx              ; ES:BX now points to...
112    mov     bx, BOOTVARS.rgbBootSect        ; ...boot sector location
113    mov     di, B_READ_RETRY_TIMES          ; Retry counter
114ALIGN JUMP_ALIGN
115.ReadRetryLoop:
116    call    .ResetBootDriveFromDL
117    call    .LoadFirstSectorFromDLtoESBX
118    jnc     SHORT .Return
119    dec     di                              ; Decrement retry counter
120    jnz     SHORT .ReadRetryLoop            ; Loop while retries left
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.