mirror of
https://github.com/holub/mame
synced 2025-05-29 00:53:09 +03:00
CDP1869 changes:
- converted page RAM functions to use devcb - added pull interface for predisplay
This commit is contained in:
parent
8836834f08
commit
f47855ec04
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user