svi318: add support for banked cartridges

This commit is contained in:
Dirk Best 2016-03-20 13:34:04 +01:00
parent 6c9aaf6979
commit ebf0bd7c20

View File

@ -54,6 +54,7 @@ public:
m_intvdp(0), m_intexp(0),
m_romdis(1), m_ramdis(1),
m_cart(1), m_bk21(1),
m_rom2(1), m_rom3(1),
m_keyboard_row(0)
{}
@ -96,6 +97,8 @@ private:
int m_ramdis;
int m_cart;
int m_bk21;
int m_rom2;
int m_rom3;
UINT8 m_keyboard_row;
};
@ -310,6 +313,8 @@ void svi3x8_state::machine_start()
save_item(NAME(m_ramdis));
save_item(NAME(m_cart));
save_item(NAME(m_bk21));
save_item(NAME(m_rom2));
save_item(NAME(m_rom3));
save_item(NAME(m_keyboard_row));
}
@ -325,8 +330,9 @@ void svi3x8_state::machine_reset()
READ8_MEMBER( svi3x8_state::page1_r)
{
// cartridge /CCS1 and /CCS2
if (m_cart == 0)
return m_cart_rom->exists() ? m_cart_rom->read_rom(space, offset) : 0xff;
return m_cart_rom->read_rom(space, offset);
UINT8 data = m_expander->mreq_r(space, offset);
@ -354,6 +360,14 @@ READ8_MEMBER( svi3x8_state::page2_r)
{
offset += 0x8000;
// cartridge /CCS3
if (m_cart == 0 && m_rom2 == 0 && offset < 0xc000)
return m_cart_rom->read_rom(space, offset);
// cartridge /CCS4
if (m_cart == 0 && m_rom3 == 0 && offset >= 0xc000)
return m_cart_rom->read_rom(space, offset);
UINT8 data = m_expander->mreq_r(space, offset);
if (m_ramdis == 1 && (offset >= 0x4000 || IS_SVI328))
@ -366,6 +380,14 @@ WRITE8_MEMBER( svi3x8_state::page2_w )
{
offset += 0x8000;
// cartridge /CCS3
if (m_cart == 0 && m_rom2 == 0 && offset < 0xc000)
return;
// cartridge /CCS4
if (m_cart == 0 && m_rom3 == 0 && offset >= 0xc000)
return;
m_expander->mreq_w(space, offset, data);
if (m_ramdis == 1 && (offset >= 0x4000 || IS_SVI328))
@ -384,7 +406,8 @@ WRITE8_MEMBER( svi3x8_state::bank_w )
m_expander->bk31_w(BIT(data, 3));
m_expander->bk32_w(BIT(data, 4));
// TODO: handle ROM2/ROM3 enable (bit 6 + 7)
m_rom2 = BIT(data, 6);
m_rom3 = BIT(data, 7);
output().set_value("led_caps_lock", BIT(data, 5));
}
@ -450,12 +473,6 @@ DEVICE_IMAGE_LOAD_MEMBER( svi3x8_state, cartridge )
{
UINT32 size = m_cart_rom->common_get_size("rom");
if (size != 0x8000)
{
popmessage("Cartridge image '%s' invalid size: %u bytes", image.filename(), size);
return IMAGE_INIT_FAIL;
}
m_cart_rom->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_LITTLE);
m_cart_rom->common_load_rom(m_cart_rom->get_rom_base(), size, "rom");