diff --git a/src/emu/machine/cdp1852.c b/src/emu/machine/cdp1852.c index a5e4ea0783a..5e69ae9d155 100644 --- a/src/emu/machine/cdp1852.c +++ b/src/emu/machine/cdp1852.c @@ -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(device)->token(); -} + // inherit a copy of the static data + const cdp1852_interface *intf = reinterpret_cast(static_config()); + if (intf != NULL) + *static_cast(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; + } +} diff --git a/src/emu/machine/cdp1852.h b/src/emu/machine/cdp1852.h index 7805d41fa0b..f72ffc5ab06 100644 --- a/src/emu/machine/cdp1852.h +++ b/src/emu/machine/cdp1852.h @@ -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 diff --git a/src/mame/drivers/cidelsa.c b/src/mame/drivers/cidelsa.c index 71708627a30..6274ecb9414 100644 --- a/src/mame/drivers/cidelsa.c +++ b/src/mame/drivers/cidelsa.c @@ -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(); - /* 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(); - - 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) diff --git a/src/mame/includes/cidelsa.h b/src/mame/includes/cidelsa.h index 768b769ee53..f16175bdc4b 100644 --- a/src/mame/includes/cidelsa.h +++ b/src/mame/includes/cidelsa.h @@ -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 m_maincpu; required_device m_vis; - optional_device 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 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 -----------*/ diff --git a/src/mame/video/cidelsa.c b/src/mame/video/cidelsa.c index 25557bfab98..3ea1f5c191e 100644 --- a/src/mame/video/cidelsa.c +++ b/src/mame/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