From c770602d4119fd4153915fd9f099babd96c1b95f Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Thu, 27 Jun 2019 23:05:06 +0200 Subject: ncd16: Make bert qlc mode work, the terminal boots [O. Galibert] --- src/mame/drivers/ncd68k.cpp | 16 +++++++++++++++- src/mame/machine/bert.cpp | 22 +++++++++++++++++++++- src/mame/machine/bert.h | 3 +++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/ncd68k.cpp b/src/mame/drivers/ncd68k.cpp index 7ca0ed06f55..617832bc373 100644 --- a/src/mame/drivers/ncd68k.cpp +++ b/src/mame/drivers/ncd68k.cpp @@ -40,7 +40,7 @@ /* * WIP status - * - ncd16 QLC/BERT test failures, boots from prom, crc error booting from network + * - ncd16 boots from prom, crc error booting from network * - ncd17c nvram timeout or checksum failure * - ncd19 loads server from network, then hangs * @@ -503,6 +503,20 @@ void ncd16_state::configure(machine_config &config) BERT(config, m_bert, 0).set_memory(m_maincpu, AS_PROGRAM); common(config); + + m_duart->outport_cb().set( + [this](u8 data) + { + m_serial[0]->write_rts(BIT(data, 0)); + m_serial[1]->write_rts(BIT(data, 1)); + m_serial[0]->write_dtr(BIT(data, 2)); + m_serial[1]->write_dtr(BIT(data, 3)); + m_bert->set_qlc_mode(BIT(data, 5)); + + // TODO: bit 4 - usually set + // TODO: bit 6 - usually set + // TODO: bit 7 - set/cleared continuously + }); } void ncd17c_state::configure(machine_config &config) diff --git a/src/mame/machine/bert.cpp b/src/mame/machine/bert.cpp index 9aca9bfb267..4311a861e65 100644 --- a/src/mame/machine/bert.cpp +++ b/src/mame/machine/bert.cpp @@ -25,7 +25,8 @@ void bert_device::device_start() save_item(NAME(m_control)); save_item(NAME(m_history)); save_item(NAME(m_step)); - + save_item(NAME(m_qlc_mode)); + save_item(NAME(m_qlc_src)); m_memory = m_memory_space->cache<1, 0, ENDIANNESS_BIG>(); } @@ -34,6 +35,8 @@ void bert_device::device_reset() m_control = 0; m_history = 0; m_step = 0; + m_qlc_mode = false; + m_qlc_src = 0; } void bert_device::map(address_map &map) @@ -41,8 +44,18 @@ void bert_device::map(address_map &map) map(0x000000, 0x7fffff).rw(FUNC(bert_device::read), FUNC(bert_device::write)); } +void bert_device::set_qlc_mode(bool state) +{ + m_qlc_mode = state; +} + u16 bert_device::read(offs_t offset) { + if(m_qlc_mode) { + m_qlc_src = offset << 1; + return 0; + } + constexpr u16 type = 0x00ca; u16 data = m_memory->read_word(offset << 1); u16 res; @@ -66,6 +79,13 @@ u16 bert_device::read(offs_t offset) void bert_device::write(offs_t offset, u16 data, u16 mem_mask) { + if(m_qlc_mode) { + u32 dest = offset << 1; + for(u32 i=0; i<512; i+=2) + m_memory->write_word(dest + i, m_memory->read_word(m_qlc_src + i)); + return; + } + m_step = 0; m_memory->write_word(offset << 1, data, mem_mask); if(!offset) { diff --git a/src/mame/machine/bert.h b/src/mame/machine/bert.h index 58c67ec5e1e..628e8e8753e 100644 --- a/src/mame/machine/bert.h +++ b/src/mame/machine/bert.h @@ -15,6 +15,7 @@ public: bert_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); void map(address_map &map); + void set_qlc_mode(bool state); protected: virtual void device_start() override; @@ -30,6 +31,8 @@ private: u16 m_control; u16 m_history; u32 m_step; + bool m_qlc_mode; + u32 m_qlc_src; }; DECLARE_DEVICE_TYPE(BERT, bert_device) -- cgit v1.2.3