source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH0h_HReset.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.8 KB
RevLine 
[3]1; File name     :   AH0h_HReset.asm
2; Project name  :   IDE BIOS
3; Created date  :   27.9.2007
[28]4; Last update   :   29.7.2010
[3]5; Author        :   Tomi Tilli
6; Description   :   Int 13h function AH=0h, Disk Controller Reset.
7
8RETRIES_IF_RESET_FAILS      EQU     3
9TIMEOUT_BEFORE_RESET_RETRY  EQU     5       ; System timer ticks
10
11; Section containing code
12SECTION .text
13
14;--------------------------------------------------------------------
15; Int 13h function AH=0h, Disk Controller Reset.
16;
17; AH0h_HandlerForDiskControllerReset
18;   Parameters:
19;       AH:     Bios function 0h
20;       DL:     Drive number (ignored so all drives are reset)
21;               If bit 7 is set all hard disks and floppy disks reset.
22;   Parameters loaded by Int13h_Jump:
23;       DS:     RAMVARS segment
24;   Returns:
[23]25;       AH:     Int 13h return status (from drive requested in DL)
[3]26;       CF:     0 if succesfull, 1 if error
27;       IF:     1
28;   Corrupts registers:
29;       Flags
30;--------------------------------------------------------------------
31ALIGN JUMP_ALIGN
32AH0h_HandlerForDiskControllerReset:
33    push    dx
34    push    cx
35    push    bx
36    push    ax
37
[23]38    eMOVZX  bx, dl                      ; Copy requested drive to BL, zero BH to assume no errors
[26]39    call    ResetFloppyDrivesWithInt40h
40    test    bl, 80h
41    jz      SHORT .SkipHardDiskReset
42    call    ResetForeignHardDisks
[27]43    call    AH0h_ResetHardDisksHandledByOurBIOS
[23]44ALIGN JUMP_ALIGN
[26]45.SkipHardDiskReset:
[23]46    mov     ah, bh                      ; Copy error code to AH
47    xor     al, al                      ; Zero AL...
[27]48    cmp     al, bh                      ; ...and set CF if error
[28]49    jmp     Int13h_StoreErrorCodeToBDAandPopXRegsAndReturn
[3]50
51
52;--------------------------------------------------------------------
[26]53; ResetFloppyDrivesWithInt40h
[3]54;   Parameters:
[23]55;       BL:     Requested drive (DL when entering AH=00h)
56;   Returns:
57;       BH:     Error code from requested drive (if available)
58;   Corrupts registers:
[27]59;       AX, DL, DI
[23]60;--------------------------------------------------------------------   
61ALIGN JUMP_ALIGN
[26]62ResetFloppyDrivesWithInt40h:
[27]63    call    GetDriveNumberForForeignBiosesToDL
64    and     dl, 7Fh                     ; Clear hard disk bit
[26]65    xor     ah, ah                      ; Disk Controller Reset
[23]66    int     INTV_FLOPPY_FUNC
[26]67    jmp     SHORT BackupErrorCodeFromTheRequestedDriveToBH
[23]68
69
70;--------------------------------------------------------------------
[26]71; ResetForeignHardDisks
[23]72;   Parameters:
73;       BL:     Requested drive (DL when entering AH=00h)
[3]74;       DS:     RAMVARS segment
75;   Returns:
[23]76;       BH:     Error code from requested drive (if available)
[3]77;   Corrupts registers:
[27]78;       AX, DL, DI
[23]79;--------------------------------------------------------------------   
80ALIGN JUMP_ALIGN
[26]81ResetForeignHardDisks:
[27]82    call    GetDriveNumberForForeignBiosesToDL
83    xor     ah, ah                      ; Disk Controller Reset
[23]84    pushf                               ; Push flags to simulate INT
85    cli                                 ; Disable interrupts since INT does that
86    call    FAR [RAMVARS.fpOldI13h]
87    sti                                 ; Make sure interrupts are enabled again (some BIOSes fails to enable it)
[26]88    jmp     SHORT BackupErrorCodeFromTheRequestedDriveToBH
[23]89
[26]90
[3]91;--------------------------------------------------------------------
[27]92; GetDriveNumberForForeignBiosesToDL
93;   Parameters:
94;       BL:     Requested drive (DL when entering AH=00h)
95;       DS:     RAMVARS segment
96;   Returns:
97;       DL:     BL if foreign drive
98;               80h if our drive
99;   Corrupts registers:
100;       DI
101;--------------------------------------------------------------------   
102ALIGN JUMP_ALIGN
103GetDriveNumberForForeignBiosesToDL:
104    mov     dl, bl
105    call    RamVars_IsDriveHandledByThisBIOS
106    jc      SHORT .GetFirstDriveForForeignBios
107    ret     ; Return what was in BL unmodified
108ALIGN JUMP_ALIGN
109.GetFirstDriveForForeignBios:
110    mov     dl, 80h
111    ret
112
113
114;--------------------------------------------------------------------
[26]115; ResetHardDisksHandledByOurBIOS
[23]116;   Parameters:
117;       BL:     Requested drive (DL when entering AH=00h)
118;       DS:     RAMVARS segment
119;   Returns:
120;       BH:     Error code from requested drive (if available)
121;   Corrupts registers:
[27]122;       AX, CX, DX, DI
[23]123;--------------------------------------------------------------------
[3]124ALIGN JUMP_ALIGN
[27]125AH0h_ResetHardDisksHandledByOurBIOS:
[26]126    mov     dh, [RAMVARS.bDrvCnt]       ; Load drive count to DH
127    test    dh, dh
128    jz      SHORT .AllDrivesReset       ; Return if no drives
129    mov     dl, [RAMVARS.bFirstDrv]     ; Load number of first our drive
130    add     dh, dl                      ; DH = one past last drive to reset
[3]131ALIGN JUMP_ALIGN
[26]132.DriveResetLoop:
133    call    AHDh_ResetDrive
[27]134    call    .BackupErrorCodeFromMasterOrSlaveToBH
[26]135    inc     dx
136    cmp     dl, dh                      ; All done?
137    jb      SHORT .DriveResetLoop       ;  If not, reset next drive
138.AllDrivesReset:
[3]139    ret
140
141;--------------------------------------------------------------------
[27]142; .BackupErrorCodeFromMasterOrSlaveToBH
[3]143;   Parameters:
[27]144;       AH:     Error code for drive DL reset
145;       BL:     Requested drive (DL when entering AH=00h)
[26]146;       DL:     Drive just resetted
[3]147;       DS:     RAMVARS segment
148;   Returns:
[27]149;       BH:     Backuped error code
[26]150;       DL:     Incremented if next drive is slave drive
151;               (=already resetted)
[3]152;   Corrupts registers:
[27]153;       CX, DI
[3]154;--------------------------------------------------------------------
155ALIGN JUMP_ALIGN
[27]156.BackupErrorCodeFromMasterOrSlaveToBH:
157    call    BackupErrorCodeFromTheRequestedDriveToBH
158    mov     cx, [RAMVARS.wIdeBase]      ; Load base port for resetted drive
[26]159
[27]160    inc     dx                          ; DL to next drive
161    call    FindDPT_ForDriveNumber      ; Get DPT to DS:DI, store port to RAMVARS
162    jnc     SHORT .NoMoreDrivesOrNoSlaveDrive
163    cmp     cx, [RAMVARS.wIdeBase]      ; Next drive is from same controller?
164    je      SHORT BackupErrorCodeFromTheRequestedDriveToBH
165.NoMoreDrivesOrNoSlaveDrive:
166    dec     dx
[3]167    ret
168
169
170;--------------------------------------------------------------------
[26]171; BackupErrorCodeFromTheRequestedDriveToBH
[3]172;   Parameters:
[23]173;       AH:     Error code from the last resetted drive
174;       DL:     Drive last resetted
175;       BL:     Requested drive (DL when entering AH=00h)
[3]176;   Returns:
[23]177;       BH:     Backuped error code
[3]178;   Corrupts registers:
179;       Nothing
180;--------------------------------------------------------------------
181ALIGN JUMP_ALIGN
[26]182BackupErrorCodeFromTheRequestedDriveToBH:
183    cmp     dl, bl              ; Requested drive?
[23]184    jne     SHORT .Return
185    mov     bh, ah
186ALIGN JUMP_ALIGN
187.Return:
[3]188    ret
Note: See TracBrowser for help on using the repository browser.