summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author smf- <smf-@users.noreply.github.com>2009-11-26 17:25:09 +0000
committer smf- <smf-@users.noreply.github.com>2009-11-26 17:25:09 +0000
commit4f90eda49bd98e6ec0ffaa73be08d50aa5222b82 (patch)
treebb9e9064e591b5a918e2e4152ee5b7cd2b5cf4c9 /src
parent680cf15e6a5adc7d1ce546f2d098d2b60526cb6e (diff)
DEVCB_INPUT_PORT(tag) can be used for write callbacks.
Diffstat (limited to 'src')
-rw-r--r--src/emu/devcb.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/emu/devcb.c b/src/emu/devcb.c
index 4eb78c8d50d..1c3261e279f 100644
--- a/src/emu/devcb.c
+++ b/src/emu/devcb.c
@@ -104,6 +104,11 @@ void devcb_resolve_read_line(devcb_resolved_read_line *resolved, const devcb_rea
write line definition to a live definition
-------------------------------------------------*/
+static WRITE_LINE_DEVICE_HANDLER( trampoline_write_port_to_write_line )
+{
+ input_port_write_direct((const input_port_config *)device, state, 0xffffffff);
+}
+
static WRITE_LINE_DEVICE_HANDLER( trampoline_write8_to_write_line )
{
const devcb_resolved_write_line *resolved = (const devcb_resolved_write_line *)device;
@@ -122,8 +127,16 @@ void devcb_resolve_write_line(devcb_resolved_write_line *resolved, const devcb_w
/* reset the resolved structure */
memset(resolved, 0, sizeof(*resolved));
+ if (config->type == DEVCB_TYPE_INPUT)
+ {
+ resolved->target = input_port_by_tag(&device->machine->portlist, config->tag);
+ if (resolved->target == NULL)
+ fatalerror("devcb_resolve_write_line: unable to find input port '%s' (requested by %s '%s')", config->tag, device_get_name(device), device->tag);
+ resolved->write = trampoline_write_port_to_write_line;
+ }
+
/* address space handlers */
- if (config->type >= DEVCB_TYPE_MEMORY(ADDRESS_SPACE_PROGRAM) && config->type < DEVCB_TYPE_MEMORY(ADDRESS_SPACES) && config->writespace != NULL)
+ else if (config->type >= DEVCB_TYPE_MEMORY(ADDRESS_SPACE_PROGRAM) && config->type < DEVCB_TYPE_MEMORY(ADDRESS_SPACES) && config->writespace != NULL)
{
FPTR space = (FPTR)config->type - (FPTR)DEVCB_TYPE_MEMORY(ADDRESS_SPACE_PROGRAM);
const device_config *cpu;
@@ -269,6 +282,11 @@ void devcb_resolve_read8(devcb_resolved_read8 *resolved, const devcb_read8 *conf
8-bit write definition to a live definition
-------------------------------------------------*/
+static WRITE8_DEVICE_HANDLER( trampoline_write_port_to_write8 )
+{
+ input_port_write_direct((const input_port_config *)device, data, 0xff);
+}
+
static WRITE8_DEVICE_HANDLER( trampoline_write_line_to_write8 )
{
const devcb_resolved_write8 *resolved = (const devcb_resolved_write8 *)device;
@@ -280,8 +298,16 @@ void devcb_resolve_write8(devcb_resolved_write8 *resolved, const devcb_write8 *c
/* reset the resolved structure */
memset(resolved, 0, sizeof(*resolved));
+ if (config->type == DEVCB_TYPE_INPUT)
+ {
+ resolved->target = input_port_by_tag(&device->machine->portlist, config->tag);
+ if (resolved->target == NULL)
+ fatalerror("devcb_resolve_read_line: unable to find input port '%s' (requested by %s '%s')", config->tag, device_get_name(device), device->tag);
+ resolved->write = trampoline_write_port_to_write8;
+ }
+
/* address space handlers */
- if (config->type >= DEVCB_TYPE_MEMORY(ADDRESS_SPACE_PROGRAM) && config->type < DEVCB_TYPE_MEMORY(ADDRESS_SPACES) && config->writespace != NULL)
+ else if (config->type >= DEVCB_TYPE_MEMORY(ADDRESS_SPACE_PROGRAM) && config->type < DEVCB_TYPE_MEMORY(ADDRESS_SPACES) && config->writespace != NULL)
{
FPTR space = (FPTR)config->type - (FPTR)DEVCB_TYPE_MEMORY(ADDRESS_SPACE_PROGRAM);
const device_config *cpu;