trunk/src/emu/bus/cpc/symbfac2.h
| r31665 | r31666 | |
| 10 | 10 | #include "emu.h" |
| 11 | 11 | #include "machine/ataintf.h" |
| 12 | 12 | #include "machine/ds128x.h" |
| 13 | #include "machine/nvram.h" |
| 13 | 14 | #include "cpcexp.h" |
| 14 | 15 | |
| 15 | 16 | class cpc_symbiface2_device : public device_t, |
| r31665 | r31666 | |
| 30 | 31 | DECLARE_READ8_MEMBER(rtc_r); |
| 31 | 32 | DECLARE_WRITE8_MEMBER(rtc_w); |
| 32 | 33 | DECLARE_READ8_MEMBER(mouse_r); |
| 34 | DECLARE_READ8_MEMBER(rom_rewrite_r); |
| 35 | DECLARE_WRITE8_MEMBER(rom_rewrite_w); |
| 33 | 36 | DECLARE_INPUT_CHANGED_MEMBER(mouse_change_x); |
| 34 | 37 | DECLARE_INPUT_CHANGED_MEMBER(mouse_change_y); |
| 35 | 38 | DECLARE_INPUT_CHANGED_MEMBER(mouse_change_buttons); |
| r31665 | r31666 | |
| 48 | 51 | virtual void device_reset(); |
| 49 | 52 | |
| 50 | 53 | private: |
| 51 | | //cpc_expansion_slot_device *m_slot; |
| 54 | cpc_expansion_slot_device *m_slot; |
| 52 | 55 | required_device<ata_interface_device> m_ide; |
| 53 | 56 | required_device<ds12885_device> m_rtc; |
| 57 | required_device<nvram_device> m_nvram; |
| 54 | 58 | |
| 55 | 59 | required_ioport m_mouse_x; |
| 56 | 60 | required_ioport m_mouse_y; |
| 57 | 61 | required_ioport m_mouse_buttons; |
| 58 | 62 | |
| 63 | dynamic_buffer m_rom_space; |
| 64 | |
| 59 | 65 | bool m_iohigh; |
| 60 | 66 | UINT16 m_ide_data; |
| 61 | 67 | |
| 62 | 68 | UINT8 m_mouse_state; |
| 63 | 69 | UINT8 m_input_x; |
| 64 | 70 | UINT8 m_input_y; |
| 71 | |
| 72 | // stores backup pointers so that mapping can be restored |
| 73 | UINT8* m_4xxx_ptr_r; |
| 74 | UINT8* m_4xxx_ptr_w; |
| 75 | UINT8* m_6xxx_ptr_r; |
| 76 | UINT8* m_6xxx_ptr_w; |
| 65 | 77 | }; |
| 66 | 78 | |
| 67 | 79 | // device type definition |
trunk/src/emu/bus/cpc/cpc_ssa1.c
| r31665 | r31666 | |
| 123 | 123 | MCFG_CPC_EXPANSION_SLOT_OUT_IRQ_CB(DEVWRITELINE("^", cpc_expansion_slot_device, irq_w)) |
| 124 | 124 | MCFG_CPC_EXPANSION_SLOT_OUT_NMI_CB(DEVWRITELINE("^", cpc_expansion_slot_device, nmi_w)) |
| 125 | 125 | MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romdis_w)) // ROMDIS |
| 126 | | MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romen_w)) // /ROMEN |
| 127 | 126 | |
| 128 | 127 | MACHINE_CONFIG_END |
| 129 | 128 | |
| r31665 | r31666 | |
| 140 | 139 | MCFG_CPC_EXPANSION_SLOT_OUT_IRQ_CB(DEVWRITELINE("^", cpc_expansion_slot_device, irq_w)) |
| 141 | 140 | MCFG_CPC_EXPANSION_SLOT_OUT_NMI_CB(DEVWRITELINE("^", cpc_expansion_slot_device, nmi_w)) |
| 142 | 141 | MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romdis_w)) // ROMDIS |
| 143 | | MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romen_w)) // /ROMEN |
| 144 | 142 | |
| 145 | 143 | MACHINE_CONFIG_END |
| 146 | 144 | |
trunk/src/emu/bus/cpc/mface2.c
| r31665 | r31666 | |
| 22 | 22 | MCFG_CPC_EXPANSION_SLOT_OUT_IRQ_CB(DEVWRITELINE("^", cpc_expansion_slot_device, irq_w)) |
| 23 | 23 | MCFG_CPC_EXPANSION_SLOT_OUT_NMI_CB(DEVWRITELINE("^", cpc_expansion_slot_device, nmi_w)) |
| 24 | 24 | MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romdis_w)) // ROMDIS |
| 25 | | MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(DEVWRITELINE("^", cpc_expansion_slot_device, romen_w)) // /ROMEN |
| 26 | 25 | MACHINE_CONFIG_END |
| 27 | 26 | |
| 28 | 27 | DIRECT_UPDATE_MEMBER( cpc_multiface2_device::amstrad_default ) |
| r31665 | r31666 | |
| 63 | 62 | m_multiface_flags &= ~(MULTIFACE_VISIBLE|MULTIFACE_STOP_BUTTON_PRESSED); |
| 64 | 63 | |
| 65 | 64 | m_romdis=0; |
| 66 | | m_slot->romen_w(0); |
| 67 | 65 | |
| 68 | 66 | /* clear op base override */ |
| 69 | 67 | machine().device("maincpu")->memory().space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(cpc_multiface2_device::amstrad_default),this)); |
| r31665 | r31666 | |
| 149 | 147 | m_multiface_flags |= MULTIFACE_STOP_BUTTON_PRESSED; |
| 150 | 148 | |
| 151 | 149 | m_romdis = 1; |
| 152 | | m_slot->romen_w(1); |
| 153 | 150 | |
| 154 | 151 | /* page rom into memory */ |
| 155 | 152 | multiface_rethink_memory(); |
trunk/src/emu/bus/cpc/symbfac2.c
| r31665 | r31666 | |
| 10 | 10 | * Created on: 2/08/2014 |
| 11 | 11 | * |
| 12 | 12 | * TODO: |
| 13 | | * - expansion RAM |
| 13 | * - expansion RAM (for now handled by -ramsize) |
| 14 | 14 | * - rewritable ROM |
| 15 | 15 | * - mouse controls still need some work |
| 16 | 16 | */ |
| r31665 | r31666 | |
| 28 | 28 | static MACHINE_CONFIG_FRAGMENT( cpc_symbiface2 ) |
| 29 | 29 | MCFG_ATA_INTERFACE_ADD("ide",ata_devices,"hdd",NULL,false) |
| 30 | 30 | MCFG_DS12885_ADD("rtc") |
| 31 | MCFG_NVRAM_ADD_1FILL("nvram") |
| 31 | 32 | // no pass-through |
| 32 | 33 | MACHINE_CONFIG_END |
| 33 | 34 | |
| r31665 | r31666 | |
| 73 | 74 | device_cpc_expansion_card_interface(mconfig, *this), |
| 74 | 75 | m_ide(*this,"ide"), |
| 75 | 76 | m_rtc(*this,"rtc"), |
| 77 | m_nvram(*this,"nvram"), |
| 76 | 78 | m_mouse_x(*this,"sf2_mouse_x"), |
| 77 | 79 | m_mouse_y(*this,"sf2_mouse_y"), |
| 78 | 80 | m_mouse_buttons(*this,"sf2_mouse_buttons") |
| r31665 | r31666 | |
| 88 | 90 | device_t* cpu = machine().device("maincpu"); |
| 89 | 91 | address_space& space = cpu->memory().space(AS_IO); |
| 90 | 92 | |
| 93 | m_slot = dynamic_cast<cpc_expansion_slot_device *>(owner()); |
| 94 | |
| 91 | 95 | 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)); |
| 92 | 96 | 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)); |
| 93 | 97 | space.install_read_handler(0xfd10,0xfd10,0,0,read8_delegate(FUNC(cpc_symbiface2_device::mouse_r),this)); |
| 94 | 98 | 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)); |
| 99 | 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)); |
| 100 | |
| 101 | // set up ROM space (these can be writable, when mapped to &4000, or completely disabled, allowing the built-in ROMs to be visible) |
| 102 | // 32 banks of 16kB (512kB) |
| 103 | m_rom_space.resize(32*16384); |
| 104 | |
| 105 | m_nvram->set_base(m_rom_space,m_rom_space.bytes()); |
| 106 | save_item(NAME(m_rom_space)); |
| 107 | |
| 95 | 108 | } |
| 96 | 109 | |
| 97 | 110 | //------------------------------------------------- |
| r31665 | r31666 | |
| 107 | 120 | } |
| 108 | 121 | |
| 109 | 122 | // IDE controller (custom) |
| 110 | | // #FD00 - CS1 |
| 111 | | // #FD08 - CS0 |
| 123 | // #FD00-07 - CS1 |
| 124 | // #FD08-0F - CS0 |
| 112 | 125 | READ8_MEMBER(cpc_symbiface2_device::ide_cs0_r) |
| 113 | 126 | { |
| 114 | 127 | // data is returned in words, so it must be buffered |
| r31665 | r31666 | |
| 250 | 263 | m_mouse_state = PS2_MOUSE_BUTTONS; |
| 251 | 264 | } |
| 252 | 265 | |
| 266 | // #FD17 (read) - map currently selected ROM to 0x4000 for read/write |
| 267 | READ8_MEMBER(cpc_symbiface2_device::rom_rewrite_r) |
| 268 | { |
| 269 | UINT8 bank = get_rom_bank(); |
| 270 | |
| 271 | if(bank >= 32) |
| 272 | return 0xff; |
| 273 | |
| 274 | m_4xxx_ptr_r = (UINT8*)machine().root_device().membank("bank3")->base(); |
| 275 | m_4xxx_ptr_w = (UINT8*)machine().root_device().membank("bank11")->base(); |
| 276 | m_6xxx_ptr_r = (UINT8*)machine().root_device().membank("bank4")->base(); |
| 277 | m_6xxx_ptr_w = (UINT8*)machine().root_device().membank("bank12")->base(); |
| 278 | machine().root_device().membank("bank3")->set_base((UINT8*)m_rom_space+(bank*16384)); |
| 279 | machine().root_device().membank("bank4")->set_base((UINT8*)m_rom_space+(bank*16384+8192)); |
| 280 | machine().root_device().membank("bank11")->set_base((UINT8*)m_rom_space+(bank*16384)); |
| 281 | machine().root_device().membank("bank12")->set_base((UINT8*)m_rom_space+(bank*16384+8192)); |
| 282 | |
| 283 | return 0xff; |
| 284 | } |
| 285 | |
| 286 | // #FD17 (write) - unmap selected ROM at 0x4000 |
| 287 | WRITE8_MEMBER(cpc_symbiface2_device::rom_rewrite_w) |
| 288 | { |
| 289 | machine().root_device().membank("bank3")->set_base(m_4xxx_ptr_r); |
| 290 | machine().root_device().membank("bank4")->set_base(m_6xxx_ptr_r); |
| 291 | machine().root_device().membank("bank11")->set_base(m_4xxx_ptr_w); |
| 292 | machine().root_device().membank("bank12")->set_base(m_4xxx_ptr_w); |
| 293 | } |
trunk/src/emu/bus/cpc/cpcexp.h
| r31665 | r31666 | |
| 62 | 62 | #define MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(_devcb) \ |
| 63 | 63 | devcb = &cpc_expansion_slot_device::set_out_romdis_callback(*device, DEVCB_##_devcb); |
| 64 | 64 | |
| 65 | | #define MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(_devcb) \ |
| 66 | | devcb = &cpc_expansion_slot_device::set_out_romen_callback(*device, DEVCB_##_devcb); |
| 67 | | |
| 68 | 65 | //************************************************************************** |
| 69 | 66 | // TYPE DEFINITIONS |
| 70 | 67 | //************************************************************************** |
| r31665 | r31666 | |
| 81 | 78 | |
| 82 | 79 | // reset |
| 83 | 80 | virtual void cpc_reset_w() { }; |
| 81 | |
| 82 | void set_rom_bank(UINT8 sel) { m_rom_sel = sel; } // tell device the currently selected ROM |
| 83 | UINT8 get_rom_bank() { return m_rom_sel; } |
| 84 | |
| 85 | private: |
| 86 | UINT8 m_rom_sel; // currently selected ROM |
| 84 | 87 | }; |
| 85 | 88 | |
| 86 | 89 | |
| r31665 | r31666 | |
| 98 | 101 | 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); } |
| 99 | 102 | 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); } |
| 100 | 103 | 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); } |
| 101 | | 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); } |
| 102 | 104 | |
| 103 | 105 | DECLARE_WRITE_LINE_MEMBER( irq_w ); |
| 104 | 106 | DECLARE_WRITE_LINE_MEMBER( nmi_w ); |
| 105 | 107 | DECLARE_WRITE_LINE_MEMBER( reset_w ); |
| 106 | 108 | DECLARE_WRITE_LINE_MEMBER( romdis_w ); |
| 107 | | DECLARE_WRITE_LINE_MEMBER( romen_w ); |
| 108 | 109 | |
| 110 | void set_rom_bank(UINT8 sel) { if(m_card) m_card->set_rom_bank(sel); } // tell device the currently selected ROM |
| 111 | |
| 109 | 112 | protected: |
| 110 | 113 | // device-level overrides |
| 111 | 114 | virtual void device_start(); |
| r31665 | r31666 | |
| 115 | 118 | devcb_write_line m_out_nmi_cb; |
| 116 | 119 | devcb_write_line m_out_reset_cb; |
| 117 | 120 | devcb_write_line m_out_romdis_cb; |
| 118 | | devcb_write_line m_out_romen_cb; |
| 119 | 121 | |
| 120 | 122 | device_cpc_expansion_card_interface *m_card; |
| 123 | |
| 121 | 124 | }; |
| 122 | 125 | |
| 123 | 126 | |
trunk/src/mess/drivers/amstrad.c
| r31665 | r31666 | |
| 893 | 893 | MCFG_CPC_EXPANSION_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0)) |
| 894 | 894 | MCFG_CPC_EXPANSION_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI)) |
| 895 | 895 | MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(WRITELINE(amstrad_state, cpc_romdis)) // ROMDIS |
| 896 | | MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(WRITELINE(amstrad_state, cpc_romen)) // /ROMEN |
| 897 | 896 | |
| 898 | 897 | /* internal ram */ |
| 899 | 898 | MCFG_RAM_ADD(RAM_TAG) |
| r31665 | r31666 | |
| 994 | 993 | MCFG_CPC_EXPANSION_SLOT_OUT_IRQ_CB(INPUTLINE("maincpu", 0)) |
| 995 | 994 | MCFG_CPC_EXPANSION_SLOT_OUT_NMI_CB(INPUTLINE("maincpu", INPUT_LINE_NMI)) |
| 996 | 995 | MCFG_CPC_EXPANSION_SLOT_OUT_ROMDIS_CB(WRITELINE(amstrad_state, cpc_romdis)) // ROMDIS |
| 997 | | MCFG_CPC_EXPANSION_SLOT_OUT_ROMEN_CB(WRITELINE(amstrad_state, cpc_romen)) // /ROMEN |
| 998 | 996 | |
| 999 | 997 | /* internal ram */ |
| 1000 | 998 | MCFG_RAM_ADD(RAM_TAG) |
| 1001 | 999 | MCFG_RAM_DEFAULT_SIZE("128K") |
| 1000 | MCFG_RAM_EXTRA_OPTIONS("64K,320K,576K") |
| 1002 | 1001 | MACHINE_CONFIG_END |
| 1003 | 1002 | |
| 1004 | 1003 | |
trunk/src/mess/machine/amstrad.c
| r31665 | r31666 | |
| 1111 | 1111 | amstrad_rethinkMemory(); |
| 1112 | 1112 | } |
| 1113 | 1113 | |
| 1114 | | WRITE_LINE_MEMBER(amstrad_state::cpc_romen) |
| 1115 | | { |
| 1116 | | if(state != 0) |
| 1117 | | m_gate_array.mrer &= ~0x04; |
| 1118 | | else |
| 1119 | | m_gate_array.mrer |= 0x04; |
| 1120 | | amstrad_rethinkMemory(); |
| 1121 | | } |
| 1122 | 1114 | |
| 1123 | | |
| 1124 | 1115 | /*-------------------------- |
| 1125 | 1116 | - Ram and Rom management - |
| 1126 | 1117 | --------------------------*/ |
| r31665 | r31666 | |
| 2027 | 2018 | if ((offset & (1<<13)) == 0) |
| 2028 | 2019 | { |
| 2029 | 2020 | m_gate_array.upper_bank = data; |
| 2021 | // expansion devices know the selected ROM by monitoring I/O writes to DFxx |
| 2022 | // there are no signals related to which ROM is selected |
| 2023 | cpc_expansion_slot_device* exp_port = m_exp; |
| 2024 | while(exp_port != NULL) |
| 2025 | { |
| 2026 | device_cpc_expansion_card_interface* temp; |
| 2027 | device_t* temp_dev; |
| 2028 | |
| 2029 | temp = dynamic_cast<device_cpc_expansion_card_interface*>(exp_port->get_card_device()); |
| 2030 | temp_dev = dynamic_cast<device_t*>(exp_port->get_card_device()); |
| 2031 | if(temp != NULL) |
| 2032 | { |
| 2033 | temp->set_rom_bank(data); |
| 2034 | } |
| 2035 | exp_port = temp_dev->subdevice<cpc_expansion_slot_device>("exp"); |
| 2036 | } |
| 2037 | |
| 2030 | 2038 | amstrad_setUpperRom(); |
| 2031 | 2039 | } |
| 2032 | 2040 | |