From 2244f9274d695de99eb2643ba84afae2e3ee72e9 Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Tue, 19 Jan 2010 14:26:51 +0000 Subject: [PATCH] Refactored the CIA 6526 interface, adding SP/CNT callbacks. --- src/emu/machine/6526cia.c | 269 +++++++++++++++++++----------------- src/emu/machine/6526cia.h | 109 ++++++++++----- src/mame/drivers/alg.c | 32 +++-- src/mame/drivers/arcadia.c | 32 +++-- src/mame/drivers/cubocd32.c | 34 +++-- src/mame/drivers/mquake.c | 32 +++-- src/mame/drivers/upscope.c | 32 +++-- src/mame/machine/amiga.c | 12 +- 8 files changed, 310 insertions(+), 242 deletions(-) diff --git a/src/emu/machine/6526cia.c b/src/emu/machine/6526cia.c index b84ac260bd1..9c981f91b6e 100644 --- a/src/emu/machine/6526cia.c +++ b/src/emu/machine/6526cia.c @@ -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; } } - - diff --git a/src/emu/machine/6526cia.h b/src/emu/machine/6526cia.h index 4b40f2873b4..ab39d33fefb 100644 --- a/src/emu/machine/6526cia.h +++ b/src/emu/machine/6526cia.h @@ -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__ */ diff --git a/src/mame/drivers/alg.c b/src/mame/drivers/alg.c index edb903b8b32..1f77f2fbe0c 100644 --- a/src/mame/drivers/alg.c +++ b/src/mame/drivers/alg.c @@ -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 diff --git a/src/mame/drivers/arcadia.c b/src/mame/drivers/arcadia.c index 18603ae470b..9d280a7e5d6 100644 --- a/src/mame/drivers/arcadia.c +++ b/src/mame/drivers/arcadia.c @@ -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 diff --git a/src/mame/drivers/cubocd32.c b/src/mame/drivers/cubocd32.c index 38b60a215b4..fe52df855f2 100644 --- a/src/mame/drivers/cubocd32.c +++ b/src/mame/drivers/cubocd32.c @@ -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)) diff --git a/src/mame/drivers/mquake.c b/src/mame/drivers/mquake.c index a7c73440d17..19a0a4306d0 100644 --- a/src/mame/drivers/mquake.c +++ b/src/mame/drivers/mquake.c @@ -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 diff --git a/src/mame/drivers/upscope.c b/src/mame/drivers/upscope.c index eec9873833a..740c05401ad 100644 --- a/src/mame/drivers/upscope.c +++ b/src/mame/drivers/upscope.c @@ -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 diff --git a/src/mame/machine/amiga.c b/src/mame/machine/amiga.c index 33d495ed66c..1d7ce2953eb 100644 --- a/src/mame/machine/amiga.c +++ b/src/mame/machine/amiga.c @@ -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 */