diff options
Diffstat (limited to 'src/devices/bus/z88/ram.cpp')
-rw-r--r-- | src/devices/bus/z88/ram.cpp | 116 |
1 files changed, 105 insertions, 11 deletions
diff --git a/src/devices/bus/z88/ram.cpp b/src/devices/bus/z88/ram.cpp index 69ddd3125a6..c697e40c7b0 100644 --- a/src/devices/bus/z88/ram.cpp +++ b/src/devices/bus/z88/ram.cpp @@ -11,18 +11,97 @@ #include "emu.h" #include "ram.h" -/*************************************************************************** - IMPLEMENTATION -***************************************************************************/ + +namespace { //************************************************************************** -// GLOBAL VARIABLES +// TYPE DEFINITIONS //************************************************************************** -DEFINE_DEVICE_TYPE(Z88_32K_RAM, z88_32k_ram_device, "z88_32k_ram", "Z88 32KB RAM") -DEFINE_DEVICE_TYPE(Z88_128K_RAM, z88_128k_ram_device, "z88_128k_ram", "Z88 128KB RAM") -DEFINE_DEVICE_TYPE(Z88_512K_RAM, z88_512k_ram_device, "z88_512k_ram", "Z88 512KB RAM") -DEFINE_DEVICE_TYPE(Z88_1024K_RAM, z88_1024k_ram_device, "z88_1024k_ram", "Z88 1024KB RAM") +// ======================> z88_32k_ram_device + +class z88_32k_ram_device : public device_t, + public device_nvram_interface, + public device_z88cart_interface +{ +public: + // construction/destruction + z88_32k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + z88_32k_ram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + + // device_t implementations + virtual void device_start() override ATTR_COLD; + + // device_nvram_interface implementation + virtual void nvram_default() override + { + } + virtual bool nvram_read(util::read_stream &file) override + { + auto const [err, actual] = util::read(file, get_cart_base(), get_cart_size()); + return !err && (actual == get_cart_size()); + } + virtual bool nvram_write(util::write_stream &file) override + { + auto const [err, actual] = util::write(file, get_cart_base(), get_cart_size()); + return !err; + } + + // z88cart_interface implementation + virtual uint8_t read(offs_t offset) override; + virtual void write(offs_t offset, uint8_t data) override; + virtual uint8_t* get_cart_base() override; + virtual uint32_t get_cart_size() override { return 0x8000; } + +protected: + // internal state + uint8_t * m_ram; +}; + +// ======================> z88_128k_ram_device + +class z88_128k_ram_device : public z88_32k_ram_device +{ +public: + // construction/destruction + z88_128k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // z88cart_interface implementation + virtual uint32_t get_cart_size() override { return 0x20000; } +}; + +// ======================> z88_512k_ram_device + +class z88_512k_ram_device : public z88_32k_ram_device +{ +public: + // construction/destruction + z88_512k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // z88cart_interface implementation + virtual uint32_t get_cart_size() override { return 0x80000; } +}; + +// ======================> z88_1024k_ram_device + +class z88_1024k_ram_device : public z88_32k_ram_device +{ +public: + // construction/destruction + z88_1024k_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + +protected: + // z88cart_interface overrides + virtual uint32_t get_cart_size() override { return 0x100000; } +}; + +/*************************************************************************** + IMPLEMENTATION +***************************************************************************/ //************************************************************************** // LIVE DEVICE @@ -38,7 +117,10 @@ z88_32k_ram_device::z88_32k_ram_device(const machine_config &mconfig, const char } z88_32k_ram_device::z88_32k_ram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, type, tag, owner, clock), device_z88cart_interface(mconfig, *this), m_ram(nullptr) + : device_t(mconfig, type, tag, owner, clock) + , device_nvram_interface(mconfig, *this) + , device_z88cart_interface(mconfig, *this) + , m_ram(nullptr) { } @@ -93,7 +175,7 @@ uint8_t* z88_32k_ram_device::get_cart_base() read -------------------------------------------------*/ -READ8_MEMBER(z88_32k_ram_device::read) +uint8_t z88_32k_ram_device::read(offs_t offset) { return m_ram[offset & (get_cart_size() - 1)]; } @@ -102,7 +184,19 @@ READ8_MEMBER(z88_32k_ram_device::read) write -------------------------------------------------*/ -WRITE8_MEMBER(z88_32k_ram_device::write) +void z88_32k_ram_device::write(offs_t offset, uint8_t data) { m_ram[offset & (get_cart_size() - 1)] = data; } + +} // anonymous namespace + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +DEFINE_DEVICE_TYPE_PRIVATE(Z88_32K_RAM, device_z88cart_interface, z88_32k_ram_device, "z88_32k_ram", "Z88 32KB RAM") +DEFINE_DEVICE_TYPE_PRIVATE(Z88_128K_RAM, device_z88cart_interface, z88_128k_ram_device, "z88_128k_ram", "Z88 128KB RAM") +DEFINE_DEVICE_TYPE_PRIVATE(Z88_512K_RAM, device_z88cart_interface, z88_512k_ram_device, "z88_512k_ram", "Z88 512KB RAM") +DEFINE_DEVICE_TYPE_PRIVATE(Z88_1024K_RAM, device_z88cart_interface, z88_1024k_ram_device, "z88_1024k_ram", "Z88 1024KB RAM") |