summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/z88/ram.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/z88/ram.cpp')
-rw-r--r--src/devices/bus/z88/ram.cpp116
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")