diff --git a/src/mame/drivers/midxunit.cpp b/src/mame/drivers/midxunit.cpp index 9194d3f793e..023c6f4c4ea 100644 --- a/src/mame/drivers/midxunit.cpp +++ b/src/mame/drivers/midxunit.cpp @@ -292,9 +292,12 @@ void midxunit_state::midxunit(machine_config &config) screen.set_screen_update("maincpu", FUNC(tms34010_device::tms340x0_ind16)); screen.set_palette(m_palette); - MIDWAY_SERIAL_PIC(config, m_midway_serial_pic, 0); - /* serial prefixes 419, 420 */ - m_midway_serial_pic->set_upper(419); + PIC16C57(config, m_pic, 625000); // need to be verified + m_pic->read_a().set([this]() { return m_pic_command; }); + m_pic->write_b().set([this](u8 data) { m_pic_data = data; }); + m_pic->read_c().set([this]() { return m_pic_clk ^ 1; }); + m_pic->write_c().set([this](u8 data) { m_pic_status = BIT(data, 1); }); + // there also should be PIC16 reset line control, unknown at the moment adc0848_device &adc(ADC0848(config, "adc")); adc.intr_callback().set(FUNC(midxunit_state::adc_int_w)); // ADC INT passed through PLSI1032 @@ -335,7 +338,7 @@ ROM_START( revx ) ROM_LOAD32_BYTE( "revx.54", 0x00003, 0x80000, CRC(24471269) SHA1(262345bd147402100785459af422dafd1c562787) ) ROM_REGION( 0x2000, "pic", 0 ) - ROM_LOAD( "revx_16c57.bin", 0x0000000, 0x2000, BAD_DUMP CRC(eb8a8649) SHA1(a1e1d0b7a5e9802e8f889eb7e719259656dc8133) ) // garbage, useless + ROM_LOAD( "revx_16c57.bin", 0x0000000, 0x2000, BAD_DUMP CRC(517e0110) SHA1(cd603c66794ff426dd2994fc1a0c0c8e6bbd864b) ) // manually restored ROM_REGION( 0x1000000, "gfxrom", 0 ) ROM_LOAD32_BYTE( "revx.120", 0x0000000, 0x80000, CRC(523af1f0) SHA1(a67c0fd757e860fc1c1236945952a295b4d5df5a) ) @@ -402,7 +405,7 @@ ROM_START( revxp5 ) ROM_LOAD32_BYTE( "revx_p5.54", 0x00003, 0x80000, CRC(fd684c31) SHA1(db3453792e4d9fc375297d030f0b3f9cc3cad925) ) ROM_REGION( 0x2000, "pic", 0 ) - ROM_LOAD( "revx_16c57.bin", 0x0000000, 0x2000, BAD_DUMP CRC(eb8a8649) SHA1(a1e1d0b7a5e9802e8f889eb7e719259656dc8133) ) // garbage, useless + ROM_LOAD( "revx_16c57.bin", 0x0000000, 0x2000, BAD_DUMP CRC(517e0110) SHA1(cd603c66794ff426dd2994fc1a0c0c8e6bbd864b) ) // manually restored ROM_REGION( 0x1000000, "gfxrom", 0 ) ROM_LOAD32_BYTE( "revx.120", 0x0000000, 0x80000, CRC(523af1f0) SHA1(a67c0fd757e860fc1c1236945952a295b4d5df5a) ) diff --git a/src/mame/includes/midxunit.h b/src/mame/includes/midxunit.h index 0b3929cbe3d..ea70966c5ea 100644 --- a/src/mame/includes/midxunit.h +++ b/src/mame/includes/midxunit.h @@ -12,7 +12,7 @@ #include "audio/dcs.h" #include "cpu/tms34010/tms34010.h" -#include "machine/midwayic.h" +#include "cpu/pic16c5x/pic16c5x.h" #include "machine/nvram.h" #include "video/midtunit.h" #include "emupal.h" @@ -29,7 +29,7 @@ public: , m_palette(*this, "palette") , m_gfxrom(*this, "gfxrom") , m_nvram(*this, "nvram") - , m_midway_serial_pic(*this, "serial_pic") + , m_pic(*this, "pic") , m_gun_recoil(*this, "Player%u_Gun_Recoil", 1U) , m_gun_led(*this, "Player%u_Gun_LED", 1U) { } @@ -65,16 +65,20 @@ private: required_memory_region m_gfxrom; required_device m_nvram; - required_device m_midway_serial_pic; + required_device m_pic; output_finder<3> m_gun_recoil; output_finder<3> m_gun_led; uint8_t m_cmos_write_enable; uint16_t m_iodata[8]; uint8_t m_uart[8]; - uint8_t m_security_bits; bool m_adc_int; std::unique_ptr m_nvram_data; + + uint8_t m_pic_command; + uint8_t m_pic_data; + uint8_t m_pic_clk; + uint8_t m_pic_status; }; #endif // MAME_INCLUDES_MIDXUNIT_H diff --git a/src/mame/machine/midxunit.cpp b/src/mame/machine/midxunit.cpp index dd71a134323..dc7f77e2e71 100644 --- a/src/mame/machine/midxunit.cpp +++ b/src/mame/machine/midxunit.cpp @@ -103,7 +103,7 @@ WRITE_LINE_MEMBER(midxunit_state::adc_int_w) uint16_t midxunit_state::midxunit_status_r() { /* low bit indicates whether the ADC is done reading the current input */ - return (m_midway_serial_pic->status_r() << 1) | (m_adc_int ? 1 : 0); + return (m_pic_status << 1) | (m_adc_int ? 1 : 0); } @@ -247,9 +247,13 @@ void midxunit_state::machine_start() save_item(NAME(m_cmos_write_enable)); save_item(NAME(m_iodata)); save_item(NAME(m_uart)); - save_item(NAME(m_security_bits)); save_item(NAME(m_adc_int)); save_pointer(NAME(m_nvram_data), 0x2000); + + save_item(NAME(m_pic_command)); + save_item(NAME(m_pic_data)); + save_item(NAME(m_pic_clk)); + save_item(NAME(m_pic_status)); } void midxunit_state::machine_reset() @@ -258,7 +262,10 @@ void midxunit_state::machine_reset() m_dcs->reset_w(0); m_dcs->reset_w(1); - m_security_bits = 0; + m_pic_command = 0; + m_pic_data = 0; + m_pic_clk = 0; + m_pic_status = 0; m_dcs->set_io_callbacks(write_line_delegate(*this, FUNC(midxunit_state::midxunit_dcs_output_full)), write_line_delegate(*this)); } @@ -273,28 +280,20 @@ void midxunit_state::machine_reset() uint16_t midxunit_state::midxunit_security_r() { - return m_midway_serial_pic->read(); + return m_pic_data; } void midxunit_state::midxunit_security_w(offs_t offset, uint16_t data, uint16_t mem_mask) { if (ACCESSING_BITS_0_7) - { - m_security_bits &= ~0xf; - m_security_bits |= data & 0xf; - m_midway_serial_pic->write(m_security_bits ^ 0x10); - } + m_pic_command = data & 0x0f; } void midxunit_state::midxunit_security_clock_w(offs_t offset, uint16_t data, uint16_t mem_mask) { if (offset == 0 && ACCESSING_BITS_0_7) - { - m_security_bits &= ~0x10; - m_security_bits |= BIT(data, 1) << 4; - m_midway_serial_pic->write(m_security_bits ^ 0x10); - } + m_pic_clk = BIT(data, 1); }