Changeset 262 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH0h_HReset.asm
- Timestamp:
- Feb 24, 2012, 10:28:31 AM (13 years ago)
- google:author:
- gregli@hotmail.com
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH0h_HReset.asm
r259 r262 121 121 GetDriveNumberForForeignBiosesToDL: 122 122 mov dl, bl 123 call RamVars_IsDriveHandledByThisBIOS124 j cSHORT .Return ; Return what was in BL unmodified123 test di, di 124 jz SHORT .Return ; Return what was in BL unmodified 125 125 mov dl, 80h 126 126 .Return: … … 141 141 ALIGN JUMP_ALIGN 142 142 AH0h_ResetHardDisksHandledByOurBIOS: 143 mov dx, [RAMVARS.wDrvCntAndFirst] ; DL = drive number, DH = drive count 144 test dh, dh 145 jz SHORT .AllDrivesReset ; Return if no drives 146 add dh, dl ; DH = one past last drive to reset 147 ALIGN JUMP_ALIGN 148 .DriveResetLoop: 149 call AHDh_ResetDrive 150 call .BackupErrorCodeFromMasterOrSlaveToBH 151 inc dx 152 cmp dl, dh ; All done? 153 jb SHORT .DriveResetLoop ; If not, reset next drive 154 .AllDrivesReset: 143 mov bl, [di+DPT.bIdevarsOffset] ; replace drive number with Idevars pointer for comparisons 144 mov cl, [cs:ROMVARS.bIdeCnt] ; get count of ide controllers 145 mov ch, 0 146 mov dl, 0 ; starting Idevars offset 147 mov si, IterateFindFirstDPTforIdevars ; iteration routine 148 .loop: 149 call IterateAllDPTs ; look for the first drive on this controller, if any 150 jc .notFound 151 call AHDh_ResetDrive ; reset master and slave on that controller 152 call BackupErrorCodeFromTheRequestedDriveToBH ; save error code if same controller as initial request 153 .notFound: 154 add dl, IDEVARS_size ; move pointer forward 155 loop .loop ; and repeat 155 156 ret 156 157 157 158 158 ;-------------------------------------------------------------------- 159 ; .BackupErrorCodeFromMasterOrSlaveToBH 160 ; Parameters: 161 ; AH: Error code for drive DL reset 162 ; BL: Requested drive (DL when entering AH=00h) 163 ; DL: Drive just resetted 164 ; DS: RAMVARS segment 165 ; Returns: 166 ; BH: Backuped error code 167 ; DL: Incremented if next drive is slave drive 168 ; (=already resetted) 169 ; Corrupts registers: 170 ; CX, DI 159 ; Iteration routine for AH0h_ResetHardDisksHandledByOurBIOS, 160 ; for use with IterateAllDPTs 161 ; 162 ; Returns when DPT is found on the controller with Idevars offset in DL 171 163 ;-------------------------------------------------------------------- 172 ALIGN JUMP_ALIGN 173 .BackupErrorCodeFromMasterOrSlaveToBH: 174 call BackupErrorCodeFromTheRequestedDriveToBH 175 call GetBasePortToCX ; Load base port for resetted drive 176 push cx 177 inc dx ; DL to next drive 178 call GetBasePortToCX 179 pop di 180 cmp cx, di ; Next drive is from same controller? 181 je SHORT BackupErrorCodeFromTheRequestedDriveToBH 182 .NoMoreDrivesOrNoSlaveDrive: 183 dec dx 164 IterateFindFirstDPTforIdevars: 165 cmp dl, [di+DPT.bIdevarsOffset] ; Clears CF if matched 166 jz .done 167 stc ; Set CF for not found 168 .done: 184 169 ret 185 186 187 ;--------------------------------------------------------------------188 ; GetBasePortToCX189 ; Parameters:190 ; DL: Drive number191 ; DS: RAMVARS segment192 ; Returns:193 ; CX: Base port address194 ; CF: Set if valid drive number195 ; Cleared if invalid drive number196 ; Corrupts registers:197 ; DI198 ;--------------------------------------------------------------------199 ALIGN JUMP_ALIGN200 GetBasePortToCX:201 xchg cx, bx202 xor bx, bx203 call FindDPT_ForDriveNumber204 mov bl, [di+DPT.bIdevarsOffset]205 mov bx, [cs:bx+IDEVARS.wPort]206 xchg bx, cx207 ret208 209
Note:
See TracChangeset
for help on using the changeset viewer.