summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2018-03-30 12:38:23 +0100
committer Nigel Barnes <Pernod70@users.noreply.github.com>2018-03-30 12:58:31 +0100
commitd295e418c48586a403af22e27209fad9d3e08924 (patch)
treed239cf36f99d01132722d492ec9787ee90d01143
parent61c73493341af693197c94856fd2818cf2ace9ce (diff)
electron: Added Mega Games Cartridge device.
-rw-r--r--scripts/src/bus.lua2
-rw-r--r--src/devices/bus/electron/cart/mgc.cpp112
-rw-r--r--src/devices/bus/electron/cart/mgc.h47
-rw-r--r--src/devices/bus/electron/cart/slot.cpp2
4 files changed, 163 insertions, 0 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index d8cfbec7239..95761c42aef 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -759,6 +759,8 @@ if (BUSES["ELECTRON_CART"]~=null) then
MAME_DIR .. "src/devices/bus/electron/cart/click.h",
MAME_DIR .. "src/devices/bus/electron/cart/cumana.cpp",
MAME_DIR .. "src/devices/bus/electron/cart/cumana.h",
+ MAME_DIR .. "src/devices/bus/electron/cart/mgc.cpp",
+ MAME_DIR .. "src/devices/bus/electron/cart/mgc.h",
MAME_DIR .. "src/devices/bus/electron/cart/peg400.cpp",
MAME_DIR .. "src/devices/bus/electron/cart/peg400.h",
MAME_DIR .. "src/devices/bus/electron/cart/sndexp.cpp",
diff --git a/src/devices/bus/electron/cart/mgc.cpp b/src/devices/bus/electron/cart/mgc.cpp
new file mode 100644
index 00000000000..41cc29dfbfb
--- /dev/null
+++ b/src/devices/bus/electron/cart/mgc.cpp
@@ -0,0 +1,112 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ Mega Games Cartridge
+
+ The Mega Games Cartridge (MGC) is a Cartridge for the Acorn Electron,
+ with an Acorn/P.R.E.S. Plus 1 or a Slogger RomBox Plus fitted. It
+ contains a 32 Megabit (4M x 8-Bit) FlashRAM, plus control circuitry, to
+ give 256 x 16K pages of Memory. These 16K blocks can be viewed in
+ various formats. The MGC has been designed to hold and access, via the
+ built-in Menu, up-to 254 Games (the Index and Menu ROM take up the other
+ two 16K blocks).
+
+***************************************************************************/
+
+#include "emu.h"
+#include "mgc.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(ELECTRON_MGC, electron_mgc_device, "electron_mgc", "Electron Mega Games Cartridge")
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// electron_mgc_device - constructor
+//-------------------------------------------------
+
+electron_mgc_device::electron_mgc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, ELECTRON_MGC, tag, owner, clock)
+ , device_electron_cart_interface(mconfig, *this)
+ , m_page_latch(0)
+ , m_control_latch(0)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void electron_mgc_device::device_start()
+{
+ save_item(NAME(m_page_latch));
+ save_item(NAME(m_control_latch));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void electron_mgc_device::device_reset()
+{
+ m_page_latch = 0;
+ m_control_latch = 0;
+}
+
+//-------------------------------------------------
+// read - cartridge data read
+//-------------------------------------------------
+
+uint8_t electron_mgc_device::read(address_space &space, offs_t offset, int infc, int infd, int romqa)
+{
+ uint8_t data = 0xff;
+
+ if (!infc && !infd)
+ {
+ if (offset >= 0x0000 && offset < 0x4000)
+ {
+ int m_page_mode = BIT(m_control_latch, 2) ? BIT(m_control_latch, 1) : !romqa;
+ data = m_nvram[(offset & 0x3fff) | (m_page_latch << 14) | (m_page_mode << 21)];
+ }
+ }
+
+ return data;
+}
+
+//-------------------------------------------------
+// write - cartridge data write
+//-------------------------------------------------
+
+void electron_mgc_device::write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa)
+{
+ if (infc)
+ {
+ switch (offset)
+ {
+ case 0x00:
+ m_page_latch = data & 0x7f;
+ break;
+
+ case 0x08:
+ m_control_latch = data & 0x07;
+ break;
+ }
+ }
+
+ if (!infc && !infd)
+ {
+ if (offset >= 0x0000 && offset < 0x4000 && BIT(m_control_latch, 0))
+ {
+ int m_page_mode = BIT(m_control_latch, 2) ? BIT(m_control_latch, 1) : !romqa;
+ m_nvram[(offset & 0x3fff) | (m_page_latch << 14) | (m_page_mode << 21)] = data;
+ }
+ }
+}
diff --git a/src/devices/bus/electron/cart/mgc.h b/src/devices/bus/electron/cart/mgc.h
new file mode 100644
index 00000000000..8835a703107
--- /dev/null
+++ b/src/devices/bus/electron/cart/mgc.h
@@ -0,0 +1,47 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ Mega Games Cartridge
+
+***************************************************************************/
+
+#ifndef MAME_BUS_ELECTRON_CART_MGC_H
+#define MAME_BUS_ELECTRON_CART_MGC_H
+
+#pragma once
+
+#include "slot.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> electron_mgc_device
+
+class electron_mgc_device : public device_t,
+ public device_electron_cart_interface
+{
+public:
+ // construction/destruction
+ electron_mgc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // electron_cart_interface overrides
+ virtual uint8_t read(address_space &space, offs_t offset, int infc, int infd, int romqa) override;
+ virtual void write(address_space &space, offs_t offset, uint8_t data, int infc, int infd, int romqa) override;
+
+private:
+ uint8_t m_page_latch;
+ uint8_t m_control_latch;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(ELECTRON_MGC, electron_mgc_device)
+
+#endif // MAME_BUS_ELECTRON_CART_MGC_H
diff --git a/src/devices/bus/electron/cart/slot.cpp b/src/devices/bus/electron/cart/slot.cpp
index b52587edf33..8a13e2a4664 100644
--- a/src/devices/bus/electron/cart/slot.cpp
+++ b/src/devices/bus/electron/cart/slot.cpp
@@ -271,6 +271,7 @@ void electron_cartslot_device::write(address_space &space, offs_t offset, uint8_
#include "aqr.h"
#include "click.h"
#include "cumana.h"
+#include "mgc.h"
#include "peg400.h"
#include "sndexp.h"
#include "sndexp3.h"
@@ -286,6 +287,7 @@ SLOT_INTERFACE_START(electron_cart)
SLOT_INTERFACE_INTERNAL("aqr", ELECTRON_AQR)
SLOT_INTERFACE_INTERNAL("click", ELECTRON_CLICK)
SLOT_INTERFACE_INTERNAL("cumana", ELECTRON_CUMANA)
+ SLOT_INTERFACE_INTERNAL("mgc", ELECTRON_MGC)
SLOT_INTERFACE_INTERNAL("peg400", ELECTRON_PEG400)
SLOT_INTERFACE_INTERNAL("sndexp", ELECTRON_SNDEXP)
SLOT_INTERFACE_INTERNAL("sndexp3", ELECTRON_SNDEXP3)