diff --git a/hash/msx1_cart.xml b/hash/msx1_cart.xml index 932070b5aad..fd1041b74c4 100644 --- a/hash/msx1_cart.xml +++ b/hash/msx1_cart.xml @@ -13823,30 +13823,28 @@ legacy FM implementations cannot find it. --> - - - National FS-SR022 MSX-Jisho (Jpn) + + + National FS-SR022 Bunsetsu Henkan Jisho (Jpn) 1985 Matsushita + - - + + + + + + - - National FS-SR022 MSX Bunsetsu Henkan Jisho (Jpn) - 1985 - Matsushita - - - - - - - - diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 07d1c468e93..e8aac7bacc6 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -886,6 +886,8 @@ if (BUSES["MSX_SLOT"]~=null) then MAME_DIR .. "src/emu/bus/msx_cart/dooly.h", MAME_DIR .. "src/emu/bus/msx_cart/fmpac.c", MAME_DIR .. "src/emu/bus/msx_cart/fmpac.h", + MAME_DIR .. "src/emu/bus/msx_cart/fs_sr022.c", + MAME_DIR .. "src/emu/bus/msx_cart/fs_sr022.h", MAME_DIR .. "src/emu/bus/msx_cart/halnote.c", MAME_DIR .. "src/emu/bus/msx_cart/halnote.h", MAME_DIR .. "src/emu/bus/msx_cart/hfox.c", 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(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