mirror of
https://github.com/holub/mame
synced 2025-05-28 16:43:04 +03:00
- Added MC3417 and MC3418 variants
- Changed Mouse Trap to use MC3417
This commit is contained in:
parent
08efd6203a
commit
adcf70548a
@ -124,6 +124,8 @@ void msm5205_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void msm5232_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void upd7759_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void hc55516_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void mc3417_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void mc3418_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void k005289_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void k007232_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
void k051649_get_info(void *token, UINT32 state, sndinfo *info);
|
||||
@ -336,6 +338,8 @@ static const struct
|
||||
#endif
|
||||
#if (HAS_HC55516)
|
||||
{ SOUND_HC55516, hc55516_get_info },
|
||||
{ SOUND_MC3417, mc3417_get_info },
|
||||
{ SOUND_MC3418, mc3418_get_info },
|
||||
#endif
|
||||
#if (HAS_K005289)
|
||||
{ SOUND_K005289, k005289_get_info },
|
||||
|
@ -88,6 +88,8 @@ enum _sound_type
|
||||
SOUND_MSM5232,
|
||||
SOUND_UPD7759,
|
||||
SOUND_HC55516,
|
||||
SOUND_MC3417,
|
||||
SOUND_MC3418,
|
||||
SOUND_K005289,
|
||||
SOUND_K007232,
|
||||
SOUND_K051649,
|
||||
|
@ -1,15 +1,25 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Harris HC-55516 (and related) emulator
|
||||
|
||||
Copyright Nicola Salmoria and the MAME Team
|
||||
|
||||
Notes:
|
||||
* The only difference between MC3417 and MC3418 is the number
|
||||
of bits checked for the Coincidence Output. For the MC3417,
|
||||
it is three bits, while for the MC3418 it is four.
|
||||
This is not emulated.
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
#include "sndintrf.h"
|
||||
#include "streams.h"
|
||||
#include "hc55516.h"
|
||||
#include <math.h>
|
||||
|
||||
#include "cpuintrf.h"
|
||||
|
||||
|
||||
/* default to 4x oversampling */
|
||||
/* 4x oversampling */
|
||||
#define SAMPLE_RATE (48000 * 4)
|
||||
|
||||
|
||||
#define INTEGRATOR_LEAK_TC 0.001
|
||||
#define FILTER_DECAY_TC 0.004
|
||||
#define FILTER_CHARGE_TC 0.004
|
||||
@ -22,8 +32,9 @@ struct hc55516_data
|
||||
{
|
||||
sound_stream *channel;
|
||||
int clock; /* 0 = software driven, non-0 = oscillator */
|
||||
int active_clock_hi;
|
||||
|
||||
UINT8 last_clock;
|
||||
UINT8 last_clock_state;
|
||||
UINT8 databit;
|
||||
UINT8 new_databit;
|
||||
UINT8 shiftreg;
|
||||
@ -45,7 +56,7 @@ static void hc55516_update(void *param, stream_sample_t **inputs, stream_sample_
|
||||
|
||||
|
||||
|
||||
static void *hc55516_start(int sndindex, int clock, const void *config)
|
||||
static void *start_common(int sndindex, int clock, const void *config, int _active_clock_hi)
|
||||
{
|
||||
struct hc55516_data *chip;
|
||||
|
||||
@ -60,9 +71,11 @@ static void *hc55516_start(int sndindex, int clock, const void *config)
|
||||
|
||||
/* create the stream */
|
||||
chip->clock = clock;
|
||||
chip->active_clock_hi = _active_clock_hi;
|
||||
chip->last_clock_state = 0;
|
||||
chip->channel = stream_create(0, 1, SAMPLE_RATE, chip, hc55516_update);
|
||||
|
||||
state_save_register_item("hc55516", sndindex, chip->last_clock);
|
||||
state_save_register_item("hc55516", sndindex, chip->last_clock_state);
|
||||
state_save_register_item("hc55516", sndindex, chip->databit);
|
||||
state_save_register_item("hc55516", sndindex, chip->new_databit);
|
||||
state_save_register_item("hc55516", sndindex, chip->shiftreg);
|
||||
@ -77,7 +90,40 @@ static void *hc55516_start(int sndindex, int clock, const void *config)
|
||||
}
|
||||
|
||||
|
||||
INLINE int current_clock_edge(struct hc55516_data *chip)
|
||||
static void *hc55516_start(int sndindex, int clock, const void *config)
|
||||
{
|
||||
return start_common(sndindex, clock, config, TRUE);
|
||||
}
|
||||
|
||||
|
||||
static void *mc3417_start(int sndindex, int clock, const void *config)
|
||||
{
|
||||
return start_common(sndindex, clock, config, FALSE);
|
||||
}
|
||||
|
||||
|
||||
static void *mc3418_start(int sndindex, int clock, const void *config)
|
||||
{
|
||||
return start_common(sndindex, clock, config, FALSE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void hc55516_reset(void *chip)
|
||||
{
|
||||
((struct hc55516_data *)chip)->last_clock_state = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
INLINE int is_active_clock_transition(struct hc55516_data *chip, int clock_state)
|
||||
{
|
||||
return (( chip->active_clock_hi && !chip->last_clock_state && clock_state) ||
|
||||
(!chip->active_clock_hi && chip->last_clock_state && !clock_state));
|
||||
}
|
||||
|
||||
|
||||
INLINE int current_clock_state(struct hc55516_data *chip)
|
||||
{
|
||||
return ((UINT64)chip->update_count * chip->clock * 2 / SAMPLE_RATE) & 0x01;
|
||||
}
|
||||
@ -159,28 +205,26 @@ static void hc55516_update(void *param, stream_sample_t **inputs, stream_sample_
|
||||
|
||||
if (chip->clock != 0)
|
||||
{
|
||||
int edge = current_clock_edge(chip);
|
||||
|
||||
/* external oscillator */
|
||||
for (i = 0; i < length; i++, data += slope)
|
||||
{
|
||||
int new_edge;
|
||||
UINT8 clock_state;
|
||||
|
||||
*buffer++ = data;
|
||||
|
||||
chip->update_count++;
|
||||
|
||||
new_edge = current_clock_edge(chip);
|
||||
clock_state = current_clock_state(chip);
|
||||
|
||||
/* pull in next data bit on falling edge of the clock */
|
||||
if (edge && !new_edge)
|
||||
/* pull in next data bit on the appropriate edge of the clock */
|
||||
if (is_active_clock_transition(chip, clock_state))
|
||||
{
|
||||
chip->databit = chip->new_databit;
|
||||
|
||||
process_bit(chip);
|
||||
}
|
||||
|
||||
edge = new_edge;
|
||||
chip->last_clock_state = clock_state;
|
||||
}
|
||||
}
|
||||
|
||||
@ -194,16 +238,12 @@ static void hc55516_update(void *param, stream_sample_t **inputs, stream_sample_
|
||||
void hc55516_clock_w(int num, int state)
|
||||
{
|
||||
struct hc55516_data *chip = sndti_token(SOUND_HC55516, num);
|
||||
int clock = state & 1, diffclock;
|
||||
UINT8 clock_state = state ? TRUE : FALSE;
|
||||
|
||||
assert(chip->clock == 0);
|
||||
|
||||
/* update the clock */
|
||||
diffclock = clock ^ chip->last_clock;
|
||||
chip->last_clock = clock;
|
||||
|
||||
/* speech clock changing (active on rising edge) */
|
||||
if (diffclock && clock)
|
||||
/* speech clock changing? */
|
||||
if (is_active_clock_transition(chip, clock_state))
|
||||
{
|
||||
/* update the output buffer before changing the registers */
|
||||
stream_update(chip->channel);
|
||||
@ -213,6 +253,9 @@ void hc55516_clock_w(int num, int state)
|
||||
|
||||
process_bit(chip);
|
||||
}
|
||||
|
||||
/* update the clock */
|
||||
chip->last_clock_state = clock_state;
|
||||
}
|
||||
|
||||
|
||||
@ -250,7 +293,7 @@ void hc55516_digit_clock_clear_w(int num, int data)
|
||||
}
|
||||
|
||||
|
||||
int hc55516_clock_edge_r(int num)
|
||||
int hc55516_clock_state_r(int num)
|
||||
{
|
||||
struct hc55516_data *chip = sndti_token(SOUND_HC55516, num);
|
||||
|
||||
@ -258,7 +301,7 @@ int hc55516_clock_edge_r(int num)
|
||||
|
||||
stream_update(chip->channel);
|
||||
|
||||
return current_clock_edge(chip);
|
||||
return current_clock_state(chip);
|
||||
}
|
||||
|
||||
|
||||
@ -268,16 +311,14 @@ WRITE8_HANDLER( hc55516_0_clock_w ) { hc55516_clock_w(0,data); }
|
||||
WRITE8_HANDLER( hc55516_0_clock_clear_w ) { hc55516_clock_clear_w(0,data); }
|
||||
WRITE8_HANDLER( hc55516_0_clock_set_w ) { hc55516_clock_set_w(0,data); }
|
||||
WRITE8_HANDLER( hc55516_0_digit_clock_clear_w ) { hc55516_digit_clock_clear_w(0,data); }
|
||||
READ8_HANDLER ( hc55516_0_clock_edge_r ) { return hc55516_clock_edge_r(0); }
|
||||
READ8_HANDLER ( hc55516_0_clock_state_r ) { return hc55516_clock_state_r(0); }
|
||||
|
||||
WRITE8_HANDLER( hc55516_1_digit_w ) { hc55516_digit_w(1,data); }
|
||||
WRITE8_HANDLER( hc55516_1_clock_w ) { hc55516_clock_w(1,data); }
|
||||
WRITE8_HANDLER( hc55516_1_clock_clear_w ) { hc55516_clock_clear_w(1,data); }
|
||||
WRITE8_HANDLER( hc55516_1_clock_set_w ) { hc55516_clock_set_w(1,data); }
|
||||
WRITE8_HANDLER( hc55516_1_digit_clock_clear_w ) { hc55516_digit_clock_clear_w(1,data); }
|
||||
READ8_HANDLER ( hc55516_1_clock_edge_r ) { return hc55516_clock_edge_r(1); }
|
||||
|
||||
|
||||
READ8_HANDLER ( hc55516_1_clock_state_r ) { return hc55516_clock_state_r(1); }
|
||||
|
||||
|
||||
|
||||
@ -285,29 +326,19 @@ READ8_HANDLER ( hc55516_1_clock_edge_r ) { return hc55516_clock_edge_r(1); }
|
||||
* Generic get_info
|
||||
**************************************************************************/
|
||||
|
||||
static void hc55516_set_info(void *token, UINT32 state, sndinfo *info)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
/* no parameters to set */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void hc55516_get_info(void *token, UINT32 state, sndinfo *info)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
/* --- the following bits of info are returned as 64-bit signed integers --- */
|
||||
case SNDINFO_INT_ALIAS: info->i = SOUND_HC55516; break;
|
||||
|
||||
/* --- the following bits of info are returned as pointers to data or functions --- */
|
||||
case SNDINFO_PTR_SET_INFO: info->set_info = hc55516_set_info; break;
|
||||
case SNDINFO_PTR_START: info->start = hc55516_start; break;
|
||||
case SNDINFO_PTR_STOP: /* nothing */ break;
|
||||
case SNDINFO_PTR_RESET: /* nothing */ break;
|
||||
case SNDINFO_PTR_RESET: info->reset = hc55516_reset; break;
|
||||
|
||||
/* --- the following bits of info are returned as NULL-terminated strings --- */
|
||||
case SNDINFO_STR_NAME: info->s = "HC55516"; break;
|
||||
case SNDINFO_STR_NAME: info->s = "HC-55516"; break;
|
||||
case SNDINFO_STR_CORE_FAMILY: info->s = "CVSD"; break;
|
||||
case SNDINFO_STR_CORE_VERSION: info->s = "2.0"; break;
|
||||
case SNDINFO_STR_CORE_FILE: info->s = __FILE__; break;
|
||||
@ -315,3 +346,26 @@ void hc55516_get_info(void *token, UINT32 state, sndinfo *info)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void mc3417_get_info(void *token, UINT32 state, sndinfo *info)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case SNDINFO_PTR_START: info->start = mc3417_start; break;
|
||||
case SNDINFO_PTR_RESET: /* chip has no reset pin */ break;
|
||||
case SNDINFO_STR_NAME: info->s = "MC3417"; break;
|
||||
default: hc55516_get_info(token, state, info); break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void mc3418_get_info(void *token, UINT32 state, sndinfo *info)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case SNDINFO_PTR_START: info->start = mc3418_start; break;
|
||||
case SNDINFO_PTR_RESET: /* chip has no reset pin */ break;
|
||||
case SNDINFO_STR_NAME: info->s = "MC3418"; break;
|
||||
default: hc55516_get_info(token, state, info); break;
|
||||
}
|
||||
}
|
||||
|
@ -15,21 +15,22 @@ void hc55516_clock_set_w(int num, int data);
|
||||
/* clears the clock state and sets the databit */
|
||||
void hc55516_digit_clock_clear_w(int num, int data);
|
||||
|
||||
int hc55516_clock_edge_r(int num);
|
||||
/* returns whether the clock is currently LO or HI */
|
||||
int hc55516_clock_state_r(int num);
|
||||
|
||||
WRITE8_HANDLER( hc55516_0_digit_w );
|
||||
WRITE8_HANDLER( hc55516_0_clock_w );
|
||||
WRITE8_HANDLER( hc55516_0_clock_clear_w );
|
||||
WRITE8_HANDLER( hc55516_0_clock_set_w );
|
||||
WRITE8_HANDLER( hc55516_0_digit_clock_clear_w );
|
||||
READ8_HANDLER ( hc55516_0_clock_edge_r );
|
||||
READ8_HANDLER ( hc55516_0_clock_state_r );
|
||||
|
||||
WRITE8_HANDLER( hc55516_1_digit_w );
|
||||
WRITE8_HANDLER( hc55516_1_clock_w );
|
||||
WRITE8_HANDLER( hc55516_1_clock_clear_w );
|
||||
WRITE8_HANDLER( hc55516_1_clock_set_w );
|
||||
WRITE8_HANDLER( hc55516_1_digit_clock_clear_w );
|
||||
READ8_HANDLER ( hc55516_1_clock_edge_r );
|
||||
READ8_HANDLER ( hc55516_1_clock_state_r );
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -105,7 +105,7 @@ static struct sh8253_timer_channel sh8253_timer[3];
|
||||
static UINT8 has_sh8253;
|
||||
|
||||
/* 5220/CVSD variables */
|
||||
static UINT8 has_hc55516;
|
||||
static UINT8 has_mc3417;
|
||||
static UINT8 has_tms5220;
|
||||
|
||||
/* sound streaming variables */
|
||||
@ -357,11 +357,11 @@ static void *common_sh_start(int _has_sh8253, int _has_tms5220)
|
||||
has_tms5220 = _has_tms5220;
|
||||
|
||||
/* determine which sound hardware is installed */
|
||||
has_hc55516 = FALSE;
|
||||
has_mc3417 = FALSE;
|
||||
for (i = 0; i < MAX_SOUND; i++)
|
||||
{
|
||||
if (Machine->drv->sound[i].type == SOUND_HC55516)
|
||||
has_hc55516 = TRUE;
|
||||
if (Machine->drv->sound[i].type == SOUND_MC3417)
|
||||
has_mc3417 = TRUE;
|
||||
}
|
||||
|
||||
/* allocate the stream */
|
||||
@ -466,7 +466,7 @@ static WRITE8_HANDLER( exidy_shriot_w )
|
||||
switch (offset & 0x03)
|
||||
{
|
||||
case 0: /* port A */
|
||||
if (has_hc55516)
|
||||
if (has_mc3417)
|
||||
cpunum_set_input_line(2, INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE);
|
||||
riot_porta_data = (riot_porta_data & ~riot_porta_ddr) | (data & riot_porta_ddr);
|
||||
break;
|
||||
@ -854,7 +854,7 @@ static READ8_HANDLER( mtrap_voiceio_r )
|
||||
}
|
||||
|
||||
if (!(offset & 0x40))
|
||||
return hc55516_clock_edge_r(0) << 7;
|
||||
return hc55516_clock_state_r(0) << 7;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -879,7 +879,7 @@ MACHINE_DRIVER_START( mtrap_cvsd_audio )
|
||||
MDRV_CPU_IO_MAP(cvsd_iomap,0)
|
||||
|
||||
/* audio hardware */
|
||||
MDRV_SOUND_ADD(HC55516, CVSD_CLOCK)
|
||||
MDRV_SOUND_ADD(MC3417, CVSD_CLOCK)
|
||||
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
|
||||
MACHINE_DRIVER_END
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user