bus/gameboy: Added support for banked RAM games in multi-game carts.

New working software list items
----------------
gbcolor.xml: 36 in 1 (SL36-0032) [taizou, Vas Crabb]
This commit is contained in:
Vas Crabb 2022-09-18 09:00:33 +10:00
parent 63e0c8bdc3
commit f4d1429f30
2 changed files with 49 additions and 5 deletions

View File

@ -26372,6 +26372,7 @@ license:CC0
<year>200?</year>
<publisher>Vast Fame</publisher>
<info name="alt_title" value="銀版中文RPG戰略+動作+益智12in1" />
<info name="usage" value="Use hard reset to return to game selection menu." />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_slmulti" />
<dataarea name="rom" size="0x800000">
@ -26386,6 +26387,7 @@ license:CC0
<year>200?</year>
<publisher>Vast Fame</publisher>
<info name="alt_title" value="史上超強RPG+格鬥+益智版組合卡18in1" />
<info name="usage" value="Use hard reset to return to game selection menu." />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_slmulti" />
<dataarea name="rom" size="0x1000000">
@ -26395,6 +26397,20 @@ license:CC0
</part>
</software>
<software name="sl36in1">
<description>36 in 1 (SL36-0032)</description>
<year>200?</year>
<publisher>SL?</publisher>
<info name="usage" value="Use hard reset to return to game selection menu." />
<part name="cart" interface="gameboy_cart">
<feature name="slot" value="rom_slmulti" />
<dataarea name="rom" size="0x400000">
<rom name="36 in 1 sl36-0032.gbc" size="0x400000" crc="f68d980a" sha1="63181a86fa4a653744e9c393aa9f113e981d9cc7" />
</dataarea>
<dataarea name="nvram" size="0x20000" />
</part>
</software>
<!-- some games don't work on gbcolor (e.g. 02. KOF97 works on gameboy but not gbcolor) -->
<software name="jy145in1" supported="partial">
<description>New Super Color 145 in 1 (China)</description>

View File

@ -55,12 +55,28 @@ private:
set_bank_rom_high(page);
}
void update_bank_ram()
{
u16 const page(bank_ram_entry());
LOG(
"%s: Set RAM page 0x%X (0x%05X)\n",
machine().describe_context(),
page,
u32(page) << 13);
set_bank_ram(page);
}
u16 bank_rom_entry_high() const noexcept
{
u16 const hi(m_high_page_rom & m_page_mask_rom);
return (m_base_page_rom & ~m_page_mask_rom) | (hi ? hi : (m_zero_remap_rom & m_page_mask_rom));
}
u8 bank_ram_entry() const noexcept
{
return (m_base_page_ram & ~m_page_mask_ram) | (m_page_ram & m_page_mask_ram);
}
memory_view m_view_ctrl;
memory_view m_view_ram;
@ -73,6 +89,8 @@ private:
u8 m_enable_ram;
u8 m_base_page_ram;
u8 m_page_ram;
u8 m_page_mask_ram;
};
@ -90,7 +108,9 @@ slmulti_device::slmulti_device(
m_page_mask_rom(0U),
m_zero_remap_rom(0U),
m_enable_ram(0U),
m_base_page_ram(0U)
m_base_page_ram(0U),
m_page_ram(0U),
m_page_mask_ram(0U)
{
}
@ -156,6 +176,8 @@ void slmulti_device::device_start()
m_enable_ram = 0U;
m_base_page_ram = 0U;
m_page_ram = 0U;
m_page_mask_ram = 0U;
save_item(NAME(m_config_cmd));
save_item(NAME(m_base_page_rom));
@ -164,6 +186,8 @@ void slmulti_device::device_start()
save_item(NAME(m_zero_remap_rom));
save_item(NAME(m_enable_ram));
save_item(NAME(m_base_page_ram));
save_item(NAME(m_page_ram));
save_item(NAME(m_page_mask_ram));
}
@ -175,6 +199,7 @@ void slmulti_device::device_reset()
set_bank_rom_low(m_base_page_rom & ~m_page_mask_rom);
update_bank_rom_high();
update_bank_ram();
}
@ -217,7 +242,8 @@ void slmulti_device::set_config_cmd(u8 data)
void slmulti_device::bank_switch_ram(u8 data)
{
LOG("%s: Set RAM bank 0x%02X\n", machine().describe_context(), data);
m_page_ram = data & 0x0f;
update_bank_ram();
}
@ -279,12 +305,14 @@ void slmulti_device::do_config_cmd(u8 data)
case 0xbb:
m_enable_ram = BIT(data, 5);
m_base_page_ram = BIT(data, 0, 4);
set_bank_ram(m_base_page_ram);
m_page_mask_ram = BIT(data, 4) ? 0x00 : 0x03;
LOG(
"%s: Set RAM %s, base page = 0x%X\n",
"%s: Set RAM %s, base page = 0x%X, page mask = 0x%X\n",
machine().describe_context(),
m_enable_ram ? "enabled" : "disabled",
m_base_page_ram);
m_base_page_ram,
m_page_mask_ram);
update_bank_ram();
break;
default: