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 RCA CDP1852 Byte-Wide Input/Output Port emulation
Copyright Nicola Salmoria and the MAME Team. Copyright Nicola Salmoria and the MAME Team.
Visit http://mamedev.org for licensing and usage restrictions. Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/ **********************************************************************/
#include "emu.h"
#include "cdp1852.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; MODE_INPUT = 0,
devcb_resolved_read8 in_data_func; MODE_OUTPUT
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 */
}; };
/***************************************************************************
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); // inherit a copy of the static data
return (cdp1852_t *)downcast<legacy_device_base *>(device)->token(); 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) // or initialize to defaults if none provided
{ else
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)
{ {
cdp1852->sr = level; memset(&m_in_mode_func, 0, sizeof(m_in_mode_func));
memset(&m_out_sr_func, 0, sizeof(m_out_sr_func));
devcb_call_write_line(&cdp1852->out_sr_func, cdp1852->sr); 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; return devcb_call_read_line(&m_in_mode_func);
cdp1852_t *cdp1852 = get_safe_token(device); }
switch (cdp1852->mode)
//-------------------------------------------------
// set_sr_line -
//-------------------------------------------------
void cdp1852_device::set_sr_line(int state)
{
if (m_sr != state)
{ {
case CDP1852_MODE_INPUT: m_sr = state;
/* input data into register */
cdp1852->data = devcb_call_read8(&cdp1852->in_data_func, 0);
/* signal processor */ devcb_call_write_line(&m_out_sr_func, m_sr);
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;
} }
} }
/*-------------------------------------------------
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; m_scan_timer = timer_alloc();
cdp1852->new_data = 1; m_scan_timer->adjust(attotime::zero, 0, attotime::from_hz(clock()));
}
}
/*-------------------------------------------------
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()));
} }
/* register for state saving */ // register for state saving
device->save_item(NAME(cdp1852->new_data)); save_item(NAME(m_new_data));
device->save_item(NAME(cdp1852->data)); save_item(NAME(m_data));
device->save_item(NAME(cdp1852->next_data)); save_item(NAME(m_next_data));
device->save_item(NAME(cdp1852->sr)); save_item(NAME(m_sr));
device->save_item(NAME(cdp1852->next_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 */ if (get_mode() == MODE_INPUT)
cdp1852->data = 0;
if (cdp1852->mode == CDP1852_MODE_INPUT)
{ {
/* reset service request flip-flop */ // reset service request flip-flop
set_sr_line(cdp1852, 1); set_sr_line(1);
} }
else else
{ {
/* output data */ // output data
devcb_call_write8(&cdp1852->out_data_func, 0, cdp1852->data); devcb_call_write8(&m_out_data_func, 0, m_data);
/* reset service request flip-flop */ // reset service request flip-flop
set_sr_line(cdp1852, 0); 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 MODE_INPUT:
case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(cdp1852_t); break; // input data into register
case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = 0; break; m_data = devcb_call_read8(&m_in_data_func, 0);
/* --- the following bits of info are returned as pointers to data or functions --- */ // signal processor
case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(cdp1852); break; set_sr_line(0);
case DEVINFO_FCT_STOP: /* Nothing */ break; break;
case DEVINFO_FCT_RESET: info->reset = DEVICE_RESET_NAME(cdp1852); break;
/* --- the following bits of info are returned as NULL-terminated strings --- */ case MODE_OUTPUT:
case DEVINFO_STR_NAME: strcpy(info->s, "RCA CDP1852"); break; if (m_new_data)
case DEVINFO_STR_FAMILY: strcpy(info->s, "RCA CDP1800"); break; {
case DEVINFO_STR_VERSION: strcpy(info->s, "1.0"); break; m_new_data = 0;
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; // 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__ #ifndef __CDP1852__
#define __CDP1852__ #define __CDP1852__
#include "devlegcy.h" #include "emu.h"
/***************************************************************************
MACROS / CONSTANTS //**************************************************************************
***************************************************************************/ // MACROS / CONSTANTS
//**************************************************************************
#define CDP1852_CLOCK_HIGH 0 #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) \ #define MCFG_CDP1852_ADD(_tag, _clock, _config) \
MCFG_DEVICE_ADD(_tag, CDP1852, _clock) \ MCFG_DEVICE_ADD(_tag, CDP1852, _clock) \
MCFG_DEVICE_CONFIG(_config) MCFG_DEVICE_CONFIG(_config)
#define CDP1852_INTERFACE(_name) \
const cdp1852_interface (_name)=
/*************************************************************************** #define CDP1852_INTERFACE(name) \
TYPE DEFINITIONS 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 m_in_data_func;
devcb_read8 in_data_func; devcb_write8 m_out_data_func;
/* this gets called for every external data write */ devcb_write_line m_out_sr_func;
devcb_write8 out_data_func;
/* this gets called for every change of the SR pin (pin 23) */
devcb_write_line out_sr_func;
}; };
/***************************************************************************
PROTOTYPES
***************************************************************************/
/* data access */ // ======================> cdp1852_device_config
READ8_DEVICE_HANDLER( cdp1852_data_r );
WRITE8_DEVICE_HANDLER( cdp1852_data_w ); 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 #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" #include "includes/cidelsa.h"
/* CDP1802 Interface */ /* CDP1802 Interface */
@ -39,7 +30,7 @@ static COSMAC_INTERFACE( cidelsa_cdp1802_config )
/* Sound Interface */ /* 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); 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) switch (data)
{ {
case 0x01: case 0x01:
ay8910_data_w(m_psg, 0, m_draco_ay_latch); ay8910_data_w(m_psg, 0, m_psg_latch);
break; break;
case 0x02: case 0x02:
m_draco_ay_latch = ay8910_r(m_psg, 0); m_psg_latch = ay8910_r(m_psg, 0);
break; break;
case 0x03: case 0x03:
ay8910_address_w(m_psg, 0, m_draco_ay_latch); ay8910_address_w(m_psg, 0, m_psg_latch);
break; 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 */ /* Read/Write Handlers */
@ -141,11 +132,11 @@ WRITE8_MEMBER( cidelsa_state::altair_out1_w )
set_led_status(m_machine, 2, data & 0x20); // FIRE set_led_status(m_machine, 2, data & 0x20); // FIRE
} }
WRITE8_MEMBER( cidelsa_state::draco_out1_w ) WRITE8_MEMBER( draco_state::out1_w )
{ {
/* /*
bit description bit description
0 3K9 -> Green signal 0 3K9 -> Green signal
1 820R -> Blue signal 1 820R -> Blue signal
2 510R -> Red signal 2 510R -> Red signal
@ -156,7 +147,7 @@ WRITE8_MEMBER( cidelsa_state::draco_out1_w )
7 SONIDO C -> COP402 IN2 7 SONIDO C -> COP402 IN2
*/ */
m_draco_sound = (data & 0xe0) >> 5; m_sound = (data & 0xe0) >> 5;
} }
static CDP1852_INTERFACE( cidelsa_cdp1852_in0_intf ) static CDP1852_INTERFACE( cidelsa_cdp1852_in0_intf )
@ -195,7 +186,7 @@ static CDP1852_INTERFACE( draco_cdp1852_out1_intf )
{ {
CDP1852_MODE_OUTPUT, CDP1852_MODE_OUTPUT,
DEVCB_NULL, DEVCB_NULL,
DEVCB_DRIVER_MEMBER(cidelsa_state, draco_out1_w), DEVCB_DRIVER_MEMBER(draco_state, out1_w),
DEVCB_NULL DEVCB_NULL
}; };
@ -242,37 +233,37 @@ static ADDRESS_MAP_START( altair_map, AS_PROGRAM, 8, cidelsa_state )
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( altair_io_map, AS_IO, 8, cidelsa_state ) 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(0x01, 0x01) AM_DEVREAD("ic23", cdp1852_device, read) AM_DEVWRITE("ic26", cdp1852_device, write)
AM_RANGE(0x02, 0x02) AM_DEVREAD_LEGACY("ic24", cdp1852_data_r) AM_RANGE(0x02, 0x02) AM_DEVREAD("ic24", cdp1852_device, read)
AM_RANGE(0x04, 0x04) AM_DEVREAD_LEGACY("ic25", cdp1852_data_r) AM_RANGE(0x04, 0x04) AM_DEVREAD("ic25", cdp1852_device, read)
AM_RANGE(0x03, 0x07) AM_WRITE(cdp1869_w) AM_RANGE(0x03, 0x07) AM_WRITE(cdp1869_w)
ADDRESS_MAP_END ADDRESS_MAP_END
// Draco // 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(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x8000, 0x83ff) AM_RAM AM_SHARE("nvram") 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(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) AM_RANGE(0xf800, 0xffff) AM_DEVREADWRITE(CDP1869_TAG, cdp1869_device, page_ram_r, page_ram_w)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( draco_io_map, AS_IO, 8, cidelsa_state ) static ADDRESS_MAP_START( draco_io_map, AS_IO, 8, draco_state )
AM_RANGE(0x01, 0x01) AM_DEVREAD_LEGACY("ic29", cdp1852_data_r) AM_DEVWRITE_LEGACY("ic32", cdp1852_data_w) AM_RANGE(0x01, 0x01) AM_DEVREAD("ic29", cdp1852_device, read) AM_DEVWRITE("ic32", cdp1852_device, write)
AM_RANGE(0x02, 0x02) AM_DEVREAD_LEGACY("ic30", cdp1852_data_r) AM_RANGE(0x02, 0x02) AM_DEVREAD("ic30", cdp1852_device, read)
AM_RANGE(0x04, 0x04) AM_DEVREAD_LEGACY("ic31", cdp1852_data_r) AM_RANGE(0x04, 0x04) AM_DEVREAD("ic31", cdp1852_device, read)
AM_RANGE(0x03, 0x07) AM_WRITE(cdp1869_w) AM_RANGE(0x03, 0x07) AM_WRITE_BASE(cidelsa_state, cdp1869_w)
ADDRESS_MAP_END 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") AM_RANGE(0x000, 0x3ff) AM_ROMBANK("bank1")
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( draco_sound_io_map, AS_IO, 8, cidelsa_state ) static ADDRESS_MAP_START( draco_sound_io_map, AS_IO, 8, draco_state )
AM_RANGE(COP400_PORT_D, COP400_PORT_D) AM_WRITE(draco_sound_bankswitch_w) AM_RANGE(COP400_PORT_D, COP400_PORT_D) AM_WRITE(sound_bankswitch_w)
AM_RANGE(COP400_PORT_G, COP400_PORT_G) AM_WRITE(draco_sound_g_w) AM_RANGE(COP400_PORT_G, COP400_PORT_G) AM_WRITE(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_L, COP400_PORT_L) AM_READWRITE(psg_r, psg_w)
AM_RANGE(COP400_PORT_IN, COP400_PORT_IN) AM_READ(draco_sound_in_r) 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_SIO, COP400_PORT_SIO) AM_NOP
AM_RANGE(COP400_PORT_SK, COP400_PORT_SK) AM_WRITENOP AM_RANGE(COP400_PORT_SK, COP400_PORT_SK) AM_WRITENOP
ADDRESS_MAP_END ADDRESS_MAP_END
@ -442,27 +433,22 @@ static TIMER_CALLBACK( set_cpu_mode )
state->m_reset = 1; 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 */ /* 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 */ /* setup COP402 memory banking */
memory_configure_bank(machine, "bank1", 0, 2, machine.region(COP402N_TAG)->base(), 0x400); memory_configure_bank(m_machine, "bank1", 0, 2, m_machine.region(COP402N_TAG)->base(), 0x400);
memory_set_bank(machine, "bank1", 0); memory_set_bank(m_machine, "bank1", 0);
/* register for state saving */ /* register for state saving */
state->save_item(NAME(state->m_draco_sound)); save_item(NAME(m_reset));
state->save_item(NAME(state->m_draco_ay_latch)); save_item(NAME(m_sound));
save_item(NAME(m_psg_latch));
} }
/* Machine Reset */ /* Machine Reset */
@ -484,8 +470,6 @@ static MACHINE_CONFIG_START( destryer, cidelsa_state )
MCFG_CPU_CONFIG(cidelsa_cdp1802_config) MCFG_CPU_CONFIG(cidelsa_cdp1802_config)
MCFG_NVRAM_ADD_0FILL("nvram") MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_MACHINE_START(cidelsa)
/* sound and video hardware */ /* sound and video hardware */
MCFG_FRAGMENT_ADD(destryer_video) MCFG_FRAGMENT_ADD(destryer_video)
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -498,8 +482,6 @@ static MACHINE_CONFIG_START( destryera, cidelsa_state )
MCFG_CPU_CONFIG(cidelsa_cdp1802_config) MCFG_CPU_CONFIG(cidelsa_cdp1802_config)
MCFG_NVRAM_ADD_0FILL("nvram") MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_MACHINE_START(cidelsa)
/* sound and video hardware */ /* sound and video hardware */
MCFG_FRAGMENT_ADD(destryer_video) MCFG_FRAGMENT_ADD(destryer_video)
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -512,8 +494,6 @@ static MACHINE_CONFIG_START( altair, cidelsa_state )
MCFG_CPU_CONFIG(cidelsa_cdp1802_config) MCFG_CPU_CONFIG(cidelsa_cdp1802_config)
MCFG_NVRAM_ADD_0FILL("nvram") MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_MACHINE_START(cidelsa)
/* input/output hardware */ /* 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("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) 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) MCFG_FRAGMENT_ADD(altair_video)
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_START( draco, cidelsa_state ) static MACHINE_CONFIG_START( draco, draco_state )
/* basic system hardware */ /* basic system hardware */
MCFG_CPU_ADD(CDP1802_TAG, COSMAC, DRACO_CHR1) MCFG_CPU_ADD(CDP1802_TAG, COSMAC, DRACO_CHR1)
MCFG_CPU_PROGRAM_MAP(draco_map) MCFG_CPU_PROGRAM_MAP(draco_map)
@ -532,8 +512,6 @@ static MACHINE_CONFIG_START( draco, cidelsa_state )
MCFG_CPU_CONFIG(cidelsa_cdp1802_config) MCFG_CPU_CONFIG(cidelsa_cdp1802_config)
MCFG_NVRAM_ADD_0FILL("nvram") MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_MACHINE_START(draco)
MCFG_CPU_ADD(COP402N_TAG, COP402, DRACO_SND_CHR1) MCFG_CPU_ADD(COP402N_TAG, COP402, DRACO_SND_CHR1)
MCFG_CPU_PROGRAM_MAP(draco_sound_map) MCFG_CPU_PROGRAM_MAP(draco_sound_map)
MCFG_CPU_IO_MAP(draco_sound_io_map) MCFG_CPU_IO_MAP(draco_sound_io_map)

View File

@ -1,8 +1,17 @@
#pragma once
#ifndef __CIDELSA__ #ifndef __CIDELSA__
#define __CIDELSA__ #define __CIDELSA__
#define ADDRESS_MAP_MODERN
#include "emu.h"
#include "cpu/cosmac/cosmac.h" #include "cpu/cosmac/cosmac.h"
#include "cpu/cop400/cop400.h"
#include "sound/cdp1869.h" #include "sound/cdp1869.h"
#include "sound/ay8910.h"
#include "machine/cdp1852.h"
#include "machine/nvram.h"
#define SCREEN_TAG "screen" #define SCREEN_TAG "screen"
#define CDP1802_TAG "cdp1802" #define CDP1802_TAG "cdp1802"
@ -32,30 +41,21 @@ public:
cidelsa_state(running_machine &machine, const driver_device_config_base &config) cidelsa_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config), : driver_device(machine, config),
m_maincpu(*this, CDP1802_TAG), m_maincpu(*this, CDP1802_TAG),
m_vis(*this, CDP1869_TAG), m_vis(*this, CDP1869_TAG)
m_psg(*this, AY8910_TAG)
{ } { }
required_device<cosmac_device> m_maincpu; required_device<cosmac_device> m_maincpu;
required_device<cdp1869_device> m_vis; required_device<cdp1869_device> m_vis;
optional_device<device_t> m_psg;
virtual void machine_start();
virtual void machine_reset(); virtual void machine_reset();
virtual void video_start(); 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; } 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( 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( destryer_out1_w );
DECLARE_WRITE8_MEMBER( altair_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 ); DECLARE_READ_LINE_MEMBER( clear_r );
@ -72,10 +72,31 @@ public:
UINT8 *m_pageram; UINT8 *m_pageram;
UINT8 *m_pcbram; UINT8 *m_pcbram;
UINT8 *m_charram; 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 // sound state
int m_draco_sound; int m_sound;
int m_draco_ay_latch; int m_psg_latch;
}; };
/*----------- defined in video/cidelsa.c -----------*/ /*----------- 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 ) WRITE_LINE_MEMBER( cidelsa_state::prd_w )
{ {
/* invert PRD signal */ /* invert PRD signal */
device_set_input_line(m_maincpu, COSMAC_INPUT_LINE_INT, state ? CLEAR_LINE : ASSERT_LINE); m_maincpu->set_input_line(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_EF1, state ? CLEAR_LINE : ASSERT_LINE);
} }
/* Page RAM */ /* Page RAM */
@ -125,7 +125,7 @@ ADDRESS_MAP_END
/* CDP1869 Interface */ /* CDP1869 Interface */
static CDP1869_INTERFACE( destryer_cdp1869_intf ) static CDP1869_INTERFACE( destryer_vis_intf )
{ {
SCREEN_TAG, SCREEN_TAG,
0, 0,
@ -136,7 +136,7 @@ static CDP1869_INTERFACE( destryer_cdp1869_intf )
DEVCB_DRIVER_LINE_MEMBER(cidelsa_state, prd_w) DEVCB_DRIVER_LINE_MEMBER(cidelsa_state, prd_w)
}; };
static CDP1869_INTERFACE( altair_cdp1869_intf ) static CDP1869_INTERFACE( altair_vis_intf )
{ {
SCREEN_TAG, SCREEN_TAG,
0, 0,
@ -147,7 +147,7 @@ static CDP1869_INTERFACE( altair_cdp1869_intf )
DEVCB_DRIVER_LINE_MEMBER(cidelsa_state, prd_w) DEVCB_DRIVER_LINE_MEMBER(cidelsa_state, prd_w)
}; };
static CDP1869_INTERFACE( draco_cdp1869_intf ) static CDP1869_INTERFACE( draco_vis_intf )
{ {
SCREEN_TAG, SCREEN_TAG,
0, 0,
@ -167,14 +167,14 @@ void cidelsa_state::video_start()
m_charram = auto_alloc_array(m_machine, UINT8, CIDELSA_CHARRAM_SIZE); m_charram = auto_alloc_array(m_machine, UINT8, CIDELSA_CHARRAM_SIZE);
// register for state saving // register for state saving
state_save_register_global(m_machine, m_cdp1869_pcb); save_item(NAME(m_cdp1869_pcb));
state_save_register_global_pointer(m_machine, m_pcbram, CIDELSA_CHARRAM_SIZE); save_pointer(NAME(m_pcbram), CIDELSA_CHARRAM_SIZE);
state_save_register_global_pointer(m_machine, m_charram, CIDELSA_CHARRAM_SIZE); save_pointer(NAME(m_charram), CIDELSA_CHARRAM_SIZE);
} }
/* AY-3-8910 */ /* 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_SINGLE_OUTPUT,
AY8910_DEFAULT_LOADS, AY8910_DEFAULT_LOADS,
DEVCB_NULL, DEVCB_NULL,
DEVCB_NULL, 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 */ /* Machine Drivers */
@ -209,7 +209,7 @@ MACHINE_CONFIG_FRAGMENT( destryer_video )
MCFG_SCREEN_DEFAULT_POSITION(1.226, 0.012, 1.4, 0.044) MCFG_SCREEN_DEFAULT_POSITION(1.226, 0.012, 1.4, 0.044)
MCFG_SPEAKER_STANDARD_MONO("mono") 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) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END 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_SCREEN_DEFAULT_POSITION(1.226, 0.012, 1.4, 0.044)
MCFG_SPEAKER_STANDARD_MONO("mono") 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) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END 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_SCREEN_DEFAULT_POSITION(1.226, 0.012, 1.360, 0.024)
MCFG_SPEAKER_STANDARD_MONO("mono") 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_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) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END MACHINE_CONFIG_END