From 6ea142efb8e3ab1bc854dc45e66010a9ba8e774b Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Tue, 16 Mar 2021 21:00:03 +0100 Subject: pmac6100: Connect SCSI --- src/mame/drivers/macpdm.cpp | 328 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 285 insertions(+), 43 deletions(-) diff --git a/src/mame/drivers/macpdm.cpp b/src/mame/drivers/macpdm.cpp index 3a5d1ab6929..06ed9cb0685 100644 --- a/src/mame/drivers/macpdm.cpp +++ b/src/mame/drivers/macpdm.cpp @@ -4,15 +4,14 @@ #include "emu.h" #include "bus/nubus/nubus.h" -#include "bus/scsi/scsi.h" -#include "bus/scsi/scsihd.h" +#include "bus/nscsi/devices.h" #include "cpu/powerpc/ppc.h" #include "machine/6522via.h" #include "machine/8530scc.h" #include "machine/cuda.h" #include "machine/macadb.h" #include "machine/mv_sonora.h" -#include "machine/ncr5380.h" +#include "machine/ncr5390.h" #include "machine/ram.h" #include "machine/swim3.h" #include "machine/timer.h" @@ -41,7 +40,8 @@ private: required_device m_macadb; required_device m_ram; required_device m_scc; - required_device m_ncr5380; + required_device m_scsibus; + required_device m_ncr53c94; required_device m_fdc; required_device_array m_floppy; required_device m_video; @@ -56,13 +56,22 @@ private: uint8_t m_via2_ier, m_via2_ifr, m_via2_sier, m_via2_sifr; + uint64_t m_dma_scsi_buffer; + uint32_t m_dma_badr, m_dma_floppy_adr; uint16_t m_dma_berr_en, m_dma_berr_flag; - uint8_t m_dma_scsi_ctrl, m_dma_floppy_ctrl; + uint32_t m_dma_scsi_a_base_adr, m_dma_scsi_b_base_adr; + uint32_t m_dma_scsi_a_cur_offset, m_dma_scsi_b_cur_offset; + + uint8_t m_dma_scsi_a_ctrl, m_dma_scsi_b_ctrl, m_dma_floppy_ctrl; + uint8_t m_dma_scsi_buffer_byte_count; + uint8_t m_dma_scc_txa_ctrl, m_dma_scc_rxa_ctrl, m_dma_scc_txb_ctrl, m_dma_scc_rxb_ctrl; uint8_t m_dma_enet_rx_ctrl, m_dma_enet_tx_ctrl; + bool m_dma_scsi_a_in_step; + void pdm_map(address_map &map); DECLARE_WRITE_LINE_MEMBER(nmi_irq); @@ -72,16 +81,16 @@ private: DECLARE_WRITE_LINE_MEMBER(via1_irq); DECLARE_WRITE_LINE_MEMBER(bus_err_irq); - DECLARE_WRITE_LINE_MEMBER(fdc_irq); - DECLARE_WRITE_LINE_MEMBER(etx_irq); - DECLARE_WRITE_LINE_MEMBER(erx_irq); - DECLARE_WRITE_LINE_MEMBER(txa_irq); - DECLARE_WRITE_LINE_MEMBER(rxa_irq); - DECLARE_WRITE_LINE_MEMBER(txb_irq); - DECLARE_WRITE_LINE_MEMBER(rxb_irq); + DECLARE_WRITE_LINE_MEMBER(fdc_dma_irq); + DECLARE_WRITE_LINE_MEMBER(etx_dma_irq); + DECLARE_WRITE_LINE_MEMBER(erx_dma_irq); + DECLARE_WRITE_LINE_MEMBER(txa_dma_irq); + DECLARE_WRITE_LINE_MEMBER(rxa_dma_irq); + DECLARE_WRITE_LINE_MEMBER(txb_dma_irq); + DECLARE_WRITE_LINE_MEMBER(rxb_dma_irq); - DECLARE_WRITE_LINE_MEMBER(sndo_irq); - DECLARE_WRITE_LINE_MEMBER(sndi_irq); + DECLARE_WRITE_LINE_MEMBER(sndo_dma_irq); + DECLARE_WRITE_LINE_MEMBER(sndi_dma_irq); DECLARE_WRITE_LINE_MEMBER(fdc_err_irq); DECLARE_WRITE_LINE_MEMBER(etx_err_irq); @@ -95,6 +104,16 @@ private: DECLARE_WRITE_LINE_MEMBER(sndo_err_irq); DECLARE_WRITE_LINE_MEMBER(sndi_err_irq); + DECLARE_WRITE_LINE_MEMBER(vblank_irq); + DECLARE_WRITE_LINE_MEMBER(slot2_irq); + DECLARE_WRITE_LINE_MEMBER(slot1_irq); + DECLARE_WRITE_LINE_MEMBER(slot0_irq); + + DECLARE_WRITE_LINE_MEMBER(fdc_irq); + DECLARE_WRITE_LINE_MEMBER(sound_irq); + DECLARE_WRITE_LINE_MEMBER(scsi_irq); + DECLARE_WRITE_LINE_MEMBER(scsi_drq); + void phases_w(uint8_t phases); void sel35_w(int sel35); void devsel_w(uint8_t devsel); @@ -139,6 +158,8 @@ private: uint8_t irq_control_r(); void irq_control_w(uint8_t data); void irq_main_set(uint8_t mask, int state); + void via2_irq_main_set(uint8_t mask, int state); + void via2_irq_slot_set(uint8_t mask, int state); uint32_t dma_badr_r(); void dma_badr_w(offs_t, uint32_t data, uint32_t mem_mask); @@ -147,8 +168,17 @@ private: uint16_t dma_berr_flag_r(); void dma_berr_flag_w(offs_t, uint16_t data, uint16_t mem_mask); - uint8_t dma_scsi_ctrl_r(); - void dma_scsi_ctrl_w(uint8_t data); + void dma_scsi_a_step(); + uint32_t dma_scsi_a_base_adr_r(); + void dma_scsi_a_base_adr_w(offs_t, uint32_t data, uint32_t mem_mask); + uint32_t dma_scsi_b_base_adr_r(); + void dma_scsi_b_base_adr_w(offs_t, uint32_t data, uint32_t mem_mask); + uint8_t dma_scsi_a_ctrl_r(); + void dma_scsi_a_ctrl_w(uint8_t data); + uint8_t dma_scsi_b_ctrl_r(); + void dma_scsi_b_ctrl_w(uint8_t data); + uint32_t dma_scsi_a_cur_adr_r(); + uint32_t dma_scsi_b_cur_adr_r(); uint8_t dma_floppy_ctrl_r(); void dma_floppy_ctrl_w(uint8_t data); @@ -181,7 +211,8 @@ macpdm_state::macpdm_state(const machine_config &mconfig, device_type type, cons m_macadb(*this, "macadb"), m_ram(*this, RAM_TAG), m_scc(*this, "scc"), - m_ncr5380(*this, "ncr5380"), + m_scsibus(*this, "scsibus"), + m_ncr53c94(*this, "scsibus:7:ncr53c94"), m_fdc(*this, "fdc"), m_floppy(*this, "fdc:%d", 0U), m_video(*this, "video") @@ -213,7 +244,15 @@ void macpdm_state::driver_init() save_item(NAME(m_dma_badr)); save_item(NAME(m_dma_berr_en)); save_item(NAME(m_dma_berr_flag)); - save_item(NAME(m_dma_scsi_ctrl)); + save_item(NAME(m_dma_scsi_buffer)); + save_item(NAME(m_dma_scsi_buffer_byte_count)); + save_item(NAME(m_dma_scsi_a_in_step)); + save_item(NAME(m_dma_scsi_a_base_adr)); + save_item(NAME(m_dma_scsi_b_base_adr)); + save_item(NAME(m_dma_scsi_a_ctrl)); + save_item(NAME(m_dma_scsi_b_ctrl)); + save_item(NAME(m_dma_scsi_a_cur_offset)); + save_item(NAME(m_dma_scsi_b_cur_offset)); save_item(NAME(m_dma_floppy_ctrl)); save_item(NAME(m_dma_scc_txa_ctrl)); save_item(NAME(m_dma_scc_rxa_ctrl)); @@ -257,7 +296,15 @@ void macpdm_state::driver_reset() m_dma_badr = 0; m_dma_berr_en = 0; m_dma_berr_flag = 0; - m_dma_scsi_ctrl = 0; + m_dma_scsi_buffer = 0; + m_dma_scsi_buffer_byte_count = 0; + m_dma_scsi_a_in_step = false; + m_dma_scsi_a_base_adr = 0; + m_dma_scsi_b_base_adr = 0; + m_dma_scsi_a_ctrl = 0; + m_dma_scsi_b_ctrl = 0; + m_dma_scsi_a_cur_offset = 0; + m_dma_scsi_b_cur_offset = 0; m_dma_floppy_ctrl = 0; m_dma_scc_txa_ctrl = 0; m_dma_scc_rxa_ctrl = 0; @@ -308,6 +355,28 @@ void macpdm_state::irq_main_set(uint8_t mask, int state) m_maincpu->set_input_line(PPC_IRQ, CLEAR_LINE); } } + + // logerror("irq control %02x\n", m_irq_control); +} + +void macpdm_state::via2_irq_main_set(uint8_t mask, int state) +{ + if(((m_via2_ifr & mask) != 0) == state) + return; + + m_via2_ifr ^= mask; + logerror("via2 main %02x / %02x -> %02x\n", m_via2_ifr, m_via2_ier, m_via2_ifr & m_via2_ier); + + irq_main_set(0x02, (m_via2_ifr & m_via2_ier) != 0); +} + +void macpdm_state::via2_irq_slot_set(uint8_t mask, int state) +{ + if(((m_via2_sifr & mask) != 0) == state) + return; + + m_via2_sifr ^= mask; + via2_irq_main_set(0x02, (m_via2_sifr & m_via2_sier) != 0); } @@ -383,15 +452,18 @@ uint8_t macpdm_state::via2_ier_r() void macpdm_state::via2_ier_w(uint8_t data) { if(data & 0x80) - m_via2_ier |= data & 0x29; + m_via2_ier |= data & 0x3b; else m_via2_ier &= ~data; logerror("via2 ier %s %s %s %s\n", m_via2_ier & 0x20 ? "fdc" : "-", + m_via2_ier & 0x20 ? "sound" : "-", m_via2_ier & 0x08 ? "scsi" : "-", m_via2_ier & 0x02 ? "slot" : "-", m_via2_ier & 0x01 ? "scsidrq" : "-"); + + irq_main_set(0x02, (m_via2_ifr & m_via2_ier) != 0); } uint8_t macpdm_state::via2_ifr_r() @@ -407,15 +479,17 @@ uint8_t macpdm_state::via2_sier_r() void macpdm_state::via2_sier_w(uint8_t data) { if(data & 0x80) - m_via2_sier |= data & 0x38; + m_via2_sier |= data & 0x78; else m_via2_sier &= ~data; logerror("via2 sier %s %s %s %s\n", - m_via2_ier & 0x40 ? "vbl" : "-", - m_via2_ier & 0x20 ? "slot2" : "-", - m_via2_ier & 0x10 ? "slot1" : "-", - m_via2_ier & 0x08 ? "slot0" : "-"); + m_via2_sier & 0x40 ? "vbl" : "-", + m_via2_sier & 0x20 ? "slot2" : "-", + m_via2_sier & 0x10 ? "slot1" : "-", + m_via2_sier & 0x08 ? "slot0" : "-"); + + via2_irq_main_set(0x02, (m_via2_sifr & m_via2_sier) != 0); } uint8_t macpdm_state::via2_sifr_r() @@ -454,12 +528,12 @@ void macpdm_state::fdc_w(offs_t offset, uint8_t data) uint8_t macpdm_state::scsi_r(offs_t offset) { - return m_ncr5380->ncr5380_read_reg(offset >> 4); + return m_ncr53c94->read(offset >> 4); } void macpdm_state::scsi_w(offs_t offset, uint8_t data) { - return m_ncr5380->ncr5380_write_reg(offset >> 4, data); + m_ncr53c94->write(offset >> 4, data); } uint8_t macpdm_state::hmc_r(offs_t offset) @@ -555,6 +629,36 @@ WRITE_LINE_MEMBER(macpdm_state::via1_irq) irq_main_set(0x01, state); } +WRITE_LINE_MEMBER(macpdm_state::fdc_irq) +{ + via2_irq_main_set(0x20, state); +} + +WRITE_LINE_MEMBER(macpdm_state::sound_irq) +{ + via2_irq_main_set(0x20, state); +} + +WRITE_LINE_MEMBER(macpdm_state::vblank_irq) +{ + via2_irq_slot_set(0x40, state); +} + +WRITE_LINE_MEMBER(macpdm_state::slot2_irq) +{ + via2_irq_slot_set(0x20, state); +} + +WRITE_LINE_MEMBER(macpdm_state::slot1_irq) +{ + via2_irq_slot_set(0x10, state); +} + +WRITE_LINE_MEMBER(macpdm_state::slot0_irq) +{ + via2_irq_slot_set(0x08, state); +} + uint32_t macpdm_state::dma_badr_r() { return m_dma_badr; @@ -593,17 +697,134 @@ void macpdm_state::dma_berr_flag_w(offs_t, uint16_t data, uint16_t mem_mask) } -uint8_t macpdm_state::dma_scsi_ctrl_r() +// SCSI management + +void macpdm_state::dma_scsi_a_step() { - return m_dma_scsi_ctrl; + m_dma_scsi_a_in_step = true; + + if(m_dma_scsi_a_ctrl & 0x40) { + fatalerror("scsi dma write\n"); + + } else { + while(m_via2_ifr & 0x01) { + uint8_t b = m_ncr53c94->dma_r(); + m_dma_scsi_buffer = (m_dma_scsi_buffer & ~(u64(0xff) << (56 - 8*m_dma_scsi_buffer_byte_count))) | (u64(b) << (56 - 8*m_dma_scsi_buffer_byte_count)); + m_dma_scsi_buffer_byte_count ++; + if(m_dma_scsi_buffer_byte_count == 8) { + m_dma_scsi_buffer_byte_count = 0; + m_maincpu->space().write_qword(m_dma_scsi_a_base_adr + m_dma_scsi_a_cur_offset, m_dma_scsi_buffer); + m_dma_scsi_a_cur_offset += 8; + } + } + } + + m_dma_scsi_a_in_step = false; } -void macpdm_state::dma_scsi_ctrl_w(uint8_t data) +WRITE_LINE_MEMBER(macpdm_state::scsi_irq) { - m_dma_scsi_ctrl = data; - logerror("dma_scsi_ctrl_w %02x\n", m_dma_scsi_ctrl); + via2_irq_main_set(0x08, state); } +WRITE_LINE_MEMBER(macpdm_state::scsi_drq) +{ + via2_irq_main_set(0x01, state); + if((m_dma_scsi_a_ctrl & 0x02) && (m_via2_ifr & 0x01) && !m_dma_scsi_a_in_step) + dma_scsi_a_step(); +} + +uint32_t macpdm_state::dma_scsi_a_base_adr_r() +{ + return m_dma_scsi_a_base_adr; +} + +void macpdm_state::dma_scsi_a_base_adr_w(offs_t, uint32_t data, uint32_t mem_mask) +{ + COMBINE_DATA(&m_dma_scsi_a_base_adr); + m_dma_scsi_a_base_adr &= ~7; + m_dma_scsi_a_cur_offset = 0; + m_dma_scsi_buffer_byte_count = 0; + logerror("dma_scsi_a_base_adr_w %08x\n", m_dma_scsi_a_base_adr); +} + +uint32_t macpdm_state::dma_scsi_b_base_adr_r() +{ + return m_dma_scsi_b_base_adr; +} + +void macpdm_state::dma_scsi_b_base_adr_w(offs_t, uint32_t data, uint32_t mem_mask) +{ + COMBINE_DATA(&m_dma_scsi_b_base_adr); + m_dma_scsi_b_base_adr &= ~7; + m_dma_scsi_a_cur_offset = 0; + logerror("dma_scsi_b_base_adr_w %08x\n", m_dma_scsi_b_base_adr); +} + +uint8_t macpdm_state::dma_scsi_a_ctrl_r() +{ + return m_dma_scsi_a_ctrl; +} + +void macpdm_state::dma_scsi_a_ctrl_w(uint8_t data) +{ + m_dma_scsi_a_ctrl = data & 0x42; + if(data & 1) { + m_dma_scsi_a_ctrl &= 0x40; + m_dma_scsi_a_cur_offset = 0; + m_dma_scsi_buffer_byte_count = 0; + } + if(data & 0x10) { + while(m_via2_ifr & 0x01) { + uint8_t b = m_ncr53c94->dma_r(); + m_dma_scsi_buffer = (m_dma_scsi_buffer & ~(u64(0xff) << (56 - 8*m_dma_scsi_buffer_byte_count))) | (u64(b) << (56 - 8*m_dma_scsi_buffer_byte_count)); + m_dma_scsi_buffer_byte_count ++; + if(m_dma_scsi_buffer_byte_count == 8) { + m_dma_scsi_buffer_byte_count = 0; + m_maincpu->space().write_qword(m_dma_scsi_a_base_adr + m_dma_scsi_a_cur_offset, m_dma_scsi_buffer); + m_dma_scsi_a_cur_offset += 8; + } + } + if(m_dma_scsi_buffer_byte_count) { + m_maincpu->space().write_qword(m_dma_scsi_a_base_adr + m_dma_scsi_a_cur_offset, m_dma_scsi_buffer); + m_dma_scsi_buffer_byte_count = 0; + } + } + + if((m_dma_scsi_a_ctrl & 0x02) && (m_via2_ifr & 0x01) && !m_dma_scsi_a_in_step) + dma_scsi_a_step(); + + logerror("dma_scsi_a_ctrl_w %02x\n", m_dma_scsi_a_ctrl); +} + +uint8_t macpdm_state::dma_scsi_b_ctrl_r() +{ + return m_dma_scsi_b_ctrl; +} + +void macpdm_state::dma_scsi_b_ctrl_w(uint8_t data) +{ + // Channel B is not actually connected to anything + m_dma_scsi_b_ctrl = data & 0x42; + if(data & 1) { + m_dma_scsi_b_ctrl &= 0x40; + m_dma_scsi_b_cur_offset = 0; + } + logerror("dma_scsi_b_ctrl_w %02x\n", m_dma_scsi_b_ctrl); +} + +uint32_t macpdm_state::dma_scsi_a_cur_adr_r() +{ + return m_dma_scsi_a_base_adr + m_dma_scsi_a_cur_offset; +} + +uint32_t macpdm_state::dma_scsi_b_cur_adr_r() +{ + return m_dma_scsi_b_base_adr + m_dma_scsi_b_cur_offset; +} + + +// Floppy management uint8_t macpdm_state::dma_floppy_ctrl_r() { @@ -629,6 +850,8 @@ void macpdm_state::dma_floppy_adr_w(offs_t, uint32_t data, uint32_t mem_mask) } +// SCC management + uint8_t macpdm_state::dma_scc_txa_ctrl_r() { return m_dma_scc_txa_ctrl; @@ -706,16 +929,18 @@ void macpdm_state::pdm_map(address_map &map) // 50f08000 = ethernet ID PROM // 50f0a000 = MACE ethernet controller map(0x50f10000, 0x50f10000).rw(FUNC(macpdm_state::scsi_r), FUNC(macpdm_state::scsi_w)).select(0xf0); + map(0x50f10100, 0x50f10101).r(m_ncr53c94, FUNC(ncr53c94_device::dma16_r)); + // 50f14000 = sound registers (AWACS) map(0x50f14000, 0x50f1401f).rw(m_awacs, FUNC(awacs_device::read), FUNC(awacs_device::write)); map(0x50f16000, 0x50f16000).rw(FUNC(macpdm_state::fdc_r), FUNC(macpdm_state::fdc_w)).select(0x1e00); map(0x50f24000, 0x50f24003).w(m_video, FUNC(mac_video_sonora_device::dac_w)); - map(0x50f26002, 0x50f26002).rw(FUNC(macpdm_state::via2_sifr_r), FUNC(macpdm_state::via2_sifr_w)); - map(0x50f26003, 0x50f26003).r(FUNC(macpdm_state::via2_ifr_r)); - map(0x50f26012, 0x50f26012).rw(FUNC(macpdm_state::via2_sier_r), FUNC(macpdm_state::via2_sier_w)); - map(0x50f26013, 0x50f26013).rw(FUNC(macpdm_state::via2_ier_r), FUNC(macpdm_state::via2_ier_w)); + map(0x50f26002, 0x50f26002).rw(FUNC(macpdm_state::via2_sifr_r), FUNC(macpdm_state::via2_sifr_w)).mirror(0x1fe0); + map(0x50f26003, 0x50f26003).r(FUNC(macpdm_state::via2_ifr_r)).mirror(0x1fe0); + map(0x50f26012, 0x50f26012).rw(FUNC(macpdm_state::via2_sier_r), FUNC(macpdm_state::via2_sier_w)).mirror(0x1fe0); + map(0x50f26013, 0x50f26013).rw(FUNC(macpdm_state::via2_ier_r), FUNC(macpdm_state::via2_ier_w)).mirror(0x1fe0); map(0x50f28000, 0x50f28007).rw(m_video, FUNC(mac_video_sonora_device::vctrl_r), FUNC(mac_video_sonora_device::vctrl_w)); @@ -725,10 +950,19 @@ void macpdm_state::pdm_map(address_map &map) map(0x50f31000, 0x50f31003).rw(FUNC(macpdm_state::dma_badr_r), FUNC(macpdm_state::dma_badr_w)); map(0x50f31c20, 0x50f31c20).rw(FUNC(macpdm_state::dma_enet_tx_ctrl_r), FUNC(macpdm_state::dma_enet_tx_ctrl_w)); - map(0x50f32008, 0x50f32008).rw(FUNC(macpdm_state::dma_scsi_ctrl_r), FUNC(macpdm_state::dma_scsi_ctrl_w)); + + map(0x50f32000, 0x50f32003).rw(FUNC(macpdm_state::dma_scsi_a_base_adr_r), FUNC(macpdm_state::dma_scsi_a_base_adr_w)); + map(0x50f32004, 0x50f32007).rw(FUNC(macpdm_state::dma_scsi_b_base_adr_r), FUNC(macpdm_state::dma_scsi_b_base_adr_w)); + map(0x50f32008, 0x50f32008).rw(FUNC(macpdm_state::dma_scsi_a_ctrl_r), FUNC(macpdm_state::dma_scsi_a_ctrl_w)); + map(0x50f32009, 0x50f32009).rw(FUNC(macpdm_state::dma_scsi_b_ctrl_r), FUNC(macpdm_state::dma_scsi_b_ctrl_w)); + map(0x50f32010, 0x50f32013).r(FUNC(macpdm_state::dma_scsi_a_cur_adr_r)); + map(0x50f32014, 0x50f32017).r(FUNC(macpdm_state::dma_scsi_b_cur_adr_r)); + map(0x50f32028, 0x50f32028).rw(FUNC(macpdm_state::dma_enet_rx_ctrl_r), FUNC(macpdm_state::dma_enet_rx_ctrl_w)); + map(0x50f32060, 0x50f32063).rw(FUNC(macpdm_state::dma_floppy_adr_r), FUNC(macpdm_state::dma_floppy_adr_w)); map(0x50f32068, 0x50f32068).rw(FUNC(macpdm_state::dma_floppy_ctrl_r), FUNC(macpdm_state::dma_floppy_ctrl_w)); + map(0x50f32088, 0x50f32088).rw(FUNC(macpdm_state::dma_scc_txa_ctrl_r), FUNC(macpdm_state::dma_scc_txa_ctrl_w)); map(0x50f32098, 0x50f32098).rw(FUNC(macpdm_state::dma_scc_rxa_ctrl_r), FUNC(macpdm_state::dma_scc_rxa_ctrl_w)); map(0x50f320a8, 0x50f320a8).rw(FUNC(macpdm_state::dma_scc_txb_ctrl_r), FUNC(macpdm_state::dma_scc_txb_ctrl_w)); @@ -756,12 +990,20 @@ void macpdm_state::macpdm(machine_config &config) m_awacs->add_route(0, "lspeaker", 1.0); m_awacs->add_route(1, "rspeaker", 1.0); - scsi_port_device &scsibus(SCSI_PORT(config, "scsi")); - scsibus.set_slot_device(1, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_6)); - scsibus.set_slot_device(2, "harddisk", SCSIHD, DEVICE_INPUT_DEFAULTS_NAME(SCSI_ID_5)); - - NCR5380(config, m_ncr5380, ENET_CLOCK/2); - m_ncr5380->set_scsi_port("scsi"); + NSCSI_BUS(config, m_scsibus); + NSCSI_CONNECTOR(config, "scsibus:0", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsibus:1", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsibus:2", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsibus:3", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsibus:4", default_scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsibus:5", default_scsi_devices, "harddisk"); + NSCSI_CONNECTOR(config, "scsibus:6", default_scsi_devices, "harddisk"); + NSCSI_CONNECTOR(config, "scsibus:7").option_set("ncr53c94", NCR53C94).machine_config([this] (device_t *device) { + auto &ctrl = downcast(*device); + ctrl.set_clock(ENET_CLOCK/2); + ctrl.drq_handler_cb().set(*this, FUNC(macpdm_state::scsi_drq)); + ctrl.irq_handler_cb().set(*this, FUNC(macpdm_state::scsi_irq)); + }); SOFTWARE_LIST(config, "hdd_list").set_original("mac_hdd"); -- cgit v1.2.3