From df96c0e94420deb0cd7811ff31bcab1275dcb2e0 Mon Sep 17 00:00:00 2001 From: MetalliC <0vetal0@gmail.com> Date: Mon, 10 Aug 2020 22:49:15 +0300 Subject: [PATCH] midwunit.cpp hook security PICs --- src/mame/drivers/midwunit.cpp | 7 +--- src/mame/machine/midwayic.cpp | 65 ++++++++++++++++++++++------------- src/mame/machine/midwayic.h | 20 +++++++---- src/mame/machine/midwunit.cpp | 4 +++ 4 files changed, 61 insertions(+), 35 deletions(-) diff --git a/src/mame/drivers/midwunit.cpp b/src/mame/drivers/midwunit.cpp index 1f7cbed2a9b..ff7cabab5b8 100644 --- a/src/mame/drivers/midwunit.cpp +++ b/src/mame/drivers/midwunit.cpp @@ -656,18 +656,13 @@ void midwunit_state::wunit_picsim(machine_config &config) { wunit(config); MIDWAY_SERIAL_PIC(config, m_midway_serial_pic, 0); - m_midway_serial_pic->set_upper(528); // this is actually a generic code all games check for in addition to their own game specific code! + m_midway_serial_pic->set_upper(528); // this is actually development PIC code, all games check for in addition to their own game specific code! } void midwunit_state::wunit_picemu(machine_config &config) { wunit(config); MIDWAY_SERIAL_PIC_EMU(config, m_midway_serial_pic_emu, 0); - - // todo, REMOVE once the emulated PIC above works! - // this just allows it to fall through to the simulation for now - MIDWAY_SERIAL_PIC(config, m_midway_serial_pic, 0); - m_midway_serial_pic->set_upper(528); } diff --git a/src/mame/machine/midwayic.cpp b/src/mame/machine/midwayic.cpp index 44d252131c0..ca7ed1c31cb 100644 --- a/src/mame/machine/midwayic.cpp +++ b/src/mame/machine/midwayic.cpp @@ -222,6 +222,14 @@ void midway_serial_pic_device::write(u8 data) * Original serial number PIC * interface - emulation * + * PIC16C57 wiring notes: + * PORTA - 4bit command in (usually 0 = read SN#) + * PORTB - 8bit data out + * PORTC bit 7 - access clock in + * PORTC bit 6 - status out + * PORTC bit 2 - in/out, unknown + * PORTC bit 1 - out, unknown + * *************************************/ @@ -234,6 +242,7 @@ DEFINE_DEVICE_TYPE(MIDWAY_SERIAL_PIC_EMU, midway_serial_pic_emu_device, "midway_ midway_serial_pic_emu_device::midway_serial_pic_emu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, MIDWAY_SERIAL_PIC_EMU, tag, owner, clock) + , m_pic(*this, "pic") { } @@ -243,52 +252,62 @@ midway_serial_pic_emu_device::midway_serial_pic_emu_device(const machine_config void midway_serial_pic_emu_device::device_start() { + save_item(NAME(m_command)); + save_item(NAME(m_data_out)); + save_item(NAME(m_clk)); + save_item(NAME(m_status)); + + m_command = 0; + m_data_out = 0; + m_clk = 0; + m_status = 0; } - -uint8_t midway_serial_pic_emu_device::read_a() +WRITE_LINE_MEMBER(midway_serial_pic_emu_device::reset_w) { -// printf("%s: read_a\n", machine().describe_context().c_str()); - return 0x00; + if (!state) // fixme, PIC should be stopped while 0 and start running at 0->1 transition + m_pic->reset(); } -uint8_t midway_serial_pic_emu_device::read_b() +u8 midway_serial_pic_emu_device::status_r() { -// printf("%s: read_b\n", machine().describe_context().c_str()); - return 0x00; + return m_status; } -uint8_t midway_serial_pic_emu_device::read_c() +u8 midway_serial_pic_emu_device::read() { -// used -// printf("%s: read_c\n", machine().describe_context().c_str()); - return 0x00; + return m_data_out; } -void midway_serial_pic_emu_device::write_a(uint8_t data) +void midway_serial_pic_emu_device::write(u8 data) { -// printf("%s: write_a %02x\n", machine().describe_context().c_str(), data); + // perhaps this should be split in 2 handlers ? + m_command = data & 0x0f; + m_clk = BIT(data, 4); } -void midway_serial_pic_emu_device::write_b(uint8_t data) +u8 midway_serial_pic_emu_device::read_c() { -// printf("%s: write_b %02x\n", machine().describe_context().c_str(), data); + u8 data = 0; + data |= m_clk << 7; + // bit 2 function is not known + return data; } -void midway_serial_pic_emu_device::write_c(uint8_t data) +void midway_serial_pic_emu_device::write_c(u8 data) { -// used + m_status = BIT(data, 6); + // function of bits 1 and 2 is not known // printf("%s: write_c %02x\n", machine().describe_context().c_str(), data); } void midway_serial_pic_emu_device::device_add_mconfig(machine_config &config) { - pic16c57_device &pic(PIC16C57(config, "pic", 12000000)); /* ? Mhz */ - pic.write_a().set(FUNC(midway_serial_pic_emu_device::write_a)); - pic.read_b().set(FUNC(midway_serial_pic_emu_device::read_b)); - pic.write_b().set(FUNC(midway_serial_pic_emu_device::write_b)); - pic.read_c().set(FUNC(midway_serial_pic_emu_device::read_c)); - pic.write_c().set(FUNC(midway_serial_pic_emu_device::write_c)); + PIC16C57(config, m_pic, 4000000); /* ? Mhz */ + m_pic->read_a().set([this]() { return m_command; }); + m_pic->write_b().set([this](u8 data) { m_data_out = data; }); + m_pic->read_c().set(FUNC(midway_serial_pic_emu_device::read_c)); + m_pic->write_c().set(FUNC(midway_serial_pic_emu_device::write_c)); } diff --git a/src/mame/machine/midwayic.h b/src/mame/machine/midwayic.h index 98148a85cd4..e231bdd5674 100644 --- a/src/mame/machine/midwayic.h +++ b/src/mame/machine/midwayic.h @@ -66,6 +66,11 @@ public: // construction/destruction midway_serial_pic_emu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + u8 read(); + void write(u8 data); + u8 status_r(); + DECLARE_WRITE_LINE_MEMBER(reset_w); + protected: midway_serial_pic_emu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); @@ -74,12 +79,15 @@ protected: virtual void device_start() override; private: - uint8_t read_a(); - uint8_t read_b(); - uint8_t read_c(); - void write_a(uint8_t data); - void write_b(uint8_t data); - void write_c(uint8_t data); + required_device m_pic; + + u8 read_c(); + void write_c(u8 data); + + u8 m_command; + u8 m_data_out; + u8 m_clk; + u8 m_status; }; diff --git a/src/mame/machine/midwunit.cpp b/src/mame/machine/midwunit.cpp index 261bf1956d1..7cdbc9adda1 100644 --- a/src/mame/machine/midwunit.cpp +++ b/src/mame/machine/midwunit.cpp @@ -82,6 +82,7 @@ void midwunit_state::midwunit_io_w(offs_t offset, uint16_t data, uint16_t mem_ma /* bit 5 (active low) reset security chip */ if (m_midway_serial_pic) m_midway_serial_pic->reset_w(newword & 0x20); + if (m_midway_serial_pic_emu) m_midway_serial_pic_emu->reset_w(newword & 0x20); break; case 3: @@ -122,6 +123,7 @@ uint16_t midwunit_state::midwunit_io_r(offs_t offset) { int picret = 0; if (m_midway_serial_pic) picret = m_midway_serial_pic->status_r(); + if (m_midway_serial_pic_emu) picret = m_midway_serial_pic_emu->status_r(); return (picret << 12) | midwunit_sound_state_r(); } @@ -340,6 +342,7 @@ uint16_t midwunit_state::midwunit_security_r() { uint16_t picret = 0; if (m_midway_serial_pic) picret = m_midway_serial_pic->read(); + if (m_midway_serial_pic_emu) picret = m_midway_serial_pic_emu->read(); return picret; } @@ -349,6 +352,7 @@ void midwunit_state::midwunit_security_w(offs_t offset, uint16_t data, uint16_t if (offset == 0 && ACCESSING_BITS_0_7) { if (m_midway_serial_pic) m_midway_serial_pic->write(data); + if (m_midway_serial_pic_emu) m_midway_serial_pic_emu->write(data); } }