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

Last change on this file since 616 was 613, checked in by Tomi Tilli, 3 years ago

Added more complex way to limit illegal P-CHS Cylinders. This way more modifications can be easily made later if necessary.
Updated biosdrvs to display unmodified and modified CHS.

File size: 6.1 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:
[613]120; CX, ES
[327]121;--------------------------------------------------------------------
122Bios_ReadAtaInfoFromDriveDLtoBX:
123 mov bx, g_rgbAtaInfo
124 push ds
125 pop es
[613]126 mov cx, XUB_INT13h_SIGNATURE ; Signature to read unaltered ATA ID
[327]127 mov ah, GET_DRIVE_INFORMATION
128 int BIOS_DISK_INTERRUPT_13h
129 ret
130
131
132;---------------------------------------------------------------------
133; Bios_ReadEbiosVersionFromDriveDL
134; Parameters:
135; DL: BIOS drive number
136; Returns:
137; AH: BIOS error code
[566]138; BX: Version of extensions
[327]139; CX: Interface support bit map
140; CF: Cleared = no errors
141; Set = BIOS error code stored in AH
142; Corrupts registers:
143; Nothing
144;--------------------------------------------------------------------
145Bios_ReadEbiosVersionFromDriveDL:
146 mov ah, CHECK_EXTENSIONS_PRESENT
147 mov bx, 55AAh
148 int BIOS_DISK_INTERRUPT_13h
[589]149 jc SHORT ReturnInvalidErrorCodeInAH ; No EBIOS present
150 xor bx, 0AA55h
151 jnz SHORT ReturnInvalidErrorCodeInAH ; No EBIOS present
152 xchg bl, ah ; Version to BX, BIOS error code to AH
[327]153 ret
154
155
156;---------------------------------------------------------------------
157; Bios_ReadEbiosInfoFromDriveDLtoDSSI
158; Parameters:
159; DL: BIOS drive number
160; Returns: (if no errors)
[566]161; DS:SI: Ptr to EDRIVE_INFO
162; AH: BIOS Error code
[327]163; CF: Cleared = no errors
164; Set = BIOS error code stored in AH
165; Corrupts registers:
166; Nothing
167;--------------------------------------------------------------------
168Bios_ReadEbiosInfoFromDriveDLtoDSSI:
169 mov si, g_edriveInfo
170 mov WORD [si+EDRIVE_INFO.wSize], MINIMUM_EDRIVEINFO_SIZE
171 mov ah, GET_EXTENDED_DRIVE_INFORMATION
172 int BIOS_DISK_INTERRUPT_13h
173 ret
174
175
176;---------------------------------------------------------------------
177; ReturnInvalidErrorCodeInAH
178; ReturnWithBiosErrorCodeInAH
179; Parameters:
180; Nothing
181; Returns: (if no errors)
[566]182; AH: BIOS Error code
[327]183; CF: Set
184; Corrupts registers:
185; Nothing
186;--------------------------------------------------------------------
187ReturnInvalidErrorCodeInAH:
188 stc
[526]189 mov ah, RET_HD_INVALID
[327]190ReturnWithBiosErrorCodeInAH:
191 ret
192
193
194; Section containing uninitialized data
195SECTION .bss
196
197g_edriveInfo:
198g_rgbAtaInfo: resb 512
Note: See TracBrowser for help on using the repository browser.