summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nigel Barnes <Pernod70@users.noreply.github.com>2018-03-21 19:21:56 +0000
committer Nigel Barnes <Pernod70@users.noreply.github.com>2018-03-21 20:53:11 +0000
commit7ad824c85ba6fa8d5618a01660a941818a36ef7c (patch)
tree973cc1cc1eb43b800dd94d6cadb65fa12e1c5091
parent8f7c57d79900079dbb36de69d18d66e38bb60354 (diff)
New machines marked as NOT_WORKING
---------------------------------- Poly Proteus (Standalone) [Nigel Barnes, Andrew Trotman]
-rw-r--r--scripts/src/formats.lua12
-rw-r--r--scripts/target/mame/mess.lua9
-rw-r--r--src/lib/formats/poly_dsk.cpp118
-rw-r--r--src/lib/formats/poly_dsk.h29
-rw-r--r--src/mame/drivers/proteus.cpp430
-rw-r--r--src/mame/mame.lst5
-rw-r--r--src/mame/mess.flt1
7 files changed, 602 insertions, 2 deletions
diff --git a/scripts/src/formats.lua b/scripts/src/formats.lua
index 6558ff859d2..b25909dbb3a 100644
--- a/scripts/src/formats.lua
+++ b/scripts/src/formats.lua
@@ -1351,6 +1351,18 @@ end
--------------------------------------------------
--
+--@src/lib/formats/poly_dsk.h,FORMATS["POLY_DSK"] = true
+--------------------------------------------------
+
+if (FORMATS["POLY_DSK"]~=null or _OPTIONS["with-tools"]) then
+ files {
+ MAME_DIR.. "src/lib/formats/poly_dsk.cpp",
+ MAME_DIR.. "src/lib/formats/poly_dsk.h",
+ }
+end
+
+--------------------------------------------------
+--
--@src/lib/formats/ppg_dsk.h,FORMATS["PPG_DSK"] = true
--------------------------------------------------
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 41396076cb1..246b1033fc3 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -879,6 +879,7 @@ FORMATS["PC98_DSK"] = true
FORMATS["PC_DSK"] = true
FORMATS["PHC25_CAS"] = true
FORMATS["PK8020_DSK"] = true
+FORMATS["POLY_DSK"] = true
FORMATS["PPG_DSK"] = true
FORMATS["PMD_CAS"] = true
FORMATS["PRIMOPTP"] = true
@@ -1069,6 +1070,7 @@ function linkProjects_mame_mess(_target, _subtarget)
"pel",
"philips",
"pitronic",
+ "poly",
"poly88",
"prodigy",
"psion",
@@ -2684,7 +2686,7 @@ files {
MAME_DIR .. "src/mame/drivers/galeb.cpp",
MAME_DIR .. "src/mame/includes/galeb.h",
MAME_DIR .. "src/mame/video/galeb.cpp",
- MAME_DIR .. "src/mame/drivers/orao.cpp",
+ MAME_DIR .. "src/mame/drivers/orao.cpp",
MAME_DIR .. "src/mame/includes/orao.h",
MAME_DIR .. "src/mame/machine/orao.cpp",
MAME_DIR .. "src/mame/video/orao.cpp",
@@ -2699,6 +2701,11 @@ files {
MAME_DIR .. "src/mame/drivers/vg5k.cpp",
}
+createMESSProjects(_target, _subtarget, "poly")
+files {
+ MAME_DIR .. "src/mame/drivers/proteus.cpp",
+}
+
createMESSProjects(_target, _subtarget, "poly88")
files {
MAME_DIR .. "src/mame/drivers/poly88.cpp",
diff --git a/src/lib/formats/poly_dsk.cpp b/src/lib/formats/poly_dsk.cpp
new file mode 100644
index 00000000000..221913a5439
--- /dev/null
+++ b/src/lib/formats/poly_dsk.cpp
@@ -0,0 +1,118 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ Poly CP/M Disk image format
+
+ FLEX-POLYSYS image formats are handled in flex_dsk.
+
+***************************************************************************/
+
+#include "poly_dsk.h"
+
+poly_cpm_format::poly_cpm_format()
+{
+}
+
+const char *poly_cpm_format::name() const
+{
+ return "cpm";
+}
+
+const char *poly_cpm_format::description() const
+{
+ return "Poly CP/M disk image";
+}
+
+const char *poly_cpm_format::extensions() const
+{
+ return "cpm";
+}
+
+bool poly_cpm_format::supports_save() const
+{
+ return true;
+}
+
+int poly_cpm_format::identify(io_generic *io, uint32_t form_factor)
+{
+ uint8_t boot[16];
+ uint64_t size = io_generic_size(io);
+
+ // check for valid sizes
+ if (size == 630784 || size == 622592 || size == 256256)
+ {
+ // check for Poly CP/M boot sector
+ io_generic_read(io, boot, 0, 16);
+ if (memcmp(boot, "\x86\xc3\xb7\x00\x00\x8e\x10\xc0\xbf\x00\x01\xbf\xe0\x60\x00\x00", 16) == 0)
+ {
+ return 100;
+ }
+ }
+ return 0;
+}
+
+bool poly_cpm_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
+{
+ int total_tracks, spt, bps, head_num;
+
+ uint64_t size = io_generic_size(io);
+
+ switch (size)
+ {
+ case 622592:
+ // CP/M 3" disk DSSD
+ total_tracks = 76;
+ spt = 8;
+ bps = 512;
+ head_num = 2;
+ break;
+ case 256256:
+ // CP/M 8" disk SDSD
+ total_tracks = 77;
+ spt = 26;
+ bps = 128;
+ head_num = 1;
+ break;
+ default:
+ // CP/M 8" disk DSSD
+ total_tracks = 77;
+ spt = 8;
+ bps = 512;
+ head_num = 2;
+ break;
+ }
+
+ int cell_count = (form_factor == floppy_image::FF_525) ? 50000 : 100000;
+ int offset = 0;
+
+ for (int track = 0; track < total_tracks; track++)
+ for (int head = 0; head < head_num; head++)
+ {
+ desc_pc_sector sects[80];
+ uint8_t sect_data[20000];
+ int sdatapos = 0;
+ for (int i = 0; i<spt; i++)
+ {
+ sects[i].track = track;
+ sects[i].head = head;
+ if (head == 0)
+ sects[i].sector = i + 1;
+ else
+ sects[i].sector = i + 1 + spt;
+ sects[i].actual_size = bps;
+ sects[i].size = bps >> 8;
+ sects[i].deleted = false;
+ sects[i].bad_crc = false;
+ sects[i].data = &sect_data[sdatapos];
+ io_generic_read(io, sects[i].data, offset, bps);
+ offset += bps;
+ sdatapos += bps;
+ }
+ // gap sizes unverified
+ build_wd_track_fm(track, head, image, cell_count, spt, sects, 24, 16, 11);
+ }
+ return true;
+}
+
+const floppy_format_type FLOPPY_POLY_CPM_FORMAT = &floppy_image_format_creator<poly_cpm_format>;
diff --git a/src/lib/formats/poly_dsk.h b/src/lib/formats/poly_dsk.h
new file mode 100644
index 00000000000..3c7e96deef4
--- /dev/null
+++ b/src/lib/formats/poly_dsk.h
@@ -0,0 +1,29 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ Poly Disk image formats
+
+***************************************************************************/
+
+#ifndef POLY_DSK_H_
+#define POLY_DSK_H_
+
+#include "flopimg.h"
+
+class poly_cpm_format : public floppy_image_format_t
+{
+public:
+ poly_cpm_format();
+
+ virtual const char *name() const override;
+ virtual const char *description() const override;
+ virtual const char *extensions() const override;
+ virtual int identify(io_generic *io, uint32_t form_factor) override;
+ virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override;
+ virtual bool supports_save() const override;
+};
+
+extern const floppy_format_type FLOPPY_POLY_CPM_FORMAT;
+
+#endif /* POLY_DSK_H_ */
diff --git a/src/mame/drivers/proteus.cpp b/src/mame/drivers/proteus.cpp
new file mode 100644
index 00000000000..5a9644b8aa1
--- /dev/null
+++ b/src/mame/drivers/proteus.cpp
@@ -0,0 +1,430 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+// thanks-to:Andrew Trotman
+/**********************************************************************
+
+ Poly Proteus Computer
+
+ http://www.cs.otago.ac.nz/homepages/andrew/poly/Poly.htm
+
+ Specifications:
+
+ Processors 6809,Z80
+
+ RAM 64 Kbytes
+
+ ROM 4 Kbytes
+
+ Clock Z80 4 MHz (1 wait state per machine cycle)
+ 6809 4 MHz clock, 1 MHz cycle
+
+ Disk Drives One or two 8" half height drives (Shugart SA860)
+ Double sided single density
+ Capacity 630 Kbytes per disk (CP/M)
+ 590 Kbytes (Flex,Polysys)
+ Single sided can be used for compatibility
+
+ Ports Standard One RS232
+ One Poly network
+ Optional Total 3 RS232
+ One Poly network
+ One parallel
+ One disk drive extension
+
+ Operating systems
+ CP/M. The standard operating system for 8080/Z80 micros.
+ FLEX. The standard operating system for 6809 micros.
+ POLYSYS. The operating system for the POLY network.
+
+**********************************************************************/
+
+
+#include "emu.h"
+#include "cpu/m6809/m6809.h"
+#include "cpu/z80/z80.h"
+#include "machine/6821pia.h"
+#include "machine/6840ptm.h"
+#include "machine/6850acia.h"
+#include "machine/mc6854.h"
+#include "machine/ram.h"
+#include "machine/input_merger.h"
+#include "machine/clock.h"
+#include "machine/wd_fdc.h"
+#include "bus/rs232/rs232.h"
+#include "bus/centronics/ctronics.h"
+#include "formats/flex_dsk.h"
+#include "formats/poly_dsk.h"
+#include "softlist.h"
+
+
+class proteus_state : public driver_device
+{
+public:
+ proteus_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_z80(*this, "z80")
+ , m_adlc(*this, "mc6854")
+ , m_ptm(*this, "ptm")
+ , m_irqs(*this, "irqs")
+ , m_pia(*this, "pia")
+ , m_acia(*this, "acia%u", 0)
+ , m_fdc(*this, "fdc")
+ , m_floppy0(*this, "fdc:0")
+ , m_floppy1(*this, "fdc:1")
+ , m_floppy(nullptr)
+ { }
+
+ virtual void machine_reset() override;
+ virtual void machine_start() override;
+
+ DECLARE_WRITE_LINE_MEMBER(ptm_o2_callback);
+ DECLARE_WRITE_LINE_MEMBER(ptm_o3_callback);
+ DECLARE_READ8_MEMBER(network_r);
+ DECLARE_WRITE8_MEMBER(network_w);
+
+ DECLARE_READ8_MEMBER(drive_register_r);
+ DECLARE_WRITE8_MEMBER(drive_register_w);
+ DECLARE_WRITE_LINE_MEMBER(motor_w);
+ DECLARE_READ8_MEMBER(fdc_inv_r);
+ DECLARE_WRITE8_MEMBER(fdc_inv_w);
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+ DECLARE_WRITE8_MEMBER(enable_z80_w);
+ DECLARE_WRITE8_MEMBER(enable_6809_w);
+
+ void proteus(machine_config &config);
+ void proteus_6809_mem(address_map &map);
+ void proteus_z80_mem(address_map &map);
+ void proteus_z80_io(address_map &map);
+
+protected:
+ required_device<cpu_device> m_maincpu;
+ required_device<cpu_device> m_z80;
+ required_device<mc6854_device> m_adlc;
+ required_device<ptm6840_device> m_ptm;
+ required_device<input_merger_device> m_irqs;
+ required_device<pia6821_device> m_pia;
+ required_device_array<acia6850_device, 3> m_acia;
+ required_device<fd1771_device> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ required_device<floppy_connector> m_floppy1;
+ floppy_image_device *m_floppy;
+};
+
+
+void proteus_state::machine_start()
+{
+ uint8_t bitswapped[0x1000];
+ uint8_t *rom;
+
+ /* bios rom region */
+ rom = memregion("bios")->base();
+
+ /* decrypt rom data lines */
+ for (int i = 0x0000; i<0x1000; i++)
+ bitswapped[i] = bitswap<8>(rom[i], 3, 4, 2, 5, 1, 6, 0, 7);
+
+ /* decrypt rom address lines */
+ for (int i = 0x0000; i<0x1000; i++)
+ rom[i] = bitswapped[bitswap<16>(i, 15, 14, 13, 12, 10, 8, 4, 2, 0, 1, 3, 5, 6, 7, 9, 11)];
+
+ /*
+ The Proteus BIOS contains a serial ID for copy protection. Disks also contain the
+ OS serial ID which must match the BIOS serial ID. This can be negated by patching the
+ serial in the BIOS to 0x0000.
+ */
+ rom[0x02] = 0x00;
+ rom[0x03] = 0x00;
+}
+
+
+void proteus_state::machine_reset()
+{
+ /* system starts with 6809 running and the Z80 remains reset */
+ m_z80->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
+}
+
+
+WRITE_LINE_MEMBER(proteus_state::ptm_o2_callback)
+{
+ m_ptm->set_c1(state);
+}
+
+WRITE_LINE_MEMBER(proteus_state::ptm_o3_callback)
+{
+ m_adlc->txc_w(state);
+ m_adlc->rxc_w(!state);
+}
+
+
+READ8_MEMBER(proteus_state::network_r)
+{
+ return m_adlc->read(space, offset >> 1);
+}
+
+WRITE8_MEMBER(proteus_state::network_w)
+{
+ m_adlc->write(space, offset >> 1, data);
+}
+
+
+WRITE8_MEMBER(proteus_state::drive_register_w)
+{
+ /* drive select */
+ switch (data & 0x03)
+ {
+ case 0:
+ m_floppy = m_floppy0->get_device();
+ break;
+
+ case 1:
+ m_floppy = m_floppy1->get_device();
+ break;
+
+ default:
+ m_floppy = nullptr;
+ break;
+ }
+ m_fdc->set_floppy(m_floppy);
+
+ if (m_floppy)
+ {
+ /* side select */
+ m_floppy->ss_w(BIT(data, 6));
+ }
+}
+
+READ8_MEMBER(proteus_state::drive_register_r)
+{
+ /* disk change */
+ return (m_floppy ? m_floppy->dskchg_r() : 1) << 1;
+}
+
+WRITE_LINE_MEMBER(proteus_state::motor_w)
+{
+ if (m_floppy) m_floppy->mon_w(!state);
+}
+
+READ8_MEMBER(proteus_state::fdc_inv_r)
+{
+ return m_fdc->gen_r(offset) ^ 0xff;
+}
+
+WRITE8_MEMBER(proteus_state::fdc_inv_w)
+{
+ m_fdc->gen_w(offset, data ^ 0xff);
+}
+
+
+WRITE8_MEMBER(proteus_state::enable_z80_w)
+{
+ logerror("%04X enable z80\n", m_maincpu->pc());
+ // Enable Z80 (store an address at E060 and when the 6809 comes back it'll load PC with that address)
+ m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
+ m_z80->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
+}
+
+WRITE8_MEMBER(proteus_state::enable_6809_w)
+{
+ logerror("%04X enable 6809\n", m_z80->pc());
+ // TODO: this is untested, not aware of any software that uses it
+ m_z80->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
+ m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
+}
+
+
+void proteus_state::proteus_6809_mem(address_map &map)
+{
+ map(0x0000, 0xffff).ram().share(RAM_TAG);
+ map(0xe000, 0xe003).rw(m_pia, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // Parallel port
+ map(0xe004, 0xe005).rw(m_acia[0], FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // Terminal
+ map(0xe008, 0xe009).rw(m_acia[1], FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // Printer
+ map(0xe00c, 0xe00d).rw(m_acia[2], FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // Modem
+ map(0xe014, 0xe014).rw(this, FUNC(proteus_state::drive_register_r), FUNC(proteus_state::drive_register_w));
+ map(0xe018, 0xe01b).rw(this, FUNC(proteus_state::fdc_inv_r), FUNC(proteus_state::fdc_inv_w)); // Floppy control
+ map(0xe020, 0xe027).rw(m_ptm, FUNC(ptm6840_device::read), FUNC(ptm6840_device::write)); // Timer
+ map(0xe030, 0xe036).rw(this, FUNC(proteus_state::network_r), FUNC(proteus_state::network_w)); // Poly network
+ map(0xe060, 0xe060).w(this, FUNC(proteus_state::enable_z80_w));
+ map(0xf000, 0xffff).rom().region("bios", 0);
+}
+
+
+void proteus_state::proteus_z80_mem(address_map &map)
+{
+ map(0x0000, 0xffff).ram().share(RAM_TAG);
+}
+
+
+void proteus_state::proteus_z80_io(address_map &map)
+{
+ map(0x00, 0x03).mirror(0xff00).rw(m_pia, FUNC(pia6821_device::read), FUNC(pia6821_device::write)); // Parallel port
+ map(0x04, 0x05).mirror(0xff00).rw(m_acia[0], FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // Terminal
+ map(0x08, 0x09).mirror(0xff00).rw(m_acia[1], FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // Printer
+ map(0x0c, 0x0d).mirror(0xff00).rw(m_acia[2], FUNC(acia6850_device::read), FUNC(acia6850_device::write)); // Modem
+ map(0x14, 0x14).mirror(0xff00).rw(this, FUNC(proteus_state::drive_register_r), FUNC(proteus_state::drive_register_w));
+ map(0x18, 0x1b).mirror(0xff00).rw(this, FUNC(proteus_state::fdc_inv_r), FUNC(proteus_state::fdc_inv_w)); // Floppy control
+ map(0x20, 0x27).mirror(0xff00).rw(m_ptm, FUNC(ptm6840_device::read), FUNC(ptm6840_device::write)); // Timer
+ map(0x30, 0x36).mirror(0xff00).rw(this, FUNC(proteus_state::network_r), FUNC(proteus_state::network_w)); // Poly network
+ map(0x50, 0x50).mirror(0xff00).w(this, FUNC(proteus_state::enable_6809_w));
+}
+
+
+//Parameter 1: Baud Rate from BIOS
+// 00 = 9600
+// 02 = 4800
+// 04 = 2400
+// 06 = 1200
+// 08 = 600
+// 0A = 300
+static INPUT_PORTS_START(proteus)
+ PORT_START("TERM_BAUD")
+ PORT_CONFNAME(0x07, 0x00, "Terminal Baud Rate")
+ PORT_CONFSETTING(0x00, "9600")
+ PORT_CONFSETTING(0x01, "4800")
+ PORT_CONFSETTING(0x02, "2400")
+ PORT_CONFSETTING(0x03, "1200")
+ PORT_CONFSETTING(0x04, "600")
+ PORT_CONFSETTING(0x05, "300")
+ PORT_CONFSETTING(0x06, "150")
+
+ PORT_START("J1")
+ PORT_CONFNAME(0x07, 0x00, "J1 Modem Baud Rate")
+ PORT_CONFSETTING(0x00, "9600")
+ PORT_CONFSETTING(0x01, "4800")
+ PORT_CONFSETTING(0x02, "2400")
+ PORT_CONFSETTING(0x03, "1200")
+ PORT_CONFSETTING(0x04, "600")
+ PORT_CONFSETTING(0x05, "300")
+
+ PORT_START("J2")
+ PORT_CONFNAME(0x07, 0x00, "J2 Printer Baud Rate")
+ PORT_CONFSETTING(0x00, "9600")
+ PORT_CONFSETTING(0x01, "4800")
+ PORT_CONFSETTING(0x02, "2400")
+ PORT_CONFSETTING(0x03, "1200")
+ PORT_CONFSETTING(0x04, "600")
+ PORT_CONFSETTING(0x05, "300")
+INPUT_PORTS_END
+
+
+FLOPPY_FORMATS_MEMBER(proteus_state::floppy_formats)
+ FLOPPY_FLEX_FORMAT,
+ FLOPPY_POLY_CPM_FORMAT
+FLOPPY_FORMATS_END
+
+static SLOT_INTERFACE_START(proteus_floppies)
+ SLOT_INTERFACE("8dssd", FLOPPY_8_DSSD) // Shugart SA-860
+SLOT_INTERFACE_END
+
+
+MACHINE_CONFIG_START(proteus_state::proteus)
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", MC6809, 4_MHz_XTAL)
+ MCFG_CPU_PROGRAM_MAP(proteus_6809_mem)
+
+ MCFG_CPU_ADD("z80", Z80, 4_MHz_XTAL)
+ MCFG_CPU_PROGRAM_MAP(proteus_z80_mem)
+ MCFG_CPU_IO_MAP(proteus_z80_io)
+
+ MCFG_INPUT_MERGER_ANY_HIGH("irqs")
+ MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE))
+ MCFG_DEVCB_CHAIN_OUTPUT(INPUTLINE("z80", INPUT_LINE_IRQ0))
+
+ /* fdc */
+ MCFG_FD1771_ADD("fdc", 4_MHz_XTAL / 2)
+ MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(proteus_state, motor_w))
+ MCFG_WD_FDC_FORCE_READY
+
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", proteus_floppies, "8dssd", proteus_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", proteus_floppies, "8dssd", proteus_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+
+ /* ram */
+ MCFG_RAM_ADD(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("64K")
+
+ /* network */
+ MCFG_DEVICE_ADD("mc6854", MC6854, 0)
+ MCFG_MC6854_OUT_IRQ_CB(DEVWRITELINE("irqs", input_merger_device, in_w<0>))
+
+ MCFG_DEVICE_ADD("ptm", PTM6840, 4_MHz_XTAL / 2)
+ MCFG_PTM6840_EXTERNAL_CLOCKS(0, 0, 0)
+ MCFG_PTM6840_O2_CB(WRITELINE(proteus_state, ptm_o2_callback))
+ MCFG_PTM6840_O3_CB(WRITELINE(proteus_state, ptm_o3_callback))
+ MCFG_PTM6840_IRQ_CB(DEVWRITELINE("irqs", input_merger_device, in_w<1>))
+
+ /* parallel port */
+ MCFG_DEVICE_ADD("pia", PIA6821, 0)
+ //MCFG_PIA_READPB_HANDLER(READ8(proteus_state, pia_pb_r))
+ //MCFG_PIA_WRITEPA_HANDLER(WRITE8(proteus_state, pia_pa_w))
+ //MCFG_PIA_WRITEPB_HANDLER(WRITE8(proteus_state, pia_pb_w))
+ //MCFG_PIA_CA2_HANDLER(DEVWRITELINE(CENTRONICS_TAG, centronics_device, write_strobe))
+ MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<2>))
+ MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<3>))
+
+ MCFG_CENTRONICS_ADD("parallel", centronics_devices, "printer")
+ MCFG_CENTRONICS_ACK_HANDLER(DEVWRITELINE("pia", pia6821_device, ca1_w))
+ MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "parallel")
+
+ /* terminal port */
+ MCFG_DEVICE_ADD("acia0", ACIA6850, 0)
+ MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("terminal", rs232_port_device, write_txd))
+ MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("terminal", rs232_port_device, write_rts))
+ MCFG_ACIA6850_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<4>))
+
+ MCFG_RS232_PORT_ADD("terminal", default_rs232_devices, "terminal") // TODO: ADM-31 terminal required
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia0", acia6850_device, write_rxd))
+ MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia0", acia6850_device, write_cts))
+
+ MCFG_DEVICE_ADD("acia0_clock", CLOCK, 4_MHz_XTAL / 2 / 13) // TODO: this is set using jumpers
+ MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("acia0", acia6850_device, write_txc))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia0", acia6850_device, write_rxc))
+
+ /* printer port */
+ MCFG_DEVICE_ADD("acia1", ACIA6850, 0)
+ MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("printer", rs232_port_device, write_txd))
+ MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("printer", rs232_port_device, write_rts))
+ MCFG_ACIA6850_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<5>))
+
+ MCFG_RS232_PORT_ADD("printer", default_rs232_devices, nullptr)
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia1", acia6850_device, write_rxd))
+ MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia1", acia6850_device, write_cts))
+
+ MCFG_DEVICE_ADD("acia1_clock", CLOCK, 4_MHz_XTAL / 2 / 13) // TODO: this is set using jumpers J2
+ MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("acia1", acia6850_device, write_txc))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia1", acia6850_device, write_rxc))
+
+ /* modem port */
+ MCFG_DEVICE_ADD("acia2", ACIA6850, 0)
+ MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("modem", rs232_port_device, write_txd))
+ MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("modem", rs232_port_device, write_rts))
+ MCFG_ACIA6850_IRQ_HANDLER(DEVWRITELINE("irqs", input_merger_device, in_w<6>))
+
+ MCFG_RS232_PORT_ADD("modem", default_rs232_devices, nullptr)
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia2", acia6850_device, write_rxd))
+ MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia2", acia6850_device, write_cts))
+
+ MCFG_DEVICE_ADD("acia2_clock", CLOCK, 4_MHz_XTAL / 2 / 13) // TODO: this is set using jumpers J1
+ MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("acia2", acia6850_device, write_txc))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("acia2", acia6850_device, write_rxc))
+
+ /* software lists */
+ MCFG_SOFTWARE_LIST_ADD("flop_list", "poly_flop")
+ MCFG_SOFTWARE_LIST_FILTER("flop_list", "PROTEUS")
+MACHINE_CONFIG_END
+
+
+ROM_START(proteus)
+ ROM_REGION(0x1000, "bios", 0)
+ ROM_DEFAULT_BIOS("82")
+ ROM_SYSTEM_BIOS(0, "82", "030982")
+ ROMX_LOAD("proteusv30.u28", 0x0000, 0x1000, CRC(ad02dc36) SHA1(f73aff8b3d85448f603a2fe807e3a7e02550db27), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "86", "300986")
+ ROMX_LOAD("300986.u28", 0x0000, 0x1000, CRC(f607d396) SHA1(0b9d9d3178b5587e60da56885b9e8a83f7d5dd26), ROM_BIOS(2))
+ROM_END
+
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1982, proteus, 0, 0, proteus, proteus, proteus_state, 0, "Polycorp", "Poly Proteus (Standalone)", MACHINE_NOT_WORKING )
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index b93f2545c23..e99efac688d 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -21334,7 +21334,7 @@ bel // 1998.12 Behind Enemy Lines
daytona // 1994.03 Daytona USA (Japan, Revision A)
daytona93 // 1993 Japan
daytonam // 2001 Kyle Hodgetts hack
-daytonas //
+daytonas //
daytonase // 1994 Daytona USA Special Edition (Japan, Revision A)
daytonat // 1994? Kyle Hodgetts hack
daytonata // 1994? Kyle Hodgetts hack
@@ -32295,6 +32295,9 @@ progolfa // (c) 1981
@source:prophet600.cpp
prpht600 // 1983 Sequential Circuits
+@source:proteus.cpp
+proteus // Poly Proteus
+
@source:proteus3.cpp
proteus3 //
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index e7208e68507..91b1c0d2cd9 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -554,6 +554,7 @@ prodigy.cpp
prof180x.cpp
prof80.cpp
prophet600.cpp
+proteus.cpp
proteus3.cpp
ps2.cpp
ps2sony.cpp