diff --git a/src/emu/bus/vboy/slot.c b/src/emu/bus/vboy/slot.c index 244f7a80b60..ba1407e232f 100644 --- a/src/emu/bus/vboy/slot.c +++ b/src/emu/bus/vboy/slot.c @@ -171,8 +171,10 @@ bool vboy_cart_slot_device::call_load() seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size"); return IMAGE_INIT_FAIL; } - - m_cart->rom_alloc(len, tag()); + + // always alloc 0x200000 so to be able to directly map the region + // to the address map (speeding up emulation a bit) + m_cart->rom_alloc(0x200000, tag()); if (has_eeprom) m_cart->eeprom_alloc(get_software_region_length("eeprom")); @@ -183,6 +185,10 @@ bool vboy_cart_slot_device::call_load() else memcpy(ROM, get_software_region("rom"), len); + if (len < 0x080000) { memcpy(ROM + 0x040000, ROM, 0x040000); } + if (len < 0x100000) { memcpy(ROM + 0x080000, ROM, 0x080000); } + if (len < 0x200000) { memcpy(ROM + 0x100000, ROM, 0x100000); } + if (software_entry() == NULL) m_type = vboy_get_pcb_id("vb_rom"); else diff --git a/src/mess/drivers/vboy.c b/src/mess/drivers/vboy.c index de8c6d11003..7dcfefd1f23 100644 --- a/src/mess/drivers/vboy.c +++ b/src/mess/drivers/vboy.c @@ -157,6 +157,7 @@ public: required_device m_cart; required_device m_maintimer; required_device m_palette; + memory_region *m_cart_rom; DECLARE_READ32_MEMBER(io_r); DECLARE_WRITE32_MEMBER(io_w); @@ -1111,7 +1112,7 @@ static ADDRESS_MAP_START( vboy_mem, AS_PROGRAM, 32, vboy_state ) //AM_RANGE( 0x04000000, 0x04ffffff ) // Expansion area AM_RANGE( 0x05000000, 0x0500ffff ) AM_MIRROR(0x0ff0000) AM_RAM AM_SHARE("wram")// Main RAM - 64K mask 0xffff AM_RANGE( 0x06000000, 0x06003fff ) AM_DEVREADWRITE("cartslot", vboy_cart_slot_device, read_eeprom, write_eeprom) // Cart RAM - 8K NVRAM - AM_RANGE( 0x07000000, 0x071fffff ) AM_MIRROR(0x0e00000) AM_DEVREAD("cartslot", vboy_cart_slot_device, read_cart) /* ROM */ +// AM_RANGE( 0x07000000, 0x071fffff ) AM_MIRROR(0x0e00000) AM_DEVREAD("cartslot", vboy_cart_slot_device, read_cart) /* ROM */ ADDRESS_MAP_END static ADDRESS_MAP_START( vboy_io, AS_IO, 32, vboy_state ) @@ -1140,7 +1141,7 @@ static ADDRESS_MAP_START( vboy_io, AS_IO, 32, vboy_state ) // AM_RANGE( 0x04000000, 0x04ffffff ) // Expansion area AM_RANGE( 0x05000000, 0x0500ffff ) AM_MIRROR(0x0ff0000) AM_RAM AM_SHARE("wram") // Main RAM - 64K mask 0xffff AM_RANGE( 0x06000000, 0x06003fff ) AM_NOP // Cart RAM - 8K NVRAM ? - AM_RANGE( 0x07000000, 0x071fffff ) AM_MIRROR(0x0e00000) AM_DEVREAD("cartslot", vboy_cart_slot_device, read_cart) /* ROM */ +// AM_RANGE( 0x07000000, 0x071fffff ) AM_MIRROR(0x0e00000) AM_DEVREAD("cartslot", vboy_cart_slot_device, read_cart) /* ROM */ ADDRESS_MAP_END /* Input ports */ @@ -1167,8 +1168,21 @@ INPUT_PORTS_END void vboy_state::machine_start() { + // install the cart ROM as a bank into the address map. + // this speeds up the rom access, by skipping the m_cart->read_rom + // trampoline (but forces us to alloc always a 0x200000-wide region) if (m_cart->exists()) + { + astring region_tag; + m_cart_rom = memregion(region_tag.cpy(m_cart->tag()).cat(VBOYSLOT_ROM_REGION_TAG)); + + m_maincpu->space(AS_PROGRAM).install_read_bank(0x07000000, 0x071fffff, 0, 0x0e00000, "prog_cart_bank"); + m_maincpu->space(AS_IO).install_read_bank(0x07000000, 0x071fffff, 0, 0x0e00000, "io_cart_bank"); + membank("prog_cart_bank")->set_base(m_cart_rom->base()); + membank("io_cart_bank")->set_base(m_cart_rom->base()); + m_cart->save_eeprom(); + } } void vboy_state::machine_reset()