summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/ekara
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/ekara')
-rw-r--r--src/devices/bus/ekara/rom.cpp121
-rw-r--r--src/devices/bus/ekara/rom.h46
-rw-r--r--src/devices/bus/ekara/slot.cpp38
-rw-r--r--src/devices/bus/ekara/slot.h21
4 files changed, 215 insertions, 11 deletions
diff --git a/src/devices/bus/ekara/rom.cpp b/src/devices/bus/ekara/rom.cpp
index 7ba557b0917..f55fd325d2a 100644
--- a/src/devices/bus/ekara/rom.cpp
+++ b/src/devices/bus/ekara/rom.cpp
@@ -10,8 +10,10 @@
DEFINE_DEVICE_TYPE(EKARA_ROM_PLAIN, ekara_rom_plain_device, "ekara_rom_plain", "EKARA Cartridge")
DEFINE_DEVICE_TYPE(EKARA_ROM_I2C_BASE, ekara_rom_i2c_base_device, "ekara_rom_i2c_base", "EKARA Cartridge with I2C")
+DEFINE_DEVICE_TYPE(EKARA_ROM_I2C_24C08_EPITCH, ekara_rom_i2c_24c08_epitch_device, "ekara_rom_i2c_24c08", "EKARA Cartridge with I2C 24C08 (e-pitch)")
DEFINE_DEVICE_TYPE(EKARA_ROM_I2C_24LC04, ekara_rom_i2c_24lc04_device, "ekara_rom_i2c_24lc04", "EKARA Cartridge with I2C 24LC04")
DEFINE_DEVICE_TYPE(EKARA_ROM_I2C_24LC02, ekara_rom_i2c_24lc02_device, "ekara_rom_i2c_24lc02", "EKARA Cartridge with I2C 24LC02")
+DEFINE_DEVICE_TYPE(EKARA_ROM_I2C_24LC02_GC0010, ekara_rom_i2c_24lc02_gc0010_device, "ekara_rom_i2c_24lc02_gc0010", "EKARA Cartridge with I2C 24LC02 (GC0010 direct access)")
ekara_rom_plain_device::ekara_rom_plain_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
@@ -24,18 +26,24 @@ ekara_rom_plain_device::ekara_rom_plain_device(const machine_config &mconfig, co
{
}
-ekara_rom_i2c_base_device::ekara_rom_i2c_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- ekara_rom_plain_device(mconfig, EKARA_ROM_I2C_BASE, tag, owner, clock),
- m_i2cmem(*this, "i2cmem")
-{
-}
+
ekara_rom_i2c_base_device::ekara_rom_i2c_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
ekara_rom_plain_device(mconfig, type, tag, owner, clock),
m_i2cmem(*this, "i2cmem")
{
+ m_buscontrol[0] = m_buscontrol[1] = m_buscontrol[2] = 0x00;
}
+ekara_rom_i2c_base_device::ekara_rom_i2c_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ ekara_rom_i2c_base_device(mconfig, EKARA_ROM_I2C_BASE, tag, owner, clock)
+{
+}
+
+ekara_rom_i2c_24c08_epitch_device::ekara_rom_i2c_24c08_epitch_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ ekara_rom_i2c_base_device(mconfig, EKARA_ROM_I2C_24C08_EPITCH, tag, owner, clock)
+{
+}
ekara_rom_i2c_24lc04_device::ekara_rom_i2c_24lc04_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
ekara_rom_i2c_base_device(mconfig, EKARA_ROM_I2C_24LC04, tag, owner, clock)
@@ -47,6 +55,11 @@ ekara_rom_i2c_24lc02_device::ekara_rom_i2c_24lc02_device(const machine_config &m
{
}
+ekara_rom_i2c_24lc02_gc0010_device::ekara_rom_i2c_24lc02_gc0010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ ekara_rom_i2c_base_device(mconfig, EKARA_ROM_I2C_24LC02_GC0010, tag, owner, clock)
+{
+}
+
/*-------------------------------------------------
mapper specific handlers
-------------------------------------------------*/
@@ -75,6 +88,22 @@ WRITE8_MEMBER(ekara_rom_plain_device::write_rom)
// i2c base
+bool ekara_rom_i2c_base_device::is_read_access_not_rom(void)
+{
+ return (m_buscontrol[1] & 0x08) ? true : false;
+}
+
+bool ekara_rom_i2c_base_device::is_write_access_not_rom(void)
+{
+ return (m_buscontrol[0] & 0x08) ? true : false;
+}
+
+WRITE8_MEMBER(ekara_rom_i2c_base_device::write_bus_control)
+{
+ logerror("ekara_rom_i2c_base_device::write_bus_control %08x %02x\n", offset, data);
+ m_buscontrol[offset] = data;
+}
+
WRITE8_MEMBER(ekara_rom_i2c_base_device::write_rom)
{
logerror("ekara_rom_i2c_base_device::write_rom %08x %02x\n", offset, data);
@@ -100,18 +129,85 @@ WRITE8_MEMBER(ekara_rom_i2c_base_device::write_extra)
m_i2cmem->write_scl((data & 0x02) >> 1);
}
+// i2c 24c08 (for epitch carts)
+
+bool ekara_rom_i2c_24c08_epitch_device::is_read_access_not_rom(void)
+{
+ // write 0x08 before reading from SEEPROM
+ // reads from 005fffff, cart does no accress decoding
+ return (m_buscontrol[1] & 0x08) ? true : false;
+}
+
+bool ekara_rom_i2c_24c08_epitch_device::is_write_access_not_rom(void)
+{
+ // writes 0x05 before writing to SEEPROM
+ // actually writes to address 3fffff which is where a mirror of the base ROM sits, but clearly all signals route through the cartridge too
+ // cart does no accress decoding
+ return (m_buscontrol[1] & 0x04) ? true : false;
+}
+
+void ekara_rom_i2c_24c08_epitch_device::device_add_mconfig(machine_config &config)
+{
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x400); // 24C08
+}
// i2c 24lc04
-MACHINE_CONFIG_START(ekara_rom_i2c_24lc04_device::device_add_mconfig)
- I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x200); // 24LC04
-MACHINE_CONFIG_END
+void ekara_rom_i2c_24lc04_device::device_add_mconfig(machine_config &config)
+{
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); // 24LC04
+}
// i2c 24lc02
-MACHINE_CONFIG_START(ekara_rom_i2c_24lc02_device::device_add_mconfig)
+void ekara_rom_i2c_24lc02_device::device_add_mconfig(machine_config &config)
+{
+ I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24LC02
+}
+
+// i2c 24lc02 with direct IO port access
+
+bool ekara_rom_i2c_24lc02_gc0010_device::is_read_access_not_rom(void)
+{
+ return false;
+}
+
+bool ekara_rom_i2c_24lc02_gc0010_device::is_write_access_not_rom(void)
+{
+ return false;
+}
+
+READ8_MEMBER(ekara_rom_i2c_24lc02_gc0010_device::read_extra)
+{
+ return 0;
+}
+
+WRITE8_MEMBER(ekara_rom_i2c_24lc02_gc0010_device::write_extra)
+{
+}
+
+
+WRITE_LINE_MEMBER(ekara_rom_i2c_24lc02_gc0010_device::write_sda)
+{
+ m_i2cmem->write_sda(state);
+}
+
+WRITE_LINE_MEMBER(ekara_rom_i2c_24lc02_gc0010_device::write_scl)
+{
+ m_i2cmem->write_scl(state);
+}
+
+READ_LINE_MEMBER(ekara_rom_i2c_24lc02_gc0010_device::read_sda )
+{
+ return m_i2cmem->read_sda();
+}
+
+
+
+void ekara_rom_i2c_24lc02_gc0010_device::device_add_mconfig(machine_config &config)
+{
I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x100); // 24LC02
-MACHINE_CONFIG_END
+}
/*-------------------------------------------------
@@ -121,6 +217,9 @@ MACHINE_CONFIG_END
void ekara_cart(device_slot_interface &device)
{
device.option_add_internal("plain", EKARA_ROM_PLAIN);
+ device.option_add_internal("rom_24c08_epitch", EKARA_ROM_I2C_24C08_EPITCH);
device.option_add_internal("rom_24lc04", EKARA_ROM_I2C_24LC04);
- device.option_add_internal("rom_24lc02", EKARA_ROM_I2C_24LC02);
+ device.option_add_internal("rom_24lc02", EKARA_ROM_I2C_24LC02);
+ device.option_add_internal("rom_24lc02_gc0010", EKARA_ROM_I2C_24LC02_GC0010);
+
}
diff --git a/src/devices/bus/ekara/rom.h b/src/devices/bus/ekara/rom.h
index a765f28d6d3..76c5ed45e46 100644
--- a/src/devices/bus/ekara/rom.h
+++ b/src/devices/bus/ekara/rom.h
@@ -54,8 +54,32 @@ protected:
virtual DECLARE_READ8_MEMBER(read_extra) override;
virtual DECLARE_WRITE8_MEMBER(write_extra) override;
+
+ virtual DECLARE_WRITE8_MEMBER(write_bus_control) override;
+
+ virtual bool is_read_access_not_rom(void) override;
+ virtual bool is_write_access_not_rom(void) override;
+
+ uint8_t m_buscontrol[3];
};
+
+// ======================> ekara_rom_i2c_24c08_epitch_device
+
+class ekara_rom_i2c_24c08_epitch_device : public ekara_rom_i2c_base_device
+{
+public:
+ // construction/destruction
+ ekara_rom_i2c_24c08_epitch_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual bool is_read_access_not_rom(void) override;
+ virtual bool is_write_access_not_rom(void) override;
+
+ virtual void device_add_mconfig(machine_config &config) override;
+};
+
+
// ======================> ekara_rom_i2c_24lc04_device
class ekara_rom_i2c_24lc04_device : public ekara_rom_i2c_base_device
@@ -81,10 +105,32 @@ protected:
};
+// ======================> ekara_rom_i2c_24lc02_gc0010_device
+
+class ekara_rom_i2c_24lc02_gc0010_device : public ekara_rom_i2c_base_device
+{
+public:
+ // construction/destruction
+ ekara_rom_i2c_24lc02_gc0010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+
+ bool is_read_access_not_rom(void) override;
+ bool is_write_access_not_rom(void) override;
+ DECLARE_READ8_MEMBER(read_extra) override;
+ DECLARE_WRITE8_MEMBER(write_extra) override;
+ DECLARE_WRITE_LINE_MEMBER(write_sda) override;
+ DECLARE_WRITE_LINE_MEMBER(write_scl) override;
+ DECLARE_READ_LINE_MEMBER(read_sda ) override;
+};
+
// device type definition
DECLARE_DEVICE_TYPE(EKARA_ROM_PLAIN, ekara_rom_plain_device)
DECLARE_DEVICE_TYPE(EKARA_ROM_I2C_BASE, ekara_rom_i2c_base_device)
+DECLARE_DEVICE_TYPE(EKARA_ROM_I2C_24C08_EPITCH, ekara_rom_i2c_24c08_epitch_device)
DECLARE_DEVICE_TYPE(EKARA_ROM_I2C_24LC04, ekara_rom_i2c_24lc04_device)
DECLARE_DEVICE_TYPE(EKARA_ROM_I2C_24LC02, ekara_rom_i2c_24lc02_device)
+DECLARE_DEVICE_TYPE(EKARA_ROM_I2C_24LC02_GC0010, ekara_rom_i2c_24lc02_gc0010_device)
#endif // MAME_BUS_EKARA_ROM_H
diff --git a/src/devices/bus/ekara/slot.cpp b/src/devices/bus/ekara/slot.cpp
index 0569bb49a6c..5140e3f28ab 100644
--- a/src/devices/bus/ekara/slot.cpp
+++ b/src/devices/bus/ekara/slot.cpp
@@ -95,6 +95,7 @@ static const ekara_slot slot_list[] =
{
{ EKARA_PLAIN, "plain" },
{ EKARA_I2C_BASE, "i2c_base" },
+ { EKARA_I2C_24C08, "rom_24c08" },
{ EKARA_I2C_24LC04, "rom_24lc04" },
{ EKARA_I2C_24LC02, "rom_24lc02" },
};
@@ -237,3 +238,40 @@ WRITE8_MEMBER(ekara_cart_slot_device::write_extra)
m_cart->write_extra(space, offset, data);
}
+/*-------------------------------------------------
+ write control
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(ekara_cart_slot_device::write_bus_control)
+{
+ m_cart->write_bus_control(space, offset, data);
+}
+
+bool ekara_cart_slot_device::is_read_access_not_rom(void)
+{
+ return m_cart->is_read_access_not_rom();
+}
+
+bool ekara_cart_slot_device::is_write_access_not_rom(void)
+{
+ return m_cart->is_write_access_not_rom();
+}
+
+/*-------------------------------------------------
+ direct seeprom access (popira2, gc0010)
+ -------------------------------------------------*/
+
+WRITE_LINE_MEMBER(ekara_cart_slot_device::write_sda)
+{
+ m_cart->write_sda(state);
+}
+
+WRITE_LINE_MEMBER(ekara_cart_slot_device::write_scl)
+{
+ m_cart->write_scl(state);
+}
+
+READ_LINE_MEMBER(ekara_cart_slot_device::read_sda )
+{
+ return m_cart->read_sda();
+}
diff --git a/src/devices/bus/ekara/slot.h b/src/devices/bus/ekara/slot.h
index 5f871aa1dfc..945a5175d4b 100644
--- a/src/devices/bus/ekara/slot.h
+++ b/src/devices/bus/ekara/slot.h
@@ -16,6 +16,7 @@ enum
{
EKARA_PLAIN = 0,
EKARA_I2C_BASE,
+ EKARA_I2C_24C08,
EKARA_I2C_24LC04,
EKARA_I2C_24LC02,
};
@@ -35,6 +36,16 @@ public:
virtual DECLARE_READ8_MEMBER(read_extra) { return 0xff; }
virtual DECLARE_WRITE8_MEMBER(write_extra) { }
+ virtual DECLARE_WRITE_LINE_MEMBER(write_sda) { }
+ virtual DECLARE_WRITE_LINE_MEMBER(write_scl) { }
+ //virtual DECLARE_WRITE_LINE_MEMBER( write_wc )
+ virtual DECLARE_READ_LINE_MEMBER( read_sda ) { return 0; }
+
+ virtual DECLARE_WRITE8_MEMBER(write_bus_control) { }
+
+ virtual bool is_read_access_not_rom(void) { return false; }
+ virtual bool is_write_access_not_rom(void) { return false; }
+
void rom_alloc(uint32_t size, const char *tag);
uint8_t* get_rom_base() { return m_rom; }
uint32_t get_rom_size() { return m_rom_size; }
@@ -96,6 +107,16 @@ public:
virtual DECLARE_READ8_MEMBER(read_extra);
virtual DECLARE_WRITE8_MEMBER(write_extra);
+ virtual DECLARE_WRITE_LINE_MEMBER(write_sda);
+ virtual DECLARE_WRITE_LINE_MEMBER(write_scl);
+ //virtual DECLARE_WRITE_LINE_MEMBER( write_wc );
+ virtual DECLARE_READ_LINE_MEMBER( read_sda );
+
+ virtual DECLARE_WRITE8_MEMBER(write_bus_control);
+
+ virtual bool is_read_access_not_rom(void);
+ virtual bool is_write_access_not_rom(void);
+
bool has_cart() { return m_cart ? true : false; }
protected: