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

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

Changes:

  • A speed optimization to the eSHL_IM macro for 386 and higher. This change breaks emulation in the sense that the macro will fail when given a memory operand as the first parameter.
  • Memory_SumCXbytesFromESSItoAL now returns with the zero flag set/cleared according to the result.
  • Unrolled all the 8 bit READ transfer loops to do 16 bytes per iteration. Added a new macro (UNROLL_SECTORS_IN_CX_TO_OWORDS) as part of it. Size wise this is expensive but I think it should be worth the ROM space. The WRITE transfer loops were left as is since writes are rare anyway (<10% of all disk I/O IIRC).
  • Minor optimizations and fixes here and there.
File size: 5.2 KB
Line 
1; Project name : XTIDE Universal BIOS
2; Description : Int 13h function AH=Dh, Reset Hard Disk (Alternate reset).
3
4;
5; XTIDE Universal BIOS and Associated Tools
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.
12;
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.
17; Visit http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
18;
19
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:
28; DL: Translated Drive number
29; DS:DI: Ptr to DPT (in RAMVARS segment)
30; SS:BP: Ptr to IDEPACK
31; Returns with INTPACK:
32; AH: Int 13h return status
33; CF: 0 if successful, 1 if error
34;--------------------------------------------------------------------
35AHDh_HandlerForResetHardDisk:
36%ifndef USE_186
37 call AHDh_ResetDrive
38 jmp Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
39%else
40 push Int13h_ReturnFromHandlerAfterStoringErrorCodeFromAH
41 ; Fall to AHDh_ResetDrive
42%endif
43
44
45;--------------------------------------------------------------------
46; Resets hard disk.
47;
48; AHDh_ResetDrive
49; Parameters:
50; DS:DI: Ptr to DPT
51; SS:BP: Ptr to IDEPACK
52; Returns:
53; AH: Int 13h return status
54; CF: 0 if successful, 1 if error
55; Corrupts registers:
56; AL, SI
57;--------------------------------------------------------------------
58AHDh_ResetDrive:
59 push dx
60 push cx
61 push bx
62 push di
63
64%ifdef MODULE_IRQ
65 call Interrupts_UnmaskInterruptControllerForDriveInDSDI
66%endif
67 call Device_ResetMasterAndSlaveController
68 ;jc SHORT .ReturnError ; CF would be set if slave drive present without master
69 ; (error register has special values after reset)
70
71 ; Initialize Master and Slave drives
72 eMOVZX ax, [di+DPT.bIdevarsOffset] ; (AL) pointer to controller we are looking to reset
73 ; (AH) initialize error code, assume success
74
75 mov si, IterateAndResetDrives ; Callback function for FindDPT_IterateAllDPTs
76 call FindDPT_IterateAllDPTs
77
78 shr ah, 1 ; Move error code and CF into proper position
79
80 pop di
81 pop bx
82 pop cx
83 pop dx
84 ret
85
86;--------------------------------------------------------------------
87; IterateAndResetDrives: Iteration routine for use with IterateAllDPTs.
88;
89; When a drive on the controller is found, it is reset, and the error code
90; merged into overall error code for this controller. Master will be reset
91; first. Note that the iteration will go until the end of the DPT list.
92;
93; Parameters:
94; AL: Offset to IDEVARS for drives to initialize
95; AH: Error status from previous initialization
96; DS:DI: Ptr to DPT to examine
97; Returns:
98; AH: Error status from initialization
99; CF: Set to iterate all DPTs
100; Corrupts registers:
101; AL, BX, DX
102;--------------------------------------------------------------------
103IterateAndResetDrives:
104 cmp al, [di+DPT.bIdevarsOffset] ; The right controller?
105 jne .Done
106 push cx
107 push ax
108 call AHDh_WaitUntilDriveMotorHasReachedFullSpeed
109 call AH9h_InitializeDriveForUse ; Initialize Master or Slave (Master will come first in DPT list)
110
111%ifdef MODULE_ADVANCED_ATA
112 jc SHORT .SkipControllerInitSinceError
113 ; Here we initialize the more advanced controllers (VLB and PCI) to get better performance for systems with 32-bit bus.
114 ; This step is optional since the controllers use slowest possible settings by default if they are not initialized.
115
116 pop ax
117 push ax
118 cmp al, [di+LARGEST_DPT_SIZE+DPT.bIdevarsOffset] ; We check if next DPT is for the same IDE controller.
119 je SHORT .SkipInitializationUntilNextDrive ; If it is, we skip the initialization.
120 call AdvAtaInit_InitializeControllerForDPTinDSDI ; Done after drive init so drives are first set to advanced PIO mode, then the controller
121.SkipInitializationUntilNextDrive:
122.SkipControllerInitSinceError:
123%endif ; MODULE_ADVANCED_ATA
124
125 pop ax
126 pop cx
127 jnc .Done
128 or ah, (RET_HD_RESETFAIL << 1) | 1 ; OR in Reset Failed error code and CF, will SHR into position later
129.Done:
130 stc ; From IterateAllDPTs perspective, the DPT is never found (continue iteration)
131 ret
132
133
134;--------------------------------------------------------------------
135; AHDh_WaitUntilDriveMotorHasReachedFullSpeed
136; Parameters:
137; DS:DI: Ptr to DPT
138; Returns:
139; AH: Int 13h return status
140; CF: 0 if successful, 1 if error
141; Corrupts registers:
142; AL, BX, CX, DX
143;--------------------------------------------------------------------
144AHDh_WaitUntilDriveMotorHasReachedFullSpeed:
145%ifdef MODULE_SERIAL
146 test BYTE [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE
147 jz SHORT .WaitSinceRealHardDisk
148 ret
149.WaitSinceRealHardDisk:
150%endif
151
152 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_MOTOR_STARTUP, FLG_STATUS_DRDY)
153 jmp IdeWait_PollStatusFlagInBLwithTimeoutInBH
Note: See TracBrowser for help on using the repository browser.