summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/machine/er2055.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/machine/er2055.c')
-rw-r--r--trunk/src/emu/machine/er2055.c205
1 files changed, 205 insertions, 0 deletions
diff --git a/trunk/src/emu/machine/er2055.c b/trunk/src/emu/machine/er2055.c
new file mode 100644
index 00000000000..b710bdfa73b
--- /dev/null
+++ b/trunk/src/emu/machine/er2055.c
@@ -0,0 +1,205 @@
+/***************************************************************************
+
+ er2055.c
+
+ GI 512 bit electrically alterable read-only memory.
+
+****************************************************************************
+
+ Copyright Aaron Giles
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "machine/er2055.h"
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// device type definition
+const device_type ER2055 = &device_creator<er2055_device>;
+
+static ADDRESS_MAP_START( er2055_map, AS_PROGRAM, 8, er2055_device )
+ AM_RANGE(0x0000, 0x003f) AM_RAM
+ADDRESS_MAP_END
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// er2055_device - constructor
+//-------------------------------------------------
+
+er2055_device::er2055_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, ER2055, "ER2055", tag, owner, clock),
+ device_memory_interface(mconfig, *this),
+ device_nvram_interface(mconfig, *this),
+ m_space_config("EAROM", ENDIANNESS_BIG, 8, 6, 0, *ADDRESS_MAP_NAME(er2055_map)),
+ m_control_state(0),
+ m_address(0),
+ m_data(0)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void er2055_device::device_start()
+{
+ save_item(NAME(m_control_state));
+ save_item(NAME(m_address));
+ save_item(NAME(m_data));
+
+ m_control_state = 0;
+}
+
+
+//-------------------------------------------------
+// memory_space_config - return a description of
+// any address spaces owned by this device
+//-------------------------------------------------
+
+const address_space_config *er2055_device::memory_space_config(address_spacenum spacenum) const
+{
+ return (spacenum == 0) ? &m_space_config : NULL;
+}
+
+
+//-------------------------------------------------
+// nvram_default - called to initialize NVRAM to
+// its default state
+//-------------------------------------------------
+
+void er2055_device::nvram_default()
+{
+ // default to all-0xff
+ for (int byte = 0; byte < SIZE_DATA; byte++)
+ m_addrspace[0]->write_byte(byte, 0xff);
+
+ // populate from a memory region if present
+ if (m_region != NULL)
+ {
+ if (m_region->bytes() != SIZE_DATA)
+ fatalerror("er2055 region '%s' wrong size (expected size = 0x100)", tag());
+ if (m_region->width() != 1)
+ fatalerror("er2055 region '%s' needs to be an 8-bit region", tag());
+
+ for (int byte = 0; byte < SIZE_DATA; byte++)
+ m_addrspace[0]->write_byte(byte, m_region->u8(byte));
+ }
+}
+
+
+//-------------------------------------------------
+// nvram_read - called to read NVRAM from the
+// .nv file
+//-------------------------------------------------
+
+void er2055_device::nvram_read(emu_file &file)
+{
+ UINT8 buffer[SIZE_DATA];
+ file.read(buffer, sizeof(buffer));
+ for (int byte = 0; byte < SIZE_DATA; byte++)
+ m_addrspace[0]->write_byte(byte, buffer[byte]);
+}
+
+
+//-------------------------------------------------
+// nvram_write - called to write NVRAM to the
+// .nv file
+//-------------------------------------------------
+
+void er2055_device::nvram_write(emu_file &file)
+{
+ UINT8 buffer[SIZE_DATA];
+ for (int byte = 0; byte < SIZE_DATA; byte++)
+ buffer[byte] = m_addrspace[0]->read_byte(byte);
+ file.write(buffer, sizeof(buffer));
+}
+
+
+
+//**************************************************************************
+// I/O OPERATIONS
+//**************************************************************************
+
+//-------------------------------------------------
+// set_control - set the control lines; these
+// must be done simultaneously because the chip
+// reacts to various combinations
+//-------------------------------------------------
+
+void er2055_device::set_control(UINT8 cs1, UINT8 cs2, UINT8 c1, UINT8 c2, UINT8 ck)
+{
+ // create a new composite control state
+ UINT8 oldstate = m_control_state;
+ m_control_state = (ck != 0) ? CK : 0;
+ m_control_state |= (c1 != 0) ? C1 : 0;
+ m_control_state |= (c2 != 0) ? C2 : 0;
+ m_control_state |= (cs1 != 0) ? CS1 : 0;
+ m_control_state |= (cs2 != 0) ? CS2 : 0;
+
+ // if not selected, or if change from previous, we're done
+ if ((m_control_state & (CS1 | CS2)) != (CS1 | CS2) || m_control_state == oldstate)
+ return;
+
+ // something changed, see what it is based on what mode we're in
+ switch (m_control_state & (C1 | C2))
+ {
+ // write mode; erasing is required, so we perform an AND against previous
+ // data to simulate incorrect behavior if erasing was not done
+ case 0:
+ m_addrspace[0]->write_byte(m_address, m_addrspace[0]->read_byte(m_address) & m_data);
+//printf("Write %02X = %02X\n", m_address, m_data);
+ break;
+
+ // erase mode
+ case C2:
+ m_addrspace[0]->write_byte(m_address, 0xff);
+//printf("Erase %02X\n", m_address);
+ break;
+
+ // read mode
+ case C1:
+ if ((oldstate & CK) != 0 && (m_control_state & CK) == 0)
+ {
+ m_data = m_addrspace[0]->read_byte(m_address);
+//printf("Read %02X = %02X\n", m_address, m_data);
+ }
+ break;
+ }
+}