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

Last change on this file since 611 was 590, checked in by Krister Nordvall, 9 years ago

Changes:

  • Updated URLs and copyright info in BIOSDRVS and XTIDECFG.
  • BIOSDRVS should now build under Linux.
  • Minor optimizations to the library.
File size: 5.8 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-2013 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
29%include "IdeRegisters.inc" ; From XTIDE Universal BIOS
30%include "RomVars.inc" ; From XTIDE Universal BIOS
31%include "CustomDPT.inc" ; From XTIDE Universal BIOS
32
33
34; Section containing code
35SECTION .text
36
37; Program first instruction.
38ORG 100h ; Code starts at offset 100h (DOS .COM)
39Start:
40 jmp StartBiosDriveInformationTool
41
42; Include library and other sources
43%include "AssemblyLibrary.asm"
44%include "AtaGeometry.asm" ; From XTIDE Universal BIOS
45%include "Strings.asm"
46%include "AtaInfo.asm"
47%include "Bios.asm"
48%include "Print.asm"
49
50
51;--------------------------------------------------------------------
52; Program start
53;--------------------------------------------------------------------
54ALIGN JUMP_ALIGN
55StartBiosDriveInformationTool:
56 CALL_DISPLAY_LIBRARY InitializeDisplayContext
57 call Print_SetCharacterOutputToSTDOUT
58
59 ; Display program name and version
60 mov si, g_szProgramName
61 call Print_NullTerminatedStringFromSI
62 ; Fall to ReadAndDisplayAllHardDrives
63
64
65;--------------------------------------------------------------------
66; ReadAndDisplayAllHardDrives
67; Parameters:
68; Nothing
69; Returns:
70; Nothing
71; Corrupts registers:
72; All, except segments
73;--------------------------------------------------------------------
74ReadAndDisplayAllHardDrives:
75 call Bios_GetNumberOfHardDrivesToDX
76 jc SHORT .NoDrivesAvailable
77 mov cx, dx
78 mov dl, 80h ; First hard drive
79 jmp SHORT .DisplayFirstDrive
80
81.DisplayNextDriveFromDL:
82 mov si, g_szPressAnyKey
83 call Print_NullTerminatedStringFromSI
84 call Keyboard_GetKeystrokeToAXandWaitIfNecessary
85
86.DisplayFirstDrive:
87 ; Display drive number
88 mov si, g_szHeaderDrive
89 call Print_DriveNumberFromDLusingFormatStringInSI
90
91 ; Display ATA information read from drive
92 mov si, g_szAtaInfoHeader
93 call Print_NullTerminatedStringFromSI
94 call AtaInfo_DisplayAtaInformationForDriveDL
95
96 ; Display INT 13h AH=08h and AH=15h information
97 mov si, g_szOldInfoHeader
98 call Print_NullTerminatedStringFromSI
99 call DisplayOldInt13hInformationForDriveDL
100
101 ; Display EBIOS information
102 mov si, g_szNewInfoHeader
103 call Print_NullTerminatedStringFromSI
104 call DisplayNewInt13hInformationFromDriveDL
105
106 inc dx
107 loop .DisplayNextDriveFromDL
108.NoDrivesAvailable:
109 ret ; Exit to DOS
110
111
112;--------------------------------------------------------------------
113; DisplayOldInt13hInformationForDriveDL
114; Parameters:
115; DL: Drive Number
116; Returns:
117; Nothing
118; Corrupts registers:
119; All, except CX and DX
120;--------------------------------------------------------------------
121DisplayOldInt13hInformationForDriveDL:
122 push cx
123 push dx
124
125 ; Print L-CHS from AH=08h
126 call Bios_ReadOldInt13hParametersFromDriveDL
127 call Print_ErrorMessageFromAHifError
128 jc SHORT .SkipOldInt13hSinceError
129 call Print_CHSfromCXDXAX
130
131 ; Print total sector count from AH=15h
132 mov si, g_szSectors
133 call Print_NullTerminatedStringFromSI
134 pop dx
135 push dx
136 call Bios_ReadOldInt13hCapacityFromDriveDL
137 call Print_ErrorMessageFromAHifError
138 jc SHORT .SkipOldInt13hSinceError
139
140 xchg ax, dx
141 mov dx, cx
142 xor bx, bx
143 call Print_TotalSectorsFromBXDXAX
144.SkipOldInt13hSinceError:
145 pop dx
146 pop cx
147 ret
148
149
150;--------------------------------------------------------------------
151; DisplayNewInt13hInformationFromDriveDL
152; Parameters:
153; DL: Drive Number
154; Returns:
155; Nothing
156; Corrupts registers:
157; All, except CX and DX
158;--------------------------------------------------------------------
159DisplayNewInt13hInformationFromDriveDL:
160 push cx
161 push dx
162
163 ; Display EBIOS version
164 call Bios_ReadEbiosVersionFromDriveDL
165 call Print_ErrorMessageFromAHifError
166 jc SHORT .SkipNewInt13hSinceError
167 call Print_EbiosVersionFromBXandExtensionsFromCX
168
169 ; Display drive info from AH=48h
170 call Bios_ReadEbiosInfoFromDriveDLtoDSSI
171 call Print_ErrorMessageFromAHifError
172 jc SHORT .SkipNewInt13hSinceError
173
174 ; Display CHS
175 test WORD [si+EDRIVE_INFO.wFlags], FLG_CHS_INFORMATION_IS_VALID
176 jz SHORT .SkipEbiosCHS
177 mov cx, [si+EDRIVE_INFO.dwCylinders]
178 mov dx, [si+EDRIVE_INFO.dwHeads]
179 mov ax, [si+EDRIVE_INFO.dwSectorsPerTrack]
180 call Print_CHSfromCXDXAX
181.SkipEbiosCHS:
182
183 ; Display total sector count
184 push si
185 mov si, g_szSectors
186 call Print_NullTerminatedStringFromSI
187 pop si
188 mov ax, [si+EDRIVE_INFO.qwTotalSectors]
189 mov dx, [si+EDRIVE_INFO.qwTotalSectors+2]
190 mov bx, [si+EDRIVE_INFO.qwTotalSectors+4]
191 call Print_TotalSectorsFromBXDXAX
192
193 ; Display sector size
194 mov ax, [si+EDRIVE_INFO.wSectorSize]
195 mov si, g_szNewSectorSize
196 call Print_FormatStringFromSIwithParameterInAX
197
198.SkipNewInt13hSinceError:
199 pop dx
200 pop cx
201 ret
Note: See TracBrowser for help on using the repository browser.