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:
parent
44f826976d
commit
bcc2c3c753
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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); }
|
||||
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user