diff options
Diffstat (limited to 'src/mame/drivers/specpls3.cpp')
-rw-r--r-- | src/mame/drivers/specpls3.cpp | 112 |
1 files changed, 54 insertions, 58 deletions
diff --git a/src/mame/drivers/specpls3.cpp b/src/mame/drivers/specpls3.cpp index b1d9e02dc66..9899808a865 100644 --- a/src/mame/drivers/specpls3.cpp +++ b/src/mame/drivers/specpls3.cpp @@ -147,8 +147,6 @@ http://www.z88forever.org.uk/zxplus3e/ *******************************************************************************/ #include "emu.h" -#include "includes/spectrum.h" -#include "includes/spec128.h" #include "includes/specpls3.h" #include "sound/ay8910.h" @@ -175,31 +173,31 @@ static const int spectrum_plus3_memory_selections[]= 4,7,6,3 }; -WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_3ffd_w ) +void specpls3_state::port_3ffd_w(uint8_t data) { - if (m_floppy==1) + if (m_upd765.found()) m_upd765->fifo_w(data); } -READ8_MEMBER( spectrum_state::spectrum_plus3_port_3ffd_r ) +uint8_t specpls3_state::port_3ffd_r() { - if (m_floppy==0) - return 0xff; - else + if (m_upd765.found()) return m_upd765->fifo_r(); + else + return 0xff; } -READ8_MEMBER( spectrum_state::spectrum_plus3_port_2ffd_r ) +uint8_t specpls3_state::port_2ffd_r() { - if (m_floppy==0) - return 0xff; - else + if (m_upd765.found()) return m_upd765->msr_r(); + else + return 0xff; } -void spectrum_state::spectrum_plus3_update_memory() +void specpls3_state::plus3_update_memory() { if (m_port_7ffd_data & 8) { @@ -249,7 +247,7 @@ void spectrum_state::spectrum_plus3_update_memory() } -WRITE8_MEMBER(spectrum_state::spectrum_plus3_bank1_w) +void specpls3_state::bank1_w(offs_t offset, uint8_t data) { if (m_exp->romcs()) { @@ -264,7 +262,7 @@ WRITE8_MEMBER(spectrum_state::spectrum_plus3_bank1_w) } } -READ8_MEMBER(spectrum_state::spectrum_plus3_bank1_r) +uint8_t specpls3_state::bank1_r(offs_t offset) { uint8_t data; @@ -293,7 +291,7 @@ READ8_MEMBER(spectrum_state::spectrum_plus3_bank1_r) return data; } -WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_7ffd_w ) +void specpls3_state::port_7ffd_w(uint8_t data) { /* D0-D2: RAM page located at 0x0c000-0x0ffff */ /* D3 - Screen select (screen 0 in ram page 5, screen 1 in ram page 7 */ @@ -308,19 +306,22 @@ WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_7ffd_w ) m_port_7ffd_data = data; /* update memory */ - spectrum_plus3_update_memory(); + plus3_update_memory(); } -WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_1ffd_w ) +void specpls3_state::port_1ffd_w(uint8_t data) { /* D0-D1: ROM/RAM paging */ /* D2: Affects if d0-d1 work on ram/rom */ /* D3 - Disk motor on/off */ /* D4 - parallel port strobe */ - for (auto &flop : m_flop) - if (flop->get_device()) - flop->get_device()->mon_w(!BIT(data, 3)); + if (m_upd765.found()) + { + for (auto &flop : m_flop) + if (flop->get_device()) + flop->get_device()->mon_w(!BIT(data, 3)); + } m_port_1ffd_data = data; @@ -328,33 +329,33 @@ WRITE8_MEMBER( spectrum_state::spectrum_plus3_port_1ffd_w ) if ((m_port_7ffd_data & 0x20)==0) { /* no */ - spectrum_plus3_update_memory(); + plus3_update_memory(); } } /* ports are not decoded full. The function decodes the ports appropriately */ -void spectrum_state::spectrum_plus3_io(address_map &map) +void specpls3_state::plus3_io(address_map &map) { map(0x0000, 0xffff).rw(m_exp, FUNC(spectrum_expansion_slot_device::iorq_r), FUNC(spectrum_expansion_slot_device::iorq_w)); - map(0x0000, 0x0000).rw(FUNC(spectrum_state::spectrum_port_fe_r), FUNC(spectrum_state::spectrum_port_fe_w)).select(0xfffe); - map(0x4000, 0x4000).w(FUNC(spectrum_state::spectrum_plus3_port_7ffd_w)).mirror(0x3ffd); + map(0x0000, 0x0000).rw(FUNC(specpls3_state::spectrum_port_fe_r), FUNC(specpls3_state::spectrum_port_fe_w)).select(0xfffe); + map(0x4000, 0x4000).w(FUNC(specpls3_state::port_7ffd_w)).mirror(0x3ffd); map(0x8000, 0x8000).w("ay8912", FUNC(ay8910_device::data_w)).mirror(0x3ffd); map(0xc000, 0xc000).rw("ay8912", FUNC(ay8910_device::data_r), FUNC(ay8910_device::address_w)).mirror(0x3ffd); - map(0x1000, 0x1000).w(FUNC(spectrum_state::spectrum_plus3_port_1ffd_w)).mirror(0x0ffd); - map(0x2000, 0x2000).r(FUNC(spectrum_state::spectrum_plus3_port_2ffd_r)).mirror(0x0ffd); - map(0x3000, 0x3000).rw(FUNC(spectrum_state::spectrum_plus3_port_3ffd_r), FUNC(spectrum_state::spectrum_plus3_port_3ffd_w)).mirror(0x0ffd); + map(0x1000, 0x1000).w(FUNC(specpls3_state::port_1ffd_w)).mirror(0x0ffd); + map(0x2000, 0x2000).r(FUNC(specpls3_state::port_2ffd_r)).mirror(0x0ffd); + map(0x3000, 0x3000).rw(FUNC(specpls3_state::port_3ffd_r), FUNC(specpls3_state::port_3ffd_w)).mirror(0x0ffd); } -void spectrum_state::spectrum_plus3_mem(address_map &map) +void specpls3_state::plus3_mem(address_map &map) { - map(0x0000, 0x3fff).rw(FUNC(spectrum_state::spectrum_plus3_bank1_r), FUNC(spectrum_state::spectrum_plus3_bank1_w)); //.bankr("bank1"); + map(0x0000, 0x3fff).rw(FUNC(specpls3_state::bank1_r), FUNC(specpls3_state::bank1_w)); //.bankr("bank1"); map(0x4000, 0x7fff).bankrw("bank2"); map(0x8000, 0xbfff).bankrw("bank3"); map(0xc000, 0xffff).bankrw("bank4"); } -MACHINE_RESET_MEMBER(spectrum_state,spectrum_plus3) +MACHINE_RESET_MEMBER(specpls3_state,spectrum_plus3) { uint8_t *messram = m_ram->pointer(); memset(messram,0,128*1024); @@ -364,20 +365,10 @@ MACHINE_RESET_MEMBER(spectrum_state,spectrum_plus3) /* Initial configuration */ m_port_7ffd_data = 0; m_port_1ffd_data = 0; - spectrum_plus3_update_memory(); -} - -void spectrum_state::init_plus3() -{ - m_floppy = 1; + plus3_update_memory(); } -void spectrum_state::init_plus2() -{ - m_floppy = 0; -} - -void spectrum_state::plus3_us_w(uint8_t data) +void specpls3_state::plus3_us_w(uint8_t data) { // US1 is not connected, so US0 alone selects either drive floppy_image_device *flop = m_flop[data & 1]->get_device(); @@ -410,27 +401,32 @@ static GFXDECODE_START( specpls3 ) GFXDECODE_END -void spectrum_state::spectrum_plus3(machine_config &config) +void specpls3_state::spectrum_plus2(machine_config &config) { spectrum_128(config); - m_maincpu->set_addrmap(AS_PROGRAM, &spectrum_state::spectrum_plus3_mem); - m_maincpu->set_addrmap(AS_IO, &spectrum_state::spectrum_plus3_io); + m_maincpu->set_addrmap(AS_PROGRAM, &specpls3_state::plus3_mem); + m_maincpu->set_addrmap(AS_IO, &specpls3_state::plus3_io); m_screen->set_refresh_hz(50.01); subdevice<gfxdecode_device>("gfxdecode")->set_info(specpls3); - MCFG_MACHINE_RESET_OVERRIDE(spectrum_state, spectrum_plus3 ) - - UPD765A(config, m_upd765, 16_MHz_XTAL / 4, true, true); // clocked through SED9420 - m_upd765->us_wr_callback().set(FUNC(spectrum_state::plus3_us_w)); - FLOPPY_CONNECTOR(config, "upd765:0", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats); // internal drive - FLOPPY_CONNECTOR(config, "upd765:1", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats); // external drive + MCFG_MACHINE_RESET_OVERRIDE(specpls3_state, spectrum_plus3 ) SPECTRUM_EXPANSION_SLOT(config.replace(), m_exp, specpls3_expansion_devices, nullptr); m_exp->irq_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0); m_exp->nmi_handler().set_inputline(m_maincpu, INPUT_LINE_NMI); +} + +void specpls3_state::spectrum_plus3(machine_config &config) +{ + spectrum_plus2(config); + + UPD765A(config, m_upd765, 16_MHz_XTAL / 4, true, false); // clocked through SED9420 + m_upd765->us_wr_callback().set(FUNC(specpls3_state::plus3_us_w)); + FLOPPY_CONNECTOR(config, "upd765:0", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats); // internal drive + FLOPPY_CONNECTOR(config, "upd765:1", specpls3_floppies, "3ssdd", floppy_image_device::default_floppy_formats); // external drive SOFTWARE_LIST(config, "flop_list").set_original("specpls3_flop"); } @@ -506,9 +502,9 @@ ROM_START(sp3eata) ROM_END /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -COMP( 1987, specpl2a, spec128, 0, spectrum_plus3, spec_plus, spectrum_state, init_plus2, "Amstrad plc", "ZX Spectrum +2a", 0 ) -COMP( 1987, specpls3, spec128, 0, spectrum_plus3, spec_plus, spectrum_state, init_plus3, "Amstrad plc", "ZX Spectrum +3", 0 ) -COMP( 2000, specpl3e, spec128, 0, spectrum_plus3, spec_plus, spectrum_state, init_plus3, "Amstrad plc", "ZX Spectrum +3e", MACHINE_UNOFFICIAL ) -COMP( 2002, sp3e8bit, spec128, 0, spectrum_plus3, spec_plus, spectrum_state, init_plus3, "Amstrad plc", "ZX Spectrum +3e 8bit IDE", MACHINE_UNOFFICIAL ) -COMP( 2002, sp3eata, spec128, 0, spectrum_plus3, spec_plus, spectrum_state, init_plus3, "Amstrad plc", "ZX Spectrum +3e 8bit ZXATASP" , MACHINE_UNOFFICIAL ) -COMP( 2002, sp3ezcf, spec128, 0, spectrum_plus3, spec_plus, spectrum_state, init_plus3, "Amstrad plc", "ZX Spectrum +3e 8bit ZXCF", MACHINE_UNOFFICIAL ) +COMP( 1987, specpl2a, spec128, 0, spectrum_plus2, spec_plus, specpls3_state, empty_init, "Amstrad plc", "ZX Spectrum +2a", 0 ) +COMP( 1987, specpls3, spec128, 0, spectrum_plus3, spec_plus, specpls3_state, empty_init, "Amstrad plc", "ZX Spectrum +3", 0 ) +COMP( 2000, specpl3e, spec128, 0, spectrum_plus3, spec_plus, specpls3_state, empty_init, "Amstrad plc", "ZX Spectrum +3e", MACHINE_UNOFFICIAL ) +COMP( 2002, sp3e8bit, spec128, 0, spectrum_plus3, spec_plus, specpls3_state, empty_init, "Amstrad plc", "ZX Spectrum +3e 8bit IDE", MACHINE_UNOFFICIAL ) +COMP( 2002, sp3eata, spec128, 0, spectrum_plus3, spec_plus, specpls3_state, empty_init, "Amstrad plc", "ZX Spectrum +3e 8bit ZXATASP" , MACHINE_UNOFFICIAL ) +COMP( 2002, sp3ezcf, spec128, 0, spectrum_plus3, spec_plus, specpls3_state, empty_init, "Amstrad plc", "ZX Spectrum +3e 8bit ZXCF", MACHINE_UNOFFICIAL ) |