From 872d736df041a16aa346907b7f5e9c33f9fab4ad Mon Sep 17 00:00:00 2001 From: mahlemiut Date: Sun, 6 Jul 2014 10:01:22 +0000 Subject: [PATCH] amstrad: Reworked the way ROMs are set up. Now ROMs are set on reset, all at once, and so any ROMs mounted on a ROM box won't interfere with ROM slot 7 (AMSDOS) or slot 3 on the Aleste (MSX-DOS). (no whatsnew) --- src/emu/bus/cpc/cpc_rom.c | 2 + src/emu/bus/cpc/cpc_rom.h | 4 +- src/mess/includes/amstrad.h | 1 + src/mess/machine/amstrad.c | 132 +++++++++++++++++------------------- 4 files changed, 68 insertions(+), 71 deletions(-) diff --git a/src/emu/bus/cpc/cpc_rom.c b/src/emu/bus/cpc/cpc_rom.c index ee75d04487b..f0344facc00 100644 --- a/src/emu/bus/cpc/cpc_rom.c +++ b/src/emu/bus/cpc/cpc_rom.c @@ -23,6 +23,8 @@ static MACHINE_CONFIG_FRAGMENT( cpc_rom ) MCFG_ROMSLOT_ADD("rom4") MCFG_ROMSLOT_ADD("rom5") MCFG_ROMSLOT_ADD("rom6") + MCFG_ROMSLOT_ADD("rom7") + MCFG_ROMSLOT_ADD("rom8") // pass-through MCFG_DEVICE_ADD("exp", CPC_EXPANSION_SLOT, 0) diff --git a/src/emu/bus/cpc/cpc_rom.h b/src/emu/bus/cpc/cpc_rom.h index c00f99f7f50..2f3866b2b11 100644 --- a/src/emu/bus/cpc/cpc_rom.h +++ b/src/emu/bus/cpc/cpc_rom.h @@ -68,7 +68,7 @@ public: // optional information overrides virtual machine_config_constructor device_mconfig_additions() const; - UINT8* base(UINT8 slot) { if(slot >=1 && slot <= 6) return m_rom[slot]->base(); else return NULL; } + UINT8* base(UINT8 slot) { if(slot >=1 && slot <= 8) return m_rom[slot]->base(); else return NULL; } protected: // device-level overrides @@ -78,7 +78,7 @@ protected: private: //cpc_expansion_slot_device *m_slot; - rom_image_device* m_rom[6]; + rom_image_device* m_rom[8]; }; // device type definition diff --git a/src/mess/includes/amstrad.h b/src/mess/includes/amstrad.h index ca53a4d7655..0417fae3731 100644 --- a/src/mess/includes/amstrad.h +++ b/src/mess/includes/amstrad.h @@ -310,6 +310,7 @@ protected: void kccomp_reset_machine(); void update_psg(); void amstrad_common_init(); + void enumerate_roms(); unsigned char kccomp_get_colour_element(int colour_value); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); diff --git a/src/mess/machine/amstrad.c b/src/mess/machine/amstrad.c index cb12927cba1..1dd6e20f5fa 100644 --- a/src/mess/machine/amstrad.c +++ b/src/mess/machine/amstrad.c @@ -2822,13 +2822,71 @@ static const UINT8 amstrad_cycle_table_ex[256]= 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0 }; +#define NEXT_ROM_SLOT m_rom_count++; \ + if(slot3 && m_rom_count == 3) m_rom_count++; \ + if(slot7 && m_rom_count == 7) m_rom_count++; + +void amstrad_state::enumerate_roms() +{ + UINT8 m_rom_count = 1; + device_t* romexp; + rom_image_device* romimage; + UINT8 *rom = m_region_maincpu->base(); + char str[20]; + int i; + bool slot3 = false,slot7 = false; + + if(m_system_type == SYSTEM_PLUS || m_system_type == SYSTEM_GX4000) + { + /* ROMs are stored on the inserted cartridge in the Plus/GX4000 */ + for(i=0; i<128; i++) // fill ROM table + m_Amstrad_ROM_Table[i] = &rom[0x4000]; + for(i=128;i<160;i++) + m_Amstrad_ROM_Table[i] = &rom[(i-128)*0x4000]; + m_Amstrad_ROM_Table[7] = &rom[0xc000]; + slot7 = true; + } + else + { + /* slot 0 is always BASIC, as is any unused slot */ + for(i=0; i<256; i++) + m_Amstrad_ROM_Table[i] = &rom[0x014000]; + /* AMSDOS ROM -- TODO: exclude from 464 unless a DDI-1 device is connected */ + m_Amstrad_ROM_Table[7] = &rom[0x018000]; + slot7 = true; + } + + /* MSX-DOS BIOS - Aleste MSX emulation */ + if(m_system_type == SYSTEM_ALESTE) + { + m_Amstrad_ROM_Table[3] = &rom[0x01c000]; + slot3 = true; + } + + /* enumerate expansion ROMs */ + // TODO: get ROMs from expansion devices (that aren't ROMboxes) + + /* add ROMs from ROMbox expansion */ + romexp = get_expansion_device(machine(),"rom"); + if(romexp) + { + for(i=0;i<8;i++) + { + sprintf(str,"rom%i",i+1); + romimage = romexp->subdevice(str); + if(romimage->base() != NULL) + { + m_Amstrad_ROM_Table[m_rom_count] = romimage->base(); + NEXT_ROM_SLOT + } + } + } + +} + void amstrad_state::amstrad_common_init() { address_space &space = m_maincpu->space(AS_PROGRAM); - device_t* romexp; - rom_image_device* romimage; - char str[20]; - int x; m_aleste_mode = 0; @@ -2862,20 +2920,7 @@ void amstrad_state::amstrad_common_init() space.install_write_bank(0xc000, 0xdfff, "bank15"); space.install_write_bank(0xe000, 0xffff, "bank16"); - /* Set up ROMs, if we have an expansion device connected */ - romexp = get_expansion_device(machine(),"rom"); - if(romexp) - { - for(x=0;x<6;x++) - { - sprintf(str,"rom%i",x+1); - romimage = romexp->subdevice(str); - if(romimage->base() != NULL) - { - m_Amstrad_ROM_Table[x+1] = romimage->base(); - } - } - } + enumerate_roms(); m_maincpu->reset(); if ( m_system_type == SYSTEM_CPC || m_system_type == SYSTEM_ALESTE ) @@ -2936,15 +2981,6 @@ MACHINE_START_MEMBER(amstrad_state,amstrad) MACHINE_RESET_MEMBER(amstrad_state,amstrad) { - int i; - UINT8 *rom = m_region_maincpu->base(); - - for (i=0; i<256; i++) - { - m_Amstrad_ROM_Table[i] = &rom[0x014000]; - } - - m_Amstrad_ROM_Table[7] = &rom[0x018000]; amstrad_common_init(); amstrad_reset_machine(); // amstrad_init_palette(machine()); @@ -2969,18 +3005,6 @@ MACHINE_START_MEMBER(amstrad_state,plus) MACHINE_RESET_MEMBER(amstrad_state,plus) { address_space &space = m_maincpu->space(AS_PROGRAM); - int i; - UINT8 *rom = m_region_maincpu->base(); - - for (i=0; i<128; i++) // fill ROM table - { - m_Amstrad_ROM_Table[i] = &rom[0x4000]; // BASIC in system cart - } - for(i=128;i<160;i++) - { - m_Amstrad_ROM_Table[i] = &rom[(i-128)*0x4000]; - } - m_Amstrad_ROM_Table[7] = &rom[0xc000]; // AMSDOS in system cart m_asic.enabled = 0; m_asic.seqptr = 0; @@ -3019,18 +3043,6 @@ MACHINE_START_MEMBER(amstrad_state,gx4000) MACHINE_RESET_MEMBER(amstrad_state,gx4000) { address_space &space = m_maincpu->space(AS_PROGRAM); - int i; - UINT8 *rom = m_region_maincpu->base(); - - for (i=0; i<128; i++) // fill ROM table - { - m_Amstrad_ROM_Table[i] = &rom[0x4000]; - } - for(i=128;i<160;i++) - { - m_Amstrad_ROM_Table[i] = &rom[(i-128)*0x4000]; - } - m_Amstrad_ROM_Table[7] = &rom[0xc000]; m_asic.enabled = 0; m_asic.seqptr = 0; @@ -3068,14 +3080,6 @@ MACHINE_START_MEMBER(amstrad_state,kccomp) MACHINE_RESET_MEMBER(amstrad_state,kccomp) { - int i; - UINT8 *rom = m_region_maincpu->base(); - - for (i=0; i<256; i++) - { - m_Amstrad_ROM_Table[i] = &rom[0x014000]; - } - amstrad_common_init(); kccomp_reset_machine(); @@ -3097,16 +3101,6 @@ MACHINE_START_MEMBER(amstrad_state,aleste) MACHINE_RESET_MEMBER(amstrad_state,aleste) { - int i; - UINT8 *rom = m_region_maincpu->base(); - - for (i=0; i<256; i++) - { - m_Amstrad_ROM_Table[i] = &rom[0x014000]; - } - - m_Amstrad_ROM_Table[3] = &rom[0x01c000]; // MSX-DOS / BIOS - m_Amstrad_ROM_Table[7] = &rom[0x018000]; // AMSDOS amstrad_common_init(); amstrad_reset_machine();