Changeset 593 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Initialization/AdvancedAta
- Timestamp:
- Jun 30, 2018, 8:27:04 AM (6 years ago)
- Location:
- trunk/XTIDE_Universal_BIOS/Src/Initialization/AdvancedAta
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Initialization/AdvancedAta/AdvAtaInit.asm
r592 r593 33 33 ; Cleared if no controller 34 34 ; Corrupts registers: 35 ; BX 35 ; BX, CX 36 36 ;-------------------------------------------------------------------- 37 37 AdvAtaInit_DetectControllerForIdeBaseInBX: 38 ; Detect if system has PCI bus. If it does, we can skip VLB detection. This is 39 ; good thing since detecting Vision QD6850 is dangerous since Intel PIIX4 south bridge 40 ; mirrors Interrupt Controller registers from Axh to Bxh. This can lead to faulty 41 ; detection of QD6850 that will eventually crash the system when ports are written. 42 43 ; We should save the 32-bit registers but we don't since system BIOS has stored 44 ; them already and we don't use the 32-bit registers ourselves anywhere at the moment. 45 push bx 46 push di 47 xor edi, edi ; Some BIOSes require this to be set to zero 48 mov ax, PCI_INSTALLATION_CHECK 49 int BIOS_TIME_PCI_PNP_1Ah 50 pop di 51 pop bx 52 test ah, ah 53 jz SHORT .ThisSystemHasPCIbus 54 55 ; Detect VLB controllers 38 56 call Vision_DetectAndReturnIDinAXandPortInDXifControllerPresent 39 57 jnz SHORT .NoVisionControllerFound … … 51 69 52 70 .NoAdvancedControllerForPortBX: 71 .ThisSystemHasPCIbus: 53 72 xor ax, ax ; Clear ID in AX and CF 54 73 ret -
trunk/XTIDE_Universal_BIOS/Src/Initialization/AdvancedAta/Vision.asm
r592 r593 41 41 in al, QD65XX_BASE_PORT + QD65XX_CONFIG_REGISTER_in 42 42 43 %ifdef DANGEROUS_DETECTION44 ; Checking alternative base port is currently commented away45 ; since Intel PIIX4 south bridge mirrors Interrupt Controller registers46 ; from Axh to Bxh.47 43 call IsConfigRegisterWithIDinAL 48 44 je SHORT VisionControllerDetected.Return … … 51 47 mov dl, QD65XX_ALTERNATIVE_BASE_PORT 52 48 in al, QD65XX_ALTERNATIVE_BASE_PORT + QD65XX_CONFIG_REGISTER_in 53 %endif ; DANGEROUS_DETECTION54 49 ; Fall to IsConfigRegisterWithIDinAL 55 50 … … 198 193 199 194 ; Calculate Recovery Time value for QD65xx IDE Timing Register 200 call AtaID_GetRecoveryTimeToAXfromPioModeInBXandCycleTimeInCX 195 xchg ax, cx 196 eMOVZX cx, BYTE [cs:bx+.rgbToSubtractFromCycleTimeBasedOnPIOmode] 197 sub ax, cx 201 198 mov bx, bp ; Active Time value now in BL 202 199 mov bp, QD65xx_MAX_RECOVERY_TIME_CLOCKS | (QD65xx_MIN_RECOVERY_TIME_CLOCKS << 8) … … 209 206 ret ; Return with CF cleared 210 207 208 .rgbToSubtractFromCycleTimeBasedOnPIOmode: 209 ; For PIO 0 to 2 this method (t0 - (t1+t8+t9)) seems to give closest (little less) values to the fixed preset 210 ; values used by QDI6580 DOS driver v3.7 211 db (PIO_0_MIN_ADDRESS_VALID_NS + PIO_0_MAX_ADDR_VALID_TO_IOCS16_RELEASED + PIO_0_DIORW_TO_ADDR_VALID_HOLD) 212 db (PIO_1_MIN_ADDRESS_VALID_NS + PIO_1_MAX_ADDR_VALID_TO_IOCS16_RELEASED + PIO_1_DIORW_TO_ADDR_VALID_HOLD) 213 db (PIO_2_MIN_ADDRESS_VALID_NS + PIO_2_MAX_ADDR_VALID_TO_IOCS16_RELEASED + PIO_2_DIORW_TO_ADDR_VALID_HOLD) 214 db 102 ; QDI6580 DOS driver v3.7 uses fixed values for PIO 3... 215 db 61 ; ...and PIO 4. No idea where these values come from. 216 db (PIO_5_MIN_CYCLE_TIME_NS / 2) ; PIO 5 and 6 were not available when QD6850 was released. Use values... 217 db (PIO_6_MIN_CYCLE_TIME_NS / 2) ; ...that resembles those used for PIO 4 218 211 219 212 220 ;-------------------------------------------------------------------- … … 226 234 227 235 ; Get VLB Cycle Time in nanosecs 228 mov cl, VLB_33MHZ_CYCLE_TIME ; Assume 33 MHz or slower VLB bus 236 mov cl, VLB_33MHZ_CYCLE_TIME ; Assume 33 MHz or slower VLB bus (30 ns) 229 237 test BYTE [di+DPT_ADVANCED_ATA.wControllerID], FLG_QDCONFIG_ID3 230 eCMOVZ cl, VLB_40MHZ_CYCLE_TIME 238 eCMOVZ cl, VLB_40MHZ_CYCLE_TIME ; (25 ns) 231 239 232 240 ; Convert value in AX to VLB ticks
Note:
See TracChangeset
for help on using the changeset viewer.