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

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

Changes to BIOS Drive Information Tool:

  • L-CHS variables generated by XTIDE Universal BIOS are now displayed.
File size: 6.1 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; Include .inc files
6%define INCLUDE_DISPLAY_LIBRARY
7%define INCLUDE_KEYBOARD_LIBRARY
8%include "AssemblyLibrary.inc"  ; Assembly Library. Must be included first!
9%include "Version.inc"          ; From XTIDE Universal BIOS
10%include "ATA_ID.inc"           ; From XTIDE Universal BIOS
11%include "Int13h.inc"           ; From XTIDE Universal BIOS
12%include "EBIOS.inc"            ; From XTIDE Universal BIOS
13FLG_DRVNHEAD_DRV    EQU (1<<4)  ; Required by CustomDPT.inc
14%include "CustomDPT.inc"        ; From XTIDE Universal BIOS
15
16
17; Section containing code
18SECTION .text
19
20; Program first instruction.
21ORG 100h                        ; Code starts at offset 100h (DOS .COM)
22Start:
23    jmp     StartBiosDriveInformationTool
24
25; Include library and other sources
26%include "AssemblyLibrary.asm"
27%include "LbaAssist.asm"        ; From XTIDE Universal BIOS
28%include "Strings.asm"
29%include "Bios.asm"
30%include "Print.asm"
31
32
33;--------------------------------------------------------------------
34; Program start
35;--------------------------------------------------------------------
36ALIGN JUMP_ALIGN
37StartBiosDriveInformationTool:
38    CALL_DISPLAY_LIBRARY    InitializeDisplayContext
39    call    Print_SetCharacterOutputToSTDOUT
40
41    mov     si, g_szProgramName
42    call    Print_NullTerminatedStringFromSI
43
44    call    ReadAndDisplayAllHardDrives
45
46    ; Exit to DOS
47    mov     ax, 4C00h           ; Exit to DOS
48    int     21h
49
50
51
52ReadAndDisplayAllHardDrives:
53    call    Bios_GetNumberOfHardDrivesToDX
54    jc      SHORT .NoDrivesAvailable
55    mov     cx, dx
56    mov     dl, 80h             ; First hard drive
57    jmp     SHORT .DisplayFirstDrive
58
59ALIGN JUMP_ALIGN
60.DisplayNextDriveFromDL:
61    mov     si, g_szPressAnyKey
62    call    Print_NullTerminatedStringFromSI
63    call    Keyboard_GetKeystrokeToAXandWaitIfNecessary
64
65.DisplayFirstDrive:
66    mov     si, g_szHeaderDrive
67    call    Print_DriveNumberFromDLusingFormatStringInSI
68
69    mov     si, g_szAtaInfoHeader
70    call    Print_NullTerminatedStringFromSI
71    call    DisplayAtaInformationForDriveDL
72
73    mov     si, g_szOldInfoHeader
74    call    Print_NullTerminatedStringFromSI
75    call    DisplayOldInt13hInformationForDriveDL
76
77    mov     si, g_szNewInfoHeader
78    call    Print_NullTerminatedStringFromSI
79    call    DisplayNewInt13hInformationFromDriveDL
80
81    inc     dx
82    loop    .DisplayNextDriveFromDL
83.NoDrivesAvailable:
84    ret
85
86
87ALIGN JUMP_ALIGN
88DisplayAtaInformationForDriveDL:
89    push    cx
90    push    dx
91
92    call    Bios_ReadAtaInfoFromDriveDLtoBX
93    call    Print_ErrorMessageFromAHifError
94    jc      SHORT .SkipAtaInfoSinceError
95
96    call    Print_NameFromAtaInfoInBX
97
98    mov     cx, [bx+ATA1.wCylCnt]
99    mov     dx, [bx+ATA1.wHeadCnt]
100    mov     ax, [bx+ATA1.wSPT]
101    call    Print_CHSfromCXDXAX
102
103    test    WORD [bx+ATA1.wFields], A1_wFields_54to58
104    jz      SHORT .SkipChsSectors
105    mov     si, g_szChsSectors
106    call    Print_NullTerminatedStringFromSI
107    mov     si, bx
108    mov     ax, [si+ATA1.dwCurSCnt]
109    mov     dx, [si+ATA1.dwCurSCnt+2]
110    xor     bx, bx
111    call    Print_TotalSectorsFromBXDXAX
112    mov     bx, si
113.SkipChsSectors:
114
115    test    WORD [bx+ATA1.wCaps], A1_wCaps_LBA
116    jz      SHORT .SkipLBA28
117    mov     si, g_szLBA28
118    call    Print_NullTerminatedStringFromSI
119    mov     si, bx
120    mov     ax, [si+ATA1.dwLBACnt]
121    mov     dx, [si+ATA1.dwLBACnt+2]
122    xor     bx, bx
123    call    Print_TotalSectorsFromBXDXAX
124    mov     bx, si
125.SkipLBA28:
126
127    test    WORD [bx+ATA6.wSetSup83], A6_wSetSup83_LBA48
128    jz      SHORT .SkipLBA48
129    mov     si, g_szLBA48
130    call    Print_NullTerminatedStringFromSI
131    mov     si, bx
132    mov     ax, [bx+ATA6.qwLBACnt]
133    mov     dx, [bx+ATA6.qwLBACnt+2]
134    mov     bx, [bx+ATA6.qwLBACnt+4]
135    call    Print_TotalSectorsFromBXDXAX
136    mov     bx, si
137.SkipLBA48:
138
139    ; Print L-CHS generated by XTIDE Universal BIOS
140    mov     ax, g_szXTUBversion
141    mov     si, g_szXTUB
142    call    Print_VersionStringFromAXusingFormatStringInSI
143    call    DisplayXTUBcompatibilityInfoUsingAtaInfoFromDSBX
144
145.SkipAtaInfoSinceError:
146    pop     dx
147    pop     cx
148    ret
149
150
151ALIGN JUMP_ALIGN
152DisplayXTUBcompatibilityInfoUsingAtaInfoFromDSBX:
153    test    WORD [bx+ATA1.wCaps], A1_wCaps_LBA
154    jz      SHORT .LbaNotSupported
155    test    WORD [bx+ATA6.wSetSup83], A6_wSetSup83_LBA48
156    jz      SHORT .LoadLba28SectorCount
157
158    ; Load LBA48 Sector Count
159    mov     ax, [bx+ATA6.qwLBACnt]
160    mov     dx, [bx+ATA6.qwLBACnt+2]
161    mov     bx, [bx+ATA6.qwLBACnt+4]
162    jmp     SHORT .ConvertLbaToLCHS
163.LoadLba28SectorCount:
164    mov     ax, [bx+ATA1.dwLBACnt]
165    mov     dx, [bx+ATA1.dwLBACnt+2]
166    xor     bx, bx
167
168.ConvertLbaToLCHS:
169    call    LbaAssist_ConvertSectorCountFromBXDXAXtoLbaAssistedCHSinDXAXBLBH
170    LIMIT_LBA_CYLINDERS_IN_DXAX_TO_LCHS_CYLINDERS
171    xchg    cx, ax
172    eMOVZX  dx, bl
173    eMOVZX  ax, bh
174    call    Print_CHSfromCXDXAX
175.LbaNotSupported:
176    ret
177
178
179ALIGN JUMP_ALIGN
180DisplayOldInt13hInformationForDriveDL:
181    push    cx
182    push    dx
183
184    call    Bios_ReadOldInt13hParametersFromDriveDL
185    call    Print_ErrorMessageFromAHifError
186    jc      SHORT .SkipOldInt13hSinceError
187    call    Print_CHSfromCXDXAX
188
189    mov     si, g_szSectors
190    call    Print_NullTerminatedStringFromSI
191    pop     dx
192    push    dx
193    call    Bios_ReadOldInt13hCapacityFromDriveDL
194    call    Print_ErrorMessageFromAHifError
195    jc      SHORT .SkipOldInt13hSinceError
196    xchg    ax, dx
197    mov     dx, cx
198    xor     bx, bx
199    call    Print_TotalSectorsFromBXDXAX
200.SkipOldInt13hSinceError:
201    pop     dx
202    pop     cx
203    ret
204
205
206ALIGN JUMP_ALIGN
207DisplayNewInt13hInformationFromDriveDL:
208    push    cx
209    push    dx
210
211    call    Bios_ReadEbiosVersionFromDriveDL
212    call    Print_ErrorMessageFromAHifError
213    jc      SHORT .SkipNewInt13hSinceError
214    call    Print_EbiosVersionFromBXandExtensionsFromCX
215
216    call    Bios_ReadEbiosInfoFromDriveDLtoDSSI
217    call    Print_ErrorMessageFromAHifError
218    jc      SHORT .SkipNewInt13hSinceError
219
220    test    WORD [si+EDRIVE_INFO.wFlags], FLG_CHS_INFORMATION_IS_VALID
221    jz      SHORT .SkipEbiosCHS
222    mov     ax, [si+EDRIVE_INFO.dwCylinders]
223    mov     dx, [si+EDRIVE_INFO.dwHeads]
224    mov     cx, [si+EDRIVE_INFO.dwSectorsPerTrack]
225    call    Print_CHSfromCXDXAX
226.SkipEbiosCHS:
227
228    push    si
229    mov     si, g_szSectors
230    call    Print_NullTerminatedStringFromSI
231    pop     si
232    mov     ax, [si+EDRIVE_INFO.qwTotalSectors]
233    mov     dx, [si+EDRIVE_INFO.qwTotalSectors+2]
234    mov     bx, [si+EDRIVE_INFO.qwTotalSectors+4]
235    call    Print_TotalSectorsFromBXDXAX
236
237    mov     ax, [si+EDRIVE_INFO.wSectorSize]
238    mov     si, g_szNewSectorSize
239    call    Print_SectorSizeFromAXusingFormatStringInSI
240
241.SkipNewInt13hSinceError:
242    pop     dx
243    pop     cx
244    ret
Note: See TracBrowser for help on using the repository browser.