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@…, 12 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
RevLine 
[148]1; Project name  :   XTIDE Universal BIOS
[3]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:
[148]12;       DL:     Translated Drive number
13;       DS:DI:  Ptr to DPT (in RAMVARS segment)
[150]14;       SS:BP:  Ptr to IDEPACK
15;   Returns with INTPACK:
[3]16;       AH:     Int 13h return status
[294]17;       CF:     0 if successful, 1 if error
[3]18;--------------------------------------------------------------------
19AH9h_HandlerForInitializeDriveParameters:
[84]20%ifndef USE_186
[3]21    call    AH9h_InitializeDriveForUse
[148]22    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
[84]23%else
[148]24    push    Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
[162]25    ; Fall to AH9h_InitializeDriveForUse
[84]26%endif
[3]27
28
29;--------------------------------------------------------------------
30; Initialized drive to be ready for use.
31;
32; AH9h_InitializeDriveForUse
33;   Parameters:
[148]34;       DS:DI:  Ptr to DPT (in RAMVARS segment)
[150]35;       SS:BP:  Ptr to IDEPACK
[3]36;   Returns:
37;       AH:     Int 13h return status
[294]38;       CF:     0 if successful, 1 if error
[3]39;   Corrupts registers:
[363]40;       AL, BX, CX, DX
[3]41;--------------------------------------------------------------------
42AH9h_InitializeDriveForUse:
[363]43    push    es
[276]44    push    si
[363]45    call    ClearErrorFlagFromBootMenuInfo  ; Do this for serial devices as well
[3]46
[258]47%ifdef MODULE_SERIAL
[363]48    ; no need to do this for serial devices
[258]49    xor     ah, ah
50    test    byte [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE    ; Clears CF
[363]51    jnz     .ReturnWithErrorCodeInAH
52
53%else
54    ; Clear Initialization Error flag from DPT
55    and     BYTE [di+DPT.bFlagsHigh], ~FLGH_DPT_INITERROR
[258]56%endif
[294]57
[3]58    ; Try to select drive and wait until ready
[150]59    call    AccessDPT_GetDriveSelectByteToAL
60    mov     [bp+IDEPACK.bDrvAndHead], al
61    call    Device_SelectDrive
[363]62    mov     al, FLG_INIT_FAILED_TO_SELECT_DRIVE
63    call    SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo
64    jc      SHORT .ReturnWithErrorCodeInAH
[3]65
66    ; Initialize CHS parameters if LBA is not used
[150]67    call    InitializeDeviceParameters
[363]68    mov     al, FLG_INIT_FAILED_TO_INITIALIZE_CHS_PARAMETERS
69    call    SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo
[3]70
[276]71    ; Enable or Disable Write Cache
[279]72    call    SetWriteCache
[363]73    mov     al, FLG_INIT_FAILED_TO_SET_WRITE_CACHE
74    call    SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo
[276]75
[3]76    ; Recalibrate drive by seeking to cylinder 0
77.RecalibrateDrive:
78    call    AH11h_RecalibrateDrive
[363]79    mov     al, FLG_INIT_FAILED_TO_RECALIBRATE_DRIVE
80    call    SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo
[3]81
82    ; Initialize block mode transfers
83.InitializeBlockMode:
[150]84    call    InitializeBlockMode
[363]85    mov     al, FLG_INIT_FAILED_TO_SET_BLOCK_MODE
86    call    SetErrorFlagFromALwithErrorCodeInAHtoBootMenuInfo
[3]87
[363]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:
[276]104    pop     si
[363]105    pop     es
[3]106    ret
107
108
109;--------------------------------------------------------------------
[150]110; InitializeDeviceParameters
[3]111;   Parameters:
[150]112;       DS:DI:  Ptr to DPT (in RAMVARS segment)
113;       SS:BP:  Ptr to IDEPACK
[3]114;   Returns:
115;       AH:     BIOS Error code
[294]116;       CF:     Cleared if successful
[3]117;               Set if any error
118;   Corrupts registers:
[150]119;       AL, BX, CX, DX
[3]120;--------------------------------------------------------------------
[150]121InitializeDeviceParameters:
[3]122    ; No need to initialize CHS parameters if LBA mode enabled
[158]123    test    BYTE [di+DPT.bFlagsLow], FLG_DRVNHEAD_LBA   ; Clear CF
[150]124    jnz     SHORT ReturnSuccessSinceInitializationNotNeeded
[3]125
[157]126    ; Initialize Logical Sectors per Track and Max Head number
[227]127    mov     ah, [di+DPT.bPchsHeads]
[150]128    dec     ah                          ; Max Head number
[227]129    mov     dl, [di+DPT.bPchsSectors]   ; Sectors per Track
[150]130    mov     al, COMMAND_INITIALIZE_DEVICE_PARAMETERS
131    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_BSY, FLG_STATUS_BSY)
132    jmp     Idepack_StoreNonExtParametersAndIssueCommandFromAL
[3]133
134
135;--------------------------------------------------------------------
[276]136; SetWriteCache
137;   Parameters:
138;       DS:DI:  Ptr to DPT (in RAMVARS segment)
139;   Returns:
140;       AH:     BIOS Error code
[294]141;       CF:     Cleared if successful
[276]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
[363]160%ifdef MODULE_ADVANCED_ATA
[276]161;--------------------------------------------------------------------
[363]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:
[364]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:
[363]182    mov     si, FEATURE_SET_TRANSFER_MODE
183    jmp     AH23h_SetControllerFeatures
184%endif
185
186
187;--------------------------------------------------------------------
[150]188; InitializeBlockMode
[3]189;   Parameters:
[150]190;       DS:DI:  Ptr to DPT (in RAMVARS segment)
[3]191;   Returns:
192;       AH:     BIOS Error code
[294]193;       CF:     Cleared if successful
[3]194;               Set if any error
195;   Corrupts registers:
196;       AL, BX, CX, DX
197;--------------------------------------------------------------------
[150]198InitializeBlockMode:
[158]199    test    BYTE [di+DPT.bFlagsHigh], FLGH_DPT_BLOCK_MODE_SUPPORTED ; Clear CF
[150]200    jz      SHORT ReturnSuccessSinceInitializationNotNeeded
201
[276]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
[3]206    jmp     AH24h_SetBlockSize
[363]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:
[150]254ReturnSuccessSinceInitializationNotNeeded:
[276]255    xor     ah, ah
[363]256NoErrorFlagToSet:
[3]257    ret
Note: See TracBrowser for help on using the repository browser.