diff options
Diffstat (limited to 'src/mess/drivers/crvision.c')
-rw-r--r-- | src/mess/drivers/crvision.c | 148 |
1 files changed, 30 insertions, 118 deletions
diff --git a/src/mess/drivers/crvision.c b/src/mess/drivers/crvision.c index 1acab4cb555..269d832135f 100644 --- a/src/mess/drivers/crvision.c +++ b/src/mess/drivers/crvision.c @@ -699,6 +699,12 @@ void crvision_state::machine_start() // state saving save_item(NAME(m_keylatch)); save_item(NAME(m_joylatch)); + + if (m_cart->exists()) + { + m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0x7fff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom40),(crvision_cart_slot_device*)m_cart)); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom80),(crvision_cart_slot_device*)m_cart)); + } } void crvision_pal_state::machine_start() @@ -706,6 +712,12 @@ void crvision_pal_state::machine_start() // state saving save_item(NAME(m_keylatch)); save_item(NAME(m_joylatch)); + + if (m_cart->exists()) + { + m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0x7fff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom40),(crvision_cart_slot_device*)m_cart)); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom80),(crvision_cart_slot_device*)m_cart)); + } } /*------------------------------------------------- @@ -717,122 +729,29 @@ void laser2001_state::machine_start() // state saving save_item(NAME(m_keylatch)); save_item(NAME(m_joylatch)); -} - -/*************************************************************************** - CARTRIDGE -***************************************************************************/ - -DEVICE_IMAGE_LOAD_MEMBER( crvision_state, crvision_cart ) -{ - UINT32 size; - dynamic_buffer temp_copy; - UINT8 *mem = memregion(M6502_TAG)->base(); - address_space &program = m_maincpu->space(AS_PROGRAM); - - if (image.software_entry() == NULL) + + if (m_cart->exists()) { - size = image.length(); - temp_copy.resize(size); - image.fread( temp_copy, size); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x4000, 0x7fff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom40),(crvision_cart_slot_device*)m_cart)); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x8000, 0xbfff, read8_delegate(FUNC(crvision_cart_slot_device::read_rom80),(crvision_cart_slot_device*)m_cart)); } - else - { - size= image.get_software_region_length("rom"); - temp_copy.resize(size); - memcpy(temp_copy, image.get_software_region("rom"), size); - } - - switch (size) - { - case 0x1000: // 4K - memcpy(mem + 0x9000, temp_copy, 0x1000); // load 4KB at 0x9000 - memcpy(mem + 0xb000, mem + 0x9000, 0x1000); // mirror 4KB at 0xb000 - program.install_read_bank(0x8000, 0xbfff, 0, 0x2000, BANK_ROM1); - break; - - case 0x1800: // 6K - memcpy(mem + 0x9000, temp_copy, 0x1000); // load lower 4KB at 0x9000 - memcpy(mem + 0xb000, mem + 0x9000, 0x1000); // mirror lower 4KB at 0xb000 - memcpy(mem + 0x8000, temp_copy + 0x1000, 0x0800); // load higher 2KB at 0x8000 - memcpy(mem + 0x8800, mem + 0x8000, 0x0800); // mirror higher 2KB at 0x8800 - memcpy(mem + 0xa000, mem + 0x8000, 0x0800); // mirror higher 2KB at 0xa000 - memcpy(mem + 0xa800, mem + 0x8000, 0x0800); // mirror higher 2KB at 0xa800 - program.install_read_bank(0x8000, 0xbfff, 0, 0x2000, BANK_ROM1); - break; - - case 0x2000: // 8K - memcpy(mem + 0x8000, temp_copy, 0x2000); // load 8KB at 0x8000 - memcpy(mem + 0xa000, mem + 0x8000, 0x2000); // mirror 8KB at 0xa000 - program.install_read_bank(0x8000, 0xbfff, 0, 0x2000, BANK_ROM1); - break; - - case 0x2800: // 10K - memcpy(mem + 0x8000, temp_copy, 0x2000); // load lower 8KB at 0x8000 - memcpy(mem + 0xa000, mem + 0x8000, 0x2000); // mirror lower 8KB at 0xa000 - memcpy(mem + 0x4000, temp_copy + 0x2000, 0x0800); // load higher 2KB at 0x4000 - memcpy(mem + 0x4800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x4800 - memcpy(mem + 0x5000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5000 - memcpy(mem + 0x5800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5800 - memcpy(mem + 0x6000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x6000 - memcpy(mem + 0x6800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x6800 - memcpy(mem + 0x7000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x7000 - memcpy(mem + 0x7800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x7800 - program.install_read_bank(0x8000, 0xbfff, BANK_ROM1); - program.install_read_bank(0x4000, 0x7fff, BANK_ROM2); - break; - - case 0x3000: // 12K - memcpy(mem + 0x8000, temp_copy, 0x2000); // load lower 8KB at 0x8000 - memcpy(mem + 0xa000, mem + 0x8000, 0x2000); // mirror lower 8KB at 0xa000 - memcpy(mem + 0x4000, temp_copy + 0x2000, 0x1000); // load higher 4KB at 0x4000 - memcpy(mem + 0x5000, mem + 0x4000, 0x1000); // mirror higher 4KB at 0x5000 - memcpy(mem + 0x6000, mem + 0x4000, 0x1000); // mirror higher 4KB at 0x6000 - memcpy(mem + 0x7000, mem + 0x4000, 0x1000); // mirror higher 4KB at 0x7000 - program.install_read_bank(0x8000, 0xbfff, BANK_ROM1); - program.install_read_bank(0x4000, 0x7fff, BANK_ROM2); - break; - - case 0x4000: // 16K - memcpy(mem + 0xa000, temp_copy, 0x2000); // load lower 8KB at 0xa000 - memcpy(mem + 0x8000, temp_copy + 0x2000, 0x2000); // load higher 8KB at 0x8000 - program.install_read_bank(0x8000, 0xbfff, BANK_ROM1); - program.install_read_bank(0x4000, 0x7fff, BANK_ROM2); - break; - - case 0x4800: // 18K - memcpy(mem + 0xa000, temp_copy, 0x2000); // load lower 8KB at 0xa000 - memcpy(mem + 0x8000, temp_copy + 0x2000, 0x2000); // load higher 8KB at 0x8000 - memcpy(mem + 0x4000, temp_copy + 0x4000, 0x0800); // load higher 2KB at 0x4000 - memcpy(mem + 0x4800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x4800 - memcpy(mem + 0x5000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5000 - memcpy(mem + 0x5800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x5800 - memcpy(mem + 0x6000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x6000 - memcpy(mem + 0x6800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x6800 - memcpy(mem + 0x7000, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x7000 - memcpy(mem + 0x7800, mem + 0x4000, 0x0800); // mirror higher 2KB at 0x7800 - program.install_read_bank(0x8000, 0xbfff, BANK_ROM1); - program.install_read_bank(0x4000, 0x7fff, BANK_ROM2); - break; - - default: - auto_free(machine(), temp_copy); - return IMAGE_INIT_FAIL; - } - - membank(BANK_ROM1)->configure_entry(0, mem + 0x8000); - membank(BANK_ROM1)->set_entry(0); - - membank(BANK_ROM2)->configure_entry(0, mem + 0x4000); - membank(BANK_ROM2)->set_entry(0); - - return IMAGE_INIT_PASS; } + /*************************************************************************** MACHINE DRIVERS ***************************************************************************/ +static SLOT_INTERFACE_START(crvision_cart) + SLOT_INTERFACE_INTERNAL("crv_rom4k", CRVISION_ROM_4K) + SLOT_INTERFACE_INTERNAL("crv_rom6k", CRVISION_ROM_6K) + SLOT_INTERFACE_INTERNAL("crv_rom8k", CRVISION_ROM_8K) + SLOT_INTERFACE_INTERNAL("crv_rom10k", CRVISION_ROM_10K) + SLOT_INTERFACE_INTERNAL("crv_rom12k", CRVISION_ROM_12K) + SLOT_INTERFACE_INTERNAL("crv_rom16k", CRVISION_ROM_16K) + SLOT_INTERFACE_INTERNAL("crv_rom18k", CRVISION_ROM_18K) +SLOT_INTERFACE_END + /*------------------------------------------------- MACHINE_CONFIG_START( creativision, crvision_state ) -------------------------------------------------*/ @@ -872,11 +791,7 @@ static MACHINE_CONFIG_START( creativision, crvision_state ) MCFG_SOUND_ROUTE(1, "mono", 0.25) // cartridge - MCFG_CARTSLOT_ADD("cart") - MCFG_CARTSLOT_EXTENSION_LIST("bin,rom") - MCFG_CARTSLOT_MANDATORY - MCFG_CARTSLOT_INTERFACE("crvision_cart") - MCFG_CARTSLOT_LOAD(crvision_state, crvision_cart) + MCFG_CRVISION_CARTRIDGE_ADD("cartslot", crvision_cart, NULL) // internal ram MCFG_RAM_ADD(RAM_TAG) @@ -884,7 +799,7 @@ static MACHINE_CONFIG_START( creativision, crvision_state ) MCFG_RAM_EXTRA_OPTIONS("15K") // 16K expansion (lower 14K available only, upper 2K shared with BIOS ROM) // software lists - MCFG_SOFTWARE_LIST_ADD("cart_list","crvision") + MCFG_SOFTWARE_LIST_ADD("cart_list", "crvision") MACHINE_CONFIG_END /*------------------------------------------------- @@ -958,10 +873,7 @@ static MACHINE_CONFIG_START( lasr2001, laser2001_state ) MCFG_SOUND_ROUTE(1, "mono", 0.25) // cartridge - MCFG_CARTSLOT_ADD("cart") - MCFG_CARTSLOT_EXTENSION_LIST("bin,rom") - MCFG_CARTSLOT_INTERFACE("crvision_cart") - MCFG_CARTSLOT_LOAD(crvision_state, crvision_cart) + MCFG_CRVISION_CARTRIDGE_ADD("cartslot", crvision_cart, NULL) // internal ram MCFG_RAM_ADD(RAM_TAG) |