summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/msx/slot/bunsetsu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/msx/slot/bunsetsu.cpp')
-rw-r--r--src/devices/bus/msx/slot/bunsetsu.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/devices/bus/msx/slot/bunsetsu.cpp b/src/devices/bus/msx/slot/bunsetsu.cpp
new file mode 100644
index 00000000000..f72c9a5c35f
--- /dev/null
+++ b/src/devices/bus/msx/slot/bunsetsu.cpp
@@ -0,0 +1,62 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol
+/*
+ Emulation for the bunsetsu internal firmware mapper found in a number of MSX machines
+*/
+
+#include "emu.h"
+#include "bunsetsu.h"
+
+
+DEFINE_DEVICE_TYPE(MSX_SLOT_BUNSETSU, msx_slot_bunsetsu_device, "msx_slot_bunsetsu", "MSX Internal BUNSETSU")
+
+
+msx_slot_bunsetsu_device::msx_slot_bunsetsu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : msx_slot_rom_device(mconfig, MSX_SLOT_BUNSETSU, tag, owner, clock)
+ , m_bunsetsu_region(*this, finder_base::DUMMY_TAG)
+ , m_bunsetsu_address(0)
+{
+}
+
+void msx_slot_bunsetsu_device::device_start()
+{
+ msx_slot_rom_device::device_start();
+
+ save_item(NAME(m_bunsetsu_address));
+
+ page(2)->install_read_handler(0xbfff, 0xbfff, emu::rw_delegate(*this, FUNC(msx_slot_bunsetsu_device::buns_read)));
+ page(2)->install_write_handler(0xbffc, 0xbffe, emu::rw_delegate(*this, FUNC(msx_slot_bunsetsu_device::buns_write)));
+}
+
+void msx_slot_bunsetsu_device::device_reset()
+{
+ m_bunsetsu_address = 0;
+}
+
+u8 msx_slot_bunsetsu_device::buns_read()
+{
+ u8 data = m_bunsetsu_region[m_bunsetsu_address & 0x1ffff];
+
+ if (!machine().side_effects_disabled())
+ m_bunsetsu_address++;
+
+ return data;
+}
+
+void msx_slot_bunsetsu_device::buns_write(offs_t offset, u8 data)
+{
+ switch (offset)
+ {
+ case 0:
+ m_bunsetsu_address = (m_bunsetsu_address & 0xffff00) | data;
+ break;
+
+ case 1:
+ m_bunsetsu_address = (m_bunsetsu_address & 0xff00ff) | (data << 8);
+ break;
+
+ case 2:
+ m_bunsetsu_address = (m_bunsetsu_address & 0x00ffff) | (data << 16);
+ break;
+ }
+}