source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH9h_HInit.asm@ 499

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

Separated MODULE_8BIT_IDE into the basic part used by XTIDE rev 1 and rev 2 which is PIO based, and MODULE_8BIT_IDE_ADVANCED for JRIDE and XTCF support which requires memory mapping and/or DMA. This allows for creating an 8KB image with boot menu support (but no hotkeys) for the XTIDE rev 1. Cleaned up how we reset the drive translation information, ensuring it is properly set between boot attempt on a primary and secondary drive - as a result we clean it when needed, rather than trying to always keep it clean. Also fixed translation bugs in int13h.asm where I had previously missed converting some MODULE_HOTKEYS into MODULE_DRIVEXLATE.

File size: 9.5 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Int 13h function AH=9h, Initialize Drive Parameters.
3
4;
5; XTIDE Universal BIOS and Associated Tools
6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 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; STORE_ERROR_FLAG_TO_DPT
25; Parameters:
26; %1: Error flag to set
27; AH: BIOS Error Code
28; DS:DI: Ptr to DPT
29; CF: Set if error code in AH
30; Returns:
31; CF: Clear if no error
32; Set if error flag was set
33; Corrupts registers:
34; Nothing
35;--------------------------------------------------------------------
36%macro STORE_ERROR_FLAG_TO_DPT 1
37 mov al, %1
38 call SetErrorFlagFromALwithErrorCodeInAH
39%endmacro
40
41
42;--------------------------------------------------------------------
43; Int 13h function AH=9h, Initialize Drive Parameters.
44;
45; AH9h_HandlerForInitializeDriveParameters
46; Parameters:
47; DL: Translated Drive number
48; DS:DI: Ptr to DPT (in RAMVARS segment)
49; SS:BP: Ptr to IDEPACK
50; Returns with INTPACK:
51; AH: Int 13h return status
52; CF: 0 if successful, 1 if error
53;--------------------------------------------------------------------
54AH9h_HandlerForInitializeDriveParameters:
55%ifndef USE_186
56 call AH9h_InitializeDriveForUse
57 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
58%else
59 push Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
60 ; Fall to AH9h_InitializeDriveForUse
61%endif
62
63
64;--------------------------------------------------------------------
65; Initialize drive to be ready for use.
66;
67; AH9h_InitializeDriveForUse
68; Parameters:
69; DS:DI: Ptr to DPT (in RAMVARS segment)
70; SS:BP: Ptr to IDEPACK
71; Returns:
72; AH: Int 13h return status
73; CF: 0 if successful, 1 if error
74; Corrupts registers:
75; AL, BX, CX, DX
76;--------------------------------------------------------------------
77AH9h_InitializeDriveForUse:
78 xor ax, ax ; Clear AH to assume no errors
79
80%ifdef MODULE_ADVANCED_ATA
81 ; Clear Initialization Error flags from DPT
82 mov [di+DPT.bInitError], al
83%endif
84
85%ifdef MODULE_SERIAL
86 ; No need to do this for serial devices
87 test BYTE [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE ; Clears CF
88 jz SHORT .ContinueInitialization
89 ret ; With AH and CF cleared
90.ContinueInitialization:
91%endif
92
93 push es
94 push si
95
96
97;;; SelectDrive
98 ; Try to select drive and wait until ready
99 call AccessDPT_GetDriveSelectByteForOldInt13hToAL
100 mov [bp+IDEPACK.bDrvAndHead], al
101 call Device_SelectDrive
102 STORE_ERROR_FLAG_TO_DPT FLG_INITERROR_FAILED_TO_SELECT_DRIVE
103 jnc SHORT .ContinueInitializationSinceDriveSelectedSuccesfully
104 jmp .ReturnWithErrorCodeInAH
105.ContinueInitializationSinceDriveSelectedSuccesfully:
106
107
108;;; Set XT-CF mode
109%ifdef MODULE_8BIT_IDE_ADVANCED
110 call AccessDPT_GetIdevarsToCSBX
111 mov al, [cs:bx+IDEVARS.bXTCFcontrolRegister]
112 call AH9h_SetModeFromALtoXTCF
113 STORE_ERROR_FLAG_TO_DPT FLG_INITERROR_FAILED_TO_SET_XTCF_MODE
114.DoNotSetXTCFmode:
115%endif ; MODULE_8BIT_IDE_ADVANCED
116
117%ifdef MODULE_8BIT_IDE
118;;; Set 8-bit PIO mode
119 call AH9h_Enable8bitModeForDevice8bitAta
120 STORE_ERROR_FLAG_TO_DPT FLG_INITERROR_FAILED_TO_SET_8BIT_MODE
121.DoNotSet8bitMode:
122%endif ; MODULE_8BIT_IDE
123
124
125;;; InitializeDeviceParameters
126 ; Initialize CHS parameters if LBA is not used and
127 ; user has specified P-CHS parameters
128 test BYTE [di+DPT.bFlagsLow], FLGL_DPT_ASSISTED_LBA
129 jnz SHORT .SkipInitializeDeviceParameters ; No need to initialize CHS parameters if LBA mode enabled
130 call AccessDPT_GetPointerToDRVPARAMStoCSBX
131 test BYTE [cs:bx+DRVPARAMS.wFlags], FLG_DRVPARAMS_USERCHS ; User specified P-CHS?
132 jz SHORT .SkipInitializeDeviceParameters
133
134 ; Initialize Logical Sectors per Track and Max Head number
135 mov ax, [cs:bx+DRVPARAMS.wHeadsAndSectors]
136 dec ax ; Max Head number
137 xchg al, ah ; Heads now in AH
138 mov dx, ax ; Sectors per Track now in DL
139 mov al, COMMAND_INITIALIZE_DEVICE_PARAMETERS
140 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_BSY, FLG_STATUS_BSY)
141 call Idepack_StoreNonExtParametersAndIssueCommandFromAL
142 STORE_ERROR_FLAG_TO_DPT FLG_INITERROR_FAILED_TO_INITIALIZE_CHS_PARAMETERS
143.SkipInitializeDeviceParameters:
144
145
146;;; SetWriteCache
147 ; Enable or Disable Write Cache
148 call AccessDPT_GetPointerToDRVPARAMStoCSBX
149 mov bl, [cs:bx+DRVPARAMS.wFlags]
150 push bx ; Save .wFlags for later use in InitializeBlockMode
151 and bx, BYTE MASK_DRVPARAMS_WRITECACHE
152 jz SHORT .SkipSetWriteCache ; DEFAULT_WRITE_CACHE
153 mov si, [cs:bx+.rgbWriteCacheCommands]
154 call AH23h_SetControllerFeatures
155 STORE_ERROR_FLAG_TO_DPT FLG_INITERROR_FAILED_TO_SET_WRITE_CACHE
156.SkipSetWriteCache:
157
158
159;;; RecalibrateDrive
160 ; Recalibrate drive by seeking to cylinder 0
161 call AH11h_RecalibrateDrive
162 STORE_ERROR_FLAG_TO_DPT FLG_INITERROR_FAILED_TO_RECALIBRATE_DRIVE
163
164
165;;; InitializeBlockMode
166 ; Initialize block mode transfers
167 pop ax ; Restore .wFlags saved in SetWriteCache
168 test BYTE [di+DPT.bFlagsHigh], FLGH_DPT_BLOCK_MODE_SUPPORTED
169 jz SHORT .BlockModeNotSupportedOrDisabled
170 test al, FLG_DRVPARAMS_BLOCKMODE
171 jz SHORT .BlockModeNotSupportedOrDisabled
172
173 ; Try block sizes until we find largest possible supported by drive
174 mov bl, 128
175.TryNextBlockSize:
176 mov al, bl
177 call AH24h_SetBlockSize ; Stores block size to DPT
178 jnc SHORT .SupportedBlockSizeFound
179 shr bl, 1
180 jnc SHORT .TryNextBlockSize
181 STORE_ERROR_FLAG_TO_DPT FLG_INITERROR_FAILED_TO_SET_BLOCK_MODE
182.BlockModeNotSupportedOrDisabled:
183.SupportedBlockSizeFound:
184
185
186%ifdef MODULE_ADVANCED_ATA
187;;; InitializePioMode
188 ; Initialize fastest supported PIO mode
189 mov dl, PIO_DEFAULT_MODE_DISABLE_IORDY
190 test BYTE [di+DPT.bFlagsHigh], FLGH_DPT_IORDY
191 jz SHORT .IordyNotSupported
192
193 ; Advanced PIO mode 3 and above
194 mov dl, [di+DPT_ADVANCED_ATA.bPioMode]
195 or dl, PIO_FLOW_CONTROL_MODE_xxx
196
197.IordyNotSupported:
198 mov si, FEATURE_SET_TRANSFER_MODE
199 call AH23h_SetControllerFeatures
200 STORE_ERROR_FLAG_TO_DPT FLG_INITERROR_FAILED_TO_SET_PIO_MODE
201%endif ; MODULE_ADVANCED_ATA
202
203
204%ifdef MODULE_FEATURE_SETS
205;;; InitStandbyTimer
206 ; Initialize the standby timer (if supported)
207 test BYTE [di+DPT.bFlagsHigh], FLGH_DPT_POWER_MANAGEMENT_SUPPORTED
208 jz SHORT .NoPowerManagementSupport
209
210 mov al, COMMAND_IDLE
211 mov dl, [cs:ROMVARS.bIdleTimeout]
212 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_BSY, FLG_STATUS_BSY)
213 call Idepack_StoreNonExtParametersAndIssueCommandFromAL
214 STORE_ERROR_FLAG_TO_DPT FLG_INITERROR_FAILED_TO_INITIALIZE_STANDBY_TIMER
215.NoPowerManagementSupport:
216%endif ; MODULE_FEATURE_SETS
217
218
219 ; There might have been several errors so just return one error code for them all
220.ReturnWithErrorCodeInAH:
221%ifdef MODULE_ADVANCED_ATA
222 mov ah, [di+DPT.bInitError]
223 test ah, ah ; Clears CF
224 jz SHORT .ReturnWithSuccess
225 mov ah, RET_HD_RESETFAIL
226 stc
227.ReturnWithSuccess:
228%endif
229
230 pop si
231 pop es
232 ret
233
234
235.rgbWriteCacheCommands:
236 db 0 ; DEFAULT_WRITE_CACHE
237 db FEATURE_DISABLE_WRITE_CACHE ; DISABLE_WRITE_CACHE
238 db FEATURE_ENABLE_WRITE_CACHE ; ENABLE_WRITE_CACHE
239
240
241
242;--------------------------------------------------------------------
243; SetErrorFlagFromALwithErrorCodeInAH
244; Parameters:
245; AH: BIOS Error Code
246; AL: Error flag to set
247; DS:DI: Ptr to DPT
248; CF: Set if error code in AH
249; Clear if AH = 0
250; Returns:
251; CF: Clear if no error
252; Set if error flag was set
253; Corrupts registers:
254; Nothing
255;--------------------------------------------------------------------
256IgnoreInvalidCommandError:
257 xor ah, ah ; Clears CF
258SetErrorFlagFromALwithErrorCodeInAH:
259 jnc SHORT .NoErrorFlagToSet
260 cmp ah, RET_HD_INVALID
261 jbe SHORT IgnoreInvalidCommandError
262
263 or [di+DPT.bInitError], al
264 stc
265.NoErrorFlagToSet:
266 ret
267
268
269%ifdef MODULE_8BIT_IDE_ADVANCED
270;--------------------------------------------------------------------
271; AH9h_SetModeFromALtoXTCF
272; Parameters:
273; AL: XT-CF Mode to set
274; DS:DI: Ptr to DPT (in RAMVARS segment)
275; SS:BP: Ptr to IDEPACK
276; Returns:
277; AH: Int 13h return status
278; CF: Clear if successful or device is not XT-CF
279; Set if failed to set mode for XT-CF
280; Corrupts registers:
281; AL, BX, CX, DX, SI
282;--------------------------------------------------------------------
283AH9h_SetModeFromALtoXTCF:
284 call AccessDPT_IsThisDeviceXTCF
285 jne SHORT IgnoreInvalidCommandError
286 jmp AH1Eh_ChangeXTCFmodeBasedOnControlRegisterInAL
287%endif ; MODULE_8BIT_IDE_ADVANCED
288
289%ifdef MODULE_8BIT_IDE
290;--------------------------------------------------------------------
291; AH9h_Enable8bitModeForDevice8bitAta
292; Parameters:
293; DS:DI: Ptr to DPT (in RAMVARS segment)
294; SS:BP: Ptr to IDEPACK
295; Returns:
296; AH: Int 13h return status
297; CF: Clear if successful or device is not DEVICE_8BIT_ATA
298; Set if failed to set 8-bit mode for DEVICE_8BIT_ATA
299; Corrupts registers:
300; AL, BX, CX, DX, SI
301;--------------------------------------------------------------------
302AH9h_Enable8bitModeForDevice8bitAta:
303 cmp BYTE [di+DPT_ATA.bDevice], DEVICE_8BIT_ATA
304 jne SHORT IgnoreInvalidCommandError
305 jmp AH23h_Enable8bitPioMode
306%endif
Note: See TracBrowser for help on using the repository browser.