Refactored the CIA 6526 interface, adding SP/CNT callbacks.

This commit is contained in:
Curt Coder 2010-01-19 14:26:51 +00:00
parent c6c534dbb6
commit 2244f9274d
8 changed files with 310 additions and 242 deletions

View File

@ -10,7 +10,6 @@
#include "emu.h"
#include "6526cia.h"
/***************************************************************************
CONSTANTS
***************************************************************************/
@ -33,7 +32,6 @@
#define CIA_CRA 14
#define CIA_CRB 15
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
@ -66,8 +64,10 @@ struct _cia_port
struct _cia_state
{
running_device *device;
devcb_resolved_write_line irq_func;
devcb_resolved_write_line pc_func;
devcb_resolved_write_line out_irq_func;
devcb_resolved_write_line out_pc_func;
devcb_resolved_write_line out_cnt_func;
devcb_resolved_write_line out_sp_func;
cia_port port[2];
cia_timer timer[2];
@ -94,7 +94,6 @@ struct _cia_state
UINT8 serial;
};
/***************************************************************************
PROTOTYPES
***************************************************************************/
@ -103,8 +102,6 @@ static TIMER_CALLBACK( cia_timer_proc );
static void cia_timer_underflow(running_device *device, int timer);
static TIMER_CALLBACK( cia_clock_tod_callback );
/***************************************************************************
INLINE FUNCTIONS
***************************************************************************/
@ -112,98 +109,21 @@ static TIMER_CALLBACK( cia_clock_tod_callback );
INLINE cia_state *get_token(running_device *device)
{
assert(device != NULL);
assert((device->type == CIA6526R1) || (device->type == CIA6526R2) || (device->type == CIA8520));
assert((device->type == MOS6526R1) || (device->type == MOS6526R2) || (device->type == MOS8520));
return (cia_state *) device->token;
}
INLINE const cia6526_interface *get_interface(running_device *device)
INLINE const mos6526_interface *get_interface(running_device *device)
{
assert(device != NULL);
assert((device->type == CIA6526R1) || (device->type == CIA6526R2) || (device->type == CIA8520));
return (cia6526_interface *) device->baseconfig().static_config;
assert((device->type == MOS6526R1) || (device->type == MOS6526R2) || (device->type == MOS8520));
return (mos6526_interface *) device->baseconfig().static_config;
}
/***************************************************************************
IMPLEMENTATION
***************************************************************************/
/*-------------------------------------------------
DEVICE_START( cia )
-------------------------------------------------*/
static DEVICE_START( cia )
{
int t, p;
cia_state *cia = get_token(device);
const cia6526_interface *intf = get_interface(device);
/* clear out CIA structure, and copy the interface */
memset(cia, 0, sizeof(*cia));
cia->device = device;
devcb_resolve_write_line(&cia->irq_func, &intf->irq_func, device);
devcb_resolve_write_line(&cia->pc_func, &intf->pc_func, device);
cia->flag = 1;
/* setup ports */
for (p = 0; p < (sizeof(cia->port) / sizeof(cia->port[0])); p++)
{
devcb_resolve_read8(&cia->port[p].read, &intf->port[p].read, device);
devcb_resolve_write8(&cia->port[p].write, &intf->port[p].write, device);
cia->port[p].mask_value = 0xff;
}
/* setup timers */
for (t = 0; t < (sizeof(cia->timer) / sizeof(cia->timer[0])); t++)
{
cia_timer *timer = &cia->timer[t];
timer->timer = timer_alloc(device->machine, cia_timer_proc, timer);
timer->cia = cia;
timer->irq = 0x01 << t;
}
/* setup TOD timer, if appropriate */
if (intf->tod_clock != 0)
timer_pulse(device->machine, ATTOTIME_IN_HZ(intf->tod_clock), (void *) device, 0, cia_clock_tod_callback);
/* state save support */
state_save_register_device_item(device, 0, cia->port[0].ddr);
state_save_register_device_item(device, 0, cia->port[0].latch);
state_save_register_device_item(device, 0, cia->port[0].in);
state_save_register_device_item(device, 0, cia->port[0].out);
state_save_register_device_item(device, 0, cia->port[0].mask_value);
state_save_register_device_item(device, 0, cia->port[1].ddr);
state_save_register_device_item(device, 0, cia->port[1].latch);
state_save_register_device_item(device, 0, cia->port[1].in);
state_save_register_device_item(device, 0, cia->port[1].out);
state_save_register_device_item(device, 0, cia->port[1].mask_value);
state_save_register_device_item(device, 0, cia->timer[0].latch);
state_save_register_device_item(device, 0, cia->timer[0].count);
state_save_register_device_item(device, 0, cia->timer[0].mode);
state_save_register_device_item(device, 0, cia->timer[0].irq);
state_save_register_device_item(device, 0, cia->timer[1].latch);
state_save_register_device_item(device, 0, cia->timer[1].count);
state_save_register_device_item(device, 0, cia->timer[1].mode);
state_save_register_device_item(device, 0, cia->timer[1].irq);
state_save_register_device_item(device, 0, cia->tod);
state_save_register_device_item(device, 0, cia->tod_latch);
state_save_register_device_item(device, 0, cia->tod_latched);
state_save_register_device_item(device, 0, cia->tod_running);
state_save_register_device_item(device, 0, cia->alarm);
state_save_register_device_item(device, 0, cia->icr);
state_save_register_device_item(device, 0, cia->ics);
state_save_register_device_item(device, 0, cia->irq);
state_save_register_device_item(device, 0, cia->flag);
state_save_register_device_item(device, 0, cia->loaded);
state_save_register_device_item(device, 0, cia->sdr);
state_save_register_device_item(device, 0, cia->sp);
state_save_register_device_item(device, 0, cia->cnt);
state_save_register_device_item(device, 0, cia->shift);
state_save_register_device_item(device, 0, cia->serial);
}
/*-------------------------------------------------
cia_set_port_mask_value
-------------------------------------------------*/
@ -214,7 +134,6 @@ void cia_set_port_mask_value(running_device *device, int port, int data)
cia->port[port].mask_value = data;
}
/*-------------------------------------------------
DEVICE_RESET( cia )
-------------------------------------------------*/
@ -258,7 +177,6 @@ static DEVICE_RESET( cia )
}
}
/*-------------------------------------------------
DEVICE_VALIDITY_CHECK( cia )
-------------------------------------------------*/
@ -276,7 +194,6 @@ static DEVICE_VALIDITY_CHECK( cia )
return error;
}
/*-------------------------------------------------
cia_update_pc - pulse /pc output
-------------------------------------------------*/
@ -286,11 +203,10 @@ static void cia_update_pc(running_device *device)
cia_state *cia = get_token(device);
/* this should really be one cycle long */
devcb_call_write_line(&cia->pc_func, 0);
devcb_call_write_line(&cia->pc_func, 1);
devcb_call_write_line(&cia->out_pc_func, 0);
devcb_call_write_line(&cia->out_pc_func, 1);
}
/*-------------------------------------------------
cia_update_interrupts
-------------------------------------------------*/
@ -311,11 +227,10 @@ static void cia_update_interrupts(running_device *device)
if (cia->irq != new_irq)
{
cia->irq = new_irq;
devcb_call_write_line(&cia->irq_func, cia->irq);
devcb_call_write_line(&cia->out_irq_func, cia->irq);
}
}
/*-------------------------------------------------
is_timer_active
-------------------------------------------------*/
@ -326,7 +241,6 @@ static int is_timer_active(emu_timer *timer)
return attotime_compare(t, attotime_never) != 0;
}
/*-------------------------------------------------
cia_timer_update - updates the count and
emu_timer for a given CIA timer
@ -400,7 +314,6 @@ static void cia_timer_bump(running_device *device, int timer)
cia_timer_update(&cia->timer[timer], cia->timer[timer].count - 1);
}
/*-------------------------------------------------
cia_timer_underflow
-------------------------------------------------*/
@ -448,10 +361,16 @@ static void cia_timer_underflow(running_device *device, int timer)
cia->shift++;
cia->serial <<= 1;
cia->cnt = 0;
devcb_call_write_line(&cia->out_cnt_func, cia->cnt);
devcb_call_write_line(&cia->out_sp_func, cia->sp);
}
else
{
cia->cnt = 1;
devcb_call_write_line(&cia->out_cnt_func, cia->cnt);
if (cia->shift == 8)
{
cia->ics |= 0x08;
@ -463,7 +382,6 @@ static void cia_timer_underflow(running_device *device, int timer)
}
}
/*-------------------------------------------------
TIMER_CALLBACK( cia_timer_proc )
-------------------------------------------------*/
@ -476,7 +394,6 @@ static TIMER_CALLBACK( cia_timer_proc )
cia_timer_underflow(cia->device, timer - cia->timer);
}
/*-------------------------------------------------
bcd_increment
-------------------------------------------------*/
@ -489,7 +406,6 @@ static UINT8 bcd_increment(UINT8 value)
return value;
}
/*-------------------------------------------------
cia6526_increment
-------------------------------------------------*/
@ -535,12 +451,11 @@ static void cia6526_increment(cia_state *cia)
| (((UINT32) hour) << 24);
}
/*-------------------------------------------------
cia_clock_tod - Update TOD on CIA A
-------------------------------------------------*/
void cia_clock_tod(running_device *device)
static void cia_clock_tod(running_device *device)
{
cia_state *cia;
@ -548,13 +463,13 @@ void cia_clock_tod(running_device *device)
if (cia->tod_running)
{
if ((device->type == CIA6526R1) || (device->type == CIA6526R2))
if ((device->type == MOS6526R1) || (device->type == MOS6526R2))
{
/* The 6526 split the value into hours, minutes, seconds and
* subseconds */
cia6526_increment(cia);
}
else if (device->type == CIA8520)
else if (device->type == MOS8520)
{
/* the 8520 has a straight 24-bit counter */
cia->tod++;
@ -569,7 +484,6 @@ void cia_clock_tod(running_device *device)
}
}
/*-------------------------------------------------
cia_clock_tod_callback
-------------------------------------------------*/
@ -580,35 +494,32 @@ static TIMER_CALLBACK( cia_clock_tod_callback )
cia_clock_tod(device);
}
/*-------------------------------------------------
cia_issue_index
-------------------------------------------------*/
void cia_issue_index(running_device *device)
static void cia_issue_index(running_device *device)
{
cia_state *cia = get_token(device);
cia->ics |= 0x10;
cia_update_interrupts(device);
}
/*-------------------------------------------------
cia_set_input_sp
-------------------------------------------------*/
void cia_set_input_sp(running_device *device, int data)
static void cia_set_input_sp(running_device *device, int data)
{
cia_state *cia = get_token(device);
cia->sp = data;
}
/*-------------------------------------------------
cia_set_input_cnt
-------------------------------------------------*/
void cia_set_input_cnt(running_device *device, int data)
static void cia_set_input_cnt(running_device *device, int data)
{
cia_state *cia = get_token(device);
@ -643,16 +554,47 @@ void cia_set_input_cnt(running_device *device, int data)
cia->cnt = data ? 1 : 0;
}
READ8_DEVICE_HANDLER( mos6526_pa_r )
{
return (get_token(device)->port[0].latch | ~get_token(device)->port[0].ddr);
}
READ8_DEVICE_HANDLER( mos6526_pb_r )
{
return (get_token(device)->port[1].latch | ~get_token(device)->port[1].ddr);
}
READ_LINE_DEVICE_HANDLER( mos6526_irq_r )
{
cia_state *cia = get_token(device);
return cia->irq;
}
WRITE_LINE_DEVICE_HANDLER( mos6526_tod_w )
{
if (state) cia_clock_tod(device);
}
READ_LINE_DEVICE_HANDLER( mos6526_cnt_r )
{
cia_state *cia = get_token(device);
return cia->cnt;
}
WRITE_LINE_DEVICE_HANDLER( mos6526_cnt_w )
{
cia_set_input_cnt(device, state);
}
READ_LINE_DEVICE_HANDLER( mos6526_sp_r )
{
cia_state *cia = get_token(device);
return cia->sp;
}
WRITE_LINE_DEVICE_HANDLER( mos6526_sp_w )
{
cia_set_input_sp(device, state);
@ -671,10 +613,10 @@ WRITE_LINE_DEVICE_HANDLER( mos6526_flag_w )
}
/*-------------------------------------------------
cia_r
mos6526_r
-------------------------------------------------*/
READ8_DEVICE_HANDLER( cia_r )
READ8_DEVICE_HANDLER( mos6526_r )
{
cia_timer *timer;
cia_state *cia;
@ -748,7 +690,7 @@ READ8_DEVICE_HANDLER( cia_r )
case CIA_TOD1:
case CIA_TOD2:
case CIA_TOD3:
if (device->type == CIA8520)
if (device->type == MOS8520)
{
if (offset == CIA_TOD2)
{
@ -796,12 +738,11 @@ READ8_DEVICE_HANDLER( cia_r )
return data;
}
/*-------------------------------------------------
cia_w
mos6526_w
-------------------------------------------------*/
WRITE8_DEVICE_HANDLER( cia_w )
WRITE8_DEVICE_HANDLER( mos6526_w )
{
cia_timer *timer;
cia_state *cia;
@ -875,7 +816,7 @@ WRITE8_DEVICE_HANDLER( cia_w )
else
cia->tod = (cia->tod & ~(0xff << shift)) | (data << shift);
if (device->type == CIA8520)
if (device->type == MOS8520)
{
if (offset == CIA_TOD2)
cia->tod_running = FALSE;
@ -920,12 +861,84 @@ WRITE8_DEVICE_HANDLER( cia_w )
}
}
/*-------------------------------------------------
DEVICE_START( cia )
-------------------------------------------------*/
static DEVICE_START( cia )
{
int t, p;
cia_state *cia = get_token(device);
const mos6526_interface *intf = get_interface(device);
UINT8 cia_get_output_a(running_device *device) { return (get_token(device)->port[0].latch | ~get_token(device)->port[0].ddr); }
UINT8 cia_get_output_b(running_device *device) { return (get_token(device)->port[1].latch | ~get_token(device)->port[1].ddr); }
int cia_get_irq(running_device *device) { return get_token(device)->irq; }
/* clear out CIA structure, and copy the interface */
memset(cia, 0, sizeof(*cia));
cia->device = device;
devcb_resolve_write_line(&cia->out_irq_func, &intf->out_irq_func, device);
devcb_resolve_write_line(&cia->out_pc_func, &intf->out_pc_func, device);
devcb_resolve_write_line(&cia->out_cnt_func, &intf->out_cnt_func, device);
devcb_resolve_write_line(&cia->out_sp_func, &intf->out_sp_func, device);
cia->flag = 1;
/* setup ports */
devcb_resolve_read8(&cia->port[0].read, &intf->in_pa_func, device);
devcb_resolve_write8(&cia->port[0].write, &intf->out_pa_func, device);
devcb_resolve_read8(&cia->port[1].read, &intf->in_pb_func, device);
devcb_resolve_write8(&cia->port[1].write, &intf->out_pb_func, device);
for (p = 0; p < (sizeof(cia->port) / sizeof(cia->port[0])); p++)
{
cia->port[p].mask_value = 0xff;
}
/* setup timers */
for (t = 0; t < (sizeof(cia->timer) / sizeof(cia->timer[0])); t++)
{
cia_timer *timer = &cia->timer[t];
timer->timer = timer_alloc(device->machine, cia_timer_proc, timer);
timer->cia = cia;
timer->irq = 0x01 << t;
}
/* setup TOD timer, if appropriate */
if (intf->tod_clock != 0)
timer_pulse(device->machine, ATTOTIME_IN_HZ(intf->tod_clock), (void *) device, 0, cia_clock_tod_callback);
/* state save support */
state_save_register_device_item(device, 0, cia->port[0].ddr);
state_save_register_device_item(device, 0, cia->port[0].latch);
state_save_register_device_item(device, 0, cia->port[0].in);
state_save_register_device_item(device, 0, cia->port[0].out);
state_save_register_device_item(device, 0, cia->port[0].mask_value);
state_save_register_device_item(device, 0, cia->port[1].ddr);
state_save_register_device_item(device, 0, cia->port[1].latch);
state_save_register_device_item(device, 0, cia->port[1].in);
state_save_register_device_item(device, 0, cia->port[1].out);
state_save_register_device_item(device, 0, cia->port[1].mask_value);
state_save_register_device_item(device, 0, cia->timer[0].latch);
state_save_register_device_item(device, 0, cia->timer[0].count);
state_save_register_device_item(device, 0, cia->timer[0].mode);
state_save_register_device_item(device, 0, cia->timer[0].irq);
state_save_register_device_item(device, 0, cia->timer[1].latch);
state_save_register_device_item(device, 0, cia->timer[1].count);
state_save_register_device_item(device, 0, cia->timer[1].mode);
state_save_register_device_item(device, 0, cia->timer[1].irq);
state_save_register_device_item(device, 0, cia->tod);
state_save_register_device_item(device, 0, cia->tod_latch);
state_save_register_device_item(device, 0, cia->tod_latched);
state_save_register_device_item(device, 0, cia->tod_running);
state_save_register_device_item(device, 0, cia->alarm);
state_save_register_device_item(device, 0, cia->icr);
state_save_register_device_item(device, 0, cia->ics);
state_save_register_device_item(device, 0, cia->irq);
state_save_register_device_item(device, 0, cia->flag);
state_save_register_device_item(device, 0, cia->loaded);
state_save_register_device_item(device, 0, cia->sdr);
state_save_register_device_item(device, 0, cia->sp);
state_save_register_device_item(device, 0, cia->cnt);
state_save_register_device_item(device, 0, cia->shift);
state_save_register_device_item(device, 0, cia->serial);
}
/*-------------------------------------------------
DEVICE_GET_INFO( cia6526r1 )
@ -947,15 +960,14 @@ DEVICE_GET_INFO(cia6526r1)
case DEVINFO_FCT_VALIDITY_CHECK: info->validity_check = DEVICE_VALIDITY_CHECK_NAME(cia); break;
/* --- the following bits of info are returned as NULL-terminated strings --- */
case DEVINFO_STR_NAME: strcpy(info->s, "6526 CIA rev1"); break;
case DEVINFO_STR_FAMILY: strcpy(info->s, "6526 CIA"); break;
case DEVINFO_STR_NAME: strcpy(info->s, "MOS6526 rev1"); break;
case DEVINFO_STR_FAMILY: strcpy(info->s, "MOS6526"); break;
case DEVINFO_STR_VERSION: strcpy(info->s, "1.0"); break;
case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break;
case DEVINFO_STR_CREDITS: /* Nothing */ break;
}
}
/*-------------------------------------------------
DEVICE_GET_INFO( cia8520 )
-------------------------------------------------*/
@ -965,12 +977,11 @@ DEVICE_GET_INFO(cia6526r2)
switch (state)
{
/* --- the following bits of info are returned as NULL-terminated strings --- */
case DEVINFO_STR_NAME: strcpy(info->s, "6526 CIA rev2"); break;
case DEVINFO_STR_NAME: strcpy(info->s, "MOS6526 rev2"); break;
default: DEVICE_GET_INFO_CALL(cia6526r1); break;
}
}
/*-------------------------------------------------
DEVICE_GET_INFO( cia8520 )
-------------------------------------------------*/
@ -980,9 +991,7 @@ DEVICE_GET_INFO(cia8520)
switch (state)
{
/* --- the following bits of info are returned as NULL-terminated strings --- */
case DEVINFO_STR_NAME: strcpy(info->s, "8520 CIA"); break;
case DEVINFO_STR_NAME: strcpy(info->s, "MOS8520"); break;
default: DEVICE_GET_INFO_CALL(cia6526r1); break;
}
}

View File

@ -1,54 +1,86 @@
/**********************************************************************
MOS 6526/8520 CIA interface and emulation
MOS 6526/8520 Complex Interface Adapter emulation
This function emulates all the functionality of up to 2 MOS6526 or
MOS8520 complex interface adapters.
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************
_____ _____
Vss 1 |* \_/ | 40 CNT
PA0 2 | | 39 SP
PA1 3 | | 38 RS0
PA2 4 | | 37 RS1
PA3 5 | | 36 RS2
PA4 6 | | 35 RS3
PA5 7 | | 34 _RES
PA6 8 | | 33 DB0
PA7 9 | | 32 DB1
PB0 10 | MOS6526 | 31 DB2
PB1 11 | MOS8520 | 30 DB3
PB2 12 | | 29 DB4
PB3 13 | | 28 DB5
PB4 14 | | 27 DB6
PB5 15 | | 26 DB7
PB6 16 | | 25 phi2
PB7 17 | | 24 _FLAG
_PC 18 | | 23 _CS
TOD 19 | | 22 R/W
Vcc 20 |_____________| 21 _IRQ
**********************************************************************/
#ifndef __6526CIA_H__
#define __6526CIA_H__
#include "devcb.h"
/***************************************************************************
MACROS
***************************************************************************/
#define CIA6526R1 DEVICE_GET_INFO_NAME(cia6526r1)
#define CIA6526R2 DEVICE_GET_INFO_NAME(cia6526r1)
#define CIA8520 DEVICE_GET_INFO_NAME(cia8520)
#define MOS6526R1 DEVICE_GET_INFO_NAME(cia6526r1)
#define MOS6526R2 DEVICE_GET_INFO_NAME(cia6526r1)
#define MOS8520 DEVICE_GET_INFO_NAME(cia8520)
#define MDRV_CIA6526_ADD(_tag, _variant, _clock, _config) \
MDRV_DEVICE_ADD(_tag, _variant, _clock) \
#define MDRV_MOS6526R1_ADD(_tag, _clock, _config) \
MDRV_DEVICE_ADD(_tag, MOS6526R1, _clock) \
MDRV_DEVICE_CONFIG(_config)
#define MDRV_CIA8520_ADD(_tag, _clock, _config) \
MDRV_DEVICE_ADD(_tag, CIA8520, _clock) \
#define MDRV_MOS6526R2_ADD(_tag, _clock, _config) \
MDRV_DEVICE_ADD(_tag, MOS6526R2, _clock) \
MDRV_DEVICE_CONFIG(_config)
#define MDRV_MOS8520_ADD(_tag, _clock, _config) \
MDRV_DEVICE_ADD(_tag, MOS8520, _clock) \
MDRV_DEVICE_CONFIG(_config)
#define MOS6526_INTERFACE(name) \
const mos6526_interface (name)=
#define MOS8520_INTERFACE(name) \
const mos6526_interface (name)=
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
typedef struct _cia6526_interface cia6526_interface;
struct _cia6526_interface
typedef struct _mos6526_interface mos6526_interface;
struct _mos6526_interface
{
devcb_write_line irq_func;
devcb_write_line pc_func;
int tod_clock;
struct
{
devcb_read8 read;
devcb_write8 write;
} port[2];
};
devcb_write_line out_irq_func;
devcb_write_line out_pc_func;
devcb_write_line out_cnt_func;
devcb_write_line out_sp_func;
devcb_read8 in_pa_func;
devcb_write8 out_pa_func;
devcb_read8 in_pb_func;
devcb_write8 out_pb_func;
};
/***************************************************************************
FUNCTION PROTOTYPES
@ -58,25 +90,32 @@ DEVICE_GET_INFO(cia6526r1);
DEVICE_GET_INFO(cia6526r2);
DEVICE_GET_INFO(cia8520);
/* configuration */
void cia_set_port_mask_value(running_device *device, int port, int data);
/* register access */
READ8_DEVICE_HANDLER( mos6526_r );
WRITE8_DEVICE_HANDLER( mos6526_w );
/* reading and writing */
READ8_DEVICE_HANDLER( cia_r );
WRITE8_DEVICE_HANDLER( cia_w );
void cia_clock_tod(running_device *device);
void cia_issue_index(running_device *device);
void cia_set_input_cnt(running_device *device, int data);
void cia_set_input_sp(running_device *device, int data);
/* port access */
READ8_DEVICE_HANDLER( mos6526_pa_r );
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 );
/* flag */
WRITE_LINE_DEVICE_HANDLER( mos6526_flag_w );
/* accessors */
UINT8 cia_get_output_a(running_device *device);
UINT8 cia_get_output_b(running_device *device);
int cia_get_irq(running_device *device);
/* port mask */
void cia_set_port_mask_value(const device_config *device, int port, int data);
#endif /* __6526CIA_H__ */

View File

@ -377,26 +377,30 @@ INPUT_PORTS_END
*
*************************************/
static const cia6526_interface cia_0_intf =
static const mos6526_interface cia_0_intf =
{
0, /* tod_clock */
DEVCB_LINE(amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
0, /* tod_clock */
{
{ DEVCB_HANDLER(alg_cia_0_porta_r), DEVCB_HANDLER(alg_cia_0_porta_w) }, /* port A */
{ DEVCB_HANDLER(alg_cia_0_portb_r), DEVCB_HANDLER(alg_cia_0_portb_w) } /* port B */
}
DEVCB_NULL,
DEVCB_NULL,
DEVCB_HANDLER(alg_cia_0_porta_r),
DEVCB_HANDLER(alg_cia_0_porta_w), /* port A */
DEVCB_HANDLER(alg_cia_0_portb_r),
DEVCB_HANDLER(alg_cia_0_portb_w) /* port B */
};
static const cia6526_interface cia_1_intf =
static const mos6526_interface cia_1_intf =
{
0, /* tod_clock */
DEVCB_LINE(amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
0, /* tod_clock */
{
{ DEVCB_HANDLER(alg_cia_1_porta_r), DEVCB_HANDLER(alg_cia_1_porta_w), }, /* port A */
{ DEVCB_NULL, DEVCB_NULL } /* port B */
}
DEVCB_NULL,
DEVCB_NULL,
DEVCB_HANDLER(alg_cia_1_porta_r),
DEVCB_HANDLER(alg_cia_1_porta_w), /* port A */
DEVCB_NULL,
DEVCB_NULL /* port B */
};
static MACHINE_DRIVER_START( alg_r1 )
@ -438,8 +442,8 @@ static MACHINE_DRIVER_START( alg_r1 )
MDRV_SOUND_ROUTE(1, "rspeaker", 1.0)
/* cia */
MDRV_CIA8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_intf)
MDRV_CIA8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, cia_1_intf)
MDRV_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_intf)
MDRV_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, cia_1_intf)
MACHINE_DRIVER_END

View File

@ -260,26 +260,30 @@ INPUT_PORTS_END
*
*************************************/
static const cia6526_interface cia_0_intf =
static const mos6526_interface cia_0_intf =
{
0, /* tod_clock */
DEVCB_LINE(amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
0, /* tod_clock */
{
{ DEVCB_INPUT_PORT("CIA0PORTA"), DEVCB_HANDLER(arcadia_cia_0_porta_w) }, /* port A */
{ DEVCB_INPUT_PORT("CIA0PORTB"), DEVCB_HANDLER(arcadia_cia_0_portb_w) } /* port B */
}
DEVCB_NULL,
DEVCB_NULL,
DEVCB_INPUT_PORT("CIA0PORTA"),
DEVCB_HANDLER(arcadia_cia_0_porta_w), /* port A */
DEVCB_INPUT_PORT("CIA0PORTB"),
DEVCB_HANDLER(arcadia_cia_0_portb_w) /* port B */
};
static const cia6526_interface cia_1_intf =
static const mos6526_interface cia_1_intf =
{
0, /* tod_clock */
DEVCB_LINE(amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
0, /* tod_clock */
{
{ DEVCB_NULL, DEVCB_NULL }, /* port A */
{ DEVCB_NULL, DEVCB_NULL } /* port B */
}
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static MACHINE_DRIVER_START( arcadia )
@ -316,8 +320,8 @@ static MACHINE_DRIVER_START( arcadia )
MDRV_SOUND_ROUTE(3, "lspeaker", 0.50)
/* cia */
MDRV_CIA8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_intf)
MDRV_CIA8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, cia_1_intf)
MDRV_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_intf)
MDRV_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, cia_1_intf)
MACHINE_DRIVER_END

View File

@ -381,7 +381,7 @@ static WRITE8_DEVICE_HANDLER( cd32_cia_0_porta_w )
/* bit 2 = Power Led on Amiga */
set_led_status(device->machine, 0, (data & 2) ? 0 : 1);
handle_cd32_joystick_cia(data, cia_r(device, 2));
handle_cd32_joystick_cia(data, mos6526_r(device, 2));
}
/*************************************
@ -1016,26 +1016,30 @@ INPUT_PORTS_END
*
*************************************/
static const cia6526_interface cia_0_intf =
static const mos6526_interface cia_0_intf =
{
0, /* tod_clock */
DEVCB_LINE(amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
0, /* tod_clock */
{
{ DEVCB_INPUT_PORT("CIA0PORTA"), DEVCB_HANDLER(cd32_cia_0_porta_w) }, /* port A */
{ DEVCB_HANDLER(cd32_cia_0_portb_r), DEVCB_HANDLER(cd32_cia_0_portb_w) } /* port B */
}
DEVCB_NULL,
DEVCB_NULL,
DEVCB_INPUT_PORT("CIA0PORTA"),
DEVCB_HANDLER(cd32_cia_0_porta_w), /* port A */
DEVCB_HANDLER(cd32_cia_0_portb_r),
DEVCB_HANDLER(cd32_cia_0_portb_w) /* port B */
};
static const cia6526_interface cia_1_intf =
static const mos6526_interface cia_1_intf =
{
0, /* tod_clock */
DEVCB_LINE(amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
0, /* tod_clock */
{
{ DEVCB_NULL, DEVCB_NULL }, /* port A */
{ DEVCB_NULL, DEVCB_NULL } /* port B */
}
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static MACHINE_DRIVER_START( cd32 )
@ -1074,8 +1078,8 @@ static MACHINE_DRIVER_START( cd32 )
MDRV_SOUND_ROUTE( 1, "rspeaker", 0.50 )
/* cia */
MDRV_CIA8520_ADD("cia_0", AMIGA_68EC020_PAL_CLOCK / 10, cia_0_intf)
MDRV_CIA8520_ADD("cia_1", AMIGA_68EC020_PAL_CLOCK / 10, cia_1_intf)
MDRV_MOS8520_ADD("cia_0", AMIGA_68EC020_PAL_CLOCK / 10, cia_0_intf)
MDRV_MOS8520_ADD("cia_1", AMIGA_68EC020_PAL_CLOCK / 10, cia_1_intf)
MACHINE_DRIVER_END
#define ROM_LOAD16_WORD_BIOS(bios,name,offset,length,hash) ROMX_LOAD(name, offset, length, hash, ROM_BIOS(bios+1))

View File

@ -330,26 +330,30 @@ static MACHINE_RESET(mquake)
*
*************************************/
static const cia6526_interface cia_0_intf =
static const mos6526_interface cia_0_intf =
{
0, /* tod_clock */
DEVCB_LINE(amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
0, /* tod_clock */
{
{ DEVCB_INPUT_PORT("CIA0PORTA"), DEVCB_HANDLER(mquake_cia_0_porta_w) }, /* port A */
{ DEVCB_HANDLER(mquake_cia_0_portb_r), DEVCB_HANDLER(mquake_cia_0_portb_w) } /* port B */
}
DEVCB_NULL,
DEVCB_NULL,
DEVCB_INPUT_PORT("CIA0PORTA"),
DEVCB_HANDLER(mquake_cia_0_porta_w), /* port A */
DEVCB_HANDLER(mquake_cia_0_portb_r),
DEVCB_HANDLER(mquake_cia_0_portb_w) /* port B */
};
static const cia6526_interface cia_1_intf =
static const mos6526_interface cia_1_intf =
{
0, /* tod_clock */
DEVCB_LINE(amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
0, /* tod_clock */
{
{ DEVCB_NULL, DEVCB_NULL }, /* port A */
{ DEVCB_NULL, DEVCB_NULL } /* port B */
}
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL
};
static MACHINE_DRIVER_START( mquake )
@ -394,8 +398,8 @@ static MACHINE_DRIVER_START( mquake )
MDRV_SOUND_ROUTE(1, "rspeaker", 0.50)
/* cia */
MDRV_CIA8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_intf)
MDRV_CIA8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, cia_1_intf)
MDRV_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_intf)
MDRV_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, cia_1_intf)
MACHINE_DRIVER_END

View File

@ -274,26 +274,30 @@ INPUT_PORTS_END
*
*************************************/
static const cia6526_interface cia_0_intf =
static const mos6526_interface cia_0_intf =
{
0, /* tod_clock */
DEVCB_LINE(amiga_cia_0_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
0, /* tod_clock */
{
{ DEVCB_NULL, DEVCB_HANDLER(upscope_cia_0_porta_w) }, /* port A */
{ DEVCB_HANDLER(upscope_cia_0_portb_r), DEVCB_HANDLER(upscope_cia_0_portb_w) } /* port B */
}
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_HANDLER(upscope_cia_0_porta_w), /* port A */
DEVCB_HANDLER(upscope_cia_0_portb_r),
DEVCB_HANDLER(upscope_cia_0_portb_w) /* port B */
};
static const cia6526_interface cia_1_intf =
static const mos6526_interface cia_1_intf =
{
0, /* tod_clock */
DEVCB_LINE(amiga_cia_1_irq), /* irq_func */
DEVCB_NULL, /* pc_func */
0, /* tod_clock */
{
{ DEVCB_HANDLER(upscope_cia_1_porta_r), DEVCB_HANDLER(upscope_cia_1_porta_w), }, /* port A */
{ DEVCB_NULL, DEVCB_NULL } /* port B */
}
DEVCB_NULL,
DEVCB_NULL,
DEVCB_HANDLER(upscope_cia_1_porta_r),
DEVCB_HANDLER(upscope_cia_1_porta_w), /* port A */
DEVCB_NULL,
DEVCB_NULL
};
static MACHINE_DRIVER_START( upscope )
@ -331,8 +335,8 @@ static MACHINE_DRIVER_START( upscope )
MDRV_SOUND_ROUTE(3, "rspeaker", 0.50)
/* cia */
MDRV_CIA8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_intf)
MDRV_CIA8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, cia_1_intf)
MDRV_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, cia_0_intf)
MDRV_MOS8520_ADD("cia_1", AMIGA_68000_NTSC_CLOCK / 10, cia_1_intf)
MACHINE_DRIVER_END

View File

@ -351,7 +351,7 @@ static TIMER_CALLBACK( scanline_callback )
amiga_custom_w(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), REG_INTREQ, 0x8000 | INTENA_VERTB, 0xffff);
/* clock the first CIA TOD */
cia_clock_tod(cia_0);
mos6526_tod_w(cia_0, 1);
/* call the system-specific callback */
if (amiga_intf->scanline0_callback != NULL)
@ -359,7 +359,7 @@ static TIMER_CALLBACK( scanline_callback )
}
/* on every scanline, clock the second CIA TOD */
cia_clock_tod(cia_1);
mos6526_tod_w(cia_1, 1);
/* render up to this scanline */
if (!video_screen_update_partial(machine->primary_screen, scanline))
@ -1058,7 +1058,7 @@ READ16_HANDLER( amiga_cia_r )
}
/* handle the reads */
data = cia_r(cia, offset >> 7);
data = mos6526_r(cia, offset >> 7);
if (LOG_CIA)
logerror("%06x:cia_%c_read(%03x) = %04x & %04x\n", cpu_get_pc(space->cpu), 'A' + ((~offset & 0x0800) >> 11), offset * 2, data << shift, mem_mask);
@ -1100,7 +1100,7 @@ WRITE16_HANDLER( amiga_cia_w )
}
/* handle the writes */
cia_w(cia, offset >> 7, (UINT8) data);
mos6526_w(cia, offset >> 7, (UINT8) data);
}
@ -1446,8 +1446,8 @@ WRITE16_HANDLER( amiga_custom_w )
data = (data & 0x8000) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff));
cia_0 = devtag_get_device(space->machine, "cia_0");
cia_1 = devtag_get_device(space->machine, "cia_1");
if ( cia_get_irq( cia_0 ) ) data |= INTENA_PORTS;
if ( cia_get_irq( cia_1 ) ) data |= INTENA_EXTER;
if ( mos6526_irq_r( cia_0 ) ) data |= INTENA_PORTS;
if ( mos6526_irq_r( cia_1 ) ) data |= INTENA_EXTER;
CUSTOM_REG(offset) = data;
if ( temp & 0x8000 ) /* if we're generating irq's, delay a bit */