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

Last change on this file since 308 was 294, checked in by krille_n_@…, 12 years ago

Commit 2/2 (BIOS):

  • Fixed a bug in AH1h_HStatus.asm.
  • Minor optimizations.
  • Fixed spelling and did some cleaning.
File size: 2.7 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
[294]55 eMOVZX ax, [di+DPT.bIdevarsOffset] ; (AL) pointer to controller we are looking to reset
56 ; (AH) initialize error code, assume success
57
[262]58 mov si, IterateAndResetDrives
[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.
[3]75;--------------------------------------------------------------------
[262]76IterateAndResetDrives:
77 cmp al, [di+DPT.bIdevarsOffset] ; The right controller?
[271]78 jne .done
[262]79 push ax
80 call AH9h_InitializeDriveForUse ; Reset Master and Slave (Master will come first in DPT list)
[294]81 pop ax
[282]82 jnc .done
[262]83 or ah, (RET_HD_RESETFAIL << 1) | 1 ; OR in Reset Failed error code and CF, will SHR into position later
84.done:
[271]85 stc ; From IterateAllDPTs perspective, the DPT is never found (continue iteration)
[3]86 ret
Note: See TracBrowser for help on using the repository browser.