summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <lordkale4@gmail.com>2025-11-14 00:45:05 +0100
committer angelosa <lordkale4@gmail.com>2025-11-14 00:45:47 +0100
commit568ccef8fab8488d6e8d272be3e940cf38bb8a90 (patch)
treec3e72364177980af360dba9f94e8932283c80965
parentc6b3a14b5c73c2437ecb049a703780df9810356e (diff)
bus/pc98_cbus: basic DMA support for pc9801-55
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_55.cpp43
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_55.h4
-rw-r--r--src/devices/bus/pc98_cbus/slot.cpp32
-rw-r--r--src/devices/bus/pc98_cbus/slot.h16
-rw-r--r--src/mame/nec/pc9801.cpp4
5 files changed, 84 insertions, 15 deletions
diff --git a/src/devices/bus/pc98_cbus/pc9801_55.cpp b/src/devices/bus/pc98_cbus/pc9801_55.cpp
index 0cb42d5fd01..79f8cae1d18 100644
--- a/src/devices/bus/pc98_cbus/pc9801_55.cpp
+++ b/src/devices/bus/pc98_cbus/pc9801_55.cpp
@@ -10,7 +10,12 @@ HDDs apparently needs to be with 8 heads and 25 cylinders only
https://www7b.biglobe.ne.jp/~drachen6jp/98scsi.html
TODO:
-- Requires C-Bus root implementation for DMA DACK to work;
+- hangs on wdc core with a Negate ACK command when not initiator;
+- Wants to read "NEC" around PC=dc632, currently reads " SE" (from nscsi/hd.cpp " SEAGATE" inquiry)
+- Wants specifically -ss 256 in chdman;
+- Throws Unhandled command LOCATE/POSITION_TO_ELEMENT/SEEK_10 (10): 2b 00 ff ff ff ff 00 00 00 00
+ (non fatal?)
+- Manages to install msdos622 after all above but doesn't mark HDD as bootable (?);
- PC-9801-55 also runs on this except with vanilla WD33C93 instead;
**************************************************************************************************/
@@ -80,20 +85,24 @@ void pc9801_55_device::scsi_irq_w(int state)
void pc9801_55_device::scsi_drq_w(int state)
{
- // TODO: needs a C-Bus root
-// m_bus->drq_w(0, state);
+ m_bus->drq_w(0, state);
}
-//u8 pc9801_55_device::dma_r()
-//{
-// return m_wdc->dma_r();
-//}
-//
-//void pc9801_55_device::dma_w(u8 data)
-//{
-// m_wdc->dma_w(data);
-//}
+u8 pc9801_55_device::dack_r(int line)
+{
+ //if (!m_dma_enable)
+ // return 0xff;
+ const u8 res = m_wdc->dma_r();
+ return res;
+}
+void pc9801_55_device::dack_w(int line, u8 data)
+{
+ //if (!m_dma_enable)
+ // return;
+
+ m_wdc->dma_w(data);
+}
void pc9801_55_device::device_add_mconfig(machine_config &config)
{
@@ -190,6 +199,8 @@ void pc9801_55_device::device_start()
save_item(NAME(m_rom_bank));
save_item(NAME(m_pkg_id));
save_item(NAME(m_dma_enable));
+
+ m_bus->set_dma_channel(0, this, false);
}
@@ -232,10 +243,16 @@ void pc9801_55_device::io_map(address_map &map)
);
map(0x0cc2, 0x0cc2).lrw8(
NAME([this] (offs_t offset) {
+ //const u8 reg = m_ar;
+ //if (m_ar <= 0x19)
+ // m_ar ++;
+
return space(0).read_byte(m_ar);
}),
NAME([this] (offs_t offset, u8 data) {
space(0).write_byte(m_ar, data);
+ //if (m_ar <= 0x19)
+ // m_ar ++;
})
);
map(0x0cc4, 0x0cc4).lrw8(
@@ -313,3 +330,5 @@ void pc9801_55_device::internal_map(address_map &map)
})
);
}
+
+
diff --git a/src/devices/bus/pc98_cbus/pc9801_55.h b/src/devices/bus/pc98_cbus/pc9801_55.h
index f7c23c44eea..62fc78fae8f 100644
--- a/src/devices/bus/pc98_cbus/pc9801_55.h
+++ b/src/devices/bus/pc98_cbus/pc9801_55.h
@@ -31,7 +31,7 @@ public:
//pc9801_55_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
pc9801_55_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
- static constexpr feature_type unemulated_features() { return feature::DISK; }
+ static constexpr feature_type unemulated_features() { return feature::DISK | feature::PROTECTION; }
void scsi_irq_w(int state);
void scsi_drq_w(int state);
@@ -47,6 +47,8 @@ protected:
virtual ioport_constructor device_input_ports() const override ATTR_COLD;
virtual space_config_vector memory_space_config() const override;
virtual void remap(int space_id, offs_t start, offs_t end) override;
+ virtual uint8_t dack_r(int line) override;
+ virtual void dack_w(int line, uint8_t data) override;
private:
required_device<nscsi_bus_device> m_scsi_bus;
diff --git a/src/devices/bus/pc98_cbus/slot.cpp b/src/devices/bus/pc98_cbus/slot.cpp
index 69cc17453f0..22480d9d1ae 100644
--- a/src/devices/bus/pc98_cbus/slot.cpp
+++ b/src/devices/bus/pc98_cbus/slot.cpp
@@ -46,7 +46,10 @@ pc98_cbus_root_device::pc98_cbus_root_device(const machine_config &mconfig, cons
, m_space_mem_config("mem_space", ENDIANNESS_LITTLE, 16, 24, 0, address_map_constructor())
, m_space_io_config("io_space", ENDIANNESS_LITTLE, 16, 16, 0, address_map_constructor())
, m_int_cb(*this)
+ , m_drq_cb(*this)
{
+ std::fill(std::begin(m_dma_device), std::end(m_dma_device), nullptr);
+ std::fill(std::begin(m_dma_eop), std::end(m_dma_eop), false);
}
device_memory_interface::space_config_vector pc98_cbus_root_device::memory_space_config() const
@@ -80,7 +83,6 @@ void pc98_cbus_root_device::device_config_complete()
void pc98_cbus_root_device::add_slot(const char *tag)
{
device_t *dev = subdevice(tag);
- //printf(tag);
add_slot(dynamic_cast<device_slot_interface *>(dev));
}
@@ -134,6 +136,24 @@ void pc98_cbus_root_device::io_w(offs_t offset, u16 data, u16 mem_mask)
space(AS_IO).write_word(offset << 1, data, mem_mask);
}
+uint8_t pc98_cbus_root_device::dack_r(int line)
+{
+ if (m_dma_device[line])
+ return m_dma_device[line]->dack_r(line);
+ return 0xff;
+}
+
+void pc98_cbus_root_device::dack_w(int line, uint8_t data)
+{
+ if (m_dma_device[line])
+ m_dma_device[line]->dack_w(line, data);
+}
+
+void pc98_cbus_root_device::set_dma_channel(uint8_t channel, device_pc98_cbus_slot_interface *dev, bool do_eop)
+{
+ m_dma_device[channel] = dev;
+ m_dma_eop[channel] = do_eop;
+}
//**************************************************************************
@@ -149,6 +169,16 @@ device_pc98_cbus_slot_interface::~device_pc98_cbus_slot_interface()
{
}
+uint8_t device_pc98_cbus_slot_interface::dack_r(int line)
+{
+ return 0;
+}
+
+void device_pc98_cbus_slot_interface::dack_w(int line, uint8_t data)
+{
+}
+
+
pc98_cbus_slot_device::pc98_cbus_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
pc98_cbus_slot_device(mconfig, PC98_CBUS_SLOT, tag, owner, clock)
{
diff --git a/src/devices/bus/pc98_cbus/slot.h b/src/devices/bus/pc98_cbus/slot.h
index 11995668b1d..17873cd49d6 100644
--- a/src/devices/bus/pc98_cbus/slot.h
+++ b/src/devices/bus/pc98_cbus/slot.h
@@ -69,6 +69,7 @@
// TYPE DEFINITIONS
//**************************************************************************
+class device_pc98_cbus_slot_interface;
class pc98_cbus_root_device : public device_t,
public device_memory_interface
@@ -94,9 +95,16 @@ public:
// from C-bus to host
template<std::size_t Line> auto int_cb() { return m_int_cb[Line].bind(); }
+ template<std::size_t Line> auto drq_cb() { return m_drq_cb[Line].bind(); }
+
+ uint8_t dack_r(int line);
+ void dack_w(int line, uint8_t data);
// from card to C-Bus
void int_w(int Line, int state) { m_int_cb[Line](state); }
+ void drq_w(int Line, int state) { m_drq_cb[Line](state); }
+
+ void set_dma_channel(uint8_t channel, device_pc98_cbus_slot_interface *dev, bool do_eop);
protected:
virtual space_config_vector memory_space_config() const override;
@@ -111,7 +119,11 @@ private:
address_space_config m_space_io_config;
devcb_write_line::array<7> m_int_cb;
-// devcb_write_line::array<4> m_drq_cb;
+ devcb_write_line::array<4> m_drq_cb;
+
+ device_pc98_cbus_slot_interface *m_dma_device[8];
+ bool m_dma_eop[8];
+
};
@@ -123,6 +135,8 @@ public:
virtual ~device_pc98_cbus_slot_interface();
virtual void remap(int space_id, offs_t start, offs_t end) {}
+ virtual uint8_t dack_r(int line);
+ virtual void dack_w(int line, uint8_t data);
void set_bus(pc98_cbus_root_device *cbus_device) { m_bus = cbus_device; }
diff --git a/src/mame/nec/pc9801.cpp b/src/mame/nec/pc9801.cpp
index 11da7215185..8c52ff5bb27 100644
--- a/src/mame/nec/pc9801.cpp
+++ b/src/mame/nec/pc9801.cpp
@@ -2016,6 +2016,7 @@ void pc9801_state::pc9801_cbus(machine_config &config)
m_cbus_root->int_cb<4>().set("pic8259_slave", FUNC(pic8259_device::ir3_w));
m_cbus_root->int_cb<5>().set("pic8259_slave", FUNC(pic8259_device::ir4_w));
m_cbus_root->int_cb<6>().set("pic8259_slave", FUNC(pic8259_device::ir5_w));
+ m_cbus_root->drq_cb<0>().set(m_dmac, FUNC(am9517a_device::dreq0_w)).invert();
}
void pc9801_state::pc9801_sasi(machine_config &config)
@@ -2094,6 +2095,9 @@ void pc9801_state::pc9801_common(machine_config &config)
m_dmac->out_eop_callback().set(FUNC(pc9801_state::tc_w));
m_dmac->in_memr_callback().set(FUNC(pc9801_state::dma_read_byte));
m_dmac->out_memw_callback().set(FUNC(pc9801_state::dma_write_byte));
+ m_dmac->in_ior_callback<0>().set([this] () { return m_cbus_root->dack_r(0); });
+ m_dmac->out_iow_callback<0>().set([this] (u8 data) { return m_cbus_root->dack_w(0, data); });
+
m_dmac->in_ior_callback<2>().set(m_fdc_2hd, FUNC(upd765a_device::dma_r));
m_dmac->out_iow_callback<2>().set(m_fdc_2hd, FUNC(upd765a_device::dma_w));
m_dmac->out_dack_callback<0>().set(FUNC(pc9801_state::dack0_w));