1. Added the ability to invoke CPU input lines with devcb callbacks

2.  Changed sp0256 to use devcb callbacks

3.  Updated sauro driver as per #2
This commit is contained in:
Nathan Woods 2009-01-31 21:23:22 +00:00
parent e4aeab1a20
commit 219639f3d7
5 changed files with 48 additions and 24 deletions

View File

@ -98,6 +98,13 @@ static WRITE_LINE_DEVICE_HANDLER( trampoline_write8_to_write_line )
(*resolved->real.writedevice)(resolved->realtarget, 0, state); (*resolved->real.writedevice)(resolved->realtarget, 0, state);
} }
static WRITE_LINE_DEVICE_HANDLER( trampoline_writecpu_to_write_line )
{
const devcb_resolved_write_line *resolved = (const devcb_resolved_write_line *)device;
const device_config *cpu = resolved->realtarget;
cpu_set_input_line(cpu, resolved->real.writeline, state ? ASSERT_LINE : CLEAR_LINE);
}
void devcb_resolve_write_line(devcb_resolved_write_line *resolved, const devcb_write_line *config, const device_config *device) void devcb_resolve_write_line(devcb_resolved_write_line *resolved, const devcb_write_line *config, const device_config *device)
{ {
/* reset the resolved structure */ /* reset the resolved structure */
@ -119,6 +126,20 @@ void devcb_resolve_write_line(devcb_resolved_write_line *resolved, const devcb_w
resolved->real.writespace = config->writespace; resolved->real.writespace = config->writespace;
} }
/* cpu line handlers */
else if (config->type >= DEVCB_TYPE_CPU_LINE(0) && config->type < DEVCB_TYPE_CPU_LINE(MAX_INPUT_LINES))
{
FPTR line = (FPTR)config->type - (FPTR)DEVCB_TYPE_CPU_LINE(0);
const device_config *cpu = cputag_get_cpu(device->machine, config->tag);
if (cpu == NULL)
fatalerror("devcb_resolve_write_line: unable to find CPU '%s' (requested by %s '%s')", config->tag, device_get_name(device), device->tag);
resolved->target = resolved;
resolved->write = trampoline_writecpu_to_write_line;
resolved->realtarget = cpu;
resolved->real.writeline = (int) line;
}
/* device handlers */ /* device handlers */
else if (config->type != NULL && (config->writeline != NULL || config->writedevice != NULL)) else if (config->type != NULL && (config->writeline != NULL || config->writedevice != NULL))
{ {

View File

@ -24,6 +24,7 @@
The adapted callback types supported are: The adapted callback types supported are:
input port (port) input port (port)
cpu input line (cpu input line)
read_line_device_func: (device) read_line_device_func: (device)
write_line_device_func: (device, data) write_line_device_func: (device, data)
read8_device_func: (device, offset) read8_device_func: (device, offset)
@ -49,6 +50,7 @@
#define DEVCB_TYPE_SELF ((device_type)1) #define DEVCB_TYPE_SELF ((device_type)1)
#define DEVCB_TYPE_INPUT ((device_type)2) #define DEVCB_TYPE_INPUT ((device_type)2)
#define DEVCB_TYPE_MEMORY(space) ((device_type)(4 + (space))) #define DEVCB_TYPE_MEMORY(space) ((device_type)(4 + (space)))
#define DEVCB_TYPE_CPU_LINE(line) ((device_type)(4 + ADDRESS_SPACES + (line)))
@ -72,6 +74,9 @@
/* read handlers for an I/O port by tag */ /* read handlers for an I/O port by tag */
#define DEVCB_INPUT_PORT(tag) { DEVCB_TYPE_INPUT, (tag), NULL, NULL, NULL } #define DEVCB_INPUT_PORT(tag) { DEVCB_TYPE_INPUT, (tag), NULL, NULL, NULL }
/* write handlers for a CPU input line */
#define DEVCB_CPU_INPUT_LINE(tag,line) { DEVCB_TYPE_CPU_LINE(line), (tag), NULL, NULL, NULL }
/* macros for defining read_line/write_line functions */ /* macros for defining read_line/write_line functions */
#define READ_LINE_DEVICE_HANDLER(name) int name(ATTR_UNUSED const device_config *device) #define READ_LINE_DEVICE_HANDLER(name) int name(ATTR_UNUSED const device_config *device)
@ -134,6 +139,7 @@ struct _devcb_resolved_write_line
{ {
write8_device_func writedevice; write8_device_func writedevice;
write8_space_func writespace; write8_space_func writespace;
int writeline;
} real; /* real write function for stubs */ } real; /* real write function for stubs */
}; };

View File

@ -58,7 +58,7 @@
if( sp->sby_line != line_state ) \ if( sp->sby_line != line_state ) \
{ \ { \
sp->sby_line = line_state; \ sp->sby_line = line_state; \
if( sp->sby ) sp->sby(sp->device, sp->sby_line); \ devcb_call_write_line(&sp->sby, sp->sby_line); \
} \ } \
} }
@ -79,8 +79,8 @@ struct sp0256
{ {
const device_config *device; const device_config *device;
sound_stream *stream; /* MAME core sound stream */ sound_stream *stream; /* MAME core sound stream */
void (*drq)(const device_config *device, int state); /* Data request callback */ devcb_resolved_write_line drq; /* Data request callback */
void (*sby)(const device_config *device, int state); /* Standby callback */ devcb_resolved_write_line sby; /* Standby callback */
int sby_line; /* Standby line state */ int sby_line; /* Standby line state */
INT16 *cur_buf; /* Current sound buffer. */ INT16 *cur_buf; /* Current sound buffer. */
int cur_len; /* Fullness of current sound buffer. */ int cur_len; /* Fullness of current sound buffer. */
@ -767,7 +767,7 @@ static void sp0256_micro(struct sp0256 *sp)
sp->ald = 0; sp->ald = 0;
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
sp->filt.r[i] = 0; sp->filt.r[i] = 0;
if( sp->drq) sp->drq(sp->device, ASSERT_LINE); devcb_call_write_line(&sp->drq, 1);
} }
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
@ -781,7 +781,7 @@ static void sp0256_micro(struct sp0256 *sp)
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
sp->filt.r[i] = 0; sp->filt.r[i] = 0;
SET_SBY(ASSERT_LINE) SET_SBY(1)
return; return;
} }
@ -1175,10 +1175,10 @@ static SND_START( sp0256 )
struct sp0256 *sp = device->token; struct sp0256 *sp = device->token;
sp->device = device; sp->device = device;
sp->drq = intf->lrq_callback; devcb_resolve_write_line(&sp->drq, &intf->lrq_callback, device);
sp->sby = intf->sby_callback; devcb_resolve_write_line(&sp->sby, &intf->sby_callback, device);
if( sp->drq ) sp->drq(device, ASSERT_LINE); devcb_call_write_line(&sp->drq, 1);
if( sp->sby ) sp->sby(device, sp->sby_line = ASSERT_LINE); devcb_call_write_line(&sp->sby, 1);
sp->stream = stream_create(device, 0, 1, clock / CLOCK_DIVIDER, sp, sp0256_update); sp->stream = stream_create(device, 0, 1, clock / CLOCK_DIVIDER, sp, sp0256_update);
@ -1234,8 +1234,8 @@ static void sp0256_reset(struct sp0256 *sp)
sp->mode = 0; sp->mode = 0;
sp->page = 0x1000 << 3; sp->page = 0x1000 << 3;
sp->silent = 1; sp->silent = 1;
if( sp->drq ) sp->drq(sp->device, ASSERT_LINE); devcb_call_write_line(&sp->drq, 1);
SET_SBY(ASSERT_LINE) SET_SBY(1)
} }
static SND_RESET( sp0256 ) static SND_RESET( sp0256 )
@ -1263,8 +1263,8 @@ WRITE8_HANDLER( sp0256_ALD_w )
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
sp->lrq = 0; sp->lrq = 0;
sp->ald = (0xFF & data) << 4; sp->ald = (0xFF & data) << 4;
if( sp->drq ) sp->drq(sp->device, CLEAR_LINE); devcb_call_write_line(&sp->drq, 0);
SET_SBY(CLEAR_LINE) SET_SBY(0)
return; return;
} }

View File

@ -3,6 +3,8 @@
#ifndef __SP0256_H__ #ifndef __SP0256_H__
#define __SP0256_H__ #define __SP0256_H__
#include "devcb.h"
/* /*
GI SP0256 Narrator Speech Processor GI SP0256 Narrator Speech Processor
@ -24,9 +26,10 @@
*/ */
typedef struct _sp0256_interface sp0256_interface; typedef struct _sp0256_interface sp0256_interface;
struct _sp0256_interface { struct _sp0256_interface
void (*lrq_callback)(const device_config *device, int state); {
void (*sby_callback)(const device_config *device, int state); devcb_write_line lrq_callback;
devcb_write_line sby_callback;
}; };
void sp0256_bitrevbuff(UINT8 *buffer, unsigned int start, unsigned int length); void sp0256_bitrevbuff(UINT8 *buffer, unsigned int start, unsigned int length);

View File

@ -135,12 +135,6 @@ static WRITE8_HANDLER( adpcm_w )
sp0256_ALD_w(space, 0, data); sp0256_ALD_w(space, 0, data);
} }
static void lrq_callback(const device_config *device, int state)
{
//cpu_set_input_line(device->machine->cpu[1], INPUT_LINE_NMI, PULSE_LINE);
cpu_set_input_line(device->machine->cpu[1], INPUT_LINE_NMI, state);
}
static ADDRESS_MAP_START( sauro_readmem, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( sauro_readmem, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0xdfff) AM_READ(SMH_ROM) AM_RANGE(0x0000, 0xdfff) AM_READ(SMH_ROM)
AM_RANGE(0xe000, 0xebff) AM_READ(SMH_RAM) AM_RANGE(0xe000, 0xebff) AM_READ(SMH_RAM)
@ -336,8 +330,8 @@ static const gfx_layout sauro_spritelayout =
static const sp0256_interface sauro_sp256 = static const sp0256_interface sauro_sp256 =
{ {
lrq_callback, DEVCB_CPU_INPUT_LINE("audio", INPUT_LINE_NMI),
0 DEVCB_NULL
}; };
static GFXDECODE_START( sauro ) static GFXDECODE_START( sauro )