diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 9e67d97003f..0f6f60325ae 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -3284,6 +3284,8 @@ end if (BUSES["CENTRONICS"]~=null) then files { + MAME_DIR .. "src/devices/bus/centronics/adaptator.cpp", + MAME_DIR .. "src/devices/bus/centronics/adaptator.h", MAME_DIR .. "src/devices/bus/centronics/ctronics.cpp", MAME_DIR .. "src/devices/bus/centronics/ctronics.h", MAME_DIR .. "src/devices/bus/centronics/chessmec.cpp", diff --git a/src/devices/bus/centronics/adaptator.cpp b/src/devices/bus/centronics/adaptator.cpp new file mode 100644 index 00000000000..411992b6652 --- /dev/null +++ b/src/devices/bus/centronics/adaptator.cpp @@ -0,0 +1,91 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese +/************************************************************************************************** + +"The Adaptator" a.k.a. DIY parallel port to 2x DE-9 Multitap adapter + +Originally bundled with the Amiga/ST/DOS/C=64 versions of Dyna Blaster as a sort of mandatory +dongle (i.e. game menus needs joy 3 in Amiga version at least). + +List of known supported games: +amigaocs_flop +- dynabls; +- kickoff2; +- gauntlt2; +- protent2; +- sskid; + +TODO: +- DOS ct486 dynablst doesn't work, BIOS shenanigans? +- atarist (cracked only, loose) Dyna Blaster doesn't work either, needs select and data in routing; +- Untested on C=64; +- gauntlt2 seemingly requires a slightly different pinout according to the Super Skidmarks + manual "connect pin 6 of joy 3 to pin 13 (?), pin 6 of joy 4 to pin 12"; +- Anything that isn't Atari/Commodore single button joystick is uncharted waters at current time + (read: no SW pretends to read a mouse or a MD pad with this); + +References: +- https://www.aminet.net/package/util/misc/ControllerTest technical documentation; +- https://www.aminet.net/package/util/misc/VATestprogram MouseJoy test; +- Super Skidmarks manual, page 3; + +**************************************************************************************************/ + +#include "emu.h" +#include "adaptator.h" + +DEFINE_DEVICE_TYPE(ADAPTATOR_MULTITAP, adaptator_multitap_device, "adaptator_multitap", "The Adaptator 2x DE-9 Multitap") + +adaptator_multitap_device::adaptator_multitap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, ADAPTATOR_MULTITAP, tag, owner, clock), + device_centronics_peripheral_interface(mconfig, *this), + m_joy(*this, "joy_p%u", 1U) +{ } + + +void adaptator_multitap_device::device_add_mconfig(machine_config &config) +{ + VCS_CONTROL_PORT(config, m_joy[0], vcs_control_port_devices, "joy"); + VCS_CONTROL_PORT(config, m_joy[1], vcs_control_port_devices, "joy"); +} + +void adaptator_multitap_device::device_start() +{ + save_item(NAME(m_ddr)); +} + +void adaptator_multitap_device::input_strobe(int state) +{ + // assume 1 -> 0, assume writing to the data port causes pullup + // i.e. ControllerTest just writes a 0xff, at init time. ct486 do the same at POST. + if (state) + return; + + u8 p1_in = m_joy[0]->read_joy(); + u8 p2_in = m_joy[1]->read_joy(); + + // route pin 13 -> joy port 3 pin 6 + output_select(BIT(p1_in, 5)); + // route pin 11 -> joy port 4 pin 6 + output_busy(BIT(p2_in, 5)); + // pins 18-22 -> pin 8 ground for both + + // NOTE: 2nd button hooks are possible but ControllerTest warns that ACK + // "is not easily available to software without some fancy interrupt trickery" + // so it doesn't support it. + // route pin 12 (pout) -> joy port 3 pin 9 + //output_perror(BIT(p1_in, ?)); + // route pin 10 (ack) -> joy port 4 pin 9 + //output_ack(BIT(p2_in, ?)); + + // route pins 2-5 -> joy port 3 pins 1-4 + output_data0(BIT(p1_in, 0)); + output_data1(BIT(p1_in, 1)); + output_data2(BIT(p1_in, 2)); + output_data3(BIT(p1_in, 3)); + // route pins 6-9 -> joy port 4 pins 1-4 + output_data4(BIT(p2_in, 0)); + output_data5(BIT(p2_in, 1)); + output_data6(BIT(p2_in, 2)); + output_data7(BIT(p2_in, 3)); +} diff --git a/src/devices/bus/centronics/adaptator.h b/src/devices/bus/centronics/adaptator.h new file mode 100644 index 00000000000..3226284027e --- /dev/null +++ b/src/devices/bus/centronics/adaptator.h @@ -0,0 +1,44 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese + +#ifndef MAME_BUS_CENTRONICS_ADAPTATOR_H +#define MAME_BUS_CENTRONICS_ADAPTATOR_H + +#pragma once + +#include "ctronics.h" +#include "bus/vcs_ctrl/ctrl.h" + +class adaptator_multitap_device : public device_t, + public device_centronics_peripheral_interface +{ +public: + // construction/destruction + adaptator_multitap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + virtual void input_strobe(int state) override; + virtual void input_data0(int state) override { if (state) m_ddr |= 0x01; else m_ddr &= ~0x01; } + virtual void input_data1(int state) override { if (state) m_ddr |= 0x02; else m_ddr &= ~0x02; } + virtual void input_data2(int state) override { if (state) m_ddr |= 0x04; else m_ddr &= ~0x04; } + virtual void input_data3(int state) override { if (state) m_ddr |= 0x08; else m_ddr &= ~0x08; } + virtual void input_data4(int state) override { if (state) m_ddr |= 0x10; else m_ddr &= ~0x10; } + virtual void input_data5(int state) override { if (state) m_ddr |= 0x20; else m_ddr &= ~0x20; } + virtual void input_data6(int state) override { if (state) m_ddr |= 0x40; else m_ddr &= ~0x40; } + virtual void input_data7(int state) override { if (state) m_ddr |= 0x80; else m_ddr &= ~0x80; } + +protected: + // device-level overrides + virtual void device_start() override ATTR_COLD; + virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; + +private: + required_device_array m_joy; + + u8 m_ddr; +}; + +// device type definition +DECLARE_DEVICE_TYPE(ADAPTATOR_MULTITAP, adaptator_multitap_device) + + +#endif // MAME_BUS_CENTRONICS_ADAPTATOR_H diff --git a/src/devices/bus/centronics/ctronics.cpp b/src/devices/bus/centronics/ctronics.cpp index 156c4e3578a..018b585d3ab 100644 --- a/src/devices/bus/centronics/ctronics.cpp +++ b/src/devices/bus/centronics/ctronics.cpp @@ -117,6 +117,7 @@ device_centronics_peripheral_interface::~device_centronics_peripheral_interface( } +#include "adaptator.h" #include "comxpl80.h" #include "epson_ex800.h" #include "epson_lx800.h" @@ -132,6 +133,7 @@ device_centronics_peripheral_interface::~device_centronics_peripheral_interface( void centronics_devices(device_slot_interface &device) { + device.option_add("adaptator", ADAPTATOR_MULTITAP); device.option_add("pl80", COMX_PL80); device.option_add("ex800", EPSON_EX800); device.option_add("lx800", EPSON_LX800); diff --git a/src/mame/amiga/amiga.cpp b/src/mame/amiga/amiga.cpp index f9cfe680382..77591798003 100644 --- a/src/mame/amiga/amiga.cpp +++ b/src/mame/amiga/amiga.cpp @@ -1710,6 +1710,7 @@ void amiga_state::amiga_base(machine_config &config) m_cia_0->irq_wr_callback().set(FUNC(amiga_state::cia_0_irq)); m_cia_0->pa_rd_callback().set_ioport("cia_0_port_a"); m_cia_0->pa_wr_callback().set(FUNC(amiga_state::cia_0_port_a_write)); + m_cia_0->pb_rd_callback().set("cent_data_in", FUNC(input_buffer_device::read)); m_cia_0->pb_wr_callback().set("cent_data_out", FUNC(output_latch_device::write)); m_cia_0->pc_wr_callback().set(m_centronics, FUNC(centronics_device::write_strobe)); m_cia_0->sp_wr_callback().set("kbd", FUNC(amiga_keyboard_bus_device::kdat_in_w)).invert(); @@ -1760,11 +1761,14 @@ void amiga_state::amiga_base(machine_config &config) // centronics CENTRONICS(config, m_centronics, centronics_devices, "printer"); + m_centronics->set_data_input_buffer("cent_data_in"); m_centronics->ack_handler().set(FUNC(amiga_state::centronics_ack_w)); m_centronics->busy_handler().set(FUNC(amiga_state::centronics_busy_w)); m_centronics->perror_handler().set(FUNC(amiga_state::centronics_perror_w)); m_centronics->select_handler().set(FUNC(amiga_state::centronics_select_w)); + INPUT_BUFFER(config, "cent_data_in"); + output_latch_device ¢_data_out(OUTPUT_LATCH(config, "cent_data_out")); m_centronics->set_output_latch(cent_data_out); diff --git a/src/mame/amiga/amiga_m.cpp b/src/mame/amiga/amiga_m.cpp index fbce57267ec..1df063498ba 100644 --- a/src/mame/amiga/amiga_m.cpp +++ b/src/mame/amiga/amiga_m.cpp @@ -1071,10 +1071,14 @@ uint8_t amiga_state::cia_1_port_a_read() // bit 0 to 2, centronics data |= m_centronics_busy << 0; data |= m_centronics_perror << 1; - data |= m_centronics_select << 2; + // TODO: verify if this doesn't break Ring Indicator + // (amigajoy port 3 fire button won't work with previous behaviour) + // https://github.com/dirkwhoffmann/vAmiga/issues/49#issuecomment-502444017 + // NOTE: RI is unavailable on a1000 anyway + data |= (m_centronics_select & m_rs232_ri) << 2; // bit 2 to 7, serial line - data |= m_rs232_ri << 2; +// data |= m_rs232_ri << 2; data |= m_rs232_dsr << 3; data |= m_rs232_cts << 4; data |= m_rs232_dcd << 5;