Skip to content

Commit 04742ea

Browse files
authored
bus/centronics: hookup The Adaptator DE-9 multitap device (#13341)
* bus/centronics: hookup The Adaptator DE-9 multitap device * bus/centronics/adaptator: register a possible DDR variable
1 parent 4e5dd0c commit 04742ea

File tree

6 files changed

+149
-2
lines changed

6 files changed

+149
-2
lines changed

scripts/src/bus.lua

+2
Original file line numberDiff line numberDiff line change
@@ -3284,6 +3284,8 @@ end
32843284

32853285
if (BUSES["CENTRONICS"]~=null) then
32863286
files {
3287+
MAME_DIR .. "src/devices/bus/centronics/adaptator.cpp",
3288+
MAME_DIR .. "src/devices/bus/centronics/adaptator.h",
32873289
MAME_DIR .. "src/devices/bus/centronics/ctronics.cpp",
32883290
MAME_DIR .. "src/devices/bus/centronics/ctronics.h",
32893291
MAME_DIR .. "src/devices/bus/centronics/chessmec.cpp",
+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// license:BSD-3-Clause
2+
// copyright-holders:Angelo Salese
3+
/**************************************************************************************************
4+
5+
"The Adaptator" a.k.a. DIY parallel port to 2x DE-9 Multitap adapter
6+
7+
Originally bundled with the Amiga/ST/DOS/C=64 versions of Dyna Blaster as a sort of mandatory
8+
dongle (i.e. game menus needs joy 3 in Amiga version at least).
9+
10+
List of known supported games:
11+
amigaocs_flop
12+
- dynabls;
13+
- kickoff2;
14+
- gauntlt2;
15+
- protent2;
16+
- sskid;
17+
18+
TODO:
19+
- DOS ct486 dynablst doesn't work, BIOS shenanigans?
20+
- atarist (cracked only, loose) Dyna Blaster doesn't work either, needs select and data in routing;
21+
- Untested on C=64;
22+
- gauntlt2 seemingly requires a slightly different pinout according to the Super Skidmarks
23+
manual "connect pin 6 of joy 3 to pin 13 (?), pin 6 of joy 4 to pin 12";
24+
- Anything that isn't Atari/Commodore single button joystick is uncharted waters at current time
25+
(read: no SW pretends to read a mouse or a MD pad with this);
26+
27+
References:
28+
- https://www.aminet.net/package/util/misc/ControllerTest technical documentation;
29+
- https://www.aminet.net/package/util/misc/VATestprogram MouseJoy test;
30+
- Super Skidmarks manual, page 3;
31+
32+
**************************************************************************************************/
33+
34+
#include "emu.h"
35+
#include "adaptator.h"
36+
37+
DEFINE_DEVICE_TYPE(ADAPTATOR_MULTITAP, adaptator_multitap_device, "adaptator_multitap", "The Adaptator 2x DE-9 Multitap")
38+
39+
adaptator_multitap_device::adaptator_multitap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
40+
device_t(mconfig, ADAPTATOR_MULTITAP, tag, owner, clock),
41+
device_centronics_peripheral_interface(mconfig, *this),
42+
m_joy(*this, "joy_p%u", 1U)
43+
{ }
44+
45+
46+
void adaptator_multitap_device::device_add_mconfig(machine_config &config)
47+
{
48+
VCS_CONTROL_PORT(config, m_joy[0], vcs_control_port_devices, "joy");
49+
VCS_CONTROL_PORT(config, m_joy[1], vcs_control_port_devices, "joy");
50+
}
51+
52+
void adaptator_multitap_device::device_start()
53+
{
54+
save_item(NAME(m_ddr));
55+
}
56+
57+
void adaptator_multitap_device::input_strobe(int state)
58+
{
59+
// assume 1 -> 0, assume writing to the data port causes pullup
60+
// i.e. ControllerTest just writes a 0xff, at init time. ct486 do the same at POST.
61+
if (state)
62+
return;
63+
64+
u8 p1_in = m_joy[0]->read_joy();
65+
u8 p2_in = m_joy[1]->read_joy();
66+
67+
// route pin 13 -> joy port 3 pin 6
68+
output_select(BIT(p1_in, 5));
69+
// route pin 11 -> joy port 4 pin 6
70+
output_busy(BIT(p2_in, 5));
71+
// pins 18-22 -> pin 8 ground for both
72+
73+
// NOTE: 2nd button hooks are possible but ControllerTest warns that ACK
74+
// "is not easily available to software without some fancy interrupt trickery"
75+
// so it doesn't support it.
76+
// route pin 12 (pout) -> joy port 3 pin 9
77+
//output_perror(BIT(p1_in, ?));
78+
// route pin 10 (ack) -> joy port 4 pin 9
79+
//output_ack(BIT(p2_in, ?));
80+
81+
// route pins 2-5 -> joy port 3 pins 1-4
82+
output_data0(BIT(p1_in, 0));
83+
output_data1(BIT(p1_in, 1));
84+
output_data2(BIT(p1_in, 2));
85+
output_data3(BIT(p1_in, 3));
86+
// route pins 6-9 -> joy port 4 pins 1-4
87+
output_data4(BIT(p2_in, 0));
88+
output_data5(BIT(p2_in, 1));
89+
output_data6(BIT(p2_in, 2));
90+
output_data7(BIT(p2_in, 3));
91+
}
+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// license:BSD-3-Clause
2+
// copyright-holders:Angelo Salese
3+
4+
#ifndef MAME_BUS_CENTRONICS_ADAPTATOR_H
5+
#define MAME_BUS_CENTRONICS_ADAPTATOR_H
6+
7+
#pragma once
8+
9+
#include "ctronics.h"
10+
#include "bus/vcs_ctrl/ctrl.h"
11+
12+
class adaptator_multitap_device : public device_t,
13+
public device_centronics_peripheral_interface
14+
{
15+
public:
16+
// construction/destruction
17+
adaptator_multitap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
18+
19+
virtual void input_strobe(int state) override;
20+
virtual void input_data0(int state) override { if (state) m_ddr |= 0x01; else m_ddr &= ~0x01; }
21+
virtual void input_data1(int state) override { if (state) m_ddr |= 0x02; else m_ddr &= ~0x02; }
22+
virtual void input_data2(int state) override { if (state) m_ddr |= 0x04; else m_ddr &= ~0x04; }
23+
virtual void input_data3(int state) override { if (state) m_ddr |= 0x08; else m_ddr &= ~0x08; }
24+
virtual void input_data4(int state) override { if (state) m_ddr |= 0x10; else m_ddr &= ~0x10; }
25+
virtual void input_data5(int state) override { if (state) m_ddr |= 0x20; else m_ddr &= ~0x20; }
26+
virtual void input_data6(int state) override { if (state) m_ddr |= 0x40; else m_ddr &= ~0x40; }
27+
virtual void input_data7(int state) override { if (state) m_ddr |= 0x80; else m_ddr &= ~0x80; }
28+
29+
protected:
30+
// device-level overrides
31+
virtual void device_start() override ATTR_COLD;
32+
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
33+
34+
private:
35+
required_device_array<vcs_control_port_device, 2> m_joy;
36+
37+
u8 m_ddr;
38+
};
39+
40+
// device type definition
41+
DECLARE_DEVICE_TYPE(ADAPTATOR_MULTITAP, adaptator_multitap_device)
42+
43+
44+
#endif // MAME_BUS_CENTRONICS_ADAPTATOR_H

src/devices/bus/centronics/ctronics.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ device_centronics_peripheral_interface::~device_centronics_peripheral_interface(
117117
}
118118

119119

120+
#include "adaptator.h"
120121
#include "comxpl80.h"
121122
#include "epson_ex800.h"
122123
#include "epson_lx800.h"
@@ -132,6 +133,7 @@ device_centronics_peripheral_interface::~device_centronics_peripheral_interface(
132133

133134
void centronics_devices(device_slot_interface &device)
134135
{
136+
device.option_add("adaptator", ADAPTATOR_MULTITAP);
135137
device.option_add("pl80", COMX_PL80);
136138
device.option_add("ex800", EPSON_EX800);
137139
device.option_add("lx800", EPSON_LX800);

src/mame/amiga/amiga.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -1710,6 +1710,7 @@ void amiga_state::amiga_base(machine_config &config)
17101710
m_cia_0->irq_wr_callback().set(FUNC(amiga_state::cia_0_irq));
17111711
m_cia_0->pa_rd_callback().set_ioport("cia_0_port_a");
17121712
m_cia_0->pa_wr_callback().set(FUNC(amiga_state::cia_0_port_a_write));
1713+
m_cia_0->pb_rd_callback().set("cent_data_in", FUNC(input_buffer_device::read));
17131714
m_cia_0->pb_wr_callback().set("cent_data_out", FUNC(output_latch_device::write));
17141715
m_cia_0->pc_wr_callback().set(m_centronics, FUNC(centronics_device::write_strobe));
17151716
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)
17601761

17611762
// centronics
17621763
CENTRONICS(config, m_centronics, centronics_devices, "printer");
1764+
m_centronics->set_data_input_buffer("cent_data_in");
17631765
m_centronics->ack_handler().set(FUNC(amiga_state::centronics_ack_w));
17641766
m_centronics->busy_handler().set(FUNC(amiga_state::centronics_busy_w));
17651767
m_centronics->perror_handler().set(FUNC(amiga_state::centronics_perror_w));
17661768
m_centronics->select_handler().set(FUNC(amiga_state::centronics_select_w));
17671769

1770+
INPUT_BUFFER(config, "cent_data_in");
1771+
17681772
output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
17691773
m_centronics->set_output_latch(cent_data_out);
17701774

src/mame/amiga/amiga_m.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -1071,10 +1071,14 @@ uint8_t amiga_state::cia_1_port_a_read()
10711071
// bit 0 to 2, centronics
10721072
data |= m_centronics_busy << 0;
10731073
data |= m_centronics_perror << 1;
1074-
data |= m_centronics_select << 2;
1074+
// TODO: verify if this doesn't break Ring Indicator
1075+
// (amigajoy port 3 fire button won't work with previous behaviour)
1076+
// https://github.com/dirkwhoffmann/vAmiga/issues/49#issuecomment-502444017
1077+
// NOTE: RI is unavailable on a1000 anyway
1078+
data |= (m_centronics_select & m_rs232_ri) << 2;
10751079

10761080
// bit 2 to 7, serial line
1077-
data |= m_rs232_ri << 2;
1081+
// data |= m_rs232_ri << 2;
10781082
data |= m_rs232_dsr << 3;
10791083
data |= m_rs232_cts << 4;
10801084
data |= m_rs232_dcd << 5;

0 commit comments

Comments
 (0)