From 1c9ce36b2371c2f23f6e2f37426dbe968d0228bc Mon Sep 17 00:00:00 2001 From: AJR Date: Fri, 3 Mar 2023 07:49:09 -0500 Subject: macqd700: Throttle CPU when doing SCSI pseudo-DMA to make 53C96 clock and transfer rates more realistic --- src/mame/apple/macquadra700.cpp | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/mame/apple/macquadra700.cpp b/src/mame/apple/macquadra700.cpp index e0e674990ba..157d7aa8679 100644 --- a/src/mame/apple/macquadra700.cpp +++ b/src/mame/apple/macquadra700.cpp @@ -196,6 +196,8 @@ private: uint8_t mac_5396_r(offs_t offset); void mac_5396_w(offs_t offset, uint8_t data); + uint16_t mac_5396_dma_r(offs_t offset); + void mac_5396_dma_w(offs_t offset, uint16_t data); }; void macquadra_state::field_interrupts() @@ -776,6 +778,26 @@ void macquadra_state::mac_5396_w(offs_t offset, uint8_t data) m_ncr1->write(offset>>4, data); } +uint16_t macquadra_state::mac_5396_dma_r(offs_t offset) +{ + // HACK: Extra time is necessary to avoid underrunning the FIFO at 4 MB/sec transfer rates claimed to + // be typical for Apple HDDs of the period. + // Likely due to inaccurate 68040 bus timings or wait states; DAFB documentation is clear that there is + // no "magic latch" like the 5380 machines use. + if (!machine().side_effects_disabled() && BIT(offset << 1, 18)) + m_maincpu->adjust_icount(-4); + + return m_ncr1->dma16_swap_r(); +} + +void macquadra_state::mac_5396_dma_w(offs_t offset, uint16_t data) +{ + if (!machine().side_effects_disabled() && BIT(offset << 1, 18)) + m_maincpu->adjust_icount(-4); + + m_ncr1->dma16_swap_w(data); +} + /*************************************************************************** ADDRESS MAPS ***************************************************************************/ @@ -789,7 +811,7 @@ void macquadra_state::quadra700_map(address_map &map) // 5000a000 = Sonic (DP83932) ethernet // 5000f000 = SCSI cf96, 5000f402 = SCSI #2 cf96 map(0x5000f000, 0x5000f0ff).rw(FUNC(macquadra_state::mac_5396_r), FUNC(macquadra_state::mac_5396_w)).mirror(0x00fc0000); - map(0x5000f100, 0x5000f101).rw(m_ncr1, FUNC(ncr53c94_device::dma16_swap_r), FUNC(ncr53c94_device::dma16_swap_w)).mirror(0x00fc0000); + map(0x5000f100, 0x5000f101).rw(FUNC(macquadra_state::mac_5396_dma_r), FUNC(macquadra_state::mac_5396_dma_w)).select(0x00fc0000); map(0x5000c000, 0x5000dfff).rw(FUNC(macquadra_state::mac_scc_r), FUNC(macquadra_state::mac_scc_2_w)).mirror(0x00fc0000); map(0x50014000, 0x50015fff).rw(m_easc, FUNC(asc_device::read), FUNC(asc_device::write)).mirror(0x00fc0000); map(0x5001e000, 0x5001ffff).rw(FUNC(macquadra_state::swim_r), FUNC(macquadra_state::swim_w)).mirror(0x00fc0000); @@ -931,10 +953,7 @@ void macquadra_state::macqd700(machine_config &config) NSCSI_CONNECTOR(config, "scsi1:4", mac_scsi_devices, "cdrom"); NSCSI_CONNECTOR(config, "scsi1:5", mac_scsi_devices, nullptr); NSCSI_CONNECTOR(config, "scsi1:6", mac_scsi_devices, "harddisk"); - // HACK: Max clock for 5394/96 is 25 MHz, but we underrun the FIFO at that speed. - // Likely due to inaccurate 68040 and/or NSCSI bus timings; DAFB documentation is clear that there is - // no "magic latch" like the 5380 machines use. - NSCSI_CONNECTOR(config, "scsi1:7").option_set("ncr53c96", NCR53C96).clock(50_MHz_XTAL).machine_config( + NSCSI_CONNECTOR(config, "scsi1:7").option_set("ncr53c96", NCR53C96).clock(50_MHz_XTAL / 2).machine_config( [this] (device_t *device) { ncr53c96_device &adapter = downcast(*device); -- cgit v1.2.3