summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/macpdm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/macpdm.cpp')
-rw-r--r--src/mame/drivers/macpdm.cpp328
1 files 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<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");