From bcc2c3c75301a90e3d1b3ae4067cbf344007805b Mon Sep 17 00:00:00 2001 From: mahlemiut Date: Sat, 16 Aug 2014 02:16:03 +0000 Subject: [PATCH] amstrad: removed ROMEN signal callback, it is actually an input to an expansion device. added the ability to map in Symbiface II rewriteable ROM for reading and writing. Still not usable as an alternate source of ROMs as yet. remembered to add RAM size options to the CPC+ --- src/emu/bus/cpc/cpc_rom.c | 1 - src/emu/bus/cpc/cpc_rs232.c | 1 - src/emu/bus/cpc/cpc_ssa1.c | 2 -- src/emu/bus/cpc/cpcexp.c | 5 +--- src/emu/bus/cpc/cpcexp.h | 15 +++++++----- src/emu/bus/cpc/mface2.c | 3 --- src/emu/bus/cpc/symbfac2.c | 47 ++++++++++++++++++++++++++++++++++--- src/emu/bus/cpc/symbfac2.h | 14 ++++++++++- src/mess/drivers/amstrad.c | 3 +-- src/mess/machine/amstrad.c | 26 +++++++++++++------- 10 files changed, 85 insertions(+), 32 deletions(-) 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(); }