mirror of
https://github.com/holub/mame
synced 2025-04-19 15:11:37 +03:00
midwunit.cpp hook security PICs
This commit is contained in:
parent
9809a7b991
commit
df96c0e944
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user