From f47855ec04b865760e4c16ad536070b3fee9f239 Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Wed, 25 Nov 2009 11:15:10 +0000 Subject: [PATCH] CDP1869 changes: - converted page RAM functions to use devcb - added pull interface for predisplay --- src/emu/sound/cdp1869.c | 27 ++++++++++++++++++------ src/emu/sound/cdp1869.h | 12 +++++------ src/mame/drivers/cidelsa.c | 10 ++++----- src/mame/video/cidelsa.c | 42 +++++++++++++++----------------------- 4 files changed, 48 insertions(+), 43 deletions(-) diff --git a/src/emu/sound/cdp1869.c b/src/emu/sound/cdp1869.c index b72c04160b5..9322b99a2e8 100644 --- a/src/emu/sound/cdp1869.c +++ b/src/emu/sound/cdp1869.c @@ -8,6 +8,7 @@ TODO: + - remove CDP1802 dependency - white noise - scanline based update - CMSEL output @@ -47,6 +48,8 @@ enum typedef struct _cdp1869_t cdp1869_t; struct _cdp1869_t { + devcb_resolved_read8 in_page_ram_func; + devcb_resolved_write8 out_page_ram_func; devcb_resolved_write_line out_prd_func; const device_config *device; @@ -57,6 +60,7 @@ struct _cdp1869_t int color_clock; /* video state */ + int prd; /* predisplay */ int dispoff; /* display off */ int fresvert; /* full resolution vertical */ int freshorz; /* full resolution horizontal */ @@ -161,6 +165,7 @@ static TIMER_CALLBACK( prd_changed_tick ) cdp1869_t *cdp1869 = get_safe_token(device); devcb_call_write_line(&cdp1869->out_prd_func, param); + cdp1869->prd = param; update_prd_changed_timer(cdp1869); } @@ -609,7 +614,7 @@ READ8_DEVICE_HANDLER( cdp1869_pageram_r ) pma = offset; } - return cdp1869->intf->page_ram_r(device, pma); + return devcb_call_read8(&cdp1869->in_page_ram_func, pma); } /*------------------------------------------------- @@ -631,10 +636,7 @@ WRITE8_DEVICE_HANDLER( cdp1869_pageram_w ) pma = offset; } - if (cdp1869->intf->page_ram_w) - { - cdp1869->intf->page_ram_w(device, pma, data); - } + devcb_call_write8(&cdp1869->out_page_ram_func, pma, data); } /*------------------------------------------------- @@ -696,6 +698,17 @@ WRITE8_DEVICE_HANDLER( cdp1869_charram_w ) } } +/*------------------------------------------------- + cdp1869_predisplay_r - predisplay read +-------------------------------------------------*/ + +READ_LINE_DEVICE_HANDLER( cdp1869_predisplay_r ) +{ + cdp1869_t *cdp1869 = get_safe_token(device); + + return cdp1869->prd; +} + /*------------------------------------------------- cdp1869_update - screen update -------------------------------------------------*/ @@ -849,11 +862,12 @@ static DEVICE_START( cdp1869 ) /* validate arguments */ cdp1869->intf = (const cdp1869_interface *)device->static_config; - assert(cdp1869->intf->page_ram_r != NULL); assert(cdp1869->intf->pcb_r != NULL); assert(cdp1869->intf->char_ram_r != NULL); /* resolve callbacks */ + devcb_resolve_read8(&cdp1869->in_page_ram_func, &cdp1869->intf->in_page_ram_func, device); + devcb_resolve_write8(&cdp1869->out_page_ram_func, &cdp1869->intf->out_page_ram_func, device); devcb_resolve_write_line(&cdp1869->out_prd_func, &cdp1869->intf->out_prd_func, device); /* set initial values */ @@ -879,6 +893,7 @@ static DEVICE_START( cdp1869 ) /* register for state saving */ state_save_register_postload(device->machine, cdp1869_state_save_postload, cdp1869); + state_save_register_device_item(device, 0, cdp1869->prd); state_save_register_device_item(device, 0, cdp1869->dispoff); state_save_register_device_item(device, 0, cdp1869->fresvert); state_save_register_device_item(device, 0, cdp1869->freshorz); diff --git a/src/emu/sound/cdp1869.h b/src/emu/sound/cdp1869.h index 0bc485adef6..9ffcc7e2431 100644 --- a/src/emu/sound/cdp1869.h +++ b/src/emu/sound/cdp1869.h @@ -111,10 +111,7 @@ #define CDP1869_CHAR_RAM_READ(name) UINT8 name(const device_config *device, UINT16 pma, UINT8 cma) #define CDP1869_CHAR_RAM_WRITE(name) void name(const device_config *device, UINT16 pma, UINT8 cma, UINT8 data) -#define CDP1869_PAGE_RAM_READ(name) UINT8 name(const device_config *device, UINT16 pma) -#define CDP1869_PAGE_RAM_WRITE(name) void name(const device_config *device, UINT16 pma, UINT8 data) #define CDP1869_PCB_READ(name) int name(const device_config *device, UINT16 pma, UINT8 cma) -#define CDP1869_ON_PRD_CHANGED(name) void name(const device_config *device, int prd) /*************************************************************************** TYPE DEFINITIONS @@ -122,8 +119,6 @@ typedef UINT8 (*cdp1869_char_ram_read_func)(const device_config *device, UINT16 pma, UINT8 cma); typedef void (*cdp1869_char_ram_write_func)(const device_config *device, UINT16 pma, UINT8 cma, UINT8 data); -typedef UINT8 (*cdp1869_page_ram_read_func)(const device_config *device, UINT16 pma); -typedef void (*cdp1869_page_ram_write_func)(const device_config *device, UINT16 pma, UINT8 data); typedef int (*cdp1869_pcb_read_func)(const device_config *device, UINT16 pma, UINT8 cma); enum _cdp1869_format { @@ -145,10 +140,10 @@ struct _cdp1869_interface cdp1869_format pal_ntsc; /* screen format */ /* page memory read function */ - cdp1869_page_ram_read_func page_ram_r; + devcb_read8 in_page_ram_func; /* page memory write function */ - cdp1869_page_ram_write_func page_ram_w; + devcb_write8 out_page_ram_func; /* page memory color bit read function */ cdp1869_pcb_read_func pcb_r; @@ -188,6 +183,9 @@ WRITE8_DEVICE_HANDLER ( cdp1869_charram_w ); READ8_DEVICE_HANDLER ( cdp1869_pageram_r ); WRITE8_DEVICE_HANDLER ( cdp1869_pageram_w ); +/* predisplay */ +READ_LINE_DEVICE_HANDLER( cdp1869_predisplay_r ); + /* screen update */ void cdp1869_update(const device_config *device, bitmap_t *bitmap, const rectangle *cliprect); diff --git a/src/mame/drivers/cidelsa.c b/src/mame/drivers/cidelsa.c index bbc6c3ba119..d9780bc3add 100644 --- a/src/mame/drivers/cidelsa.c +++ b/src/mame/drivers/cidelsa.c @@ -313,7 +313,7 @@ static CUSTOM_INPUT( cdp1869_pcb_r ) return state->cdp1869_pcb; } -static CUSTOM_INPUT( cdp1869_predisplay_r ) +static CUSTOM_INPUT( cidelsa_prd_r ) { cidelsa_state *state = (cidelsa_state *)field->port->machine->driver_data; @@ -354,7 +354,7 @@ static INPUT_PORTS_START( destryer ) PORT_DIPSETTING( 0x00, "Slot A: 2.5 Slot B: 5" ) PORT_START("EF") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM(cdp1869_predisplay_r, NULL) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM(cidelsa_prd_r, NULL) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) // ST PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) // M2 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) // M1 @@ -404,7 +404,7 @@ static INPUT_PORTS_START( altair ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START("EF") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM(cdp1869_predisplay_r, NULL) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM(cidelsa_prd_r, NULL) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) // ST PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) // M2 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) // M1 @@ -456,7 +456,7 @@ static INPUT_PORTS_START( draco ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT ) PORT_START("EF") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM(cdp1869_predisplay_r, NULL) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_READ_LINE_DEVICE(CDP1869_TAG, cdp1869_predisplay_r) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) // ST PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) // M2 PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) // M1 @@ -555,7 +555,7 @@ static MACHINE_DRIVER_START( altair ) MDRV_MACHINE_RESET(cidelsa) /* input/output hardware */ - MDRV_CDP1852_ADD("ic23", CDP1852_CLOCK_HIGH, cidelsa_cdp1852_in0_intf) /* clock is really tied to CDP1876 CMSEL (pin 32) */ + MDRV_CDP1852_ADD("ic23", CDP1852_CLOCK_HIGH, cidelsa_cdp1852_in0_intf) /* clock is really tied to CDP1869 CMSEL (pin 37) */ MDRV_CDP1852_ADD("ic24", CDP1852_CLOCK_HIGH, cidelsa_cdp1852_in1_intf) MDRV_CDP1852_ADD("ic25", CDP1852_CLOCK_HIGH, cidelsa_cdp1852_in2_intf) MDRV_CDP1852_ADD("ic26", ALTAIR_CHR1 / 8, altair_cdp1852_out1_intf) /* clock is CDP1802 TPB */ diff --git a/src/mame/video/cidelsa.c b/src/mame/video/cidelsa.c index 8bff95dfc0b..60118d73acc 100644 --- a/src/mame/video/cidelsa.c +++ b/src/mame/video/cidelsa.c @@ -5,13 +5,13 @@ /* Page RAM Access */ -static CDP1869_PAGE_RAM_READ( cidelsa_pageram_r ) +static READ8_DEVICE_HANDLER( cidelsa_pageram_r ) { cidelsa_state *state = (cidelsa_state *)device->machine->driver_data; - UINT16 addr = pma & CIDELSA_PAGERAM_MASK; + UINT16 addr = offset & CIDELSA_PAGERAM_MASK; - if (BIT(pma, 10)) + if (BIT(offset, 10)) { return 0xff; } @@ -19,13 +19,13 @@ static CDP1869_PAGE_RAM_READ( cidelsa_pageram_r ) return state->pageram[addr]; } -static CDP1869_PAGE_RAM_WRITE( cidelsa_pageram_w ) +static WRITE8_DEVICE_HANDLER( cidelsa_pageram_w ) { cidelsa_state *state = (cidelsa_state *)device->machine->driver_data; - UINT16 addr = pma & CIDELSA_PAGERAM_MASK; + UINT16 addr = offset & CIDELSA_PAGERAM_MASK; - if (BIT(pma, 10)) + if (BIT(offset, 10)) { return; } @@ -33,20 +33,20 @@ static CDP1869_PAGE_RAM_WRITE( cidelsa_pageram_w ) state->pageram[addr] = data; } -static CDP1869_PAGE_RAM_READ( draco_pageram_r ) +static READ8_DEVICE_HANDLER( draco_pageram_r ) { cidelsa_state *state = (cidelsa_state *)device->machine->driver_data; - UINT16 addr = pma & DRACO_PAGERAM_MASK; + UINT16 addr = offset & DRACO_PAGERAM_MASK; return state->pageram[addr]; } -static CDP1869_PAGE_RAM_WRITE( draco_pageram_w ) +static WRITE8_DEVICE_HANDLER( draco_pageram_w ) { cidelsa_state *state = (cidelsa_state *)device->machine->driver_data; - UINT16 addr = pma & DRACO_PAGERAM_MASK; + UINT16 addr = offset & DRACO_PAGERAM_MASK; state->pageram[addr] = data; } @@ -134,13 +134,6 @@ static WRITE_LINE_DEVICE_HANDLER( cidelsa_prd_w ) driver_state->cdp1869_prd = !state; } -static WRITE_LINE_DEVICE_HANDLER( draco_prd_w ) -{ - cidelsa_state *driver_state = (cidelsa_state *)device->machine->driver_data; - - driver_state->cdp1869_prd = state; -} - /* CDP1869 Interface */ static CDP1869_INTERFACE( destryer_cdp1869_intf ) @@ -149,8 +142,8 @@ static CDP1869_INTERFACE( destryer_cdp1869_intf ) SCREEN_TAG, 0, CDP1869_PAL, - cidelsa_pageram_r, - cidelsa_pageram_w, + DEVCB_HANDLER(cidelsa_pageram_r), + DEVCB_HANDLER(cidelsa_pageram_w), cidelsa_pcb_r, cidelsa_charram_r, cidelsa_charram_w, @@ -163,8 +156,8 @@ static CDP1869_INTERFACE( altair_cdp1869_intf ) SCREEN_TAG, 0, CDP1869_PAL, - cidelsa_pageram_r, - cidelsa_pageram_w, + DEVCB_HANDLER(cidelsa_pageram_r), + DEVCB_HANDLER(cidelsa_pageram_w), cidelsa_pcb_r, cidelsa_charram_r, cidelsa_charram_w, @@ -177,12 +170,12 @@ static CDP1869_INTERFACE( draco_cdp1869_intf ) SCREEN_TAG, 0, CDP1869_PAL, - draco_pageram_r, - draco_pageram_w, + DEVCB_HANDLER(draco_pageram_r), + DEVCB_HANDLER(draco_pageram_w), draco_pcb_r, draco_charram_r, draco_charram_w, - DEVCB_LINE(draco_prd_w) + DEVCB_NULL }; /* Video Start */ @@ -200,7 +193,6 @@ static void video_start(running_machine *machine, UINT16 pageram_size) state->cdp1869 = devtag_get_device(machine, CDP1869_TAG); /* register for state saving */ - state_save_register_global(machine, state->cdp1869_prd); state_save_register_global(machine, state->cdp1869_pcb); state_save_register_global_pointer(machine, state->pageram, pageram_size); state_save_register_global_pointer(machine, state->pcbram, CIDELSA_CHARRAM_SIZE);