source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Boot/BootSector.asm@ 240

Last change on this file since 240 was 148, checked in by Tomi Tilli, 14 years ago

Changes to XTIDE Universal BIOS:

  • INT 13h optimizations to save almost 100 bytes.
File size: 3.3 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Reading and jumping to boot sector.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; BootSector_TryToLoadFromDriveDL
9; Parameters:
10; DL: Drive to boot from (translated, 00h or 80h)
11; DS: RAMVARS segment
12; Returns:
13; ES:BX: Ptr to boot sector (if successfull)
14; CF: Set if boot sector loaded succesfully
15; Cleared if failed to load boot sector
16; Corrupts registers:
17; AX, CX, DH, SI, DI, (DL if failed to read boot sector)
18;--------------------------------------------------------------------
19ALIGN JUMP_ALIGN
20BootSector_TryToLoadFromDriveDL:
21 call BootPrint_TryToBootFromDL
22 call LoadFirstSectorFromDriveDL
23 jc SHORT .FailedToLoadFirstSector
24
25 test dl, dl
26 jns SHORT .AlwaysBootFromFloppyDriveForBooterGames
27 cmp WORD [es:bx+510], 0AA55h ; Valid boot sector?
28 jne SHORT .FirstHardDiskSectorNotBootable
29.AlwaysBootFromFloppyDriveForBooterGames:
30 stc
31 ret
32.FailedToLoadFirstSector:
33 call BootPrint_FailedToLoadFirstSector
34 clc
35 ret
36.FirstHardDiskSectorNotBootable:
37 mov si, g_szBootSectorNotFound
38 call BootMenuPrint_NullTerminatedStringFromCSSIandSetCF
39 clc
40 ret
41
42;--------------------------------------------------------------------
43; LoadFirstSectorFromDriveDL
44; Parameters:
45; DL: Drive to boot from (translated, 00h or 80h)
46; Returns:
47; AH: INT 13h error code
48; ES:BX: Ptr to boot sector (if successfull)
49; CF: Cleared if read successfull
50; Set if any error
51; Corrupts registers:
52; AL, CX, DH, DI
53;--------------------------------------------------------------------
54ALIGN JUMP_ALIGN
55LoadFirstSectorFromDriveDL:
56 LOAD_BDA_SEGMENT_TO es, bx ; ES:BX now points to...
57 mov bx, BOOTVARS.rgbBootSect ; ...boot sector location
58 mov di, BOOT_READ_RETRY_TIMES ; Initialize retry counter
59ALIGN JUMP_ALIGN
60.ReadRetryLoop:
61 call .ResetBootDriveFromDL
62 call .LoadFirstSectorFromDLtoESBX
63 jnc SHORT .Return
64 dec di ; Decrement retry counter
65 jnz SHORT .ReadRetryLoop ; Loop while retries left
66.Return:
67 ret
68
69;--------------------------------------------------------------------
70; .ResetBootDriveFromDL
71; Parameters:
72; DL: Drive to boot from (translated, 00h or 80h)
73; Returns:
74; AH: INT 13h error code
75; CF: Cleared if read successfull
76; Set if any error
77; Corrupts registers:
78; AL
79;--------------------------------------------------------------------
80ALIGN JUMP_ALIGN
81.ResetBootDriveFromDL:
82 xor ax, ax ; AH=0h, Disk Controller Reset
83 test dl, dl ; Floppy drive?
84 jns SHORT .SkipAltReset
85 mov ah, 0Dh ; AH=Dh, Reset Hard Disk (Alternate reset)
86.SkipAltReset:
87 int BIOS_DISK_INTERRUPT_13h
88 ret
89
90;--------------------------------------------------------------------
91; .LoadFirstSectorFromDLtoESBX
92; Parameters:
93; DL: Drive to boot from (translated, 00h or 80h)
94; ES:BX: Destination buffer for boot sector
95; Returns:
96; AH: INT 13h error code
97; ES:BX: Ptr to boot sector
98; CF: Cleared if read successfull
99; Set if any error
100; Corrupts registers:
101; AL, CX, DH
102;--------------------------------------------------------------------
103ALIGN JUMP_ALIGN
104.LoadFirstSectorFromDLtoESBX:
105 mov ax, 0201h ; Read 1 sector
106 mov cx, 1 ; Cylinder 0, Sector 1
107 xor dh, dh ; Head 0
108 int BIOS_DISK_INTERRUPT_13h
109 ret
Note: See TracBrowser for help on using the repository browser.