Changeset 593 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src/Initialization
- Timestamp:
- Jun 30, 2018, 8:27:04 AM (6 years ago)
- Location:
- trunk/XTIDE_Universal_BIOS/Src/Initialization
- Files:
-
- 4 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 -
trunk/XTIDE_Universal_BIOS/Src/Initialization/AtaID.asm
r592 r593 211 211 212 212 ;-------------------------------------------------------------------- 213 ; AtaID_GetRecoveryTimeToAXfromPioModeInBXandCycleTimeInCX214 ; Parameters:215 ; BX: PIO Mode216 ; CX: PIO Cycle Time in nanosecs217 ; Returns:218 ; AX: Active Time in nanosecs219 ; Corrupts registers:220 ; BX, CX221 ;--------------------------------------------------------------------222 AtaID_GetRecoveryTimeToAXfromPioModeInBXandCycleTimeInCX:223 call AtaID_GetActiveTimeToAXfromPioModeInBX224 mov bl, [cs:bx+.rgbPioModeToAddressValidTimeNs]225 sub cx, bx ; Cycle Time (t0) - Address Valid Time (t1)226 sub cx, ax ; - Active Time (t2)227 xchg ax, cx ; AX = Recovery Time (t2i)228 ret229 230 .rgbPioModeToAddressValidTimeNs:231 db PIO_0_MIN_ADDRESS_VALID_NS232 db PIO_1_MIN_ADDRESS_VALID_NS233 db PIO_2_MIN_ADDRESS_VALID_NS234 db PIO_3_MIN_ADDRESS_VALID_NS235 db PIO_4_MIN_ADDRESS_VALID_NS236 db PIO_5_MIN_ADDRESS_VALID_NS237 db PIO_6_MIN_ADDRESS_VALID_NS238 239 240 ;--------------------------------------------------------------------241 213 ; AtaID_GetActiveTimeToAXfromPioModeInBX 242 214 ; Parameters: -
trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectDrives.asm
r589 r593 95 95 ; FindDPT_ForDriveNumber will not find any drives that are ours. 96 96 ; 97 98 ; Here we might want to replace BIOS configured drives with the ones we detected. 99 ; Primary reason is to support dynamic overlay feature in the future. Second reason 100 ; is a hack to get Windows 95 load proper IDE drivers. 101 ; 102 ; The Windows hack has two parts. First part is to try to alter CMOS address 12h as that 103 ; is what Windows 95 driver reads to detect IDE drives. Altering is not possible on all 104 ; systems since CMOS has a checksum but it's location is not standardized. We will first 105 ; try to detect valid checksum. If it succeeds, then it is safe to assume this system 106 ; has compatible CMOS and we can alter it. 107 ; If verify fails, we do the more dirty hack to zero BDA drive count. Then Windows 95 works 108 ; as long as user has configured at least one drive in the BIOS setup. 109 110 %ifdef USE_AT ; FLG_ROMVARS_IGNORE_MOTHERBOARD_DRIVES is for AT builds only 111 112 %ifdef MODULE_WIN95_CMOS_HACK 113 mov dl, HARD_DISK_TYPES 114 call CMOS_ReadFromIndexInDLtoAL 115 test al, al 116 jnz SHORT .ContinueInitialization ; CMOS byte 12h is ready for Windows 95 117 call CMOS_Verify10hTo2Dh 118 jnz SHORT .ClearBdaDriveCount ; Unsupported BIOS, use plan B 119 120 ; Now we can alter CMOS location 12h 121 mov dl, HARD_DISK_TYPES 122 mov al, 0F0h ; Drive 0 type 16...47 but Windows doesn't care as long as this is not zero 123 call CMOS_WriteALtoIndexInDL 124 call CMOS_StoreNewChecksumFor10hto2Dh 125 %endif 126 127 test BYTE [cs:ROMVARS.wFlags], FLG_ROMVARS_IGNORE_MOTHERBOARD_DRIVES 128 jz SHORT .ContinueInitialization 129 .ClearBdaDriveCount: 130 mov BYTE [es:BDA.bHDCount], 0 ; Set hard disk count to zero 131 .ContinueInitialization: 132 %endif 133 97 134 mov cx, [RAMVARS.wDrvCntAndFlopCnt] ; Our count of hard disks 98 135 mov al, [es:BDA.bHDCount]
Note:
See TracChangeset
for help on using the changeset viewer.