mirror of
https://github.com/holub/mame
synced 2025-07-05 18:08:04 +03:00
bus/vboy: cartridge is 16 bits wide (not 32) but we'll keep pretending for program ROM (nw)
This commit is contained in:
parent
b9afe742e6
commit
774cc7ce43
@ -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&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>
|
||||
|
@ -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());
|
||||
|
@ -2,6 +2,9 @@
|
||||
// copyright-holders:Vas Crabb
|
||||
/***************************************************************************
|
||||
Virtual Boy cartridge slot
|
||||
|
||||
TODO:
|
||||
- Sound capabilities
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
|
Loading…
Reference in New Issue
Block a user