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

Last change on this file since 28 was 28, checked in by aitotat, 14 years ago
  • v1.1.1 broke booting from foreign drives, it is now fixed.
  • Improved error handling a bit.
  • Longer DRQ and IRQ timeouts to minimize write timouts with some (bad) CF cards.
  • Default boot menu drive should now be properly selected.
File size: 5.0 KB
Line 
1; File name     :   AH9h_HInit.asm
2; Project name  :   IDE BIOS
3; Created date  :   9.12.2007
4; Last update   :   1.8.2010
5; Author        :   Tomi Tilli
6; Description   :   Int 13h function AH=9h, Initialize Drive Parameters.
7
8; Section containing code
9SECTION .text
10
11;--------------------------------------------------------------------
12; Int 13h function AH=9h, Initialize Drive Parameters.
13;
14; AH9h_HandlerForInitializeDriveParameters
15;   Parameters:
16;       AH:     Bios function 9h
17;       DL:     Drive number
18;   Parameters loaded by Int13h_Jump:
19;       DS:     RAMVARS segment
20;   Returns:
21;       AH:     Int 13h return status
22;       CF:     0 if succesfull, 1 if error
23;       IF:     1
24;   Corrupts registers:
25;       Flags
26;--------------------------------------------------------------------
27ALIGN JUMP_ALIGN
28AH9h_HandlerForInitializeDriveParameters:
29    push    dx
30    push    cx
31    push    bx
32    push    ax
33    call    AH9h_InitializeDriveForUse
34    jmp     Int13h_PopXRegsAndReturn
35
36
37;--------------------------------------------------------------------
38; Initialized drive to be ready for use.
39;
40; AH9h_InitializeDriveForUse
41;   Parameters:
42;       DL:     Drive number
43;       DS:     RAMVARS segment
44;   Returns:
45;       DS:DI:  Ptr to DPT
46;       AH:     Int 13h return status
47;       CF:     0 if succesfull, 1 if error
48;   Corrupts registers:
49;       AL, BX
50;--------------------------------------------------------------------
51ALIGN JUMP_ALIGN
52AH9h_InitializeDriveForUse:
53    push    dx
54    push    cx
55
56    ; Try to select drive and wait until ready
57    call    FindDPT_ForDriveNumber
58    or      BYTE [di+DPT.bReset], MASK_RESET_ALL        ; Everything uninitialized
59    call    HDrvSel_SelectDriveAndDisableIRQ
60    jc      SHORT .ReturnNotSuccessfull
61    and     BYTE [di+DPT.bReset], ~FLG_RESET_nDRDY      ; Clear since success
62
63    ; Initialize CHS parameters if LBA is not used
64    call    AH9h_InitializeDeviceParameters
65    jc      SHORT .RecalibrateDrive
66    and     BYTE [di+DPT.bReset], ~FLG_RESET_nINITPRMS
67
68    ; Recalibrate drive by seeking to cylinder 0
69ALIGN JUMP_ALIGN
70.RecalibrateDrive:
71    call    AH11h_RecalibrateDrive
72    mov     dl, [di+DPT.bDrvNum]        ; Restore DL
73    jc      SHORT .InitializeBlockMode
74    and     BYTE [di+DPT.bReset], ~FLG_RESET_nRECALIBRATE
75
76    ; Initialize block mode transfers
77ALIGN JUMP_ALIGN
78.InitializeBlockMode:
79    call    AH9h_InitializeBlockMode
80    ;mov        dl, [di+DPT.bDrvNum]        ; Restore DL
81    jc      SHORT .ReturnNotSuccessfull
82    and     BYTE [di+DPT.bReset], ~FLG_RESET_nSETBLOCK
83
84    ; Force PIO mode 0
85    ;call   AH9h_ForcePioMode0
86
87.ReturnNotSuccessfull:
88    pop     cx
89    pop     dx
90    ret
91
92
93;--------------------------------------------------------------------
94; Sends Initialize Device Parameters command to IDE Hard Disk.
95; Initialization is used to initialize logical CHS parameters. Drives
96; may not support all CHS values.
97; This command is only supported by drives that supports CHS addressing.
98;
99; AH9h_InitializeDeviceParameters
100;   Parameters:
101;       DS:DI:  Ptr to DPT
102;   Returns:
103;       AH:     BIOS Error code
104;       CF:     Cleared if succesfull
105;               Set if any error
106;   Corrupts registers:
107;       AL, BX, CX
108;--------------------------------------------------------------------
109ALIGN JUMP_ALIGN
110AH9h_InitializeDeviceParameters:
111    ; No need to initialize CHS parameters if LBA mode enabled
112    test    BYTE [di+DPT.bDrvSel], FLG_IDE_DRVHD_LBA    ; Clears CF
113    jnz     SHORT .Return
114
115    push    dx
116    mov     bh, [di+DPT.bPHeads]
117    dec     bh                      ; Max head number
118    mov     dx, [RAMVARS.wIdeBase]
119    call    HCommand_OutputTranslatedLCHSaddress
120    mov     ah, HCMD_INIT_DEV
121    mov     al, [di+DPT.bPSect]     ; Sectors per track
122    call    HCommand_OutputSectorCountAndCommand
123    call    HStatus_WaitBsyDefTime  ; Wait until drive ready (DRDY won't be set!)
124    pop     dx
125.Return:
126    ret
127
128
129;--------------------------------------------------------------------
130; Initializes block mode transfers.
131;
132; AH9h_InitializeBlockMode
133;   Parameters:
134;       DL:     Drive number
135;       DS:DI:  Ptr to DPT
136;   Returns:
137;       AH:     BIOS Error code
138;       CF:     Cleared if succesfull
139;               Set if any error
140;   Corrupts registers:
141;       AL, BX, CX, DX
142;--------------------------------------------------------------------
143ALIGN JUMP_ALIGN
144AH9h_InitializeBlockMode:
145    mov     ax, FLG_DRVPARAMS_BLOCKMODE
146    call    AccessDPT_TestIdeVarsFlagsForMasterOrSlaveDrive
147    jz      SHORT .Return               ; Block mode disabled (CF cleared)
148    eMOVZX  ax, BYTE [di+DPT.bMaxBlock] ; Load max block size, zero AH
149    test    al, al                      ; Block mode supported? (clears CF)
150    jz      SHORT .Return               ;  If not, return
151    jmp     AH24h_SetBlockSize
152.Return:
153    ret
154
155
156;--------------------------------------------------------------------
157; AH9h_ForcePioMode0
158;   Parameters:
159;       DL:     Drive number
160;       DS:DI:  Ptr to DPT
161;   Returns:
162;       AH:     BIOS Error code
163;       CF:     Cleared if succesfull
164;               Set if any error
165;   Corrupts registers:
166;       AX, BX
167;--------------------------------------------------------------------
168;ALIGN JUMP_ALIGN
169;AH9h_ForcePioMode0:
170;   mov     bh, 08h     ; Parameter to Sector Count Register (PIO Flow Control Transfer Mode 0)
171;   mov     ax, 2303h   ; Feature: Set transfer mode based on value in Sector Count register
172;   int     13h
173;   jc      SHORT .FailedToForcePIO0
174;   ; Debug output here
175;   ret
176;.FailedToForcePIO0:
177;   ; Debug output here
178;   ret
Note: See TracBrowser for help on using the repository browser.