diff --git a/src/mame/drivers/elwro800.cpp b/src/mame/drivers/elwro800.cpp index af01d287ad2..2029f99e877 100644 --- a/src/mame/drivers/elwro800.cpp +++ b/src/mame/drivers/elwro800.cpp @@ -27,6 +27,7 @@ /* Devices */ #include "imagedev/cassette.h" +#include "imagedev/floppy.h" #include "formats/tzx_cas.h" #include "machine/bankdev.h" @@ -42,6 +43,8 @@ public: m_i8251(*this, "i8251"), m_i8255(*this, "ppi8255"), m_centronics(*this, "centronics"), + m_upd765(*this, "upd765"), + m_flop(*this, "upd765:%u", 0U), m_bank1(*this, "bank1"), m_bank2(*this, "bank2"), m_io_ports(*this, {"LINE7", "LINE6", "LINE5", "LINE4", "LINE3", "LINE2", "LINE1", "LINE0", "LINE8"}), @@ -79,6 +82,8 @@ private: required_device m_i8251; required_device m_i8255; required_device m_centronics; + required_device m_upd765; + required_device_array m_flop; required_device m_bank1; required_device m_bank2; required_ioport_array<9> m_io_ports; 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(); -} - - -READ8_MEMBER( spectrum_state::spectrum_plus3_port_2ffd_r ) -{ - if (m_floppy==0) - return 0xff; else - return m_upd765->msr_r(); + return 0xff; } -void spectrum_state::spectrum_plus3_update_memory() +uint8_t specpls3_state::port_2ffd_r() +{ + if (m_upd765.found()) + return m_upd765->msr_r(); + else + return 0xff; +} + + +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(); + plus3_update_memory(); } -void spectrum_state::init_plus3() -{ - m_floppy = 1; -} - -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")->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 ) diff --git a/src/mame/includes/specpls3.h b/src/mame/includes/specpls3.h index 8b5a12ff9ef..be0ebb6ca91 100644 --- a/src/mame/includes/specpls3.h +++ b/src/mame/includes/specpls3.h @@ -9,6 +9,45 @@ #ifndef MAME_INCLUDES_SPECPLS3_H #define MAME_INCLUDES_SPECPLS3_H +#include "spectrum.h" +#include "spec128.h" + +#include "imagedev/floppy.h" +#include "machine/upd765.h" + INPUT_PORTS_EXTERN( spec_plus ); +class specpls3_state : public spectrum_state +{ +public: + specpls3_state(const machine_config &mconfig, device_type type, const char *tag) : + spectrum_state(mconfig, type, tag), + m_upd765(*this, "upd765"), + m_flop(*this, "upd765:%u", 0U) + { } + + void spectrum_plus2(machine_config &config); + void spectrum_plus3(machine_config &config); + +private: + void bank1_w(offs_t offset, uint8_t data); + uint8_t bank1_r(offs_t offset); + void port_3ffd_w(uint8_t data); + uint8_t port_3ffd_r(); + uint8_t port_2ffd_r(); + void port_7ffd_w(uint8_t data); + void port_1ffd_w(uint8_t data); + void plus3_us_w(uint8_t data); + + DECLARE_MACHINE_RESET(spectrum_plus3); + + virtual void plus3_update_memory() override; + + void plus3_io(address_map &map); + void plus3_mem(address_map &map); + + optional_device m_upd765; + optional_device_array m_flop; +}; + #endif // MAME_INCLUDES_SPECPLS3_H diff --git a/src/mame/includes/spectrum.h b/src/mame/includes/spectrum.h index 81333f31bf2..2605cc29a8b 100644 --- a/src/mame/includes/spectrum.h +++ b/src/mame/includes/spectrum.h @@ -17,10 +17,8 @@ #include "bus/generic/carts.h" #include "bus/generic/slot.h" #include "imagedev/cassette.h" -#include "imagedev/floppy.h" #include "imagedev/snapquik.h" #include "machine/ram.h" -#include "machine/upd765.h" #include "sound/spkrdev.h" #include "emupal.h" #include "screen.h" @@ -76,8 +74,6 @@ public: m_speaker(*this, "speaker"), m_exp(*this, "exp"), m_dock(*this, "dockslot"), - m_upd765(*this, "upd765"), - m_flop(*this, "upd765:%u", 0U), m_io_line0(*this, "LINE0"), m_io_line1(*this, "LINE1"), m_io_line2(*this, "LINE2"), @@ -102,12 +98,9 @@ public: void ts2068(machine_config &config); void uk2086(machine_config &config); void tc2048(machine_config &config); - void spectrum_plus3(machine_config &config); void spectrum_128(machine_config &config); void init_spectrum(); - void init_plus2(); - void init_plus3(); protected: enum @@ -123,8 +116,6 @@ protected: int m_port_ff_data; /* Display enhancement control */ int m_port_f4_data; /* Horizontal Select Register */ - int m_floppy; - /* video support */ int m_frame_invert_count; int m_frame_number; /* Used for handling FLASH 1 */ @@ -163,15 +154,6 @@ protected: DECLARE_WRITE8_MEMBER(spectrum_128_port_7ffd_w); DECLARE_READ8_MEMBER(spectrum_128_ula_r); - DECLARE_WRITE8_MEMBER(spectrum_plus3_bank1_w); - DECLARE_READ8_MEMBER(spectrum_plus3_bank1_r); - DECLARE_WRITE8_MEMBER(spectrum_plus3_port_3ffd_w); - DECLARE_READ8_MEMBER(spectrum_plus3_port_3ffd_r); - DECLARE_READ8_MEMBER(spectrum_plus3_port_2ffd_r); - DECLARE_WRITE8_MEMBER(spectrum_plus3_port_7ffd_w); - DECLARE_WRITE8_MEMBER(spectrum_plus3_port_1ffd_w); - void plus3_us_w(uint8_t data); - DECLARE_READ8_MEMBER(ts2068_port_f4_r); DECLARE_WRITE8_MEMBER(ts2068_port_f4_w); DECLARE_READ8_MEMBER(ts2068_port_ff_r); @@ -184,7 +166,6 @@ protected: DECLARE_MACHINE_RESET(tc2048); DECLARE_VIDEO_START(spectrum_128); DECLARE_MACHINE_RESET(spectrum_128); - DECLARE_MACHINE_RESET(spectrum_plus3); DECLARE_MACHINE_RESET(ts2068); DECLARE_VIDEO_START(ts2068); uint32_t screen_update_spectrum(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -204,9 +185,8 @@ protected: unsigned int m_previous_screen_x, m_previous_screen_y; bitmap_ind16 m_screen_bitmap; - DECLARE_FLOPPY_FORMATS(floppy_formats); void spectrum_128_update_memory(); - void spectrum_plus3_update_memory(); + virtual void plus3_update_memory() { } void ts2068_update_memory(); DECLARE_SNAPSHOT_LOAD_MEMBER(spectrum); @@ -221,8 +201,6 @@ protected: void spectrum_io(address_map &map); void spectrum_mem(address_map &map); void spectrum_fetch(address_map &map); - void spectrum_plus3_io(address_map &map); - void spectrum_plus3_mem(address_map &map); void tc2048_io(address_map &map); void tc2048_mem(address_map &map); void ts2068_io(address_map &map); @@ -233,8 +211,6 @@ protected: required_device m_speaker; optional_device m_exp; optional_device m_dock; - optional_device m_upd765; - optional_device_array m_flop; // Regular spectrum ports; marked as optional because of other subclasses optional_ioport m_io_line0;