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
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.