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

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

Changes to XTIDE Universal BIOS:

  • Advanced ATA Module variables are now kept in DPTs.
  • Forced full mode when using Advanced ATA Module.
File size: 7.8 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Int 13h function AH=9h, Initialize Drive Parameters.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Int 13h function AH=9h, Initialize Drive Parameters.
9;
10; AH9h_HandlerForInitializeDriveParameters
11; Parameters:
12; DL: Translated Drive number
13; DS:DI: Ptr to DPT (in RAMVARS segment)
14; SS:BP: Ptr to IDEPACK
15; Returns with INTPACK:
16; AH: Int 13h return status
17; CF: 0 if successful, 1 if error
18;--------------------------------------------------------------------
19AH9h_HandlerForInitializeDriveParameters:
20%ifndef USE_186
21 call AH9h_InitializeDriveForUse
22 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
23%else
24 push Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
25 ; Fall to AH9h_InitializeDriveForUse
26%endif
27
28
29;--------------------------------------------------------------------
30; Initialized drive to be ready for use.
31;
32; AH9h_InitializeDriveForUse
33; Parameters:
34; DS:DI: Ptr to DPT (in RAMVARS segment)
35; SS:BP: Ptr to IDEPACK
36; Returns:
37; AH: Int 13h return status
38; CF: 0 if successful, 1 if error
39; Corrupts registers:
40; AL, BX, CX, DX
41;--------------------------------------------------------------------
42AH9h_InitializeDriveForUse:
43 push es
44 push si
45 call ClearErrorFlagFromBootMenuInfo ; Do this for serial devices as well
46
47%ifdef MODULE_SERIAL
48 ; no need to do this for serial devices
49 xor ah, ah
50 test byte [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE ; Clears CF
51 jnz .ReturnWithErrorCodeInAH
52
53%else
54 ; Clear Initialization Error flag from DPT
55 and BYTE [di+DPT.bFlagsHigh], ~FLGH_DPT_INITERROR
56%endif
57
58 ; Try to select drive and wait until ready
59 call AccessDPT_GetDriveSelectByteToAL
60 mov [bp+IDEPACK.bDrvAndHead], al
61 call Device_SelectDrive
62 mov al, FLG_INIT_FAILED_TO_SELECT_DRIVE
63 call SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo
64 jc SHORT .ReturnWithErrorCodeInAH
65
66 ; Initialize CHS parameters if LBA is not used
67 call InitializeDeviceParameters
68 mov al, FLG_INIT_FAILED_TO_INITIALIZE_CHS_PARAMETERS
69 call SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo
70
71 ; Enable or Disable Write Cache
72 call SetWriteCache
73 mov al, FLG_INIT_FAILED_TO_SET_WRITE_CACHE
74 call SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo
75
76 ; Recalibrate drive by seeking to cylinder 0
77.RecalibrateDrive:
78 call AH11h_RecalibrateDrive
79 mov al, FLG_INIT_FAILED_TO_RECALIBRATE_DRIVE
80 call SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo
81
82 ; Initialize block mode transfers
83.InitializeBlockMode:
84 call InitializeBlockMode
85 mov al, FLG_INIT_FAILED_TO_SET_BLOCK_MODE
86 call SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo
87
88%ifdef MODULE_ADVANCED_ATA
89; Initialize fastest supported PIO mode
90.InitializePioMode:
91 call InitializePioMode
92 mov al, FLG_INIT_FAILED_TO_SET_PIO_MODE
93 call SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo
94%endif
95
96 ; There might have been several errors so just return
97 ; one error code for them all
98 test BYTE [di+DPT.bFlagsHigh], FLGH_DPT_INITERROR
99 jz SHORT .ReturnWithErrorCodeInAH
100 mov ah, RET_HD_RESETFAIL
101 stc
102
103.ReturnWithErrorCodeInAH:
104 pop si
105 pop es
106 ret
107
108
109;--------------------------------------------------------------------
110; InitializeDeviceParameters
111; Parameters:
112; DS:DI: Ptr to DPT (in RAMVARS segment)
113; SS:BP: Ptr to IDEPACK
114; Returns:
115; AH: BIOS Error code
116; CF: Cleared if successful
117; Set if any error
118; Corrupts registers:
119; AL, BX, CX, DX
120;--------------------------------------------------------------------
121InitializeDeviceParameters:
122 ; No need to initialize CHS parameters if LBA mode enabled
123 test BYTE [di+DPT.bFlagsLow], FLG_DRVNHEAD_LBA ; Clear CF
124 jnz SHORT ReturnSuccessSinceInitializationNotNeeded
125
126 ; Initialize Logical Sectors per Track and Max Head number
127 mov ah, [di+DPT.bPchsHeads]
128 dec ah ; Max Head number
129 mov dl, [di+DPT.bPchsSectors] ; Sectors per Track
130 mov al, COMMAND_INITIALIZE_DEVICE_PARAMETERS
131 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_BSY, FLG_STATUS_BSY)
132 jmp Idepack_StoreNonExtParametersAndIssueCommandFromAL
133
134
135;--------------------------------------------------------------------
136; SetWriteCache
137; Parameters:
138; DS:DI: Ptr to DPT (in RAMVARS segment)
139; Returns:
140; AH: BIOS Error code
141; CF: Cleared if successful
142; Set if any error
143; Corrupts registers:
144; AL, BX, CX, DX, SI
145;--------------------------------------------------------------------
146SetWriteCache:
147 call AccessDPT_GetPointerToDRVPARAMStoCSBX
148 mov bl, [cs:bx+DRVPARAMS.wFlags]
149 and bx, BYTE MASK_DRVPARAMS_WRITECACHE
150 jz SHORT ReturnSuccessSinceInitializationNotNeeded ; DEFAULT_WRITE_CACHE
151 mov si, [cs:bx+.rgbWriteCacheCommands]
152 jmp AH23h_SetControllerFeatures
153
154.rgbWriteCacheCommands:
155 db 0 ; DEFAULT_WRITE_CACHE
156 db FEATURE_DISABLE_WRITE_CACHE ; DISABLE_WRITE_CACHE
157 db FEATURE_ENABLE_WRITE_CACHE ; ENABLE_WRITE_CACHE
158
159
160%ifdef MODULE_ADVANCED_ATA
161;--------------------------------------------------------------------
162; InitializePioMode
163; Parameters:
164; DS:DI: Ptr to DPT (in RAMVARS segment)
165; Returns:
166; AH: BIOS Error code
167; CF: Cleared if successful
168; Set if any error
169; Corrupts registers:
170; AL, BX, CX, DX
171;--------------------------------------------------------------------
172InitializePioMode:
173 mov dl, PIO_DEFAULT_MODE_DISABLE_IORDY
174 test BYTE [di+DPT.bFlagsHigh], FLGH_DPT_IORDY
175 jz SHORT .IordyNotSupported
176
177 ; Advanced PIO mode 3 and above
178 mov dl, [di+DPT_ADVANCED_ATA.bPioMode]
179 or dl, PIO_FLOW_CONTROL_MODE_xxx
180
181.IordyNotSupported:
182 mov si, FEATURE_SET_TRANSFER_MODE
183 jmp AH23h_SetControllerFeatures
184%endif
185
186
187;--------------------------------------------------------------------
188; InitializeBlockMode
189; Parameters:
190; DS:DI: Ptr to DPT (in RAMVARS segment)
191; Returns:
192; AH: BIOS Error code
193; CF: Cleared if successful
194; Set if any error
195; Corrupts registers:
196; AL, BX, CX, DX
197;--------------------------------------------------------------------
198InitializeBlockMode:
199 test BYTE [di+DPT.bFlagsHigh], FLGH_DPT_BLOCK_MODE_SUPPORTED ; Clear CF
200 jz SHORT ReturnSuccessSinceInitializationNotNeeded
201
202 call AccessDPT_GetPointerToDRVPARAMStoCSBX
203 mov al, 1 ; Disable block mode
204 test BYTE [cs:bx+DRVPARAMS.wFlags], FLG_DRVPARAMS_BLOCKMODE
205 eCMOVNZ al, [di+DPT_ATA.bMaxBlock] ; Load max block size
206 jmp AH24h_SetBlockSize
207
208
209;--------------------------------------------------------------------
210; ClearErrorFlagFromBootMenuInfo
211; Parameters:
212; DS:DI: Ptr to DPT
213; Returns:
214; Nothing
215; Corrupts registers:
216; BX, ES
217;--------------------------------------------------------------------
218ClearErrorFlagFromBootMenuInfo:
219 call BootMenuInfo_IsAvailable ; Load BOOTMENUINFO segment to ES
220 jne SHORT .DoNotStoreErrorFlags
221 call BootMenuInfo_ConvertDPTtoBX
222 mov WORD [es:bx+BOOTMENUINFO.wInitErrorFlags], 0 ; Must clear whole WORD!
223.DoNotStoreErrorFlags:
224 ret
225
226
227;--------------------------------------------------------------------
228; SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo
229; Parameters:
230; AH: BIOS Error Code
231; AL: Error flag to set
232; DS:DI: Ptr to DPT
233; Returns:
234; CF: Clear if no error
235; Set if error flag was set
236; Corrupts registers:
237; BX, ES
238;--------------------------------------------------------------------
239SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo:
240 jnc SHORT NoErrorFlagToSet
241 cmp ah, RET_HD_INVALID
242 jbe SHORT .IgnoreInvalidCommandError
243
244 call BootMenuInfo_IsAvailable
245 jne SHORT .BootvarsNotAvailableSoDoNotSetErrorFlag
246
247 call BootMenuInfo_ConvertDPTtoBX
248 or [es:bx+BOOTMENUINFO.wInitErrorFlags], al
249.BootvarsNotAvailableSoDoNotSetErrorFlag:
250 or BYTE [di+DPT.bFlagsHigh], FLGH_DPT_INITERROR
251 stc
252 ret
253.IgnoreInvalidCommandError:
254ReturnSuccessSinceInitializationNotNeeded:
255 xor ah, ah
256NoErrorFlagToSet:
257 ret
Note: See TracBrowser for help on using the repository browser.