mirror of
https://github.com/holub/mame
synced 2025-04-27 18:53:05 +03:00
Refactored CDP1852 into a C++ device and cleaned up the Cidelsa driver slightly. (no whatsnew)
This commit is contained in:
parent
f575cd348f
commit
c98ef8f23a
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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 -----------*/
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user