bus/vboy: cartridge is 16 bits wide (not 32) but we'll keep pretending for program ROM (nw)

This commit is contained in:
Vas Crabb 2019-11-11 01:35:40 +11:00
parent b9afe742e6
commit 774cc7ce43
3 changed files with 31 additions and 44 deletions

View File

@ -71,7 +71,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<dataarea name="rom" size="2097152" width="32" endianness="little">
<rom name="golf (usa).bin" size="2097152" crc="2199af41" sha1="23ce3c174789cdd306497d86cb2c4e76ba8b06e5" offset="000000" />
</dataarea>
<dataarea name="sram" size="0x10000" width="32" endianness="little">
<dataarea name="sram" size="0x10000" width="16" endianness="little">
</dataarea>
</part>
</software>
@ -286,7 +286,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<dataarea name="rom" size="1048576" width="32" endianness="little">
<rom name="teleroboxer (japan, usa).bin" size="1048576" crc="36103000" sha1="c59e020f9674774c5cbc022317ebba0eb1d744f7" offset="000000" />
</dataarea>
<dataarea name="sram" size="0x10000" width="32" endianness="little">
<dataarea name="sram" size="0x10000" width="16" endianness="little">
</dataarea>
</part>
</software>
@ -335,7 +335,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<dataarea name="rom" size="1048576" width="32" endianness="little">
<rom name="vue-vvfj-0.u1" size="1048576" crc="526cc969" sha1="583b409b7215159219d08e789db46140062095f2" offset="000000" />
</dataarea>
<dataarea name="sram" size="0x10000" width="32" endianness="little">
<dataarea name="sram" size="0x10000" width="16" endianness="little">
</dataarea>
</part>
</software>
@ -379,7 +379,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<dataarea name="rom" size="2097152" width="32" endianness="little">
<rom name="t&amp;e virtual golf (japan).bin" size="2097152" crc="6ba07915" sha1="c595285d42c69f14b2b418c1edfbe4a7f9a624b6" offset="000000" />
</dataarea>
<dataarea name="sram" size="0x10000" width="32" endianness="little">
<dataarea name="sram" size="0x10000" width="16" endianness="little">
</dataarea>
</part>
</software>
@ -453,7 +453,7 @@ According to Planet Virtual Boy, the following undumped protos exist
<dataarea name="rom" size="2097152" width="32" endianness="little">
<rom name="virtual boy wario land (japan, usa).bin" size="2097152" crc="133e9372" sha1="274c328fbd904f20e69172ab826bf8f94ced1bdb" offset="000000" />
</dataarea>
<dataarea name="sram" size="0x10000" width="32" endianness="little">
<dataarea name="sram" size="0x10000" width="16" endianness="little">
</dataarea>
</part>
</software>

View File

@ -51,6 +51,12 @@ image_init_result vboy_flat_rom_device::load()
// this should fail a validity check
assert(!(rom_base() & 0x00ff'ffff));
// This is a simplification that improves performance. In
// reality, cartridge ROM is 16 bits wide and 32-bit accesses
// are split up automatically. MAME doesn't really support
// dynamic bus sizing, and it's a lot faster to execute from a
// ROM handler than to go through the trampolines necessary to
// emulate 16-bit accesses.
device_generic_cart_interface::install_non_power_of_two<2>(
romregion->bytes() >> 2,
0x00ff'ffff >> 2,
@ -105,36 +111,6 @@ image_init_result vboy_flat_rom_sram_device::load()
switch (sramregion->bitwidth())
{
case 8:
if (chip_space())
{
device_generic_cart_interface::install_non_power_of_two<2>(
sramregion->bytes(),
0x00ff'ffff >> 2,
0,
0,
chip_base(),
[this, sramregion] (offs_t begin, offs_t end, offs_t mirror, offs_t src)
{
LOG(
"Install SRAM 0x%08X-0x%08X at 0x%08X-0x%08X mirror %08X\n",
src,
src + ((end - begin) >> 2),
begin,
end,
mirror);
u8 *const base(&reinterpret_cast<u8 *>(sramregion->base())[src]);
chip_space()->install_readwrite_handler(
begin,
end,
read8sm_delegate(*this, NAME([base] (offs_t offset) { return base[offset]; })),
write8sm_delegate(*this, NAME([base] (offs_t offset, u8 data) { base[offset] = data; })),
0x0000'00ff);
});
}
save_pointer(NAME(&sramregion->as_u8()), sramregion->bytes());
break;
case 16:
if (chip_space())
{
device_generic_cart_interface::install_non_power_of_two<2>(
@ -152,19 +128,19 @@ image_init_result vboy_flat_rom_sram_device::load()
begin,
end,
mirror);
u16 *const base(&reinterpret_cast<u16 *>(sramregion->base())[src]);
u8 *const base(&reinterpret_cast<u8 *>(sramregion->base())[src << 1]);
chip_space()->install_readwrite_handler(
begin,
end,
read16s_delegate(*this, NAME([base] (offs_t offset, u16 mem_mask) { return base[offset]; })),
write16s_delegate(*this, NAME([base] (offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA(base + offset); })),
0x0000'ffff);
read8sm_delegate(*this, NAME([base] (offs_t offset) { return base[offset]; })),
write8sm_delegate(*this, NAME([base] (offs_t offset, u8 data) { base[offset] = data; })),
0x00ff'00ff);
});
}
save_pointer(NAME(&sramregion->as_u16()), sramregion->bytes() >> 1);
save_pointer(NAME(&sramregion->as_u8()), sramregion->bytes());
break;
case 32:
case 16:
if (chip_space())
{
device_generic_cart_interface::install_non_power_of_two<2>(
@ -173,7 +149,7 @@ image_init_result vboy_flat_rom_sram_device::load()
0,
0,
chip_base(),
[this, sram = reinterpret_cast<u32 *>(sramregion->base())] (offs_t begin, offs_t end, offs_t mirror, offs_t src)
[this, sramregion] (offs_t begin, offs_t end, offs_t mirror, offs_t src)
{
LOG(
"Install SRAM 0x%08X-0x%08X at 0x%08X-0x%08X mirror %08X\n",
@ -182,10 +158,16 @@ image_init_result vboy_flat_rom_sram_device::load()
begin,
end,
mirror);
chip_space()->install_ram(begin, end, mirror, &sram[src]);
u16 *const base(&reinterpret_cast<u16 *>(sramregion->base())[src << 1]);
chip_space()->install_readwrite_handler(
begin,
end,
read16s_delegate(*this, NAME([base] (offs_t offset, u16 mem_mask) { return base[offset]; })),
write16s_delegate(*this, NAME([base] (offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA(base + offset); })),
0xffff'ffff);
});
}
save_pointer(NAME(&sramregion->as_u32()), sramregion->bytes() >> 2);
save_pointer(NAME(&sramregion->as_u16()), sramregion->bytes() >> 1);
break;
default:
@ -201,6 +183,8 @@ image_init_result vboy_flat_rom_sram_device::load()
void vboy_flat_rom_sram_device::unload()
{
vboy_flat_rom_device::unload();
memory_region *const sramregion(memregion("^sram"));
if (sramregion)
battery_save(sramregion->base(), sramregion->bytes());

View File

@ -2,6 +2,9 @@
// copyright-holders:Vas Crabb
/***************************************************************************
Virtual Boy cartridge slot
TODO:
- Sound capabilities
***************************************************************************/
#include "emu.h"