diff options
Diffstat (limited to 'src/devices/bus/ekara')
-rw-r--r-- | src/devices/bus/ekara/rom.cpp | 121 | ||||
-rw-r--r-- | src/devices/bus/ekara/rom.h | 46 | ||||
-rw-r--r-- | src/devices/bus/ekara/slot.cpp | 38 | ||||
-rw-r--r-- | src/devices/bus/ekara/slot.h | 21 |
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: |