summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/ds6417.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/ds6417.cpp')
-rw-r--r--src/devices/machine/ds6417.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/src/devices/machine/ds6417.cpp b/src/devices/machine/ds6417.cpp
new file mode 100644
index 00000000000..bc696d6b10b
--- /dev/null
+++ b/src/devices/machine/ds6417.cpp
@@ -0,0 +1,158 @@
+// license:BSD-3-Clause
+// copyright-holders:Carl
+
+
+#include "emu.h"
+#include "ds6417.h"
+
+
+DEFINE_DEVICE_TYPE(DS6417, ds6417_device, "ds6417", "Dallas DS6417 Memory Card")
+
+ds6417_device::ds6417_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, DS6417, tag, owner, clock)
+ , device_image_interface(mconfig, *this)
+{
+}
+
+void ds6417_device::device_start()
+{
+ save_item(NAME(m_read));
+ save_item(NAME(m_clk));
+ save_item(NAME(m_reset));
+ save_item(NAME(m_start));
+ save_item(NAME(m_data));
+ save_item(NAME(m_command));
+ save_item(NAME(m_addr));
+ save_item(NAME(m_crc));
+ save_item(NAME(m_select));
+ save_item(NAME(m_shiftreg));
+}
+
+void ds6417_device::device_reset()
+{
+ m_read = false;
+ m_start = false;
+ m_count = 0;
+ m_command = 0;
+}
+
+image_init_result ds6417_device::call_load()
+{
+ if(length() != 32768)
+ return image_init_result::FAIL;
+ return image_init_result::PASS;
+}
+
+image_init_result ds6417_device::call_create(int format_type, util::option_resolution *format_options)
+{
+ u8 buffer[32768] = {0};
+ if(fwrite(buffer, 32768) != 32768)
+ return image_init_result::FAIL;
+ return image_init_result::PASS;
+}
+
+WRITE_LINE_MEMBER( ds6417_device::clock_w )
+{
+ if(!m_reset)
+ return;
+
+ if(m_clock != (state != 0))
+ return;
+
+ m_clock = state;
+
+ if(m_read && m_clock && m_start)
+ {
+ if(!(m_count & 7))
+ {
+ switch(m_command)
+ {
+ case CMD_READ:
+ case CMD_READMASK:
+ fread(&m_shiftreg, 1);
+ break;
+ case CMD_READPROT:
+ m_shiftreg = m_selectval;
+ break;
+ case CMD_READCRC:
+ m_shiftreg = m_crc;
+ break;
+ }
+ }
+
+ m_data = m_shiftreg & 1;
+ m_shiftreg >>= 1;
+ m_count++;
+ }
+ else if(!m_clock)
+ {
+ m_shiftreg = (m_shiftreg >> 1) | (m_data ? 0x80 : 0);
+ m_count++;
+
+ if(m_start)
+ {
+ if(!(m_count & 7))
+ {
+ switch(m_command)
+ {
+ case CMD_WRITE:
+ fwrite(&m_shiftreg, 1);
+ break;
+ case CMD_WRITEPROT:
+ m_selectval = m_shiftreg;
+ break;
+ }
+ }
+ }
+ else
+ {
+ switch(m_count)
+ {
+ case 8:
+ if((m_shiftreg != 0xe8) || (m_shiftreg != 0x17))
+ reset();
+ break;
+ case 16:
+ m_addr = m_shiftreg;
+ break;
+ case 24:
+ m_addr |= m_shiftreg << 8;
+ break;
+ case 32:
+ m_addr |= (m_shiftreg & 7) << 16;
+ m_command = m_shiftreg >> 3;
+ break;
+ case 40:
+ m_select = m_shiftreg;
+ break;
+ case 48:
+ m_select |= m_shiftreg << 8;
+ break;
+ case 56:
+ if((m_command & CMD_READMASK) == CMD_READMASK)
+ {
+ m_selbits = m_command & 7;
+ m_command &= 0x18;
+ }
+ switch(m_command)
+ {
+ case CMD_READ:
+ case CMD_READPROT:
+ case CMD_READMASK:
+ case CMD_READCRC:
+ m_read = true;
+ break;
+ case CMD_WRITE:
+ case CMD_WRITEPROT:
+ break;
+ default:
+ reset();
+ return;
+ }
+ m_start = true;
+ fseek(m_addr & 0x7fff, SEEK_SET);
+ break;
+ }
+ }
+ }
+}