summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/specpls3.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/specpls3.cpp')
-rw-r--r--src/mame/drivers/specpls3.cpp112
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 )