summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/m6m80011ap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/m6m80011ap.cpp')
-rw-r--r--src/devices/machine/m6m80011ap.cpp232
1 files changed, 232 insertions, 0 deletions
diff --git a/src/devices/machine/m6m80011ap.cpp b/src/devices/machine/m6m80011ap.cpp
new file mode 100644
index 00000000000..776cbcae6e7
--- /dev/null
+++ b/src/devices/machine/m6m80011ap.cpp
@@ -0,0 +1,232 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+Template for skeleton device
+
+***************************************************************************/
+
+#include "emu.h"
+#include "machine/m6m80011ap.h"
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// device type definition
+const device_type M6M80011AP = &device_creator<m6m80011ap_device>;
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// m6m80011ap_device - constructor
+//-------------------------------------------------
+
+m6m80011ap_device::m6m80011ap_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, M6M80011AP, "M6M80011AP EEPROM", tag, owner, clock, "m6m80011ap", __FILE__),
+ device_nvram_interface(mconfig, *this)
+{
+}
+
+
+//-------------------------------------------------
+// device_validity_check - perform validity checks
+// on this device
+//-------------------------------------------------
+
+void m6m80011ap_device::device_validity_check(validity_checker &valid) const
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void m6m80011ap_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void m6m80011ap_device::device_reset()
+{
+}
+
+//-------------------------------------------------
+// nvram_default - called to initialize NVRAM to
+// its default state
+//-------------------------------------------------
+
+void m6m80011ap_device::nvram_default()
+{
+ for (offs_t offs = 0; offs < 0x80; offs++)
+ m_eeprom_data[offs] = 0xffff;
+}
+
+
+
+
+//-------------------------------------------------
+// nvram_read - called to read NVRAM from the
+// .nv file
+//-------------------------------------------------
+
+void m6m80011ap_device::nvram_read(emu_file &file)
+{
+ file.read(m_eeprom_data, 0x100);
+}
+
+
+//-------------------------------------------------
+// nvram_write - called to write NVRAM to the
+// .nv file
+//-------------------------------------------------
+
+void m6m80011ap_device::nvram_write(emu_file &file)
+{
+ file.write(m_eeprom_data, 0x100);
+}
+
+//**************************************************************************
+// READ/WRITE HANDLERS
+//**************************************************************************
+
+
+READ_LINE_MEMBER( m6m80011ap_device::read_bit )
+{
+ return m_read_latch;
+}
+
+READ_LINE_MEMBER( m6m80011ap_device::ready_line )
+{
+ return 1; // TODO
+}
+
+WRITE_LINE_MEMBER( m6m80011ap_device::set_cs_line )
+{
+ m_reset_line = state;
+
+ if (m_reset_line != CLEAR_LINE)
+ {
+ m_eeprom_state = EEPROM_GET_CMD;
+ m_cmd_stream_pos = 0;
+ m_current_cmd = 0;
+ }
+}
+
+
+WRITE_LINE_MEMBER( m6m80011ap_device::write_bit )
+{
+ m_latch = state;
+}
+
+WRITE_LINE_MEMBER( m6m80011ap_device::set_clock_line )
+{
+ if (m_reset_line == CLEAR_LINE)
+ {
+ if(state == 1)
+ {
+ switch(m_eeprom_state)
+ {
+ case EEPROM_GET_CMD:
+ m_current_cmd = (m_current_cmd >> 1) | ((m_latch & 1)<< 7);
+ m_cmd_stream_pos++;
+
+ if (m_cmd_stream_pos==8)
+ {
+ m_cmd_stream_pos = 0;
+ switch(m_current_cmd)
+ {
+ case 0xc5: m_eeprom_state = EEPROM_WRITE_ENABLE; break;
+ case 0x05: m_eeprom_state = EEPROM_WRITE_DISABLE; break;
+ case 0x25: m_eeprom_state = EEPROM_WRITE; break;
+ case 0x15: m_eeprom_state = EEPROM_READ; break;
+ case 0x95: m_eeprom_state = EEPROM_STATUS_OUTPUT; break;
+ default:
+ printf("Write M6M80011 unknown %02x cmd\n",m_current_cmd );
+ break;
+ }
+ }
+ break;
+
+ case EEPROM_READ:
+ m_current_cmd = (m_current_cmd >> 1) | ((m_latch & 1)<< 23);
+ m_cmd_stream_pos++;
+
+ if (m_cmd_stream_pos==8)
+ {
+ m_current_addr = m_current_cmd >> 16;
+ }
+
+ if(m_cmd_stream_pos>=8)
+ {
+ m_read_latch = (m_eeprom_data[m_current_addr] >> (23-m_cmd_stream_pos)) & 1;
+ //printf("%d %04x <- %04x %d\n",m_read_latch,m_eeprom_data[m_current_addr],m_current_addr,m_cmd_stream_pos-8);
+ }
+
+ if(m_cmd_stream_pos==24)
+ {
+ m_eeprom_state = EEPROM_GET_CMD;
+ m_cmd_stream_pos = 0;
+ }
+ break;
+
+ case EEPROM_WRITE:
+ m_current_cmd = (m_current_cmd >> 1) | ((m_latch & 1)<< 23);
+ m_cmd_stream_pos++;
+
+ if (m_cmd_stream_pos==8)
+ {
+ m_current_addr = m_current_cmd >> 16;
+ }
+
+ if(m_cmd_stream_pos==24)
+ {
+ if(m_eeprom_we)
+ m_eeprom_data[m_current_addr] = (m_current_cmd >> 8) & 0xffff;
+
+ //printf("%04x %04x -> %04x\n",m_eeprom_data[m_current_addr],m_current_addr,m_current_cmd >> 8);
+
+ m_eeprom_state = EEPROM_GET_CMD;
+ m_cmd_stream_pos = 0;
+ }
+ break;
+
+ case EEPROM_WRITE_ENABLE:
+ case EEPROM_WRITE_DISABLE:
+ m_current_cmd = (m_current_cmd >> 1) | ((m_latch & 1)<< 7);
+ m_cmd_stream_pos++;
+
+ if (m_cmd_stream_pos==8)
+ {
+ m_eeprom_we = (m_eeprom_state == EEPROM_WRITE_ENABLE) ? 1 : 0;
+ m_eeprom_state = EEPROM_GET_CMD;
+ m_cmd_stream_pos = 0;
+ }
+
+ break;
+
+ case EEPROM_STATUS_OUTPUT:
+ m_current_cmd = (m_current_cmd >> 1) | ((m_latch & 1)<< 7);
+ m_cmd_stream_pos++;
+
+ if (m_cmd_stream_pos==8)
+ {
+ printf("Status output\n");
+ m_eeprom_state = EEPROM_GET_CMD;
+ m_cmd_stream_pos = 0;
+ }
+ break;
+ }
+ }
+ }
+}