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

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

Changes to XTIDE Universal BIOS:

  • Added Advanced ATA Module (MODULE_ADVANCED_ATA) with native support for QDI Vision QD6500 and QD6580 VLB IDE Controllers.
  • Hopefully optimized IDE transfer functions for 8088 (replaced some memory accesses from WORD to BYTE).
  • XT build does not fit in 8k at the moment!!!
File size: 4.5 KB
RevLine 
[88]1; Project name  :   XTIDE Universal BIOS
[3]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:
[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;--------------------------------------------------------------------
19ALIGN JUMP_ALIGN
20AHDh_HandlerForResetHardDisk:
[84]21%ifndef USE_186
[3]22    call    AHDh_ResetDrive
[148]23    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
[84]24%else
[148]25    push    Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
[162]26    ; Fall to AHDh_ResetDrive
[84]27%endif
[3]28
29
30;--------------------------------------------------------------------
31; Resets hard disk.
32;
33; AHDh_ResetDrive
34;   Parameters:
[271]35;       DS:DI:  Ptr to DPT
[150]36;       SS:BP:  Ptr to IDEPACK
[3]37;   Returns:
38;       AH:     Int 13h return status
[294]39;       CF:     0 if successful, 1 if error
[3]40;   Corrupts registers:
[271]41;       AL, SI
[3]42;--------------------------------------------------------------------
43AHDh_ResetDrive:
[26]44    push    dx
[271]45    push    cx
[26]46    push    bx
[262]47    push    di
[26]48
[33]49    call    Interrupts_UnmaskInterruptControllerForDriveInDSDI
[150]50    call    Device_ResetMasterAndSlaveController
[262]51    ;jc     SHORT .ReturnError                  ; CF would be set if slave drive present without master
52                                                ; (error register has special values after reset)
[3]53
54    ; Initialize Master and Slave drives
[363]55    eMOVZX  ax, BYTE [di+DPT.bIdevarsOffset]    ; (AL) pointer to controller we are looking to reset
[294]56                                                ; (AH) initialize error code, assume success
57
[363]58    mov     si, IterateAndResetDrives           ; Callback function for FindDPT_IterateAllDPTs
[271]59    call    FindDPT_IterateAllDPTs
[26]60
[262]61    shr     ah, 1                               ; Move error code and CF into proper position
62
63    pop     di
[26]64    pop     bx
[271]65    pop     cx
[26]66    pop     dx
[3]67    ret
68
69;--------------------------------------------------------------------
[262]70; IterateAndResetDrives: Iteration routine for use with IterateAllDPTs.
71;
[294]72; When a drive on the controller is found, it is reset, and the error code
[262]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.
[363]75;
76;   Parameters:
77;       AL:     Offset to IDEVARS for drives to initialize
78;       AH:     Error status from previous initialization
79;       DS:DI:  Ptr to DPT to examine
80;   Returns:
81;       AH:     Error status from initialization
82;       CF:     Set to iterate all DPTs
83;   Corrupts registers:
84;       AL, BX, DX
[3]85;--------------------------------------------------------------------
[262]86IterateAndResetDrives:
87    cmp     al, [di+DPT.bIdevarsOffset]         ; The right controller?
[271]88    jne     .done
[262]89    push    ax
[363]90    push    cx
[262]91    call    AH9h_InitializeDriveForUse          ; Reset Master and Slave (Master will come first in DPT list)
[363]92
93%ifdef MODULE_ADVANCED_ATA
94    jc      SHORT .SkipControllerInitSinceError
95    call    InitializeAdvancedIdeControllers    ; Done after drive init so drives are first set to advanced PIO mode, then the controller
96.SkipControllerInitSinceError:
97%endif
98
99    pop     cx
[294]100    pop     ax
[282]101    jnc     .done
[262]102    or      ah, (RET_HD_RESETFAIL << 1) | 1     ; OR in Reset Failed error code and CF, will SHR into position later
103.done:
[271]104    stc                                         ; From IterateAllDPTs perspective, the DPT is never found (continue iteration)
[3]105    ret
[363]106
107
108%ifdef MODULE_ADVANCED_ATA
109;--------------------------------------------------------------------
110; Here we initialize the more advanced controllers (VLB and PCI)
111; to get better performance for systems with 32-bit bus.
112;
113; This step is optional since the controllers use slowest possible
114; settings by default if they are not initialized.
115;
116; InitializeAdvancedIdeController
117;   Parameters:
118;       DS:DI:  Ptr to DPT
119;   Returns:
120;       CF:     Cleared if success or no controller to initialize
121;               Set if error
122;   Corrupts registers:
123;       AX, BX, CX, DX
124;--------------------------------------------------------------------
125InitializeAdvancedIdeControllers:
126    ; We want to initialize the advanced controller only after both
127    ; Master and Slave drive are initialized to correct PIO mode.
128    ; We check if next DPT is for the same IDE controller. If it is,
129    ; we skip the initialization.
130    mov     al, [di+DPT.bIdevarsOffset]
131    cmp     al, [di++LARGEST_DPT_SIZE+DPT.bIdevarsOffset]
132    je      SHORT .SkipInitializationUntilNextDrive ; CF cleared
133
134    jmp     AdvAtaInit_InitializeControllerForDPTinDSDI
135.SkipInitializationUntilNextDrive:
136    clc
137    ret
138
139%endif  ; MODULE_ADVANCED_ATA
Note: See TracBrowser for help on using the repository browser.