6526cia: devcb2 temporarily until mos6526 works with amiga. (nw)

amigafdc: devcb2. (nw)
This commit is contained in:
Curt Coder 2014-03-25 11:33:24 +00:00
parent 83f923e463
commit 00580e6211
12 changed files with 221 additions and 385 deletions

View File

@ -77,15 +77,24 @@ inline attotime legacy_mos6526_device::cycles_to_time(int c)
//------------------------------------------------- //-------------------------------------------------
legacy_mos6526_device::legacy_mos6526_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) legacy_mos6526_device::legacy_mos6526_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_t(mconfig, type, name, tag, owner, clock, shortname, source),
m_write_irq(*this),
m_write_pc(*this),
m_write_cnt(*this),
m_write_sp(*this),
m_read_pa(*this),
m_write_pa(*this),
m_read_pb(*this),
m_write_pb(*this),
m_tod_clock(0)
{ {
} }
legacy_mos6526r1_device::legacy_mos6526r1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) legacy_mos6526r1_device::legacy_mos6526r1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: legacy_mos6526_device(mconfig, LEGACY_MOS6526R1, "MOS6526r1", tag, owner, clock, "legacy_mos6526r1", __FILE__) { } : legacy_mos6526_device(mconfig, LEGACY_MOS6526R1, "LEGACY_MOS6526R1", tag, owner, clock, "legacy_mos6526r1", __FILE__) { }
legacy_mos6526r2_device::legacy_mos6526r2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) legacy_mos6526r2_device::legacy_mos6526r2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: legacy_mos6526_device(mconfig, LEGACY_MOS6526R2, "MOS6526r2", tag, owner, clock, "legacy_mos6526r2", __FILE__) { } : legacy_mos6526_device(mconfig, LEGACY_MOS6526R2, "LEGACY_MOS6526R2", tag, owner, clock, "legacy_mos6526r2", __FILE__) { }
legacy_mos8520_device::legacy_mos8520_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) legacy_mos8520_device::legacy_mos8520_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: legacy_mos6526_device(mconfig, LEGACY_MOS8520, "LEGACY_MOS8520", tag, owner, clock, "legacy_mos8520", __FILE__) { } : legacy_mos6526_device(mconfig, LEGACY_MOS8520, "LEGACY_MOS8520", tag, owner, clock, "legacy_mos8520", __FILE__) { }
@ -94,14 +103,6 @@ legacy_mos5710_device::legacy_mos5710_device(const machine_config &mconfig, cons
: legacy_mos6526_device(mconfig, LEGACY_MOS5710, "LEGACY_MOS5710", tag, owner, clock, "legacy_mos5710", __FILE__) { } : legacy_mos6526_device(mconfig, LEGACY_MOS5710, "LEGACY_MOS5710", tag, owner, clock, "legacy_mos5710", __FILE__) { }
void legacy_mos6526_device::static_set_tod_clock(device_t &device, int tod_clock)
{
legacy_mos6526_device &cia = dynamic_cast<legacy_mos6526_device &>(device);
cia.m_tod_clock = tod_clock;
}
//------------------------------------------------- //-------------------------------------------------
// device_reset - device-specific reset // device_reset - device-specific reset
//------------------------------------------------- //-------------------------------------------------
@ -148,53 +149,26 @@ void legacy_mos6526_device::device_reset()
} }
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------
void legacy_mos6526_device::device_config_complete()
{
// inherit a copy of the static data
const legacy_mos6526_interface *intf = reinterpret_cast<const legacy_mos6526_interface *>(static_config());
if (intf != NULL)
*static_cast<legacy_mos6526_interface *>(this) = *intf;
// or initialize to defaults if none provided
else
{
memset(&m_out_irq_cb, 0, sizeof(m_out_irq_cb));
memset(&m_out_pc_cb, 0, sizeof(m_out_pc_cb));
memset(&m_out_cnt_cb, 0, sizeof(m_out_cnt_cb));
memset(&m_out_sp_cb, 0, sizeof(m_out_sp_cb));
memset(&m_in_pa_cb, 0, sizeof(m_in_pa_cb));
memset(&m_out_pa_cb, 0, sizeof(m_out_pa_cb));
memset(&m_in_pb_cb, 0, sizeof(m_in_pb_cb));
memset(&m_out_pb_cb, 0, sizeof(m_out_pb_cb));
}
}
//------------------------------------------------- //-------------------------------------------------
// device_start - device-specific startup // device_start - device-specific startup
//------------------------------------------------- //-------------------------------------------------
void legacy_mos6526_device::device_start() void legacy_mos6526_device::device_start()
{ {
// resolve callbacks
m_write_irq.resolve_safe();
m_write_pc.resolve_safe();
m_write_cnt.resolve_safe();
m_write_sp.resolve_safe();
m_read_pa.resolve_safe(0xff);
m_write_pa.resolve_safe();
m_read_pb.resolve_safe(0xff);
m_write_pb.resolve_safe();
/* clear out CIA structure, and copy the interface */ /* clear out CIA structure, and copy the interface */
m_out_irq_func.resolve(m_out_irq_cb, *this);
m_out_pc_func.resolve(m_out_pc_cb, *this);
m_out_cnt_func.resolve(m_out_cnt_cb, *this);
m_out_sp_func.resolve(m_out_sp_cb, *this);
m_flag = 1; m_flag = 1;
/* setup ports */ /* setup ports */
m_port[0].m_read.resolve(m_in_pa_cb, *this);
m_port[0].m_write.resolve(m_out_pa_cb, *this);
m_port[1].m_read.resolve(m_in_pb_cb, *this);
m_port[1].m_write.resolve(m_out_pb_cb, *this);
for (int p = 0; p < (sizeof(m_port) / sizeof(m_port[0])); p++) for (int p = 0; p < (sizeof(m_port) / sizeof(m_port[0])); p++)
{ {
m_port[p].m_mask_value = 0xff; m_port[p].m_mask_value = 0xff;
@ -263,7 +237,7 @@ void legacy_mos6526_device::device_timer(emu_timer &timer, device_timer_id id, i
switch (id) switch (id)
{ {
case TIMER_PC: case TIMER_PC:
m_out_pc_func(1); m_write_pc(1);
break; break;
case TIMER_TOD: case TIMER_TOD:
@ -288,7 +262,7 @@ void legacy_mos6526_device::set_port_mask_value(int port, int data)
void legacy_mos6526_device::update_pc() void legacy_mos6526_device::update_pc()
{ {
m_out_pc_func(0); m_write_pc(0);
m_pc_timer->adjust(cycles_to_time(1)); m_pc_timer->adjust(cycles_to_time(1));
} }
@ -316,7 +290,7 @@ void legacy_mos6526_device::update_interrupts()
if (m_irq != new_irq) if (m_irq != new_irq)
{ {
m_irq = new_irq; m_irq = new_irq;
m_out_irq_func(m_irq); m_write_irq(m_irq);
} }
} }
@ -389,11 +363,11 @@ void legacy_mos6526_device::timer_underflow(int timer)
/* transmit MSB */ /* transmit MSB */
m_sp = BIT(m_serial, 7); m_sp = BIT(m_serial, 7);
m_out_sp_func(m_sp); m_write_sp(m_sp);
/* toggle CNT */ /* toggle CNT */
m_cnt = !m_cnt; m_cnt = !m_cnt;
m_out_cnt_func(m_cnt); m_write_cnt(m_cnt);
/* shift data */ /* shift data */
m_serial <<= 1; m_serial <<= 1;
@ -410,7 +384,7 @@ void legacy_mos6526_device::timer_underflow(int timer)
{ {
/* toggle CNT */ /* toggle CNT */
m_cnt = !m_cnt; m_cnt = !m_cnt;
m_out_cnt_func(m_cnt); m_write_cnt(m_cnt);
if (m_shift == 8) if (m_shift == 8)
{ {
@ -609,7 +583,7 @@ UINT8 legacy_mos6526_device::reg_r(UINT8 offset)
case CIA_PRA: case CIA_PRA:
case CIA_PRB: case CIA_PRB:
port = &m_port[offset & 1]; port = &m_port[offset & 1];
data = port->m_read(0); data = (offset & 1) ? m_read_pb(0) : m_read_pa(0);
data = ((data & ~port->m_ddr) | (port->m_latch & port->m_ddr)) & port->m_mask_value; data = ((data & ~port->m_ddr) | (port->m_latch & port->m_ddr)) & port->m_mask_value;
port->m_in = data; port->m_in = data;
@ -749,7 +723,10 @@ void legacy_mos6526_device::reg_w(UINT8 offset, UINT8 data)
port = &m_port[offset & 1]; port = &m_port[offset & 1];
port->m_latch = data; port->m_latch = data;
port->m_out = (data & port->m_ddr) | (port->m_in & ~port->m_ddr); port->m_out = (data & port->m_ddr) | (port->m_in & ~port->m_ddr);
port->m_write(0, port->m_out); if (offset & 1)
m_write_pb((offs_t)0, port->m_out);
else
m_write_pa((offs_t)0, port->m_out);
/* pulse /PC following the write */ /* pulse /PC following the write */
if (offset == CIA_PRB) if (offset == CIA_PRB)

View File

@ -1,4 +1,8 @@
/********************************************************************** /**********************************************************************
WARNING: DO NOT USE! WILL BE REMOVED IN FAVOR OF machine/mos6526.h
**********************************************************************
MOS 6526/8520 Complex Interface Adapter emulation MOS 6526/8520 Complex Interface Adapter emulation
@ -43,32 +47,32 @@
// INTERFACE CONFIGURATION MACROS // INTERFACE CONFIGURATION MACROS
//************************************************************************** //**************************************************************************
#define MCFG_LEGACY_MOS6526R1_ADD(_tag, _clock, _tod_clock, _config) \ #define MCFG_MOS6526_TOD(_clock) \
MCFG_DEVICE_ADD(_tag, LEGACY_MOS6526R1, _clock) \ legacy_mos6526_device::static_set_tod_clock(*device, _clock);
MCFG_DEVICE_CONFIG(_config) \
legacy_mos6526_device::static_set_tod_clock(*device, _tod_clock);
#define MCFG_LEGACY_MOS6526R2_ADD(_tag, _clock, _tod_clock, _config) \ #define MCFG_MOS6526_IRQ_CALLBACK(_write) \
MCFG_DEVICE_ADD(_tag, LEGACY_MOS6526R2, _clock) \ devcb = &legacy_mos6526_device::set_irq_wr_callback(*device, DEVCB2_##_write);
MCFG_DEVICE_CONFIG(_config) \
legacy_mos6526_device::static_set_tod_clock(*device, _tod_clock);
#define MCFG_LEGACY_MOS8520_ADD(_tag, _clock, _tod_clock, _config) \ #define MCFG_MOS6526_CNT_CALLBACK(_write) \
MCFG_DEVICE_ADD(_tag, LEGACY_MOS8520, _clock) \ devcb = &legacy_mos6526_device::set_cnt_wr_callback(*device, DEVCB2_##_write);
MCFG_DEVICE_CONFIG(_config) \
legacy_mos6526_device::static_set_tod_clock(*device, _tod_clock);
#define MCFG_LEGACY_MOS5710_ADD(_tag, _clock, _tod_clock, _config) \ #define MCFG_MOS6526_SP_CALLBACK(_write) \
MCFG_DEVICE_ADD(_tag, LEGACY_MOS5710, _clock) \ devcb = &legacy_mos6526_device::set_sp_wr_callback(*device, DEVCB2_##_write);
MCFG_DEVICE_CONFIG(_config) \
legacy_mos6526_device::static_set_tod_clock(*device, _tod_clock);
#define MCFG_MOS6526_PA_INPUT_CALLBACK(_read) \
devcb = &legacy_mos6526_device::set_pa_rd_callback(*device, DEVCB2_##_read);
#define LEGACY_MOS6526_INTERFACE(name) \ #define MCFG_MOS6526_PA_OUTPUT_CALLBACK(_write) \
const legacy_mos6526_interface (name)= devcb = &legacy_mos6526_device::set_pa_wr_callback(*device, DEVCB2_##_write);
#define LEGACY_MOS8520_INTERFACE(name) \ #define MCFG_MOS6526_PB_INPUT_CALLBACK(_read) \
const legacy_mos6526_interface (name)= devcb = &legacy_mos6526_device::set_pb_rd_callback(*device, DEVCB2_##_read);
#define MCFG_MOS6526_PB_OUTPUT_CALLBACK(_write) \
devcb = &legacy_mos6526_device::set_pb_wr_callback(*device, DEVCB2_##_write);
#define MCFG_MOS6526_PC_CALLBACK(_write) \
devcb = &legacy_mos6526_device::set_pc_wr_callback(*device, DEVCB2_##_write);
@ -76,37 +80,24 @@
TYPE DEFINITIONS TYPE DEFINITIONS
***************************************************************************/ ***************************************************************************/
// ======================> legacy_mos6526_interface
struct legacy_mos6526_interface
{
devcb_write_line m_out_irq_cb;
devcb_write_line m_out_pc_cb;
devcb_write_line m_out_cnt_cb;
devcb_write_line m_out_sp_cb;
devcb_read8 m_in_pa_cb;
devcb_write8 m_out_pa_cb;
devcb_read8 m_in_pb_cb;
devcb_write8 m_out_pb_cb;
};
// ======================> legacy_mos6526_device // ======================> legacy_mos6526_device
class legacy_mos6526_device : public device_t, class legacy_mos6526_device : public device_t
public legacy_mos6526_interface
{ {
protected: public:
// construction/destruction // construction/destruction
legacy_mos6526_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); legacy_mos6526_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);
public: static void static_set_tod_clock(device_t &device, int clock) { downcast<legacy_mos6526_device &>(device).m_tod_clock = clock; }
// inline configuration
static void static_set_tod_clock(device_t &device, int tod_clock); template<class _Object> static devcb2_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast<legacy_mos6526_device &>(device).m_write_irq.set_callback(object); }
template<class _Object> static devcb2_base &set_cnt_wr_callback(device_t &device, _Object object) { return downcast<legacy_mos6526_device &>(device).m_write_sp.set_callback(object); }
template<class _Object> static devcb2_base &set_sp_wr_callback(device_t &device, _Object object) { return downcast<legacy_mos6526_device &>(device).m_write_cnt.set_callback(object); }
template<class _Object> static devcb2_base &set_pa_rd_callback(device_t &device, _Object object) { return downcast<legacy_mos6526_device &>(device).m_read_pa.set_callback(object); }
template<class _Object> static devcb2_base &set_pa_wr_callback(device_t &device, _Object object) { return downcast<legacy_mos6526_device &>(device).m_write_pa.set_callback(object); }
template<class _Object> static devcb2_base &set_pb_rd_callback(device_t &device, _Object object) { return downcast<legacy_mos6526_device &>(device).m_read_pb.set_callback(object); }
template<class _Object> static devcb2_base &set_pb_wr_callback(device_t &device, _Object object) { return downcast<legacy_mos6526_device &>(device).m_write_pb.set_callback(object); }
template<class _Object> static devcb2_base &set_pc_wr_callback(device_t &device, _Object object) { return downcast<legacy_mos6526_device &>(device).m_write_pc.set_callback(object); }
DECLARE_READ8_MEMBER( read ); DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write ); DECLARE_WRITE8_MEMBER( write );
@ -119,30 +110,29 @@ public:
UINT8 pb_r(UINT8 offset) { return (m_port[1].m_latch | ~m_port[1].m_ddr); } UINT8 pb_r(UINT8 offset) { return (m_port[1].m_latch | ~m_port[1].m_ddr); }
/* interrupt request */ /* interrupt request */
UINT8 irq_r() { return m_irq; } DECLARE_READ_LINE_MEMBER( irq_r ) { return m_irq; }
/* time of day clock */ /* time of day clock */
void tod_w(UINT8 state) { if(state) clock_tod(); } DECLARE_WRITE_LINE_MEMBER( tod_w ) { if(state) clock_tod(); }
/* serial counter */ /* serial counter */
UINT8 cnt_r() { return m_cnt; } DECLARE_READ_LINE_MEMBER( cnt_r ) { return m_cnt; }
void cnt_w(UINT8 state); void cnt_w(UINT8 state);
DECLARE_WRITE_LINE_MEMBER( cnt_w ) { cnt_w(state); } DECLARE_WRITE_LINE_MEMBER( cnt_w ) { cnt_w(state); }
/* serial port */ /* serial port */
UINT8 sp_r() { return m_sp; } DECLARE_READ_LINE_MEMBER( sp_r ) { return m_sp; }
void sp_w(UINT8 state) { m_sp = state; } DECLARE_WRITE_LINE_MEMBER( sp_w ) { m_sp = state; }
DECLARE_WRITE_LINE_MEMBER( sp_w ) { sp_w(state); }
/* flag */ /* flag */
void flag_w(UINT8 state); void flag_w(UINT8 state);
DECLARE_WRITE_LINE_MEMBER( flag_w ) { flag_w(state); }
/* port mask */ /* port mask */
void set_port_mask_value(int port, int data); void set_port_mask_value(int port, int data);
protected: protected:
// device-level overrides // device-level overrides
virtual void device_config_complete();
virtual void device_start(); virtual void device_start();
virtual void device_reset(); virtual void device_reset();
virtual void device_post_load() { } virtual void device_post_load() { }
@ -186,19 +176,22 @@ private:
struct cia_port struct cia_port
{ {
public:
UINT8 m_ddr; UINT8 m_ddr;
UINT8 m_latch; UINT8 m_latch;
UINT8 m_in; UINT8 m_in;
UINT8 m_out; UINT8 m_out;
devcb_resolved_read8 m_read;
devcb_resolved_write8 m_write;
UINT8 m_mask_value; /* in READ operation the value can be forced by a extern electric circuit */ UINT8 m_mask_value; /* in READ operation the value can be forced by a extern electric circuit */
}; };
devcb_resolved_write_line m_out_irq_func; devcb2_write_line m_write_irq;
devcb_resolved_write_line m_out_pc_func; devcb2_write_line m_write_pc;
devcb_resolved_write_line m_out_cnt_func; devcb2_write_line m_write_cnt;
devcb_resolved_write_line m_out_sp_func; devcb2_write_line m_write_sp;
devcb2_read8 m_read_pa;
devcb2_write8 m_write_pa;
devcb2_read8 m_read_pb;
devcb2_write8 m_write_pb;
cia_port m_port[2]; cia_port m_port[2];
cia_timer m_timer[2]; cia_timer m_timer[2];
@ -255,10 +248,10 @@ public:
// device type definition // device type definition
extern const device_type LEGACY_MOS6526R1; extern const ATTR_DEPRECATED device_type LEGACY_MOS6526R1;
extern const device_type LEGACY_MOS6526R2; extern const ATTR_DEPRECATED device_type LEGACY_MOS6526R2;
extern const device_type LEGACY_MOS8520; extern const ATTR_DEPRECATED device_type LEGACY_MOS8520;
extern const device_type LEGACY_MOS5710; extern const ATTR_DEPRECATED device_type LEGACY_MOS5710;
@ -266,28 +259,6 @@ extern const device_type LEGACY_MOS5710;
FUNCTION PROTOTYPES FUNCTION PROTOTYPES
***************************************************************************/ ***************************************************************************/
/* register access */
DECLARE_READ8_DEVICE_HANDLER( mos6526_r );
DECLARE_WRITE8_DEVICE_HANDLER( mos6526_w );
/* port access */
DECLARE_READ8_DEVICE_HANDLER( mos6526_pa_r );
DECLARE_READ8_DEVICE_HANDLER( mos6526_pb_r );
/* interrupt request */
READ_LINE_DEVICE_HANDLER( mos6526_irq_r );
/* time of day clock */
WRITE_LINE_DEVICE_HANDLER( mos6526_tod_w );
/* serial counter */
READ_LINE_DEVICE_HANDLER( mos6526_cnt_r );
WRITE_LINE_DEVICE_HANDLER( mos6526_cnt_w );
/* serial port */
READ_LINE_DEVICE_HANDLER( mos6526_sp_r );
WRITE_LINE_DEVICE_HANDLER( mos6526_sp_w );
/* port mask */ /* port mask */
void cia_set_port_mask_value(device_t *device, int port, int data); void cia_set_port_mask_value(device_t *device, int port, int data);

View File

@ -1,6 +1,6 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders:Olivier Galibert // copyright-holders:Olivier Galibert
/****************************************************f*********************** /***************************************************************************
Amiga floppy disk controller emulation Amiga floppy disk controller emulation
@ -19,12 +19,15 @@ FLOPPY_FORMATS_MEMBER( amiga_fdc::floppy_formats )
FLOPPY_FORMATS_END FLOPPY_FORMATS_END
amiga_fdc::amiga_fdc(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : amiga_fdc::amiga_fdc(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, AMIGA_FDC, "Amiga FDC", tag, owner, clock, "amiga_fdc", __FILE__) device_t(mconfig, AMIGA_FDC, "Amiga FDC", tag, owner, clock, "amiga_fdc", __FILE__),
m_write_index(*this)
{ {
} }
void amiga_fdc::device_start() void amiga_fdc::device_start()
{ {
m_write_index.resolve_safe();
static const char *names[] = { "0", "1", "2", "3" }; static const char *names[] = { "0", "1", "2", "3" };
for(int i=0; i != 4; i++) { for(int i=0; i != 4; i++) {
floppy_connector *con = subdevice<floppy_connector>(names[i]); floppy_connector *con = subdevice<floppy_connector>(names[i]);
@ -415,8 +418,7 @@ UINT8 amiga_fdc::ciaapra_r()
void amiga_fdc::index_callback(floppy_image_device *floppy, int state) void amiga_fdc::index_callback(floppy_image_device *floppy, int state)
{ {
/* Issue a index pulse when a disk revolution completes */ /* Issue a index pulse when a disk revolution completes */
legacy_mos6526_device *cia = machine().device<legacy_mos6526_device>("cia_1"); m_write_index(!state);
cia->flag_w(!state);
} }
void amiga_fdc::pll_t::set_clock(attotime period) void amiga_fdc::pll_t::set_clock(attotime period)

View File

@ -4,13 +4,15 @@
#include "emu.h" #include "emu.h"
#include "imagedev/floppy.h" #include "imagedev/floppy.h"
#define MCFG_AMIGA_FDC_ADD(_tag, _clock) \ #define MCFG_AMIGA_FDC_INDEX_CALLBACK(_write) \
MCFG_DEVICE_ADD(_tag, AMIGA_FDC, _clock) devcb = &amiga_fdc::set_index_wr_callback(*device, DEVCB2_##_write);
class amiga_fdc : public device_t { class amiga_fdc : public device_t {
public: public:
amiga_fdc(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); amiga_fdc(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
template<class _Object> static devcb2_base &set_index_wr_callback(device_t &device, _Object object) { return downcast<amiga_fdc &>(device).m_write_index.set_callback(object); }
DECLARE_WRITE8_MEMBER(ciaaprb_w); DECLARE_WRITE8_MEMBER(ciaaprb_w);
UINT8 ciaapra_r(); UINT8 ciaapra_r();
@ -73,6 +75,8 @@ private:
pll_t pll; pll_t pll;
}; };
devcb2_write_line m_write_index;
floppy_image_device *floppy; floppy_image_device *floppy;
floppy_image_device *floppy_devices[4]; floppy_image_device *floppy_devices[4];

View File

@ -413,30 +413,6 @@ INPUT_PORTS_END
* *
*************************************/ *************************************/
static const legacy_mos6526_interface cia_0_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state,amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(alg_state,alg_cia_0_porta_r),
DEVCB_DRIVER_MEMBER(alg_state,alg_cia_0_porta_w), /* port A */
DEVCB_DRIVER_MEMBER(alg_state,alg_cia_0_portb_r),
DEVCB_DRIVER_MEMBER(alg_state,alg_cia_0_portb_w) /* port B */
};
static const legacy_mos6526_interface cia_1_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state,amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(alg_state,alg_cia_1_porta_r),
DEVCB_DRIVER_MEMBER(alg_state,alg_cia_1_porta_w), /* port A */
DEVCB_NULL,
DEVCB_NULL /* port B */
};
static MACHINE_CONFIG_START( alg_r1, alg_state ) static MACHINE_CONFIG_START( alg_r1, alg_state )
/* basic machine hardware */ /* basic machine hardware */
@ -477,11 +453,20 @@ static MACHINE_CONFIG_START( alg_r1, alg_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
/* cia */ /* cia */
MCFG_LEGACY_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_0_intf) MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
MCFG_LEGACY_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_1_intf) MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(alg_state,alg_cia_0_porta_r))
MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(alg_state,alg_cia_0_porta_w))
MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(alg_state,alg_cia_0_portb_r))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(alg_state,alg_cia_0_portb_w))
MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(alg_state,alg_cia_1_porta_r))
MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(alg_state,alg_cia_1_porta_w))
/* fdc */ /* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68000_NTSC_CLOCK) MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MACHINE_CONFIG_END MACHINE_CONFIG_END

View File

@ -302,30 +302,6 @@ INPUT_PORTS_END
* *
*************************************/ *************************************/
static const legacy_mos6526_interface cia_0_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state,amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_INPUT_PORT("CIA0PORTA"),
DEVCB_DRIVER_MEMBER(arcadia_amiga_state,arcadia_cia_0_porta_w), /* port A */
DEVCB_INPUT_PORT("CIA0PORTB"),
DEVCB_DRIVER_MEMBER(arcadia_amiga_state,arcadia_cia_0_portb_w) /* port B */
};
static const legacy_mos6526_interface cia_1_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state,amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static MACHINE_CONFIG_START( arcadia, arcadia_amiga_state ) static MACHINE_CONFIG_START( arcadia, arcadia_amiga_state )
/* basic machine hardware */ /* basic machine hardware */
@ -361,11 +337,18 @@ static MACHINE_CONFIG_START( arcadia, arcadia_amiga_state )
MCFG_SOUND_ROUTE(3, "lspeaker", 0.50) MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
/* cia */ /* cia */
MCFG_LEGACY_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_0_intf) MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
MCFG_LEGACY_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_1_intf) MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
MCFG_MOS6526_PA_INPUT_CALLBACK(IOPORT("CIA0PORTA"))
MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(arcadia_amiga_state,arcadia_cia_0_porta_w))
MCFG_MOS6526_PB_INPUT_CALLBACK(IOPORT("CIA0PORTB"))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(arcadia_amiga_state,arcadia_cia_0_portb_w))
MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
/* fdc */ /* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68000_NTSC_CLOCK) MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( argh, arcadia ) static MACHINE_CONFIG_DERIVED( argh, arcadia )

View File

@ -89,7 +89,7 @@ WRITE8_MEMBER(cd32_state::cd32_cia_0_porta_w)
/* bit 2 = Power Led on Amiga */ /* bit 2 = Power Led on Amiga */
set_led_status(machine(), 0, (data & 2) ? 0 : 1); set_led_status(machine(), 0, (data & 2) ? 0 : 1);
handle_cd32_joystick_cia(machine(), data, mos6526_r(m_cia_0, space, 2)); handle_cd32_joystick_cia(machine(), data, m_cia_0->read(space, 2));
} }
/************************************* /*************************************
@ -736,30 +736,6 @@ INPUT_PORTS_END
* *
*************************************/ *************************************/
static const legacy_mos6526_interface cia_0_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state,amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_INPUT_PORT("CIA0PORTA"),
DEVCB_DRIVER_MEMBER(cd32_state,cd32_cia_0_porta_w), /* port A */
DEVCB_DRIVER_MEMBER(cd32_state,cd32_cia_0_portb_r),
DEVCB_DRIVER_MEMBER(cd32_state,cd32_cia_0_portb_w) /* port B */
};
static const legacy_mos6526_interface cia_1_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state,amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
#define NVRAM_SIZE 1024 #define NVRAM_SIZE 1024
#define NVRAM_PAGE_SIZE 16 /* max size of one write request */ #define NVRAM_PAGE_SIZE 16 /* max size of one write request */
@ -803,13 +779,20 @@ static MACHINE_CONFIG_START( cd32base, cd32_state )
/* cia */ /* cia */
// these are setup differently on other amiga drivers (needed for floppy to work) which is correct / why? // these are setup differently on other amiga drivers (needed for floppy to work) which is correct / why?
MCFG_LEGACY_MOS8520_ADD("cia_0", AMIGA_68EC020_PAL_CLOCK / 10, 0, cia_0_intf) MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68EC020_PAL_CLOCK / 10)
MCFG_LEGACY_MOS8520_ADD("cia_1", AMIGA_68EC020_PAL_CLOCK / 10, 0, cia_1_intf) MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
MCFG_MOS6526_PA_INPUT_CALLBACK(IOPORT("CIA0PORTA"))
MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(cd32_state,cd32_cia_0_porta_w))
MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(cd32_state,cd32_cia_0_portb_r))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(cd32_state,cd32_cia_0_portb_w))
MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68EC020_PAL_CLOCK / 10)
MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
MCFG_MICROTOUCH_ADD( "microtouch", WRITE8(cd32_state, microtouch_tx) ) MCFG_MICROTOUCH_ADD( "microtouch", WRITE8(cd32_state, microtouch_tx) )
/* fdc */ /* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68000_NTSC_CLOCK) MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MACHINE_CONFIG_END MACHINE_CONFIG_END
struct cdrom_interface cd32_cdrom = struct cdrom_interface cd32_cdrom =

View File

@ -353,30 +353,6 @@ MACHINE_RESET_MEMBER(mquake_state,mquake)
* *
*************************************/ *************************************/
static const legacy_mos6526_interface cia_0_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state,amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_INPUT_PORT("CIA0PORTA"),
DEVCB_DRIVER_MEMBER(mquake_state,mquake_cia_0_porta_w), /* port A */
DEVCB_DRIVER_MEMBER(mquake_state,mquake_cia_0_portb_r),
DEVCB_DRIVER_MEMBER(mquake_state,mquake_cia_0_portb_w) /* port B */
};
static const legacy_mos6526_interface cia_1_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state,amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static MACHINE_CONFIG_START( mquake, mquake_state ) static MACHINE_CONFIG_START( mquake, mquake_state )
/* basic machine hardware */ /* basic machine hardware */
@ -418,11 +394,18 @@ static MACHINE_CONFIG_START( mquake, mquake_state )
MCFG_SOUND_ROUTE(0, "rspeaker", 0.50) MCFG_SOUND_ROUTE(0, "rspeaker", 0.50)
/* cia */ /* cia */
MCFG_LEGACY_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_0_intf) MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
MCFG_LEGACY_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_1_intf) MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
MCFG_MOS6526_PA_INPUT_CALLBACK(IOPORT("CIA0PORTA"))
MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(mquake_state,mquake_cia_0_porta_w))
MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(mquake_state,mquake_cia_0_portb_r))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(mquake_state,mquake_cia_0_portb_w))
MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
/* fdc */ /* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68000_NTSC_CLOCK) MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MACHINE_CONFIG_END MACHINE_CONFIG_END

View File

@ -283,30 +283,6 @@ INPUT_PORTS_END
* *
*************************************/ *************************************/
static const legacy_mos6526_interface cia_0_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state,amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(upscope_state,upscope_cia_0_porta_w), /* port A */
DEVCB_DRIVER_MEMBER(upscope_state,upscope_cia_0_portb_r),
DEVCB_DRIVER_MEMBER(upscope_state,upscope_cia_0_portb_w) /* port B */
};
static const legacy_mos6526_interface cia_1_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state,amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(upscope_state,upscope_cia_1_porta_r),
DEVCB_DRIVER_MEMBER(upscope_state,upscope_cia_1_porta_w), /* port A */
DEVCB_NULL,
DEVCB_NULL
};
static MACHINE_CONFIG_START( upscope, upscope_state ) static MACHINE_CONFIG_START( upscope, upscope_state )
/* basic machine hardware */ /* basic machine hardware */
@ -342,11 +318,19 @@ static MACHINE_CONFIG_START( upscope, upscope_state )
MCFG_SOUND_ROUTE(3, "rspeaker", 0.50) MCFG_SOUND_ROUTE(3, "rspeaker", 0.50)
/* cia */ /* cia */
MCFG_LEGACY_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_0_intf) MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
MCFG_LEGACY_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_1_intf) MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(upscope_state,upscope_cia_0_porta_w))
MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(upscope_state,upscope_cia_0_portb_r))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(upscope_state,upscope_cia_0_portb_w))
MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(upscope_state,upscope_cia_1_porta_r))
MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(upscope_state,upscope_cia_1_porta_w))
/* fdc */ /* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68000_NTSC_CLOCK) MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MACHINE_CONFIG_END MACHINE_CONFIG_END

View File

@ -498,7 +498,6 @@ public:
DECLARE_WRITE_LINE_MEMBER(amiga_cia_0_irq); DECLARE_WRITE_LINE_MEMBER(amiga_cia_0_irq);
DECLARE_WRITE_LINE_MEMBER(amiga_cia_1_irq); DECLARE_WRITE_LINE_MEMBER(amiga_cia_1_irq);
DECLARE_READ8_MEMBER( amiga_cia_0_portA_r ); DECLARE_READ8_MEMBER( amiga_cia_0_portA_r );
DECLARE_READ8_MEMBER( amiga_cia_0_cdtv_portA_r );
DECLARE_WRITE8_MEMBER( amiga_cia_0_portA_w ); DECLARE_WRITE8_MEMBER( amiga_cia_0_portA_w );
DECLARE_READ16_MEMBER( amiga_clock_r ); DECLARE_READ16_MEMBER( amiga_clock_r );

View File

@ -340,7 +340,8 @@ TIMER_CALLBACK_MEMBER(amiga_state::scanline_callback)
amiga_custom_w(m_maincpu->space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_VERTB, 0xffff); amiga_custom_w(m_maincpu->space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_VERTB, 0xffff);
/* clock the first CIA TOD */ /* clock the first CIA TOD */
mos6526_tod_w(m_cia_0, 1); m_cia_0->tod_w(1);
m_cia_0->tod_w(0);
/* call the system-specific callback */ /* call the system-specific callback */
if (m_intf->scanline0_callback != NULL) if (m_intf->scanline0_callback != NULL)
@ -348,7 +349,8 @@ TIMER_CALLBACK_MEMBER(amiga_state::scanline_callback)
} }
/* on every scanline, clock the second CIA TOD */ /* on every scanline, clock the second CIA TOD */
mos6526_tod_w(m_cia_1, 1); m_cia_1->tod_w(1);
m_cia_1->tod_w(0);
/* render up to this scanline */ /* render up to this scanline */
if (!m_screen->update_partial(scanline)) if (!m_screen->update_partial(scanline))
@ -1044,7 +1046,7 @@ READ16_MEMBER( amiga_state::amiga_cia_r )
amiga_state *state = space.machine().driver_data<amiga_state>(); amiga_state *state = space.machine().driver_data<amiga_state>();
UINT8 data; UINT8 data;
int shift; int shift;
device_t *cia; legacy_mos6526_device *cia;
/* offsets 0000-07ff reference CIA B, and are accessed via the MSB */ /* offsets 0000-07ff reference CIA B, and are accessed via the MSB */
if ((offset & 0x0800) == 0) if ((offset & 0x0800) == 0)
@ -1061,7 +1063,7 @@ READ16_MEMBER( amiga_state::amiga_cia_r )
} }
/* handle the reads */ /* handle the reads */
data = mos6526_r(cia, space, offset >> 7); data = cia->read(space, offset >> 7);
if (LOG_CIA) if (LOG_CIA)
logerror("%06x:cia_%c_read(%03x) = %04x & %04x\n", space.device().safe_pc(), 'A' + ((~offset & 0x0800) >> 11), offset * 2, data << shift, mem_mask); logerror("%06x:cia_%c_read(%03x) = %04x & %04x\n", space.device().safe_pc(), 'A' + ((~offset & 0x0800) >> 11), offset * 2, data << shift, mem_mask);
@ -1080,7 +1082,7 @@ READ16_MEMBER( amiga_state::amiga_cia_r )
WRITE16_MEMBER( amiga_state::amiga_cia_w ) WRITE16_MEMBER( amiga_state::amiga_cia_w )
{ {
amiga_state *state = space.machine().driver_data<amiga_state>(); amiga_state *state = space.machine().driver_data<amiga_state>();
device_t *cia; legacy_mos6526_device *cia;
if (LOG_CIA) if (LOG_CIA)
logerror("%06x:cia_%c_write(%03x) = %04x & %04x\n", space.device().safe_pc(), 'A' + ((~offset & 0x0800) >> 11), offset * 2, data, mem_mask); logerror("%06x:cia_%c_write(%03x) = %04x & %04x\n", space.device().safe_pc(), 'A' + ((~offset & 0x0800) >> 11), offset * 2, data, mem_mask);
@ -1104,7 +1106,7 @@ WRITE16_MEMBER( amiga_state::amiga_cia_w )
} }
/* handle the writes */ /* handle the writes */
mos6526_w(cia, space, offset >> 7, (UINT8) data); cia->write(space, offset >> 7, (UINT8) data);
} }
@ -1458,8 +1460,8 @@ WRITE16_MEMBER( amiga_state::amiga_custom_w )
CUSTOM_REG(REG_SERDATR) &= ~0x8000; CUSTOM_REG(REG_SERDATR) &= ~0x8000;
data = (data & 0x8000) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff)); data = (data & 0x8000) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff));
if ( mos6526_irq_r( state->m_cia_0 ) ) data |= INTENA_PORTS; if ( state->m_cia_0->irq_r() ) data |= INTENA_PORTS;
if ( mos6526_irq_r( state->m_cia_1 ) ) data |= INTENA_EXTER; if ( state->m_cia_1->irq_r() ) data |= INTENA_EXTER;
CUSTOM_REG(offset) = data; CUSTOM_REG(offset) = data;
if ( temp & 0x8000 ) /* if we're generating irq's, delay a bit */ if ( temp & 0x8000 ) /* if we're generating irq's, delay a bit */

View File

@ -390,12 +390,10 @@ WRITE32_MEMBER(a1200_state::aga_overlay_w)
WRITE8_MEMBER(a1200_state::ami1200_cia_0_porta_w) WRITE8_MEMBER(a1200_state::ami1200_cia_0_porta_w)
{ {
device_t *device = machine().device("cia_0");
/* bit 2 = Power Led on Amiga */ /* bit 2 = Power Led on Amiga */
output_set_value("audio_led", !BIT(data, 1)); output_set_value("audio_led", !BIT(data, 1));
handle_cd32_joystick_cia(this, data, mos6526_r(device, space, 2)); handle_cd32_joystick_cia(this, data, m_cia_0->read(space, 2));
} }
/************************************* /*************************************
@ -504,66 +502,6 @@ MACHINE_RESET_MEMBER(cdtv_state,cdtv)
MACHINE_RESET_CALL_LEGACY( amigacd ); MACHINE_RESET_CALL_LEGACY( amigacd );
} }
static const legacy_mos6526_interface cia_0_ntsc_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state, amiga_cia_0_irq), /* irq_func */
DEVCB_DEVICE_LINE_MEMBER("centronics", centronics_device, write_strobe), /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(amiga_state, amiga_cia_0_portA_r),
DEVCB_DRIVER_MEMBER(amiga_state, amiga_cia_0_portA_w), /* port A */
DEVCB_NULL,
DEVCB_DEVICE_MEMBER("cent_data_out", output_latch_device, write) /* port B */
};
static const legacy_mos6526_interface cia_0_pal_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state, amiga_cia_0_irq), /* irq_func */
DEVCB_DEVICE_LINE_MEMBER("centronics", centronics_device, write_strobe), /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(amiga_state, amiga_cia_0_portA_r),
DEVCB_DRIVER_MEMBER(amiga_state, amiga_cia_0_portA_w), /* port A */
DEVCB_NULL,
DEVCB_DEVICE_MEMBER("cent_data_out", output_latch_device, write) /* port B */
};
static const legacy_mos6526_interface cia_1_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state, amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(amiga_state, amiga_cia_1_porta_r),
DEVCB_NULL, /* port A */
DEVCB_NULL,
DEVCB_DEVICE_MEMBER("fdc", amiga_fdc, ciaaprb_w) /* port B */
};
static const legacy_mos6526_interface cia_0_cdtv_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state, amiga_cia_0_irq), /* irq_func */
DEVCB_DEVICE_LINE_MEMBER("centronics", centronics_device, write_strobe), /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(amiga_state, amiga_cia_0_cdtv_portA_r),
DEVCB_DRIVER_MEMBER(amiga_state, amiga_cia_0_portA_w), /* port A */
DEVCB_NULL,
DEVCB_DEVICE_MEMBER("cent_data_out", output_latch_device, write) /* port B */
};
static const legacy_mos6526_interface cia_1_cdtv_intf =
{
DEVCB_DRIVER_LINE_MEMBER(amiga_state, amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(amiga_state, amiga_cia_1_porta_r),
DEVCB_NULL, /* port A */
DEVCB_NULL,
DEVCB_NULL /* port B */
};
static const tpi6525_interface cdtv_tpi_intf = static const tpi6525_interface cdtv_tpi_intf =
{ {
DEVCB_DRIVER_LINE_MEMBER(amiga_state, amigacd_tpi6525_irq), DEVCB_DRIVER_LINE_MEMBER(amiga_state, amigacd_tpi6525_irq),
@ -673,11 +611,21 @@ static MACHINE_CONFIG_START( ntsc, amiga_state )
MCFG_SOUND_ROUTE(3, "lspeaker", 0.50) MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
/* cia */ /* cia */
MCFG_LEGACY_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 60, cia_0_ntsc_intf) MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
MCFG_LEGACY_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_1_intf) MCFG_MOS6526_TOD(60)
MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
MCFG_MOS6526_PC_CALLBACK(DEVWRITELINE("centronics", centronics_device, write_strobe))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, amiga_cia_0_portA_r))
MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(amiga_state, amiga_cia_0_portA_w))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("cent_data_out", output_latch_device, write))
MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, amiga_cia_1_porta_r))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("fdc", amiga_fdc, ciaaprb_w))
/* fdc */ /* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68000_NTSC_CLOCK) MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MCFG_FLOPPY_DRIVE_ADD("fdc:0", amiga_floppies, "35dd", amiga_fdc::floppy_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:0", amiga_floppies, "35dd", amiga_fdc::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:1", amiga_floppies, 0, amiga_fdc::floppy_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:1", amiga_floppies, 0, amiga_fdc::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:2", amiga_floppies, 0, amiga_fdc::floppy_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:2", amiga_floppies, 0, amiga_fdc::floppy_formats)
@ -694,6 +642,9 @@ static MACHINE_CONFIG_DERIVED( a1000ntsc, ntsc )
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( a500ntsc, ntsc ) static MACHINE_CONFIG_DERIVED( a500ntsc, ntsc )
MCFG_DEVICE_MODIFY("cia_0")
MCFG_MOS6526_TOD(0)
MCFG_FRAGMENT_ADD(amiga_cartslot) MCFG_FRAGMENT_ADD(amiga_cartslot)
MCFG_SOFTWARE_LIST_ADD("flop_misc","amiga_flop") MCFG_SOFTWARE_LIST_ADD("flop_misc","amiga_flop")
@ -735,15 +686,8 @@ static MACHINE_CONFIG_DERIVED_CLASS( cdtv, ntsc, cdtv_state)
MCFG_TPI6525_ADD("tpi6525", cdtv_tpi_intf) MCFG_TPI6525_ADD("tpi6525", cdtv_tpi_intf)
/* cia */ MCFG_DEVICE_MODIFY("cia_0")
MCFG_DEVICE_REMOVE("cia_0") MCFG_MOS6526_TOD(0) // connected to vsync
MCFG_DEVICE_REMOVE("cia_1")
MCFG_LEGACY_MOS8520_ADD("cia_0", CDTV_CLOCK_X1 / 4 / 40, 0, cia_0_cdtv_intf)
MCFG_LEGACY_MOS8520_ADD("cia_1", CDTV_CLOCK_X1 / 4 / 40, 0, cia_1_cdtv_intf)
/* fdc */
MCFG_DEVICE_MODIFY("fdc")
MCFG_DEVICE_CLOCK(CDTV_CLOCK_X1 / 4)
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -762,10 +706,11 @@ static MACHINE_CONFIG_DERIVED( pal, ntsc )
// MCFG_SCREEN_VISIBLE_AREA(214, (228*4)-1, 34, 312-1) // MCFG_SCREEN_VISIBLE_AREA(214, (228*4)-1, 34, 312-1)
/* cia */ /* cia */
MCFG_DEVICE_REMOVE("cia_0") MCFG_DEVICE_MODIFY("cia_0")
MCFG_LEGACY_MOS8520_ADD("cia_0", AMIGA_68000_PAL_CLOCK / 10, 50, cia_0_pal_intf) MCFG_DEVICE_CLOCK(AMIGA_68000_PAL_CLOCK / 10)
MCFG_DEVICE_REMOVE("cia_1") MCFG_MOS6526_TOD(50)
MCFG_LEGACY_MOS8520_ADD("cia_1", AMIGA_68000_PAL_CLOCK / 10, 0, cia_1_intf) MCFG_DEVICE_MODIFY("cia_1")
MCFG_DEVICE_CLOCK(AMIGA_68000_PAL_CLOCK / 10)
/* fdc */ /* fdc */
MCFG_DEVICE_MODIFY("fdc") MCFG_DEVICE_MODIFY("fdc")
@ -773,6 +718,9 @@ static MACHINE_CONFIG_DERIVED( pal, ntsc )
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( a500p, pal ) static MACHINE_CONFIG_DERIVED( a500p, pal )
MCFG_DEVICE_MODIFY("cia_0")
MCFG_MOS6526_TOD(0) // connected to vsync
MCFG_FRAGMENT_ADD(amiga_cartslot) MCFG_FRAGMENT_ADD(amiga_cartslot)
MCFG_SOFTWARE_LIST_ADD("flop_misc","amiga_flop") MCFG_SOFTWARE_LIST_ADD("flop_misc","amiga_flop")
@ -882,11 +830,20 @@ static MACHINE_CONFIG_START( a1200n, a1200_state )
MCFG_SOUND_ROUTE(3, "lspeaker", 0.50) MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
/* cia */ /* cia */
MCFG_LEGACY_MOS8520_ADD("cia_0", AMIGA_68EC020_NTSC_CLOCK /2 / 10, 60, cia_0_ntsc_intf) MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68EC020_NTSC_CLOCK /2 / 10)
MCFG_LEGACY_MOS8520_ADD("cia_1", AMIGA_68EC020_NTSC_CLOCK /2 / 10, 0, cia_1_intf) MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
MCFG_MOS6526_PC_CALLBACK(DEVWRITELINE("centronics", centronics_device, write_strobe))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, amiga_cia_0_portA_r))
MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(amiga_state, amiga_cia_0_portA_w))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("cent_data_out", output_latch_device, write))
MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68EC020_NTSC_CLOCK /2 / 10)
MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, amiga_cia_1_porta_r))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("fdc", amiga_fdc, ciaaprb_w))
/* fdc */ /* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68EC020_NTSC_CLOCK / 2) MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68EC020_NTSC_CLOCK / 2)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MCFG_FLOPPY_DRIVE_ADD("fdc:0", amiga_floppies, "35dd", amiga_fdc::floppy_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:0", amiga_floppies, "35dd", amiga_fdc::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:1", amiga_floppies, 0, amiga_fdc::floppy_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:1", amiga_floppies, 0, amiga_fdc::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:2", amiga_floppies, 0, amiga_fdc::floppy_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:2", amiga_floppies, 0, amiga_fdc::floppy_formats)
@ -992,11 +949,21 @@ static MACHINE_CONFIG_START( a3000n, amiga_state )
MCFG_SOUND_ROUTE(3, "lspeaker", 0.50) MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
/* cia */ /* cia */
MCFG_LEGACY_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 60, cia_0_ntsc_intf) MCFG_DEVICE_ADD("cia_0", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
MCFG_LEGACY_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_1_intf) MCFG_MOS6526_TOD(60) // jumper selectable TICK or VSYNC
MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_0_irq))
MCFG_MOS6526_PC_CALLBACK(DEVWRITELINE("centronics", centronics_device, write_strobe))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, amiga_cia_0_portA_r))
MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(amiga_state, amiga_cia_0_portA_w))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("cent_data_out", output_latch_device, write))
MCFG_DEVICE_ADD("cia_1", LEGACY_MOS8520, AMIGA_68000_NTSC_CLOCK / 10)
MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, amiga_cia_1_irq))
MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(amiga_state, amiga_cia_1_porta_r))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("fdc", amiga_fdc, ciaaprb_w))
/* fdc */ /* fdc */
MCFG_AMIGA_FDC_ADD("fdc", AMIGA_68000_NTSC_CLOCK) MCFG_DEVICE_ADD("fdc", AMIGA_FDC, AMIGA_68000_NTSC_CLOCK)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", legacy_mos6526_device, flag_w))
MCFG_FLOPPY_DRIVE_ADD("fdc:0", amiga_floppies, "35dd", amiga_fdc::floppy_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:0", amiga_floppies, "35dd", amiga_fdc::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:1", amiga_floppies, 0, amiga_fdc::floppy_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:1", amiga_floppies, 0, amiga_fdc::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:2", amiga_floppies, 0, amiga_fdc::floppy_formats) MCFG_FLOPPY_DRIVE_ADD("fdc:2", amiga_floppies, 0, amiga_fdc::floppy_formats)
@ -1021,10 +988,11 @@ static MACHINE_CONFIG_DERIVED( a3000, a3000n )
// MCFG_SCREEN_VISIBLE_AREA(214, (228*4)-1, 34, 312-1) // MCFG_SCREEN_VISIBLE_AREA(214, (228*4)-1, 34, 312-1)
/* cia */ /* cia */
MCFG_DEVICE_REMOVE("cia_0") MCFG_DEVICE_MODIFY("cia_0")
MCFG_LEGACY_MOS8520_ADD("cia_0", AMIGA_68000_PAL_CLOCK / 10, 50, cia_0_pal_intf) MCFG_DEVICE_CLOCK(AMIGA_68000_PAL_CLOCK / 10)
MCFG_DEVICE_REMOVE("cia_1") MCFG_MOS6526_TOD(50) // jumper selectable TICK or VSYNC
MCFG_LEGACY_MOS8520_ADD("cia_1", AMIGA_68000_PAL_CLOCK / 10, 0, cia_1_intf) MCFG_DEVICE_MODIFY("cia_1")
MCFG_DEVICE_CLOCK(AMIGA_68000_PAL_CLOCK / 10)
/* fdc */ /* fdc */
MCFG_DEVICE_MODIFY("fdc") MCFG_DEVICE_MODIFY("fdc")
@ -1046,11 +1014,6 @@ READ8_MEMBER( amiga_state::amiga_cia_0_portA_r )
} }
READ8_MEMBER( amiga_state::amiga_cia_0_cdtv_portA_r )
{
return space.machine().root_device().ioport("CIA0PORTA")->read() & 0xc0; /* Gameport 1 and 0 buttons */
}
WRITE8_MEMBER( amiga_state::amiga_cia_0_portA_w ) WRITE8_MEMBER( amiga_state::amiga_cia_0_portA_w )
{ {