summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine
diff options
context:
space:
mode:
author MetalliC <0vetal0@gmail.com>2020-08-10 22:49:15 +0300
committer MetalliC <0vetal0@gmail.com>2020-08-10 22:49:15 +0300
commitdf96c0e94420deb0cd7811ff31bcab1275dcb2e0 (patch)
treede298cca6073acc2f02713daabd17bc66b719bdc /src/mame/machine
parent9809a7b9910b282ef2a83413ea34c8567d494eb6 (diff)
midwunit.cpp hook security PICs
Diffstat (limited to 'src/mame/machine')
-rw-r--r--src/mame/machine/midwayic.cpp65
-rw-r--r--src/mame/machine/midwayic.h20
-rw-r--r--src/mame/machine/midwunit.cpp4
3 files changed, 60 insertions, 29 deletions
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<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;
};
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);
}
}