diff options
| author | 2025-11-14 00:45:05 +0100 | |
|---|---|---|
| committer | 2025-11-14 00:45:47 +0100 | |
| commit | 568ccef8fab8488d6e8d272be3e940cf38bb8a90 (patch) | |
| tree | c3e72364177980af360dba9f94e8932283c80965 | |
| parent | c6b3a14b5c73c2437ecb049a703780df9810356e (diff) | |
bus/pc98_cbus: basic DMA support for pc9801-55
| -rw-r--r-- | src/devices/bus/pc98_cbus/pc9801_55.cpp | 43 | ||||
| -rw-r--r-- | src/devices/bus/pc98_cbus/pc9801_55.h | 4 | ||||
| -rw-r--r-- | src/devices/bus/pc98_cbus/slot.cpp | 32 | ||||
| -rw-r--r-- | src/devices/bus/pc98_cbus/slot.h | 16 | ||||
| -rw-r--r-- | src/mame/nec/pc9801.cpp | 4 |
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)); |
