specpls3.cpp: Code cleanup (nw)

This commit is contained in:
AJR 2019-04-14 15:06:12 -04:00
parent 8be8a5841f
commit 8a4cb1d62b
4 changed files with 103 additions and 87 deletions

View File

@ -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<i8251_device> m_i8251;
required_device<i8255_device> m_i8255;
required_device<centronics_device> m_centronics;
required_device<upd765a_device> m_upd765;
required_device_array<floppy_connector, 2> m_flop;
required_device<address_map_bank_device> m_bank1;
required_device<address_map_bank_device> m_bank2;
required_ioport_array<9> m_io_ports;

View File

@ -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_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 )

View File

@ -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<upd765a_device> m_upd765;
optional_device_array<floppy_connector, 2> m_flop;
};
#endif // MAME_INCLUDES_SPECPLS3_H

View File

@ -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<speaker_sound_device> m_speaker;
optional_device<spectrum_expansion_slot_device> m_exp;
optional_device<generic_slot_device> m_dock;
optional_device<upd765a_device> m_upd765;
optional_device_array<floppy_connector, 2> m_flop;
// Regular spectrum ports; marked as optional because of other subclasses
optional_ioport m_io_line0;