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+
This commit is contained in:
mahlemiut 2014-08-16 02:16:03 +00:00
parent 44f826976d
commit bcc2c3c753
10 changed files with 85 additions and 32 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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); }

View File

@ -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<class _Object> static devcb_base &set_out_nmi_callback(device_t &device, _Object object) { return downcast<cpc_expansion_slot_device &>(device).m_out_nmi_cb.set_callback(object); }
template<class _Object> static devcb_base &set_out_reset_callback(device_t &device, _Object object) { return downcast<cpc_expansion_slot_device &>(device).m_out_reset_cb.set_callback(object); }
template<class _Object> static devcb_base &set_out_romdis_callback(device_t &device, _Object object) { return downcast<cpc_expansion_slot_device &>(device).m_out_romdis_cb.set_callback(object); }
template<class _Object> static devcb_base &set_out_romen_callback(device_t &device, _Object object) { return downcast<cpc_expansion_slot_device &>(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;
};

View File

@ -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();

View File

@ -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<cpc_symbiface2_device>;
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<cpc_expansion_slot_device *>(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);
}

View File

@ -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<ata_interface_device> m_ide;
required_device<ds12885_device> m_rtc;
required_device<nvram_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

View File

@ -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

View File

@ -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<device_cpc_expansion_card_interface*>(exp_port->get_card_device());
temp_dev = dynamic_cast<device_t*>(exp_port->get_card_device());
if(temp != NULL)
{
temp->set_rom_bank(data);
}
exp_port = temp_dev->subdevice<cpc_expansion_slot_device>("exp");
}
amstrad_setUpperRom();
}