source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AHDh_HReset.asm @ 271

Last change on this file since 271 was 271, checked in by aitotat@…, 12 years ago

Changes to XTIDE Universal BIOS:

  • AH=0h (Reset) should now work but our drives are no longer reset if DL belongs to foreign drive.
File size: 2.7 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Int 13h function AH=Dh, Reset Hard Disk (Alternate reset).
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; Int 13h function AH=Dh, Reset Hard Disk (Alternate reset).
9;
10; AHDh_HandlerForResetHardDisk
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 succesfull, 1 if error
18;--------------------------------------------------------------------
19ALIGN JUMP_ALIGN
20AHDh_HandlerForResetHardDisk:
21%ifndef USE_186
22    call    AHDh_ResetDrive
23    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
24%else
25    push    Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
26    ; Fall to AHDh_ResetDrive
27%endif
28
29
30;--------------------------------------------------------------------
31; Resets hard disk.
32;
33; AHDh_ResetDrive
34;   Parameters:
35;       DS:DI:  Ptr to DPT
36;       SS:BP:  Ptr to IDEPACK
37;   Returns:
38;       AH:     Int 13h return status
39;       CF:     0 if succesfull, 1 if error
40;   Corrupts registers:
41;       AL, SI
42;--------------------------------------------------------------------
43AHDh_ResetDrive:
44    push    dx
45    push    cx
46    push    bx
47    push    di
48
49    call    Interrupts_UnmaskInterruptControllerForDriveInDSDI
50    call    Device_ResetMasterAndSlaveController
51    ;jc     SHORT .ReturnError                  ; CF would be set if slave drive present without master
52                                                ; (error register has special values after reset)
53
54    ; Initialize Master and Slave drives
55    mov     al, [di+DPT.bIdevarsOffset]         ; pointer to controller we are looking to reset
56    mov     ah, 0                               ; initialize error code, assume success
57       
58    mov     si, IterateAndResetDrives
59    call    FindDPT_IterateAllDPTs
60
61    shr     ah, 1                               ; Move error code and CF into proper position
62
63    pop     di
64    pop     bx
65    pop     cx
66    pop     dx
67    ret
68
69;--------------------------------------------------------------------
70; IterateAndResetDrives: Iteration routine for use with IterateAllDPTs.
71;
72; When a drive on the controller is found, it is reset, and the error code 
73; merged into overall error code for this controller.  Master will be reset
74; first.  Note that the iteration will go until the end of the DPT list.
75;--------------------------------------------------------------------
76IterateAndResetDrives:
77    cmp     al, [di+DPT.bIdevarsOffset]         ; The right controller?
78    jne     .done
79    push    ax
80    call    AH9h_InitializeDriveForUse          ; Reset Master and Slave (Master will come first in DPT list)
81    pop     ax     
82    jc      .done
83    or      ah, (RET_HD_RESETFAIL << 1) | 1     ; OR in Reset Failed error code and CF, will SHR into position later
84.done:
85    stc                                         ; From IterateAllDPTs perspective, the DPT is never found (continue iteration)
86    ret
Note: See TracBrowser for help on using the repository browser.