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
RevLine 
[148]1; Project name  :   XTIDE Universal BIOS
[3]2; Description   :   Int 13h function AH=9h, Initialize Drive Parameters.
3
[376]4;
[399]5; XTIDE Universal BIOS and Associated Tools
[376]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.
[399]12;
[376]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
[399]16; GNU General Public License for more details.
[376]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[399]18;
[376]19
[3]20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
[410]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;--------------------------------------------------------------------
[3]43; Int 13h function AH=9h, Initialize Drive Parameters.
44;
45; AH9h_HandlerForInitializeDriveParameters
46;   Parameters:
[148]47;       DL:     Translated Drive number
48;       DS:DI:  Ptr to DPT (in RAMVARS segment)
[150]49;       SS:BP:  Ptr to IDEPACK
50;   Returns with INTPACK:
[3]51;       AH:     Int 13h return status
[294]52;       CF:     0 if successful, 1 if error
[3]53;--------------------------------------------------------------------
54AH9h_HandlerForInitializeDriveParameters:
[84]55%ifndef USE_186
[3]56    call    AH9h_InitializeDriveForUse
[148]57    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
[84]58%else
[148]59    push    Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
[162]60    ; Fall to AH9h_InitializeDriveForUse
[84]61%endif
[3]62
63
64;--------------------------------------------------------------------
[399]65; Initialize drive to be ready for use.
[3]66;
67; AH9h_InitializeDriveForUse
68;   Parameters:
[148]69;       DS:DI:  Ptr to DPT (in RAMVARS segment)
[150]70;       SS:BP:  Ptr to IDEPACK
[3]71;   Returns:
72;       AH:     Int 13h return status
[294]73;       CF:     0 if successful, 1 if error
[3]74;   Corrupts registers:
[363]75;       AL, BX, CX, DX
[3]76;--------------------------------------------------------------------
77AH9h_InitializeDriveForUse:
[410]78    xor     ax, ax              ; Clear AH to assume no errors
[3]79
[400]80%ifdef MODULE_ADVANCED_ATA
[399]81    ; Clear Initialization Error flags from DPT
[422]82    mov     [di+DPT.bInitError], al
[400]83%endif
[399]84
[258]85%ifdef MODULE_SERIAL
[399]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
[410]90.ContinueInitialization:
[258]91%endif
[294]92
[399]93    push    es
94    push    si
95
[410]96
[399]97;;; SelectDrive
[3]98    ; Try to select drive and wait until ready
[421]99    call    AccessDPT_GetDriveSelectByteForOldInt13hToAL
[150]100    mov     [bp+IDEPACK.bDrvAndHead], al
101    call    Device_SelectDrive
[410]102    STORE_ERROR_FLAG_TO_DPT     FLG_INITERROR_FAILED_TO_SELECT_DRIVE
103    jnc     SHORT .ContinueInitializationSinceDriveSelectedSuccesfully
104    jmp     .ReturnWithErrorCodeInAH
105.ContinueInitializationSinceDriveSelectedSuccesfully:
[399]106
[3]107
[473]108;;; Set XT-CF mode
[493]109%ifdef MODULE_8BIT_IDE_ADVANCED
[473]110    call    AccessDPT_GetIdevarsToCSBX
111    mov     al, [cs:bx+IDEVARS.bXTCFcontrolRegister]
[480]112    call    AH9h_SetModeFromALtoXTCF
[473]113    STORE_ERROR_FLAG_TO_DPT     FLG_INITERROR_FAILED_TO_SET_XTCF_MODE
114.DoNotSetXTCFmode:
[493]115%endif  ; MODULE_8BIT_IDE_ADVANCED
[473]116
[493]117%ifdef MODULE_8BIT_IDE
[480]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
[399]125;;; InitializeDeviceParameters
[421]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
[399]129    jnz     SHORT .SkipInitializeDeviceParameters       ; No need to initialize CHS parameters if LBA mode enabled
[421]130    call    AccessDPT_GetPointerToDRVPARAMStoCSBX
131    test    BYTE [cs:bx+DRVPARAMS.wFlags], FLG_DRVPARAMS_USERCHS    ; User specified P-CHS?
132    jz      SHORT .SkipInitializeDeviceParameters
[3]133
[157]134    ; Initialize Logical Sectors per Track and Max Head number
[421]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
[150]139    mov     al, COMMAND_INITIALIZE_DEVICE_PARAMETERS
140    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_BSY, FLG_STATUS_BSY)
[399]141    call    Idepack_StoreNonExtParametersAndIssueCommandFromAL
[410]142    STORE_ERROR_FLAG_TO_DPT     FLG_INITERROR_FAILED_TO_INITIALIZE_CHS_PARAMETERS
[399]143.SkipInitializeDeviceParameters:
[3]144
[410]145
[399]146;;; SetWriteCache
147    ; Enable or Disable Write Cache
[276]148    call    AccessDPT_GetPointerToDRVPARAMStoCSBX
149    mov     bl, [cs:bx+DRVPARAMS.wFlags]
[399]150    push    bx  ; Save .wFlags for later use in InitializeBlockMode
[276]151    and     bx, BYTE MASK_DRVPARAMS_WRITECACHE
[399]152    jz      SHORT .SkipSetWriteCache        ; DEFAULT_WRITE_CACHE
[276]153    mov     si, [cs:bx+.rgbWriteCacheCommands]
[399]154    call    AH23h_SetControllerFeatures
[410]155    STORE_ERROR_FLAG_TO_DPT     FLG_INITERROR_FAILED_TO_SET_WRITE_CACHE
[399]156.SkipSetWriteCache:
[276]157
[410]158
[399]159;;; RecalibrateDrive
160    ; Recalibrate drive by seeking to cylinder 0
161    call    AH11h_RecalibrateDrive
[410]162    STORE_ERROR_FLAG_TO_DPT     FLG_INITERROR_FAILED_TO_RECALIBRATE_DRIVE
[276]163
[399]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
[410]181    STORE_ERROR_FLAG_TO_DPT     FLG_INITERROR_FAILED_TO_SET_BLOCK_MODE
[399]182.BlockModeNotSupportedOrDisabled:
183.SupportedBlockSizeFound:
184
[410]185
[363]186%ifdef MODULE_ADVANCED_ATA
[399]187;;; InitializePioMode
188    ; Initialize fastest supported PIO mode
[364]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:
[363]198    mov     si, FEATURE_SET_TRANSFER_MODE
[399]199    call    AH23h_SetControllerFeatures
[410]200    STORE_ERROR_FLAG_TO_DPT     FLG_INITERROR_FAILED_TO_SET_PIO_MODE
[399]201%endif ; MODULE_ADVANCED_ATA
[363]202
[410]203
[399]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
[410]208    jz      SHORT .NoPowerManagementSupport
[363]209
[399]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
[410]214    STORE_ERROR_FLAG_TO_DPT     FLG_INITERROR_FAILED_TO_INITIALIZE_STANDBY_TIMER
[399]215.NoPowerManagementSupport:
216%endif ; MODULE_FEATURE_SETS
217
[410]218
[399]219    ; There might have been several errors so just return one error code for them all
[410]220.ReturnWithErrorCodeInAH:
[400]221%ifdef MODULE_ADVANCED_ATA
[422]222    mov     ah, [di+DPT.bInitError]
[399]223    test    ah, ah  ; Clears CF
[410]224    jz      SHORT .ReturnWithSuccess
[399]225    mov     ah, RET_HD_RESETFAIL
226    stc
[410]227.ReturnWithSuccess:
[400]228%endif
[399]229
230    pop     si
231    pop     es
[363]232    ret
233
234
[410]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
[363]242;--------------------------------------------------------------------
[410]243; SetErrorFlagFromALwithErrorCodeInAH
[363]244;   Parameters:
245;       AH:     BIOS Error Code
246;       AL:     Error flag to set
247;       DS:DI:  Ptr to DPT
[410]248;       CF:     Set if error code in AH
249;               Clear if AH = 0
[363]250;   Returns:
251;       CF:     Clear if no error
252;               Set if error flag was set
253;   Corrupts registers:
[370]254;       Nothing
[363]255;--------------------------------------------------------------------
[410]256IgnoreInvalidCommandError:
[399]257    xor     ah, ah  ; Clears CF
[410]258SetErrorFlagFromALwithErrorCodeInAH:
[365]259    jnc     SHORT .NoErrorFlagToSet
[363]260    cmp     ah, RET_HD_INVALID
[410]261    jbe     SHORT IgnoreInvalidCommandError
[363]262
[422]263    or      [di+DPT.bInitError], al
[363]264    stc
[365]265.NoErrorFlagToSet:
[3]266    ret
[480]267
268
[493]269%ifdef MODULE_8BIT_IDE_ADVANCED
[480]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
[493]287%endif ; MODULE_8BIT_IDE_ADVANCED
[480]288
[493]289%ifdef MODULE_8BIT_IDE
[480]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
[493]306%endif
Note: See TracBrowser for help on using the repository browser.