Refactored CDP1852 into a C++ device and cleaned up the Cidelsa driver slightly. (no whatsnew)

This commit is contained in:
Curt Coder 2011-04-16 17:55:38 +00:00
parent f575cd348f
commit c98ef8f23a
5 changed files with 361 additions and 292 deletions

View File

@ -1,233 +1,235 @@
/**********************************************************************
RCA CDP1852 Byte-Wide Input/Output Port emulation
Copyright Nicola Salmoria and the MAME Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#include "emu.h"
#include "cdp1852.h"
#include "machine/devhelpr.h"
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
typedef struct _cdp1852_t cdp1852_t;
struct _cdp1852_t
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
enum
{
devcb_resolved_write_line out_sr_func;
devcb_resolved_read8 in_data_func;
devcb_resolved_write8 out_data_func;
cdp1852_mode mode; /* operation mode */
int new_data; /* new data written */
UINT8 data; /* data latch */
UINT8 next_data; /* next data*/
int sr; /* service request flag */
int next_sr; /* next value of service request flag */
/* timers */
emu_timer *scan_timer; /* scan timer */
MODE_INPUT = 0,
MODE_OUTPUT
};
/***************************************************************************
INLINE FUNCTIONS
***************************************************************************/
INLINE cdp1852_t *get_safe_token(device_t *device)
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type CDP1852 = cdp1852_device_config::static_alloc_device_config;
//**************************************************************************
// DEVICE CONFIGURATION
//**************************************************************************
GENERIC_DEVICE_CONFIG_SETUP(cdp1852, "CDP1852")
//-------------------------------------------------
// device_config_complete - perform any
// operations now that the configuration is
// complete
//-------------------------------------------------
void cdp1852_device_config::device_config_complete()
{
assert(device != NULL);
return (cdp1852_t *)downcast<legacy_device_base *>(device)->token();
}
// inherit a copy of the static data
const cdp1852_interface *intf = reinterpret_cast<const cdp1852_interface *>(static_config());
if (intf != NULL)
*static_cast<cdp1852_interface *>(this) = *intf;
INLINE const cdp1852_interface *get_interface(device_t *device)
{
assert(device != NULL);
assert((device->type() == CDP1852));
return (const cdp1852_interface *) device->baseconfig().static_config();
}
/***************************************************************************
IMPLEMENTATION
***************************************************************************/
/*-------------------------------------------------
set_sr_line - service request out
-------------------------------------------------*/
static void set_sr_line(cdp1852_t *cdp1852, int level)
{
if (cdp1852->sr != level)
// or initialize to defaults if none provided
else
{
cdp1852->sr = level;
devcb_call_write_line(&cdp1852->out_sr_func, cdp1852->sr);
memset(&m_in_mode_func, 0, sizeof(m_in_mode_func));
memset(&m_out_sr_func, 0, sizeof(m_out_sr_func));
memset(&m_in_data_func, 0, sizeof(m_in_data_func));
memset(&m_out_data_func, 0, sizeof(m_out_data_func));
}
}
/*-------------------------------------------------
TIMER_CALLBACK( cdp1852_scan_tick )
-------------------------------------------------*/
static TIMER_CALLBACK( cdp1852_scan_tick )
//**************************************************************************
// INLINE HELPERS
//**************************************************************************
//-------------------------------------------------
// get_mode -
//-------------------------------------------------
int cdp1852_device::get_mode()
{
device_t *device = (device_t *)ptr;
cdp1852_t *cdp1852 = get_safe_token(device);
return devcb_call_read_line(&m_in_mode_func);
}
switch (cdp1852->mode)
//-------------------------------------------------
// set_sr_line -
//-------------------------------------------------
void cdp1852_device::set_sr_line(int state)
{
if (m_sr != state)
{
case CDP1852_MODE_INPUT:
/* input data into register */
cdp1852->data = devcb_call_read8(&cdp1852->in_data_func, 0);
m_sr = state;
/* signal processor */
set_sr_line(cdp1852, 0);
break;
case CDP1852_MODE_OUTPUT:
if (cdp1852->new_data)
{
cdp1852->new_data = 0;
/* latch data into register */
cdp1852->data = cdp1852->next_data;
/* output data */
devcb_call_write8(&cdp1852->out_data_func, 0, cdp1852->data);
/* signal peripheral device */
set_sr_line(cdp1852, 1);
cdp1852->next_sr = 0;
}
else
{
set_sr_line(cdp1852, cdp1852->next_sr);
}
break;
devcb_call_write_line(&m_out_sr_func, m_sr);
}
}
/*-------------------------------------------------
cdp1852_data_r - data register read
-------------------------------------------------*/
READ8_DEVICE_HANDLER( cdp1852_data_r )
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// cdp1852_device - constructor
//-------------------------------------------------
cdp1852_device::cdp1852_device(running_machine &_machine, const cdp1852_device_config &config)
: device_t(_machine, config),
m_config(config)
{
cdp1852_t *cdp1852 = get_safe_token(device);
if (cdp1852->mode == CDP1852_MODE_INPUT && device->clock() == 0)
{
// input data into register
cdp1852->data = devcb_call_read8(&cdp1852->in_data_func, 0);
}
set_sr_line(cdp1852, 1);
return cdp1852->data;
}
/*-------------------------------------------------
cdp1852_data_r - data register write
-------------------------------------------------*/
WRITE8_DEVICE_HANDLER( cdp1852_data_w )
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void cdp1852_device::device_start()
{
cdp1852_t *cdp1852 = get_safe_token(device);
// resolve callbacks
devcb_resolve_read_line(&m_in_mode_func, &m_config.m_in_mode_func, this);
devcb_resolve_write_line(&m_out_sr_func, &m_config.m_out_sr_func, this);
devcb_resolve_read8(&m_in_data_func, &m_config.m_in_data_func, this);
devcb_resolve_write8(&m_out_data_func, &m_config.m_out_data_func, this);
if (cdp1852->mode == CDP1852_MODE_OUTPUT)
// allocate timers
if (clock() > 0)
{
cdp1852->next_data = data;
cdp1852->new_data = 1;
}
}
/*-------------------------------------------------
DEVICE_START( cdp1852 )
-------------------------------------------------*/
static DEVICE_START( cdp1852 )
{
cdp1852_t *cdp1852 = get_safe_token(device);
const cdp1852_interface *intf = get_interface(device);
/* resolve callbacks */
devcb_resolve_read8(&cdp1852->in_data_func, &intf->in_data_func, device);
devcb_resolve_write8(&cdp1852->out_data_func, &intf->out_data_func, device);
devcb_resolve_write_line(&cdp1852->out_sr_func, &intf->out_sr_func, device);
/* set initial values */
cdp1852->mode = (cdp1852_mode)intf->mode;
if (device->clock() > 0)
{
/* create the scan timer */
cdp1852->scan_timer = device->machine().scheduler().timer_alloc(FUNC(cdp1852_scan_tick), (void *)device);
cdp1852->scan_timer->adjust(attotime::zero, 0, attotime::from_hz(device->clock()));
m_scan_timer = timer_alloc();
m_scan_timer->adjust(attotime::zero, 0, attotime::from_hz(clock()));
}
/* register for state saving */
device->save_item(NAME(cdp1852->new_data));
device->save_item(NAME(cdp1852->data));
device->save_item(NAME(cdp1852->next_data));
device->save_item(NAME(cdp1852->sr));
device->save_item(NAME(cdp1852->next_sr));
// register for state saving
save_item(NAME(m_new_data));
save_item(NAME(m_data));
save_item(NAME(m_next_data));
save_item(NAME(m_sr));
save_item(NAME(m_next_sr));
}
/*-------------------------------------------------
DEVICE_RESET( cdp1852 )
-------------------------------------------------*/
static DEVICE_RESET( cdp1852 )
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void cdp1852_device::device_reset()
{
cdp1852_t *cdp1852 = get_safe_token(device);
// reset data register
m_data = 0;
/* reset data register */
cdp1852->data = 0;
if (cdp1852->mode == CDP1852_MODE_INPUT)
if (get_mode() == MODE_INPUT)
{
/* reset service request flip-flop */
set_sr_line(cdp1852, 1);
// reset service request flip-flop
set_sr_line(1);
}
else
{
/* output data */
devcb_call_write8(&cdp1852->out_data_func, 0, cdp1852->data);
// output data
devcb_call_write8(&m_out_data_func, 0, m_data);
/* reset service request flip-flop */
set_sr_line(cdp1852, 0);
// reset service request flip-flop
set_sr_line(0);
}
}
/*-------------------------------------------------
DEVICE_GET_INFO( cdp1852 )
-------------------------------------------------*/
DEVICE_GET_INFO( cdp1852 )
//-------------------------------------------------
// device_timer - handler timer events
//-------------------------------------------------
void cdp1852_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
switch (state)
switch (get_mode())
{
/* --- the following bits of info are returned as 64-bit signed integers --- */
case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(cdp1852_t); break;
case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = 0; break;
case MODE_INPUT:
// input data into register
m_data = devcb_call_read8(&m_in_data_func, 0);
/* --- the following bits of info are returned as pointers to data or functions --- */
case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(cdp1852); break;
case DEVINFO_FCT_STOP: /* Nothing */ break;
case DEVINFO_FCT_RESET: info->reset = DEVICE_RESET_NAME(cdp1852); break;
// signal processor
set_sr_line(0);
break;
/* --- the following bits of info are returned as NULL-terminated strings --- */
case DEVINFO_STR_NAME: strcpy(info->s, "RCA CDP1852"); break;
case DEVINFO_STR_FAMILY: strcpy(info->s, "RCA CDP1800"); break;
case DEVINFO_STR_VERSION: strcpy(info->s, "1.0"); break;
case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break;
case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright Nicola Salmoria and the MAME Team"); break;
case MODE_OUTPUT:
if (m_new_data)
{
m_new_data = 0;
// latch data into register
m_data = m_next_data;
// output data
devcb_call_write8(&m_out_data_func, 0, m_data);
// signal peripheral device
set_sr_line(1);
m_next_sr = 0;
}
else
{
set_sr_line(m_next_sr);
}
break;
}
}
DEFINE_LEGACY_DEVICE(CDP1852, cdp1852);
//-------------------------------------------------
// read - data read
//-------------------------------------------------
READ8_MEMBER( cdp1852_device::read )
{
if ((get_mode() == MODE_INPUT) && (clock() == 0))
{
// input data into register
m_data = devcb_call_read8(&m_in_data_func, 0);
}
set_sr_line(1);
return m_data;
}
//-------------------------------------------------
// write - data write
//-------------------------------------------------
WRITE8_MEMBER( cdp1852_device::write )
{
if (get_mode() == MODE_OUTPUT)
{
m_next_data = data;
m_new_data = 1;
}
}

View File

@ -22,58 +22,126 @@
**********************************************************************/
#pragma once
#ifndef __CDP1852__
#define __CDP1852__
#include "devlegcy.h"
#include "emu.h"
/***************************************************************************
MACROS / CONSTANTS
***************************************************************************/
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
#define CDP1852_CLOCK_HIGH 0
DECLARE_LEGACY_DEVICE(CDP1852, cdp1852);
#define CDP1852_MODE_INPUT \
DEVCB_LINE_GND
#define CDP1852_MODE_OUTPUT \
DEVCB_LINE_VCC
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_CDP1852_ADD(_tag, _clock, _config) \
MCFG_DEVICE_ADD(_tag, CDP1852, _clock) \
MCFG_DEVICE_CONFIG(_config)
#define CDP1852_INTERFACE(_name) \
const cdp1852_interface (_name)=
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
#define CDP1852_INTERFACE(name) \
const cdp1852_interface (name)=
enum _cdp1852_mode {
CDP1852_MODE_INPUT = 0,
CDP1852_MODE_OUTPUT
};
typedef enum _cdp1852_mode cdp1852_mode;
typedef struct _cdp1852_interface cdp1852_interface;
struct _cdp1852_interface
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> cdp1852_interface
struct cdp1852_interface
{
int mode; /* operation mode */
devcb_read_line m_in_mode_func;
/* this gets called for every external data read */
devcb_read8 in_data_func;
devcb_read8 m_in_data_func;
devcb_write8 m_out_data_func;
/* this gets called for every external data write */
devcb_write8 out_data_func;
/* this gets called for every change of the SR pin (pin 23) */
devcb_write_line out_sr_func;
devcb_write_line m_out_sr_func;
};
/***************************************************************************
PROTOTYPES
***************************************************************************/
/* data access */
READ8_DEVICE_HANDLER( cdp1852_data_r );
WRITE8_DEVICE_HANDLER( cdp1852_data_w );
// ======================> cdp1852_device_config
class cdp1852_device_config : public device_config,
public cdp1852_interface
{
friend class cdp1852_device;
// construction/destruction
cdp1852_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
public:
// allocators
static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
virtual device_t *alloc_device(running_machine &machine) const;
protected:
// device_config overrides
virtual void device_config_complete();
};
// ======================> cdp1852_device
class cdp1852_device : public device_t
{
friend class cdp1852_device_config;
// construction/destruction
cdp1852_device(running_machine &_machine, const cdp1852_device_config &_config);
public:
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
int get_mode();
inline void set_sr_line(int state);
devcb_resolved_read_line m_in_mode_func;
devcb_resolved_write_line m_out_sr_func;
devcb_resolved_read8 m_in_data_func;
devcb_resolved_write8 m_out_data_func;
int m_new_data; // new data written
UINT8 m_data; // data latch
UINT8 m_next_data; // next data
int m_sr; // service request flag
int m_next_sr; // next value of service request flag
// timers
emu_timer *m_scan_timer;
const cdp1852_device_config &m_config;
};
// device type definition
extern const device_type CDP1852;
#endif

View File

@ -1,12 +1,3 @@
#define ADDRESS_MAP_MODERN
#include "emu.h"
#include "cpu/cosmac/cosmac.h"
#include "cpu/cop400/cop400.h"
#include "sound/cdp1869.h"
#include "sound/ay8910.h"
#include "machine/cdp1852.h"
#include "machine/nvram.h"
#include "includes/cidelsa.h"
/* CDP1802 Interface */
@ -39,7 +30,7 @@ static COSMAC_INTERFACE( cidelsa_cdp1802_config )
/* Sound Interface */
WRITE8_MEMBER( cidelsa_state::draco_sound_bankswitch_w )
WRITE8_MEMBER( draco_state::sound_bankswitch_w )
{
/*
@ -57,7 +48,7 @@ WRITE8_MEMBER( cidelsa_state::draco_sound_bankswitch_w )
memory_set_bank(m_machine, "bank1", bank);
}
WRITE8_MEMBER( cidelsa_state::draco_sound_g_w )
WRITE8_MEMBER( draco_state::sound_g_w )
{
/*
@ -73,32 +64,32 @@ WRITE8_MEMBER( cidelsa_state::draco_sound_g_w )
switch (data)
{
case 0x01:
ay8910_data_w(m_psg, 0, m_draco_ay_latch);
ay8910_data_w(m_psg, 0, m_psg_latch);
break;
case 0x02:
m_draco_ay_latch = ay8910_r(m_psg, 0);
m_psg_latch = ay8910_r(m_psg, 0);
break;
case 0x03:
ay8910_address_w(m_psg, 0, m_draco_ay_latch);
ay8910_address_w(m_psg, 0, m_psg_latch);
break;
}
}
READ8_MEMBER( cidelsa_state::draco_sound_in_r )
READ8_MEMBER( draco_state::sound_in_r )
{
return ~(m_draco_sound) & 0x07;
return ~(m_sound) & 0x07;
}
READ8_MEMBER( cidelsa_state::draco_sound_ay8910_r )
READ8_MEMBER( draco_state::psg_r )
{
return m_draco_ay_latch;
return m_psg_latch;
}
WRITE8_MEMBER( cidelsa_state::draco_sound_ay8910_w )
WRITE8_MEMBER( draco_state::psg_w )
{
m_draco_ay_latch = data;
m_psg_latch = data;
}
/* Read/Write Handlers */
@ -141,11 +132,11 @@ WRITE8_MEMBER( cidelsa_state::altair_out1_w )
set_led_status(m_machine, 2, data & 0x20); // FIRE
}
WRITE8_MEMBER( cidelsa_state::draco_out1_w )
WRITE8_MEMBER( draco_state::out1_w )
{
/*
bit description
0 3K9 -> Green signal
1 820R -> Blue signal
2 510R -> Red signal
@ -156,7 +147,7 @@ WRITE8_MEMBER( cidelsa_state::draco_out1_w )
7 SONIDO C -> COP402 IN2
*/
m_draco_sound = (data & 0xe0) >> 5;
m_sound = (data & 0xe0) >> 5;
}
static CDP1852_INTERFACE( cidelsa_cdp1852_in0_intf )
@ -195,7 +186,7 @@ static CDP1852_INTERFACE( draco_cdp1852_out1_intf )
{
CDP1852_MODE_OUTPUT,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(cidelsa_state, draco_out1_w),
DEVCB_DRIVER_MEMBER(draco_state, out1_w),
DEVCB_NULL
};
@ -242,37 +233,37 @@ static ADDRESS_MAP_START( altair_map, AS_PROGRAM, 8, cidelsa_state )
ADDRESS_MAP_END
static ADDRESS_MAP_START( altair_io_map, AS_IO, 8, cidelsa_state )
AM_RANGE(0x01, 0x01) AM_DEVREAD_LEGACY("ic23", cdp1852_data_r) AM_DEVWRITE_LEGACY("ic26", cdp1852_data_w)
AM_RANGE(0x02, 0x02) AM_DEVREAD_LEGACY("ic24", cdp1852_data_r)
AM_RANGE(0x04, 0x04) AM_DEVREAD_LEGACY("ic25", cdp1852_data_r)
AM_RANGE(0x01, 0x01) AM_DEVREAD("ic23", cdp1852_device, read) AM_DEVWRITE("ic26", cdp1852_device, write)
AM_RANGE(0x02, 0x02) AM_DEVREAD("ic24", cdp1852_device, read)
AM_RANGE(0x04, 0x04) AM_DEVREAD("ic25", cdp1852_device, read)
AM_RANGE(0x03, 0x07) AM_WRITE(cdp1869_w)
ADDRESS_MAP_END
// Draco
static ADDRESS_MAP_START( draco_map, AS_PROGRAM, 8, cidelsa_state )
static ADDRESS_MAP_START( draco_map, AS_PROGRAM, 8, draco_state )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x8000, 0x83ff) AM_RAM AM_SHARE("nvram")
AM_RANGE(0xf400, 0xf7ff) AM_DEVREADWRITE(CDP1869_TAG, cdp1869_device, char_ram_r, char_ram_w)
AM_RANGE(0xf800, 0xffff) AM_DEVREADWRITE(CDP1869_TAG, cdp1869_device, page_ram_r, page_ram_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( draco_io_map, AS_IO, 8, cidelsa_state )
AM_RANGE(0x01, 0x01) AM_DEVREAD_LEGACY("ic29", cdp1852_data_r) AM_DEVWRITE_LEGACY("ic32", cdp1852_data_w)
AM_RANGE(0x02, 0x02) AM_DEVREAD_LEGACY("ic30", cdp1852_data_r)
AM_RANGE(0x04, 0x04) AM_DEVREAD_LEGACY("ic31", cdp1852_data_r)
AM_RANGE(0x03, 0x07) AM_WRITE(cdp1869_w)
static ADDRESS_MAP_START( draco_io_map, AS_IO, 8, draco_state )
AM_RANGE(0x01, 0x01) AM_DEVREAD("ic29", cdp1852_device, read) AM_DEVWRITE("ic32", cdp1852_device, write)
AM_RANGE(0x02, 0x02) AM_DEVREAD("ic30", cdp1852_device, read)
AM_RANGE(0x04, 0x04) AM_DEVREAD("ic31", cdp1852_device, read)
AM_RANGE(0x03, 0x07) AM_WRITE_BASE(cidelsa_state, cdp1869_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( draco_sound_map, AS_PROGRAM, 8, cidelsa_state )
static ADDRESS_MAP_START( draco_sound_map, AS_PROGRAM, 8, draco_state )
AM_RANGE(0x000, 0x3ff) AM_ROMBANK("bank1")
ADDRESS_MAP_END
static ADDRESS_MAP_START( draco_sound_io_map, AS_IO, 8, cidelsa_state )
AM_RANGE(COP400_PORT_D, COP400_PORT_D) AM_WRITE(draco_sound_bankswitch_w)
AM_RANGE(COP400_PORT_G, COP400_PORT_G) AM_WRITE(draco_sound_g_w)
AM_RANGE(COP400_PORT_L, COP400_PORT_L) AM_READWRITE(draco_sound_ay8910_r, draco_sound_ay8910_w)
AM_RANGE(COP400_PORT_IN, COP400_PORT_IN) AM_READ(draco_sound_in_r)
static ADDRESS_MAP_START( draco_sound_io_map, AS_IO, 8, draco_state )
AM_RANGE(COP400_PORT_D, COP400_PORT_D) AM_WRITE(sound_bankswitch_w)
AM_RANGE(COP400_PORT_G, COP400_PORT_G) AM_WRITE(sound_g_w)
AM_RANGE(COP400_PORT_L, COP400_PORT_L) AM_READWRITE(psg_r, psg_w)
AM_RANGE(COP400_PORT_IN, COP400_PORT_IN) AM_READ(sound_in_r)
AM_RANGE(COP400_PORT_SIO, COP400_PORT_SIO) AM_NOP
AM_RANGE(COP400_PORT_SK, COP400_PORT_SK) AM_WRITENOP
ADDRESS_MAP_END
@ -442,27 +433,22 @@ static TIMER_CALLBACK( set_cpu_mode )
state->m_reset = 1;
}
static MACHINE_START( cidelsa )
void cidelsa_state::machine_start()
{
cidelsa_state *state = machine.driver_data<cidelsa_state>();
/* register for state saving */
state->save_item(NAME(state->m_reset));
save_item(NAME(m_reset));
}
static MACHINE_START( draco )
void draco_state::machine_start()
{
cidelsa_state *state = machine.driver_data<cidelsa_state>();
MACHINE_START_CALL( cidelsa );
/* setup COP402 memory banking */
memory_configure_bank(machine, "bank1", 0, 2, machine.region(COP402N_TAG)->base(), 0x400);
memory_set_bank(machine, "bank1", 0);
memory_configure_bank(m_machine, "bank1", 0, 2, m_machine.region(COP402N_TAG)->base(), 0x400);
memory_set_bank(m_machine, "bank1", 0);
/* register for state saving */
state->save_item(NAME(state->m_draco_sound));
state->save_item(NAME(state->m_draco_ay_latch));
save_item(NAME(m_reset));
save_item(NAME(m_sound));
save_item(NAME(m_psg_latch));
}
/* Machine Reset */
@ -484,8 +470,6 @@ static MACHINE_CONFIG_START( destryer, cidelsa_state )
MCFG_CPU_CONFIG(cidelsa_cdp1802_config)
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_MACHINE_START(cidelsa)
/* sound and video hardware */
MCFG_FRAGMENT_ADD(destryer_video)
MACHINE_CONFIG_END
@ -498,8 +482,6 @@ static MACHINE_CONFIG_START( destryera, cidelsa_state )
MCFG_CPU_CONFIG(cidelsa_cdp1802_config)
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_MACHINE_START(cidelsa)
/* sound and video hardware */
MCFG_FRAGMENT_ADD(destryer_video)
MACHINE_CONFIG_END
@ -512,8 +494,6 @@ static MACHINE_CONFIG_START( altair, cidelsa_state )
MCFG_CPU_CONFIG(cidelsa_cdp1802_config)
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_MACHINE_START(cidelsa)
/* input/output hardware */
MCFG_CDP1852_ADD("ic23", CDP1852_CLOCK_HIGH, cidelsa_cdp1852_in0_intf) /* clock is really tied to CDP1869 CMSEL (pin 37) */
MCFG_CDP1852_ADD("ic24", CDP1852_CLOCK_HIGH, cidelsa_cdp1852_in1_intf)
@ -524,7 +504,7 @@ static MACHINE_CONFIG_START( altair, cidelsa_state )
MCFG_FRAGMENT_ADD(altair_video)
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( draco, cidelsa_state )
static MACHINE_CONFIG_START( draco, draco_state )
/* basic system hardware */
MCFG_CPU_ADD(CDP1802_TAG, COSMAC, DRACO_CHR1)
MCFG_CPU_PROGRAM_MAP(draco_map)
@ -532,8 +512,6 @@ static MACHINE_CONFIG_START( draco, cidelsa_state )
MCFG_CPU_CONFIG(cidelsa_cdp1802_config)
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_MACHINE_START(draco)
MCFG_CPU_ADD(COP402N_TAG, COP402, DRACO_SND_CHR1)
MCFG_CPU_PROGRAM_MAP(draco_sound_map)
MCFG_CPU_IO_MAP(draco_sound_io_map)

View File

@ -1,8 +1,17 @@
#pragma once
#ifndef __CIDELSA__
#define __CIDELSA__
#define ADDRESS_MAP_MODERN
#include "emu.h"
#include "cpu/cosmac/cosmac.h"
#include "cpu/cop400/cop400.h"
#include "sound/cdp1869.h"
#include "sound/ay8910.h"
#include "machine/cdp1852.h"
#include "machine/nvram.h"
#define SCREEN_TAG "screen"
#define CDP1802_TAG "cdp1802"
@ -32,30 +41,21 @@ public:
cidelsa_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config),
m_maincpu(*this, CDP1802_TAG),
m_vis(*this, CDP1869_TAG),
m_psg(*this, AY8910_TAG)
m_vis(*this, CDP1869_TAG)
{ }
required_device<cosmac_device> m_maincpu;
required_device<cdp1869_device> m_vis;
optional_device<device_t> m_psg;
virtual void machine_start();
virtual void machine_reset();
virtual void video_start();
virtual bool screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect) { m_vis->update_screen(&bitmap, &cliprect); return false; }
DECLARE_READ8_MEMBER( draco_sound_in_r );
DECLARE_READ8_MEMBER( draco_sound_ay8910_r );
DECLARE_WRITE8_MEMBER( cdp1869_w );
DECLARE_WRITE8_MEMBER( draco_sound_bankswitch_w );
DECLARE_WRITE8_MEMBER( draco_sound_g_w );
DECLARE_WRITE8_MEMBER( draco_sound_ay8910_w );
DECLARE_WRITE8_MEMBER( destryer_out1_w );
DECLARE_WRITE8_MEMBER( altair_out1_w );
DECLARE_WRITE8_MEMBER( draco_out1_w );
DECLARE_WRITE8_MEMBER( draco_ay8910_port_b_w );
DECLARE_READ_LINE_MEMBER( clear_r );
@ -72,10 +72,31 @@ public:
UINT8 *m_pageram;
UINT8 *m_pcbram;
UINT8 *m_charram;
};
class draco_state : public cidelsa_state
{
public:
draco_state(running_machine &machine, const driver_device_config_base &config)
: cidelsa_state(machine, config),
m_psg(*this, AY8910_TAG)
{ }
required_device<device_t> m_psg;
virtual void machine_start();
DECLARE_READ8_MEMBER( sound_in_r );
DECLARE_READ8_MEMBER( psg_r );
DECLARE_WRITE8_MEMBER( sound_bankswitch_w );
DECLARE_WRITE8_MEMBER( sound_g_w );
DECLARE_WRITE8_MEMBER( psg_w );
DECLARE_WRITE8_MEMBER( out1_w );
DECLARE_WRITE8_MEMBER( psg_pb_w );
// sound state
int m_draco_sound;
int m_draco_ay_latch;
int m_sound;
int m_psg_latch;
};
/*----------- defined in video/cidelsa.c -----------*/

View File

@ -107,8 +107,8 @@ static CDP1869_PCB_READ( draco_pcb_r )
WRITE_LINE_MEMBER( cidelsa_state::prd_w )
{
/* invert PRD signal */
device_set_input_line(m_maincpu, COSMAC_INPUT_LINE_INT, state ? CLEAR_LINE : ASSERT_LINE);
device_set_input_line(m_maincpu, COSMAC_INPUT_LINE_EF1, state ? CLEAR_LINE : ASSERT_LINE);
m_maincpu->set_input_line(COSMAC_INPUT_LINE_INT, state ? CLEAR_LINE : ASSERT_LINE);
m_maincpu->set_input_line(COSMAC_INPUT_LINE_EF1, state ? CLEAR_LINE : ASSERT_LINE);
}
/* Page RAM */
@ -125,7 +125,7 @@ ADDRESS_MAP_END
/* CDP1869 Interface */
static CDP1869_INTERFACE( destryer_cdp1869_intf )
static CDP1869_INTERFACE( destryer_vis_intf )
{
SCREEN_TAG,
0,
@ -136,7 +136,7 @@ static CDP1869_INTERFACE( destryer_cdp1869_intf )
DEVCB_DRIVER_LINE_MEMBER(cidelsa_state, prd_w)
};
static CDP1869_INTERFACE( altair_cdp1869_intf )
static CDP1869_INTERFACE( altair_vis_intf )
{
SCREEN_TAG,
0,
@ -147,7 +147,7 @@ static CDP1869_INTERFACE( altair_cdp1869_intf )
DEVCB_DRIVER_LINE_MEMBER(cidelsa_state, prd_w)
};
static CDP1869_INTERFACE( draco_cdp1869_intf )
static CDP1869_INTERFACE( draco_vis_intf )
{
SCREEN_TAG,
0,
@ -167,14 +167,14 @@ void cidelsa_state::video_start()
m_charram = auto_alloc_array(m_machine, UINT8, CIDELSA_CHARRAM_SIZE);
// register for state saving
state_save_register_global(m_machine, m_cdp1869_pcb);
state_save_register_global_pointer(m_machine, m_pcbram, CIDELSA_CHARRAM_SIZE);
state_save_register_global_pointer(m_machine, m_charram, CIDELSA_CHARRAM_SIZE);
save_item(NAME(m_cdp1869_pcb));
save_pointer(NAME(m_pcbram), CIDELSA_CHARRAM_SIZE);
save_pointer(NAME(m_charram), CIDELSA_CHARRAM_SIZE);
}
/* AY-3-8910 */
WRITE8_MEMBER( cidelsa_state::draco_ay8910_port_b_w )
WRITE8_MEMBER( draco_state::psg_pb_w )
{
/*
@ -192,14 +192,14 @@ WRITE8_MEMBER( cidelsa_state::draco_ay8910_port_b_w )
*/
}
static const ay8910_interface ay8910_config =
static const ay8910_interface psg_intf =
{
AY8910_SINGLE_OUTPUT,
AY8910_DEFAULT_LOADS,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DRIVER_MEMBER(cidelsa_state, draco_ay8910_port_b_w)
DEVCB_DRIVER_MEMBER(draco_state, psg_pb_w)
};
/* Machine Drivers */
@ -209,7 +209,7 @@ MACHINE_CONFIG_FRAGMENT( destryer_video )
MCFG_SCREEN_DEFAULT_POSITION(1.226, 0.012, 1.4, 0.044)
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_CDP1869_ADD(CDP1869_TAG, DESTRYER_CHR2, destryer_cdp1869_intf, cidelsa_page_ram)
MCFG_CDP1869_ADD(CDP1869_TAG, DESTRYER_CHR2, destryer_vis_intf, cidelsa_page_ram)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
@ -218,7 +218,7 @@ MACHINE_CONFIG_FRAGMENT( altair_video )
MCFG_SCREEN_DEFAULT_POSITION(1.226, 0.012, 1.4, 0.044)
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_CDP1869_ADD(CDP1869_TAG, ALTAIR_CHR2, altair_cdp1869_intf, cidelsa_page_ram)
MCFG_CDP1869_ADD(CDP1869_TAG, ALTAIR_CHR2, altair_vis_intf, cidelsa_page_ram)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
@ -227,8 +227,8 @@ MACHINE_CONFIG_FRAGMENT( draco_video )
MCFG_SCREEN_DEFAULT_POSITION(1.226, 0.012, 1.360, 0.024)
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_CDP1869_ADD(CDP1869_TAG, DRACO_CHR2, draco_cdp1869_intf, draco_page_ram)
MCFG_CDP1869_ADD(CDP1869_TAG, DRACO_CHR2, draco_vis_intf, draco_page_ram)
MCFG_SOUND_ADD(AY8910_TAG, AY8910, DRACO_SND_CHR1)
MCFG_SOUND_CONFIG(ay8910_config)
MCFG_SOUND_CONFIG(psg_intf)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END