source: xtideuniversalbios/trunk/BIOS_Drive_Information_Tool/Src/Main.asm @ 376

Last change on this file since 376 was 376, checked in by gregli@…, 12 years ago

WIDE checkin... Added copyright and license information to sorce files, as per the GPL instructions for usage.

File size: 6.7 KB
Line 
1; Project name  :   BIOS Drive Information Tool
2; Description   :   BIOS Drive Information Tool reads and displays
3;                   drive information from BIOS.
4
5;
6; XTIDE Universal BIOS and Associated Tools 
7; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 by XTIDE Universal BIOS Team.
8;
9; This program is free software; you can redistribute it and/or modify
10; it under the terms of the GNU General Public License as published by
11; the Free Software Foundation; either version 2 of the License, or
12; (at your option) any later version.
13; 
14; This program is distributed in the hope that it will be useful,
15; but WITHOUT ANY WARRANTY; without even the implied warranty of
16; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17; GNU General Public License for more details.     
18; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19;       
20
21; Include .inc files
22%define INCLUDE_DISPLAY_LIBRARY
23%define INCLUDE_KEYBOARD_LIBRARY
24%include "AssemblyLibrary.inc"  ; Assembly Library. Must be included first!
25%include "Version.inc"          ; From XTIDE Universal BIOS
26%include "ATA_ID.inc"           ; From XTIDE Universal BIOS
27%include "Int13h.inc"           ; From XTIDE Universal BIOS
28%include "EBIOS.inc"            ; From XTIDE Universal BIOS
29FLG_DRVNHEAD_DRV    EQU (1<<4)  ; Required by CustomDPT.inc
30%include "CustomDPT.inc"        ; From XTIDE Universal BIOS
31
32
33; Section containing code
34SECTION .text
35
36; Program first instruction.
37ORG 100h                        ; Code starts at offset 100h (DOS .COM)
38Start:
39    jmp     StartBiosDriveInformationTool
40
41; Include library and other sources
42%include "AssemblyLibrary.asm"
43%include "LbaAssist.asm"        ; From XTIDE Universal BIOS
44%include "Strings.asm"
45%include "Bios.asm"
46%include "Print.asm"
47
48
49;--------------------------------------------------------------------
50; Program start
51;--------------------------------------------------------------------
52ALIGN JUMP_ALIGN
53StartBiosDriveInformationTool:
54    CALL_DISPLAY_LIBRARY    InitializeDisplayContext
55    call    Print_SetCharacterOutputToSTDOUT
56
57    mov     si, g_szProgramName
58    call    Print_NullTerminatedStringFromSI
59
60    call    ReadAndDisplayAllHardDrives
61
62    ; Exit to DOS
63    mov     ax, 4C00h           ; Exit to DOS
64    int     21h
65
66
67
68ReadAndDisplayAllHardDrives:
69    call    Bios_GetNumberOfHardDrivesToDX
70    jc      SHORT .NoDrivesAvailable
71    mov     cx, dx
72    mov     dl, 80h             ; First hard drive
73    jmp     SHORT .DisplayFirstDrive
74
75ALIGN JUMP_ALIGN
76.DisplayNextDriveFromDL:
77    mov     si, g_szPressAnyKey
78    call    Print_NullTerminatedStringFromSI
79    call    Keyboard_GetKeystrokeToAXandWaitIfNecessary
80
81.DisplayFirstDrive:
82    mov     si, g_szHeaderDrive
83    call    Print_DriveNumberFromDLusingFormatStringInSI
84
85    mov     si, g_szAtaInfoHeader
86    call    Print_NullTerminatedStringFromSI
87    call    DisplayAtaInformationForDriveDL
88
89    mov     si, g_szOldInfoHeader
90    call    Print_NullTerminatedStringFromSI
91    call    DisplayOldInt13hInformationForDriveDL
92
93    mov     si, g_szNewInfoHeader
94    call    Print_NullTerminatedStringFromSI
95    call    DisplayNewInt13hInformationFromDriveDL
96
97    inc     dx
98    loop    .DisplayNextDriveFromDL
99.NoDrivesAvailable:
100    ret
101
102
103ALIGN JUMP_ALIGN
104DisplayAtaInformationForDriveDL:
105    push    cx
106    push    dx
107
108    call    Bios_ReadAtaInfoFromDriveDLtoBX
109    call    Print_ErrorMessageFromAHifError
110    jc      SHORT .SkipAtaInfoSinceError
111
112    call    Print_NameFromAtaInfoInBX
113
114    mov     cx, [bx+ATA1.wCylCnt]
115    mov     dx, [bx+ATA1.wHeadCnt]
116    mov     ax, [bx+ATA1.wSPT]
117    call    Print_CHSfromCXDXAX
118
119    test    WORD [bx+ATA1.wFields], A1_wFields_54to58
120    jz      SHORT .SkipChsSectors
121    mov     si, g_szChsSectors
122    call    Print_NullTerminatedStringFromSI
123    mov     si, bx
124    mov     ax, [si+ATA1.dwCurSCnt]
125    mov     dx, [si+ATA1.dwCurSCnt+2]
126    xor     bx, bx
127    call    Print_TotalSectorsFromBXDXAX
128    mov     bx, si
129.SkipChsSectors:
130
131    test    WORD [bx+ATA1.wCaps], A1_wCaps_LBA
132    jz      SHORT .SkipLBA28
133    mov     si, g_szLBA28
134    call    Print_NullTerminatedStringFromSI
135    mov     si, bx
136    mov     ax, [si+ATA1.dwLBACnt]
137    mov     dx, [si+ATA1.dwLBACnt+2]
138    xor     bx, bx
139    call    Print_TotalSectorsFromBXDXAX
140    mov     bx, si
141.SkipLBA28:
142
143    test    WORD [bx+ATA6.wSetSup83], A6_wSetSup83_LBA48
144    jz      SHORT .SkipLBA48
145    mov     si, g_szLBA48
146    call    Print_NullTerminatedStringFromSI
147    mov     si, bx
148    mov     ax, [bx+ATA6.qwLBACnt]
149    mov     dx, [bx+ATA6.qwLBACnt+2]
150    mov     bx, [bx+ATA6.qwLBACnt+4]
151    call    Print_TotalSectorsFromBXDXAX
152    mov     bx, si
153.SkipLBA48:
154
155    ; Print L-CHS generated by XTIDE Universal BIOS
156    mov     ax, g_szXTUBversion
157    mov     si, g_szXTUB
158    call    Print_VersionStringFromAXusingFormatStringInSI
159    call    DisplayXTUBcompatibilityInfoUsingAtaInfoFromDSBX
160
161.SkipAtaInfoSinceError:
162    pop     dx
163    pop     cx
164    ret
165
166
167ALIGN JUMP_ALIGN
168DisplayXTUBcompatibilityInfoUsingAtaInfoFromDSBX:
169    test    WORD [bx+ATA1.wCaps], A1_wCaps_LBA
170    jz      SHORT .LbaNotSupported
171    test    WORD [bx+ATA6.wSetSup83], A6_wSetSup83_LBA48
172    jz      SHORT .LoadLba28SectorCount
173
174    ; Load LBA48 Sector Count
175    mov     ax, [bx+ATA6.qwLBACnt]
176    mov     dx, [bx+ATA6.qwLBACnt+2]
177    mov     bx, [bx+ATA6.qwLBACnt+4]
178    jmp     SHORT .ConvertLbaToLCHS
179.LoadLba28SectorCount:
180    mov     ax, [bx+ATA1.dwLBACnt]
181    mov     dx, [bx+ATA1.dwLBACnt+2]
182    xor     bx, bx
183
184.ConvertLbaToLCHS:
185    call    LbaAssist_ConvertSectorCountFromBXDXAXtoLbaAssistedCHSinDXAXBLBH
186    LIMIT_LBA_CYLINDERS_IN_DXAX_TO_LCHS_CYLINDERS
187    xchg    cx, ax
188    eMOVZX  dx, bl
189    eMOVZX  ax, bh
190    call    Print_CHSfromCXDXAX
191.LbaNotSupported:
192    ret
193
194
195ALIGN JUMP_ALIGN
196DisplayOldInt13hInformationForDriveDL:
197    push    cx
198    push    dx
199
200    call    Bios_ReadOldInt13hParametersFromDriveDL
201    call    Print_ErrorMessageFromAHifError
202    jc      SHORT .SkipOldInt13hSinceError
203    call    Print_CHSfromCXDXAX
204
205    mov     si, g_szSectors
206    call    Print_NullTerminatedStringFromSI
207    pop     dx
208    push    dx
209    call    Bios_ReadOldInt13hCapacityFromDriveDL
210    call    Print_ErrorMessageFromAHifError
211    jc      SHORT .SkipOldInt13hSinceError
212    xchg    ax, dx
213    mov     dx, cx
214    xor     bx, bx
215    call    Print_TotalSectorsFromBXDXAX
216.SkipOldInt13hSinceError:
217    pop     dx
218    pop     cx
219    ret
220
221
222ALIGN JUMP_ALIGN
223DisplayNewInt13hInformationFromDriveDL:
224    push    cx
225    push    dx
226
227    call    Bios_ReadEbiosVersionFromDriveDL
228    call    Print_ErrorMessageFromAHifError
229    jc      SHORT .SkipNewInt13hSinceError
230    call    Print_EbiosVersionFromBXandExtensionsFromCX
231
232    call    Bios_ReadEbiosInfoFromDriveDLtoDSSI
233    call    Print_ErrorMessageFromAHifError
234    jc      SHORT .SkipNewInt13hSinceError
235
236    test    WORD [si+EDRIVE_INFO.wFlags], FLG_CHS_INFORMATION_IS_VALID
237    jz      SHORT .SkipEbiosCHS
238    mov     ax, [si+EDRIVE_INFO.dwCylinders]
239    mov     dx, [si+EDRIVE_INFO.dwHeads]
240    mov     cx, [si+EDRIVE_INFO.dwSectorsPerTrack]
241    call    Print_CHSfromCXDXAX
242.SkipEbiosCHS:
243
244    push    si
245    mov     si, g_szSectors
246    call    Print_NullTerminatedStringFromSI
247    pop     si
248    mov     ax, [si+EDRIVE_INFO.qwTotalSectors]
249    mov     dx, [si+EDRIVE_INFO.qwTotalSectors+2]
250    mov     bx, [si+EDRIVE_INFO.qwTotalSectors+4]
251    call    Print_TotalSectorsFromBXDXAX
252
253    mov     ax, [si+EDRIVE_INFO.wSectorSize]
254    mov     si, g_szNewSectorSize
255    call    Print_SectorSizeFromAXusingFormatStringInSI
256
257.SkipNewInt13hSinceError:
258    pop     dx
259    pop     cx
260    ret
Note: See TracBrowser for help on using the repository browser.