midxunit.cpp bad PIC16 dump was manually restored, hooked to driver

This commit is contained in:
MetalliC 2020-08-21 23:34:25 +03:00
parent fcb4c2eece
commit 89818f6456
3 changed files with 29 additions and 23 deletions

View File

@ -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) )

View File

@ -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<nvram_device> m_nvram;
required_device<midway_serial_pic_device> m_midway_serial_pic;
required_device<pic16c57_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<uint8_t[]> 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

View File

@ -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);
}