pmac6100: Connect SCSI

This commit is contained in:
Olivier Galibert 2021-03-16 21:00:03 +01:00
parent 516b085368
commit 6ea142efb8

View File

@ -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<macadb_device> m_macadb;
required_device<ram_device> m_ram;
required_device<scc8530_legacy_device> m_scc;
required_device<ncr5380_device> m_ncr5380;
required_device<nscsi_bus_device> m_scsibus;
required_device<ncr53c94_device> m_ncr53c94;
required_device<applefdintf_device> m_fdc;
required_device_array<floppy_connector, 2> m_floppy;
required_device<mac_video_sonora_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<ncr53c94_device &>(*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");