midwunit.cpp hook security PICs

This commit is contained in:
MetalliC 2020-08-10 22:49:15 +03:00
parent 9809a7b991
commit df96c0e944
4 changed files with 61 additions and 35 deletions

View File

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

View File

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

View File

@ -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<pic16c57_device> m_pic;
u8 read_c();
void write_c(u8 data);
u8 m_command;
u8 m_data_out;
u8 m_clk;
u8 m_status;
};

View File

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