summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/gamate/gamate_protection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/gamate/gamate_protection.cpp')
-rw-r--r--src/devices/bus/gamate/gamate_protection.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/devices/bus/gamate/gamate_protection.cpp b/src/devices/bus/gamate/gamate_protection.cpp
new file mode 100644
index 00000000000..4218a237a3f
--- /dev/null
+++ b/src/devices/bus/gamate/gamate_protection.cpp
@@ -0,0 +1,117 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+#include "emu.h"
+#include "gamate_protection.h"
+
+//#define VERBOSE 1
+#include "logmacro.h"
+
+
+DEFINE_DEVICE_TYPE(GAMATE_PROT, gamate_protection_device, "gamate_prot", "Gamate Protection Mapper")
+
+gamate_protection_device::gamate_protection_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, GAMATE_PROT, tag, owner, clock),
+ m_is_protection_passed(0),
+ m_has_failed(0),
+ m_passed_write(0),
+ m_inpos(0),
+ m_inbyte(0),
+ m_inseq(0)
+{
+}
+
+void gamate_protection_device::device_start()
+{
+ save_item(NAME(m_is_protection_passed));
+ save_item(NAME(m_has_failed));
+ save_item(NAME(m_passed_write));
+ save_item(NAME(m_inpos));
+ save_item(NAME(m_inbyte));
+ save_item(NAME(m_inseq));
+}
+
+void gamate_protection_device::device_reset()
+{
+ m_is_protection_passed = 0;
+ m_has_failed = 0;
+ m_passed_write = 0;
+ m_inpos = 0;
+ m_inbyte = 0;
+ m_inseq = 0;
+}
+
+bool gamate_protection_device::is_protection_passed()
+{
+ return m_is_protection_passed;
+}
+
+WRITE_LINE_MEMBER(gamate_protection_device::prot_w)
+{
+ LOG("write to protection %01x\n", state);
+
+ if (m_inpos < 8)
+ {
+ m_inbyte |= state << (7 - m_inpos);
+ m_inpos++;
+ }
+ else
+ {
+ LOG("byte in was %c\n", m_inbyte);
+
+ if (!m_has_failed)
+ {
+ if (m_inseq < 15)
+ {
+ if (m_inbyte == m_prot_string[m_inseq])
+ {
+ LOG("OK\n");
+ }
+ else
+ {
+ m_has_failed = 1;
+ }
+ }
+ }
+
+ m_inpos = 0;
+ m_inbyte = 0;
+
+ m_inseq++;
+
+ if (!m_has_failed && m_inseq == 15)
+ {
+ m_inbyte = 0x47;
+ LOG("setting byte to output\n");
+ m_passed_write = 1;
+ }
+ }
+}
+
+READ_LINE_MEMBER(gamate_protection_device::prot_r)
+{
+
+ if (m_passed_write)
+ {
+ int retval = (m_inbyte >> (7 - m_inpos)) & 1;
+ m_inpos++;
+
+ LOG("read from protection %01x\n", retval);
+
+ if (m_inpos == 8)
+ {
+ LOG("unlocking ROM\n");
+ m_is_protection_passed = 1;
+ m_inpos = 0;
+ m_inbyte = 0;
+ }
+
+ return retval;
+ }
+ else
+ {
+ LOG("read from protection when not ready\n");
+ }
+
+ return 0x0;
+}