Converted 6532riot to devcb interfaces

- updated all drivers
- converted drivers to RS/WS tms5220 interface where appropriate
- removed quite some trampoline functions
This commit is contained in:
Couriersud 2009-09-22 20:11:23 +00:00
parent 47fbe6897d
commit 841cbd77c7
10 changed files with 123 additions and 152 deletions

View File

@ -38,11 +38,11 @@ enum
typedef struct _riot6532_port riot6532_port; typedef struct _riot6532_port riot6532_port;
struct _riot6532_port struct _riot6532_port
{ {
UINT8 in; UINT8 in;
UINT8 out; UINT8 out;
UINT8 ddr; UINT8 ddr;
riot_read_func in_func; devcb_resolved_read8 in_func;
riot_write_func out_func; devcb_resolved_write8 out_func;
}; };
@ -54,6 +54,8 @@ struct _riot6532_state
int index; int index;
riot6532_port port[2]; riot6532_port port[2];
devcb_resolved_write_line irq_func;
UINT8 irqstate; UINT8 irqstate;
UINT8 irqenable; UINT8 irqenable;
@ -96,8 +98,8 @@ INLINE void update_irqstate(const device_config *device)
riot6532_state *riot = get_safe_token(device); riot6532_state *riot = get_safe_token(device);
int state = (riot->irqstate & riot->irqenable); int state = (riot->irqstate & riot->irqenable);
if (riot->intf->irq_func != NULL) if (riot->irq_func.write != NULL)
(*riot->intf->irq_func)(device, (state != 0) ? ASSERT_LINE : CLEAR_LINE); devcb_call_write_line(&riot->irq_func, (state != 0) ? ASSERT_LINE : CLEAR_LINE);
else else
logerror("%s:6532RIOT chip #%d: no irq callback function\n", cpuexec_describe_context(device->machine), riot->index); logerror("%s:6532RIOT chip #%d: no irq callback function\n", cpuexec_describe_context(device->machine), riot->index);
} }
@ -256,10 +258,9 @@ WRITE8_DEVICE_HANDLER( riot6532_w )
/* if A0 == 0, we are writing to the port's output */ /* if A0 == 0, we are writing to the port's output */
else else
{ {
UINT8 olddata = port->out;
port->out = data; port->out = data;
if (port->out_func != NULL) if (port->out_func.write != NULL)
(*port->out_func)(device, data, olddata); devcb_call_write8(&port->out_func, 0, data);
else else
logerror("%s:6532RIOT chip %s: Port %c is being written to but has no handler. %02X\n", cpuexec_describe_context(device->machine), device->tag, 'A' + (offset & 1), data); logerror("%s:6532RIOT chip %s: Port %c is being written to but has no handler. %02X\n", cpuexec_describe_context(device->machine), device->tag, 'A' + (offset & 1), data);
} }
@ -321,9 +322,9 @@ READ8_DEVICE_HANDLER( riot6532_r )
else else
{ {
/* call the input callback if it exists */ /* call the input callback if it exists */
if (port->in_func != NULL) if (port->in_func.read != NULL)
{ {
port->in = (*port->in_func)(device, port->in); port->in = devcb_call_read8(&port->in_func, 0);
/* changes to port A need to update the PA7 state */ /* changes to port A need to update the PA7 state */
if (port == &riot->port[0]) if (port == &riot->port[0])
@ -437,10 +438,13 @@ static DEVICE_START( riot6532 )
riot->index = device_list_index(device->machine->config->devicelist, RIOT6532, device->tag); riot->index = device_list_index(device->machine->config->devicelist, RIOT6532, device->tag);
/* configure the ports */ /* configure the ports */
riot->port[0].in_func = riot->intf->in_a_func; devcb_resolve_read8(&riot->port[0].in_func, &riot->intf->in_a_func, device);
riot->port[0].out_func = riot->intf->out_a_func; devcb_resolve_write8(&riot->port[0].out_func, &riot->intf->out_a_func, device);
riot->port[1].in_func = riot->intf->in_b_func; devcb_resolve_read8(&riot->port[1].in_func, &riot->intf->in_b_func, device);
riot->port[1].out_func = riot->intf->out_b_func; devcb_resolve_write8(&riot->port[1].out_func, &riot->intf->out_b_func, device);
/* resolve irq func */
devcb_resolve_write_line(&riot->irq_func, &riot->intf->irq_func, device);
/* allocate timers */ /* allocate timers */
riot->timer = timer_alloc(device->machine, timer_end_callback, (void *)device); riot->timer = timer_alloc(device->machine, timer_end_callback, (void *)device);

View File

@ -7,24 +7,21 @@
#ifndef __RIOT6532_H__ #ifndef __RIOT6532_H__
#define __RIOT6532_H__ #define __RIOT6532_H__
#include "devcb.h"
/*************************************************************************** /***************************************************************************
TYPE DEFINITIONS TYPE DEFINITIONS
***************************************************************************/ ***************************************************************************/
typedef UINT8 (*riot_read_func)(const device_config *device, UINT8 olddata);
typedef void (*riot_write_func)(const device_config *device, UINT8 newdata, UINT8 olddata);
typedef void (*riot_irq_func)(const device_config *device, int state);
typedef struct _riot6532_interface riot6532_interface; typedef struct _riot6532_interface riot6532_interface;
struct _riot6532_interface struct _riot6532_interface
{ {
riot_read_func in_a_func; devcb_read8 in_a_func;
riot_read_func in_b_func; devcb_read8 in_b_func;
riot_write_func out_a_func; devcb_write8 out_a_func;
riot_write_func out_b_func; devcb_write8 out_b_func;
riot_irq_func irq_func; devcb_write_line irq_func;
}; };

View File

@ -46,6 +46,7 @@ TODO:
If a command is still executing, /READY will be kept high until the command has If a command is still executing, /READY will be kept high until the command has
finished if the next command is written. finished if the next command is written.
TMS5220C: see below. TMS5220C: see below.
tomcat has a 5220 which is not hooked up at all
Notes: Notes:
Looping has the tms5220 hookep up directly to the cpu. However currently the Looping has the tms5220 hookep up directly to the cpu. However currently the

View File

@ -459,35 +459,46 @@ static void r6532_irq(const device_config *device, int state)
} }
static void r6532_porta_w(const device_config *device, UINT8 newdata, UINT8 olddata) static WRITE8_DEVICE_HANDLER( r6532_porta_w )
{ {
if (has_mc3417) if (has_mc3417)
cputag_set_input_line(device->machine, "cvsdcpu", INPUT_LINE_RESET, (newdata & 0x10) ? CLEAR_LINE : ASSERT_LINE); cputag_set_input_line(device->machine, "cvsdcpu", INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE);
if (has_tms5220)
{
const device_config *tms = devtag_get_device(device->machine, "tms");
logerror("(%f)%s:TMS5220 data write = %02X\n", attotime_to_double(timer_get_time(device->machine)), cpuexec_describe_context(device->machine), riot6532_porta_out_get(riot));
tms5220_data_w(tms, 0, data);
}
} }
static READ8_DEVICE_HANDLER( r6532_porta_r )
static void r6532_portb_w(const device_config *device, UINT8 newdata, UINT8 olddata)
{ {
const device_config *tms = devtag_get_device(device->machine, "tms"); if (has_tms5220)
if (device != NULL)
{ {
if ((olddata & 0x01) && !(newdata & 0x01)) const device_config *tms = devtag_get_device(device->machine, "tms");
{ logerror("(%f)%s:TMS5220 status read = %02X\n", attotime_to_double(timer_get_time(device->machine)), cpuexec_describe_context(device->machine), tms5220_status_r(tms, 0));
riot6532_porta_in_set(riot, tms5220_status_r(tms, 0), 0xff); return tms5220_status_r(tms, 0);
logerror("(%f)%s:TMS5220 status read = %02X\n", attotime_to_double(timer_get_time(device->machine)), cpuexec_describe_context(device->machine), tms5220_status_r(tms, 0)); }
} else
if ((olddata & 0x02) && !(newdata & 0x02)) return 0xff;
{ }
logerror("(%f)%s:TMS5220 data write = %02X\n", attotime_to_double(timer_get_time(device->machine)), cpuexec_describe_context(device->machine), riot6532_porta_out_get(riot));
tms5220_data_w(tms, 0, riot6532_porta_out_get(riot)); static WRITE8_DEVICE_HANDLER( r6532_portb_w )
} {
if (has_tms5220)
{
const device_config *tms = devtag_get_device(device->machine, "tms");
tms5220_rsq_w(tms, data & 0x01);
tms5220_wsq_w(tms, (data >> 1) & 0x01);
} }
} }
static UINT8 r6532_portb_r(const device_config *device, UINT8 olddata) static READ8_DEVICE_HANDLER( r6532_portb_r )
{ {
UINT8 newdata = olddata; UINT8 newdata = riot6532_portb_in_get(device);
if (has_tms5220) if (has_tms5220)
{ {
const device_config *tms = devtag_get_device(device->machine, "tms"); const device_config *tms = devtag_get_device(device->machine, "tms");
@ -501,11 +512,11 @@ static UINT8 r6532_portb_r(const device_config *device, UINT8 olddata)
static const riot6532_interface r6532_interface = static const riot6532_interface r6532_interface =
{ {
NULL, /* port A read handler */ DEVCB_HANDLER(r6532_porta_r), /* port A read handler */
r6532_portb_r, /* port B read handler */ DEVCB_HANDLER(r6532_portb_r), /* port B read handler */
r6532_porta_w, /* port A write handler */ DEVCB_HANDLER(r6532_porta_w), /* port A write handler */
r6532_portb_w, /* port B write handler */ DEVCB_HANDLER(r6532_portb_w), /* port B write handler */
r6532_irq /* IRQ callback */ DEVCB_LINE(r6532_irq) /* IRQ callback */
}; };

View File

@ -94,32 +94,26 @@ static void gottlieb1_sh_w(const device_config *riot, UINT8 data)
* *
*************************************/ *************************************/
static void snd_interrupt(const device_config *device, int state) static WRITE_LINE_DEVICE_HANDLER( snd_interrupt )
{ {
cputag_set_input_line(device->machine, "audiocpu", M6502_IRQ_LINE, state); cputag_set_input_line(device->machine, "audiocpu", M6502_IRQ_LINE, state);
} }
static UINT8 r6532_portb_r(const device_config *device, UINT8 olddata) static WRITE8_DEVICE_HANDLER( r6532_portb_w )
{
return input_port_read(device->machine, "SB1");
}
static void r6532_portb_w(const device_config *device, UINT8 newdata, UINT8 olddata)
{ {
/* unsure if this is ever used, but the NMI is connected to the RIOT's PB7 */ /* unsure if this is ever used, but the NMI is connected to the RIOT's PB7 */
cputag_set_input_line(device->machine, "audiocpu", INPUT_LINE_NMI, (newdata & 0x80) ? CLEAR_LINE : ASSERT_LINE); cputag_set_input_line(device->machine, "audiocpu", INPUT_LINE_NMI, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE);
} }
static const riot6532_interface gottlieb_riot6532_intf = static const riot6532_interface gottlieb_riot6532_intf =
{ {
NULL, DEVCB_NULL,
r6532_portb_r, DEVCB_INPUT_PORT("SB1"),
NULL, DEVCB_NULL,
r6532_portb_w, DEVCB_HANDLER(r6532_portb_w),
snd_interrupt DEVCB_LINE(snd_interrupt)
}; };

View File

@ -31,7 +31,7 @@ SOUND_START( starwars )
* *
*************************************/ *************************************/
static UINT8 r6532_porta_r(const device_config *device, UINT8 olddata) static READ8_DEVICE_HANDLER( r6532_porta_r )
{ {
/* Configured as follows: */ /* Configured as follows: */
/* d7 (in) Main Ready Flag */ /* d7 (in) Main Ready Flag */
@ -44,26 +44,22 @@ static UINT8 r6532_porta_r(const device_config *device, UINT8 olddata)
/* d1 (out) TMS5220 Not Read */ /* d1 (out) TMS5220 Not Read */
/* d0 (out) TMS5220 Not Write */ /* d0 (out) TMS5220 Not Write */
/* Note: bit 4 is always set to avoid sound self test */ /* Note: bit 4 is always set to avoid sound self test */
UINT8 olddata = riot6532_porta_in_get(device);
return (olddata & 0xc0) | 0x10 | (tms5220_readyq_r(devtag_get_device(device->machine, "tms")) << 2); return (olddata & 0xc0) | 0x10 | (tms5220_readyq_r(devtag_get_device(device->machine, "tms")) << 2);
} }
static void r6532_porta_w(const device_config *device, UINT8 newdata, UINT8 olddata) static WRITE8_DEVICE_HANDLER( r6532_porta_w )
{ {
const device_config *tms = devtag_get_device(device->machine, "tms");
/* handle 5220 read */ /* handle 5220 read */
if ((olddata & 2) != 0 && (newdata & 2) == 0) tms5220_rsq_w(device, (data & 2)>>1);
riot6532_portb_in_set(riot, tms5220_status_r(tms, 0), 0xff);
/* handle 5220 write */ /* handle 5220 write */
if ((olddata & 1) != 0 && (newdata & 1) == 0) tms5220_wsq_w(device, (data & 1)>>0);
tms5220_data_w(tms, 0, riot6532_portb_out_get(riot));
} }
static void snd_interrupt(const device_config *device, int state) static WRITE_LINE_DEVICE_HANDLER( snd_interrupt )
{ {
cputag_set_input_line(device->machine, "audiocpu", M6809_IRQ_LINE, state); cputag_set_input_line(device->machine, "audiocpu", M6809_IRQ_LINE, state);
} }
@ -71,11 +67,11 @@ static void snd_interrupt(const device_config *device, int state)
const riot6532_interface starwars_riot6532_intf = const riot6532_interface starwars_riot6532_intf =
{ {
r6532_porta_r, DEVCB_HANDLER(r6532_porta_r),
NULL, DEVCB_DEVICE_HANDLER("tms", tms5220_status_r),
r6532_porta_w, DEVCB_DEVICE_HANDLER("tms", r6532_porta_w),
NULL, DEVCB_DEVICE_HANDLER("tms", tms5220_data_w),
snd_interrupt DEVCB_LINE(snd_interrupt)
}; };

View File

@ -289,7 +289,7 @@ static WRITE8_HANDLER( sound_to_main_w )
* *
*************************************/ *************************************/
static UINT8 riot_porta_r(const device_config *device, UINT8 olddata) static READ8_DEVICE_HANDLER( riot_porta_r )
{ {
/* bit 7 = MAINFLAG */ /* bit 7 = MAINFLAG */
/* bit 6 = SOUNDFLAG */ /* bit 6 = SOUNDFLAG */
@ -300,34 +300,21 @@ static UINT8 riot_porta_r(const device_config *device, UINT8 olddata)
/* bit 1 = TMS /read */ /* bit 1 = TMS /read */
/* bit 0 = TMS /write */ /* bit 0 = TMS /write */
const device_config *tms = devtag_get_device(device->machine, "tms"); return (main_to_sound_flag << 7) | (sound_to_main_flag << 6) | 0x10 | (tms5220_readyq_r(device) << 2);
return (main_to_sound_flag << 7) | (sound_to_main_flag << 6) | 0x10 | (tms5220_readyq_r(tms) << 2);
} }
static UINT8 riot_portb_r(const device_config *device, UINT8 olddata) static WRITE8_DEVICE_HANDLER( riot_porta_w )
{
const device_config *tms = devtag_get_device(device->machine, "tms");
return tms5220_status_r(tms, 0);
}
static void riot_porta_w(const device_config *device, UINT8 newdata, UINT8 olddata)
{ {
const device_config *tms = devtag_get_device(device->machine, "tms"); const device_config *tms = devtag_get_device(device->machine, "tms");
/* handle 5220 read */ /* handle 5220 read */
tms5220_rsq_w(tms, (newdata>>1) & 1); tms5220_rsq_w(tms, (data>>1) & 1);
/* handle 5220 write */ /* handle 5220 write */
tms5220_wsq_w(tms, newdata & 1); tms5220_wsq_w(tms, data & 1);
} }
static void riot_portb_w(const device_config *device, UINT8 newdata, UINT8 olddata) static WRITE_LINE_DEVICE_HANDLER( riot_irq )
{
const device_config *tms = devtag_get_device(device->machine, "tms");
tms5220_data_w(tms, 0, newdata);
}
static void riot_irq(const device_config *device, int state)
{ {
cputag_set_input_line(device->machine, "audiocpu", M6502_IRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE); cputag_set_input_line(device->machine, "audiocpu", M6502_IRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE);
} }
@ -647,11 +634,11 @@ GFXDECODE_END
static const riot6532_interface riot_intf = static const riot6532_interface riot_intf =
{ {
riot_porta_r, DEVCB_DEVICE_HANDLER("tms", riot_porta_r),
riot_portb_r, DEVCB_DEVICE_HANDLER("tms", tms5220_status_r),
riot_porta_w, DEVCB_DEVICE_HANDLER("tms", riot_porta_w),
riot_portb_w, DEVCB_DEVICE_HANDLER("tms", tms5220_data_w),
riot_irq DEVCB_LINE(riot_irq)
}; };

View File

@ -180,7 +180,7 @@ static const via6522_interface via_2_interface =
* *
*************************************/ *************************************/
static void r6532_irq(const device_config *device, int state) static WRITE_LINE_DEVICE_HANDLER( r6532_irq )
{ {
cputag_set_input_line(device->machine, "audiocpu", 0, state); cputag_set_input_line(device->machine, "audiocpu", 0, state);
if (state == ASSERT_LINE) if (state == ASSERT_LINE)
@ -188,20 +188,20 @@ static void r6532_irq(const device_config *device, int state)
} }
static void r6532_soundlatch_w(const device_config *device, UINT8 newdata, UINT8 olddata) static WRITE8_DEVICE_HANDLER( r6532_soundlatch_w )
{ {
const address_space *space = cputag_get_address_space(device->machine, "maincpu", ADDRESS_SPACE_PROGRAM); const address_space *space = cputag_get_address_space(device->machine, "maincpu", ADDRESS_SPACE_PROGRAM);
soundlatch_w(space, 0, newdata); soundlatch_w(space, 0, data);
} }
static const riot6532_interface r6532_interface = static const riot6532_interface r6532_interface =
{ {
NULL, /* port A read handler */ DEVCB_NULL, /* port A read handler */
NULL, /* port B read handler */ DEVCB_NULL, /* port B read handler */
NULL, /* port A write handler */ DEVCB_NULL, /* port A write handler */
r6532_soundlatch_w, /* port B write handler */ DEVCB_HANDLER(r6532_soundlatch_w), /* port B write handler */
r6532_irq /* IRQ callback */ DEVCB_LINE(r6532_irq) /* IRQ callback */
}; };

View File

@ -8,7 +8,7 @@
- game has no sound, while sound hardware was developed, sound program was - game has no sound, while sound hardware was developed, sound program was
not prepared not prepared
ToDo: TODO:
- add proper timing of interrupts and framerate (currently commented out, - add proper timing of interrupts and framerate (currently commented out,
as they cause test mode to hang) as they cause test mode to hang)
- vector quality appears to be worse than original game (compared to original - vector quality appears to be worse than original game (compared to original
@ -18,6 +18,7 @@
- current implementation of 68010 <-> tms32010 is a little bit hacky, after - current implementation of 68010 <-> tms32010 is a little bit hacky, after
tms32010 is started by 68010, 68010 is suspended until tms32010 reads command tms32010 is started by 68010, 68010 is suspended until tms32010 reads command
and starts executing and starts executing
- hook up tms5220 - it is currently not used at all
*/ */
@ -354,7 +355,7 @@ static NVRAM_HANDLER(tomcat)
static const riot6532_interface tomcat_riot6532_intf = static const riot6532_interface tomcat_riot6532_intf =
{ {
NULL, DEVCB_NULL,
/* /*
PA0 = /WS OUTPUT (TMS-5220 WRITE STROBE) PA0 = /WS OUTPUT (TMS-5220 WRITE STROBE)
PA1 = /RS OUTPUT (TMS-5220 READ STROBE) PA1 = /RS OUTPUT (TMS-5220 READ STROBE)
@ -367,10 +368,10 @@ static const riot6532_interface tomcat_riot6532_intf =
PA6 = /MUSRES OUTPUT (Reset the Yamaha) PA6 = /MUSRES OUTPUT (Reset the Yamaha)
PA7 = MAINFLAG INPUT PA7 = MAINFLAG INPUT
*/ */
NULL, DEVCB_NULL,
NULL, DEVCB_NULL,
NULL, // PB0 - PB7 OUTPUT Speech Data DEVCB_NULL, // PB0 - PB7 OUTPUT Speech Data
NULL // connected to IRQ line of 6502 DEVCB_NULL // connected to IRQ line of 6502
}; };
static MACHINE_DRIVER_START(tomcat) static MACHINE_DRIVER_START(tomcat)

View File

@ -16,14 +16,14 @@
#define MASTER_CLOCK 3579575 #define MASTER_CLOCK 3579575
static void tourtabl_led_w(const device_config *device, UINT8 newdata, UINT8 olddata) static WRITE8_DEVICE_HANDLER( tourtabl_led_w )
{ {
set_led_status(0, newdata & 0x40); /* start 1 */ set_led_status(0, data & 0x40); /* start 1 */
set_led_status(1, newdata & 0x20); /* start 2 */ set_led_status(1, data & 0x20); /* start 2 */
set_led_status(2, newdata & 0x10); /* start 4 */ set_led_status(2, data & 0x10); /* start 4 */
set_led_status(3, newdata & 0x80); /* select game */ set_led_status(3, data & 0x80); /* select game */
coin_lockout_global_w(!(newdata & 0x80)); coin_lockout_global_w(!(data & 0x80));
} }
@ -51,48 +51,28 @@ static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
ADDRESS_MAP_END ADDRESS_MAP_END
static UINT8 port6_r(const device_config *device, UINT8 olddata) static WRITE8_DEVICE_HANDLER( watchdog_w )
{
return input_port_read(device->machine, "RIOT0_SWA");
}
static UINT8 port7_r(const device_config *device, UINT8 olddata)
{
return input_port_read(device->machine, "RIOT0_SWB");
}
static UINT8 port8_r(const device_config *device, UINT8 olddata)
{
return input_port_read(device->machine, "RIOT1_SWA");
}
static UINT8 port9_r(const device_config *device, UINT8 olddata)
{
return input_port_read(device->machine, "RIOT1_SWB");
}
static void watchdog_w(const device_config *device, UINT8 newdata, UINT8 olddata)
{ {
watchdog_reset(device->machine); watchdog_reset(device->machine);
} }
static const riot6532_interface r6532_interface_0 = static const riot6532_interface r6532_interface_0 =
{ {
port6_r, DEVCB_INPUT_PORT("RIOT0_SWA"), /* Port 6 */
port7_r, DEVCB_INPUT_PORT("RIOT0_SWB"), /* Port 7 */
NULL, DEVCB_NULL,
watchdog_w, DEVCB_HANDLER(watchdog_w),
NULL DEVCB_NULL
}; };
static const riot6532_interface r6532_interface_1 = static const riot6532_interface r6532_interface_1 =
{ {
port8_r, DEVCB_INPUT_PORT("RIOT1_SWA"), /* Port 8 */
port9_r, DEVCB_INPUT_PORT("RIOT1_SWB"), /* Port 9 */
NULL, DEVCB_NULL,
tourtabl_led_w, DEVCB_HANDLER(tourtabl_led_w),
NULL DEVCB_NULL
}; };