source: xtideuniversalbios/trunk/BIOS_Drive_Information_Tool/Src/Bios.asm@ 576

Last change on this file since 576 was 566, checked in by krille_n_@…, 11 years ago

Changes to XTIDE Universal BIOS:

  • Fixed a very old bug (from r150) in IdeError.asm where GetBiosErrorCodeToAHfromStatusAndErrorRegistersInAX would return RET_HD_SEEK_FAIL instead of RET_HD_STATUSERR.
  • Optimizations and other fixes.
File size: 6.0 KB
RevLine 
[327]1; Project name : BIOS Drive Information Tool
2; Description : Functions to read information from BIOS.
3
[376]4;
[526]5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
[376]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.
[526]12;
[376]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
[526]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
[327]19
20; Section containing code
21SECTION .text
22
23;---------------------------------------------------------------------
24; Bios_GetNumberOfHardDrivesToDX
25; Parameters:
26; Nothing
27; Returns: (if no errors)
[566]28; DX: Number of hard drives in system
[327]29; CF: Set if no hard drives found
30; Corrupts registers:
31; AX, BX, CX
32;--------------------------------------------------------------------
33Bios_GetNumberOfHardDrivesToDX:
34 mov dl, 80h ; First hard drive
35 mov ah, GET_DRIVE_PARAMETERS
36 int BIOS_DISK_INTERRUPT_13h
37 mov dh, 0 ; Preserve CF
38 ret
39
40
41;---------------------------------------------------------------------
42; Bios_ReadOldInt13hParametersFromDriveDL
43; Parameters:
44; DL: BIOS drive number
45; Returns: (if no errors)
[566]46; BL: Drive Type (for floppies only)
[327]47; AX: Sectors per track (1...63)
48; DX: Number of heads (1...255)
49; CX: Number of cylinders (1...1024)
50; CF: Cleared = no errors
51; Set = BIOS error code stored in AH
52; Corrupts registers:
53; Nothing
54;--------------------------------------------------------------------
55Bios_ReadOldInt13hParametersFromDriveDL:
56 mov ah, GET_DRIVE_PARAMETERS
57 int BIOS_DISK_INTERRUPT_13h
58 jc SHORT ReturnWithBiosErrorCodeInAH
59 ; Fall to ExtractCHSfromOldInt13hDriveParameters
60
61;---------------------------------------------------------------------
62; ExtractCHSfromOldInt13hDriveParameters
63; Parameters:
64; CH: Maximum cylinder number, bits 7...0
65; CL: Bits 7...6: Maximum cylinder number, bits 9 and 8
66; Bits 5...0: Maximum sector number (1...63)
67; DH: Maximum head number (0...254)
68; Returns:
[566]69; BL: Drive Type (for floppies only)
[327]70; AX: Sectors per track (1...63)
71; DX: Number of heads (1...255)
72; CX: Number of cylinders (1...1024)
73; CF: Cleared
74; Corrupts registers:
75; Nothing
76;--------------------------------------------------------------------
77ExtractCHSfromOldInt13hDriveParameters:
78 mov al, cl ; Copy sector number...
79 and ax, BYTE 3Fh ; ...and limit to 1...63
80 sub cl, al ; Remove from max cylinder high
81 eROL_IM cl, 2 ; High bits to beginning
82 eMOVZX dx, dh ; Copy Max head to DX
83 xchg cl, ch ; Max cylinder now in CX
84 inc cx ; Max cylinder to number of cylinders
85 inc dx ; Max head to number of heads
86 clc ; No errors
87 ret
88
89
90;---------------------------------------------------------------------
91; Bios_ReadOldInt13hCapacityFromDriveDL
92; Parameters:
93; DL: BIOS drive number
94; Returns: (if no errors)
[566]95; CX:DX: Total number of sectors
96; AH: BIOS Error code
[327]97; CF: Cleared = no errors
98; Set = BIOS error code stored in AH
99; Corrupts registers:
100; Nothing
101;--------------------------------------------------------------------
102Bios_ReadOldInt13hCapacityFromDriveDL:
103 mov ah, GET_DISK_TYPE
104 int BIOS_DISK_INTERRUPT_13h
105 jc SHORT ReturnInvalidErrorCodeInAH
106 xor ah, ah
107 ret
108
109
110;---------------------------------------------------------------------
111; Bios_ReadAtaInfoFromDriveDLtoBX
112; Parameters:
113; DL: BIOS drive number
114; Returns: (if no errors)
[566]115; DS:BX: Ptr to ATA information
116; AH: BIOS Error code
[327]117; CF: Cleared = no errors
118; Set = BIOS error code stored in AH
119; Corrupts registers:
120; ES
121;--------------------------------------------------------------------
122Bios_ReadAtaInfoFromDriveDLtoBX:
123 mov bx, g_rgbAtaInfo
124 push ds
125 pop es
126 mov ah, GET_DRIVE_INFORMATION
127 int BIOS_DISK_INTERRUPT_13h
128 ret
129
130
131;---------------------------------------------------------------------
132; Bios_ReadEbiosVersionFromDriveDL
133; Parameters:
134; DL: BIOS drive number
135; Returns:
136; AH: BIOS error code
[566]137; BX: Version of extensions
[327]138; CX: Interface support bit map
139; CF: Cleared = no errors
140; Set = BIOS error code stored in AH
141; Corrupts registers:
142; Nothing
143;--------------------------------------------------------------------
144Bios_ReadEbiosVersionFromDriveDL:
145 mov ah, CHECK_EXTENSIONS_PRESENT
146 mov bx, 55AAh
147 int BIOS_DISK_INTERRUPT_13h
148 jc SHORT .NoEbiosPresent
149 cmp bx, 0AA55h
150 jne SHORT .NoEbiosPresent
151 eMOVZX bx, ah ; Copy version to BX
152 xor ah, ah
153 ret
154.NoEbiosPresent:
155 mov ah, RET_HD_INVALID
156 stc
157 ret
158
159
160;---------------------------------------------------------------------
161; Bios_ReadEbiosInfoFromDriveDLtoDSSI
162; Parameters:
163; DL: BIOS drive number
164; Returns: (if no errors)
[566]165; DS:SI: Ptr to EDRIVE_INFO
166; AH: BIOS Error code
[327]167; CF: Cleared = no errors
168; Set = BIOS error code stored in AH
169; Corrupts registers:
170; Nothing
171;--------------------------------------------------------------------
172Bios_ReadEbiosInfoFromDriveDLtoDSSI:
173 mov si, g_edriveInfo
174 mov WORD [si+EDRIVE_INFO.wSize], MINIMUM_EDRIVEINFO_SIZE
175 mov ah, GET_EXTENDED_DRIVE_INFORMATION
176 int BIOS_DISK_INTERRUPT_13h
177 ret
178
179
180;---------------------------------------------------------------------
181; ReturnInvalidErrorCodeInAH
182; ReturnWithBiosErrorCodeInAH
183; Parameters:
184; Nothing
185; Returns: (if no errors)
[566]186; AH: BIOS Error code
[327]187; CF: Set
188; Corrupts registers:
189; Nothing
190;--------------------------------------------------------------------
191ReturnInvalidErrorCodeInAH:
192 stc
[526]193 mov ah, RET_HD_INVALID
[327]194ReturnWithBiosErrorCodeInAH:
195 ret
196
197
198; Section containing uninitialized data
199SECTION .bss
200
201g_edriveInfo:
202g_rgbAtaInfo: resb 512
Note: See TracBrowser for help on using the repository browser.