summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Wilbert Pol <wilbertpol@users.noreply.github.com>2015-01-01 20:49:09 +0100
committer Wilbert Pol <wilbertpol@users.noreply.github.com>2015-01-01 20:49:20 +0100
commitb3932b60cb6d2aff391aa8f8b01d64f0e785c8f3 (patch)
tree75a139ee24e3372ef008a0dac6aed61b6a30e1d6
parent6c0a4f47e37f8c4ca177e278ce4a186714ae20e7 (diff)
Added skeleton for Atari 8bit SIO bus. This will not work until pokey learns to speak low level serial. (nw)
-rw-r--r--src/emu/bus/a8sio/a8sio.c220
-rw-r--r--src/emu/bus/a8sio/a8sio.h141
-rw-r--r--src/emu/bus/a8sio/cassette.c72
-rw-r--r--src/emu/bus/a8sio/cassette.h49
-rw-r--r--src/emu/bus/bus.mak12
-rw-r--r--src/mess/drivers/atari400.c6
-rw-r--r--src/mess/mess.mak1
7 files changed, 501 insertions, 0 deletions
diff --git a/src/emu/bus/a8sio/a8sio.c b/src/emu/bus/a8sio/a8sio.c
new file mode 100644
index 00000000000..520faa1e40f
--- /dev/null
+++ b/src/emu/bus/a8sio/a8sio.c
@@ -0,0 +1,220 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol
+/***************************************************************************
+
+ a8sio.h - Atari 8 bit SIO bus interface
+
+
+ 1 1
+ 2 4 6 8 0 2
+ +-----------+
+ / o o o o o o \
+ / o o o o o o o \
+ +-----------------+
+ 1 3 5 7 9 1 1
+ 1 3
+
+ 1 - clock in (to computer)
+ 2 - clock out
+ 3 - data in
+ 4 - GND
+ 5 - data out
+ 6 - GND
+ 7 - command (active low)
+ 8 - motor
+ 9 - proceed (active low)
+ 10 - +5V/ready
+ 11 - audio in
+ 12 - +12V (A400/A800)
+ 13 - interrupt (active low)
+
+***************************************************************************/
+
+#include "emu.h"
+#include "a8sio.h"
+#include "cassette.h"
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type A8SIO_SLOT = &device_creator<a8sio_slot_device>;
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// a8sio_slot_device - constructor
+//-------------------------------------------------
+a8sio_slot_device::a8sio_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, A8SIO_SLOT, "Atari 8 bit SIO Slot", tag, owner, clock, "a8sio_slot", __FILE__)
+ , device_slot_interface(mconfig, *this)
+{
+}
+
+a8sio_slot_device::a8sio_slot_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ device_slot_interface(mconfig, *this)
+{
+}
+
+void a8sio_slot_device::static_set_a8sio_slot(device_t &device, const char *tag, const char *slottag)
+{
+ a8sio_slot_device &a8sio_ext = dynamic_cast<a8sio_slot_device &>(device);
+ a8sio_ext.m_a8sio_tag = tag;
+ a8sio_ext.m_a8sio_slottag = slottag;
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void a8sio_slot_device::device_start()
+{
+ device_a8sio_card_interface *dev = dynamic_cast<device_a8sio_card_interface *>(get_card_device());
+
+ if (dev)
+ {
+ device_a8sio_card_interface::static_set_a8sio_tag(*dev, m_a8sio_tag, m_a8sio_slottag);
+ }
+}
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type A8SIO = &device_creator<a8sio_device>;
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// a8sio_device - constructor
+//-------------------------------------------------
+
+a8sio_device::a8sio_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, A8SIO, "Atari 8 biot SIO", tag, owner, clock, "a8sio", __FILE__)
+ , m_out_clock_in_cb(*this)
+ , m_out_data_in_cb(*this)
+ , m_out_audio_in_cb(*this)
+{
+}
+
+a8sio_device::a8sio_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source)
+ , m_out_clock_in_cb(*this)
+ , m_out_data_in_cb(*this)
+ , m_out_audio_in_cb(*this)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void a8sio_device::device_start()
+{
+ // resolve callbacks
+ m_out_clock_in_cb.resolve_safe();
+ m_out_data_in_cb.resolve_safe();
+ m_out_audio_in_cb.resolve_safe();
+
+ // clear slot
+ m_device = NULL;
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void a8sio_device::device_reset()
+{
+}
+
+device_a8sio_card_interface *a8sio_device::get_a8sio_card()
+{
+ return m_device;
+}
+
+void a8sio_device::add_a8sio_card(device_a8sio_card_interface *card)
+{
+ m_device = card;
+}
+
+WRITE_LINE_MEMBER( a8sio_device::clock_in_w )
+{
+ m_out_clock_in_cb(state);
+}
+
+WRITE_LINE_MEMBER( a8sio_device::data_in_w )
+{
+ m_out_data_in_cb(state);
+}
+
+WRITE_LINE_MEMBER( a8sio_device::motor_w )
+{
+ if (m_device)
+ {
+ m_device->motor_w(state);
+ }
+}
+
+WRITE8_MEMBER( a8sio_device::audio_in_w )
+{
+ m_out_audio_in_cb(data);
+}
+
+
+//**************************************************************************
+// DEVICE A8SIO CARD INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_a8sio_card_interface - constructor
+//-------------------------------------------------
+
+device_a8sio_card_interface::device_a8sio_card_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+ , m_a8sio(NULL)
+ , m_a8sio_tag(NULL)
+{
+}
+
+
+//-------------------------------------------------
+// ~device_a8sio_card_interface - destructor
+//-------------------------------------------------
+
+device_a8sio_card_interface::~device_a8sio_card_interface()
+{
+}
+
+void device_a8sio_card_interface::static_set_a8sio_tag(device_t &device, const char *tag, const char *slottag)
+{
+ device_a8sio_card_interface &a8sio_card = dynamic_cast<device_a8sio_card_interface &>(device);
+ a8sio_card.m_a8sio_tag = tag;
+ a8sio_card.m_a8sio_slottag = slottag;
+}
+
+void device_a8sio_card_interface::set_a8sio_device()
+{
+ m_a8sio = dynamic_cast<a8sio_device *>(device().machine().device(m_a8sio_tag));
+ m_a8sio->add_a8sio_card(this);
+}
+
+WRITE_LINE_MEMBER( device_a8sio_card_interface::motor_w )
+{
+ //printf("device_a8sio_card_interface::motor_w %d\n", state);
+}
+
+
+SLOT_INTERFACE_START(a8sio_cards)
+ SLOT_INTERFACE("cassette", A8SIO_CASSETTE)
+SLOT_INTERFACE_END
+
diff --git a/src/emu/bus/a8sio/a8sio.h b/src/emu/bus/a8sio/a8sio.h
new file mode 100644
index 00000000000..ffe305ffd17
--- /dev/null
+++ b/src/emu/bus/a8sio/a8sio.h
@@ -0,0 +1,141 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol
+/***************************************************************************
+
+ a8sio.h - Atari 8 bit SIO bus interface
+
+
+ 1 1
+ 2 4 6 8 0 2
+ +-----------+
+ / o o o o o o \
+ / o o o o o o o \
+ +-----------------+
+ 1 3 5 7 9 1 1
+ 1 3
+
+ 1 - clock in (to computer)
+ 2 - clock out
+ 3 - data in
+ 4 - GND
+ 5 - data out
+ 6 - GND
+ 7 - command (active low)
+ 8 - motor
+ 9 - proceed (active low)
+ 10 - +5V/ready
+ 11 - audio in
+ 12 - +12V (A400/A800)
+ 13 - interrupt (active low)
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __A8SIO_H_
+#define __A8SIO_H_
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_A8SIO_SLOT_ADD(_nbtag, _tag, _def_slot) \
+ MCFG_DEVICE_ADD(_tag, A8SIO_SLOT, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(a8sio_cards, _def_slot, false) \
+ a8sio_slot_device::static_set_a8sio_slot(*device, _nbtag, _tag);
+
+
+class a8sio_slot_device : public device_t,
+ public device_slot_interface
+{
+public:
+ // construction/destruction
+ a8sio_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ a8sio_slot_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+
+ // device-level overrides
+ virtual void device_start();
+
+ // inline configuration
+ static void static_set_a8sio_slot(device_t &device, const char *tag, const char *slottag);
+
+protected:
+ // configuration
+ const char *m_a8sio_tag;
+ const char *m_a8sio_slottag;
+};
+
+
+// device type definition
+extern const device_type A8SIO_SLOT;
+
+
+class device_a8sio_card_interface;
+
+class a8sio_device : public device_t
+{
+public:
+ // construction/destruction
+ a8sio_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ a8sio_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+
+ // inline configuration
+ template<class _Object> static devcb_base &set_clock_in_callback(device_t &device, _Object object) { return downcast<a8sio_device &>(device).m_out_clock_in_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_data_in_callback(device_t &device, _Object object) { return downcast<a8sio_device &>(device).m_out_data_in_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_audio_in_callback(device_t &device, _Object object) { return downcast<a8sio_device &>(device).m_out_audio_in_cb.set_callback(object); }
+
+ void add_a8sio_card(device_a8sio_card_interface *card);
+ device_a8sio_card_interface *get_a8sio_card();
+
+ DECLARE_WRITE_LINE_MEMBER( clock_in_w ); // pin 1
+ //virtual DECLARE_WRITE_LINE_MEMBER( clock_out_w ); // pin 2
+ DECLARE_WRITE_LINE_MEMBER( data_in_w ); // pin 3
+ //DECLARE_WRITE_LINE_MEMBER( data_out_wi ); // pin 5
+ //DECLARE_WRITE_LINE_MEMBER( command_w ); // pin 7
+ DECLARE_WRITE_LINE_MEMBER( motor_w ); // pin 8
+ //DECLARE_WRITE_LINE_MEMBER( proceed_w ); // pin 9
+ DECLARE_WRITE8_MEMBER( audio_in_w ); // pin 11
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ devcb_write_line m_out_clock_in_cb; // pin 1
+ devcb_write_line m_out_data_in_cb; // pin 3
+ devcb_write8 m_out_audio_in_cb; // pin 11
+
+ device_a8sio_card_interface *m_device;
+};
+
+
+// device type definition
+extern const device_type A8SIO;
+
+
+class device_a8sio_card_interface : public device_slot_card_interface
+{
+ friend class a8sio_device;
+public:
+ // construction/destruction
+ device_a8sio_card_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_a8sio_card_interface();
+
+ void set_a8sio_device();
+
+ // inline configuration
+ static void static_set_a8sio_tag(device_t &device, const char *tag, const char *slottag);
+
+ virtual DECLARE_WRITE_LINE_MEMBER( motor_w );
+
+public:
+ a8sio_device *m_a8sio;
+ const char *m_a8sio_tag;
+ const char *m_a8sio_slottag;
+};
+
+
+SLOT_INTERFACE_EXTERN(a8sio_cards);
+
+#endif
diff --git a/src/emu/bus/a8sio/cassette.c b/src/emu/bus/a8sio/cassette.c
new file mode 100644
index 00000000000..395633b2e36
--- /dev/null
+++ b/src/emu/bus/a8sio/cassette.c
@@ -0,0 +1,72 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol
+/***************************************************************************
+
+ cassette.h - Atari 8 bit cassette player(s)
+
+
+Known cassette players:
+- Atari XC11
+- Atari XC12 (no SIO connection for an additional device)
+
+TODO:
+- Implement cassette reading
+- Implement cassette writing
+- Add audio support
+- Add SIO connector for a next device
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cassette.h"
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type A8SIO_CASSETTE = &device_creator<a8sio_cassette_device>;
+
+static MACHINE_CONFIG_FRAGMENT( cassette )
+ MCFG_CASSETTE_ADD("cassette")
+ MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
+ MCFG_CASSETTE_INTERFACE("atari8bit_cass")
+MACHINE_CONFIG_END
+
+machine_config_constructor a8sio_cassette_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( cassette );
+}
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+a8sio_cassette_device::a8sio_cassette_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, A8SIO_CASSETTE, "Atari 8 bit cassette", tag, owner, clock, "a8sio_cass", __FILE__)
+ , device_a8sio_card_interface(mconfig, *this)
+ , m_cassette(*this, "cassette")
+{
+}
+
+a8sio_cassette_device::a8sio_cassette_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source)
+ , device_a8sio_card_interface(mconfig, *this)
+ , m_cassette(*this, "cassette")
+{
+}
+
+void a8sio_cassette_device::device_start()
+{
+ set_a8sio_device();
+}
+
+void a8sio_cassette_device::device_reset()
+{
+}
+
+WRITE_LINE_MEMBER( a8sio_cassette_device::motor_w )
+{
+ //printf("a8sio_cassette::motor_w %d\n", state);
+}
+
diff --git a/src/emu/bus/a8sio/cassette.h b/src/emu/bus/a8sio/cassette.h
new file mode 100644
index 00000000000..6388c16d196
--- /dev/null
+++ b/src/emu/bus/a8sio/cassette.h
@@ -0,0 +1,49 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol
+/***************************************************************************
+
+ cassette.h - Atari 8 bit cassette player(s)
+
+
+Known cassette players:
+- Atari XC11
+- Atari XC12 (no SIO connection for an additional device)
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __A8SIO_CASSETTE_H_
+#define __A8SIO_CASSETTE_H_
+
+
+#include "a8sio.h"
+#include "imagedev/cassette.h"
+
+
+class a8sio_cassette_device
+ : public device_t
+ , public device_a8sio_card_interface
+{
+public:
+ // construction/destruction
+ a8sio_cassette_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ a8sio_cassette_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const;
+
+ virtual DECLARE_WRITE_LINE_MEMBER( motor_w );
+
+protected:
+ virtual void device_start();
+ virtual void device_reset();
+
+ required_device<cassette_image_device> m_cassette;
+};
+
+// device type definition
+extern const device_type A8SIO_CASSETTE;
+
+
+#endif
diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak
index dceb9529df7..0c6f5484174 100644
--- a/src/emu/bus/bus.mak
+++ b/src/emu/bus/bus.mak
@@ -45,6 +45,18 @@ endif
#-------------------------------------------------
#
+#@src/emu/bus/a8sio/a8sio.h,BUSES += A8SIO
+#-------------------------------------------------
+
+ifneq ($(filter A8SIO,$(BUSES)),)
+OBJDIRS += $(BUSOBJ)/a8sio
+BUSOBJS += $(BUSOBJ)/a8sio/a8sio.o
+BUSOBJS += $(BUSOBJ)/a8sio/cassette.o
+endif
+
+
+#-------------------------------------------------
+#
#@src/emu/bus/abcbus/abcbus.h,BUSES += ABCBUS
#-------------------------------------------------
diff --git a/src/mess/drivers/atari400.c b/src/mess/drivers/atari400.c
index 5cd907f2368..9ffbf09ec93 100644
--- a/src/mess/drivers/atari400.c
+++ b/src/mess/drivers/atari400.c
@@ -48,6 +48,7 @@
#include "machine/atarifdc.h"
#include "bus/a800/a800_slot.h"
#include "bus/a800/a800_carts.h"
+#include "bus/a8sio/a8sio.h"
/******************************************************************************
@@ -2075,6 +2076,7 @@ WRITE8_MEMBER(a400_state::a800xl_pia_pb_w)
*
**************************************************************/
+
static MACHINE_CONFIG_START( atari_common_nodac, a400_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6502, FREQ_17_EXACT)
@@ -2094,8 +2096,12 @@ static MACHINE_CONFIG_START( atari_common_nodac, a400_state )
MCFG_DEVICE_ADD("pia", PIA6821, 0)
MCFG_PIA_READPA_HANDLER(IOPORT("djoy_0_1"))
MCFG_PIA_READPB_HANDLER(IOPORT("djoy_2_3"))
+ MCFG_PIA_CA2_HANDLER(DEVWRITELINE("a8sio", a8sio_device, motor_w))
MCFG_PIA_CB2_HANDLER(DEVWRITELINE("fdc", atari_fdc_device, pia_cb2_w))
+ MCFG_DEVICE_ADD("a8sio", A8SIO, 0)
+ MCFG_A8SIO_SLOT_ADD("a8sio", "sio", NULL)
+
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("pokey", POKEY, FREQ_17_EXACT)
diff --git a/src/mess/mess.mak b/src/mess/mess.mak
index 2c452ee535e..942c01377b8 100644
--- a/src/mess/mess.mak
+++ b/src/mess/mess.mak
@@ -570,6 +570,7 @@ BUSES += A1BUS
BUSES += A2BUS
BUSES += A7800
BUSES += A800
+BUSES += A8SIO
BUSES += ABCBUS
BUSES += ABCKB
BUSES += ADAM