source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectDrives.asm@ 93

Last change on this file since 93 was 86, checked in by krille_n_@…, 14 years ago

Size optimizations in various files in the XTIDE BIOS.
Also added a new include file for generic macros (macros.inc).

File size: 6.4 KB
Line 
1; Project name : IDE BIOS
2; Description : Functions for detecting drive for the BIOS.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Detects all IDE hard disks to be controlled by this BIOS.
9;
10; DetectDrives_FromAllIDEControllers
11; Parameters:
12; DS: RAMVARS segment
13; ES: BDA segment (zero)
14; Returns:
15; Nothing
16; Corrupts registers:
17; All (not segments)
18;--------------------------------------------------------------------
19ALIGN JUMP_ALIGN
20DetectDrives_FromAllIDEControllers:
21 call RamVars_GetIdeControllerCountToCX
22 mov bp, ROMVARS.ideVars0 ; CS:BP now points to first IDEVARS
23ALIGN JUMP_ALIGN
24.DriveDetectLoop:
25 call DetectDrives_WithIDEVARS ; Detect Master and Slave
26 add bp, BYTE IDEVARS_size ; Point to next IDEVARS
27 loop .DriveDetectLoop
28 ret
29
30
31;--------------------------------------------------------------------
32; Detects IDE hard disks by using information from IDEVARS.
33;
34; DetectDrives_WithIDEVARS
35; Parameters:
36; CS:BP: Ptr to IDEVARS
37; DS: RAMVARS segment
38; ES: Zero (BDA segment)
39; Returns:
40; Nothing
41; Corrupts registers:
42; AX, BX, DX, SI, DI
43;--------------------------------------------------------------------
44ALIGN JUMP_ALIGN
45DetectDrives_WithIDEVARS:
46 push cx
47 call DetectPrint_StartingMasterDetect ; Print detection string
48 call DetectDrives_DetectMasterDrive ; Detect and create DPT + BOOTNFO
49 call DetectPrint_DriveNameOrNotFound ; Print found or not found string
50
51 call DetectPrint_StartingSlaveDetect
52 call DetectDrives_DetectSlaveDrive
53 call DetectPrint_DriveNameOrNotFound
54 pop cx
55 ret
56
57
58;--------------------------------------------------------------------
59; Detects IDE Master or Slave drive.
60;
61; DetectDrives_DetectMasterDrive
62; DetectDrives_DetectSlaveDrive
63; Parameters:
64; CS:BP: Ptr to IDEVARS
65; DS: RAMVARS segment
66; ES: Zero (BDA segment)
67; Returns:
68; ES:BX: Ptr to BOOTNFO (if successful)
69; CF: Cleared if drive detected successfully
70; Set if any drive not found or other error
71; Corrupts registers:
72; AX, CX, DX, SI, DI
73;--------------------------------------------------------------------
74ALIGN JUMP_ALIGN
75DetectDrives_DetectMasterDrive:
76 mov bh, MASK_IDE_DRVHD_SET ; Select Master drive
77 SKIP2B ax ; mov ax, <next instruction>
78DetectDrives_DetectSlaveDrive:
79 mov bh, MASK_IDE_DRVHD_SET | FLG_IDE_DRVHD_DRV
80 ; Fall to DetectDrives_StartDetection
81
82;--------------------------------------------------------------------
83; Detects IDE Master or Slave drive.
84;
85; DetectDrives_StartDetection
86; Parameters:
87; BH: Drive Select byte for Drive and Head Register
88; CS:BP: Ptr to IDEVARS for the drive
89; DS: RAMVARS segment
90; ES: Zero (BDA segment)
91; Returns:
92; ES:BX: Ptr to BOOTNFO (if successful)
93; CF: Cleared if drive detected successfully
94; Set if any drive not found or other error
95; Corrupts registers:
96; AX, CX, DX, SI, DI
97;--------------------------------------------------------------------
98ALIGN JUMP_ALIGN
99DetectDrives_StartDetection:
100 call DetectDrives_ReadAtaInfoFromDrive ; Assume hard disk
101 jnc SHORT DetectDrives_CreateBiosTablesForHardDisk
102 call DetectDrives_ReadAtapiInfoFromDrive ; Assume CD-ROM
103 jnc SHORT DetectDrives_CreateBiosTablesForCDROM
104 ret
105
106
107;--------------------------------------------------------------------
108; Reads ATA information from the drive (for hard disks).
109;
110; DetectDrives_ReadAtaInfoFromDrive
111; Parameters:
112; BH: Drive Select byte for Drive and Head Register
113; CS:BP: Ptr to IDEVARS for the drive
114; DS: RAMVARS segment
115; ES: Zero (BDA segment)
116; Returns:
117; ES:SI Ptr to ATA information (read with IDENTIFY DEVICE command)
118; CF: Cleared if ATA-information read successfully
119; Set if any error
120; Corrupts registers:
121; AX, BL, CX, DX, DI
122;--------------------------------------------------------------------
123ALIGN JUMP_ALIGN
124DetectDrives_ReadAtaInfoFromDrive:
125 mov bl, [cs:bp+IDEVARS.bBusType]; Load BUS type
126 mov dx, [cs:bp+IDEVARS.wPort] ; Load IDE Base Port address
127 mov di, BOOTVARS.rgbAtaInfo ; ES:DI now points to ATA info location
128 call AH25h_GetDriveInfo
129 mov si, di ; ES:SI now points to ATA information
130 ret
131
132
133;--------------------------------------------------------------------
134; Creates all BIOS tables for detected hard disk.
135;
136; DetectDrives_CreateBiosTablesForHardDisk
137; Parameters:
138; BH: Drive Select byte for Drive and Head Register
139; CS:BP: Ptr to IDEVARS for the drive
140; ES:SI Ptr to ATA information for the drive
141; DS: RAMVARS segment
142; Returns:
143; ES:BX: Ptr to BOOTNFO (if successful)
144; CF: Cleared if BIOS tables created succesfully
145; Set if any error
146; Corrupts registers:
147; AX, CX, DX, SI, DI
148;--------------------------------------------------------------------
149ALIGN JUMP_ALIGN
150DetectDrives_CreateBiosTablesForHardDisk:
151 call CreateDPT_FromAtaInformation
152 jc SHORT .InvalidAtaInfo
153 call BootInfo_CreateForHardDisk
154 ;jc SHORT .InvalidAtaInfo
155 ; Call to search for BIOS partitions goes here
156 ;clc
157.InvalidAtaInfo:
158 ret
159
160
161;--------------------------------------------------------------------
162; Reads ATAPI information from the drive (for CD/DVD-ROMs).
163;
164; DetectDrives_ReadAtapiInfoFromDrive
165; Parameters:
166; BH: Drive Select byte for Drive and Head Register
167; CS:BP: Ptr to IDEVARS for the drive
168; DS: RAMVARS segment
169; ES: Zero (BDA segment)
170; Returns:
171; ES:SI Ptr to ATAPI information (read with IDENTIFY PACKET DEVICE command)
172; CF: Cleared if ATAPI-information read successfully
173; Set if any error
174; Corrupts registers:
175; AX, BL, CX, DX, DI
176;--------------------------------------------------------------------
177ALIGN JUMP_ALIGN
178DetectDrives_ReadAtapiInfoFromDrive:
179 ;stc
180 ;ret
181 ; Fall through to DetectDrives_CreateBiosTablesForCDROM
182
183
184;--------------------------------------------------------------------
185; Creates all BIOS tables for detected CD/DVD-ROM.
186;
187; DetectDrives_CreateBiosTablesForCDROM
188; Parameters:
189; BH: Drive Select byte for Drive and Head Register
190; CS:BP: Ptr to IDEVARS for the drive
191; ES:SI Ptr to ATAPI information for the drive
192; DS: RAMVARS segment
193; Returns:
194; ES:BX: Ptr to BOOTNFO (if successful)
195; CF: Cleared if BIOS tables created succesfully
196; Set if any error
197; Corrupts registers:
198; AX, CX, DX, SI, DI
199;--------------------------------------------------------------------
200ALIGN JUMP_ALIGN
201DetectDrives_CreateBiosTablesForCDROM:
202 stc
203 ret
Note: See TracBrowser for help on using the repository browser.