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

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

Changes:

  • Update of the copyright notices to include the year 2013.
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;       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
137;       BX:     Version of extensions
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)
165;       DS:SI:  Ptr to EDRIVE_INFO
166;       AH:     BIOS Error code
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)
186;       AH:     BIOS Error code
187;       CF:     Set
188;   Corrupts registers:
189;       Nothing
190;--------------------------------------------------------------------
191ReturnInvalidErrorCodeInAH:
192    stc
193    mov     ah, RET_HD_INVALID
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.