summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/msx_cart
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/msx_cart')
-rw-r--r--src/devices/bus/msx_cart/arc.cpp24
-rw-r--r--src/devices/bus/msx_cart/arc.h10
-rw-r--r--src/devices/bus/msx_cart/ascii.cpp502
-rw-r--r--src/devices/bus/msx_cart/ascii.h105
-rw-r--r--src/devices/bus/msx_cart/cartridge.cpp83
-rw-r--r--src/devices/bus/msx_cart/cartridge.h45
-rw-r--r--src/devices/bus/msx_cart/crossblaim.cpp71
-rw-r--r--src/devices/bus/msx_cart/crossblaim.h14
-rw-r--r--src/devices/bus/msx_cart/disk.cpp304
-rw-r--r--src/devices/bus/msx_cart/disk.h51
-rw-r--r--src/devices/bus/msx_cart/dooly.cpp58
-rw-r--r--src/devices/bus/msx_cart/dooly.h14
-rw-r--r--src/devices/bus/msx_cart/easi_speech.cpp39
-rw-r--r--src/devices/bus/msx_cart/easi_speech.h10
-rw-r--r--src/devices/bus/msx_cart/fmpac.cpp150
-rw-r--r--src/devices/bus/msx_cart/fmpac.h24
-rw-r--r--src/devices/bus/msx_cart/fs_sr022.cpp33
-rw-r--r--src/devices/bus/msx_cart/fs_sr022.h10
-rw-r--r--src/devices/bus/msx_cart/halnote.cpp172
-rw-r--r--src/devices/bus/msx_cart/halnote.h26
-rw-r--r--src/devices/bus/msx_cart/hfox.cpp71
-rw-r--r--src/devices/bus/msx_cart/hfox.h17
-rw-r--r--src/devices/bus/msx_cart/holy_quran.cpp114
-rw-r--r--src/devices/bus/msx_cart/holy_quran.h26
-rw-r--r--src/devices/bus/msx_cart/ink.cpp30
-rw-r--r--src/devices/bus/msx_cart/ink.h7
-rw-r--r--src/devices/bus/msx_cart/kanji.cpp147
-rw-r--r--src/devices/bus/msx_cart/kanji.h59
-rw-r--r--src/devices/bus/msx_cart/konami.cpp976
-rw-r--r--src/devices/bus/msx_cart/konami.h107
-rw-r--r--src/devices/bus/msx_cart/korean.cpp255
-rw-r--r--src/devices/bus/msx_cart/korean.h46
-rw-r--r--src/devices/bus/msx_cart/majutsushi.cpp101
-rw-r--r--src/devices/bus/msx_cart/majutsushi.h17
-rw-r--r--src/devices/bus/msx_cart/moonsound.cpp38
-rw-r--r--src/devices/bus/msx_cart/moonsound.h11
-rw-r--r--src/devices/bus/msx_cart/msx_audio.cpp146
-rw-r--r--src/devices/bus/msx_cart/msx_audio.h31
-rw-r--r--src/devices/bus/msx_cart/msx_audio_kb.cpp30
-rw-r--r--src/devices/bus/msx_cart/msx_audio_kb.h8
-rw-r--r--src/devices/bus/msx_cart/msxdos2.cpp55
-rw-r--r--src/devices/bus/msx_cart/msxdos2.h15
-rw-r--r--src/devices/bus/msx_cart/nomapper.cpp50
-rw-r--r--src/devices/bus/msx_cart/nomapper.h6
-rw-r--r--src/devices/bus/msx_cart/rtype.cpp70
-rw-r--r--src/devices/bus/msx_cart/rtype.h16
-rw-r--r--src/devices/bus/msx_cart/super_swangi.cpp56
-rw-r--r--src/devices/bus/msx_cart/super_swangi.h16
-rw-r--r--src/devices/bus/msx_cart/superloderunner.cpp44
-rw-r--r--src/devices/bus/msx_cart/superloderunner.h12
-rw-r--r--src/devices/bus/msx_cart/yamaha.cpp118
-rw-r--r--src/devices/bus/msx_cart/yamaha.h12
52 files changed, 1552 insertions, 2900 deletions
diff --git a/src/devices/bus/msx_cart/arc.cpp b/src/devices/bus/msx_cart/arc.cpp
index 6f5af572bd1..45d31457690 100644
--- a/src/devices/bus/msx_cart/arc.cpp
+++ b/src/devices/bus/msx_cart/arc.cpp
@@ -14,50 +14,38 @@ msx_cart_arc_device::msx_cart_arc_device(const machine_config &mconfig, const ch
{
}
-
void msx_cart_arc_device::device_start()
{
+ save_item(NAME(m_7f));
+
// Install IO read/write handlers
io_space().install_write_handler(0x7f, 0x7f, write8smo_delegate(*this, FUNC(msx_cart_arc_device::io_7f_w)));
io_space().install_read_handler(0x7f, 0x7f, read8smo_delegate(*this, FUNC(msx_cart_arc_device::io_7f_r)));
}
-
void msx_cart_arc_device::device_reset()
{
m_7f = 0;
}
-
void msx_cart_arc_device::initialize_cartridge()
{
if (get_rom_size() != 0x8000)
{
fatalerror("arc: Invalid ROM size\n");
}
-}
-
-uint8_t msx_cart_arc_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0xc000)
- {
- return get_rom_base()[offset - 0x4000];
- }
- return 0xff;
+ page(1)->install_rom(0x4000, 0x7fff, get_rom_base());
+ page(2)->install_rom(0x8000, 0xbfff, get_rom_base() + 0x4000);
}
-
-void msx_cart_arc_device::io_7f_w(uint8_t data)
+void msx_cart_arc_device::io_7f_w(u8 data)
{
if (data == 0x35)
- {
m_7f++;
- }
}
-
-uint8_t msx_cart_arc_device::io_7f_r()
+u8 msx_cart_arc_device::io_7f_r()
{
return ((m_7f & 0x03) == 0x03) ? 0xda : 0xff;
}
diff --git a/src/devices/bus/msx_cart/arc.h b/src/devices/bus/msx_cart/arc.h
index 69f4427a01f..a7a31a1e285 100644
--- a/src/devices/bus/msx_cart/arc.h
+++ b/src/devices/bus/msx_cart/arc.h
@@ -14,22 +14,20 @@ DECLARE_DEVICE_TYPE(MSX_CART_ARC, msx_cart_arc_device)
class msx_cart_arc_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_arc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_arc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
-
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
- void io_7f_w(uint8_t data);
- uint8_t io_7f_r();
+ void io_7f_w(u8 data);
+ u8 io_7f_r();
- uint8_t m_7f;
+ u8 m_7f;
};
#endif // MAME_BUS_MSX_CART_ARC_H
diff --git a/src/devices/bus/msx_cart/ascii.cpp b/src/devices/bus/msx_cart/ascii.cpp
index 7d1b354b404..f183afca6f1 100644
--- a/src/devices/bus/msx_cart/ascii.cpp
+++ b/src/devices/bus/msx_cart/ascii.cpp
@@ -8,266 +8,125 @@ DEFINE_DEVICE_TYPE(MSX_CART_ASCII8, msx_cart_ascii8_device, "msx_car
DEFINE_DEVICE_TYPE(MSX_CART_ASCII16, msx_cart_ascii16_device, "msx_cart_ascii16", "MSX Cartridge - ASCII16")
DEFINE_DEVICE_TYPE(MSX_CART_ASCII8_SRAM, msx_cart_ascii8_sram_device, "msx_cart_ascii8_sram", "MSX Cartridge - ASCII8 w/SRAM")
DEFINE_DEVICE_TYPE(MSX_CART_ASCII16_SRAM, msx_cart_ascii16_sram_device, "msx_cart_ascii16_sram", "MSX Cartridge - ASCII16 w/SRAM")
-DEFINE_DEVICE_TYPE(MSX_CART_MSXWRITE, msx_cart_msxwrite_device, "msx_cart_msxwrite", "MSX Cartridge - MSXWRITE")
-msx_cart_ascii8_device::msx_cart_ascii8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_ascii8_device::msx_cart_ascii8_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_ASCII8, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
+ , m_rombank(*this, "rombank%u", 0U)
, m_bank_mask(0)
{
- for (int i = 0; i < 4; i++)
- {
- m_selected_bank[i] = 0;
- m_bank_base[i] = nullptr;
- }
-}
-
-
-void msx_cart_ascii8_device::device_start()
-{
- save_item(NAME(m_selected_bank));
-}
-
-
-void msx_cart_ascii8_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_ascii8_device::restore_banks()
-{
- for (int i = 0; i < 4; i++)
- {
- m_bank_base[i] = get_rom_base() + (m_selected_bank[i] & m_bank_mask ) * 0x2000;
- }
}
-
void msx_cart_ascii8_device::device_reset()
{
- for (auto & elem : m_selected_bank)
- {
- elem = 0;
- }
+ for (int i = 0; i < 4; i++)
+ m_rombank[i]->set_entry(0);
}
-
void msx_cart_ascii8_device::initialize_cartridge()
{
- uint32_t size = get_rom_size();
+ u32 size = get_rom_size();
+ u16 banks = size / BANK_SIZE;
- if ( size > 256 * 0x2000 )
- {
- fatalerror("ascii8: ROM is too big\n");
- }
-
- uint16_t banks = size / 0x2000;
-
- if (size != banks * 0x2000 || (~(banks - 1) % banks))
+ if (size > 256 * BANK_SIZE || size != banks * BANK_SIZE || (~(banks - 1) % banks))
{
fatalerror("ascii8: Invalid ROM size\n");
}
m_bank_mask = banks - 1;
- restore_banks();
-}
-
+ for (int i = 0; i < 4; i++)
+ m_rombank[i]->configure_entries(0, banks, get_rom_base(), BANK_SIZE);
-uint8_t msx_cart_ascii8_device::read_cart(offs_t offset)
-{
- if ( offset >= 0x4000 && offset < 0xC000 )
- {
- return m_bank_base[(offset - 0x4000) >> 13][offset & 0x1fff];
- }
- return 0xff;
+ page(1)->install_read_bank(0x4000, 0x5fff, m_rombank[0]);
+ page(1)->install_read_bank(0x6000, 0x7fff, m_rombank[1]);
+ page(1)->install_write_handler(0x6000, 0x67ff, write8smo_delegate(*this, FUNC(msx_cart_ascii8_device::bank_w<0>)));
+ page(1)->install_write_handler(0x6800, 0x6fff, write8smo_delegate(*this, FUNC(msx_cart_ascii8_device::bank_w<1>)));
+ page(1)->install_write_handler(0x7000, 0x77ff, write8smo_delegate(*this, FUNC(msx_cart_ascii8_device::bank_w<2>)));
+ page(1)->install_write_handler(0x7800, 0x7fff, write8smo_delegate(*this, FUNC(msx_cart_ascii8_device::bank_w<3>)));
+ page(2)->install_read_bank(0x8000, 0x9fff, m_rombank[2]);
+ page(2)->install_read_bank(0xa000, 0xbfff, m_rombank[3]);
}
-
-void msx_cart_ascii8_device::write_cart(offs_t offset, uint8_t data)
+template <int Bank>
+void msx_cart_ascii8_device::bank_w(u8 data)
{
- if (offset >= 0x6000 && offset < 0x8000)
- {
- uint8_t bank = (offset / 0x800) & 0x03;
-
- m_selected_bank[bank] = data;
- m_bank_base[bank] = get_rom_base() + (m_selected_bank[bank] & m_bank_mask ) * 0x2000;
- }
+ m_rombank[Bank]->set_entry(data & m_bank_mask);
}
-msx_cart_ascii16_device::msx_cart_ascii16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_ascii16_device::msx_cart_ascii16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_ASCII16, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
+ , m_rombank(*this, "rombank%u", 0U)
, m_bank_mask(0)
{
- for (int i = 0; i < 2; i++)
- {
- m_selected_bank[i] = 0;
- m_bank_base[i] = nullptr;
- }
-}
-
-
-void msx_cart_ascii16_device::device_start()
-{
- save_item(NAME(m_selected_bank));
-}
-
-
-void msx_cart_ascii16_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_ascii16_device::restore_banks()
-{
- for (int i = 0; i < 2; i++)
- {
- m_bank_base[i] = get_rom_base() + (m_selected_bank[i] & m_bank_mask) * 0x4000;
- }
}
-
void msx_cart_ascii16_device::device_reset()
{
- for (auto & elem : m_selected_bank)
- {
- elem = 0;
- }
+ m_rombank[0]->set_entry(0);
+ m_rombank[1]->set_entry(0);
}
-
void msx_cart_ascii16_device::initialize_cartridge()
{
- uint32_t size = get_rom_size();
-
- if ( size > 256 * 0x4000 )
- {
- fatalerror("ascii16: ROM is too big\n");
- }
-
- uint16_t banks = size / 0x4000;
+ u32 size = get_rom_size();
+ u16 banks = size / BANK_SIZE;
- if (size != banks * 0x4000 || (~(banks - 1) % banks))
+ if (size > 256 * BANK_SIZE || size != banks * BANK_SIZE || (~(banks - 1) % banks))
{
fatalerror("ascii16: Invalid ROM size\n");
}
m_bank_mask = banks - 1;
- restore_banks();
-}
-
+ for (int i = 0; i < 2; i++)
+ m_rombank[i]->configure_entries(0, banks, get_rom_base(), BANK_SIZE);
-uint8_t msx_cart_ascii16_device::read_cart(offs_t offset)
-{
- if ( offset >= 0x4000 && offset < 0xC000 )
- {
- return m_bank_base[offset >> 15][offset & 0x3fff];
- }
- return 0xff;
+ page(1)->install_read_bank(0x4000, 0x7fff, m_rombank[0]);
+ page(1)->install_write_handler(0x6000, 0x67ff, write8smo_delegate(*this, FUNC(msx_cart_ascii16_device::bank_w<0>)));
+ page(1)->install_write_handler(0x7000, 0x77ff, write8smo_delegate(*this, FUNC(msx_cart_ascii16_device::bank_w<1>)));
+ page(2)->install_read_bank(0x8000, 0xbfff, m_rombank[1]);
}
-
-void msx_cart_ascii16_device::write_cart(offs_t offset, uint8_t data)
+template <int Bank>
+void msx_cart_ascii16_device::bank_w(u8 data)
{
- if (offset >= 0x6000 && offset < 0x6800)
- {
- m_selected_bank[0] = data;
- m_bank_base[0] = get_rom_base() + (m_selected_bank[0] & m_bank_mask) * 0x4000;
- }
-
- if (offset >= 0x7000 && offset < 0x7800)
- {
- m_selected_bank[1] = data;
- m_bank_base[1] = get_rom_base() + (m_selected_bank[1] & m_bank_mask) * 0x4000;
- }
+ m_rombank[Bank]->set_entry(data & m_bank_mask);
}
-msx_cart_ascii8_sram_device::msx_cart_ascii8_sram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_ascii8_sram_device::msx_cart_ascii8_sram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_ASCII8_SRAM, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
+ , m_rombank(*this, "rombank%u", 0U)
+ , m_view2(*this, "view2")
+ , m_view3(*this, "view3")
, m_bank_mask(0)
, m_sram_select_mask(0)
{
- for (int i = 0; i < 4; i++)
- {
- m_selected_bank[i] = 0;
- m_bank_base[i] = nullptr;
- }
-}
-
-
-void msx_cart_ascii8_sram_device::device_start()
-{
- save_item(NAME(m_selected_bank));
-}
-
-
-void msx_cart_ascii8_sram_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_ascii8_sram_device::setup_bank(uint8_t bank)
-{
- if (m_selected_bank[bank] & ~(m_sram_select_mask | m_bank_mask))
- {
- // Nothing is mapped
- m_bank_base[bank] = nullptr;
- }
- else if (m_selected_bank[bank] & m_sram_select_mask)
- {
- // SRAM is selected
- m_bank_base[bank] = get_sram_base();
- }
- else
- {
- m_bank_base[bank] = get_rom_base() + (m_selected_bank[bank] & m_bank_mask ) * 0x2000;
- }
-}
-
-
-void msx_cart_ascii8_sram_device::restore_banks()
-{
- for (int i = 0; i < 4; i++)
- {
- setup_bank(i);
- }
}
-
void msx_cart_ascii8_sram_device::device_reset()
{
- for (auto & elem : m_selected_bank)
- {
- elem = 0;
- }
+ for (int i = 0; i < 4; i++)
+ m_rombank[i]->set_entry(0);
+ m_view2.select(0);
+ m_view3.select(0);
}
-
void msx_cart_ascii8_sram_device::initialize_cartridge()
{
- uint32_t size = get_rom_size();
+ u32 size = get_rom_size();
+ u16 banks = size / BANK_SIZE;
- if ( size > 128 * 0x2000 )
- {
- fatalerror("ascii8_sram: ROM is too big\n");
- }
-
- uint16_t banks = size / 0x2000;
-
- if (size != banks * 0x2000 || (~(banks - 1) % banks))
+ if (size > 128 * BANK_SIZE || size != banks * BANK_SIZE || (~(banks - 1) % banks))
{
fatalerror("ascii8_sram: Invalid ROM size\n");
}
@@ -280,127 +139,74 @@ void msx_cart_ascii8_sram_device::initialize_cartridge()
m_bank_mask = banks - 1;
m_sram_select_mask = banks;
- restore_banks();
-}
-
-
-uint8_t msx_cart_ascii8_sram_device::read_cart(offs_t offset)
-{
- if ( offset >= 0x4000 && offset < 0xC000 )
- {
- uint8_t *bank_base = m_bank_base[(offset - 0x4000) >> 13];
+ for (int i = 0; i < 4; i++)
+ m_rombank[i]->configure_entries(0, banks, get_rom_base(), BANK_SIZE);
- if (bank_base != nullptr)
- {
- return bank_base[offset & 0x1fff];
- }
- }
- return 0xff;
+ page(1)->install_read_bank(0x4000, 0x5fff, m_rombank[0]);
+ page(1)->install_read_bank(0x6000, 0x7fff, m_rombank[1]);
+ page(1)->install_write_handler(0x6000, 0x7fff, write8sm_delegate(*this, FUNC(msx_cart_ascii8_sram_device::mapper_write)));
+ page(2)->install_view(0x8000, 0x9fff, m_view2);
+ m_view2[0].install_read_bank(0x8000, 0x9fff, m_rombank[2]);
+ m_view2[1].install_ram(0x8000, 0x9fff, get_sram_base());
+ page(2)->install_view(0xa000, 0xbfff, m_view3);
+ m_view3[0].install_read_bank(0xa000, 0xbfff, m_rombank[3]);
+ m_view3[1].install_ram(0xa000, 0xbfff, get_sram_base());
}
-
-void msx_cart_ascii8_sram_device::write_cart(offs_t offset, uint8_t data)
+void msx_cart_ascii8_sram_device::mapper_write(offs_t offset, u8 data)
{
- if (offset >= 0x6000 && offset < 0x8000)
+ u8 bank = (offset / 0x800) & 0x03;
+ if (data & m_sram_select_mask)
{
- uint8_t bank = (offset / 0x800) & 0x03;
-
- m_selected_bank[bank] = data;
- setup_bank(bank);
+ if (bank == 2)
+ m_view2.select(1);
+ if (bank == 3)
+ m_view3.select(1);
}
- else if (offset >= 0x8000 && offset < 0xc000)
+ else
{
- uint8_t bank = (offset & 0x2000) ? 3 : 2;
+ if (bank == 2)
+ m_view2.select(0);
+ if (bank == 3)
+ m_view3.select(0);
- if ((m_selected_bank[bank] & m_sram_select_mask) && !(m_selected_bank[bank] & ~(m_sram_select_mask | m_bank_mask)))
- {
- // Write to SRAM
- m_bank_base[bank][offset & 0x1fff] = data;
- }
+ m_rombank[bank]->set_entry(data & m_bank_mask);
}
}
-msx_cart_ascii16_sram_device::msx_cart_ascii16_sram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+
+msx_cart_ascii16_sram_device::msx_cart_ascii16_sram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_ASCII16_SRAM, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
+ , m_rombank(*this, "rombank%u", 0U)
+ , m_view(*this, "view")
, m_bank_mask(0)
, m_sram_select_mask(0)
{
- for (int i = 0; i < 2; i++)
- {
- m_selected_bank[i] = 0;
- m_bank_base[i] = nullptr;
- }
}
-
void msx_cart_ascii16_sram_device::device_start()
{
- save_item(NAME(m_selected_bank));
-}
-
-
-void msx_cart_ascii16_sram_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_ascii16_sram_device::setup_bank(uint8_t bank)
-{
- if (m_selected_bank[bank] & ~(m_sram_select_mask | m_bank_mask))
- {
- // Nothing is mapped
- m_bank_base[bank] = nullptr;
- }
- else if (m_selected_bank[bank] & m_sram_select_mask)
- {
- // SRAM is selected
- m_bank_base[bank] = get_sram_base();
- }
- else
- {
- m_bank_base[bank] = get_rom_base() + (m_selected_bank[bank] & m_bank_mask) * 0x4000;
- }
-}
-
-
-void msx_cart_ascii16_sram_device::restore_banks()
-{
- for (int i = 0; i < 2; i++)
- {
- setup_bank(i);
- }
}
-
void msx_cart_ascii16_sram_device::device_reset()
{
- for (auto & elem : m_selected_bank)
- {
- elem = 0;
- }
+ m_rombank[0]->set_entry(0);
+ m_view.select(0);
+ m_rombank[1]->set_entry(0);
}
-
void msx_cart_ascii16_sram_device::initialize_cartridge()
{
- uint32_t size = get_rom_size();
+ u32 size = get_rom_size();
+ u16 banks = size / BANK_SIZE;
- if ( size > 128 * 0x4000 )
- {
- fatalerror("ascii16_sram: ROM is too big\n");
- }
-
- uint16_t banks = size / 0x4000;
-
- if (size != banks * 0x4000 || (~(banks - 1) % banks))
+ if (size > 128 * BANK_SIZE || size != banks * BANK_SIZE || (~(banks - 1) % banks))
{
fatalerror("ascii16_sram: Invalid ROM size\n");
}
-
if (get_sram_size() != 0x800)
{
fatalerror("ascii16_sram: Unsupported SRAM size\n");
@@ -409,147 +215,31 @@ void msx_cart_ascii16_sram_device::initialize_cartridge()
m_bank_mask = banks - 1;
m_sram_select_mask = banks;
- restore_banks();
-}
-
-
-uint8_t msx_cart_ascii16_sram_device::read_cart(offs_t offset)
-{
- if ( offset >= 0x4000 && offset < 0xC000 )
- {
- uint8_t bank = offset >> 15;
-
- if (m_bank_base[bank] != nullptr)
- {
- if (m_selected_bank[bank] & m_sram_select_mask)
- {
- return m_bank_base[bank][offset & 0x7ff];
- }
- else
- {
- return m_bank_base[bank][offset & 0x3fff];
- }
- }
- }
- return 0xff;
-}
-
-
-void msx_cart_ascii16_sram_device::write_cart(offs_t offset, uint8_t data)
-{
- if (offset >= 0x6000 && offset < 0x6800)
- {
- m_selected_bank[0] = data;
- setup_bank(0);
- }
-
- if (offset >= 0x7000 && offset < 0x7800)
- {
- m_selected_bank[1] = data;
- setup_bank(1);
- }
-
- if (offset >= 0x8000 && offset < 0xc000)
- {
- if ((m_selected_bank[1] & m_sram_select_mask) && !(m_selected_bank[1] & ~(m_sram_select_mask | m_bank_mask)))
- {
- // Write to SRAM
- m_bank_base[1][offset & 0x7ff] = data;
- }
- }
-}
-
-
-
-msx_cart_msxwrite_device::msx_cart_msxwrite_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, MSX_CART_MSXWRITE, tag, owner, clock)
- , msx_cart_interface(mconfig, *this)
- , m_bank_mask(0)
-{
for (int i = 0; i < 2; i++)
- {
- m_selected_bank[i] = 0;
- m_bank_base[i] = nullptr;
- }
-}
-
+ m_rombank[i]->configure_entries(0, banks, get_rom_base(), BANK_SIZE);
-void msx_cart_msxwrite_device::device_start()
-{
- save_item(NAME(m_selected_bank));
+ page(1)->install_read_bank(0x4000, 0x7fff, m_rombank[0]);
+ page(1)->install_write_handler(0x6000, 0x67ff, write8smo_delegate(*this, FUNC(msx_cart_ascii16_sram_device::mapper_write_6000)));
+ page(1)->install_write_handler(0x7000, 0x77ff, write8smo_delegate(*this, FUNC(msx_cart_ascii16_sram_device::mapper_write_7000)));
+ page(2)->install_view(0x8000, 0xbfff, m_view);
+ m_view[0].install_read_bank(0x8000, 0xbfff, m_rombank[1]);
+ m_view[1].install_ram(0x8000, 0x87ff, 0x3800, get_sram_base());
}
-
-void msx_cart_msxwrite_device::device_post_load()
+void msx_cart_ascii16_sram_device::mapper_write_6000(u8 data)
{
- restore_banks();
+ m_rombank[0]->set_entry(data & m_bank_mask);
}
-
-void msx_cart_msxwrite_device::restore_banks()
+void msx_cart_ascii16_sram_device::mapper_write_7000(u8 data)
{
- for (int i = 0; i < 2; i++)
+ if (data & m_sram_select_mask)
{
- m_bank_base[i] = get_rom_base() + (m_selected_bank[i] & m_bank_mask) * 0x4000;
+ m_view.select(1);
}
-}
-
-
-void msx_cart_msxwrite_device::device_reset()
-{
- for (auto & elem : m_selected_bank)
- {
- elem = 0;
- }
-}
-
-
-void msx_cart_msxwrite_device::initialize_cartridge()
-{
- uint32_t size = get_rom_size();
-
- if ( size > 256 * 0x4000 )
- {
- fatalerror("msxwrite: ROM is too big\n");
- }
-
- uint16_t banks = size / 0x4000;
-
- if (size != banks * 0x4000 || (~(banks - 1) % banks))
- {
- fatalerror("msxwrite: Invalid ROM size\n");
- }
-
- m_bank_mask = banks - 1;
-
- restore_banks();
-}
-
-
-uint8_t msx_cart_msxwrite_device::read_cart(offs_t offset)
-{
- if ( offset >= 0x4000 && offset < 0xC000 )
- {
- return m_bank_base[offset >> 15][offset & 0x3fff];
- }
- return 0xff;
-}
-
-
-void msx_cart_msxwrite_device::write_cart(offs_t offset, uint8_t data)
-{
- // The rom writes to 6fff and 7fff for banking, unknown whether
- // other locations also trigger banking.
- switch (offset)
+ else
{
- case 0x6fff:
- m_selected_bank[0] = data;
- m_bank_base[0] = get_rom_base() + (m_selected_bank[0] & m_bank_mask) * 0x4000;
- break;
-
- case 0x7fff:
- m_selected_bank[1] = data;
- m_bank_base[1] = get_rom_base() + (m_selected_bank[1] & m_bank_mask) * 0x4000;
- break;
+ m_view.select(0);
+ m_rombank[1]->set_entry(data & m_bank_mask);
}
}
diff --git a/src/devices/bus/msx_cart/ascii.h b/src/devices/bus/msx_cart/ascii.h
index 0c5898fed40..9c41cac2789 100644
--- a/src/devices/bus/msx_cart/ascii.h
+++ b/src/devices/bus/msx_cart/ascii.h
@@ -12,84 +12,74 @@ DECLARE_DEVICE_TYPE(MSX_CART_ASCII8, msx_cart_ascii8_device)
DECLARE_DEVICE_TYPE(MSX_CART_ASCII16, msx_cart_ascii16_device)
DECLARE_DEVICE_TYPE(MSX_CART_ASCII8_SRAM, msx_cart_ascii8_sram_device)
DECLARE_DEVICE_TYPE(MSX_CART_ASCII16_SRAM, msx_cart_ascii16_sram_device)
-DECLARE_DEVICE_TYPE(MSX_CART_MSXWRITE, msx_cart_msxwrite_device)
class msx_cart_ascii8_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_ascii8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_ascii8_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
private:
- uint8_t m_bank_mask;
- uint8_t m_selected_bank[4];
- uint8_t *m_bank_base[4];
+ static constexpr size_t BANK_SIZE = 0x2000;
+
+ template <int Bank> void bank_w(u8 data);
+
+ memory_bank_array_creator<4> m_rombank;
+ u8 m_bank_mask;
};
class msx_cart_ascii16_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_ascii16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_ascii16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
private:
- uint8_t m_bank_mask;
- uint8_t m_selected_bank[2];
- uint8_t *m_bank_base[2];
+ static constexpr size_t BANK_SIZE = 0x4000;
+
+ template <int Bank> void bank_w(u8 data);
+
+ memory_bank_array_creator<2> m_rombank;
+ u8 m_bank_mask;
};
class msx_cart_ascii8_sram_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_ascii8_sram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_ascii8_sram_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
private:
- uint8_t m_bank_mask;
- uint8_t m_selected_bank[4];
- uint8_t *m_bank_base[4];
- uint8_t m_sram_select_mask;
+ static constexpr size_t BANK_SIZE = 0x2000;
+
+ void mapper_write(offs_t offset, u8 data);
- void setup_bank(uint8_t bank);
+ memory_bank_array_creator<4> m_rombank;
+ memory_view m_view2;
+ memory_view m_view3;
+ u8 m_bank_mask;
+ u8 m_sram_select_mask;
};
@@ -100,49 +90,22 @@ public:
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
private:
- uint8_t m_bank_mask;
- uint8_t m_selected_bank[2];
- uint8_t *m_bank_base[2];
- uint8_t m_sram_select_mask;
+ static constexpr size_t BANK_SIZE = 0x4000;
- void setup_bank(uint8_t bank);
-};
-
-
-class msx_cart_msxwrite_device : public device_t, public msx_cart_interface
-{
-public:
- msx_cart_msxwrite_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- virtual void initialize_cartridge() override;
-
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
+ void mapper_write_6000(u8 data);
+ void mapper_write_7000(u8 data);
-protected:
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
-
-private:
- uint8_t m_bank_mask;
- uint8_t m_selected_bank[2];
- uint8_t *m_bank_base[2];
+ memory_bank_array_creator<2> m_rombank;
+ memory_view m_view;
+ u8 m_bank_mask;
+ u8 m_sram_select_mask;
};
+
#endif // MAME_BUS_MSX_CART_ASCII_H
diff --git a/src/devices/bus/msx_cart/cartridge.cpp b/src/devices/bus/msx_cart/cartridge.cpp
index 4bda712eabe..a764f61f03c 100644
--- a/src/devices/bus/msx_cart/cartridge.cpp
+++ b/src/devices/bus/msx_cart/cartridge.cpp
@@ -16,6 +16,7 @@
#include "hfox.h"
#include "holy_quran.h"
#include "ink.h"
+#include "kanji.h"
#include "konami.h"
#include "korean.h"
#include "majutsushi.h"
@@ -33,44 +34,45 @@
void msx_cart(device_slot_interface &device)
{
- device.option_add_internal("nomapper", MSX_CART_NOMAPPER);
- device.option_add_internal("msxdos2", MSX_CART_MSXDOS2);
- device.option_add_internal("konami_scc", MSX_CART_KONAMI_SCC);
- device.option_add_internal("konami", MSX_CART_KONAMI);
+ device.option_add_internal("arc", MSX_CART_ARC);
device.option_add_internal("ascii8", MSX_CART_ASCII8);
- device.option_add_internal("ascii16", MSX_CART_ASCII16);
- device.option_add_internal("gamemaster2", MSX_CART_GAMEMASTER2);
device.option_add_internal("ascii8_sram", MSX_CART_ASCII8_SRAM);
+ device.option_add_internal("ascii16", MSX_CART_ASCII16);
device.option_add_internal("ascii16_sram", MSX_CART_ASCII16_SRAM);
- device.option_add_internal("rtype", MSX_CART_RTYPE);
- device.option_add_internal("majutsushi", MSX_CART_MAJUTSUSHI);
+ device.option_add_internal("cross_blaim", MSX_CART_CROSSBLAIM);
+ device.option_add_internal("disk_vy0010", MSX_CART_VY0010);
+ device.option_add_internal("disk_fsfd1", MSX_CART_FSFD1);
+ device.option_add_internal("disk_fsfd1a", MSX_CART_FSFD1A);
+ device.option_add_internal("disk_fscf351", MSX_CART_FSCF351);
+ device.option_add_internal("dooly", MSX_CART_DOOLY);
+ device.option_add_internal("easispeech", MSX_CART_EASISPEECH);
device.option_add_internal("fmpac", MSX_CART_FMPAC);
device.option_add_internal("fs_sr022", MSX_CART_FS_SR022);
- device.option_add_internal("superloderunner", MSX_CART_SUPERLODERUNNER);
- device.option_add_internal("synthesizer", MSX_CART_SYNTHESIZER);
- device.option_add_internal("easispeech", MSX_CART_EASISPEECH);
- device.option_add_internal("cross_blaim", MSX_CART_CROSSBLAIM);
+ device.option_add_internal("gamemaster2", MSX_CART_GAMEMASTER2);
+ device.option_add_internal("halnote", MSX_CART_HALNOTE);
+ device.option_add_internal("hfox", MSX_CART_HFOX);
+ device.option_add_internal("holy_quran", MSX_CART_HOLY_QURAN);
+ device.option_add_internal("ink", MSX_CART_INK);
+ device.option_add_internal("kanji", MSX_CART_KANJI);
+ device.option_add_internal("keyboard_master", MSX_CART_KEYBOARD_MASTER);
+ device.option_add_internal("konami", MSX_CART_KONAMI);
+ device.option_add_internal("konami_scc", MSX_CART_KONAMI_SCC);
device.option_add_internal("korean_80in1", MSX_CART_KOREAN_80IN1);
device.option_add_internal("korean_90in1", MSX_CART_KOREAN_90IN1);
device.option_add_internal("korean_126in1", MSX_CART_KOREAN_126IN1);
+ device.option_add_internal("majutsushi", MSX_CART_MAJUTSUSHI);
+ device.option_add_internal("msxaud_fsca1", MSX_CART_MSX_AUDIO_FSCA1);
+ device.option_add_internal("msxaud_hxmu900", MSX_CART_MSX_AUDIO_HXMU900);
+ device.option_add_internal("msxaud_nms1205", MSX_CART_MSX_AUDIO_NMS1205);
+ device.option_add_internal("msxdos2", MSX_CART_MSXDOS2);
device.option_add_internal("msxwrite", MSX_CART_MSXWRITE);
+ device.option_add_internal("nomapper", MSX_CART_NOMAPPER);
+ device.option_add_internal("rtype", MSX_CART_RTYPE);
device.option_add_internal("sound_snatcher", MSX_CART_SOUND_SNATCHER);
device.option_add_internal("sound_sdsnatch", MSX_CART_SOUND_SDSNATCHER);
- device.option_add_internal("msxaud_hxmu900", MSX_CART_MSX_AUDIO_HXMU900);
- device.option_add_internal("msxaud_fsca1", MSX_CART_MSX_AUDIO_FSCA1);
- device.option_add_internal("msxaud_nms1205", MSX_CART_MSX_AUDIO_NMS1205);
device.option_add_internal("super_swangi", MSX_CART_SUPER_SWANGI);
- device.option_add_internal("hfox", MSX_CART_HFOX);
- device.option_add_internal("ink", MSX_CART_INK);
- device.option_add_internal("keyboard_master", MSX_CART_KEYBOARD_MASTER);
- device.option_add_internal("holy_quran", MSX_CART_HOLY_QURAN);
- device.option_add_internal("dooly", MSX_CART_DOOLY);
- device.option_add_internal("halnote", MSX_CART_HALNOTE);
- device.option_add_internal("arc", MSX_CART_ARC);
- device.option_add_internal("disk_vy0010", MSX_CART_VY0010);
- device.option_add_internal("disk_fsfd1", MSX_CART_FSFD1);
- device.option_add_internal("disk_fsfd1a", MSX_CART_FSFD1A);
- device.option_add_internal("disk_fscf351", MSX_CART_FSCF351);
+ device.option_add_internal("superloderunner", MSX_CART_SUPERLODERUNNER);
+ device.option_add_internal("synthesizer", MSX_CART_SYNTHESIZER);
device.option_add("bm_012", MSX_CART_BM_012);
device.option_add("moonsound", MSX_CART_MOONSOUND);
}
@@ -80,32 +82,40 @@ msx_cart_interface::msx_cart_interface(const machine_config &mconfig, device_t &
: device_interface(device, "msxcart")
, m_exp(nullptr)
{
+ for (int i = 0; i < 4; i++)
+ m_page[i] = nullptr;
}
-void msx_cart_interface::rom_alloc(uint32_t size)
+void msx_cart_interface::rom_alloc(u32 size)
{
m_rom.resize(size);
std::fill_n(m_rom.begin(), size, 0xff);
}
-void msx_cart_interface::rom_vlm5030_alloc(uint32_t size)
+void msx_cart_interface::rom_vlm5030_alloc(u32 size)
{
m_rom_vlm5030.resize(size);
std::fill_n(m_rom_vlm5030.begin(), size, 0xff);
}
-void msx_cart_interface::ram_alloc(uint32_t size)
+void msx_cart_interface::ram_alloc(u32 size)
{
m_ram.resize(size);
std::fill_n(m_ram.begin(), size, 0x00);
}
-void msx_cart_interface::sram_alloc(uint32_t size)
+void msx_cart_interface::sram_alloc(u32 size)
{
m_sram.resize(size);
std::fill_n(m_sram.begin(), size, 0x00);
}
+void msx_cart_interface::kanji_alloc(u32 size)
+{
+ m_kanji.resize(size);
+ std::fill_n(m_kanji.begin(), size, 0x00);
+}
+
WRITE_LINE_MEMBER(msx_cart_interface::irq_out)
{
m_exp->irq_out(state);
@@ -121,6 +131,19 @@ address_space &msx_cart_interface::io_space() const
return m_exp->io_space();
}
+cpu_device &msx_cart_interface::maincpu() const
+{
+ return m_exp->maincpu();
+}
+
+void msx_cart_interface::set_views(memory_view::memory_view_entry *page0, memory_view::memory_view_entry *page1, memory_view::memory_view_entry *page2, memory_view::memory_view_entry *page3)
+{
+ m_page[0] = page0;
+ m_page[1] = page1;
+ m_page[2] = page2;
+ m_page[3] = page3;
+}
+
// Several yamaha machines had 60 pin expansion slots. The pinouts of these slots was
// exactly the same as the regular 50 pin cartridge slots. The lowest 10 pins are simply
diff --git a/src/devices/bus/msx_cart/cartridge.h b/src/devices/bus/msx_cart/cartridge.h
index 73759baf544..ac0fb3edb22 100644
--- a/src/devices/bus/msx_cart/cartridge.h
+++ b/src/devices/bus/msx_cart/cartridge.h
@@ -23,37 +23,42 @@ public:
virtual void initialize_cartridge() { }
virtual void interface_pre_start() override { assert(m_exp != nullptr); }
- // reading and writing
- virtual uint8_t read_cart(offs_t offset) { return 0xff; }
- virtual void write_cart(offs_t offset, uint8_t data) { }
+ void set_views(memory_view::memory_view_entry *page0, memory_view::memory_view_entry *page1, memory_view::memory_view_entry *page2, memory_view::memory_view_entry *page3);
DECLARE_WRITE_LINE_MEMBER(irq_out);
address_space &memory_space() const;
address_space &io_space() const;
+ cpu_device &maincpu() const;
// ROM/RAM/SRAM management
// Mainly used by the cartridge slot when loading images
- void rom_alloc(uint32_t size);
- void ram_alloc(uint32_t size);
- void rom_vlm5030_alloc(uint32_t size);
- void sram_alloc(uint32_t size);
-
- uint8_t* get_rom_base() { return &m_rom[0]; }
- uint8_t* get_rom_vlm5030_base() { return &m_rom_vlm5030[0]; }
- uint8_t* get_ram_base() { return &m_ram[0]; }
- uint8_t* get_sram_base() { return &m_sram[0]; }
- uint32_t get_rom_size() { return m_rom.size(); }
- uint32_t get_rom_vlm5030_size() { return m_rom_vlm5030.size(); }
- uint32_t get_ram_size() { return m_ram.size(); }
- uint32_t get_sram_size() { return m_sram.size(); }
+ void rom_alloc(u32 size);
+ void ram_alloc(u32 size);
+ void rom_vlm5030_alloc(u32 size);
+ void sram_alloc(u32 size);
+ void kanji_alloc(u32 size);
+
+ u8* get_rom_base() { return &m_rom[0]; }
+ u8* get_rom_vlm5030_base() { return &m_rom_vlm5030[0]; }
+ u8* get_ram_base() { return &m_ram[0]; }
+ u8* get_sram_base() { return &m_sram[0]; }
+ u8* get_kanji_base() { return &m_kanji[0]; }
+ u32 get_rom_size() { return m_rom.size(); }
+ u32 get_rom_vlm5030_size() { return m_rom_vlm5030.size(); }
+ u32 get_ram_size() { return m_ram.size(); }
+ u32 get_sram_size() { return m_sram.size(); }
+ u32 get_kanji_size() { return m_kanji.size(); }
+ memory_view::memory_view_entry *page(int i) { return m_page[i]; }
protected:
msx_cart_interface(const machine_config &mconfig, device_t &device);
- std::vector<uint8_t> m_rom;
- std::vector<uint8_t> m_ram;
- std::vector<uint8_t> m_rom_vlm5030;
- std::vector<uint8_t> m_sram;
+ std::vector<u8> m_rom;
+ std::vector<u8> m_ram;
+ std::vector<u8> m_rom_vlm5030;
+ std::vector<u8> m_sram;
+ std::vector<u8> m_kanji;
+ memory_view::memory_view_entry *m_page[4];
private:
msx_slot_cartridge_device *m_exp;
diff --git a/src/devices/bus/msx_cart/crossblaim.cpp b/src/devices/bus/msx_cart/crossblaim.cpp
index 6494e492f5b..1d30ec07f4f 100644
--- a/src/devices/bus/msx_cart/crossblaim.cpp
+++ b/src/devices/bus/msx_cart/crossblaim.cpp
@@ -9,48 +9,10 @@ DEFINE_DEVICE_TYPE(MSX_CART_CROSSBLAIM, msx_cart_crossblaim_device, "msx_cart_cr
msx_cart_crossblaim_device::msx_cart_crossblaim_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MSX_CART_CROSSBLAIM, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
- , m_selected_bank(1)
+ , m_rombank(*this, "rombank")
{
- for (auto & elem : m_bank_base)
- {
- elem = nullptr;
- }
-}
-
-
-void msx_cart_crossblaim_device::device_start()
-{
- save_item(NAME(m_selected_bank));
-}
-
-
-void msx_cart_crossblaim_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_crossblaim_device::setup_bank()
-{
- m_bank_base[0] = ( m_selected_bank & 2 ) ? nullptr : get_rom_base() + ( m_selected_bank & 0x03 ) * 0x4000;
- m_bank_base[2] = get_rom_base() + ( m_selected_bank & 0x03 ) * 0x4000;
- m_bank_base[3] = ( m_selected_bank & 2 ) ? nullptr : get_rom_base() + ( m_selected_bank & 0x03 ) * 0x4000;
-}
-
-
-void msx_cart_crossblaim_device::restore_banks()
-{
- m_bank_base[1] = get_rom_base();
- setup_bank();
-}
-
-
-void msx_cart_crossblaim_device::device_reset()
-{
- m_selected_bank = 1;
}
-
void msx_cart_crossblaim_device::initialize_cartridge()
{
if (get_rom_size() != 0x10000)
@@ -58,29 +20,18 @@ void msx_cart_crossblaim_device::initialize_cartridge()
fatalerror("crossblaim: Invalid ROM size\n");
}
- restore_banks();
-}
-
+ m_rombank->configure_entries(0, 4, get_rom_base(), 0x4000);
-uint8_t msx_cart_crossblaim_device::read_cart(offs_t offset)
-{
- uint8_t *bank_base = m_bank_base[offset >> 14];
-
- if (bank_base != nullptr)
- {
- return bank_base[offset & 0x3fff];
- }
-
- return 0xff;
+ page(1)->install_rom(0x4000, 0x7fff, get_rom_base());
+ page(1)->install_write_handler(0x4045, 0x4045, write8smo_delegate(*this, FUNC(msx_cart_crossblaim_device::mapper_write)));
+ page(2)->install_read_bank(0x8000, 0xbfff, m_rombank);
}
-
-void msx_cart_crossblaim_device::write_cart(offs_t offset, uint8_t data)
+void msx_cart_crossblaim_device::mapper_write(u8 data)
{
- m_selected_bank = data & 3;
- if (m_selected_bank == 0)
- {
- m_selected_bank = 1;
- }
- setup_bank();
+ data &= 0x03;
+ if (!data)
+ data = 1;
+
+ m_rombank->set_entry(data);
}
diff --git a/src/devices/bus/msx_cart/crossblaim.h b/src/devices/bus/msx_cart/crossblaim.h
index 04a44c1d905..617ff59d1cd 100644
--- a/src/devices/bus/msx_cart/crossblaim.h
+++ b/src/devices/bus/msx_cart/crossblaim.h
@@ -18,22 +18,14 @@ public:
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
+ virtual void device_start() override { }
private:
- uint8_t m_selected_bank;
- uint8_t *m_bank_base[4];
+ void mapper_write(u8 data);
- void setup_bank();
+ memory_bank_creator m_rombank;
};
diff --git a/src/devices/bus/msx_cart/disk.cpp b/src/devices/bus/msx_cart/disk.cpp
index b07d9dd6dc0..bff8716439f 100644
--- a/src/devices/bus/msx_cart/disk.cpp
+++ b/src/devices/bus/msx_cart/disk.cpp
@@ -102,6 +102,7 @@
#include "emu.h"
#include "disk.h"
+#include "formats/dmk_dsk.h"
#include "formats/msx_dsk.h"
#include "softlist_dev.h"
@@ -115,6 +116,7 @@ void msx_cart_disk_device::floppy_formats(format_registration &fr)
{
fr.add_mfm_containers();
fr.add(FLOPPY_MSX_FORMAT);
+ fr.add(FLOPPY_DMK_FORMAT);
}
@@ -125,7 +127,7 @@ static void msx_floppies(device_slot_interface &device)
}
-msx_cart_disk_device::msx_cart_disk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_disk_device::msx_cart_disk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, type, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
, m_floppy0(*this, "fdc:0")
@@ -135,14 +137,14 @@ msx_cart_disk_device::msx_cart_disk_device(const machine_config &mconfig, device
}
-msx_cart_disk_wd_device::msx_cart_disk_wd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_disk_wd_device::msx_cart_disk_wd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: msx_cart_disk_device(mconfig, type, tag, owner, clock)
, m_fdc(*this, "fdc")
{
}
-msx_cart_disk_type1_device::msx_cart_disk_type1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_disk_type1_device::msx_cart_disk_type1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: msx_cart_disk_wd_device(mconfig, type, tag, owner, clock)
, m_led(*this, "led0")
, m_side_control(0)
@@ -151,7 +153,7 @@ msx_cart_disk_type1_device::msx_cart_disk_type1_device(const machine_config &mco
}
-msx_cart_disk_type2_device::msx_cart_disk_type2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_disk_type2_device::msx_cart_disk_type2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: msx_cart_disk_wd_device(mconfig, type, tag, owner, clock)
, m_led(*this, "led0")
, m_control(0)
@@ -159,32 +161,32 @@ msx_cart_disk_type2_device::msx_cart_disk_type2_device(const machine_config &mco
}
-msx_cart_vy0010_device::msx_cart_vy0010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_vy0010_device::msx_cart_vy0010_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: msx_cart_disk_type1_device(mconfig, MSX_CART_VY0010, tag, owner, clock)
{
}
-msx_cart_fsfd1_device::msx_cart_fsfd1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_fsfd1_device::msx_cart_fsfd1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: msx_cart_disk_type1_device(mconfig, MSX_CART_FSFD1, tag, owner, clock)
{
}
-msx_cart_fscf351_device::msx_cart_fscf351_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_fscf351_device::msx_cart_fscf351_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: msx_cart_disk_type2_device(mconfig, MSX_CART_FSCF351, tag, owner, clock)
{
}
-msx_cart_disk_tc8566_device::msx_cart_disk_tc8566_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_disk_tc8566_device::msx_cart_disk_tc8566_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: msx_cart_disk_device(mconfig, type, tag, owner, clock)
, m_fdc(*this, "fdc")
{
}
-msx_cart_fsfd1a_device::msx_cart_fsfd1a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_fsfd1a_device::msx_cart_fsfd1a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: msx_cart_disk_tc8566_device(mconfig, MSX_CART_FSFD1A, tag, owner, clock)
{
}
@@ -192,7 +194,7 @@ msx_cart_fsfd1a_device::msx_cart_fsfd1a_device(const machine_config &mconfig, co
void msx_cart_disk_device::initialize_cartridge()
{
- if ( get_rom_size() != 0x4000 )
+ if (get_rom_size() != 0x4000)
{
fatalerror("msx_cart_disk_device: Invalid ROM size\n");
}
@@ -219,6 +221,7 @@ void msx_cart_vy0010_device::device_add_mconfig(machine_config &config)
SOFTWARE_LIST(config, "msx1_flop_list").set_compatible("msx1_flop");
}
+
void msx_cart_fsfd1_device::device_add_mconfig(machine_config &config)
{
WD2793(config, m_fdc, 4_MHz_XTAL / 4);
@@ -276,6 +279,41 @@ void msx_cart_disk_type1_device::device_start()
save_item(NAME(m_control));
}
+void msx_cart_disk_type1_device::initialize_cartridge()
+{
+ msx_cart_disk_wd_device::initialize_cartridge();
+
+ page(1)->install_rom(0x4000, 0x7fff, get_rom_base());
+ page(1)->install_read_handler(0x7ff8, 0x7ff8, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r)));
+ page(1)->install_read_handler(0x7ff9, 0x7ff9, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r)));
+ page(1)->install_read_handler(0x7ffa, 0x7ffa, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r)));
+ page(1)->install_read_handler(0x7ffb, 0x7ffb, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r)));
+ page(1)->install_read_handler(0x7ffc, 0x7ffc, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::side_control_r)));
+ page(1)->install_read_handler(0x7ffd, 0x7ffd, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::control_r)));
+ page(1)->install_read_handler(0x7fff, 0x7fff, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::status_r)));
+ page(1)->install_write_handler(0x7ff8, 0x7ff8, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w)));
+ page(1)->install_write_handler(0x7ff9, 0x7ff9, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w)));
+ page(1)->install_write_handler(0x7ffa, 0x7ffa, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w)));
+ page(1)->install_write_handler(0x7ffb, 0x7ffb, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w)));
+ page(1)->install_write_handler(0x7ffc, 0x7ffc, write8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::set_side_control)));
+ page(1)->install_write_handler(0x7ffd, 0x7ffd, write8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::set_control)));
+
+ // TODO No idea why, but without this the other handlers do not get recognized
+ page(2)->install_rom(0xbff8,0xbff8, get_rom_base());
+ page(2)->install_read_handler(0xbff8, 0xbff8, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r)));
+ page(2)->install_read_handler(0xbff9, 0xbff9, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r)));
+ page(2)->install_read_handler(0xbffa, 0xbffa, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r)));
+ page(2)->install_read_handler(0xbffb, 0xbffb, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r)));
+ page(2)->install_read_handler(0xbffc, 0xbffc, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::side_control_r)));
+ page(2)->install_read_handler(0xbffd, 0xbffd, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::control_r)));
+ page(2)->install_read_handler(0xbfff, 0xbfff, read8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::status_r)));
+ page(2)->install_write_handler(0xbff8, 0xbff8, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w)));
+ page(2)->install_write_handler(0xbff9, 0xbff9, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w)));
+ page(2)->install_write_handler(0xbffa, 0xbffa, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w)));
+ page(2)->install_write_handler(0xbffb, 0xbffb, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w)));
+ page(2)->install_write_handler(0xbffc, 0xbffc, write8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::set_side_control)));
+ page(2)->install_write_handler(0xbffd, 0xbffd, write8smo_delegate(*this, FUNC(msx_cart_disk_type1_device::set_control)));
+}
void msx_cart_disk_type1_device::device_post_load()
{
@@ -287,7 +325,6 @@ void msx_cart_disk_type1_device::device_post_load()
set_control(data);
}
-
void msx_cart_disk_type1_device::set_control(uint8_t data)
{
uint8_t old_m_control = m_control;
@@ -324,7 +361,6 @@ void msx_cart_disk_type1_device::set_control(uint8_t data)
}
}
-
void msx_cart_disk_type1_device::set_side_control(uint8_t data)
{
m_side_control = data;
@@ -335,95 +371,28 @@ void msx_cart_disk_type1_device::set_side_control(uint8_t data)
}
}
-
void msx_cart_disk_type1_device::device_reset()
{
m_fdc->dden_w(false);
}
-
-uint8_t msx_cart_disk_type1_device::read_cart(offs_t offset)
+u8 msx_cart_disk_type1_device::side_control_r()
{
- switch (offset)
- {
- case 0x7ff8:
- case 0xbff8:
- return m_fdc->status_r();
-
- case 0x7ff9:
- case 0xbff9:
- return m_fdc->track_r();
-
- case 0x7ffa:
- case 0xbffa:
- return m_fdc->sector_r();
-
- case 0x7ffb:
- case 0xbffb:
- return m_fdc->data_r();
-
- case 0x7ffc:
- case 0xbffc:
- return 0xfe | (m_side_control & 0x01);
-
- case 0x7ffd:
- case 0xbffd:
- return ( m_control & 0x83 ) | 0x78;
-
- case 0x7fff:
- case 0xbfff:
- return 0x3f | (m_fdc->intrq_r() ? 0 : 0x40) | (m_fdc->drq_r() ? 0 : 0x80);
- }
-
- if (offset >= 0x4000 && offset < 0x8000)
- {
- return get_rom_base()[offset & 0x3fff];
- }
- return 0xff;
+ return 0xfe | (m_side_control & 0x01);
}
-
-void msx_cart_disk_type1_device::write_cart(offs_t offset, uint8_t data)
+u8 msx_cart_disk_type1_device::control_r()
{
- switch (offset)
- {
- case 0x7ff8:
- case 0xbff8:
- m_fdc->cmd_w(data);
- break;
-
- case 0x7ff9:
- case 0xbff9:
- m_fdc->track_w(data);
- break;
-
- case 0x7ffa:
- case 0xbffa:
- m_fdc->sector_w(data);
- break;
-
- case 0x7ffb:
- case 0xbffb:
- m_fdc->data_w(data);
- break;
-
- case 0x7ffc:
- case 0xbffc:
- set_side_control(data);
- break;
-
- case 0x7ffd:
- case 0xbffd:
- set_control(data);
- break;
+ return ( m_control & 0x83 ) | 0x78;
+}
- default:
- logerror("msx_cart_disk_type1_device::write_cart: Unmapped write writing %02x to %04x\n", data, offset);
- break;
- }
+u8 msx_cart_disk_type1_device::status_r()
+{
+ return 0x3f | (m_fdc->intrq_r() ? 0 : 0x40) | (m_fdc->drq_r() ? 0 : 0x80);
}
+
void msx_cart_disk_type2_device::device_start()
{
m_led.resolve();
@@ -431,13 +400,11 @@ void msx_cart_disk_type2_device::device_start()
save_item(NAME(m_control));
}
-
void msx_cart_disk_type2_device::device_reset()
{
m_fdc->dden_w(false);
}
-
void msx_cart_disk_type2_device::device_post_load()
{
uint8_t data = m_control;
@@ -448,8 +415,37 @@ void msx_cart_disk_type2_device::device_post_load()
set_control(data);
}
+void msx_cart_disk_type2_device::initialize_cartridge()
+{
+ msx_cart_disk_wd_device::initialize_cartridge();
+
+ page(1)->install_rom(0x4000, 0x7fff, get_rom_base());
+ page(1)->install_read_handler(0x7fb8, 0x7fb8, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r)));
+ page(1)->install_read_handler(0x7fb9, 0x7fb9, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r)));
+ page(1)->install_read_handler(0x7fba, 0x7fba, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r)));
+ page(1)->install_read_handler(0x7fbb, 0x7fbb, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r)));
+ page(1)->install_read_handler(0x7fbc, 0x7fbc, read8smo_delegate(*this, FUNC(msx_cart_disk_type2_device::status_r)));
+ page(1)->install_write_handler(0x7fb8, 0x7fb8, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w)));
+ page(1)->install_write_handler(0x7fb9, 0x7fb9, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w)));
+ page(1)->install_write_handler(0x7fba, 0x7fba, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w)));
+ page(1)->install_write_handler(0x7fbb, 0x7fbb, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w)));
+ page(1)->install_write_handler(0x7fbc, 0x7fbc, write8smo_delegate(*this, FUNC(msx_cart_disk_type2_device::set_control)));
-void msx_cart_disk_type2_device::set_control(uint8_t data)
+ // TODO No idea why, but without this the other handlers do not get recognized
+ page(2)->install_rom(0xbfb8,0xbfb8, get_rom_base());
+ page(2)->install_read_handler(0xbfb8, 0xbfb8, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::status_r)));
+ page(2)->install_read_handler(0xbfb9, 0xbfb9, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_r)));
+ page(2)->install_read_handler(0xbfba, 0xbfba, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_r)));
+ page(2)->install_read_handler(0xbfbb, 0xbfbb, read8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_r)));
+ page(2)->install_read_handler(0xbfbc, 0xbfbc, read8smo_delegate(*this, FUNC(msx_cart_disk_type2_device::status_r)));
+ page(2)->install_write_handler(0xbfb8, 0xbfb8, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::cmd_w)));
+ page(2)->install_write_handler(0xbfb9, 0xbfb9, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::track_w)));
+ page(2)->install_write_handler(0xbfba, 0xbfba, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::sector_w)));
+ page(2)->install_write_handler(0xbfbb, 0xbfbb, write8smo_delegate(*m_fdc, FUNC(wd_fdc_analog_device_base::data_w)));
+ page(2)->install_write_handler(0xbfbc, 0xbfbc, write8smo_delegate(*this, FUNC(msx_cart_disk_type2_device::set_control)));
+}
+
+void msx_cart_disk_type2_device::set_control(u8 data)
{
uint8_t old_m_control = m_control;
@@ -484,73 +480,9 @@ void msx_cart_disk_type2_device::set_control(uint8_t data)
}
}
-
-uint8_t msx_cart_disk_type2_device::read_cart(offs_t offset)
-{
- switch (offset)
- {
- case 0x7fb8:
- case 0xbfb8:
- return m_fdc->status_r();
-
- case 0x7fb9:
- case 0xbfb9:
- return m_fdc->track_r();
-
- case 0x7fba:
- case 0xbfba:
- return m_fdc->sector_r();
-
- case 0x7fbb:
- case 0xbfbb:
- return m_fdc->data_r();
-
- case 0x7fbc:
- case 0xbfbc:
- return 0x3f | (m_fdc->drq_r() ? 0 : 0x40) | (m_fdc->intrq_r() ? 0x80 : 0);
- }
-
- if (offset >= 0x4000 && offset < 0x8000)
- {
- return get_rom_base()[offset & 0x3fff];
- }
- return 0xff;
-}
-
-
-void msx_cart_disk_type2_device::write_cart(offs_t offset, uint8_t data)
+u8 msx_cart_disk_type2_device::status_r()
{
- switch (offset)
- {
- case 0x7fb8:
- case 0xbfb8:
- m_fdc->cmd_w(data);
- break;
-
- case 0x7fb9:
- case 0xbfb9:
- m_fdc->track_w(data);
- break;
-
- case 0x7fba:
- case 0xbfba:
- m_fdc->sector_w(data);
- break;
-
- case 0x7fbb:
- case 0xbfbb:
- m_fdc->data_w(data);
- break;
-
- case 0x7fbc:
- case 0xbfbc:
- set_control(data);
- break;
-
- default:
- logerror("msx_cart_disk_type2_device::write_cart: Unmapped write writing %02x to %04x\n", data, offset);
- break;
- }
+ return 0x3f | (m_fdc->drq_r() ? 0 : 0x40) | (m_fdc->intrq_r() ? 0x80 : 0);
}
@@ -565,49 +497,21 @@ void msx_cart_fsfd1a_device::device_reset()
{
}
-
-uint8_t msx_cart_fsfd1a_device::read_cart(offs_t offset)
-{
- switch (offset)
- {
- case 0x7ffa:
- case 0xbffa:
- return m_fdc->msr_r();
-
- case 0x7ffb:
- case 0xbffb:
- return m_fdc->fifo_r();
- }
-
- if (offset >= 0x4000 && offset < 0x8000)
- {
- return get_rom_base()[offset & 0x3fff];
- }
- return 0xff;
-}
-
-
-void msx_cart_fsfd1a_device::write_cart(offs_t offset, uint8_t data)
+void msx_cart_fsfd1a_device::initialize_cartridge()
{
- switch (offset)
- {
- case 0x7ff8:
- case 0xbff8:
- m_fdc->dor_w(data);
- break;
-
- case 0x7ff9:
- case 0xbff9:
- m_fdc->cr1_w(data);
- break;
+ msx_cart_disk_tc8566_device::initialize_cartridge();
- case 0x7ffb:
- case 0xbffb:
- m_fdc->fifo_w(data);
- break;
-
- default:
- logerror("msx_cart_fsfd1a_device::write_cart: Unmapped write writing %02x to %04x\n", data, offset);
- break;
- }
+ page(1)->install_rom(0x4000, 0x7fff, get_rom_base());
+ page(1)->install_read_handler(0x7ffa, 0x7ffa, read8smo_delegate(*m_fdc, FUNC(tc8566af_device::msr_r)));
+ page(1)->install_read_handler(0x7ffb, 0x7ffb, read8smo_delegate(*m_fdc, FUNC(tc8566af_device::fifo_r)));
+ page(1)->install_write_handler(0x7ff8, 0x7ff8, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::dor_w)));
+ page(1)->install_write_handler(0x7ff9, 0x7ff9, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::cr1_w)));
+ page(1)->install_write_handler(0x7ffb, 0x7ffb, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::fifo_w)));
+ // TODO No idea why, but without this the other handlers do not get recognized
+ page(2)->install_rom(0xbffa,0xbffa, get_rom_base());
+ page(2)->install_read_handler(0xbffa, 0xbffa, read8smo_delegate(*m_fdc, FUNC(tc8566af_device::msr_r)));
+ page(2)->install_read_handler(0xbffb, 0xbffb, read8smo_delegate(*m_fdc, FUNC(tc8566af_device::fifo_r)));
+ page(2)->install_write_handler(0xbff8, 0xbff8, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::dor_w)));
+ page(2)->install_write_handler(0xbff9, 0xbff9, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::cr1_w)));
+ page(2)->install_write_handler(0xbffb, 0xbffb, write8smo_delegate(*m_fdc, FUNC(tc8566af_device::fifo_w)));
}
diff --git a/src/devices/bus/msx_cart/disk.h b/src/devices/bus/msx_cart/disk.h
index fd8d640157f..53407cfe0e7 100644
--- a/src/devices/bus/msx_cart/disk.h
+++ b/src/devices/bus/msx_cart/disk.h
@@ -23,7 +23,7 @@ public:
virtual void initialize_cartridge() override;
protected:
- msx_cart_disk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_disk_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
required_device<floppy_connector> m_floppy0;
optional_device<floppy_connector> m_floppy1;
@@ -36,7 +36,7 @@ protected:
class msx_cart_disk_wd_device : public msx_cart_disk_device
{
protected:
- msx_cart_disk_wd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_disk_wd_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
required_device<wd_fdc_analog_device_base> m_fdc;
};
@@ -45,51 +45,54 @@ protected:
class msx_cart_disk_type1_device : public msx_cart_disk_wd_device
{
public:
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
+ virtual void initialize_cartridge() override;
protected:
- msx_cart_disk_type1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_disk_type1_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_post_load() override;
+ u8 side_control_r();
+ u8 control_r();
+ u8 status_r();
+ void set_side_control(u8 data);
+ void set_control(u8 data);
+
output_finder<> m_led;
- uint8_t m_side_control;
- uint8_t m_control;
+ u8 m_side_control;
+ u8 m_control;
- void set_side_control(uint8_t data);
- void set_control(uint8_t data);
};
class msx_cart_disk_type2_device : public msx_cart_disk_wd_device
{
public:
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
+ virtual void initialize_cartridge() override;
protected:
- msx_cart_disk_type2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_disk_type2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_post_load() override;
- output_finder<> m_led;
- uint8_t m_control;
+ void set_control(u8 data);
+ u8 status_r();
- void set_control(uint8_t data);
+ output_finder<> m_led;
+ u8 m_control;
};
class msx_cart_vy0010_device : public msx_cart_disk_type1_device
{
public:
- msx_cart_vy0010_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_vy0010_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
virtual void device_add_mconfig(machine_config &config) override;
@@ -99,7 +102,7 @@ protected:
class msx_cart_fsfd1_device : public msx_cart_disk_type1_device
{
public:
- msx_cart_fsfd1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_fsfd1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
virtual void device_add_mconfig(machine_config &config) override;
@@ -109,7 +112,7 @@ protected:
class msx_cart_fscf351_device : public msx_cart_disk_type2_device
{
public:
- msx_cart_fscf351_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_fscf351_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
virtual void device_add_mconfig(machine_config &config) override;
@@ -119,7 +122,7 @@ protected:
class msx_cart_disk_tc8566_device : public msx_cart_disk_device
{
protected:
- msx_cart_disk_tc8566_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_disk_tc8566_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
required_device<tc8566af_device> m_fdc;
};
@@ -128,17 +131,15 @@ protected:
class msx_cart_fsfd1a_device : public msx_cart_disk_tc8566_device
{
public:
- msx_cart_fsfd1a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_fsfd1a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void initialize_cartridge() override;
protected:
+ // device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
-
- // device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
-
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
};
diff --git a/src/devices/bus/msx_cart/dooly.cpp b/src/devices/bus/msx_cart/dooly.cpp
index a0c4c7b4f83..7bbc15253a5 100644
--- a/src/devices/bus/msx_cart/dooly.cpp
+++ b/src/devices/bus/msx_cart/dooly.cpp
@@ -10,58 +10,52 @@ DEFINE_DEVICE_TYPE(MSX_CART_DOOLY, msx_cart_dooly_device, "msx_cart_dooly", "MSX
msx_cart_dooly_device::msx_cart_dooly_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MSX_CART_DOOLY, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
- , m_prot(0)
+ , m_view1(*this, "view1")
+ , m_view2(*this, "view2")
{
}
-
-void msx_cart_dooly_device::device_start()
-{
- save_item(NAME(m_prot));
-}
-
-
void msx_cart_dooly_device::device_reset()
{
- m_prot = 0;
+ m_view1.select(0);
+ m_view2.select(0);
}
-
void msx_cart_dooly_device::initialize_cartridge()
{
if (get_rom_size() != 0x8000)
{
fatalerror("dooly: Invalid ROM size\n");
}
-}
+ page(1)->install_view(0x4000, 0x7fff, m_view1);
+ m_view1[0].install_rom(0x4000, 0x7fff, get_rom_base());
+ m_view1[1].install_read_handler(0x4000, 0x7fff, read8sm_delegate(*this, FUNC(msx_cart_dooly_device::mode4_page1_r)));
+ page(2)->install_view(0x8000, 0xbfff, m_view2);
+ m_view2[0].install_rom(0x8000, 0xbfff, get_rom_base() + 0x4000);
+ m_view2[1].install_read_handler(0x8000, 0xbfff, read8sm_delegate(*this, FUNC(msx_cart_dooly_device::mode4_page2_r)));
-uint8_t msx_cart_dooly_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0xc000)
- {
- uint8_t data = get_rom_base()[offset - 0x4000];
+ page(1)->install_write_handler(0x4000, 0x7fff, write8smo_delegate(*this, FUNC(msx_cart_dooly_device::prot_w)));
+ page(2)->install_write_handler(0x8000, 0xbfff, write8smo_delegate(*this, FUNC(msx_cart_dooly_device::prot_w)));
+}
- switch (m_prot)
- {
- case 0x04:
- data = bitswap<8>(data, 7, 6, 5, 4, 3, 1, 0, 2);
- break;
- }
- return data;
- }
- return 0xff;
+u8 msx_cart_dooly_device::mode4_page1_r(offs_t offset)
+{
+ return bitswap<8>(get_rom_base()[offset], 7, 6, 5, 4, 3, 1, 0, 2);
}
+u8 msx_cart_dooly_device::mode4_page2_r(offs_t offset)
+{
+ return bitswap<8>(get_rom_base()[0x4000 | offset], 7, 6, 5, 4, 3, 1, 0, 2);
+}
-void msx_cart_dooly_device::write_cart(offs_t offset, uint8_t data)
+void msx_cart_dooly_device::prot_w(u8 data)
{
- if (offset >= 0x4000 && offset < 0xc000)
+ data &= 0x07;
+ m_view1.select(BIT(data, 2) ? 1 : 0);
+ m_view2.select(BIT(data, 2) ? 1 : 0);
+ if (data != 0 && data != 4)
{
- m_prot = data & 0x07;
- if (m_prot != 0 && m_prot != 4)
- {
- logerror("msx_cart_dooly_device: unhandled write %02x to %04x\n", data, offset);
- }
+ logerror("msx_cart_dooly_device: unhandled protection mode %02x\n", data);
}
}
diff --git a/src/devices/bus/msx_cart/dooly.h b/src/devices/bus/msx_cart/dooly.h
index 76f58ae762d..ceb4a29dc17 100644
--- a/src/devices/bus/msx_cart/dooly.h
+++ b/src/devices/bus/msx_cart/dooly.h
@@ -14,20 +14,22 @@ DECLARE_DEVICE_TYPE(MSX_CART_DOOLY, msx_cart_dooly_device)
class msx_cart_dooly_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_dooly_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_dooly_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
private:
- uint8_t m_prot;
+ void prot_w(u8 data);
+ u8 mode4_page1_r(offs_t offset);
+ u8 mode4_page2_r(offs_t offset);
+
+ memory_view m_view1;
+ memory_view m_view2;
};
diff --git a/src/devices/bus/msx_cart/easi_speech.cpp b/src/devices/bus/msx_cart/easi_speech.cpp
index 0a9d2d5551d..381b26f06ff 100644
--- a/src/devices/bus/msx_cart/easi_speech.cpp
+++ b/src/devices/bus/msx_cart/easi_speech.cpp
@@ -17,21 +17,21 @@ a$=usr0("hello")
DEFINE_DEVICE_TYPE(MSX_CART_EASISPEECH, msx_cart_easispeech_device, "msx_cart_easispeech", "MSX Cartridge - Easi-Speech")
-msx_cart_easispeech_device::msx_cart_easispeech_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_easispeech_device::msx_cart_easispeech_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_EASISPEECH, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
, m_speech(*this, "speech")
{
}
-ROM_START( msx_cart_easispeech )
- ROM_REGION( 0x10000, "speech", 0 )
- ROM_LOAD( "sp0256a-al2", 0x1000, 0x0800, CRC(b504ac15) SHA1(e60fcb5fa16ff3f3b69d36c7a6e955744d3feafc) )
+ROM_START(msx_cart_easispeech)
+ ROM_REGION(0x10000, "speech", 0)
+ ROM_LOAD("sp0256a-al2", 0x1000, 0x0800, CRC(b504ac15) SHA1(e60fcb5fa16ff3f3b69d36c7a6e955744d3feafc) )
ROM_END
const tiny_rom_entry *msx_cart_easispeech_device::device_rom_region() const
{
- return ROM_NAME( msx_cart_easispeech );
+ return ROM_NAME(msx_cart_easispeech);
}
void msx_cart_easispeech_device::device_add_mconfig(machine_config &config)
@@ -40,22 +40,27 @@ void msx_cart_easispeech_device::device_add_mconfig(machine_config &config)
m_speech->add_route(ALL_OUTPUTS, ":speaker", 1.00);
}
-uint8_t msx_cart_easispeech_device::read_cart(offs_t offset)
+void msx_cart_easispeech_device::initialize_cartridge()
{
- // standard ROM
- if (offset >= 0x4000 && offset < 0x8000)
- return get_rom_base()[offset & 0x1fff];
+ if (get_rom_size() != 0x2000)
+ {
+ fatalerror("easispeech: Invalid ROM size\n");
+ }
- // d7: SP0256 LRQ
- if (offset == 0x8000)
- return m_speech->lrq_r() << 7;
+ page(1)->install_rom(0x4000, 0x5fff, 0x2000, get_rom_base());
- return 0xff;
+ // Without this line the read and write handler don't get picked up??
+ page(2)->install_rom(0x8000, 0x8000, get_rom_base());
+ page(2)->install_read_handler(0x8000, 0x8000, read8smo_delegate(*this, FUNC(msx_cart_easispeech_device::speech_r)));
+ page(2)->install_write_handler(0x8000, 0x8000, write8smo_delegate(*this, FUNC(msx_cart_easispeech_device::speech_w)));
}
-void msx_cart_easispeech_device::write_cart(offs_t offset, uint8_t data)
+u8 msx_cart_easispeech_device::speech_r()
{
- // d2-d7: SP0256 A
- if (offset == 0x8000)
- m_speech->ald_w(bitswap<6>(data,3,5,7,6,4,2));
+ return m_speech->lrq_r() << 7;
+}
+
+void msx_cart_easispeech_device::speech_w(u8 data)
+{
+ m_speech->ald_w(bitswap<6>(data,3,5,7,6,4,2));
}
diff --git a/src/devices/bus/msx_cart/easi_speech.h b/src/devices/bus/msx_cart/easi_speech.h
index 2aba350c4c7..9c40a2c85d4 100644
--- a/src/devices/bus/msx_cart/easi_speech.h
+++ b/src/devices/bus/msx_cart/easi_speech.h
@@ -15,18 +15,20 @@ DECLARE_DEVICE_TYPE(MSX_CART_EASISPEECH, msx_cart_easispeech_device)
class msx_cart_easispeech_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_easispeech_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_easispeech_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
+ virtual void initialize_cartridge() override;
protected:
// device-level overrides
- virtual void device_start() override { ; }
+ virtual void device_start() override { }
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
private:
+ u8 speech_r();
+ void speech_w(u8 data);
+
required_device<sp0256_device> m_speech;
};
diff --git a/src/devices/bus/msx_cart/fmpac.cpp b/src/devices/bus/msx_cart/fmpac.cpp
index 75af22353dc..ab32020980f 100644
--- a/src/devices/bus/msx_cart/fmpac.cpp
+++ b/src/devices/bus/msx_cart/fmpac.cpp
@@ -14,17 +14,16 @@ with: PAC2 BACKUP DATA. We only store the raw sram contents.
DEFINE_DEVICE_TYPE(MSX_CART_FMPAC, msx_cart_fmpac_device, "msx_cart_fmpac", "MSX Cartridge - FM-PAC")
-msx_cart_fmpac_device::msx_cart_fmpac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_fmpac_device::msx_cart_fmpac_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_FMPAC, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
, m_ym2413(*this, "ym2413")
- , m_selected_bank(0)
- , m_bank_base(nullptr)
+ , m_rombank(*this, "rombank")
+ , m_view(*this, "view")
, m_sram_active(false)
, m_opll_active(false)
- , m_1ffe(0)
- , m_1fff(0)
- , m_7ff6(0)
+ , m_sram_unlock{0, 0}
+ , m_control(0)
{
}
@@ -39,130 +38,87 @@ void msx_cart_fmpac_device::device_add_mconfig(machine_config &config)
void msx_cart_fmpac_device::device_start()
{
- save_item(NAME(m_selected_bank));
save_item(NAME(m_sram_active));
save_item(NAME(m_opll_active));
- save_item(NAME(m_1ffe));
- save_item(NAME(m_1fff));
- save_item(NAME(m_7ff6));
+ save_item(NAME(m_sram_unlock));
+ save_item(NAME(m_control));
// Install IO read/write handlers
io_space().install_write_handler(0x7c, 0x7d, write8sm_delegate(*this, FUNC(msx_cart_fmpac_device::write_ym2413)));
}
-
-void msx_cart_fmpac_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_fmpac_device::restore_banks()
-{
- m_bank_base = get_rom_base() + ( m_selected_bank & 0x03 ) * 0x4000;
-}
-
-
void msx_cart_fmpac_device::device_reset()
{
- m_selected_bank = 0;
m_sram_active = false;
m_opll_active = false;
- m_1ffe = 0;
- m_1fff = 0;
- m_7ff6 = 0;
-}
+ m_sram_unlock[0] = 0;
+ m_sram_unlock[1] = 0;
+ m_control = 0;
+ m_view.select(0);
+ m_rombank->set_entry(0);
+}
void msx_cart_fmpac_device::initialize_cartridge()
{
- if ( get_rom_size() != 0x10000 )
+ if (get_rom_size() != 0x10000)
{
fatalerror("fmpac: Invalid ROM size\n");
}
-
- if ( get_sram_size() != 0x2000 )
+ if (get_sram_size() != 0x2000)
{
fatalerror("fmpac: Invalid SRAM size\n");
}
- restore_banks();
+ m_rombank->configure_entries(0, 4, get_rom_base(), 0x4000);
+
+ page(1)->install_view(0x4000, 0x7fff, m_view);
+ m_view[0].install_read_bank(0x4000, 0x7fff, m_rombank);
+ m_view[0].install_write_handler(0x5ffe, 0x5fff, write8sm_delegate(*this, FUNC(msx_cart_fmpac_device::sram_unlock)));
+ m_view[0].install_write_handler(0x7ff4, 0x7ff5, write8sm_delegate(*this, FUNC(msx_cart_fmpac_device::write_ym2413)));
+ m_view[0].install_read_handler(0x7ff6, 0x7ff6, read8smo_delegate(*this, FUNC(msx_cart_fmpac_device::control_r)));
+ m_view[0].install_write_handler(0x7ff6, 0x7ff6, write8smo_delegate(*this, FUNC(msx_cart_fmpac_device::control_w)));
+ m_view[0].install_read_handler(0x7ff7, 0x7ff7, read8smo_delegate(*this, FUNC(msx_cart_fmpac_device::bank_r)));
+ m_view[0].install_write_handler(0x7ff7, 0x7ff7, write8smo_delegate(*this, FUNC(msx_cart_fmpac_device::bank_w)));
+
+ m_view[1].install_ram(0x4000, 0x5fff, get_sram_base());
+ m_view[1].install_write_handler(0x5ffe, 0x5fff, write8sm_delegate(*this, FUNC(msx_cart_fmpac_device::sram_unlock)));
+ m_view[1].install_write_handler(0x7ff4, 0x7ff5, write8sm_delegate(*this, FUNC(msx_cart_fmpac_device::write_ym2413)));
+ m_view[1].install_read_handler(0x7ff6, 0x7ff6, read8smo_delegate(*this, FUNC(msx_cart_fmpac_device::control_r)));
+ m_view[1].install_write_handler(0x7ff6, 0x7ff6, write8smo_delegate(*this, FUNC(msx_cart_fmpac_device::control_w)));
+ m_view[1].install_read_handler(0x7ff7, 0x7ff7, read8smo_delegate(*this, FUNC(msx_cart_fmpac_device::bank_r)));
+ m_view[1].install_write_handler(0x7ff7, 0x7ff7, write8smo_delegate(*this, FUNC(msx_cart_fmpac_device::bank_w)));
}
-
-uint8_t msx_cart_fmpac_device::read_cart(offs_t offset)
+void msx_cart_fmpac_device::sram_unlock(offs_t offset, u8 data)
{
- if (offset >= 0x4000 && offset < 0x8000)
- {
- if (offset == 0x7ff6)
- {
- return m_7ff6;
- }
- if (offset == 0x7ff7)
- {
- return m_selected_bank & 0x03;
- }
- if (m_sram_active)
- {
- if (offset & 0x2000)
- {
- return 0xff;
- }
- return get_sram_base()[offset & 0x1fff];
- }
- else
- {
- return m_bank_base[offset & 0x3fff];
- }
- }
- return 0xff;
+ m_sram_unlock[offset] = data;
+ m_sram_active = m_sram_unlock[0] == 0x4d && m_sram_unlock[1] == 0x69;
+ m_view.select(m_sram_active ? 1 : 0);
}
-
-void msx_cart_fmpac_device::write_cart(offs_t offset, uint8_t data)
+u8 msx_cart_fmpac_device::control_r()
{
- if (offset >= 0x4000 && offset < 0x6000)
- {
- if (m_sram_active)
- {
- get_sram_base()[offset & 0x1fff] = data;
- }
- if (offset == 0x5ffe)
- {
- m_1ffe = data;
- }
- if (offset == 0x5fff)
- {
- m_1fff = data;
- }
- m_sram_active = (m_1ffe == 0x4d) && (m_1fff == 0x69);
- }
+ return m_control;
+}
- switch (offset)
- {
- case 0x7ff4:
- case 0x7ff5:
- if (m_opll_active)
- {
- m_ym2413->write(offset & 1, data);
- }
- break;
-
- case 0x7ff6:
- m_7ff6 = data & 0x11;
- m_opll_active = (m_7ff6 & 0x01);
- break;
-
- case 0x7ff7:
- m_selected_bank = data;
- restore_banks();
- break;
- }
+void msx_cart_fmpac_device::control_w(u8 data)
+{
+ m_control = data & 0x11;
+ m_opll_active = BIT(data, 0);
+}
+u8 msx_cart_fmpac_device::bank_r()
+{
+ return m_rombank->entry();
}
+void msx_cart_fmpac_device::bank_w(u8 data)
+{
+ m_rombank->set_entry(data);
+}
-void msx_cart_fmpac_device::write_ym2413(offs_t offset, uint8_t data)
+void msx_cart_fmpac_device::write_ym2413(offs_t offset, u8 data)
{
if (m_opll_active)
{
diff --git a/src/devices/bus/msx_cart/fmpac.h b/src/devices/bus/msx_cart/fmpac.h
index 9175849eaba..c12937c80a8 100644
--- a/src/devices/bus/msx_cart/fmpac.h
+++ b/src/devices/bus/msx_cart/fmpac.h
@@ -15,35 +15,33 @@ DECLARE_DEVICE_TYPE(MSX_CART_FMPAC, msx_cart_fmpac_device)
class msx_cart_fmpac_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_fmpac_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_fmpac_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
virtual void device_start() override;
virtual void device_reset() override;
- virtual void device_post_load() override;
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
- void restore_banks();
-
private:
- void write_ym2413(offs_t offset, uint8_t data);
+ void write_ym2413(offs_t offset, u8 data);
+ void sram_unlock(offs_t offset, u8 data);
+ u8 control_r();
+ void control_w(u8 data);
+ u8 bank_r();
+ void bank_w(u8 data);
required_device<ym2413_device> m_ym2413;
+ memory_bank_creator m_rombank;
+ memory_view m_view;
- uint8_t m_selected_bank;
- uint8_t *m_bank_base;
bool m_sram_active;
bool m_opll_active;
- uint8_t m_1ffe;
- uint8_t m_1fff;
- uint8_t m_7ff6;
+ u8 m_sram_unlock[2];
+ u8 m_control;
};
diff --git a/src/devices/bus/msx_cart/fs_sr022.cpp b/src/devices/bus/msx_cart/fs_sr022.cpp
index bb84a759214..fd19f43547a 100644
--- a/src/devices/bus/msx_cart/fs_sr022.cpp
+++ b/src/devices/bus/msx_cart/fs_sr022.cpp
@@ -15,19 +15,16 @@ msx_cart_fs_sr022_device::msx_cart_fs_sr022_device(const machine_config &mconfig
{
}
-
void msx_cart_fs_sr022_device::device_start()
{
save_item(NAME(m_bunsetsu_address));
}
-
void msx_cart_fs_sr022_device::device_reset()
{
m_bunsetsu_address = 0;
}
-
void msx_cart_fs_sr022_device::initialize_cartridge()
{
if (get_rom_size() != 0x40000)
@@ -35,36 +32,34 @@ void msx_cart_fs_sr022_device::initialize_cartridge()
fatalerror("fs_sr022: Invalid ROM size\n");
}
m_bunsetsu_rom = get_rom_base() + 0x20000;
-}
+ page(1)->install_rom(0x4000, 0x7fff, get_rom_base());
+ page(2)->install_rom(0x8000, 0xbfff, get_rom_base() + 0x4000);
+ page(2)->install_read_handler(0xbfff, 0xbfff, read8smo_delegate(*this, FUNC(msx_cart_fs_sr022_device::buns_r)));
+ page(2)->install_write_handler(0xbffc, 0xbffe, write8sm_delegate(*this, FUNC(msx_cart_fs_sr022_device::buns_w)));
+}
-uint8_t msx_cart_fs_sr022_device::read_cart(offs_t offset)
+u8 msx_cart_fs_sr022_device::buns_r()
{
- if (offset >= 0x4000 && offset < 0xc000)
- {
- if (offset == 0xbfff) {
- return m_bunsetsu_rom[m_bunsetsu_address++ & 0x1ffff];
- }
-
- return get_rom_base()[offset - 0x4000];
- }
- return 0xff;
+ u8 data = m_bunsetsu_rom[m_bunsetsu_address & 0x1ffff];
+ if (!machine().side_effects_disabled())
+ m_bunsetsu_address++;
+ return data;
}
-
-void msx_cart_fs_sr022_device::write_cart(offs_t offset, uint8_t data)
+void msx_cart_fs_sr022_device::buns_w(offs_t offset, uint8_t data)
{
switch (offset)
{
- case 0xbffc:
+ case 0:
m_bunsetsu_address = (m_bunsetsu_address & 0xffff00) | data;
break;
- case 0xbffd:
+ case 1:
m_bunsetsu_address = (m_bunsetsu_address & 0xff00ff) | (data << 8);
break;
- case 0xbffe:
+ case 2:
m_bunsetsu_address = (m_bunsetsu_address & 0x00ffff) | (data << 16);
break;
}
diff --git a/src/devices/bus/msx_cart/fs_sr022.h b/src/devices/bus/msx_cart/fs_sr022.h
index 2456b90a101..677dd723e17 100644
--- a/src/devices/bus/msx_cart/fs_sr022.h
+++ b/src/devices/bus/msx_cart/fs_sr022.h
@@ -18,17 +18,17 @@ public:
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
- const uint8_t *m_bunsetsu_rom;
- uint32_t m_bunsetsu_address;
+ u8 buns_r();
+ void buns_w(offs_t offset, u8 data);
+
+ u8 *m_bunsetsu_rom;
+ u32 m_bunsetsu_address;
};
diff --git a/src/devices/bus/msx_cart/halnote.cpp b/src/devices/bus/msx_cart/halnote.cpp
index 43f7947ec2c..5bbed142a27 100644
--- a/src/devices/bus/msx_cart/halnote.cpp
+++ b/src/devices/bus/msx_cart/halnote.cpp
@@ -7,154 +7,92 @@
DEFINE_DEVICE_TYPE(MSX_CART_HALNOTE, msx_cart_halnote_device, "msx_cart_halnote", "MSX Cartridge - Halnote")
-msx_cart_halnote_device::msx_cart_halnote_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_halnote_device::msx_cart_halnote_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_HALNOTE, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
- , m_selected_bank{ 0, 0, 0, 0, 0, 0, 0, 0 }
- , m_bank_base{ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }
+ , m_rombank(*this, "rombank%u", 0U)
+ , m_view0(*this, "view0")
+ , m_view1(*this, "view1")
{
}
-
-void msx_cart_halnote_device::device_start()
+void msx_cart_halnote_device::device_reset()
{
- save_item(NAME(m_selected_bank));
-}
+ for (int i = 0; i < 6; i++)
+ m_rombank[i]->set_entry(0);
-
-void msx_cart_halnote_device::device_post_load()
-{
- restore_banks();
+ m_view0.disable();
+ m_view1.select(0);
}
-
-void msx_cart_halnote_device::map_bank(int bank)
+void msx_cart_halnote_device::initialize_cartridge()
{
- if (bank < 2)
+ if (get_rom_size() != 0x100000)
{
- return;
+ fatalerror("halnote: Invalid ROM size\n");
}
-
- // Special banks
- if (bank == 6 || bank == 7)
+ if (get_sram_size() != 0x4000)
{
- m_bank_base[bank] = get_rom_base() + 0x80000 + (m_selected_bank[bank] * 0x800);
- return;
+ fatalerror("halnote: Invalid SRAM size\n");
}
- m_bank_base[bank] = get_rom_base() + ((m_selected_bank[bank] * 0x2000) & 0xFFFFF);
- if (bank == 2)
+ for (int i = 0; i < 4; i++)
{
- if (m_selected_bank[bank] & 0x80)
- {
- m_bank_base[0] = get_sram_base();
- m_bank_base[1] = get_sram_base() + 0x2000;
- }
- else
- {
- m_bank_base[0] = nullptr;
- m_bank_base[1] = nullptr;
- }
+ m_rombank[i]->configure_entries(0, 0x80, get_rom_base(), 0x2000);
}
+ m_rombank[4]->configure_entries(0, 0x100, get_rom_base() + 0x80000, 0x800);
+ m_rombank[5]->configure_entries(0, 0x100, get_rom_base() + 0x80000, 0x800);
+
+ page(0)->install_view(0x0000, 0x3fff, m_view0);
+ m_view0[0];
+ m_view0[1].install_ram(0x0000, 0x3fff, get_sram_base());
+ page(1)->install_read_bank(0x4000, 0x5fff, m_rombank[0]);
+ page(1)->install_write_handler(0x4fff, 0x4fff, write8smo_delegate(*this, FUNC(msx_cart_halnote_device::bank0_w)));
+ page(1)->install_view(0x6000, 0x7fff, m_view1);
+ m_view1[0].install_read_bank(0x6000, 0x7fff, m_rombank[1]);
+ m_view1[0].install_write_handler(0x6fff, 0x6fff, write8smo_delegate(*this, FUNC(msx_cart_halnote_device::bank1_w)));
+ m_view1[0].install_write_handler(0x77ff, 0x77ff, write8smo_delegate(*this, FUNC(msx_cart_halnote_device::bank4_w)));
+ m_view1[0].install_write_handler(0x7fff, 0x7fff, write8smo_delegate(*this, FUNC(msx_cart_halnote_device::bank5_w)));
+ m_view1[1].install_read_bank(0x6000, 0x6fff, m_rombank[1]);
+ m_view1[1].install_write_handler(0x6fff, 0x6fff, write8smo_delegate(*this, FUNC(msx_cart_halnote_device::bank1_w)));
+ m_view1[1].install_read_bank(0x7000, 0x77ff, m_rombank[4]);
+ m_view1[1].install_write_handler(0x77ff, 0x77ff, write8smo_delegate(*this, FUNC(msx_cart_halnote_device::bank4_w)));
+ m_view1[1].install_read_bank(0x7800, 0x7fff, m_rombank[5]);
+ m_view1[1].install_write_handler(0x7fff, 0x7fff, write8smo_delegate(*this, FUNC(msx_cart_halnote_device::bank5_w)));
+ page(2)->install_read_bank(0x8000, 0x9fff, m_rombank[2]);
+ page(2)->install_write_handler(0x8fff, 0x8fff, write8smo_delegate(*this, FUNC(msx_cart_halnote_device::bank2_w)));
+ page(2)->install_read_bank(0xa000, 0xbfff, m_rombank[3]);
+ page(2)->install_write_handler(0xafff, 0xafff, write8smo_delegate(*this, FUNC(msx_cart_halnote_device::bank3_w)));
}
-
-void msx_cart_halnote_device::restore_banks()
+void msx_cart_halnote_device::bank0_w(u8 data)
{
- for (int i = 0; i < 8; i++)
- {
- map_bank(i);
- }
+ m_rombank[0]->set_entry(data & 0x7f);
+ m_view0.select(BIT(data, 7) ? 1 : 0);
}
-
-void msx_cart_halnote_device::device_reset()
+void msx_cart_halnote_device::bank1_w(u8 data)
{
- for (auto & elem : m_selected_bank)
- {
- elem = 0;
- }
+ m_rombank[1]->set_entry(data & 0x7f);
}
-
-void msx_cart_halnote_device::initialize_cartridge()
+void msx_cart_halnote_device::bank2_w(u8 data)
{
- if (get_rom_size() != 0x100000)
- {
- fatalerror("halnote: Invalid ROM size\n");
- }
-
- restore_banks();
+ m_rombank[2]->set_entry(data & 0x7f);
}
-
-uint8_t msx_cart_halnote_device::read_cart(offs_t offset)
+void msx_cart_halnote_device::bank3_w(u8 data)
{
- if (offset >= 0xc000)
- {
- return 0xFF;
- }
-
- if ((offset & 0xf000) == 0x7000 && (m_selected_bank[3] & 0x80))
- {
- return m_bank_base[6 + ((offset >> 11) & 0x01)][offset & 0x7ff];
- }
-
- const uint8_t *mem = m_bank_base[offset >> 13];
-
- if (mem)
- {
- return mem[offset & 0x1fff];
- }
- return 0xff;
+ m_rombank[3]->set_entry(data & 0x7f);
+ m_view1.select(BIT(data, 7) ? 1 : 0);
}
-
-void msx_cart_halnote_device::write_cart(offs_t offset, uint8_t data)
+void msx_cart_halnote_device::bank4_w(u8 data)
{
- if (offset < 0x4000)
- {
- if (m_bank_base[0] != nullptr)
- {
- m_sram[offset & 0x3fff] = data;
- return;
- }
- }
-
- switch (offset)
- {
- case 0x4FFF:
- m_selected_bank[2] = data;
- map_bank(2);
- break;
-
- case 0x6FFF: // 6000-7FFF
- m_selected_bank[3] = data;
- map_bank(3);
- break;
-
- case 0x77FF:
- m_selected_bank[6] = data;
- map_bank(6);
- break;
-
- case 0x7FFF:
- m_selected_bank[7] = data;
- map_bank(7);
- break;
-
- case 0x8FFF:
- m_selected_bank[4] = data;
- map_bank(4);
- break;
-
- case 0xAFFF:
- m_selected_bank[5] = data;
- map_bank(5);
- break;
+ m_rombank[4]->set_entry(data);
+}
- default:
- logerror("msx_cart_halnote_device: Unhandled write %02x to %04x\n", data, offset);
- break;
- }
+void msx_cart_halnote_device::bank5_w(u8 data)
+{
+ m_rombank[5]->set_entry(data);
}
diff --git a/src/devices/bus/msx_cart/halnote.h b/src/devices/bus/msx_cart/halnote.h
index a9c1972afeb..eaaef27e7a5 100644
--- a/src/devices/bus/msx_cart/halnote.h
+++ b/src/devices/bus/msx_cart/halnote.h
@@ -14,26 +14,28 @@ DECLARE_DEVICE_TYPE(MSX_CART_HALNOTE, msx_cart_halnote_device)
class msx_cart_halnote_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_halnote_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_halnote_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
private:
- uint8_t m_selected_bank[8];
- uint8_t *m_bank_base[8];
-
- void map_bank(int bank);
+ static constexpr u8 BANK_MASK = (0x100000 / 0x2000) - 1;
+
+ void bank0_w(u8 data);
+ void bank1_w(u8 data);
+ void bank2_w(u8 data);
+ void bank3_w(u8 data);
+ void bank4_w(u8 data);
+ void bank5_w(u8 data);
+
+ memory_bank_array_creator<6> m_rombank;
+ memory_view m_view0;
+ memory_view m_view1;
};
diff --git a/src/devices/bus/msx_cart/hfox.cpp b/src/devices/bus/msx_cart/hfox.cpp
index 007155b6e5b..5945e399e35 100644
--- a/src/devices/bus/msx_cart/hfox.cpp
+++ b/src/devices/bus/msx_cart/hfox.cpp
@@ -7,77 +7,42 @@
DEFINE_DEVICE_TYPE(MSX_CART_HFOX, msx_cart_hfox_device, "msx_cart_hfox", "MSX Cartridge - Hurry Fox")
-msx_cart_hfox_device::msx_cart_hfox_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_hfox_device::msx_cart_hfox_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_HFOX, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
- , m_selected_bank{ 0, 0 }
- , m_bank_base{ nullptr, nullptr }
+ , m_rombank(*this, "rombank%u", 0U)
{
}
-
-void msx_cart_hfox_device::device_start()
-{
- save_item(NAME(m_selected_bank));
-}
-
-
-void msx_cart_hfox_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_hfox_device::restore_banks()
-{
- m_bank_base[0] = get_rom_base() + ((m_selected_bank[0] & 0x01) * 0x8000);
- m_bank_base[1] = get_rom_base() + ((m_selected_bank[1] & 0x01) * 0x8000) + 0x4000;
-}
-
-
void msx_cart_hfox_device::device_reset()
{
- m_selected_bank[0] = m_selected_bank[1] = 0;
+ m_rombank[0]->set_entry(0);
+ m_rombank[1]->set_entry(0);
}
-
void msx_cart_hfox_device::initialize_cartridge()
{
- if (get_rom_size() < 0x10000)
+ u32 size = get_rom_size();
+ u16 banks = size / 0x8000;
+
+ if (size > 256 * 0x8000 || size < 0x10000 || size != banks * 0x8000 || (~(banks - 1) % banks))
{
fatalerror("hfox: Invalid ROM size\n");
}
- restore_banks();
-}
+ m_bank_mask = banks - 1;
+ m_rombank[0]->configure_entries(0, 4, get_rom_base(), 0x8000);
+ m_rombank[1]->configure_entries(0, 4, get_rom_base() + 0x4000, 0x8000);
-uint8_t msx_cart_hfox_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0xc000)
- {
- return m_bank_base[offset >> 15][offset & 0x3fff];
- }
- return 0xff;
+ page(1)->install_read_bank(0x4000, 0x7fff, m_rombank[0]);
+ page(1)->install_write_handler(0x6000, 0x6000, write8smo_delegate(*this, FUNC(msx_cart_hfox_device::bank_w<0>)));
+ page(1)->install_write_handler(0x7000, 0x7000, write8smo_delegate(*this, FUNC(msx_cart_hfox_device::bank_w<1>)));
+ page(2)->install_read_bank(0x8000, 0xbfff, m_rombank[1]);
}
-
-void msx_cart_hfox_device::write_cart(offs_t offset, uint8_t data)
+template <int Bank>
+void msx_cart_hfox_device::bank_w(u8 data)
{
- switch (offset)
- {
- case 0x6000:
- m_selected_bank[0] = data;
- restore_banks();
- break;
-
- case 0x7000:
- m_selected_bank[1] = data;
- restore_banks();
- break;
-
- default:
- logerror("msx_cart_hfox_device: unhandled write %02x to %04x\n", data, offset);
- break;
- }
+ m_rombank[Bank]->set_entry(data & m_bank_mask);
}
diff --git a/src/devices/bus/msx_cart/hfox.h b/src/devices/bus/msx_cart/hfox.h
index 6254bae3610..eda1562bf04 100644
--- a/src/devices/bus/msx_cart/hfox.h
+++ b/src/devices/bus/msx_cart/hfox.h
@@ -3,6 +3,8 @@
#ifndef MAME_BUS_MSX_CART_HFOX_H
#define MAME_BUS_MSX_CART_HFOX_H
+#pragma once
+
#include "bus/msx_cart/cartridge.h"
@@ -16,20 +18,17 @@ public:
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
private:
- uint8_t m_selected_bank[2];
- uint8_t *m_bank_base[2];
+ template <int Bank> void bank_w(u8 data);
+
+ memory_bank_array_creator<2> m_rombank;
+
+ u8 m_bank_mask;
};
diff --git a/src/devices/bus/msx_cart/holy_quran.cpp b/src/devices/bus/msx_cart/holy_quran.cpp
index fbfb799fad5..cc87db1b435 100644
--- a/src/devices/bus/msx_cart/holy_quran.cpp
+++ b/src/devices/bus/msx_cart/holy_quran.cpp
@@ -16,85 +16,91 @@ GCMK-16X PCB, 2 ROM chips, Yamaha XE297A0 mapper chip.
DEFINE_DEVICE_TYPE(MSX_CART_HOLY_QURAN, msx_cart_holy_quran_device, "msx_cart_holy_quran", "MSX Cartridge - Holy Quran")
-msx_cart_holy_quran_device::msx_cart_holy_quran_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_holy_quran_device::msx_cart_holy_quran_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_HOLY_QURAN, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
+ , m_rombank(*this, "rombank%u", 0U)
+ , m_view1(*this, "view1")
+ , m_view2(*this, "view2")
{
}
-void msx_cart_holy_quran_device::device_start()
-{
- // zerofill
- m_decrypt = false;
- std::fill_n(&m_selected_bank[0], 4, 0);
- std::fill_n(&m_bank_base[0], 4, nullptr);
-
- // register for savestates
- save_item(NAME(m_selected_bank));
- save_item(NAME(m_decrypt));
-
- // protection uses a simple rotation on databus, some lines inverted
- for (int i = 0; i < 0x100; i++)
- m_lookup_prot[i] = bitswap<8>(i,6,2,4,0,1,5,7,3) ^ 0x4d;
-}
-
void msx_cart_holy_quran_device::initialize_cartridge()
{
- if (get_rom_size() != 0x100000)
+ u32 size = get_rom_size();
+ u16 banks = size / BANK_SIZE;
+
+ if (size > 256 * BANK_SIZE || size < 0x10000 || size != banks * BANK_SIZE || (~(banks - 1) % banks))
{
fatalerror("holy_quran: Invalid ROM size\n");
}
- restore_banks();
-}
+ m_bank_mask = banks - 1;
-void msx_cart_holy_quran_device::device_reset()
-{
- m_decrypt = false;
+ m_decrypted.resize(size);
+
+ u8 lookup_prot[256];
+ // protection uses a simple rotation on databus, some lines inverted
+ for (int i = 0; i < 0x100; i++)
+ lookup_prot[i] = bitswap<8>(i,6,2,4,0,1,5,7,3) ^ 0x4d;
+
+ for (u32 i = 0; i < size; i++)
+ m_decrypted[i] = lookup_prot[m_rom[i]];
- std::fill_n(&m_selected_bank[0], 4, 0);
- restore_banks();
+ for (int i = 0; i < 4; i++)
+ m_rombank[i]->configure_entries(0, banks, m_decrypted.data(), BANK_SIZE);
+
+ page(1)->install_view(0x4000, 0x7fff, m_view1);
+ m_view1[0].install_read_handler(0x4000, 0x7fff, read8sm_delegate(*this, FUNC(msx_cart_holy_quran_device::read)));
+ m_view1[1].install_read_bank(0x4000, 0x5fff, m_rombank[0]);
+ m_view1[1].install_read_bank(0x6000, 0x7fff, m_rombank[1]);
+ m_view1[1].install_write_handler(0x5000, 0x5000, write8smo_delegate(*this, FUNC(msx_cart_holy_quran_device::bank_w<0>)));
+ m_view1[1].install_write_handler(0x5400, 0x5400, write8smo_delegate(*this, FUNC(msx_cart_holy_quran_device::bank_w<1>)));
+ m_view1[1].install_write_handler(0x5800, 0x5800, write8smo_delegate(*this, FUNC(msx_cart_holy_quran_device::bank_w<2>)));
+ m_view1[1].install_write_handler(0x5c00, 0x5c00, write8smo_delegate(*this, FUNC(msx_cart_holy_quran_device::bank_w<3>)));
+
+ page(2)->install_view(0x8000, 0xbfff, m_view2);
+ m_view2[0].install_read_handler(0x8000, 0xbfff, read8sm_delegate(*this, FUNC(msx_cart_holy_quran_device::read2)));
+ m_view2[1].install_read_bank(0x8000, 0x9fff, m_rombank[2]);
+ m_view2[1].install_read_bank(0xa000, 0xbfff, m_rombank[3]);
}
-void msx_cart_holy_quran_device::restore_banks()
+void msx_cart_holy_quran_device::device_reset()
{
+ m_view1.select(0);
+ m_view2.select(0);
for (int i = 0; i < 4; i++)
- m_bank_base[i] = get_rom_base() + (m_selected_bank[i] & 0x7f) * 0x2000;
+ m_rombank[i]->set_entry(0);
}
-
-// mapper interface
-
-uint8_t msx_cart_holy_quran_device::read_cart(offs_t offset)
+u8 msx_cart_holy_quran_device::read(offs_t offset)
{
- if (offset >= 0x4000 && offset < 0xc000)
+ u8 data = m_rom[offset];
+ // The decryption should actually start working after the first M1 cycle executing something from the cartridge.
+ if (offset + 0x4000 == ((m_rom[3] << 8) | m_rom[2]) && !machine().side_effects_disabled())
{
- uint8_t data = m_bank_base[(offset - 0x4000) >> 13][offset & 0x1fff];
-
- if (m_decrypt)
- return m_lookup_prot[data];
-
- // The decryption should actually start working after the first M1 cycle executing something from the cartridge.
- if (offset == ((m_rom[3] << 8) | m_rom[2]) && !machine().side_effects_disabled())
- m_decrypt = true;
-
- return data;
+ // Switch to decrypted contents
+ m_view1.select(1);
+ m_view2.select(1);
}
-
- return 0xff;
+ return data;
}
-void msx_cart_holy_quran_device::write_cart(offs_t offset, uint8_t data)
+u8 msx_cart_holy_quran_device::read2(offs_t offset)
{
- switch (offset)
+ u8 data = m_rom[offset + 0x4000];
+ // The decryption should actually start working after the first M1 cycle executing something from the cartridge.
+ if (offset + 0x8000 == ((m_rom[3] << 8) | m_rom[2]) && !machine().side_effects_disabled())
{
- case 0x5000: case 0x5400: case 0x5800: case 0x5c00:
- m_selected_bank[offset >> 10 & 3] = data;
- restore_banks();
- break;
-
- default:
- logerror("msx_cart_holy_quran_device: unhandled write %02x to %04x\n", data, offset);
- break;
+ // Switch to decrypted contents
+ m_view1.select(1);
+ m_view2.select(1);
}
+ return data;
+}
+
+template <int Bank>
+void msx_cart_holy_quran_device::bank_w(u8 data)
+{
+ m_rombank[Bank]->set_entry(data & m_bank_mask);
}
diff --git a/src/devices/bus/msx_cart/holy_quran.h b/src/devices/bus/msx_cart/holy_quran.h
index 25b1ddf8f50..0e8d73afbef 100644
--- a/src/devices/bus/msx_cart/holy_quran.h
+++ b/src/devices/bus/msx_cart/holy_quran.h
@@ -14,26 +14,28 @@ DECLARE_DEVICE_TYPE(MSX_CART_HOLY_QURAN, msx_cart_holy_quran_device)
class msx_cart_holy_quran_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_holy_quran_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_holy_quran_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
- virtual void device_post_load() override { restore_banks(); }
-
- void restore_banks();
private:
- uint8_t m_lookup_prot[256];
- uint8_t m_selected_bank[4];
- uint8_t *m_bank_base[4];
- bool m_decrypt;
+ static constexpr size_t BANK_SIZE = 0x2000;
+
+ u8 read(offs_t offset);
+ u8 read2(offs_t offset);
+ template <int Bank> void bank_w(u8 data);
+
+ memory_bank_array_creator<4> m_rombank;
+ memory_view m_view1;
+ memory_view m_view2;
+
+ std::vector<u8> m_decrypted;
+ u8 m_bank_mask;
};
diff --git a/src/devices/bus/msx_cart/ink.cpp b/src/devices/bus/msx_cart/ink.cpp
index e3053a5da7d..abf48b37154 100644
--- a/src/devices/bus/msx_cart/ink.cpp
+++ b/src/devices/bus/msx_cart/ink.cpp
@@ -22,13 +22,13 @@ msx_cart_ink_device::msx_cart_ink_device(const machine_config &mconfig, const ch
{
}
-ROM_START( msx_cart_ink )
+ROM_START(msx_cart_ink)
ROM_REGION(0x80000, "flash", ROMREGION_ERASEFF)
ROM_END
const tiny_rom_entry *msx_cart_ink_device::device_rom_region() const
{
- return ROM_NAME( msx_cart_ink );
+ return ROM_NAME(msx_cart_ink);
}
void msx_cart_ink_device::device_add_mconfig(machine_config &config)
@@ -38,18 +38,24 @@ void msx_cart_ink_device::device_add_mconfig(machine_config &config)
void msx_cart_ink_device::initialize_cartridge()
{
- size_t size = get_rom_size() > 0x80000 ? 0x80000 : get_rom_size();
- memcpy(memregion("flash")->base(), get_rom_base(), size);
+ size_t size = std::min<size_t>(0x80000, get_rom_size());
+
+ u8 *flash = memregion("flash")->base();
+ memcpy(flash, get_rom_base(), size);
+
+ page(0)->install_rom(0x0000, 0x3fff, flash);
+ page(1)->install_rom(0x4000, 0x7fff, flash + 0x4000);
+ page(2)->install_rom(0x8000, 0xbfff, flash + 0x8000);
+ page(3)->install_rom(0xc000, 0xffff, flash + 0xc000);
+ page(0)->install_write_handler(0x0000, 0x3fff, write8sm_delegate(*this, FUNC(msx_cart_ink_device::write_page<0>)));
+ page(1)->install_write_handler(0x4000, 0x7fff, write8sm_delegate(*this, FUNC(msx_cart_ink_device::write_page<1>)));
+ page(2)->install_write_handler(0x8000, 0xbfff, write8sm_delegate(*this, FUNC(msx_cart_ink_device::write_page<2>)));
+ page(3)->install_write_handler(0xc000, 0xffff, write8sm_delegate(*this, FUNC(msx_cart_ink_device::write_page<3>)));
}
-
-uint8_t msx_cart_ink_device::read_cart(offs_t offset)
-{
- return m_flash->read(offset);
-}
-
-void msx_cart_ink_device::write_cart(offs_t offset, uint8_t data)
+template <int Page>
+void msx_cart_ink_device::write_page(offs_t offset, u8 data)
{
// /RD connects to flashrom A16-A18
- m_flash->write(offset | 0x70000, data);
+ m_flash->write(offset | 0x70000 | (Page * 0x4000), data);
}
diff --git a/src/devices/bus/msx_cart/ink.h b/src/devices/bus/msx_cart/ink.h
index 933385c575d..eb857dd147d 100644
--- a/src/devices/bus/msx_cart/ink.h
+++ b/src/devices/bus/msx_cart/ink.h
@@ -19,17 +19,16 @@ public:
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override { ; }
+ virtual void device_start() override { }
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
private:
required_device<amd_29f040_device> m_flash;
+
+ template <int Page> void write_page(offs_t offset, u8 data);
};
diff --git a/src/devices/bus/msx_cart/kanji.cpp b/src/devices/bus/msx_cart/kanji.cpp
new file mode 100644
index 00000000000..215121d7559
--- /dev/null
+++ b/src/devices/bus/msx_cart/kanji.cpp
@@ -0,0 +1,147 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol
+/**********************************************************************************
+
+TODO:
+- Verify real contents of the kanji roms. The current dumps seem to have
+ been read from inside a running MSX machine. The content retrieved that
+ way may not be how they are stored in the rom.
+
+**********************************************************************************/
+
+#include "emu.h"
+#include "kanji.h"
+
+#include "speaker.h"
+
+
+#define VERBOSE 0
+#include "logmacro.h"
+
+
+DEFINE_DEVICE_TYPE(MSX_CART_KANJI, msx_cart_kanji_device, "msx_cart_kanji", "MSX Cartridge - Kanji")
+DEFINE_DEVICE_TYPE(MSX_CART_MSXWRITE, msx_cart_msxwrite_device, "msx_cart_msxwrite", "MSX Cartridge - MSXWRITE")
+
+
+msx_cart_kanji_device::msx_cart_kanji_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : msx_cart_kanji_device(mconfig, MSX_CART_KANJI, tag, owner, clock)
+{
+}
+
+msx_cart_kanji_device::msx_cart_kanji_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , msx_cart_interface(mconfig, *this)
+ , m_kanji_mask(0)
+ , m_kanji_address(0)
+{
+}
+
+void msx_cart_kanji_device::device_reset()
+{
+ m_kanji_address = 0;
+}
+
+void msx_cart_kanji_device::device_start()
+{
+ save_item(NAME(m_kanji_address));
+}
+
+void msx_cart_kanji_device::initialize_cartridge()
+{
+ u32 size = get_kanji_size();
+
+ if (size != 0x20000)
+ {
+ fatalerror("kanji: Invalid ROM size\n");
+ }
+
+ m_kanji_mask = size - 1;
+
+ // Install IO read/write handlers
+ io_space().install_write_handler(0xd8, 0xd9, write8sm_delegate(*this, FUNC(msx_cart_kanji_device::kanji_w)));
+ io_space().install_read_handler(0xd9, 0xd9, read8sm_delegate(*this, FUNC(msx_cart_kanji_device::kanji_r)));
+}
+
+u8 msx_cart_kanji_device::kanji_r(offs_t offset)
+{
+ u8 result = get_kanji_base()[m_kanji_address];
+
+ if (!machine().side_effects_disabled())
+ {
+ m_kanji_address = (m_kanji_address & ~0x1f) | ((m_kanji_address + 1) & 0x1f);
+ }
+ return result;
+}
+
+void msx_cart_kanji_device::kanji_w(offs_t offset, u8 data)
+{
+ if (offset)
+ m_kanji_address = (m_kanji_address & 0x007e0) | ((data & 0x3f) << 11);
+ else
+ m_kanji_address = (m_kanji_address & 0x1f800) | ((data & 0x3f) << 5);
+
+ m_kanji_address = m_kanji_address & m_kanji_mask;
+}
+
+
+
+static INPUT_PORTS_START(msxwrite_kanji_enable_switch)
+ PORT_START("KANJI")
+ PORT_CONFNAME(0x01, 0x01, "Kanji is")
+ PORT_CONFSETTING(0x00, "disabled")
+ PORT_CONFSETTING(0x01, "enabled")
+INPUT_PORTS_END
+
+
+msx_cart_msxwrite_device::msx_cart_msxwrite_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : msx_cart_kanji_device(mconfig, MSX_CART_MSXWRITE, tag, owner, clock)
+ , m_rombank(*this, "rombank%u", 0U)
+ , m_kanji_switch(*this, "KANJI")
+ , m_bank_mask(0)
+{
+}
+
+ioport_constructor msx_cart_msxwrite_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(msxwrite_kanji_enable_switch);
+}
+
+void msx_cart_msxwrite_device::device_reset()
+{
+ msx_cart_kanji_device::device_reset();
+
+ m_rombank[0]->set_entry(0);
+ m_rombank[1]->set_entry(0);
+
+ if (BIT(m_kanji_switch->read(), 0))
+ msx_cart_kanji_device::initialize_cartridge();
+}
+
+void msx_cart_msxwrite_device::initialize_cartridge()
+{
+ u32 size = get_rom_size();
+ u16 banks = size / BANK_SIZE;
+
+ if (size > 256 * BANK_SIZE || size != banks * BANK_SIZE || (~(banks - 1) % banks))
+ {
+ fatalerror("msxwrite: Invalid ROM size\n");
+ }
+
+ m_bank_mask = banks - 1;
+
+ for (int i = 0; i < 2; i++)
+ m_rombank[i]->configure_entries(0, banks, get_rom_base(), BANK_SIZE);
+
+ page(1)->install_read_bank(0x4000, 0x7fff, m_rombank[0]);
+ // The rom writes to 6fff and 7fff for banking, unknown whether
+ // other locations also trigger banking.
+ page(1)->install_write_handler(0x6fff, 0x6fff, write8smo_delegate(*this, FUNC(msx_cart_msxwrite_device::bank_w<0>)));
+ page(1)->install_write_handler(0x7fff, 0x7fff, write8smo_delegate(*this, FUNC(msx_cart_msxwrite_device::bank_w<1>)));
+ page(2)->install_read_bank(0x8000, 0xbfff, m_rombank[1]);
+}
+
+template <int Bank>
+void msx_cart_msxwrite_device::bank_w(u8 data)
+{
+ m_rombank[Bank]->set_entry(data & m_bank_mask);
+}
diff --git a/src/devices/bus/msx_cart/kanji.h b/src/devices/bus/msx_cart/kanji.h
new file mode 100644
index 00000000000..ed420750056
--- /dev/null
+++ b/src/devices/bus/msx_cart/kanji.h
@@ -0,0 +1,59 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol
+#ifndef MAME_BUS_MSX_CART_KANJI_H
+#define MAME_BUS_MSX_CART_KANJI_H
+
+#pragma once
+
+#include "bus/msx_cart/cartridge.h"
+
+
+DECLARE_DEVICE_TYPE(MSX_CART_KANJI, msx_cart_kanji_device)
+DECLARE_DEVICE_TYPE(MSX_CART_MSXWRITE, msx_cart_msxwrite_device)
+
+
+class msx_cart_kanji_device : public device_t, public msx_cart_interface
+{
+public:
+ msx_cart_kanji_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void initialize_cartridge() override;
+
+protected:
+ msx_cart_kanji_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ u8 kanji_r(offs_t offset);
+ void kanji_w(offs_t offset, u8 data);
+
+ u32 m_kanji_mask;
+ u32 m_kanji_address;
+};
+
+
+class msx_cart_msxwrite_device : public msx_cart_kanji_device
+{
+public:
+ msx_cart_msxwrite_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void initialize_cartridge() override;
+
+protected:
+ // device-level overrides
+ virtual void device_reset() override;
+ virtual ioport_constructor device_input_ports() const override;
+
+private:
+ static constexpr size_t BANK_SIZE = 0x4000;
+
+ template <int Bank> void bank_w(u8 data);
+
+ memory_bank_array_creator<2> m_rombank;
+ required_ioport m_kanji_switch;
+ u8 m_bank_mask;
+};
+
+#endif // MAME_BUS_MSX_CART_KANJI_H
diff --git a/src/devices/bus/msx_cart/konami.cpp b/src/devices/bus/msx_cart/konami.cpp
index 5954cb95091..d9774e138e2 100644
--- a/src/devices/bus/msx_cart/konami.cpp
+++ b/src/devices/bus/msx_cart/konami.cpp
@@ -15,112 +15,53 @@ DEFINE_DEVICE_TYPE(MSX_CART_SOUND_SDSNATCHER, msx_cart_konami_sound_sdsnatcher_d
DEFINE_DEVICE_TYPE(MSX_CART_KEYBOARD_MASTER, msx_cart_keyboard_master_device, "msx_cart_keyboard_master", "MSX Cartridge - Keyboard Master")
-msx_cart_konami_device::msx_cart_konami_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_konami_device::msx_cart_konami_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_KONAMI, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
+ , m_rombank(*this, "rombank%u", 0U)
, m_bank_mask(0)
{
- for (int i = 0; i < 4; i++)
- {
- m_selected_bank[i] = i;
- }
- for (auto & elem : m_bank_base)
- {
- elem = nullptr;
- }
-}
-
-
-void msx_cart_konami_device::device_start()
-{
- save_item(NAME(m_selected_bank));
}
-
-void msx_cart_konami_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_konami_device::restore_banks()
-{
- m_bank_base[0] = get_rom_base() + ( m_selected_bank[0] & m_bank_mask ) * 0x2000;
- m_bank_base[1] = get_rom_base() + ( m_selected_bank[1] & m_bank_mask ) * 0x2000;
- m_bank_base[2] = get_rom_base() + ( m_selected_bank[0] & m_bank_mask ) * 0x2000;
- m_bank_base[3] = get_rom_base() + ( m_selected_bank[1] & m_bank_mask ) * 0x2000;
- m_bank_base[4] = get_rom_base() + ( m_selected_bank[2] & m_bank_mask ) * 0x2000;
- m_bank_base[5] = get_rom_base() + ( m_selected_bank[3] & m_bank_mask ) * 0x2000;
- m_bank_base[6] = get_rom_base() + ( m_selected_bank[2] & m_bank_mask ) * 0x2000;
- m_bank_base[7] = get_rom_base() + ( m_selected_bank[3] & m_bank_mask ) * 0x2000;
-}
-
-
void msx_cart_konami_device::device_reset()
{
for (int i = 0; i < 4; i++)
- {
- m_selected_bank[i] = i;
- }
+ m_rombank[i]->set_entry(i);
}
-
void msx_cart_konami_device::initialize_cartridge()
{
- uint32_t size = get_rom_size();
+ u32 size = get_rom_size();
+ u16 banks = size / 0x2000;
- if ( get_rom_size() > 256 * 0x2000 )
- {
- fatalerror("konami: ROM is too big\n");
- }
-
- uint16_t banks = size / 0x2000;
-
- if (size != banks * 0x2000 || (~(banks - 1) % banks))
+ if (size > 256 * 0x2000 || size < 4 * 0x2000 || size != banks * 0x2000 || (~(banks - 1) % banks))
{
fatalerror("konami: Invalid ROM size\n");
}
m_bank_mask = banks - 1;
- restore_banks();
-}
-
+ for (int i = 0; i < 4; i++)
+ m_rombank[i]->configure_entries(0, banks, get_rom_base(), 0x2000);
-uint8_t msx_cart_konami_device::read_cart(offs_t offset)
-{
- return m_bank_base[offset >> 13][offset & 0x1fff];
+ page(0)->install_read_bank(0x0000, 0x1fff, m_rombank[0]);
+ page(0)->install_read_bank(0x2000, 0x3fff, m_rombank[1]);
+ page(1)->install_read_bank(0x4000, 0x5fff, m_rombank[0]);
+ page(1)->install_write_handler(0x4000, 0x47ff, 0, 0x1000, 0, write8smo_delegate(*this, FUNC(msx_cart_konami_device::bank_w<0>)));
+ page(1)->install_read_bank(0x6000, 0x7fff, m_rombank[1]);
+ page(1)->install_write_handler(0x6000, 0x67ff, 0, 0x1000, 0, write8smo_delegate(*this, FUNC(msx_cart_konami_device::bank_w<1>)));
+ page(2)->install_read_bank(0x8000, 0x9fff, m_rombank[2]);
+ page(2)->install_write_handler(0x8000, 0x87ff, 0, 0x1000, 0, write8smo_delegate(*this, FUNC(msx_cart_konami_device::bank_w<2>)));
+ page(2)->install_read_bank(0xa000, 0xbfff, m_rombank[3]);
+ page(2)->install_write_handler(0xa000, 0xa7ff, 0, 0x1000, 0, write8smo_delegate(*this, FUNC(msx_cart_konami_device::bank_w<3>)));
+ page(3)->install_read_bank(0xc000, 0xdfff, m_rombank[2]);
+ page(3)->install_read_bank(0xe000, 0xffff, m_rombank[3]);
}
-
-void msx_cart_konami_device::write_cart(offs_t offset, uint8_t data)
+template <int Bank>
+void msx_cart_konami_device::bank_w(u8 data)
{
- switch (offset & 0xe000)
- {
- case 0x4000:
- m_selected_bank[0] = data;
- m_bank_base[0] = get_rom_base() + ( m_selected_bank[0] & m_bank_mask ) * 0x2000;
- m_bank_base[2] = get_rom_base() + ( m_selected_bank[0] & m_bank_mask ) * 0x2000;
- break;
-
- case 0x6000:
- m_selected_bank[1] = data;
- m_bank_base[1] = get_rom_base() + ( m_selected_bank[1] & m_bank_mask ) * 0x2000;
- m_bank_base[3] = get_rom_base() + ( m_selected_bank[1] & m_bank_mask ) * 0x2000;
- break;
-
- case 0x8000:
- m_selected_bank[2] = data;
- m_bank_base[4] = get_rom_base() + ( m_selected_bank[2] & m_bank_mask ) * 0x2000;
- m_bank_base[6] = get_rom_base() + ( m_selected_bank[2] & m_bank_mask ) * 0x2000;
- break;
-
- case 0xa000:
- m_selected_bank[3] = data;
- m_bank_base[5] = get_rom_base() + ( m_selected_bank[3] & m_bank_mask ) * 0x2000;
- m_bank_base[7] = get_rom_base() + ( m_selected_bank[3] & m_bank_mask ) * 0x2000;
- break;
- }
+ m_rombank[Bank]->set_entry(data & m_bank_mask);
}
@@ -130,20 +71,12 @@ msx_cart_konami_scc_device::msx_cart_konami_scc_device(const machine_config &mco
: device_t(mconfig, MSX_CART_KONAMI_SCC, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
, m_k051649(*this, "k051649")
+ , m_rombank(*this, "rombank%u", 0U)
+ , m_scc_view(*this, "scc_view")
, m_bank_mask(0)
- , m_scc_active(false)
{
- for (int i = 0; i < 4; i++)
- {
- m_selected_bank[i] = i;
- }
- for (auto & elem : m_bank_base)
- {
- elem = nullptr;
- }
}
-
void msx_cart_konami_scc_device::device_add_mconfig(machine_config &config)
{
// 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'.
@@ -151,147 +84,61 @@ void msx_cart_konami_scc_device::device_add_mconfig(machine_config &config)
K051649(config, m_k051649, XTAL(10'738'635)/3).add_route(ALL_OUTPUTS, "mono", 0.15);
}
-
-void msx_cart_konami_scc_device::device_start()
-{
- save_item(NAME(m_selected_bank));
- save_item(NAME(m_scc_active));
-}
-
-
-void msx_cart_konami_scc_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_konami_scc_device::restore_banks()
-{
- m_bank_base[0] = get_rom_base() + ( m_selected_bank[2] & m_bank_mask ) * 0x2000;
- m_bank_base[1] = get_rom_base() + ( m_selected_bank[3] & m_bank_mask ) * 0x2000;
- m_bank_base[2] = get_rom_base() + ( m_selected_bank[0] & m_bank_mask ) * 0x2000;
- m_bank_base[3] = get_rom_base() + ( m_selected_bank[1] & m_bank_mask ) * 0x2000;
- m_bank_base[4] = get_rom_base() + ( m_selected_bank[2] & m_bank_mask ) * 0x2000;
- m_bank_base[5] = get_rom_base() + ( m_selected_bank[3] & m_bank_mask ) * 0x2000;
- m_bank_base[6] = get_rom_base() + ( m_selected_bank[0] & m_bank_mask ) * 0x2000;
- m_bank_base[7] = get_rom_base() + ( m_selected_bank[1] & m_bank_mask ) * 0x2000;
-}
-
-
void msx_cart_konami_scc_device::device_reset()
{
+ m_scc_view.select(0);
for (int i = 0; i < 4; i++)
- {
- m_selected_bank[i] = i;
- }
- m_scc_active = false;
+ m_rombank[i]->set_entry(i);
}
-
void msx_cart_konami_scc_device::initialize_cartridge()
{
- uint32_t size = get_rom_size();
+ u32 size = get_rom_size();
+ u16 banks = size / 0x2000;
- if ( get_rom_size() > 256 * 0x2000 )
- {
- fatalerror("konami_scc: ROM is too big\n");
- }
-
- uint16_t banks = size / 0x2000;
-
- if (size != banks * 0x2000 || (~(banks - 1) % banks))
+ if (size > 256 * 0x2000 || size < 0x8000 || size != banks * 0x2000 || (~(banks - 1) % banks))
{
fatalerror("konami_scc: Invalid ROM size\n");
}
m_bank_mask = banks - 1;
- restore_banks();
-}
-
-
-uint8_t msx_cart_konami_scc_device::read_cart(offs_t offset)
-{
- if ( m_scc_active && offset >= 0x9800 && offset < 0xa000 )
- {
- if (offset & 0x80)
- {
- if ((offset & 0xff) >= 0xe0)
- {
- return m_k051649->k051649_test_r();
- }
- return 0xff;
- }
- else
- {
- return m_k051649->k051649_waveform_r(offset & 0x7f);
- }
- }
+ for (int i = 0; i < 4; i++)
+ m_rombank[i]->configure_entries(0, banks, get_rom_base(), 0x2000);
- return m_bank_base[offset >> 13][offset & 0x1fff];
+ page(0)->install_read_bank(0x0000, 0x1fff, m_rombank[2]);
+ page(0)->install_read_bank(0x2000, 0x3fff, m_rombank[3]);
+ page(1)->install_read_bank(0x4000, 0x5fff, m_rombank[0]);
+ page(1)->install_write_handler(0x5000, 0x57ff, write8smo_delegate(*this, FUNC(msx_cart_konami_scc_device::bank_w<0>)));
+ page(1)->install_read_bank(0x6000, 0x7fff, m_rombank[1]);
+ page(1)->install_write_handler(0x7000, 0x77ff, write8smo_delegate(*this, FUNC(msx_cart_konami_scc_device::bank_w<1>)));
+ page(2)->install_view(0x8000, 0x9fff, m_scc_view);
+ m_scc_view[0].install_read_bank(0x8000, 0x9fff, m_rombank[2]);
+ m_scc_view[0].install_write_handler(0x9000, 0x97ff, write8smo_delegate(*this, FUNC(msx_cart_konami_scc_device::bank_w<2>)));
+ m_scc_view[1].install_read_bank(0x8000, 0x9fff, m_rombank[2]);
+ m_scc_view[1].install_write_handler(0x9000, 0x97ff, write8smo_delegate(*this, FUNC(msx_cart_konami_scc_device::bank_w<2>)));
+ m_scc_view[1].install_read_handler(0x9800, 0x987f, 0, 0x0700, 0, read8sm_delegate(m_k051649, FUNC(k051649_device::k051649_waveform_r)));
+ m_scc_view[1].install_write_handler(0x9800, 0x987f, 0, 0x0700, 0, write8sm_delegate(m_k051649, FUNC(k051649_device::k051649_waveform_w)));
+ m_scc_view[1].install_write_handler(0x9880, 0x9889, 0, 0x0710, 0, write8sm_delegate(m_k051649, FUNC(k051649_device::k051649_frequency_w)));
+ m_scc_view[1].install_write_handler(0x988a, 0x988e, 0, 0x0710, 0, write8sm_delegate(m_k051649, FUNC(k051649_device::k051649_volume_w)));
+ m_scc_view[1].install_write_handler(0x988f, 0x988f, 0, 0x0710, 0, write8smo_delegate(m_k051649, FUNC(k051649_device::k051649_keyonoff_w)));
+ m_scc_view[1].install_read_handler(0x98c0, 0x98c0, 0, 0x071f, 0, read8smo_delegate(m_k051649, FUNC(k051649_device::k051649_test_r)));
+ m_scc_view[1].install_write_handler(0x98c0, 0x98c0, 0, 0x071f, 0, write8smo_delegate(m_k051649, FUNC(k051649_device::k051649_test_w)));
+ page(2)->install_read_bank(0x8000, 0x9fff, m_rombank[2]);
+ page(2)->install_write_handler(0x9000, 0x97ff, write8smo_delegate(*this, FUNC(msx_cart_konami_scc_device::bank_w<2>)));
+ page(2)->install_read_bank(0xa000, 0xbfff, m_rombank[3]);
+ page(2)->install_write_handler(0xb000, 0xb7ff, write8smo_delegate(*this, FUNC(msx_cart_konami_scc_device::bank_w<3>)));
+ page(3)->install_read_bank(0xc000, 0xdfff, m_rombank[0]);
+ page(3)->install_read_bank(0xe000, 0xffff, m_rombank[1]);
}
-
-void msx_cart_konami_scc_device::write_cart(offs_t offset, uint8_t data)
+template <int Bank>
+void msx_cart_konami_scc_device::bank_w(u8 data)
{
- switch (offset & 0xf800)
+ m_rombank[Bank]->set_entry(data & m_bank_mask);
+ if (Bank == 2)
{
- case 0x5000:
- m_selected_bank[0] = data;
- m_bank_base[2] = get_rom_base() + ( m_selected_bank[0] & m_bank_mask ) * 0x2000;
- m_bank_base[6] = get_rom_base() + ( m_selected_bank[0] & m_bank_mask ) * 0x2000;
- break;
-
- case 0x7000:
- m_selected_bank[1] = data;
- m_bank_base[3] = get_rom_base() + ( m_selected_bank[1] & m_bank_mask ) * 0x2000;
- m_bank_base[7] = get_rom_base() + ( m_selected_bank[1] & m_bank_mask ) * 0x2000;
- break;
-
- case 0x9000:
- m_selected_bank[2] = data;
- m_scc_active = ( ( data & 0x3f ) == 0x3f );
- m_bank_base[0] = get_rom_base() + ( m_selected_bank[2] & m_bank_mask ) * 0x2000;
- m_bank_base[4] = get_rom_base() + ( m_selected_bank[2] & m_bank_mask ) * 0x2000;
- break;
-
- case 0x9800:
- if ( m_scc_active )
- {
- offset &= 0xff;
-
- if (offset < 0x80)
- {
- m_k051649->k051649_waveform_w(offset, data);
- }
- else if (offset < 0xa0)
- {
- offset &= 0x0f;
- if (offset < 0x0a)
- {
- m_k051649->k051649_frequency_w(offset, data);
- }
- else if (offset < 0x0f)
- {
- m_k051649->k051649_volume_w(offset - 0xa, data);
- }
- else
- {
- m_k051649->k051649_keyonoff_w(data);
- }
- }
- else if (offset >= 0xe0)
- {
- m_k051649->k051649_test_w(data);
- }
- }
- break;
-
- case 0xb000:
- m_selected_bank[3] = data;
- m_bank_base[1] = get_rom_base() + ( m_selected_bank[3] & m_bank_mask ) * 0x2000;
- m_bank_base[5] = get_rom_base() + ( m_selected_bank[3] & m_bank_mask ) * 0x2000;
- break;
+ m_scc_view.select(((data & 0x3f) == 0x3f) ? 1 : 0);
}
}
@@ -300,261 +147,131 @@ void msx_cart_konami_scc_device::write_cart(offs_t offset, uint8_t data)
-msx_cart_gamemaster2_device::msx_cart_gamemaster2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_gamemaster2_device::msx_cart_gamemaster2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_GAMEMASTER2, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
+ , m_rombank(*this, "rombank%u", 0U)
+ , m_rambank(*this, "rambank%u", 0U)
+ , m_view0(*this, "view0")
+ , m_view1(*this, "view1")
+ , m_view2(*this, "view2")
{
- for (auto & elem : m_selected_bank)
- {
- elem = 0;
- }
- for (auto & elem : m_bank_base)
- {
- elem = nullptr;
- }
-}
-
-
-void msx_cart_gamemaster2_device::device_start()
-{
- save_item(NAME(m_selected_bank));
-}
-
-
-void msx_cart_gamemaster2_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_gamemaster2_device::setup_bank(uint8_t bank)
-{
- switch (bank)
- {
- case 0:
- if (m_selected_bank[0] & 0x10)
- {
- m_bank_base[1] = get_sram_base() + ((m_selected_bank[0] & 0x20) ? 0x1000 : 0);
- m_bank_base[3] = get_sram_base() + ((m_selected_bank[0] & 0x20) ? 0x1000 : 0);
- }
- else
- {
- m_bank_base[1] = get_rom_base() + ( m_selected_bank[0] & 0x0f ) * 0x2000;
- m_bank_base[3] = get_rom_base() + ( m_selected_bank[0] & 0x0f ) * 0x2000;
- }
- break;
-
- case 1:
- if (m_selected_bank[1] & 0x10)
- {
- m_bank_base[4] = get_sram_base() + ((m_selected_bank[1] & 0x20) ? 0x1000 : 0);
- m_bank_base[6] = get_sram_base() + ((m_selected_bank[1] & 0x20) ? 0x1000 : 0);
- }
- else
- {
- m_bank_base[4] = get_rom_base() + ( m_selected_bank[1] & 0x0f ) * 0x2000;
- m_bank_base[6] = get_rom_base() + ( m_selected_bank[1] & 0x0f ) * 0x2000;
- }
- break;
-
- case 2:
- if (m_selected_bank[2] & 0x10)
- {
- m_bank_base[5] = get_sram_base() + ((m_selected_bank[2] & 0x20) ? 0x1000 : 0);
- m_bank_base[7] = get_sram_base() + ((m_selected_bank[2] & 0x20) ? 0x1000 : 0);
- }
- else
- {
- m_bank_base[5] = get_rom_base() + ( m_selected_bank[2] & 0x0f ) * 0x2000;
- m_bank_base[7] = get_rom_base() + ( m_selected_bank[2] & 0x0f ) * 0x2000;
- }
- break;
- }
-}
-
-
-void msx_cart_gamemaster2_device::restore_banks()
-{
- m_bank_base[0] = get_rom_base();
- m_bank_base[2] = get_rom_base();
- setup_bank(0);
- setup_bank(1);
- setup_bank(2);
}
-
void msx_cart_gamemaster2_device::device_reset()
{
- for (int i = 0; i < 3; i++)
- {
- m_selected_bank[i] = i + 1;
- }
+ m_rombank[0]->set_entry(1);
+ m_rombank[1]->set_entry(1);
+ m_rombank[2]->set_entry(2);
+ m_view0.select(0);
+ m_view1.select(0);
+ m_view2.select(0);
}
-
void msx_cart_gamemaster2_device::initialize_cartridge()
{
- if ( get_rom_size() != 0x20000 )
+ u32 size = get_rom_size();
+ u16 banks = size / 0x2000;
+
+ if (size != 0x20000)
{
fatalerror("gamemaster2: Invalid ROM size\n");
}
-
if (get_sram_size() != 0x2000)
{
fatalerror("gamemaster2: Invalid SRAM size\n");
}
- restore_banks();
-}
+ for (int i = 0; i < 3; i++)
+ {
+ m_rombank[i]->configure_entries(0, banks, get_rom_base(), 0x2000);
+ m_rambank[i]->configure_entries(0, 2, get_sram_base(), 0x1000);
+ }
+ page(1)->install_rom(0x4000, 0x5fff, get_rom_base());
-uint8_t msx_cart_gamemaster2_device::read_cart(offs_t offset)
-{
- uint8_t bank = offset >> 13;
+ page(1)->install_view(0x6000, 0x7fff, m_view0);
+ m_view0[0].install_read_bank(0x6000, 0x7fff, m_rombank[0]);
+ m_view0[0].install_write_handler(0x6000, 0x6fff, write8smo_delegate(*this, FUNC(msx_cart_gamemaster2_device::bank_w<0>)));
+ m_view0[1].install_read_bank(0x6000, 0x6fff, 0x1000, m_rambank[0]);
+ m_view0[1].install_write_handler(0x6000, 0x6fff, write8smo_delegate(*this, FUNC(msx_cart_gamemaster2_device::bank_w<0>)));
- switch (bank)
- {
- case 1:
- case 3:
- if (m_selected_bank[0] & 0x10)
- {
- return m_bank_base[bank][offset & 0x0fff];
- }
- break;
-
- case 4:
- case 6:
- if (m_selected_bank[1] & 0x10)
- {
- return m_bank_base[bank][offset & 0x0fff];
- }
- break;
-
- case 5:
- case 7:
- if (m_selected_bank[2] & 0x10)
- {
- return m_bank_base[bank][offset & 0x0fff];
- }
- break;
- }
- return m_bank_base[bank][offset & 0x1fff];
-}
+ page(2)->install_view(0x8000, 0x9fff, m_view1);
+ m_view1[0].install_read_bank(0x8000, 0x9fff, m_rombank[1]);
+ m_view1[0].install_write_handler(0x8000, 0x8fff, write8smo_delegate(*this, FUNC(msx_cart_gamemaster2_device::bank_w<1>)));
+ m_view1[1].install_read_bank(0x8000, 0x8fff, 0x1000, m_rambank[1]);
+ m_view1[1].install_write_handler(0x8000, 0x8fff, write8smo_delegate(*this, FUNC(msx_cart_gamemaster2_device::bank_w<1>)));
+ page(2)->install_view(0xa000, 0xbfff, m_view2);
+ m_view2[0].install_read_bank(0xa000, 0xbfff, m_rombank[2]);
+ m_view2[0].install_write_handler(0xa000, 0xafff, write8smo_delegate(*this, FUNC(msx_cart_gamemaster2_device::bank_w<2>)));
+ m_view2[1].install_read_bank(0xa000, 0xafff, m_rambank[2]);
+ m_view2[1].install_write_handler(0xa000, 0xafff, write8smo_delegate(*this, FUNC(msx_cart_gamemaster2_device::bank_w<2>)));
+ m_view2[1].install_readwrite_bank(0xb000, 0xbfff, m_rambank[2]);
+}
-void msx_cart_gamemaster2_device::write_cart(offs_t offset, uint8_t data)
+template <int Bank>
+void msx_cart_gamemaster2_device::bank_w(u8 data)
{
- switch (offset & 0xf000)
- {
- case 0x6000:
- m_selected_bank[0] = data;
- setup_bank(0);
- break;
-
- case 0x8000:
- m_selected_bank[1] = data;
- setup_bank(1);
- break;
-
- case 0xa000:
- m_selected_bank[2] = data;
- setup_bank(2);
- break;
-
- case 0xb000:
- if (m_selected_bank[2] & 0x10)
- {
- m_bank_base[5][offset & 0x0fff] = data;
- }
- break;
- }
+ m_rombank[Bank]->set_entry(data & 0x0f);
+ m_rambank[Bank]->set_entry(BIT(data, 5) ? 1 : 0);
+ if (Bank == 0)
+ m_view0.select(BIT(data, 4) ? 1 : 0);
+ if (Bank == 1)
+ m_view1.select(BIT(data, 4) ? 1 : 0);
+ if (Bank == 2)
+ m_view2.select(BIT(data, 4) ? 1 : 0);
}
-msx_cart_synthesizer_device::msx_cart_synthesizer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_synthesizer_device::msx_cart_synthesizer_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_SYNTHESIZER, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
- , m_bank_base(nullptr)
, m_dac(*this, "dac")
{
}
-
void msx_cart_synthesizer_device::device_add_mconfig(machine_config &config)
{
// 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'.
SPEAKER(config, "speaker").front_center();
- DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.1); // unknown DAC
-}
-
-
-void msx_cart_synthesizer_device::device_start()
-{
+ DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.3); // unknown DAC
}
-
void msx_cart_synthesizer_device::initialize_cartridge()
{
- if ( get_rom_size() != 0x8000 )
+ if (get_rom_size() != 0x8000)
{
fatalerror("synthesizer: Invalid ROM size\n");
}
- m_bank_base = get_rom_base();
-}
-
-
-uint8_t msx_cart_synthesizer_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0xc000 )
- {
- return m_bank_base[offset - 0x4000];
- }
- return 0xff;
-}
-
-
-void msx_cart_synthesizer_device::write_cart(offs_t offset, uint8_t data)
-{
- if ((offset & 0xc010) == 0x4000)
- {
- m_dac->write(data);
- }
+ page(1)->install_rom(0x4000, 0x7fff, get_rom_base());
+ page(1)->install_write_handler(0x4000, 0x4000, 0, 0x3fef, 0, write8smo_delegate(m_dac, FUNC(dac_byte_interface::write)));
+ page(2)->install_rom(0x8000, 0xbfff, get_rom_base() + 0x4000);
}
-msx_cart_konami_sound_device::msx_cart_konami_sound_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_konami_sound_device::msx_cart_konami_sound_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 min_rambank, u8 max_rambank)
: device_t(mconfig, type, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
, m_k052539(*this, "k052539")
- , m_scc_active(false)
- , m_sccplus_active(false)
- , m_scc_mode(0)
+ , m_rambank(*this, "rambank%u", 0U)
+ , m_view0(*this, "view0")
+ , m_view1(*this, "view1")
+ , m_view2(*this, "view2")
+ , m_view3(*this, "view3")
+ , m_min_rambank(min_rambank)
+ , m_max_rambank(max_rambank)
+ , m_selected_bank{0, 0, 0, 0}
+ , m_control(0)
{
- for (auto & elem : m_selected_bank)
- {
- elem = 0;
- }
- for (auto & elem : m_bank_base)
- {
- elem = nullptr;
- }
- for (auto & elem : m_ram_bank)
- {
- elem = nullptr;
- }
- for (auto & elem : m_ram_enabled)
- {
- elem = false;
- }
}
-
void msx_cart_konami_sound_device::device_add_mconfig(machine_config &config)
{
// 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'.
@@ -562,330 +279,208 @@ void msx_cart_konami_sound_device::device_add_mconfig(machine_config &config)
K051649(config, m_k052539, XTAL(10'738'635)/3).add_route(ALL_OUTPUTS, "mono", 0.15);
}
-
void msx_cart_konami_sound_device::device_start()
{
save_item(NAME(m_selected_bank));
- save_item(NAME(m_scc_active));
- save_item(NAME(m_sccplus_active));
- save_item(NAME(m_ram_enabled));
-}
-
-
-void msx_cart_konami_sound_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_konami_sound_device::restore_banks()
-{
- for (int i = 0; i < 4; i++)
- {
- setup_bank(i);
- }
-}
-
-
-void msx_cart_konami_sound_device::setup_bank(uint8_t bank)
-{
- switch (bank)
- {
- case 0:
- m_bank_base[2] = m_ram_bank[m_selected_bank[0] & 0x0f];
- m_bank_base[6] = m_ram_bank[m_selected_bank[0] & 0x0f];
- break;
-
- case 1:
- m_bank_base[3] = m_ram_bank[m_selected_bank[1] & 0x0f];
- m_bank_base[7] = m_ram_bank[m_selected_bank[1] & 0x0f];
- break;
-
- case 2:
- m_bank_base[0] = m_ram_bank[m_selected_bank[2] & 0x0f];
- m_bank_base[4] = m_ram_bank[m_selected_bank[2] & 0x0f];
- break;
-
- case 3:
- m_bank_base[1] = m_ram_bank[m_selected_bank[3] & 0x0f];
- m_bank_base[5] = m_ram_bank[m_selected_bank[3] & 0x0f];
- break;
- }
+ save_item(NAME(m_control));
}
-
void msx_cart_konami_sound_device::device_reset()
{
+ m_control = 0;
for (int i = 0; i < 4; i++)
{
m_selected_bank[i] = i;
- m_ram_enabled[i] = false;
}
- m_scc_active = false;
- m_sccplus_active = false;
+ switch_bank<0>();
+ switch_bank<1>();
+ switch_bank<2>();
+ switch_bank<3>();
}
-
void msx_cart_konami_sound_device::initialize_cartridge()
{
- restore_banks();
-}
-
-
-uint8_t msx_cart_konami_sound_device::read_cart(offs_t offset)
-{
- if ( m_scc_active && offset >= 0x9800 && offset < 0x9fe0 )
- {
- offset &= 0xff;
- if (offset < 0x80)
- {
- return m_k052539->k051649_waveform_r(offset);
- }
- if (offset < 0xa0)
- {
- return 0xff;
- }
- if (offset < 0xc0)
- {
- return m_k052539->k051649_waveform_r(offset & 0x9f);
- }
- if (offset < 0xe0)
- {
- return m_k052539->k051649_test_r();
- }
- return 0xff;
- }
- else if ( m_sccplus_active && offset >= 0xb800 && offset < 0xbfe0)
- {
- offset &= 0xff;
-
- if (offset < 0xa0)
- {
- return m_k052539->k052539_waveform_r(offset);
- }
- if (offset >= 0xc0 && offset < 0xe0)
- {
- return m_k052539->k051649_test_r();
- }
- return 0xff;
- }
-
- uint8_t *base = m_bank_base[offset >> 13];
-
- if (base != nullptr)
- {
- return base[offset & 0x1fff];
- }
- return 0xff;
-}
-
-
-void msx_cart_konami_sound_device::write_cart(offs_t offset, uint8_t data)
-{
- switch (offset & 0xe000)
+ for (int i = 0; i < 4; i++)
{
- case 0x4000:
- if (m_ram_enabled[0] && m_bank_base[2] != nullptr)
- {
- m_bank_base[2][offset & 0x1fff] = data;
- }
- if ((offset & 0x1800) == 0x1000)
- {
- m_selected_bank[0] = data;
- setup_bank(0);
- }
- break;
-
- case 0x6000:
- if (m_ram_enabled[1] && m_bank_base[3] != nullptr)
- {
- m_bank_base[3][offset & 0x1fff] = data;
- }
- if ((offset & 0x1800) == 0x1000)
- {
- m_selected_bank[1] = data;
- setup_bank(1);
- }
- break;
-
- case 0x8000:
- if (m_ram_enabled[2] && m_bank_base[0] != nullptr)
- {
- m_bank_base[0][offset & 0x1fff] = data;
- }
- switch (offset & 0x1800)
- {
- case 0x1000: // 0x9000-0x97ff
- m_selected_bank[2] = data;
- m_scc_active = ( ( data & 0x3f ) == 0x3f );
- setup_bank(2);
- break;
-
- case 0x1800: // 0x9800-0x9fff
- if ( m_scc_active )
- {
- offset &= 0xff;
-
- if (offset < 0x80)
- {
- m_k052539->k051649_waveform_w(offset, data);
- }
- else if (offset < 0xa0)
- {
- offset &= 0x0f;
- if (offset < 0x0a)
- {
- m_k052539->k051649_frequency_w(offset, data);
- }
- else if (offset < 0x0f)
- {
- m_k052539->k051649_volume_w(offset - 0xa, data);
- }
- else
- {
- m_k052539->k051649_keyonoff_w(data);
- }
- }
- else if (offset >= 0xe0)
- {
- m_k052539->k051649_test_w(data);
- }
- }
- break;
- }
- break;
-
- case 0xa000:
- if (m_ram_enabled[3] && m_bank_base[1] != nullptr)
- {
- m_bank_base[1][offset & 0x1fff] = data;
- }
- switch (offset & 0x1800)
- {
- // 0xb000-0xb7ff
- case 0x1000:
- m_selected_bank[3] = data;
- setup_bank(3);
- break;
-
- // 0xb800-0xbfff
- case 0x1800:
- if ((offset & 0x7fe) == 0x7fe)
- {
- // 0xbffe-0xbfff
- /* write to mode register */
- m_scc_mode = data;
-
- m_ram_enabled[0] = ((m_scc_mode & 0x10) || (m_scc_mode & 0x01));
- m_ram_enabled[1] = ((m_scc_mode & 0x10) || (m_scc_mode & 0x02));
- m_ram_enabled[2] = ((m_scc_mode & 0x10) || ((m_scc_mode & 0x04) && (m_scc_mode & 0x20)));
- m_ram_enabled[3] = (m_scc_mode & 0x10);
-
- m_scc_active = ((m_selected_bank[2] & 0x3f) == 0x3f) && !(m_scc_mode & 0x20);
- m_sccplus_active = (m_selected_bank[3] & 0x80) && (m_scc_mode & 0x20);
- }
- else
- {
- if (m_sccplus_active)
- {
- offset &= 0xff;
- if (offset < 0xa0)
- {
- m_k052539->k052539_waveform_w(offset, data);
- }
- else if (offset < 0xc0)
- {
- offset &= 0x0f;
- if (offset < 0x0a)
- {
- m_k052539->k051649_frequency_w(offset, data);
- }
- else if (offset < 0x0f)
- {
- m_k052539->k051649_volume_w(offset - 0x0a, data);
- }
- else if (offset == 0x0f)
- {
- m_k052539->k051649_keyonoff_w(data);
- }
- }
- else if (offset < 0xe0)
- {
- m_k052539->k051649_test_w(data);
- }
- }
- }
- break;
- }
- break;
- }
-}
-
-
-msx_cart_konami_sound_snatcher_device::msx_cart_konami_sound_snatcher_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : msx_cart_konami_sound_device(mconfig, MSX_CART_SOUND_SNATCHER, tag, owner, clock)
+ m_rambank[i]->configure_entries(0, 8, get_ram_base(), 0x2000);
+ }
+
+ // TODO Mirrors at 0000-3fff and c000-ffff
+
+ page(1)->install_view(0x4000, 0x5fff, m_view0);
+ m_view0[VIEW_READ].install_read_bank(0x4000, 0x5fff, m_rambank[0]);
+ m_view0[VIEW_READ].install_write_handler(0x5000, 0x57ff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::bank_w<0>)));
+ m_view0[VIEW_RAM].install_readwrite_bank(0x4000, 0x5fff, m_rambank[0]);
+ m_view0[VIEW_INVALID].install_write_handler(0x5000, 0x57ff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::bank_w<0>)));
+ m_view0[VIEW_INVALID | VIEW_RAM];
+
+ page(1)->install_view(0x6000, 0x7fff, m_view1);
+ m_view1[VIEW_READ].install_read_bank(0x6000, 0x7fff, m_rambank[1]);
+ m_view1[VIEW_READ].install_write_handler(0x7000, 0x77ff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::bank_w<1>)));
+ m_view1[VIEW_RAM].install_readwrite_bank(0x6000, 0x7fff, m_rambank[1]);
+ m_view1[VIEW_INVALID].install_write_handler(0x7000, 0x77ff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::bank_w<1>)));
+ m_view1[VIEW_INVALID | VIEW_RAM];
+
+ page(2)->install_view(0x8000, 0x9fff, m_view2);
+ m_view2[VIEW_READ].install_read_bank(0x8000, 0x9fff, m_rambank[2]);
+ m_view2[VIEW_READ].install_write_handler(0x9000, 0x97ff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::bank_w<2>)));
+ m_view2[VIEW_RAM].install_readwrite_bank(0x8000, 0x9fff, m_rambank[2]);
+ m_view2[VIEW_INVALID].install_write_handler(0x9000, 0x97ff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::bank_w<2>)));
+ m_view2[VIEW_INVALID | VIEW_RAM];
+ m_view2[VIEW_SCC | VIEW_READ].install_read_bank(0x8000, 0x9fff, m_rambank[2]);
+ m_view2[VIEW_SCC | VIEW_READ].install_write_handler(0x9000, 0x97ff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::bank_w<2>)));
+ m_view2[VIEW_SCC | VIEW_READ].install_read_handler(0x9800, 0x987f, 0, 0x0700, 0, read8sm_delegate(m_k052539, FUNC(k051649_device::k051649_waveform_r)));
+ m_view2[VIEW_SCC | VIEW_READ].install_write_handler(0x9800, 0x987f, 0, 0x0700, 0, write8sm_delegate(m_k052539, FUNC(k051649_device::k051649_waveform_w)));
+ m_view2[VIEW_SCC | VIEW_READ].install_write_handler(0x9880, 0x9889, 0, 0x0710, 0, write8sm_delegate(m_k052539, FUNC(k051649_device::k051649_frequency_w)));
+ m_view2[VIEW_SCC | VIEW_READ].install_write_handler(0x988a, 0x988e, 0, 0x0710, 0, write8sm_delegate(m_k052539, FUNC(k051649_device::k051649_volume_w)));
+ m_view2[VIEW_SCC | VIEW_READ].install_write_handler(0x988f, 0x988f, 0, 0x0710, 0, write8smo_delegate(m_k052539, FUNC(k051649_device::k051649_keyonoff_w)));
+ m_view2[VIEW_SCC | VIEW_READ].install_read_handler(0x98c0, 0x98c0, 0, 0x071f, 0, read8smo_delegate(m_k052539, FUNC(k051649_device::k051649_test_r)));
+ m_view2[VIEW_SCC | VIEW_READ].install_write_handler(0x98c0, 0x98c0, 0, 0x071f, 0, write8smo_delegate(m_k052539, FUNC(k051649_device::k051649_test_w)));
+ m_view2[VIEW_SCC | VIEW_RAM].install_readwrite_bank(0x8000, 0x9fff, m_rambank[2]);
+ m_view2[VIEW_SCC | VIEW_RAM].install_read_handler(0x9800, 0x987f, 0, 0x0700, 0, read8sm_delegate(m_k052539, FUNC(k051649_device::k051649_waveform_r)));
+ m_view2[VIEW_SCC | VIEW_RAM].install_read_handler(0x98c0, 0x98c0, 0, 0x071f, 0, read8smo_delegate(m_k052539, FUNC(k051649_device::k051649_test_r)));
+ m_view2[VIEW_SCC | VIEW_INVALID].install_write_handler(0x9000, 0x97ff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::bank_w<2>)));
+ m_view2[VIEW_SCC | VIEW_INVALID].install_read_handler(0x9800, 0x987f, 0, 0x0700, 0, read8sm_delegate(m_k052539, FUNC(k051649_device::k051649_waveform_r)));
+ m_view2[VIEW_SCC | VIEW_INVALID].install_write_handler(0x9800, 0x987f, 0, 0x0700, 0, write8sm_delegate(m_k052539, FUNC(k051649_device::k051649_waveform_w)));
+ m_view2[VIEW_SCC | VIEW_INVALID].install_write_handler(0x9880, 0x9889, 0, 0x0710, 0, write8sm_delegate(m_k052539, FUNC(k051649_device::k051649_frequency_w)));
+ m_view2[VIEW_SCC | VIEW_INVALID].install_write_handler(0x988a, 0x988e, 0, 0x0710, 0, write8sm_delegate(m_k052539, FUNC(k051649_device::k051649_volume_w)));
+ m_view2[VIEW_SCC | VIEW_INVALID].install_write_handler(0x988f, 0x988f, 0, 0x0710, 0, write8smo_delegate(m_k052539, FUNC(k051649_device::k051649_keyonoff_w)));
+ m_view2[VIEW_SCC | VIEW_INVALID].install_read_handler(0x98c0, 0x98c0, 0, 0x071f, 0, read8smo_delegate(m_k052539, FUNC(k051649_device::k051649_test_r)));
+ m_view2[VIEW_SCC | VIEW_INVALID].install_write_handler(0x98c0, 0x98c0, 0, 0x071f, 0, write8smo_delegate(m_k052539, FUNC(k051649_device::k051649_test_w)));
+ m_view2[VIEW_SCC | VIEW_INVALID | VIEW_RAM];
+ m_view2[VIEW_SCC | VIEW_INVALID | VIEW_RAM].install_read_handler(0x9800, 0x987f, 0, 0x0700, 0, read8sm_delegate(m_k052539, FUNC(k051649_device::k051649_waveform_r)));
+ m_view2[VIEW_SCC | VIEW_INVALID | VIEW_RAM].install_read_handler(0x98c0, 0x98c0, 0, 0x071f, 0, read8smo_delegate(m_k052539, FUNC(k051649_device::k051649_test_r)));
+
+ page(2)->install_view(0xa000, 0xbfff, m_view3);
+ m_view3[VIEW_READ].install_read_bank(0xa000, 0xbfff, m_rambank[3]);
+ m_view3[VIEW_READ].install_write_handler(0xb000, 0xb7ff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::bank_w<3>)));
+ m_view3[VIEW_RAM].install_readwrite_bank(0xa000, 0xbfff, m_rambank[3]);
+ m_view3[VIEW_INVALID].install_write_handler(0xb000, 0xb7ff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::bank_w<3>)));
+ m_view3[VIEW_INVALID | VIEW_RAM];
+ m_view3[VIEW_SCC | VIEW_READ].install_read_bank(0xa000, 0xbfff, m_rambank[3]);
+ m_view3[VIEW_SCC | VIEW_READ].install_write_handler(0xb000, 0xb7ff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::bank_w<3>)));
+ m_view3[VIEW_SCC | VIEW_READ].install_read_handler(0xb800, 0xb89f, 0, 0x0700, 0, read8sm_delegate(m_k052539, FUNC(k051649_device::k052539_waveform_r)));
+ m_view3[VIEW_SCC | VIEW_READ].install_write_handler(0xb800, 0xb89f, 0, 0x0700, 0, write8sm_delegate(m_k052539, FUNC(k051649_device::k052539_waveform_w)));
+ m_view3[VIEW_SCC | VIEW_READ].install_write_handler(0xb8a0, 0xb8a9, 0, 0x0710, 0, write8sm_delegate(m_k052539, FUNC(k051649_device::k051649_frequency_w)));
+ m_view3[VIEW_SCC | VIEW_READ].install_write_handler(0xb8aa, 0xb8ae, 0, 0x0710, 0, write8sm_delegate(m_k052539, FUNC(k051649_device::k051649_volume_w)));
+ m_view3[VIEW_SCC | VIEW_READ].install_write_handler(0xb8af, 0xb8af, 0, 0x0710, 0, write8smo_delegate(m_k052539, FUNC(k051649_device::k051649_keyonoff_w)));
+ m_view3[VIEW_SCC | VIEW_READ].install_read_handler(0xb8c0, 0xb8c0, 0, 0x071f, 0, read8smo_delegate(m_k052539, FUNC(k051649_device::k051649_test_r)));
+ m_view3[VIEW_SCC | VIEW_READ].install_write_handler(0xb8c0, 0xb8c0, 0, 0x071f, 0, write8smo_delegate(m_k052539, FUNC(k051649_device::k051649_test_w)));
+ m_view3[VIEW_SCC | VIEW_RAM].install_readwrite_bank(0xa000, 0xbfff, m_rambank[3]);
+ m_view3[VIEW_SCC | VIEW_RAM].install_read_handler(0xb800, 0xb89f, 0, 0x0700, 0, read8sm_delegate(m_k052539, FUNC(k051649_device::k052539_waveform_r)));
+ m_view3[VIEW_SCC | VIEW_RAM].install_read_handler(0xb8c0, 0xb8c0, 0, 0x071f, 0, read8smo_delegate(m_k052539, FUNC(k051649_device::k051649_test_r)));
+ m_view3[VIEW_SCC | VIEW_INVALID].install_write_handler(0xb000, 0xb7ff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::bank_w<3>)));
+ m_view3[VIEW_SCC | VIEW_INVALID].install_read_handler(0xb800, 0xb89f, 0, 0x0700, 0, read8sm_delegate(m_k052539, FUNC(k051649_device::k052539_waveform_r)));
+ m_view3[VIEW_SCC | VIEW_INVALID].install_write_handler(0xb800, 0xb89f, 0, 0x0700, 0, write8sm_delegate(m_k052539, FUNC(k051649_device::k052539_waveform_w)));
+ m_view3[VIEW_SCC | VIEW_INVALID].install_write_handler(0xb8a0, 0xb8a9, 0, 0x0710, 0, write8sm_delegate(m_k052539, FUNC(k051649_device::k051649_frequency_w)));
+ m_view3[VIEW_SCC | VIEW_INVALID].install_write_handler(0xb8aa, 0xb8ae, 0, 0x0710, 0, write8sm_delegate(m_k052539, FUNC(k051649_device::k051649_volume_w)));
+ m_view3[VIEW_SCC | VIEW_INVALID].install_write_handler(0xb8af, 0xb8af, 0, 0x0710, 0, write8smo_delegate(m_k052539, FUNC(k051649_device::k051649_keyonoff_w)));
+ m_view3[VIEW_SCC | VIEW_INVALID].install_read_handler(0xb8c0, 0xb8c0, 0, 0x071f, 0, read8smo_delegate(m_k052539, FUNC(k051649_device::k051649_test_r)));
+ m_view3[VIEW_SCC | VIEW_INVALID].install_write_handler(0xb8c0, 0xb8c0, 0, 0x071f, 0, write8smo_delegate(m_k052539, FUNC(k051649_device::k051649_test_w)));
+ m_view3[VIEW_SCC | VIEW_INVALID | VIEW_RAM];
+ m_view3[VIEW_SCC | VIEW_INVALID| VIEW_RAM].install_read_handler(0xb800, 0xb89f, 0, 0x0700, 0, read8sm_delegate(m_k052539, FUNC(k051649_device::k052539_waveform_r)));
+ m_view3[VIEW_SCC | VIEW_INVALID| VIEW_RAM].install_read_handler(0xb8c0, 0xb8c0, 0, 0x071f, 0, read8smo_delegate(m_k052539, FUNC(k051649_device::k051649_test_r)));
+
+ page(2)->install_write_handler(0xbffe, 0xbfff, write8smo_delegate(*this, FUNC(msx_cart_konami_sound_device::control_w)));
+}
+
+void msx_cart_konami_sound_device::control_w(u8 data)
+{
+ m_control = data;
+
+ switch_bank<0>();
+ switch_bank<1>();
+ switch_bank<2>();
+ switch_bank<3>();
+}
+
+template <int Bank>
+void msx_cart_konami_sound_device::switch_bank()
+{
+ u8 view = VIEW_READ;
+ if ((m_selected_bank[Bank] & 0x0f) >= m_min_rambank && (m_selected_bank[Bank] & 0x0f) <= m_max_rambank)
+ m_rambank[Bank]->set_entry(m_selected_bank[Bank] & 0x07);
+ else
+ view |= VIEW_INVALID;
+ if (BIT(m_control, 4))
+ view |= VIEW_RAM;
+ else
+ {
+ if (Bank < 2 && BIT(m_control, Bank))
+ view |= VIEW_RAM;
+ else if (Bank == 2 && BIT(m_control, Bank) && BIT(m_control, 5))
+ view |= VIEW_RAM;
+ }
+ if (Bank == 2 && !BIT(m_control, 5) && (m_selected_bank[2] & 0x3f) == 0x3f)
+ view |= VIEW_SCC;
+ if (Bank == 3 && BIT(m_control, 5) && BIT(m_selected_bank[3], 7))
+ view |= VIEW_SCC;
+
+ if (Bank == 0)
+ m_view0.select(view);
+ if (Bank == 1)
+ m_view1.select(view);
+ if (Bank == 2)
+ m_view2.select(view);
+ if (Bank == 3)
+ m_view3.select(view);
+}
+
+template <int Bank>
+void msx_cart_konami_sound_device::bank_w(u8 data)
+{
+ m_selected_bank[Bank] = data;
+ switch_bank<Bank>();
+}
+
+
+
+// The Snatcher Sound cartridge has 64KB RAM available by selecting ram banks 0-7
+msx_cart_konami_sound_snatcher_device::msx_cart_konami_sound_snatcher_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : msx_cart_konami_sound_device(mconfig, MSX_CART_SOUND_SNATCHER, tag, owner, clock, 0, 7)
{
}
-
void msx_cart_konami_sound_snatcher_device::initialize_cartridge()
{
- msx_cart_konami_sound_device::initialize_cartridge();
-
if (get_ram_size() != 0x10000)
{
fatalerror("sound_snatcher: Invalid RAM size\n");
}
- // The Snatcher Sound cartridge has 64KB RAM available by selecting ram banks 0-7
-
- for (int i = 0; i < 8; i++)
- {
- m_ram_bank[i] = get_ram_base() + i * 0x2000;
- }
+ msx_cart_konami_sound_device::initialize_cartridge();
}
-msx_cart_konami_sound_sdsnatcher_device::msx_cart_konami_sound_sdsnatcher_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : msx_cart_konami_sound_device(mconfig, MSX_CART_SOUND_SDSNATCHER, tag, owner, clock)
+// The SD Snatcher Sound cartrdige has 64KB RAM available by selecting ram banks 8-15
+msx_cart_konami_sound_sdsnatcher_device::msx_cart_konami_sound_sdsnatcher_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : msx_cart_konami_sound_device(mconfig, MSX_CART_SOUND_SDSNATCHER, tag, owner, clock, 8, 15)
{
}
-
void msx_cart_konami_sound_sdsnatcher_device::initialize_cartridge()
{
- msx_cart_konami_sound_device::initialize_cartridge();
-
if (get_ram_size() != 0x10000)
{
fatalerror("sound_sdsnatcher: Invalid RAM size\n");
}
-
- // The SD Snatcher Sound cartrdige has 64KB RAM available by selecting ram banks 8-15
-
- for (int i = 0; i < 8; i++)
- {
- m_ram_bank[8+i] = get_ram_base() + i * 0x2000;
- }
-
+ msx_cart_konami_sound_device::initialize_cartridge();
}
-msx_cart_keyboard_master_device::msx_cart_keyboard_master_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_keyboard_master_device::msx_cart_keyboard_master_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_KEYBOARD_MASTER, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
, m_vlm5030(*this, "vlm5030")
{
}
-
void msx_cart_keyboard_master_device::vlm_map(address_map &map)
{
map(0x0000, 0xffff).r(FUNC(msx_cart_keyboard_master_device::read_vlm));
}
-
void msx_cart_keyboard_master_device::device_add_mconfig(machine_config &config)
{
// 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'.
@@ -895,7 +490,6 @@ void msx_cart_keyboard_master_device::device_add_mconfig(machine_config &config)
m_vlm5030->set_addrmap(0, &msx_cart_keyboard_master_device::vlm_map);
}
-
void msx_cart_keyboard_master_device::device_start()
{
// Install IO read/write handlers
@@ -904,40 +498,28 @@ void msx_cart_keyboard_master_device::device_start()
io_space().install_read_handler(0x00, 0x00, read8smo_delegate(*this, FUNC(msx_cart_keyboard_master_device::io_00_r)));
}
-
void msx_cart_keyboard_master_device::initialize_cartridge()
{
if (get_rom_size() != 0x4000)
{
fatalerror("keyboard_master: Invalid ROM size\n");
}
-}
-
-uint8_t msx_cart_keyboard_master_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0x8000)
- {
- return m_rom[offset & 0x3fff];
- }
- return 0xff;
+ page(1)->install_rom(0x4000, 0x7fff, get_rom_base());
}
-
uint8_t msx_cart_keyboard_master_device::read_vlm(offs_t offset)
{
return m_rom_vlm5030[offset];
}
-
void msx_cart_keyboard_master_device::io_20_w(uint8_t data)
{
- m_vlm5030->rst((data & 0x01) ? 1 : 0);
- m_vlm5030->vcu((data & 0x04) ? 1 : 0);
- m_vlm5030->st((data & 0x02) ? 1 : 0);
+ m_vlm5030->rst(BIT(data, 0) ? 1 : 0);
+ m_vlm5030->vcu(BIT(data, 2) ? 1 : 0);
+ m_vlm5030->st(BIT(data, 1) ? 1 : 0);
}
-
uint8_t msx_cart_keyboard_master_device::io_00_r()
{
return m_vlm5030->bsy() ? 0x10 : 0x00;
diff --git a/src/devices/bus/msx_cart/konami.h b/src/devices/bus/msx_cart/konami.h
index 58ad4f3cfb7..c2bdd25c478 100644
--- a/src/devices/bus/msx_cart/konami.h
+++ b/src/devices/bus/msx_cart/konami.h
@@ -3,6 +3,8 @@
#ifndef MAME_BUS_MSX_CART_KONAMI_H
#define MAME_BUS_MSX_CART_KONAMI_H
+#pragma once
+
#include "bus/msx_cart/cartridge.h"
#include "sound/k051649.h"
#include "sound/vlm5030.h"
@@ -21,25 +23,20 @@ DECLARE_DEVICE_TYPE(MSX_CART_KEYBOARD_MASTER, msx_cart_keyboard_master_device)
class msx_cart_konami_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_konami_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_konami_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
private:
- uint8_t m_bank_mask;
- uint8_t m_selected_bank[4];
- uint8_t *m_bank_base[8];
+ template <int Bank> void bank_w(u8 data);
+
+ memory_bank_array_creator<4> m_rombank;
+ u8 m_bank_mask;
};
@@ -50,73 +47,61 @@ public:
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
- virtual void device_post_load() override;
virtual void device_add_mconfig(machine_config &config) override;
- void restore_banks();
-
private:
+ template <int Bank> void bank_w(u8 data);
+
required_device<k051649_device> m_k051649;
+ memory_bank_array_creator<4> m_rombank;
+ memory_view m_scc_view;
- uint8_t m_bank_mask;
- uint8_t m_selected_bank[4];
- uint8_t *m_bank_base[8];
- bool m_scc_active;
+ u8 m_bank_mask;
};
class msx_cart_gamemaster2_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_gamemaster2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_gamemaster2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
private:
- uint8_t m_selected_bank[3];
- uint8_t *m_bank_base[8];
+ template <int Bank> void bank_w(u8 data);
- void setup_bank(uint8_t bank);
+ memory_bank_array_creator<3> m_rombank;
+ memory_bank_array_creator<3> m_rambank;
+ memory_view m_view0;
+ memory_view m_view1;
+ memory_view m_view2;
};
class msx_cart_synthesizer_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_synthesizer_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_synthesizer_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_add_mconfig(machine_config &config) override;
private:
- uint8_t *m_bank_base;
required_device<dac_byte_interface> m_dac;
};
@@ -126,42 +111,44 @@ class msx_cart_konami_sound_device : public device_t, public msx_cart_interface
public:
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
- msx_cart_konami_sound_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_konami_sound_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 min_rambank, u8 max_rambank);
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
- virtual void device_post_load() override;
virtual void device_add_mconfig(machine_config &config) override;
- void restore_banks();
+private:
+ static constexpr u8 VIEW_READ = 0;
+ static constexpr u8 VIEW_RAM = 1;
+ static constexpr u8 VIEW_INVALID = 2;
+ static constexpr u8 VIEW_SCC = 4;
- uint8_t *m_ram_bank[16];
+ template <int Bank> void bank_w(u8 data);
+ template <int Bank> void switch_bank();
+ void control_w(u8 data);
-private:
// This is actually a K052539
required_device<k051649_device> m_k052539;
-
- uint8_t m_selected_bank[4];
- uint8_t *m_bank_base[8];
- bool m_scc_active;
- bool m_sccplus_active;
- bool m_ram_enabled[4];
- uint8_t m_scc_mode;
-
- void setup_bank(uint8_t bank);
+ memory_bank_array_creator<4> m_rambank;
+ memory_view m_view0;
+ memory_view m_view1;
+ memory_view m_view2;
+ memory_view m_view3;
+
+ u8 m_min_rambank;
+ u8 m_max_rambank;
+ u8 m_selected_bank[4];
+ u8 m_control;
};
class msx_cart_konami_sound_snatcher_device : public msx_cart_konami_sound_device
{
public:
- msx_cart_konami_sound_snatcher_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_konami_sound_snatcher_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
};
@@ -170,7 +157,7 @@ public:
class msx_cart_konami_sound_sdsnatcher_device : public msx_cart_konami_sound_device
{
public:
- msx_cart_konami_sound_sdsnatcher_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_konami_sound_sdsnatcher_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
};
@@ -180,7 +167,7 @@ public:
class msx_cart_keyboard_master_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_keyboard_master_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_keyboard_master_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
// device-level overrides
@@ -190,8 +177,6 @@ protected:
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
-
private:
required_device<vlm5030_device> m_vlm5030;
diff --git a/src/devices/bus/msx_cart/korean.cpp b/src/devices/bus/msx_cart/korean.cpp
index e12f15bd43d..6ba0ffe1d0f 100644
--- a/src/devices/bus/msx_cart/korean.cpp
+++ b/src/devices/bus/msx_cart/korean.cpp
@@ -11,290 +11,147 @@ DEFINE_DEVICE_TYPE(MSX_CART_KOREAN_126IN1, msx_cart_korean_126in1_device, "msx_c
msx_cart_korean_80in1_device::msx_cart_korean_80in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MSX_CART_KOREAN_80IN1, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
+ , m_rombank(*this, "rombank%u", 0U)
, m_bank_mask(0)
- , m_selected_bank{ 0, 1, 2, 3 }
- , m_bank_base{ nullptr, nullptr, nullptr, nullptr }
{
}
-
-void msx_cart_korean_80in1_device::device_start()
-{
- save_item(NAME(m_selected_bank));
-}
-
-
-void msx_cart_korean_80in1_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_korean_80in1_device::setup_bank(uint8_t bank)
-{
- m_bank_base[bank] = get_rom_base() + ( m_selected_bank[bank] & m_bank_mask ) * 0x2000;
-}
-
-
-void msx_cart_korean_80in1_device::restore_banks()
-{
- for (int i = 0; i < 4; i++)
- {
- setup_bank(i);
- }
-}
-
-
void msx_cart_korean_80in1_device::device_reset()
{
for (int i = 0; i < 4; i++)
- {
- m_selected_bank[i] = i;
- }
+ m_rombank[i]->set_entry(i);
}
-
void msx_cart_korean_80in1_device::initialize_cartridge()
{
- uint32_t size = get_rom_size();
+ u32 size = get_rom_size();
+ u16 banks = size / 0x2000;
- if ( size > 256 * 0x2000 )
- {
- fatalerror("korean_80in1: ROM is too big\n");
- }
-
- uint16_t banks = size / 0x2000;
-
- if (size != banks * 0x2000 || (~(banks - 1) % banks))
+ if (size > 256 * 0x2000 || size < 0x8000 || size != banks * 0x2000 || (~(banks - 1) % banks))
{
fatalerror("korean_80in1: Invalid ROM size\n");
}
m_bank_mask = banks - 1;
- restore_banks();
-}
-
-
-uint8_t msx_cart_korean_80in1_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0xc000)
- {
- return m_bank_base[(offset - 0x4000) >> 13][offset & 0x1fff];
- }
+ for (int i = 0; i < 4; i++)
+ m_rombank[i]->configure_entries(0, banks, get_rom_base(), 0x2000);
- return 0xff;
+ page(1)->install_read_bank(0x4000, 0x5fff, m_rombank[0]);
+ page(1)->install_write_handler(0x4000, 0x4003, write8sm_delegate(*this, FUNC(msx_cart_korean_80in1_device::bank_w)));
+ page(1)->install_read_bank(0x6000, 0x7fff, m_rombank[1]);
+ page(2)->install_read_bank(0x8000, 0x9fff, m_rombank[2]);
+ page(2)->install_read_bank(0xa000, 0xbfff, m_rombank[3]);
}
-
-void msx_cart_korean_80in1_device::write_cart(offs_t offset, uint8_t data)
+void msx_cart_korean_80in1_device::bank_w(offs_t offset, u8 data)
{
- if (offset >= 0x4000 && offset < 0x4004)
- {
- uint8_t bank = offset & 3;
-
- m_selected_bank[bank] = data;
- setup_bank(bank);
- }
+ m_rombank[offset & 0x03]->set_entry(data & m_bank_mask);
}
-msx_cart_korean_90in1_device::msx_cart_korean_90in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_korean_90in1_device::msx_cart_korean_90in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_KOREAN_90IN1, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
+ , m_rombank(*this, "rombank%u", 0U)
+ , m_view(*this, "view")
, m_bank_mask(0)
- , m_selected_bank(0)
- , m_bank_base{ nullptr, nullptr, nullptr, nullptr }
{
}
-
void msx_cart_korean_90in1_device::device_start()
{
- save_item(NAME(m_selected_bank));
-
// Install IO read/write handlers
io_space().install_write_handler(0x77, 0x77, write8smo_delegate(*this, FUNC(msx_cart_korean_90in1_device::banking)));
}
-
-void msx_cart_korean_90in1_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_korean_90in1_device::restore_banks()
-{
- uint8_t *base = get_rom_base();
-
- switch (m_selected_bank & 0xc0)
- {
- case 0x80:
- base += (m_selected_bank & 0x3e & m_bank_mask) * 0x4000;
- m_bank_base[0] = base;
- m_bank_base[1] = base + 0x2000;
- m_bank_base[2] = base + 0x4000;
- m_bank_base[3] = base + 0x6000;
- break;
-
- case 0xc0:
- base += (m_selected_bank & m_bank_mask) * 0x4000;
- m_bank_base[0] = base;
- m_bank_base[1] = base + 0x2000;
- m_bank_base[2] = base + 0x2000;
- m_bank_base[3] = base;
- break;
-
- default:
- base += (m_selected_bank & m_bank_mask) * 0x4000;
- m_bank_base[0] = base;
- m_bank_base[1] = base + 0x2000;
- m_bank_base[2] = base;
- m_bank_base[3] = base + 0x2000;
- break;
- }
-}
-
-
void msx_cart_korean_90in1_device::device_reset()
{
- m_selected_bank = 0;
+ m_view.select(0);
+ m_rombank[0]->set_entry(0);
+ m_rombank[1]->set_entry(0);
+ m_rombank[2]->set_entry(0);
}
-
void msx_cart_korean_90in1_device::initialize_cartridge()
{
- uint32_t size = get_rom_size();
+ u32 size = get_rom_size();
+ u16 banks = size / 0x4000;
- if ( size > 64 * 0x4000 )
- {
- fatalerror("korean_90in1: ROM is too big\n");
- }
-
- uint16_t banks = size / 0x4000;
-
- if (size != banks * 0x4000 || (~(banks - 1) % banks))
+ if (size > 64 * 0x4000 || size < 0x8000 || size != banks * 0x4000 || (~(banks - 1) % banks))
{
fatalerror("korean_90in1: Invalid ROM size\n");
}
m_bank_mask = banks - 1;
- restore_banks();
-}
+ m_rombank[0]->configure_entries(0, banks, get_rom_base(), 0x4000);
+ m_rombank[1]->configure_entries(0, banks, get_rom_base(), 0x4000);
+ m_rombank[2]->configure_entries(0, banks, get_rom_base() + 0x2000, 0x4000);
+ page(1)->install_read_bank(0x4000, 0x7fff, m_rombank[0]);
-uint8_t msx_cart_korean_90in1_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0xc000)
- {
- return m_bank_base[(offset - 0x4000) >> 13][offset & 0x1fff];
- }
-
- return 0xff;
+ page(2)->install_view(0x8000, 0xbfff, m_view);
+ m_view[0].install_read_bank(0x8000, 0x9fff, m_rombank[1]);
+ m_view[0].install_read_bank(0xa000, 0xbfff, m_rombank[2]);
+ m_view[1].install_read_bank(0x8000, 0x9fff, m_rombank[2]);
+ m_view[1].install_read_bank(0xa000, 0xbfff, m_rombank[1]);
}
-
-void msx_cart_korean_90in1_device::banking(uint8_t data)
+void msx_cart_korean_90in1_device::banking(u8 data)
{
- m_selected_bank = data;
- restore_banks();
+ if (BIT(data, 7) && !BIT(data, 6))
+ data &= 0xfe;
+
+ m_rombank[0]->set_entry(data & m_bank_mask);
+ m_rombank[1]->set_entry((data + (BIT(data, 7) ? 1 : 0)) & m_bank_mask);
+ m_rombank[2]->set_entry((data + (BIT(data, 7) ? 1 : 0)) & m_bank_mask);
+
+ m_view.select((BIT(data, 7) && BIT(data, 6)) ? 1 : 0);
}
-msx_cart_korean_126in1_device::msx_cart_korean_126in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_korean_126in1_device::msx_cart_korean_126in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_KOREAN_126IN1, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
+ , m_rombank(*this, "rombank%u", 0U)
, m_bank_mask(0)
- , m_selected_bank{ 0, 1 }
- , m_bank_base{ nullptr, nullptr }
-{
-}
-
-
-void msx_cart_korean_126in1_device::device_start()
-{
- save_item(NAME(m_selected_bank));
-}
-
-
-void msx_cart_korean_126in1_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_korean_126in1_device::setup_bank(uint8_t bank)
{
- m_bank_base[bank] = get_rom_base() + ( m_selected_bank[bank] & m_bank_mask ) * 0x4000;
-}
-
-
-void msx_cart_korean_126in1_device::restore_banks()
-{
- for (int i = 0; i < 2; i++)
- {
- setup_bank(i);
- }
}
-
void msx_cart_korean_126in1_device::device_reset()
{
- for (int i = 0; i < 2; i++)
- {
- m_selected_bank[i] = i;
- }
+ m_rombank[0]->set_entry(0);
+ m_rombank[1]->set_entry(1);
}
-
void msx_cart_korean_126in1_device::initialize_cartridge()
{
- uint32_t size = get_rom_size();
+ u32 size = get_rom_size();
+ u16 banks = size / 0x4000;
- if ( size > 256 * 0x4000 )
- {
- fatalerror("korean_126in1: ROM is too big\n");
- }
-
- uint16_t banks = size / 0x4000;
-
- if (size != banks * 0x4000 || (~(banks - 1) % banks))
+ if (size > 256 * 0x4000 || size < 0x8000 || size != banks * 0x4000 || (~(banks - 1) % banks))
{
fatalerror("korean_126in1: Invalid ROM size\n");
}
m_bank_mask = banks - 1;
- restore_banks();
-}
-
-
-uint8_t msx_cart_korean_126in1_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0xc000)
- {
- return m_bank_base[offset >> 15][offset & 0x3fff];
- }
+ m_rombank[0]->configure_entries(0, banks, get_rom_base(), 0x4000);
+ m_rombank[1]->configure_entries(0, banks, get_rom_base(), 0x4000);
- return 0xff;
+ page(1)->install_read_bank(0x4000, 0x7fff, m_rombank[0]);
+ page(1)->install_write_handler(0x4000, 0x4001, write8sm_delegate(*this, FUNC(msx_cart_korean_126in1_device::bank_w)));
+ page(2)->install_read_bank(0x8000, 0xbfff, m_rombank[1]);
}
-
-void msx_cart_korean_126in1_device::write_cart(offs_t offset, uint8_t data)
+void msx_cart_korean_126in1_device::bank_w(offs_t offset, uint8_t data)
{
- if (offset >= 0x4000 && offset < 0x4002)
- {
- uint8_t bank = offset & 1;
-
- m_selected_bank[bank] = data;
- setup_bank(bank);
- }
+ m_rombank[offset & 0x01]->set_entry(data & m_bank_mask);
}
diff --git a/src/devices/bus/msx_cart/korean.h b/src/devices/bus/msx_cart/korean.h
index 62c5a6ba82b..dd8e0c31009 100644
--- a/src/devices/bus/msx_cart/korean.h
+++ b/src/devices/bus/msx_cart/korean.h
@@ -20,74 +20,58 @@ public:
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
- virtual void device_post_load() override;
private:
- void restore_banks();
- void setup_bank(uint8_t bank);
+ void bank_w(offs_t offset, u8 data);
- uint8_t m_bank_mask;
- uint8_t m_selected_bank[4];
- uint8_t *m_bank_base[4];
+ memory_bank_array_creator<4> m_rombank;
+
+ u8 m_bank_mask;
};
class msx_cart_korean_90in1_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_korean_90in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_korean_90in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
-
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
- virtual void device_post_load() override;
private:
- void banking(uint8_t data);
+ void banking(u8 data);
- void restore_banks();
-
- uint8_t m_bank_mask;
- uint8_t m_selected_bank;
- uint8_t *m_bank_base[4];
+ memory_bank_array_creator<3> m_rombank;
+ memory_view m_view;
+ u8 m_bank_mask;
};
class msx_cart_korean_126in1_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_korean_126in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_korean_126in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
- virtual void device_post_load() override;
private:
- void restore_banks();
- void setup_bank(uint8_t bank);
+ void bank_w(offs_t offset, u8 data);
- uint8_t m_bank_mask;
- uint8_t m_selected_bank[2];
- uint8_t *m_bank_base[2];
+ memory_bank_array_creator<2> m_rombank;
+ u8 m_bank_mask;
};
diff --git a/src/devices/bus/msx_cart/majutsushi.cpp b/src/devices/bus/msx_cart/majutsushi.cpp
index c94f5a00dc5..65ae0bf42c0 100644
--- a/src/devices/bus/msx_cart/majutsushi.cpp
+++ b/src/devices/bus/msx_cart/majutsushi.cpp
@@ -9,22 +9,14 @@
DEFINE_DEVICE_TYPE(MSX_CART_MAJUTSUSHI, msx_cart_majutsushi_device, "msx_cart_majutsushi", "MSX Cartridge - Majutsushi")
-msx_cart_majutsushi_device::msx_cart_majutsushi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_majutsushi_device::msx_cart_majutsushi_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_MAJUTSUSHI, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
, m_dac(*this, "dac")
+ , m_rombank(*this, "rombank%u", 0U)
{
- for (auto & elem : m_selected_bank)
- {
- elem = 0;
- }
- for (auto & elem : m_bank_base)
- {
- elem = nullptr;
- }
}
-
void msx_cart_majutsushi_device::device_add_mconfig(machine_config &config)
{
// 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'.
@@ -32,85 +24,32 @@ void msx_cart_majutsushi_device::device_add_mconfig(machine_config &config)
DAC_8BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.05); // unknown DAC
}
-
-void msx_cart_majutsushi_device::device_start()
-{
- save_item(NAME(m_selected_bank));
-}
-
-
-void msx_cart_majutsushi_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_majutsushi_device::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::device_reset()
-{
- for (int i = 0; i < 4; i++)
- {
- m_selected_bank[i] = i;
- }
-}
-
-
void msx_cart_majutsushi_device::initialize_cartridge()
{
- if ( get_rom_size() != 0x20000 )
+ if (get_rom_size() != 0x20000)
{
fatalerror("majutsushi: Invalid ROM size\n");
}
- restore_banks();
-}
-
+ for (int i = 0; i < 3; i++)
+ m_rombank[i]->configure_entries(0, 16, get_rom_base(), 0x2000);
-uint8_t msx_cart_majutsushi_device::read_cart(offs_t offset)
-{
- return m_bank_base[offset >> 13][offset & 0x1fff];
+ page(0)->install_rom(0x0000, 0x1fff, get_rom_base());
+ page(0)->install_read_bank(0x2000, 0x3fff, m_rombank[0]);
+ page(1)->install_rom(0x4000, 0x5fff, get_rom_base());
+ page(1)->install_write_handler(0x5000, 0x5000, 0, 0x0fff, 0, write8smo_delegate(m_dac, FUNC(dac_byte_interface::write)));
+ page(1)->install_read_bank(0x6000, 0x7fff, m_rombank[0]);
+ page(1)->install_write_handler(0x6000, 0x6000, 0, 0x1fff, 0, write8smo_delegate(*this, FUNC(msx_cart_majutsushi_device::bank_w<0>)));
+ page(2)->install_read_bank(0x8000, 0x9fff, m_rombank[1]);
+ page(2)->install_write_handler(0x8000, 0x8000, 0, 0x1fff, 0, write8smo_delegate(*this, FUNC(msx_cart_majutsushi_device::bank_w<1>)));
+ page(2)->install_read_bank(0xa000, 0xbfff, m_rombank[2]);
+ page(2)->install_write_handler(0xa000, 0xa000, 0, 0x1fff, 0, write8smo_delegate(*this, FUNC(msx_cart_majutsushi_device::bank_w<2>)));
+ page(3)->install_read_bank(0xc000, 0xdfff, m_rombank[1]);
+ page(3)->install_read_bank(0xe000, 0xffff, m_rombank[2]);
}
-
-void msx_cart_majutsushi_device::write_cart(offs_t offset, uint8_t data)
+template <int Bank>
+void msx_cart_majutsushi_device::bank_w(u8 data)
{
- switch (offset & 0xe000)
- {
- case 0x4000:
- if (offset & 0x1000)
- {
- m_dac->write(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;
- }
+ m_rombank[Bank]->set_entry(data & 0x0f);
}
diff --git a/src/devices/bus/msx_cart/majutsushi.h b/src/devices/bus/msx_cart/majutsushi.h
index ebdf549272e..96ea5261ca6 100644
--- a/src/devices/bus/msx_cart/majutsushi.h
+++ b/src/devices/bus/msx_cart/majutsushi.h
@@ -15,28 +15,21 @@ DECLARE_DEVICE_TYPE(MSX_CART_MAJUTSUSHI, msx_cart_majutsushi_device)
class msx_cart_majutsushi_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_majutsushi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_majutsushi_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual void device_post_load() override;
+ virtual void device_start() override { }
virtual void device_add_mconfig(machine_config &config) override;
- void restore_banks();
-
private:
- required_device<dac_byte_interface> m_dac;
+ template <int Bank> void bank_w(u8 data);
- uint8_t m_selected_bank[4];
- uint8_t *m_bank_base[8];
+ required_device<dac_byte_interface> m_dac;
+ memory_bank_array_creator<3> m_rombank;
};
diff --git a/src/devices/bus/msx_cart/moonsound.cpp b/src/devices/bus/msx_cart/moonsound.cpp
index 07ae53f6fca..2ffa68fc1f6 100644
--- a/src/devices/bus/msx_cart/moonsound.cpp
+++ b/src/devices/bus/msx_cart/moonsound.cpp
@@ -21,21 +21,19 @@ TODO:
DEFINE_DEVICE_TYPE(MSX_CART_MOONSOUND, msx_cart_moonsound_device, "msx_moonsound", "MSX Cartridge - MoonSound")
-msx_cart_moonsound_device::msx_cart_moonsound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_moonsound_device::msx_cart_moonsound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_MOONSOUND, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
, m_ymf278b(*this, "ymf278b")
{
}
-
void msx_cart_moonsound_device::ymf278b_map(address_map &map)
{
map(0x000000, 0x1fffff).rom();
map(0x200000, 0x3fffff).ram(); // 2MB sram for testing
}
-
void msx_cart_moonsound_device::device_add_mconfig(machine_config &config)
{
// The moonsound cartridge has a separate stereo output.
@@ -53,70 +51,48 @@ void msx_cart_moonsound_device::device_add_mconfig(machine_config &config)
m_ymf278b->add_route(5, "rspeaker", 0.50);
}
-
-ROM_START( msx_cart_moonsound )
+ROM_START(msx_cart_moonsound)
ROM_REGION(0x400000, "ymf278b", 0)
ROM_LOAD("yrw801.rom", 0x0, 0x200000, CRC(2a9d8d43) SHA1(32760893ce06dbe3930627755ba065cc3d8ec6ca))
ROM_END
-
const tiny_rom_entry *msx_cart_moonsound_device::device_rom_region() const
{
- return ROM_NAME( msx_cart_moonsound );
+ return ROM_NAME(msx_cart_moonsound);
}
-
void msx_cart_moonsound_device::device_start()
{
// Install IO read/write handlers
io_space().install_readwrite_handler(0x7e, 0x7f, read8sm_delegate(*this, FUNC(msx_cart_moonsound_device::read_ymf278b_pcm)), write8sm_delegate(*this, FUNC(msx_cart_moonsound_device::write_ymf278b_pcm)));
- io_space().install_readwrite_handler(0xc4, 0xc7, read8sm_delegate(*this, FUNC(msx_cart_moonsound_device::read_ymf278b_fm)), write8sm_delegate(*this, FUNC(msx_cart_moonsound_device::write_ymf278b_fm)));
+ io_space().install_readwrite_handler(0xc4, 0xc7, read8sm_delegate(m_ymf278b, FUNC(ymf278b_device::read)), write8sm_delegate(m_ymf278b, FUNC(ymf278b_device::write)));
io_space().install_read_handler(0xc0, 0xc0, read8smo_delegate(*this, FUNC(msx_cart_moonsound_device::read_c0)));
}
-
void msx_cart_moonsound_device::device_reset()
{
}
-
WRITE_LINE_MEMBER(msx_cart_moonsound_device::irq_w)
{
LOG("moonsound: irq state %d\n", state);
irq_out(state);
}
-
-void msx_cart_moonsound_device::write_ymf278b_fm(offs_t offset, uint8_t data)
-{
- LOG("moonsound: write 0x%02x, data 0x%02x\n", 0xc4 + offset, data);
- m_ymf278b->write(offset, data);
-}
-
-
-uint8_t msx_cart_moonsound_device::read_ymf278b_fm(offs_t offset)
-{
- LOG("moonsound: read 0x%02x\n", 0xc4 + offset);
- return m_ymf278b->read(offset);
-}
-
-
-void msx_cart_moonsound_device::write_ymf278b_pcm(offs_t offset, uint8_t data)
+void msx_cart_moonsound_device::write_ymf278b_pcm(offs_t offset, u8 data)
{
LOG("moonsound: write 0x%02x, data 0x%02x\n", 0x7e + offset, data);
m_ymf278b->write(4 + offset, data);
}
-
-uint8_t msx_cart_moonsound_device::read_ymf278b_pcm(offs_t offset)
+u8 msx_cart_moonsound_device::read_ymf278b_pcm(offs_t offset)
{
LOG("moonsound: read 0x%02x\n", 0x7e + offset);
return m_ymf278b->read(4 + offset);
}
-
// For detecting presence of moonsound cartridge
-uint8_t msx_cart_moonsound_device::read_c0()
+u8 msx_cart_moonsound_device::read_c0()
{
LOG("moonsound: read 0xc0\n");
return 0x00;
diff --git a/src/devices/bus/msx_cart/moonsound.h b/src/devices/bus/msx_cart/moonsound.h
index 62f614ae729..c5b1daa4287 100644
--- a/src/devices/bus/msx_cart/moonsound.h
+++ b/src/devices/bus/msx_cart/moonsound.h
@@ -15,7 +15,7 @@ DECLARE_DEVICE_TYPE(MSX_CART_MOONSOUND, msx_cart_moonsound_device)
class msx_cart_moonsound_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_moonsound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_moonsound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
// device-level overrides
@@ -27,12 +27,9 @@ protected:
private:
DECLARE_WRITE_LINE_MEMBER(irq_w);
- void write_ymf278b_fm(offs_t offset, uint8_t data);
- uint8_t read_ymf278b_fm(offs_t offset);
- void write_ymf278b_pcm(offs_t offset, uint8_t data);
- uint8_t read_ymf278b_pcm(offs_t offset);
- uint8_t read_c0();
-
+ void write_ymf278b_pcm(offs_t offset, u8 data);
+ u8 read_ymf278b_pcm(offs_t offset);
+ u8 read_c0();
void ymf278b_map(address_map &map);
required_device<ymf278b_device> m_ymf278b;
diff --git a/src/devices/bus/msx_cart/msx_audio.cpp b/src/devices/bus/msx_cart/msx_audio.cpp
index 3f8fd1fd772..471fe4b3f2e 100644
--- a/src/devices/bus/msx_cart/msx_audio.cpp
+++ b/src/devices/bus/msx_cart/msx_audio.cpp
@@ -54,7 +54,7 @@ For testing the sample ram (playback of a cuckoo sound, the volume of the sound
- CALL COPY PCM(#1,0)
- CALL PLAY PCM(0)
-See also http://www.mccm.hetlab.tk/millennium/milc/gc/topic_26.htm (dutch)
+See also https://www.msxcomputermagazine.nl/mccm/millennium/milc/gc/topic_26.htm (dutch)
and/or http://ngs.no.coocan.jp/doc/wiki.cgi/datapack?page=4.2+MSX-AUDIO+%B3%C8%C4%A5BASIC (japanese)
@@ -72,14 +72,13 @@ DEFINE_DEVICE_TYPE(MSX_CART_MSX_AUDIO_NMS1205, msx_cart_msx_audio_nms1205_device
DEFINE_DEVICE_TYPE(MSX_CART_MSX_AUDIO_FSCA1, msx_cart_msx_audio_fsca1_device, "msx_audio_fsca1", "MSX Cartridge - MSX-AUDIO FS-CA1")
-msx_cart_msx_audio_hxmu900_device::msx_cart_msx_audio_hxmu900_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_msx_audio_hxmu900_device::msx_cart_msx_audio_hxmu900_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_MSX_AUDIO_HXMU900, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
, m_y8950(*this, "y8950")
{
}
-
void msx_cart_msx_audio_hxmu900_device::device_add_mconfig(machine_config &config)
{
// 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'.
@@ -92,7 +91,6 @@ void msx_cart_msx_audio_hxmu900_device::device_add_mconfig(machine_config &confi
MSX_AUDIO_KBDC_PORT(config, "kbdc", msx_audio_keyboards, nullptr);
}
-
void msx_cart_msx_audio_hxmu900_device::device_start()
{
// Install IO read/write handlers
@@ -100,34 +98,24 @@ void msx_cart_msx_audio_hxmu900_device::device_start()
io_space().install_read_handler(0xc0, 0xc1, read8sm_delegate(*m_y8950, FUNC(y8950_device::read)));
}
-
void msx_cart_msx_audio_hxmu900_device::initialize_cartridge()
{
if (get_rom_size() < 0x8000)
{
fatalerror("msx_audio: Invalid ROM size\n");
}
-}
-
-uint8_t msx_cart_msx_audio_hxmu900_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0xC000)
- {
- return m_rom[offset - 0x4000];
- }
- return 0xff;
+ page(1)->install_rom(0x4000, 0x7fff, get_rom_base());
+ page(2)->install_rom(0x8000, 0xbfff, get_rom_base() + 0x4000);
}
-
-ROM_START( msx_hxmu )
+ROM_START(msx_hxmu)
ROM_REGION(0x8000, "y8950", ROMREGION_ERASE00)
ROM_END
-
const tiny_rom_entry *msx_cart_msx_audio_hxmu900_device::device_rom_region() const
{
- return ROM_NAME( msx_hxmu );
+ return ROM_NAME(msx_hxmu);
}
@@ -144,7 +132,6 @@ msx_cart_msx_audio_nms1205_device::msx_cart_msx_audio_nms1205_device(const machi
{
}
-
void msx_cart_msx_audio_nms1205_device::device_add_mconfig(machine_config &config)
{
// 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'.
@@ -167,18 +154,15 @@ void msx_cart_msx_audio_nms1205_device::device_add_mconfig(machine_config &confi
MIDI_PORT(config, m_mdout, midiout_slot, "midiout");
}
-
-ROM_START( msx_nms1205 )
+ROM_START(msx_nms1205)
ROM_REGION(0x8000, "y8950", ROMREGION_ERASE00)
ROM_END
-
const tiny_rom_entry *msx_cart_msx_audio_nms1205_device::device_rom_region() const
{
- return ROM_NAME( msx_nms1205 );
+ return ROM_NAME(msx_nms1205);
}
-
WRITE_LINE_MEMBER(msx_cart_msx_audio_nms1205_device::irq_write)
{
// Trigger IRQ on the maincpu
@@ -188,7 +172,6 @@ WRITE_LINE_MEMBER(msx_cart_msx_audio_nms1205_device::irq_write)
// m_out_irq_cb(state);
}
-
WRITE_LINE_MEMBER(msx_cart_msx_audio_nms1205_device::midi_in)
{
// MIDI in signals is sent to both the 6850 and the MIDI thru output port
@@ -196,7 +179,6 @@ WRITE_LINE_MEMBER(msx_cart_msx_audio_nms1205_device::midi_in)
m_mdthru->write_txd(state);
}
-
void msx_cart_msx_audio_nms1205_device::device_start()
{
// Install IO read/write handlers
@@ -206,23 +188,14 @@ void msx_cart_msx_audio_nms1205_device::device_start()
io_space().install_read_handler(0x04, 0x05, read8sm_delegate(*m_acia6850, FUNC(acia6850_device::read)));
}
-
void msx_cart_msx_audio_nms1205_device::initialize_cartridge()
{
if (get_rom_size() < 0x8000)
{
fatalerror("msx_audio: Invalid ROM size\n");
}
-}
-
-
-uint8_t msx_cart_msx_audio_nms1205_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0xC000)
- {
- return m_rom[offset - 0x4000];
- }
- return 0xff;
+ page(1)->install_rom(0x4000, 0x7fff, get_rom_base());
+ page(2)->install_rom(0x8000, 0xbfff, get_rom_base() + 0x4000);
}
@@ -237,12 +210,13 @@ msx_cart_msx_audio_fsca1_device::msx_cart_msx_audio_fsca1_device(const machine_c
, m_y8950(*this, "y8950")
, m_io_config(*this, "CONFIG")
, m_region_y8950(*this, "y8950")
- , m_7ffe(0)
+ , m_rombank(*this, "rombank%u", 0U)
+ , m_view0(*this, "view0")
+ , m_view1(*this, "view1")
, m_7fff(0)
{
}
-
void msx_cart_msx_audio_fsca1_device::device_add_mconfig(machine_config &config)
{
// 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'.
@@ -257,8 +231,7 @@ void msx_cart_msx_audio_fsca1_device::device_add_mconfig(machine_config &config)
MSX_AUDIO_KBDC_PORT(config, "kbdc", msx_audio_keyboards, nullptr);
}
-
-static INPUT_PORTS_START( msx_audio_fsca1 )
+static INPUT_PORTS_START(msx_audio_fsca1)
PORT_START("CONFIG")
PORT_CONFNAME( 0x04, 0x04, "FS-CA1 Firmware switch")
PORT_CONFSETTING( 0x04, "On" )
@@ -266,31 +239,35 @@ static INPUT_PORTS_START( msx_audio_fsca1 )
PORT_BIT(0xFB, IP_ACTIVE_HIGH, IPT_UNKNOWN)
INPUT_PORTS_END
-
ioport_constructor msx_cart_msx_audio_fsca1_device::device_input_ports() const
{
- return INPUT_PORTS_NAME( msx_audio_fsca1 );
+ return INPUT_PORTS_NAME(msx_audio_fsca1);
}
-
-ROM_START( msx_fsca1 )
+ROM_START(msx_fsca1)
ROM_REGION(0x8000, "y8950", ROMREGION_ERASE00)
ROM_END
-
const tiny_rom_entry *msx_cart_msx_audio_fsca1_device::device_rom_region() const
{
- return ROM_NAME( msx_fsca1 );
+ return ROM_NAME(msx_fsca1);
}
-
void msx_cart_msx_audio_fsca1_device::device_start()
{
// Install IO read/write handlers
io_space().install_write_handler(0xc0, 0xc3, write8sm_delegate(*this, FUNC(msx_cart_msx_audio_fsca1_device::write_y8950)));
io_space().install_read_handler(0xc0, 0xc3, read8sm_delegate(*this, FUNC(msx_cart_msx_audio_fsca1_device::read_y8950)));
+ save_item(NAME(m_7fff));
}
+void msx_cart_msx_audio_fsca1_device::device_reset()
+{
+ m_view0.select(0);
+ m_view1.select(0);
+ m_rombank[0]->set_entry(0);
+ m_rombank[1]->set_entry(0);
+}
void msx_cart_msx_audio_fsca1_device::initialize_cartridge()
{
@@ -298,82 +275,67 @@ void msx_cart_msx_audio_fsca1_device::initialize_cartridge()
{
fatalerror("msx_audio_fsca1: Invalid ROM size\n");
}
-}
-
-
-uint8_t msx_cart_msx_audio_fsca1_device::read_cart(offs_t offset)
-{
- if (m_7ffe == 0 && (offset & 0xB000) == 0x3000)
- {
- return m_sram[offset & 0xfff];
- }
- return m_rom[((m_7ffe & 0x03) << 15) | (offset & 0x7fff)];
-}
+ m_rombank[0]->configure_entries(0, 4, get_rom_base(), 0x8000);
+ m_rombank[1]->configure_entries(0, 4, get_rom_base() + 0x4000, 0x8000);
-void msx_cart_msx_audio_fsca1_device::write_cart(offs_t offset, uint8_t data)
-{
- if (offset == 0x7ffe)
- {
- m_7ffe = data;
- return;
- }
+ page(0)->install_view(0x0000, 0x3fff, m_view0);
+ m_view0[0].install_read_bank(0x0000, 0x3fff, m_rombank[0]);
+ m_view0[0].install_ram(0x3000, 0x3fff, get_sram_base());
+ m_view0[1].install_read_bank(0x0000, 0x3fff, m_rombank[0]);
- if (offset == 0x7fff)
- {
- m_7fff = data;
- return;
- }
+ page(1)->install_view(0x4000, 0x7fff, m_view1);
+ m_view1[0].install_read_bank(0x4000, 0x7ffd, m_rombank[1]);
+ m_view1[0].install_ram(0x7000, 0x7ffd, get_sram_base());
+ m_view1[1].install_read_bank(0x4000, 0x7ffd, m_rombank[1]);
+ page(1)->install_write_handler(0x7ffe, 0x7ffe, write8smo_delegate(*this, FUNC(msx_cart_msx_audio_fsca1_device::bank_w)));
+ page(1)->install_write_handler(0x7fff, 0x7fff, write8smo_delegate(*this, FUNC(msx_cart_msx_audio_fsca1_device::write_7fff)));
- if (m_7ffe == 0 && (offset & 0xb000) == 0x3000)
- {
- m_sram[offset & 0xfff] = data;
- return;
- }
+ page(2)->install_read_bank(0x8000, 0xbfff, m_rombank[0]);
+ page(3)->install_read_bank(0xc000, 0xffff, m_rombank[1]);
+}
- logerror("msx_cart_msx_audio_fsca1_device: Unhandled write %02x to %04x\n", data, offset);
+void msx_cart_msx_audio_fsca1_device::bank_w(u8 data)
+{
+ m_rombank[0]->set_entry(data & 0x03);
+ m_rombank[1]->set_entry(data & 0x03);
+ m_view0.select((data != 0) ? 1 : 0);
+ m_view1.select((data != 0) ? 1 : 0);
}
+void msx_cart_msx_audio_fsca1_device::write_7fff(u8 data)
+{
+ m_7fff = data;
+}
-void msx_cart_msx_audio_fsca1_device::write_y8950(offs_t offset, uint8_t data)
+void msx_cart_msx_audio_fsca1_device::write_y8950(offs_t offset, u8 data)
{
if (offset & 2)
{
if (m_7fff & 0x02)
- {
m_y8950->write(offset, data);
- }
}
else
{
if (m_7fff & 0x01)
- {
m_y8950->write(offset, data);
- }
}
}
-
-uint8_t msx_cart_msx_audio_fsca1_device::read_y8950(offs_t offset)
+u8 msx_cart_msx_audio_fsca1_device::read_y8950(offs_t offset)
{
if (offset & 2)
- {
return (m_7fff & 0x02) ? m_y8950->read(offset) : 0xff;
- }
else
- {
return (m_7fff & 0x01) ? m_y8950->read(offset) : 0xff;
- }
}
-
-void msx_cart_msx_audio_fsca1_device::y8950_io_w(uint8_t data)
+void msx_cart_msx_audio_fsca1_device::y8950_io_w(u8 data)
{
logerror("msx_fsca1::y8950_io_w: %02x\n", data);
}
-
-uint8_t msx_cart_msx_audio_fsca1_device::y8950_io_r()
+u8 msx_cart_msx_audio_fsca1_device::y8950_io_r()
{
return m_io_config->read();
}
diff --git a/src/devices/bus/msx_cart/msx_audio.h b/src/devices/bus/msx_cart/msx_audio.h
index 490169244af..96c44d637d8 100644
--- a/src/devices/bus/msx_cart/msx_audio.h
+++ b/src/devices/bus/msx_cart/msx_audio.h
@@ -19,12 +19,10 @@ DECLARE_DEVICE_TYPE(MSX_CART_MSX_AUDIO_FSCA1, msx_cart_msx_audio_fsca1_device)
class msx_cart_msx_audio_hxmu900_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_msx_audio_hxmu900_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_msx_audio_hxmu900_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
-
protected:
virtual void device_start() override;
@@ -40,12 +38,10 @@ private:
class msx_cart_msx_audio_nms1205_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_msx_audio_nms1205_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_msx_audio_nms1205_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
-
protected:
virtual void device_start() override;
@@ -67,15 +63,13 @@ private:
class msx_cart_msx_audio_fsca1_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_msx_audio_fsca1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_msx_audio_fsca1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
virtual void device_start() override;
+ virtual void device_reset() override;
// device-level overrides
virtual void device_add_mconfig(machine_config &config) override;
@@ -83,17 +77,20 @@ protected:
virtual const tiny_rom_entry *device_rom_region() const override;
private:
- void write_y8950(offs_t offset, uint8_t data);
- uint8_t read_y8950(offs_t offset);
-
- void y8950_io_w(uint8_t data);
- uint8_t y8950_io_r();
+ void write_y8950(offs_t offset, u8 data);
+ u8 read_y8950(offs_t offset);
+ void y8950_io_w(u8 data);
+ u8 y8950_io_r();
+ void bank_w(u8 data);
+ void write_7fff(u8 data);
required_device<y8950_device> m_y8950;
required_ioport m_io_config;
required_memory_region m_region_y8950;
- uint8_t m_7ffe;
- uint8_t m_7fff;
+ memory_bank_array_creator<2> m_rombank;
+ memory_view m_view0;
+ memory_view m_view1;
+ u8 m_7fff;
};
#endif // MAME_BUS_MSX_CART_MSX_AUDIO_H
diff --git a/src/devices/bus/msx_cart/msx_audio_kb.cpp b/src/devices/bus/msx_cart/msx_audio_kb.cpp
index aba915ed718..94b712a9429 100644
--- a/src/devices/bus/msx_cart/msx_audio_kb.cpp
+++ b/src/devices/bus/msx_cart/msx_audio_kb.cpp
@@ -13,7 +13,7 @@ msx_audio_kb_port_interface::msx_audio_kb_port_interface(machine_config const &m
}
-msx_audio_kbdc_port_device::msx_audio_kbdc_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_audio_kbdc_port_device::msx_audio_kbdc_port_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_AUDIO_KBDC_PORT, tag, owner, clock)
, device_single_card_slot_interface<msx_audio_kb_port_interface>(mconfig, *this)
, m_keyboard(nullptr)
@@ -27,14 +27,14 @@ void msx_audio_kbdc_port_device::device_start()
}
-void msx_audio_kbdc_port_device::write(uint8_t data)
+void msx_audio_kbdc_port_device::write(u8 data)
{
if (m_keyboard)
m_keyboard->write(data);
}
-uint8_t msx_audio_kbdc_port_device::read()
+u8 msx_audio_kbdc_port_device::read()
{
if (m_keyboard)
return m_keyboard->read();
@@ -50,7 +50,7 @@ DECLARE_DEVICE_TYPE(MSX_AUDIO_KB_NMS1160, msx_nms1160_device)
class msx_hxmu901_device : public device_t, public msx_audio_kb_port_interface
{
public:
- msx_hxmu901_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ msx_hxmu901_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_AUDIO_KB_HXMU901, tag, owner, clock)
, msx_audio_kb_port_interface(mconfig, *this)
, m_row(0)
@@ -60,9 +60,9 @@ public:
virtual ioport_constructor device_input_ports() const override;
- virtual uint8_t read() override
+ virtual u8 read() override
{
- uint8_t result = 0xff;
+ u8 result = 0xff;
for (int i = 0; i < 8; i++)
{
@@ -74,7 +74,7 @@ public:
return result;
}
- virtual void write(uint8_t data) override
+ virtual void write(u8 data) override
{
m_row = data;
}
@@ -88,7 +88,7 @@ private:
};
-static INPUT_PORTS_START( hxmu901)
+static INPUT_PORTS_START(hxmu901)
PORT_START("KEY.0")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C#1")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D1")
@@ -173,14 +173,14 @@ INPUT_PORTS_END
ioport_constructor msx_hxmu901_device::device_input_ports() const
{
- return INPUT_PORTS_NAME( hxmu901 );
+ return INPUT_PORTS_NAME(hxmu901);
}
class msx_nms1160_device : public device_t, public msx_audio_kb_port_interface
{
public:
- msx_nms1160_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ msx_nms1160_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_AUDIO_KB_NMS1160, tag, owner, clock)
, msx_audio_kb_port_interface(mconfig, *this)
, m_row(0)
@@ -190,9 +190,9 @@ public:
virtual ioport_constructor device_input_ports() const override;
- virtual uint8_t read() override
+ virtual u8 read() override
{
- uint8_t result = 0xff;
+ u8 result = 0xff;
for (int i = 0; i < 8; i++)
{
@@ -204,7 +204,7 @@ public:
return result;
}
- virtual void write(uint8_t data) override
+ virtual void write(u8 data) override
{
logerror("msx_nms1160::write %02x\n", data);
m_row = data;
@@ -219,7 +219,7 @@ private:
};
-static INPUT_PORTS_START( nms1160 )
+static INPUT_PORTS_START(nms1160)
PORT_START("KEY.0")
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C1")
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C#1")
@@ -302,7 +302,7 @@ INPUT_PORTS_END
ioport_constructor msx_nms1160_device::device_input_ports() const
{
- return INPUT_PORTS_NAME( nms1160 );
+ return INPUT_PORTS_NAME(nms1160);
}
diff --git a/src/devices/bus/msx_cart/msx_audio_kb.h b/src/devices/bus/msx_cart/msx_audio_kb.h
index ecab5732c98..c347fd3add0 100644
--- a/src/devices/bus/msx_cart/msx_audio_kb.h
+++ b/src/devices/bus/msx_cart/msx_audio_kb.h
@@ -25,18 +25,18 @@ public:
// construction/destruction
template <typename T>
msx_audio_kbdc_port_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt)
- : msx_audio_kbdc_port_device(mconfig, tag, owner, (uint32_t)0)
+ : msx_audio_kbdc_port_device(mconfig, tag, owner, u32(0))
{
option_reset();
opts(*this);
set_default_option(dflt);
set_fixed(false);
}
- msx_audio_kbdc_port_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_audio_kbdc_port_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// Physical connection simply consists of 8 input and 8 output lines split across 2 connectors
- void write(uint8_t data);
- uint8_t read();
+ void write(u8 data);
+ u8 read();
protected:
// device-level overrides
diff --git a/src/devices/bus/msx_cart/msxdos2.cpp b/src/devices/bus/msx_cart/msxdos2.cpp
index 7f3e506b007..1deb7081051 100644
--- a/src/devices/bus/msx_cart/msxdos2.cpp
+++ b/src/devices/bus/msx_cart/msxdos2.cpp
@@ -3,42 +3,26 @@
#include "emu.h"
#include "msxdos2.h"
+// This is the bare minimum to get a msx-dos 2 rom working in a system
+// TODO:
+// - Add subslots for regular rom and kanji driver rom
+// - Add support for 128KB and 256KB memory mapper versions
+
DEFINE_DEVICE_TYPE(MSX_CART_MSXDOS2, msx_cart_msxdos2_device, "msx_cart_msxdos2", "MSX Cartridge - MSXDOS2")
-msx_cart_msxdos2_device::msx_cart_msxdos2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_msxdos2_device::msx_cart_msxdos2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_MSXDOS2, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
- , m_selected_bank(0)
- , m_bank_base(nullptr)
-{
-}
-
-
-void msx_cart_msxdos2_device::device_start()
-{
- save_item(NAME(m_selected_bank));
-}
-
-
-void msx_cart_msxdos2_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_msxdos2_device::restore_banks()
+ , m_rombank(*this, "rombank")
{
- m_bank_base = get_rom_base() + ( m_selected_bank & 0x03 ) * 0x4000;
}
-
void msx_cart_msxdos2_device::device_reset()
{
- m_selected_bank = 0;
+ m_rombank->set_entry(1);
}
-
void msx_cart_msxdos2_device::initialize_cartridge()
{
if (get_rom_size() != 0x10000)
@@ -46,26 +30,13 @@ void msx_cart_msxdos2_device::initialize_cartridge()
fatalerror("msxdos2: Invalid ROM size\n");
}
- restore_banks();
-}
-
-
-uint8_t msx_cart_msxdos2_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0x8000)
- {
- return m_bank_base[offset & 0x3fff];
- }
+ m_rombank->configure_entries(0, 4, get_rom_base(), 0x4000);
- return 0xff;
+ page(1)->install_read_bank(0x4000, 0x7fff, m_rombank);
+ page(1)->install_write_handler(0x7ffe, 0x7ffe, write8smo_delegate(*this, FUNC(msx_cart_msxdos2_device::bank_w)));
}
-
-void msx_cart_msxdos2_device::write_cart(offs_t offset, uint8_t data)
+void msx_cart_msxdos2_device::bank_w(u8 data)
{
- if (offset == 0x6000)
- {
- m_selected_bank = data;
- restore_banks();
- }
+ m_rombank->set_entry(data & 0x03);
}
diff --git a/src/devices/bus/msx_cart/msxdos2.h b/src/devices/bus/msx_cart/msxdos2.h
index dd5eb51d245..863638837c3 100644
--- a/src/devices/bus/msx_cart/msxdos2.h
+++ b/src/devices/bus/msx_cart/msxdos2.h
@@ -14,24 +14,19 @@ DECLARE_DEVICE_TYPE(MSX_CART_MSXDOS2, msx_cart_msxdos2_device)
class msx_cart_msxdos2_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_msxdos2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_msxdos2_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
private:
- uint8_t m_selected_bank;
- uint8_t *m_bank_base;
+ void bank_w(u8 data);
+
+ memory_bank_creator m_rombank;
};
diff --git a/src/devices/bus/msx_cart/nomapper.cpp b/src/devices/bus/msx_cart/nomapper.cpp
index 24ebbb38e0d..ed4676237ca 100644
--- a/src/devices/bus/msx_cart/nomapper.cpp
+++ b/src/devices/bus/msx_cart/nomapper.cpp
@@ -7,7 +7,7 @@
DEFINE_DEVICE_TYPE(MSX_CART_NOMAPPER, msx_cart_nomapper_device, "msx_cart_nomapper", "MSX Cartridge - ROM")
-msx_cart_nomapper_device::msx_cart_nomapper_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_nomapper_device::msx_cart_nomapper_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_NOMAPPER, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
, m_start_address(0)
@@ -15,22 +15,41 @@ msx_cart_nomapper_device::msx_cart_nomapper_device(const machine_config &mconfig
{
}
-void msx_cart_nomapper_device::device_start()
+void msx_cart_nomapper_device::install_memory()
{
+ u32 start_address = m_start_address;
+ u32 rom_offset = 0;
+
+ if (m_start_address != 0x0000 && m_start_address != 0x4000 && m_start_address != 0x8000 && m_start_address != 0xc000)
+ {
+ fatalerror("nomapper: Unsupported start address %04x\n", m_start_address);
+ }
+
+ for (int i = 0; i < 4; i++)
+ {
+ if (start_address < (i + 1) * 0x4000 && start_address < m_end_address)
+ {
+ if (page(i))
+ {
+ page(i)->install_rom(start_address, std::min<uint32_t>(start_address + 0x3fff, m_end_address - 1), get_rom_base() + rom_offset);
+ }
+ rom_offset += 0x4000;
+ start_address += 0x4000;
+ }
+ }
}
void msx_cart_nomapper_device::initialize_cartridge()
{
- uint32_t size = get_rom_size();
- uint8_t *rom = get_rom_base();
+ u32 size = get_rom_size();
+ u8 *rom = get_rom_base();
- // determine start address
- // default to $4000
+ // determine start address, default to 0x4000
m_start_address = 0x4000;
switch (size)
{
- /* 8KB/16KB */
+ // 8KB/16KB
case 0x2000: case 0x4000:
{
uint16_t start = rom[3] << 8 | rom[2];
@@ -51,7 +70,7 @@ void msx_cart_nomapper_device::initialize_cartridge()
break;
}
- /* 32KB */
+ // 32KB
case 0x8000:
// take default, check when no "AB" at $0000, but "AB" at $4000
if (rom[0] != 'A' && rom[1] != 'B' && rom[0x4000] == 'A' && rom[0x4001] == 'B')
@@ -65,7 +84,7 @@ void msx_cart_nomapper_device::initialize_cartridge()
break;
- /* 48KB */
+ // 48KB
case 0xc000:
// "AB" at $0000, but no "AB" at $4000, not "AB": $0000
if (rom[0] == 'A' && rom[1] == 'B' && rom[0x4000] != 'A' && rom[0x4001] != 'B')
@@ -75,20 +94,13 @@ void msx_cart_nomapper_device::initialize_cartridge()
break;
- /* 64KB */
+ // 64KB
default:
m_start_address = 0;
break;
}
- m_end_address = std::min<uint32_t>(m_start_address + size, 0x10000);
-}
+ m_end_address = std::min<u32>(m_start_address + size, 0x10000);
-uint8_t msx_cart_nomapper_device::read_cart(offs_t offset)
-{
- if ( offset >= m_start_address && offset < m_end_address )
- {
- return get_rom_base()[offset - m_start_address];
- }
- return 0xff;
+ install_memory();
}
diff --git a/src/devices/bus/msx_cart/nomapper.h b/src/devices/bus/msx_cart/nomapper.h
index eb5e40e1d08..82407b11c16 100644
--- a/src/devices/bus/msx_cart/nomapper.h
+++ b/src/devices/bus/msx_cart/nomapper.h
@@ -17,15 +17,15 @@ public:
msx_cart_nomapper_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual void device_start() override;
+ virtual void device_start() override { }
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
-
private:
uint32_t m_start_address;
uint32_t m_end_address;
+
+ void install_memory();
};
#endif // MAME_BUS_MSX_CART_NOMAPPER_H
diff --git a/src/devices/bus/msx_cart/rtype.cpp b/src/devices/bus/msx_cart/rtype.cpp
index 6cda0efb4e8..affcc4c843d 100644
--- a/src/devices/bus/msx_cart/rtype.cpp
+++ b/src/devices/bus/msx_cart/rtype.cpp
@@ -6,77 +6,31 @@
DEFINE_DEVICE_TYPE(MSX_CART_RTYPE, msx_cart_rtype_device, "msx_cart_rtype", "MSX Cartridge - R-Type")
-msx_cart_rtype_device::msx_cart_rtype_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_rtype_device::msx_cart_rtype_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_RTYPE, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
- , m_selected_bank(0)
+ , m_rombank(*this, "rombank")
{
- for (auto & elem : m_bank_base)
- {
- elem = nullptr;
- }
-}
-
-
-void msx_cart_rtype_device::device_start()
-{
- save_item(NAME(m_selected_bank));
}
-
-void msx_cart_rtype_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_rtype_device::restore_banks()
-{
- m_bank_base[0] = get_rom_base() + 15 * 0x4000;
- if (m_selected_bank & 0x10)
- {
- m_selected_bank &= 0x17;
- }
- m_bank_base[1] = get_rom_base() + m_selected_bank * 0x4000;
-}
-
-
-void msx_cart_rtype_device::device_reset()
-{
- m_selected_bank = 15;
-}
-
-
void msx_cart_rtype_device::initialize_cartridge()
{
- if ( get_rom_size() != 0x80000 && get_rom_size() != 0x60000 )
+ if (get_rom_size() != 0x80000 && get_rom_size() != 0x60000)
{
fatalerror("rtype: Invalid ROM size\n");
}
- restore_banks();
-}
-
+ m_rombank->configure_entries(0, 24, get_rom_base(), 0x4000);
-uint8_t msx_cart_rtype_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0xc000)
- {
- return m_bank_base[offset >> 15][offset & 0x3fff];
- }
- return 0xff;
+ page(1)->install_rom(0x4000, 0x7fff, get_rom_base() + 15 * 0x4000);
+ page(1)->install_write_handler(0x7000, 0x7fff, write8smo_delegate(*this, FUNC(msx_cart_rtype_device::bank_w)));
+ page(2)->install_read_bank(0x8000, 0xbfff, m_rombank);
}
-
-void msx_cart_rtype_device::write_cart(offs_t offset, uint8_t data)
+void msx_cart_rtype_device::bank_w(u8 data)
{
- if (offset >= 0x7000 && offset < 0x8000)
- {
- m_selected_bank = data & 0x1f;
- if (m_selected_bank & 0x10)
- {
- m_selected_bank &= 0x17;
- }
- m_bank_base[1] = get_rom_base() + m_selected_bank * 0x4000;
- }
+ data &= 0x1f;
+ if (data & 0x10)
+ data &= 0x17;
+ m_rombank->set_entry(data);
}
diff --git a/src/devices/bus/msx_cart/rtype.h b/src/devices/bus/msx_cart/rtype.h
index 31583455a0a..f6d7afd325a 100644
--- a/src/devices/bus/msx_cart/rtype.h
+++ b/src/devices/bus/msx_cart/rtype.h
@@ -14,24 +14,18 @@ DECLARE_DEVICE_TYPE(MSX_CART_RTYPE, msx_cart_rtype_device)
class msx_cart_rtype_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_rtype_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_rtype_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
+ virtual void device_start() override { }
private:
- uint8_t m_selected_bank;
- uint8_t *m_bank_base[2];
+ void bank_w(u8 data);
+
+ memory_bank_creator m_rombank;
};
diff --git a/src/devices/bus/msx_cart/super_swangi.cpp b/src/devices/bus/msx_cart/super_swangi.cpp
index b3385f96e29..61025db82e2 100644
--- a/src/devices/bus/msx_cart/super_swangi.cpp
+++ b/src/devices/bus/msx_cart/super_swangi.cpp
@@ -10,37 +10,10 @@ DEFINE_DEVICE_TYPE(MSX_CART_SUPER_SWANGI, msx_cart_super_swangi_device, "msx_car
msx_cart_super_swangi_device::msx_cart_super_swangi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MSX_CART_SUPER_SWANGI, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
- , m_selected_bank(0)
+ , m_rombank(*this, "rombank")
{
- m_bank_base[0] = m_bank_base[1] = nullptr;
}
-
-void msx_cart_super_swangi_device::device_start()
-{
- save_item(NAME(m_selected_bank));
-}
-
-
-void msx_cart_super_swangi_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_super_swangi_device::restore_banks()
-{
- m_bank_base[0] = get_rom_base();
- m_bank_base[1] = get_rom_base() + (((m_selected_bank >> 1) * 0x4000) & 0xffff);
-}
-
-
-void msx_cart_super_swangi_device::device_reset()
-{
- m_selected_bank = 0;
-}
-
-
void msx_cart_super_swangi_device::initialize_cartridge()
{
if (get_rom_size() < 0x10000)
@@ -48,29 +21,14 @@ void msx_cart_super_swangi_device::initialize_cartridge()
fatalerror("super_swangi: Invalid ROM size\n");
}
- restore_banks();
-}
+ m_rombank->configure_entries(0, 4, get_rom_base(), 0x4000);
-
-uint8_t msx_cart_super_swangi_device::read_cart(offs_t offset)
-{
- if (offset >= 0x4000 && offset < 0xc000)
- {
- return m_bank_base[offset >> 15][offset & 0x3fff];
- }
- return 0xff;
+ page(1)->install_rom(0x4000, 0x7fff, get_rom_base());
+ page(2)->install_read_bank(0x8000, 0xbfff, m_rombank);
+ page(2)->install_write_handler(0x8000, 0x8000, write8smo_delegate(*this, FUNC(msx_cart_super_swangi_device::bank_w)));
}
-
-void msx_cart_super_swangi_device::write_cart(offs_t offset, uint8_t data)
+void msx_cart_super_swangi_device::bank_w(u8 data)
{
- if (offset == 0x8000)
- {
- m_selected_bank = data;
- restore_banks();
- }
- else
- {
- logerror("msx_cart_super_swangi_device: unhandled write %02x to %04x\n", data, offset);
- }
+ m_rombank->set_entry((data >> 1) & 0x03);
}
diff --git a/src/devices/bus/msx_cart/super_swangi.h b/src/devices/bus/msx_cart/super_swangi.h
index f0f5ee216bd..f0c3539c6ce 100644
--- a/src/devices/bus/msx_cart/super_swangi.h
+++ b/src/devices/bus/msx_cart/super_swangi.h
@@ -14,24 +14,18 @@ DECLARE_DEVICE_TYPE(MSX_CART_SUPER_SWANGI, msx_cart_super_swangi_device)
class msx_cart_super_swangi_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_super_swangi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_super_swangi_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
// device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual void device_post_load() override;
-
- void restore_banks();
+ virtual void device_start() override { }
private:
- uint8_t m_selected_bank;
- uint8_t *m_bank_base[2];
+ void bank_w(u8 data);
+
+ memory_bank_creator m_rombank;
};
diff --git a/src/devices/bus/msx_cart/superloderunner.cpp b/src/devices/bus/msx_cart/superloderunner.cpp
index 168f9187f8d..70df5248f4e 100644
--- a/src/devices/bus/msx_cart/superloderunner.cpp
+++ b/src/devices/bus/msx_cart/superloderunner.cpp
@@ -6,36 +6,19 @@
DEFINE_DEVICE_TYPE(MSX_CART_SUPERLODERUNNER, msx_cart_superloderunner_device, "msx_cart_superloderunner", "MSX Cartridge - Super Lode Runner")
-msx_cart_superloderunner_device::msx_cart_superloderunner_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_superloderunner_device::msx_cart_superloderunner_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSX_CART_SUPERLODERUNNER, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
- , m_selected_bank(0)
- , m_bank_base(nullptr)
+ , m_rombank(*this, "rombank")
{
}
-
void msx_cart_superloderunner_device::device_start()
{
- save_item(NAME(m_selected_bank));
-
- // Install evil memory write handler
- memory_space().install_write_handler(0x0000, 0x0000, write8smo_delegate(*this, FUNC(msx_cart_superloderunner_device::banking)));
-}
-
-
-void msx_cart_superloderunner_device::device_post_load()
-{
- restore_banks();
-}
-
-
-void msx_cart_superloderunner_device::restore_banks()
-{
- m_bank_base = get_rom_base() + (m_selected_bank & 0x0f) * 0x4000;
+ // Install evil system wide memory write handler
+ memory_space().install_write_handler(0x0000, 0x0000, write8smo_delegate(*this, FUNC(msx_cart_superloderunner_device::bank_w)));
}
-
void msx_cart_superloderunner_device::initialize_cartridge()
{
if (get_rom_size() != 0x20000)
@@ -43,23 +26,12 @@ void msx_cart_superloderunner_device::initialize_cartridge()
fatalerror("superloderunner: Invalid ROM size\n");
}
- restore_banks();
-}
+ m_rombank->configure_entries(0, 8, get_rom_base(), 0x4000);
-
-uint8_t msx_cart_superloderunner_device::read_cart(offs_t offset)
-{
- if (offset >= 0x8000 && offset < 0xc000)
- {
- return m_bank_base[offset & 0x3fff];
- }
-
- return 0xff;
+ page(2)->install_read_bank(0x8000, 0xbfff, m_rombank);
}
-
-void msx_cart_superloderunner_device::banking(uint8_t data)
+void msx_cart_superloderunner_device::bank_w(u8 data)
{
- m_selected_bank = data;
- restore_banks();
+ m_rombank->set_entry(data & 0x07);
}
diff --git a/src/devices/bus/msx_cart/superloderunner.h b/src/devices/bus/msx_cart/superloderunner.h
index bd763ca2c08..91a41ab26ec 100644
--- a/src/devices/bus/msx_cart/superloderunner.h
+++ b/src/devices/bus/msx_cart/superloderunner.h
@@ -14,24 +14,18 @@ DECLARE_DEVICE_TYPE(MSX_CART_SUPERLODERUNNER, msx_cart_superloderunner_device)
class msx_cart_superloderunner_device : public device_t, public msx_cart_interface
{
public:
- msx_cart_superloderunner_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_superloderunner_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void initialize_cartridge() override;
- virtual uint8_t read_cart(offs_t offset) override;
-
protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_post_load() override;
-
- void restore_banks();
private:
- void banking(uint8_t data);
+ void bank_w(u8 data);
- uint8_t m_selected_bank;
- uint8_t *m_bank_base;
+ memory_bank_creator m_rombank;
};
diff --git a/src/devices/bus/msx_cart/yamaha.cpp b/src/devices/bus/msx_cart/yamaha.cpp
index b2cb15a37b0..80fc4281b89 100644
--- a/src/devices/bus/msx_cart/yamaha.cpp
+++ b/src/devices/bus/msx_cart/yamaha.cpp
@@ -17,7 +17,7 @@ DEFINE_DEVICE_TYPE(MSX_CART_SFG01, msx_cart_sfg01_device, "msx_cart_sfg01", "MSX
DEFINE_DEVICE_TYPE(MSX_CART_SFG05, msx_cart_sfg05_device, "msx_cart_sfg05", "MSX Cartridge - SFG05")
-msx_cart_sfg_device::msx_cart_sfg_device(const machine_config &mconfig, const device_type type, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_sfg_device::msx_cart_sfg_device(const machine_config &mconfig, const device_type type, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, type, tag, owner, clock)
, msx_cart_interface(mconfig, *this)
, m_region_sfg(*this, "sfg")
@@ -30,19 +30,16 @@ msx_cart_sfg_device::msx_cart_sfg_device(const machine_config &mconfig, const de
{
}
-
-msx_cart_sfg01_device::msx_cart_sfg01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_sfg01_device::msx_cart_sfg01_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: msx_cart_sfg_device(mconfig, MSX_CART_SFG01, tag, owner, clock)
{
}
-
-msx_cart_sfg05_device::msx_cart_sfg05_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+msx_cart_sfg05_device::msx_cart_sfg05_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: msx_cart_sfg_device(mconfig, MSX_CART_SFG05, tag, owner, clock)
{
}
-
void msx_cart_sfg_device::device_add_mconfig(machine_config &config)
{
// YM2151 (OPM)
@@ -78,65 +75,76 @@ void msx_cart_sfg05_device::device_add_mconfig(machine_config &config)
ym2164.add_route(1, "rspeaker", 0.80);
}
-
-ROM_START( msx_sfg01 )
+ROM_START(msx_sfg01)
ROM_REGION(0x4000, "sfg", 0)
ROM_LOAD("sfg01.rom", 0x0, 0x4000, CRC(0995fb36) SHA1(434651305f92aa770a89e40b81125fb22d91603d)) // correct label is almost certainly "yamaha__ym2211-22702__48_18_89_b.ic104" though the datecode portion may vary between late 1983 and mid 1984
ROM_END
-
const tiny_rom_entry *msx_cart_sfg01_device::device_rom_region() const
{
- return ROM_NAME( msx_sfg01 );
+ return ROM_NAME(msx_sfg01);
}
-
-ROM_START( msx_sfg05 )
+ROM_START(msx_sfg05)
ROM_REGION(0x8000, "sfg", 0)
- ROM_SYSTEM_BIOS( 0, "sfg05", "SFG05 (original)" )
- ROMX_LOAD( "sfg05.rom", 0x0, 0x8000, CRC(2425c279) SHA1(d956167e234f60ad916120437120f86fc8c3c321), ROM_BIOS(0) ) // correct label MIGHT be "yamaha__ym2301-23959.ic104" but this needs redump/verification
- ROM_SYSTEM_BIOS( 1, "sfg05a", "SFG05 (SFG01 upgrade)" ) // SFG01 PCB, Yamaha official upgrade, has YM2151 instead of YM2164
- ROMX_LOAD( "sfg05a.rom", 0x0, 0x8000, CRC(5bc237f8) SHA1(930338f45c08228108c0831cc4a26014c2674718), ROM_BIOS(1) ) // this came on a single eprom on a daughterboard on an SFG01 board which had been factory upgraded to SFG05
+ // Version string starts at $02BD
+ ROM_SYSTEM_BIOS(0, "m5.01.011", "SFG05 (original) M5.01.011")
+ ROMX_LOAD( "sfg05.rom", 0x0, 0x8000, CRC(2425c279) SHA1(d956167e234f60ad916120437120f86fc8c3c321), ROM_BIOS(0)) // correct label MIGHT be "yamaha__ym2301-23959.ic104" but this needs redump/verification
+ ROM_SYSTEM_BIOS(1, "m5.00.013", "SFG05 (SFG01 upgrade) M5.00.013") // SFG01 PCB, Yamaha official upgrade, has YM2151 instead of YM2164
+ ROMX_LOAD( "sfg05a.rom", 0x0, 0x8000, CRC(5bc237f8) SHA1(930338f45c08228108c0831cc4a26014c2674718), ROM_BIOS(1)) // this came on a single eprom on a daughterboard on an SFG01 board which had been factory upgraded to SFG05
+ ROM_SYSTEM_BIOS(2, "m5.00.011", "SFG05 M5.00.011") // Found in Sakhr AX-200M
+ ROMX_LOAD("sfg05_m5_00_011.rom", 0x0, 0x8000, BAD_DUMP CRC(9d5e20c9) SHA1(fcc385b90c65575e29fc009aa00b5120fc4c251a), ROM_BIOS(2)) // Still seems to have I/O reads at $7ff0 - $7fff
ROM_END
-
const tiny_rom_entry *msx_cart_sfg05_device::device_rom_region() const
{
- return ROM_NAME( msx_sfg05 );
+ return ROM_NAME(msx_sfg05);
}
-
void msx_cart_sfg_device::device_start()
{
// Set rom mask
m_rom_mask = m_region_sfg->bytes() - 1;
- // This should probably moved up in the bus/slot hierarchy for the msx driver
- cpu_device *maincpu = machine().device<cpu_device>("maincpu");
- maincpu->set_irq_acknowledge_callback(*this, FUNC(msx_cart_sfg_device::irq_callback));
-}
+ maincpu().set_irq_acknowledge_callback(*this, FUNC(msx_cart_sfg_device::irq_callback));
+ page(0)->install_rom(0x0000, 0x3fff, m_region_sfg->base());
+ if (m_region_sfg->bytes() == 0x8000)
+ {
+ page(1)->install_rom(0x4000, 0x7fff, m_region_sfg->base() + 0x4000);
+ }
+ else
+ {
+ page(1)->install_rom(0x4000, 0x7fff, m_region_sfg->base());
+ }
+
+ for (int i = 0; i < 4; i++)
+ {
+ // These addresses deliberately overlap
+ page(i)->install_read_handler(0x4000 * i + 0x3ff0, 0x4000 * i + 0x3ff6, read8sm_delegate(*m_ym2148, FUNC(ym2148_device::read)));
+ page(i)->install_read_handler(0x4000 * i + 0x3ff0, 0x4000 * i + 0x3ff1, read8sm_delegate(*m_ym2151, FUNC(ym_generic_device::read)));
+ page(i)->install_write_handler(0x4000 * i + 0x3ff0, 0x4000 * i + 0x3ff6, write8sm_delegate(*m_ym2148, FUNC(ym2148_device::write)));
+ page(i)->install_write_handler(0x4000 * i + 0x3ff0, 0x4000 * i + 0x3ff1, write8sm_delegate(*m_ym2151, FUNC(ym_generic_device::write)));
+ }
+}
IRQ_CALLBACK_MEMBER(msx_cart_sfg_device::irq_callback)
{
return m_ym2148->get_irq_vector();
}
-
WRITE_LINE_MEMBER(msx_cart_sfg_device::ym2151_irq_w)
{
m_ym2151_irq_state = state ? ASSERT_LINE : CLEAR_LINE;
check_irq();
}
-
WRITE_LINE_MEMBER(msx_cart_sfg_device::ym2148_irq_w)
{
m_ym2148_irq_state = state ? ASSERT_LINE : CLEAR_LINE;
check_irq();
}
-
void msx_cart_sfg_device::check_irq()
{
if (m_ym2151_irq_state != CLEAR_LINE || m_ym2148_irq_state != CLEAR_LINE)
@@ -148,61 +156,3 @@ void msx_cart_sfg_device::check_irq()
irq_out(CLEAR_LINE);
}
}
-
-
-uint8_t msx_cart_sfg_device::read_cart(offs_t offset)
-{
- switch (offset & 0x3fff)
- {
- case 0x3ff0: // YM-2151 status read
- case 0x3ff1: // YM-2151 status read mirror?
- return m_ym2151->read(offset & 1);
-
- case 0x3ff2: // YM-2148 keyboard column read
- case 0x3ff3: // YM-2148 --
- case 0x3ff4: // YM-2148 --
- case 0x3ff5: // YM-2148 MIDI UART data read register
- case 0x3ff6: // YM-2148 MIDI UART status register
- // ------x- - 1 = received a byte/receive buffer full?
- // -------x - 1 = ready to send next byte/send buffer empty?
- return m_ym2148->read(offset & 7);
- }
-
- if (offset < 0x8000)
- {
- return m_region_sfg->as_u8(offset & m_rom_mask);
- }
-
- return 0xff;
-}
-
-
-void msx_cart_sfg_device::write_cart(offs_t offset, uint8_t data)
-{
- switch (offset & 0x3fff)
- {
- case 0x3ff0: // YM-2151 register
- case 0x3ff1: // YM-2151 data
- m_ym2151->write(offset & 1, data);
- break;
-
- case 0x3ff2: // YM-2148 write keyboard row
- case 0x3ff3: // YM-2148 MIDI IRQ vector
- case 0x3ff4: // YM-2148 External IRQ vector
- case 0x3ff5: // YM-2148 MIDI UART data write register
- case 0x3ff6: // YM-2148 MIDI UART command register
- // On startup the sfg01 writes 0x80
- // followed by 0x05.
- // Other write seen in the code: 0x15
- //
- // x------- - 1 = reset
- // -----x-- - 1 = enable receiving / sending midi data
- // -------x - 1 = enable receiving / sending midi data
- m_ym2148->write(offset & 7, data);
- break;
-
- default:
- logerror("msx_cart_sfg_device::write_cart: write %02x to %04x\n", data, offset);
- break;
- }
-}
diff --git a/src/devices/bus/msx_cart/yamaha.h b/src/devices/bus/msx_cart/yamaha.h
index cd4c036cab8..0b48f96b781 100644
--- a/src/devices/bus/msx_cart/yamaha.h
+++ b/src/devices/bus/msx_cart/yamaha.h
@@ -17,12 +17,8 @@ DECLARE_DEVICE_TYPE(MSX_CART_SFG05, msx_cart_sfg05_device)
class msx_cart_sfg_device : public device_t, public msx_cart_interface
{
-public:
- virtual uint8_t read_cart(offs_t offset) override;
- virtual void write_cart(offs_t offset, uint8_t data) override;
-
protected:
- msx_cart_sfg_device(const machine_config &mconfig, const device_type type, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_sfg_device(const machine_config &mconfig, const device_type type, const char *tag, device_t *owner, u32 clock);
virtual void device_start() override;
@@ -40,7 +36,7 @@ protected:
required_device<ym2148_device> m_ym2148;
int m_ym2151_irq_state;
int m_ym2148_irq_state;
- uint32_t m_rom_mask;
+ u32 m_rom_mask;
void check_irq();
};
@@ -49,7 +45,7 @@ protected:
class msx_cart_sfg01_device : public msx_cart_sfg_device
{
public:
- msx_cart_sfg01_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_sfg01_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual const tiny_rom_entry *device_rom_region() const override;
};
@@ -58,7 +54,7 @@ public:
class msx_cart_sfg05_device : public msx_cart_sfg_device
{
public:
- msx_cart_sfg05_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ msx_cart_sfg05_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;