summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/msx_cart/majutsushi.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/msx_cart/majutsushi.c')
-rw-r--r--src/devices/bus/msx_cart/majutsushi.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/devices/bus/msx_cart/majutsushi.c b/src/devices/bus/msx_cart/majutsushi.c
new file mode 100644
index 00000000000..6c9c16e7319
--- /dev/null
+++ b/src/devices/bus/msx_cart/majutsushi.c
@@ -0,0 +1,115 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol
+#include "emu.h"
+#include "majutsushi.h"
+
+const device_type MSX_CART_MAJUTSUSHI = &device_creator<msx_cart_majutsushi>;
+
+
+msx_cart_majutsushi::msx_cart_majutsushi(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, MSX_CART_MAJUTSUSHI, "MSX Cartridge - Majutsushi", tag, owner, clock, "msx_cart_majutsushi", __FILE__)
+ , msx_cart_interface(mconfig, *this)
+ , m_dac(*this, "dac")
+{
+ for (int i = 0; i < 4; i++)
+ {
+ m_selected_bank[i] = 0;
+ }
+ for (int i = 0; i < 8; i++)
+ {
+ m_bank_base[i] = NULL;
+ }
+}
+
+
+static MACHINE_CONFIG_FRAGMENT( majutsushi )
+ // This is actually incorrect. The sound output is passed back into the MSX machine where it is mixed internally and output through the system 'speaker'.
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("dac", DAC, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.10)
+MACHINE_CONFIG_END
+
+
+machine_config_constructor msx_cart_majutsushi::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( majutsushi );
+}
+
+
+void msx_cart_majutsushi::device_start()
+{
+ save_item(NAME(m_selected_bank));
+
+ machine().save().register_postload(save_prepost_delegate(FUNC(msx_cart_majutsushi::restore_banks), this));
+}
+
+
+void msx_cart_majutsushi::restore_banks()
+{
+ m_bank_base[0] = get_rom_base() + ( m_selected_bank[0] & 0x0f ) * 0x2000;
+ m_bank_base[1] = get_rom_base() + ( m_selected_bank[1] & 0x0f ) * 0x2000;
+ m_bank_base[2] = get_rom_base() + ( m_selected_bank[0] & 0x0f ) * 0x2000;
+ m_bank_base[3] = get_rom_base() + ( m_selected_bank[1] & 0x0f ) * 0x2000;
+ m_bank_base[4] = get_rom_base() + ( m_selected_bank[2] & 0x0f ) * 0x2000;
+ m_bank_base[5] = get_rom_base() + ( m_selected_bank[3] & 0x0f ) * 0x2000;
+ m_bank_base[6] = get_rom_base() + ( m_selected_bank[2] & 0x0f ) * 0x2000;
+ m_bank_base[7] = get_rom_base() + ( m_selected_bank[3] & 0x0f ) * 0x2000;
+}
+
+
+void msx_cart_majutsushi::device_reset()
+{
+ for (int i = 0; i < 4; i++)
+ {
+ m_selected_bank[i] = i;
+ }
+}
+
+
+void msx_cart_majutsushi::initialize_cartridge()
+{
+ if ( get_rom_size() != 0x20000 )
+ {
+ fatalerror("majutsushi: Invalid ROM size\n");
+ }
+
+ restore_banks();
+}
+
+
+READ8_MEMBER(msx_cart_majutsushi::read_cart)
+{
+ return m_bank_base[offset >> 13][offset & 0x1fff];
+}
+
+
+WRITE8_MEMBER(msx_cart_majutsushi::write_cart)
+{
+ switch (offset & 0xe000)
+ {
+ case 0x4000:
+ if (offset & 0x1000)
+ {
+ m_dac->write_unsigned8(data);
+ }
+ break;
+
+ case 0x6000:
+ m_selected_bank[1] = data & 0x0f;
+ m_bank_base[1] = get_rom_base() + m_selected_bank[1] * 0x2000;
+ m_bank_base[3] = get_rom_base() + m_selected_bank[1] * 0x2000;
+ break;
+
+ case 0x8000:
+ m_selected_bank[2] = data & 0x0f;
+ m_bank_base[4] = get_rom_base() + m_selected_bank[2] * 0x2000;
+ m_bank_base[6] = get_rom_base() + m_selected_bank[2] * 0x2000;
+ break;
+
+ case 0xa000:
+ m_selected_bank[3] = data & 0x0f;
+ m_bank_base[5] = get_rom_base() + m_selected_bank[3] * 0x2000;
+ m_bank_base[7] = get_rom_base() + m_selected_bank[3] * 0x2000;
+ break;
+ }
+}