summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/bus/msx_cart
diff options
context:
space:
mode:
author Wilbert Pol <wilbertpol@users.noreply.github.com>2015-07-30 10:22:08 +0200
committer Wilbert Pol <wilbertpol@users.noreply.github.com>2015-07-30 12:17:47 +0200
commita2c42916909303b2885fa352652312466eca0f64 (patch)
tree4e9fa18245b22fb8594b908c16b4ec9c82fc5bf9 /src/emu/bus/msx_cart
parent6bcb2f4406d9b03477e2b92cc392e02e345e46fa (diff)
msx1_cart.xml: Added fs_sr002 mapper based on internal bunsetsu mapper (nw)
Diffstat (limited to 'src/emu/bus/msx_cart')
-rw-r--r--src/emu/bus/msx_cart/cartridge.c2
-rw-r--r--src/emu/bus/msx_cart/fs_sr022.c72
-rw-r--r--src/emu/bus/msx_cart/fs_sr022.h33
3 files changed, 107 insertions, 0 deletions
diff --git a/src/emu/bus/msx_cart/cartridge.c b/src/emu/bus/msx_cart/cartridge.c
index 93e419235cd..7f990101a08 100644
--- a/src/emu/bus/msx_cart/cartridge.c
+++ b/src/emu/bus/msx_cart/cartridge.c
@@ -10,6 +10,7 @@
#include "disk.h"
#include "dooly.h"
#include "fmpac.h"
+#include "fs_sr022.h"
#include "halnote.h"
#include "hfox.h"
#include "holy_quran.h"
@@ -39,6 +40,7 @@ SLOT_INTERFACE_START(msx_cart)
SLOT_INTERFACE_INTERNAL("rtype", MSX_CART_RTYPE)
SLOT_INTERFACE_INTERNAL("majutsushi", MSX_CART_MAJUTSUSHI)
SLOT_INTERFACE_INTERNAL("fmpac", MSX_CART_FMPAC)
+ SLOT_INTERFACE_INTERNAL("fs_sr022", MSX_CART_FS_SR022)
SLOT_INTERFACE_INTERNAL("superloderunner", MSX_CART_SUPERLODERUNNER)
SLOT_INTERFACE_INTERNAL("synthesizer", MSX_CART_SYNTHESIZER)
SLOT_INTERFACE_INTERNAL("cross_blaim", MSX_CART_CROSSBLAIM)
diff --git a/src/emu/bus/msx_cart/fs_sr022.c b/src/emu/bus/msx_cart/fs_sr022.c
new file mode 100644
index 00000000000..17325f479fd
--- /dev/null
+++ b/src/emu/bus/msx_cart/fs_sr022.c
@@ -0,0 +1,72 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol
+#include "emu.h"
+#include "fs_sr022.h"
+
+
+const device_type MSX_CART_FS_SR022 = &device_creator<msx_cart_fs_sr022>;
+
+
+msx_cart_fs_sr022::msx_cart_fs_sr022(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, MSX_CART_FS_SR022, "MSX Cartridge - FS-SR022", tag, owner, clock, "msx_cart_fs_sr022", __FILE__)
+ , msx_cart_interface(mconfig, *this)
+ , m_bunsetsu_rom(NULL)
+ , m_bunsetsu_address(0)
+{
+}
+
+
+void msx_cart_fs_sr022::device_start()
+{
+ save_item(NAME(m_bunsetsu_address));
+}
+
+
+void msx_cart_fs_sr022::device_reset()
+{
+ m_bunsetsu_address = 0;
+}
+
+
+void msx_cart_fs_sr022::initialize_cartridge()
+{
+ if (get_rom_size() != 0x40000)
+ {
+ fatalerror("fs_sr022: Invalid ROM size\n");
+ }
+ m_bunsetsu_rom = get_rom_base() + 0x20000;
+}
+
+
+READ8_MEMBER(msx_cart_fs_sr022::read_cart)
+{
+ if (offset >= 0x4000 && offset < 0xc000)
+ {
+ if (offset == 0xbfff) {
+ return m_bunsetsu_rom[m_bunsetsu_address++ & 0x1ffff];
+ }
+
+ return get_rom_base()[offset - 0x4000];
+ }
+ return 0xff;
+}
+
+
+WRITE8_MEMBER(msx_cart_fs_sr022::write_cart)
+{
+ switch (offset)
+ {
+ case 0xbffc:
+ m_bunsetsu_address = (m_bunsetsu_address & 0xffff00) | data;
+ break;
+
+ case 0xbffd:
+ m_bunsetsu_address = (m_bunsetsu_address & 0xff00ff) | (data << 8);
+ break;
+
+ case 0xbffe:
+ m_bunsetsu_address = (m_bunsetsu_address & 0x00ffff) | (data << 16);
+ break;
+ }
+}
+
diff --git a/src/emu/bus/msx_cart/fs_sr022.h b/src/emu/bus/msx_cart/fs_sr022.h
new file mode 100644
index 00000000000..edae6296beb
--- /dev/null
+++ b/src/emu/bus/msx_cart/fs_sr022.h
@@ -0,0 +1,33 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol
+#ifndef __MSX_CART_FS_SR022_H
+#define __MSX_CART_FS_SR022_H
+
+#include "bus/msx_cart/cartridge.h"
+
+
+extern const device_type MSX_CART_FS_SR022;
+
+
+class msx_cart_fs_sr022 : public device_t
+ , public msx_cart_interface
+{
+public:
+ msx_cart_fs_sr022(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ virtual void initialize_cartridge();
+
+ virtual DECLARE_READ8_MEMBER(read_cart);
+ virtual DECLARE_WRITE8_MEMBER(write_cart);
+
+private:
+ const UINT8 *m_bunsetsu_rom;
+ UINT32 m_bunsetsu_address;
+};
+
+
+#endif