diff options
-rw-r--r-- | scripts/src/formats.lua | 12 | ||||
-rw-r--r-- | scripts/target/mame/mess.lua | 9 | ||||
-rw-r--r-- | src/lib/formats/poly_dsk.cpp | 118 | ||||
-rw-r--r-- | src/lib/formats/poly_dsk.h | 29 | ||||
-rw-r--r-- | src/mame/drivers/proteus.cpp | 430 | ||||
-rw-r--r-- | src/mame/mame.lst | 5 | ||||
-rw-r--r-- | src/mame/mess.flt | 1 |
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 = §_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 |