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

Last change on this file since 613 was 613, checked in by aitotat, 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
Line 
1; Project name  :   BIOS Drive Information Tool
2; Description   :   Functions to read information from BIOS.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2013 by XTIDE Universal BIOS Team.
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.
12;
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
16; GNU General Public License for more details.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
20; Section containing code
21SECTION .text
22
23;---------------------------------------------------------------------
24; Bios_GetNumberOfHardDrivesToDX
25;   Parameters:
26;       Nothing
27;   Returns: (if no errors)
28;       DX:     Number of hard drives in system
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)
46;       BL:     Drive Type (for floppies only)
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:
69;       BL:     Drive Type (for floppies only)
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)
95;       CX:DX:  Total number of sectors
96;       AH:     BIOS Error code
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)
115;       DS:BX:  Ptr to ATA information
116;       AH:     BIOS Error code
117;       CF:     Cleared = no errors
118;               Set = BIOS error code stored in AH
119;   Corrupts registers:
120;       CX, ES
121;--------------------------------------------------------------------
122Bios_ReadAtaInfoFromDriveDLtoBX:
123    mov     bx, g_rgbAtaInfo
124    push    ds
125    pop     es
126    mov     cx, XUB_INT13h_SIGNATURE    ; Signature to read unaltered ATA ID
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
138;       BX:     Version of extensions
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
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
153    ret
154
155
156;---------------------------------------------------------------------
157; Bios_ReadEbiosInfoFromDriveDLtoDSSI
158;   Parameters:
159;       DL:     BIOS drive number
160;   Returns: (if no errors)
161;       DS:SI:  Ptr to EDRIVE_INFO
162;       AH:     BIOS Error code
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)
182;       AH:     BIOS Error code
183;       CF:     Set
184;   Corrupts registers:
185;       Nothing
186;--------------------------------------------------------------------
187ReturnInvalidErrorCodeInAH:
188    stc
189    mov     ah, RET_HD_INVALID
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.