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

Last change on this file since 493 was 493, checked in by gregli@…, 11 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.