diff --git a/src/emu/bus/cpc/cpc_rom.c b/src/emu/bus/cpc/cpc_rom.c index f0344facc00..f1b0ee3470a 100644 --- a/src/emu/bus/cpc/cpc_rom.c +++ b/src/emu/bus/cpc/cpc_rom.c @@ -32,7 +32,6 @@ static MACHINE_CONFIG_FRAGMENT( cpc_rom ) MCFG_CPC_EXPANSION_SLOT_OUT_IRQ_CB(DEVWRITELINE("^", cpc_expansion_slot_device, irq_w)) MCFG_CPC_EXPANSION_SLOT_OUT_NMI_CB(DEVWRITELINE("^", cpc_expansion_slot_device, nmi_w)) MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romdis_w)) // ROMDIS - MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romen_w)) // /ROMEN MACHINE_CONFIG_END diff --git a/src/emu/bus/cpc/cpc_rs232.c b/src/emu/bus/cpc/cpc_rs232.c index 6708852d29c..c82b770cb9c 100644 --- a/src/emu/bus/cpc/cpc_rs232.c +++ b/src/emu/bus/cpc/cpc_rs232.c @@ -41,7 +41,6 @@ static MACHINE_CONFIG_FRAGMENT( cpc_rs232 ) MCFG_CPC_EXPANSION_SLOT_OUT_IRQ_CB(DEVWRITELINE("^", cpc_expansion_slot_device, irq_w)) MCFG_CPC_EXPANSION_SLOT_OUT_NMI_CB(DEVWRITELINE("^", cpc_expansion_slot_device, nmi_w)) MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romdis_w)) // ROMDIS - MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romen_w)) // /ROMEN MACHINE_CONFIG_END diff --git a/src/emu/bus/cpc/cpc_ssa1.c b/src/emu/bus/cpc/cpc_ssa1.c index b74f8898ecb..ab8cf2a0092 100644 --- a/src/emu/bus/cpc/cpc_ssa1.c +++ b/src/emu/bus/cpc/cpc_ssa1.c @@ -123,7 +123,6 @@ static MACHINE_CONFIG_FRAGMENT( cpc_ssa1 ) MCFG_CPC_EXPANSION_SLOT_OUT_IRQ_CB(DEVWRITELINE("^", cpc_expansion_slot_device, irq_w)) MCFG_CPC_EXPANSION_SLOT_OUT_NMI_CB(DEVWRITELINE("^", cpc_expansion_slot_device, nmi_w)) MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romdis_w)) // ROMDIS - MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romen_w)) // /ROMEN MACHINE_CONFIG_END @@ -140,7 +139,6 @@ static MACHINE_CONFIG_FRAGMENT( cpc_dkspeech ) MCFG_CPC_EXPANSION_SLOT_OUT_IRQ_CB(DEVWRITELINE("^", cpc_expansion_slot_device, irq_w)) MCFG_CPC_EXPANSION_SLOT_OUT_NMI_CB(DEVWRITELINE("^", cpc_expansion_slot_device, nmi_w)) MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romdis_w)) // ROMDIS - MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romen_w)) // /ROMEN MACHINE_CONFIG_END diff --git a/src/emu/bus/cpc/cpcexp.c b/src/emu/bus/cpc/cpcexp.c index 0bd8aec034f..3afc3784aab 100644 --- a/src/emu/bus/cpc/cpcexp.c +++ b/src/emu/bus/cpc/cpcexp.c @@ -45,8 +45,7 @@ cpc_expansion_slot_device::cpc_expansion_slot_device(const machine_config &mconf m_out_irq_cb(*this), m_out_nmi_cb(*this), m_out_reset_cb(*this), - m_out_romdis_cb(*this), - m_out_romen_cb(*this) + m_out_romdis_cb(*this) { } @@ -67,7 +66,6 @@ void cpc_expansion_slot_device::device_start() m_out_nmi_cb.resolve_safe(); m_out_reset_cb.resolve_safe(); m_out_romdis_cb.resolve_safe(); - m_out_romen_cb.resolve_safe(); } @@ -84,4 +82,3 @@ WRITE_LINE_MEMBER( cpc_expansion_slot_device::irq_w ) { m_out_irq_cb(state); } WRITE_LINE_MEMBER( cpc_expansion_slot_device::nmi_w ) { m_out_nmi_cb(state); } WRITE_LINE_MEMBER( cpc_expansion_slot_device::reset_w ) { m_out_reset_cb(state); } WRITE_LINE_MEMBER( cpc_expansion_slot_device::romdis_w ) { m_out_romdis_cb(state); } -WRITE_LINE_MEMBER( cpc_expansion_slot_device::romen_w ) { m_out_romen_cb(state); } diff --git a/src/emu/bus/cpc/cpcexp.h b/src/emu/bus/cpc/cpcexp.h index 943396b1eef..f7ac370b86b 100644 --- a/src/emu/bus/cpc/cpcexp.h +++ b/src/emu/bus/cpc/cpcexp.h @@ -62,9 +62,6 @@ #define MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(_devcb) \ devcb = &cpc_expansion_slot_device::set_out_romdis_callback(*device, DEVCB_##_devcb); -#define MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(_devcb) \ - devcb = &cpc_expansion_slot_device::set_out_romen_callback(*device, DEVCB_##_devcb); - //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -81,6 +78,12 @@ public: // reset virtual void cpc_reset_w() { }; + + void set_rom_bank(UINT8 sel) { m_rom_sel = sel; } // tell device the currently selected ROM + UINT8 get_rom_bank() { return m_rom_sel; } + +private: + UINT8 m_rom_sel; // currently selected ROM }; @@ -98,13 +101,13 @@ public: template static devcb_base &set_out_nmi_callback(device_t &device, _Object object) { return downcast(device).m_out_nmi_cb.set_callback(object); } template static devcb_base &set_out_reset_callback(device_t &device, _Object object) { return downcast(device).m_out_reset_cb.set_callback(object); } template static devcb_base &set_out_romdis_callback(device_t &device, _Object object) { return downcast(device).m_out_romdis_cb.set_callback(object); } - template static devcb_base &set_out_romen_callback(device_t &device, _Object object) { return downcast(device).m_out_romen_cb.set_callback(object); } DECLARE_WRITE_LINE_MEMBER( irq_w ); DECLARE_WRITE_LINE_MEMBER( nmi_w ); DECLARE_WRITE_LINE_MEMBER( reset_w ); DECLARE_WRITE_LINE_MEMBER( romdis_w ); - DECLARE_WRITE_LINE_MEMBER( romen_w ); + + void set_rom_bank(UINT8 sel) { if(m_card) m_card->set_rom_bank(sel); } // tell device the currently selected ROM protected: // device-level overrides @@ -115,9 +118,9 @@ protected: devcb_write_line m_out_nmi_cb; devcb_write_line m_out_reset_cb; devcb_write_line m_out_romdis_cb; - devcb_write_line m_out_romen_cb; device_cpc_expansion_card_interface *m_card; + }; diff --git a/src/emu/bus/cpc/mface2.c b/src/emu/bus/cpc/mface2.c index 2ff214ff0e4..48232fd5830 100644 --- a/src/emu/bus/cpc/mface2.c +++ b/src/emu/bus/cpc/mface2.c @@ -22,7 +22,6 @@ static MACHINE_CONFIG_FRAGMENT( cpc_mface2 ) MCFG_CPC_EXPANSION_SLOT_OUT_IRQ_CB(DEVWRITELINE("^", cpc_expansion_slot_device, irq_w)) MCFG_CPC_EXPANSION_SLOT_OUT_NMI_CB(DEVWRITELINE("^", cpc_expansion_slot_device, nmi_w)) MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romdis_w)) // ROMDIS - MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romen_w)) // /ROMEN MACHINE_CONFIG_END DIRECT_UPDATE_MEMBER( cpc_multiface2_device::amstrad_default ) @@ -63,7 +62,6 @@ DIRECT_UPDATE_MEMBER( cpc_multiface2_device::amstrad_multiface_directoverride ) m_multiface_flags &= ~(MULTIFACE_VISIBLE|MULTIFACE_STOP_BUTTON_PRESSED); m_romdis=0; - m_slot->romen_w(0); /* clear op base override */ machine().device("maincpu")->memory().space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(cpc_multiface2_device::amstrad_default),this)); @@ -149,7 +147,6 @@ void cpc_multiface2_device::multiface_stop() m_multiface_flags |= MULTIFACE_STOP_BUTTON_PRESSED; m_romdis = 1; - m_slot->romen_w(1); /* page rom into memory */ multiface_rethink_memory(); diff --git a/src/emu/bus/cpc/symbfac2.c b/src/emu/bus/cpc/symbfac2.c index 1e56a7fa5f3..87df7e214d2 100644 --- a/src/emu/bus/cpc/symbfac2.c +++ b/src/emu/bus/cpc/symbfac2.c @@ -10,7 +10,7 @@ * Created on: 2/08/2014 * * TODO: - * - expansion RAM + * - expansion RAM (for now handled by -ramsize) * - rewritable ROM * - mouse controls still need some work */ @@ -28,6 +28,7 @@ const device_type CPC_SYMBIFACE2 = &device_creator; static MACHINE_CONFIG_FRAGMENT( cpc_symbiface2 ) MCFG_ATA_INTERFACE_ADD("ide",ata_devices,"hdd",NULL,false) MCFG_DS12885_ADD("rtc") + MCFG_NVRAM_ADD_1FILL("nvram") // no pass-through MACHINE_CONFIG_END @@ -73,6 +74,7 @@ cpc_symbiface2_device::cpc_symbiface2_device(const machine_config &mconfig, cons device_cpc_expansion_card_interface(mconfig, *this), m_ide(*this,"ide"), m_rtc(*this,"rtc"), + m_nvram(*this,"nvram"), m_mouse_x(*this,"sf2_mouse_x"), m_mouse_y(*this,"sf2_mouse_y"), m_mouse_buttons(*this,"sf2_mouse_buttons") @@ -88,10 +90,21 @@ void cpc_symbiface2_device::device_start() device_t* cpu = machine().device("maincpu"); address_space& space = cpu->memory().space(AS_IO); + m_slot = dynamic_cast(owner()); + space.install_readwrite_handler(0xfd00,0xfd07,0,0,read8_delegate(FUNC(cpc_symbiface2_device::ide_cs1_r),this),write8_delegate(FUNC(cpc_symbiface2_device::ide_cs1_w),this)); space.install_readwrite_handler(0xfd08,0xfd0f,0,0,read8_delegate(FUNC(cpc_symbiface2_device::ide_cs0_r),this),write8_delegate(FUNC(cpc_symbiface2_device::ide_cs0_w),this)); space.install_read_handler(0xfd10,0xfd10,0,0,read8_delegate(FUNC(cpc_symbiface2_device::mouse_r),this)); space.install_readwrite_handler(0xfd14,0xfd15,0,0,read8_delegate(FUNC(cpc_symbiface2_device::rtc_r),this),write8_delegate(FUNC(cpc_symbiface2_device::rtc_w),this)); + space.install_readwrite_handler(0xfd17,0xfd17,0,0,read8_delegate(FUNC(cpc_symbiface2_device::rom_rewrite_r),this),write8_delegate(FUNC(cpc_symbiface2_device::rom_rewrite_w),this)); + + // set up ROM space (these can be writable, when mapped to &4000, or completely disabled, allowing the built-in ROMs to be visible) + // 32 banks of 16kB (512kB) + m_rom_space.resize(32*16384); + + m_nvram->set_base(m_rom_space,m_rom_space.bytes()); + save_item(NAME(m_rom_space)); + } //------------------------------------------------- @@ -107,8 +120,8 @@ void cpc_symbiface2_device::device_reset() } // IDE controller (custom) -// #FD00 - CS1 -// #FD08 - CS0 +// #FD00-07 - CS1 +// #FD08-0F - CS0 READ8_MEMBER(cpc_symbiface2_device::ide_cs0_r) { // data is returned in words, so it must be buffered @@ -250,3 +263,31 @@ INPUT_CHANGED_MEMBER(cpc_symbiface2_device::mouse_change_buttons) m_mouse_state = PS2_MOUSE_BUTTONS; } +// #FD17 (read) - map currently selected ROM to 0x4000 for read/write +READ8_MEMBER(cpc_symbiface2_device::rom_rewrite_r) +{ + UINT8 bank = get_rom_bank(); + + if(bank >= 32) + return 0xff; + + m_4xxx_ptr_r = (UINT8*)machine().root_device().membank("bank3")->base(); + m_4xxx_ptr_w = (UINT8*)machine().root_device().membank("bank11")->base(); + m_6xxx_ptr_r = (UINT8*)machine().root_device().membank("bank4")->base(); + m_6xxx_ptr_w = (UINT8*)machine().root_device().membank("bank12")->base(); + machine().root_device().membank("bank3")->set_base((UINT8*)m_rom_space+(bank*16384)); + machine().root_device().membank("bank4")->set_base((UINT8*)m_rom_space+(bank*16384+8192)); + machine().root_device().membank("bank11")->set_base((UINT8*)m_rom_space+(bank*16384)); + machine().root_device().membank("bank12")->set_base((UINT8*)m_rom_space+(bank*16384+8192)); + + return 0xff; +} + +// #FD17 (write) - unmap selected ROM at 0x4000 +WRITE8_MEMBER(cpc_symbiface2_device::rom_rewrite_w) +{ + machine().root_device().membank("bank3")->set_base(m_4xxx_ptr_r); + machine().root_device().membank("bank4")->set_base(m_6xxx_ptr_r); + machine().root_device().membank("bank11")->set_base(m_4xxx_ptr_w); + machine().root_device().membank("bank12")->set_base(m_4xxx_ptr_w); +} diff --git a/src/emu/bus/cpc/symbfac2.h b/src/emu/bus/cpc/symbfac2.h index db9b5c270b7..58a97ae12ad 100644 --- a/src/emu/bus/cpc/symbfac2.h +++ b/src/emu/bus/cpc/symbfac2.h @@ -10,6 +10,7 @@ #include "emu.h" #include "machine/ataintf.h" #include "machine/ds128x.h" +#include "machine/nvram.h" #include "cpcexp.h" class cpc_symbiface2_device : public device_t, @@ -30,6 +31,8 @@ public: DECLARE_READ8_MEMBER(rtc_r); DECLARE_WRITE8_MEMBER(rtc_w); DECLARE_READ8_MEMBER(mouse_r); + DECLARE_READ8_MEMBER(rom_rewrite_r); + DECLARE_WRITE8_MEMBER(rom_rewrite_w); DECLARE_INPUT_CHANGED_MEMBER(mouse_change_x); DECLARE_INPUT_CHANGED_MEMBER(mouse_change_y); DECLARE_INPUT_CHANGED_MEMBER(mouse_change_buttons); @@ -48,20 +51,29 @@ protected: virtual void device_reset(); private: - //cpc_expansion_slot_device *m_slot; + cpc_expansion_slot_device *m_slot; required_device m_ide; required_device m_rtc; + required_device m_nvram; required_ioport m_mouse_x; required_ioport m_mouse_y; required_ioport m_mouse_buttons; + dynamic_buffer m_rom_space; + bool m_iohigh; UINT16 m_ide_data; UINT8 m_mouse_state; UINT8 m_input_x; UINT8 m_input_y; + + // stores backup pointers so that mapping can be restored + UINT8* m_4xxx_ptr_r; + UINT8* m_4xxx_ptr_w; + UINT8* m_6xxx_ptr_r; + UINT8* m_6xxx_ptr_w; }; // device type definition diff --git a/src/mess/drivers/amstrad.c b/src/mess/drivers/amstrad.c index edc221a1b25..ab94f5e97ba 100644 --- a/src/mess/drivers/amstrad.c +++ b/src/mess/drivers/amstrad.c @@ -893,7 +893,6 @@ static MACHINE_CONFIG_START( amstrad_nofdc, amstrad_state ) MCFG_CPC_EXPANSION_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0)) MCFG_CPC_EXPANSION_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI)) MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(WRITELINE(amstrad_state, cpc_romdis)) // ROMDIS - MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(WRITELINE(amstrad_state, cpc_romen)) // /ROMEN /* internal ram */ MCFG_RAM_ADD(RAM_TAG) @@ -994,11 +993,11 @@ static MACHINE_CONFIG_START( cpcplus, amstrad_state ) MCFG_CPC_EXPANSION_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0)) MCFG_CPC_EXPANSION_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI)) MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(WRITELINE(amstrad_state, cpc_romdis)) // ROMDIS - MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(WRITELINE(amstrad_state, cpc_romen)) // /ROMEN /* internal ram */ MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("128K") + MCFG_RAM_EXTRA_OPTIONS("64K,320K,576K") MACHINE_CONFIG_END diff --git a/src/mess/machine/amstrad.c b/src/mess/machine/amstrad.c index 69fb4a30084..0d3a6d7da8c 100644 --- a/src/mess/machine/amstrad.c +++ b/src/mess/machine/amstrad.c @@ -1111,15 +1111,6 @@ WRITE_LINE_MEMBER(amstrad_state::cpc_romdis) amstrad_rethinkMemory(); } -WRITE_LINE_MEMBER(amstrad_state::cpc_romen) -{ - if(state != 0) - m_gate_array.mrer &= ~0x04; - else - m_gate_array.mrer |= 0x04; - amstrad_rethinkMemory(); -} - /*-------------------------- - Ram and Rom management - @@ -2027,6 +2018,23 @@ WRITE8_MEMBER(amstrad_state::amstrad_cpc_io_w) if ((offset & (1<<13)) == 0) { m_gate_array.upper_bank = data; + // expansion devices know the selected ROM by monitoring I/O writes to DFxx + // there are no signals related to which ROM is selected + cpc_expansion_slot_device* exp_port = m_exp; + while(exp_port != NULL) + { + device_cpc_expansion_card_interface* temp; + device_t* temp_dev; + + temp = dynamic_cast(exp_port->get_card_device()); + temp_dev = dynamic_cast(exp_port->get_card_device()); + if(temp != NULL) + { + temp->set_rom_bank(data); + } + exp_port = temp_dev->subdevice("exp"); + } + amstrad_setUpperRom(); }