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

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

Changes to XTIDE Universal BIOS:

  • XTIDE rev 2 and modded XTIDE rev 1 work again (fixed A0<->A3 swap when accessing Control Block Registers).
  • System INT 13h handler is no longer copied to INT 40h (testing if something uses INT 40h).
  • Removed controller hardware reset: now AH=0h and AH=Dh will only re-initialize drives (SB16 Tertiary and Quaternary IDE should now be safe to use when using Secondary IDE).
File size: 5.1 KB
RevLine 
[88]1; Project name  :   XTIDE Universal BIOS
[3]2; Description   :   Int 13h function AH=Dh, Reset Hard Disk (Alternate reset).
3
[376]4;
[445]5; XTIDE Universal BIOS and Associated Tools
[376]6; Copyright (C) 2009-2010 by Tomi Tilli, 2011-2012 by XTIDE Universal BIOS Team.
7;
8; This program is free software; you can redistribute it and/or modify
9; it under the terms of the GNU General Public License as published by
10; the Free Software Foundation; either version 2 of the License, or
11; (at your option) any later version.
[445]12;
[376]13; This program is distributed in the hope that it will be useful,
14; but WITHOUT ANY WARRANTY; without even the implied warranty of
15; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16; GNU General Public License for more details.
[445]17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
[376]19
[3]20; Section containing code
21SECTION .text
22
23;--------------------------------------------------------------------
24; Int 13h function AH=Dh, Reset Hard Disk (Alternate reset).
25;
26; AHDh_HandlerForResetHardDisk
27;   Parameters:
[148]28;       DL:     Translated Drive number
29;       DS:DI:  Ptr to DPT (in RAMVARS segment)
[150]30;       SS:BP:  Ptr to IDEPACK
31;   Returns with INTPACK:
[3]32;       AH:     Int 13h return status
[294]33;       CF:     0 if successful, 1 if error
[3]34;--------------------------------------------------------------------
35AHDh_HandlerForResetHardDisk:
[84]36%ifndef USE_186
[3]37    call    AHDh_ResetDrive
[148]38    jmp     Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
[84]39%else
[148]40    push    Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
[162]41    ; Fall to AHDh_ResetDrive
[84]42%endif
[3]43
44
45;--------------------------------------------------------------------
46; Resets hard disk.
47;
48; AHDh_ResetDrive
49;   Parameters:
[271]50;       DS:DI:  Ptr to DPT
[150]51;       SS:BP:  Ptr to IDEPACK
[3]52;   Returns:
53;       AH:     Int 13h return status
[294]54;       CF:     0 if successful, 1 if error
[3]55;   Corrupts registers:
[271]56;       AL, SI
[3]57;--------------------------------------------------------------------
58AHDh_ResetDrive:
[26]59    push    dx
[271]60    push    cx
[26]61    push    bx
[262]62    push    di
[26]63
[398]64%ifdef MODULE_IRQ
[33]65    call    Interrupts_UnmaskInterruptControllerForDriveInDSDI
[398]66%endif
[3]67    ; Initialize Master and Slave drives
[473]68    call    AccessDPT_GetIdevarsToCSBX
69    xchg    ax, bx                              ; (AL) pointer to controller we are looking to reset
[294]70                                                ; (AH) initialize error code, assume success
71
[363]72    mov     si, IterateAndResetDrives           ; Callback function for FindDPT_IterateAllDPTs
[271]73    call    FindDPT_IterateAllDPTs
[26]74
[262]75    shr     ah, 1                               ; Move error code and CF into proper position
76
77    pop     di
[26]78    pop     bx
[271]79    pop     cx
[26]80    pop     dx
[3]81    ret
82
83;--------------------------------------------------------------------
[262]84; IterateAndResetDrives: Iteration routine for use with IterateAllDPTs.
85;
[294]86; When a drive on the controller is found, it is reset, and the error code
[262]87; merged into overall error code for this controller.  Master will be reset
88; first.  Note that the iteration will go until the end of the DPT list.
[363]89;
90;   Parameters:
91;       AL:     Offset to IDEVARS for drives to initialize
92;       AH:     Error status from previous initialization
93;       DS:DI:  Ptr to DPT to examine
94;   Returns:
95;       AH:     Error status from initialization
96;       CF:     Set to iterate all DPTs
97;   Corrupts registers:
98;       AL, BX, DX
[3]99;--------------------------------------------------------------------
[262]100IterateAndResetDrives:
101    cmp     al, [di+DPT.bIdevarsOffset]         ; The right controller?
[370]102    jne     .Done
103    push    cx
[262]104    push    ax
[445]105    call    AHDh_WaitUntilDriveMotorHasReachedFullSpeed
[428]106    call    AH9h_InitializeDriveForUse          ; Initialize Master or Slave (Master will come first in DPT list)
[363]107
108%ifdef MODULE_ADVANCED_ATA
109    jc      SHORT .SkipControllerInitSinceError
[370]110    ; Here we initialize the more advanced controllers (VLB and PCI) to get better performance for systems with 32-bit bus.
111    ; This step is optional since the controllers use slowest possible settings by default if they are not initialized.
112
113    pop     ax
114    push    ax
115    cmp     al, [di+LARGEST_DPT_SIZE+DPT.bIdevarsOffset]    ; We check if next DPT is for the same IDE controller.
116    je      SHORT .SkipInitializationUntilNextDrive         ; If it is, we skip the initialization.
117    call    AdvAtaInit_InitializeControllerForDPTinDSDI     ; Done after drive init so drives are first set to advanced PIO mode, then the controller
118.SkipInitializationUntilNextDrive:
[363]119.SkipControllerInitSinceError:
[370]120%endif  ; MODULE_ADVANCED_ATA
[363]121
[370]122    pop     ax
[363]123    pop     cx
[370]124    jnc     .Done
[262]125    or      ah, (RET_HD_RESETFAIL << 1) | 1     ; OR in Reset Failed error code and CF, will SHR into position later
[370]126.Done:
[271]127    stc                                         ; From IterateAllDPTs perspective, the DPT is never found (continue iteration)
[3]128    ret
[363]129
[428]130
131;--------------------------------------------------------------------
[445]132; AHDh_WaitUntilDriveMotorHasReachedFullSpeed
[428]133;   Parameters:
134;       DS:DI:  Ptr to DPT
135;   Returns:
136;       AH:     Int 13h return status
137;       CF:     0 if successful, 1 if error
138;   Corrupts registers:
139;       AL, BX, CX, DX
140;--------------------------------------------------------------------
[445]141AHDh_WaitUntilDriveMotorHasReachedFullSpeed:
[428]142%ifdef MODULE_SERIAL
143    test    BYTE [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE
144    jz      SHORT .WaitSinceRealHardDisk
145    ret
146.WaitSinceRealHardDisk:
147%endif
148
[429]149    mov     bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_MOTOR_STARTUP, FLG_STATUS_DRDY)
[428]150    jmp     IdeWait_PollStatusFlagInBLwithTimeoutInBH
Note: See TracBrowser for help on using the repository browser.