mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
modernised YMZ280B [smf]
This commit is contained in:
parent
605a9d3728
commit
27c8cc66a4
@ -26,85 +26,19 @@
|
||||
|
||||
|
||||
#define MAX_SAMPLE_CHUNK 10000
|
||||
#define MAKE_WAVS 0
|
||||
|
||||
#define FRAC_BITS 14
|
||||
#define FRAC_ONE (1 << FRAC_BITS)
|
||||
#define FRAC_MASK (FRAC_ONE - 1)
|
||||
|
||||
#define INTERNAL_BUFFER_SIZE (1 << 15)
|
||||
#define INTERNAL_SAMPLE_RATE (chip->master_clock * 2.0)
|
||||
#define INTERNAL_SAMPLE_RATE (m_master_clock * 2.0)
|
||||
|
||||
#if MAKE_WAVS
|
||||
#include "wavwrite.h"
|
||||
#endif
|
||||
|
||||
|
||||
/* struct describing a single playing ADPCM voice */
|
||||
struct YMZ280BVoice
|
||||
{
|
||||
UINT8 playing; /* 1 if we are actively playing */
|
||||
|
||||
UINT8 keyon; /* 1 if the key is on */
|
||||
UINT8 looping; /* 1 if looping is enabled */
|
||||
UINT8 mode; /* current playback mode */
|
||||
UINT16 fnum; /* frequency */
|
||||
UINT8 level; /* output level */
|
||||
UINT8 pan; /* panning */
|
||||
|
||||
UINT32 start; /* start address, in nibbles */
|
||||
UINT32 stop; /* stop address, in nibbles */
|
||||
UINT32 loop_start; /* loop start address, in nibbles */
|
||||
UINT32 loop_end; /* loop end address, in nibbles */
|
||||
UINT32 position; /* current position, in nibbles */
|
||||
|
||||
INT32 signal; /* current ADPCM signal */
|
||||
INT32 step; /* current ADPCM step */
|
||||
|
||||
INT32 loop_signal; /* signal at loop start */
|
||||
INT32 loop_step; /* step at loop start */
|
||||
UINT32 loop_count; /* number of loops so far */
|
||||
|
||||
INT32 output_left; /* output volume (left) */
|
||||
INT32 output_right; /* output volume (right) */
|
||||
INT32 output_step; /* step value for frequency conversion */
|
||||
INT32 output_pos; /* current fractional position */
|
||||
INT16 last_sample; /* last sample output */
|
||||
INT16 curr_sample; /* current sample target */
|
||||
UINT8 irq_schedule; /* 1 if the IRQ state is updated by timer */
|
||||
};
|
||||
|
||||
struct ymz280b_state
|
||||
{
|
||||
sound_stream * stream; /* which stream are we using */
|
||||
UINT8 *region_base; /* pointer to the base of the region */
|
||||
UINT32 region_size;
|
||||
UINT8 current_register; /* currently accessible register */
|
||||
UINT8 status_register; /* current status register */
|
||||
UINT8 irq_state; /* current IRQ state */
|
||||
UINT8 irq_mask; /* current IRQ mask */
|
||||
UINT8 irq_enable; /* current IRQ enable */
|
||||
UINT8 keyon_enable; /* key on enable */
|
||||
UINT8 ext_mem_enable; /* external memory enable */
|
||||
double master_clock; /* master clock frequency */
|
||||
devcb_resolved_write_line irq_callback; /* IRQ callback */
|
||||
struct YMZ280BVoice voice[8]; /* the 8 voices */
|
||||
UINT32 rom_addr_hi;
|
||||
UINT32 rom_addr_mid;
|
||||
UINT32 rom_readback_addr; /* where the CPU can read the ROM */
|
||||
devcb_resolved_read8 ext_ram_read; /* external RAM read handler */
|
||||
devcb_resolved_write8 ext_ram_write; /* external RAM write handler */
|
||||
|
||||
#if MAKE_WAVS
|
||||
void * wavresample; /* resampled waveform */
|
||||
#endif
|
||||
|
||||
INT16 *scratch;
|
||||
device_t *device;
|
||||
};
|
||||
|
||||
static void write_to_register(ymz280b_state *, int);
|
||||
|
||||
|
||||
/* step size index shift table */
|
||||
static const int index_scale[8] = { 0x0e6, 0x0e6, 0x0e6, 0x0e6, 0x133, 0x199, 0x200, 0x266 };
|
||||
@ -112,96 +46,66 @@ static const int index_scale[8] = { 0x0e6, 0x0e6, 0x0e6, 0x0e6, 0x133, 0x199, 0x
|
||||
/* lookup table for the precomputed difference */
|
||||
static int diff_lookup[16];
|
||||
|
||||
/* timer callback */
|
||||
static TIMER_CALLBACK( update_irq_state_timer_0 );
|
||||
static TIMER_CALLBACK( update_irq_state_timer_1 );
|
||||
static TIMER_CALLBACK( update_irq_state_timer_2 );
|
||||
static TIMER_CALLBACK( update_irq_state_timer_3 );
|
||||
static TIMER_CALLBACK( update_irq_state_timer_4 );
|
||||
static TIMER_CALLBACK( update_irq_state_timer_5 );
|
||||
static TIMER_CALLBACK( update_irq_state_timer_6 );
|
||||
static TIMER_CALLBACK( update_irq_state_timer_7 );
|
||||
|
||||
static const struct { timer_expired_func func; const char *name; } update_irq_state_cb[] =
|
||||
UINT8 ymz280b_device::ymz280b_read_memory(UINT32 offset)
|
||||
{
|
||||
{ FUNC(update_irq_state_timer_0) },
|
||||
{ FUNC(update_irq_state_timer_1) },
|
||||
{ FUNC(update_irq_state_timer_2) },
|
||||
{ FUNC(update_irq_state_timer_3) },
|
||||
{ FUNC(update_irq_state_timer_4) },
|
||||
{ FUNC(update_irq_state_timer_5) },
|
||||
{ FUNC(update_irq_state_timer_6) },
|
||||
{ FUNC(update_irq_state_timer_7) }
|
||||
};
|
||||
|
||||
|
||||
INLINE ymz280b_state *get_safe_token(device_t *device)
|
||||
{
|
||||
assert(device != NULL);
|
||||
assert(device->type() == YMZ280B);
|
||||
return (ymz280b_state *)downcast<ymz280b_device *>(device)->token();
|
||||
}
|
||||
|
||||
|
||||
INLINE UINT8 ymz280b_read_memory(ymz280b_state *chip, UINT32 offset)
|
||||
{
|
||||
if (chip->ext_ram_read.isnull())
|
||||
if (m_ext_read_handler.isnull())
|
||||
{
|
||||
if (offset < chip->region_size)
|
||||
return chip->region_base[offset];
|
||||
if (offset < m_region_size)
|
||||
return m_region_base[offset];
|
||||
|
||||
/* 16MB chip limit (shouldn't happen) */
|
||||
else if (offset > 0xffffff)
|
||||
return chip->region_base[offset & 0xffffff];
|
||||
return m_region_base[offset & 0xffffff];
|
||||
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
return chip->ext_ram_read(offset);
|
||||
return m_ext_read_handler(offset);
|
||||
}
|
||||
|
||||
|
||||
INLINE void update_irq_state(ymz280b_state *chip)
|
||||
void ymz280b_device::update_irq_state()
|
||||
{
|
||||
int irq_bits = chip->status_register & chip->irq_mask;
|
||||
int irq_bits = m_status_register & m_irq_mask;
|
||||
|
||||
/* always off if the enable is off */
|
||||
if (!chip->irq_enable)
|
||||
if (!m_irq_enable)
|
||||
irq_bits = 0;
|
||||
|
||||
/* update the state if changed */
|
||||
if (irq_bits && !chip->irq_state)
|
||||
if (irq_bits && !m_irq_state)
|
||||
{
|
||||
chip->irq_state = 1;
|
||||
if (!chip->irq_callback.isnull())
|
||||
chip->irq_callback(1);
|
||||
m_irq_state = 1;
|
||||
if (!m_irq_handler.isnull())
|
||||
m_irq_handler(1);
|
||||
else logerror("YMZ280B: IRQ generated, but no callback specified!");
|
||||
}
|
||||
else if (!irq_bits && chip->irq_state)
|
||||
else if (!irq_bits && m_irq_state)
|
||||
{
|
||||
chip->irq_state = 0;
|
||||
if (!chip->irq_callback.isnull())
|
||||
chip->irq_callback(0);
|
||||
m_irq_state = 0;
|
||||
if (!m_irq_handler.isnull())
|
||||
m_irq_handler(0);
|
||||
else logerror("YMZ280B: IRQ generated, but no callback specified!");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
INLINE void update_step(ymz280b_state *chip, struct YMZ280BVoice *voice)
|
||||
void ymz280b_device::update_step(struct YMZ280BVoice *voice)
|
||||
{
|
||||
double frequency;
|
||||
|
||||
/* compute the frequency */
|
||||
if (voice->mode == 1)
|
||||
frequency = chip->master_clock * (double)((voice->fnum & 0x0ff) + 1) * (1.0 / 256.0);
|
||||
frequency = m_master_clock * (double)((voice->fnum & 0x0ff) + 1) * (1.0 / 256.0);
|
||||
else
|
||||
frequency = chip->master_clock * (double)((voice->fnum & 0x1ff) + 1) * (1.0 / 256.0);
|
||||
frequency = m_master_clock * (double)((voice->fnum & 0x1ff) + 1) * (1.0 / 256.0);
|
||||
voice->output_step = (UINT32)(frequency * (double)FRAC_ONE / INTERNAL_SAMPLE_RATE);
|
||||
}
|
||||
|
||||
|
||||
INLINE void update_volumes(struct YMZ280BVoice *voice)
|
||||
void ymz280b_device::update_volumes(struct YMZ280BVoice *voice)
|
||||
{
|
||||
if (voice->pan == 8)
|
||||
{
|
||||
@ -223,41 +127,30 @@ INLINE void update_volumes(struct YMZ280BVoice *voice)
|
||||
}
|
||||
|
||||
|
||||
static void YMZ280B_state_save_update_step(ymz280b_state *chip)
|
||||
void ymz280b_device::post_load()
|
||||
{
|
||||
for (int j = 0; j < 8; j++)
|
||||
{
|
||||
struct YMZ280BVoice *voice = &chip->voice[j];
|
||||
update_step(chip, voice);
|
||||
struct YMZ280BVoice *voice = &m_voice[j];
|
||||
update_step(voice);
|
||||
if(voice->irq_schedule)
|
||||
chip->device->machine().scheduler().timer_set(attotime::zero, update_irq_state_cb[j].func, update_irq_state_cb[j].name, 0, chip);
|
||||
voice->timer->adjust(attotime::zero);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void update_irq_state_timer_common(void *param, int voicenum)
|
||||
void ymz280b_device::update_irq_state_timer_common(int voicenum)
|
||||
{
|
||||
ymz280b_state *chip = (ymz280b_state *)param;
|
||||
struct YMZ280BVoice *voice = &chip->voice[voicenum];
|
||||
struct YMZ280BVoice *voice = &m_voice[voicenum];
|
||||
|
||||
if(!voice->irq_schedule) return;
|
||||
|
||||
voice->playing = 0;
|
||||
chip->status_register |= 1 << voicenum;
|
||||
update_irq_state(chip);
|
||||
m_status_register |= 1 << voicenum;
|
||||
update_irq_state();
|
||||
voice->irq_schedule = 0;
|
||||
}
|
||||
|
||||
static TIMER_CALLBACK( update_irq_state_timer_0 ) { update_irq_state_timer_common(ptr, 0); }
|
||||
static TIMER_CALLBACK( update_irq_state_timer_1 ) { update_irq_state_timer_common(ptr, 1); }
|
||||
static TIMER_CALLBACK( update_irq_state_timer_2 ) { update_irq_state_timer_common(ptr, 2); }
|
||||
static TIMER_CALLBACK( update_irq_state_timer_3 ) { update_irq_state_timer_common(ptr, 3); }
|
||||
static TIMER_CALLBACK( update_irq_state_timer_4 ) { update_irq_state_timer_common(ptr, 4); }
|
||||
static TIMER_CALLBACK( update_irq_state_timer_5 ) { update_irq_state_timer_common(ptr, 5); }
|
||||
static TIMER_CALLBACK( update_irq_state_timer_6 ) { update_irq_state_timer_common(ptr, 6); }
|
||||
static TIMER_CALLBACK( update_irq_state_timer_7 ) { update_irq_state_timer_common(ptr, 7); }
|
||||
|
||||
|
||||
/**********************************************************************************************
|
||||
|
||||
compute_tables -- compute the difference tables
|
||||
@ -282,7 +175,7 @@ static void compute_tables(void)
|
||||
|
||||
***********************************************************************************************/
|
||||
|
||||
static int generate_adpcm(ymz280b_state *chip, struct YMZ280BVoice *voice, INT16 *buffer, int samples)
|
||||
int ymz280b_device::generate_adpcm(struct YMZ280BVoice *voice, INT16 *buffer, int samples)
|
||||
{
|
||||
int position = voice->position;
|
||||
int signal = voice->signal;
|
||||
@ -296,7 +189,7 @@ static int generate_adpcm(ymz280b_state *chip, struct YMZ280BVoice *voice, INT16
|
||||
while (samples)
|
||||
{
|
||||
/* compute the new amplitude and update the current step */
|
||||
val = ymz280b_read_memory(chip, position / 2) >> ((~position & 1) << 2);
|
||||
val = ymz280b_read_memory(position / 2) >> ((~position & 1) << 2);
|
||||
signal += (step * diff_lookup[val & 15]) / 8;
|
||||
|
||||
/* clamp to the maximum */
|
||||
@ -335,7 +228,7 @@ static int generate_adpcm(ymz280b_state *chip, struct YMZ280BVoice *voice, INT16
|
||||
while (samples)
|
||||
{
|
||||
/* compute the new amplitude and update the current step */
|
||||
val = ymz280b_read_memory(chip, position / 2) >> ((~position & 1) << 2);
|
||||
val = ymz280b_read_memory(position / 2) >> ((~position & 1) << 2);
|
||||
signal += (step * diff_lookup[val & 15]) / 8;
|
||||
|
||||
/* clamp to the maximum */
|
||||
@ -398,7 +291,7 @@ static int generate_adpcm(ymz280b_state *chip, struct YMZ280BVoice *voice, INT16
|
||||
|
||||
***********************************************************************************************/
|
||||
|
||||
static int generate_pcm8(ymz280b_state *chip, struct YMZ280BVoice *voice, INT16 *buffer, int samples)
|
||||
int ymz280b_device::generate_pcm8(struct YMZ280BVoice *voice, INT16 *buffer, int samples)
|
||||
{
|
||||
int position = voice->position;
|
||||
int val;
|
||||
@ -410,7 +303,7 @@ static int generate_pcm8(ymz280b_state *chip, struct YMZ280BVoice *voice, INT16
|
||||
while (samples)
|
||||
{
|
||||
/* fetch the current value */
|
||||
val = ymz280b_read_memory(chip, position / 2);
|
||||
val = ymz280b_read_memory(position / 2);
|
||||
|
||||
/* output to the buffer, scaling by the volume */
|
||||
*buffer++ = (INT8)val * 256;
|
||||
@ -435,7 +328,7 @@ static int generate_pcm8(ymz280b_state *chip, struct YMZ280BVoice *voice, INT16
|
||||
while (samples)
|
||||
{
|
||||
/* fetch the current value */
|
||||
val = ymz280b_read_memory(chip, position / 2);
|
||||
val = ymz280b_read_memory(position / 2);
|
||||
|
||||
/* output to the buffer, scaling by the volume */
|
||||
*buffer++ = (INT8)val * 256;
|
||||
@ -472,7 +365,7 @@ static int generate_pcm8(ymz280b_state *chip, struct YMZ280BVoice *voice, INT16
|
||||
|
||||
***********************************************************************************************/
|
||||
|
||||
static int generate_pcm16(ymz280b_state *chip, struct YMZ280BVoice *voice, INT16 *buffer, int samples)
|
||||
int ymz280b_device::generate_pcm16(struct YMZ280BVoice *voice, INT16 *buffer, int samples)
|
||||
{
|
||||
int position = voice->position;
|
||||
int val;
|
||||
@ -484,7 +377,7 @@ static int generate_pcm16(ymz280b_state *chip, struct YMZ280BVoice *voice, INT16
|
||||
while (samples)
|
||||
{
|
||||
/* fetch the current value */
|
||||
val = (INT16)((ymz280b_read_memory(chip, position / 2 + 0) << 8) + ymz280b_read_memory(chip, position / 2 + 1));
|
||||
val = (INT16)((ymz280b_read_memory(position / 2 + 0) << 8) + ymz280b_read_memory(position / 2 + 1));
|
||||
|
||||
/* output to the buffer, scaling by the volume */
|
||||
*buffer++ = val;
|
||||
@ -509,7 +402,7 @@ static int generate_pcm16(ymz280b_state *chip, struct YMZ280BVoice *voice, INT16
|
||||
while (samples)
|
||||
{
|
||||
/* fetch the current value */
|
||||
val = (INT16)((ymz280b_read_memory(chip, position / 2 + 0) << 8) + ymz280b_read_memory(chip, position / 2 + 1));
|
||||
val = (INT16)((ymz280b_read_memory(position / 2 + 0) << 8) + ymz280b_read_memory(position / 2 + 1));
|
||||
|
||||
/* output to the buffer, scaling by the volume */
|
||||
*buffer++ = val;
|
||||
@ -540,15 +433,13 @@ static int generate_pcm16(ymz280b_state *chip, struct YMZ280BVoice *voice, INT16
|
||||
|
||||
|
||||
|
||||
/**********************************************************************************************
|
||||
|
||||
ymz280b_update -- update the sound chip so that it is in sync with CPU execution
|
||||
//-------------------------------------------------
|
||||
// sound_stream_update - handle a stream update
|
||||
//-------------------------------------------------
|
||||
|
||||
***********************************************************************************************/
|
||||
|
||||
static STREAM_UPDATE( ymz280b_update )
|
||||
void ymz280b_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
|
||||
{
|
||||
ymz280b_state *chip = (ymz280b_state *)param;
|
||||
stream_sample_t *lacc = outputs[0];
|
||||
stream_sample_t *racc = outputs[1];
|
||||
int v;
|
||||
@ -560,10 +451,10 @@ static STREAM_UPDATE( ymz280b_update )
|
||||
/* loop over voices */
|
||||
for (v = 0; v < 8; v++)
|
||||
{
|
||||
struct YMZ280BVoice *voice = &chip->voice[v];
|
||||
struct YMZ280BVoice *voice = &m_voice[v];
|
||||
INT16 prev = voice->last_sample;
|
||||
INT16 curr = voice->curr_sample;
|
||||
INT16 *curr_data = chip->scratch;
|
||||
INT16 *curr_data = m_scratch;
|
||||
INT32 *ldest = lacc;
|
||||
INT32 *rdest = racc;
|
||||
UINT32 new_samples, samples_left;
|
||||
@ -608,10 +499,10 @@ static STREAM_UPDATE( ymz280b_update )
|
||||
/* generate them into our buffer */
|
||||
switch (voice->playing << 7 | voice->mode)
|
||||
{
|
||||
case 0x81: samples_left = generate_adpcm(chip, voice, chip->scratch, new_samples); break;
|
||||
case 0x82: samples_left = generate_pcm8(chip, voice, chip->scratch, new_samples); break;
|
||||
case 0x83: samples_left = generate_pcm16(chip, voice, chip->scratch, new_samples); break;
|
||||
default: samples_left = 0; memset(chip->scratch, 0, new_samples * sizeof(chip->scratch[0])); break;
|
||||
case 0x81: samples_left = generate_adpcm(voice, m_scratch, new_samples); break;
|
||||
case 0x82: samples_left = generate_pcm8(voice, m_scratch, new_samples); break;
|
||||
case 0x83: samples_left = generate_pcm16(voice, m_scratch, new_samples); break;
|
||||
default: samples_left = 0; memset(m_scratch, 0, new_samples * sizeof(m_scratch[0])); break;
|
||||
}
|
||||
|
||||
/* if there are leftovers, ramp back to 0 */
|
||||
@ -619,12 +510,12 @@ static STREAM_UPDATE( ymz280b_update )
|
||||
{
|
||||
/* note: samples_left bit 16 is set if the voice was finished at the same time the function ended */
|
||||
int base = new_samples - (samples_left & 0xffff);
|
||||
int i, t = (base == 0) ? curr : chip->scratch[base - 1];
|
||||
int i, t = (base == 0) ? curr : m_scratch[base - 1];
|
||||
for (i = 0; i < (samples_left & 0xffff); i++)
|
||||
{
|
||||
if (t < 0) t = -((-t * 15) >> 4);
|
||||
else if (t > 0) t = (t * 15) >> 4;
|
||||
chip->scratch[base + i] = t;
|
||||
m_scratch[base + i] = t;
|
||||
}
|
||||
|
||||
/* if we hit the end and IRQs are enabled, signal it */
|
||||
@ -633,7 +524,7 @@ static STREAM_UPDATE( ymz280b_update )
|
||||
voice->playing = 0;
|
||||
|
||||
/* set update_irq_state_timer. IRQ is signaled on next CPU execution. */
|
||||
chip->device->machine().scheduler().timer_set(attotime::zero, update_irq_state_cb[v].func, update_irq_state_cb[v].name, 0, chip);
|
||||
voice->timer->adjust(attotime::zero);
|
||||
voice->irq_schedule = 1;
|
||||
}
|
||||
}
|
||||
@ -678,106 +569,102 @@ static STREAM_UPDATE( ymz280b_update )
|
||||
|
||||
|
||||
|
||||
/**********************************************************************************************
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
DEVICE_START/RESET( ymz280b ) -- start/reset emulation of the YMZ280B
|
||||
|
||||
***********************************************************************************************/
|
||||
|
||||
static DEVICE_START( ymz280b )
|
||||
void ymz280b_device::device_start()
|
||||
{
|
||||
static const ymz280b_interface defintrf = { DEVCB_NULL };
|
||||
const ymz280b_interface *intf = (device->static_config() != NULL) ? (const ymz280b_interface *)device->static_config() : &defintrf;
|
||||
ymz280b_state *chip = get_safe_token(device);
|
||||
|
||||
chip->device = device;
|
||||
chip->ext_ram_read.resolve(intf->ext_read, *device);
|
||||
chip->ext_ram_write.resolve(intf->ext_write, *device);
|
||||
m_ext_read_handler.resolve();
|
||||
m_ext_write_handler.resolve();
|
||||
|
||||
/* compute ADPCM tables */
|
||||
compute_tables();
|
||||
|
||||
/* initialize the rest of the structure */
|
||||
chip->master_clock = (double)device->clock() / 384.0;
|
||||
chip->region_base = *device->region();
|
||||
chip->region_size = device->region()->bytes();
|
||||
chip->irq_callback.resolve(intf->irq_callback, *device);
|
||||
m_master_clock = (double)clock() / 384.0;
|
||||
m_region_base = *region();
|
||||
m_region_size = region()->bytes();
|
||||
m_irq_handler.resolve();
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
m_voice[i].timer = timer_alloc(i);
|
||||
}
|
||||
|
||||
/* create the stream */
|
||||
chip->stream = device->machine().sound().stream_alloc(*device, 0, 2, INTERNAL_SAMPLE_RATE, chip, ymz280b_update);
|
||||
m_stream = machine().sound().stream_alloc(*this, 0, 2, INTERNAL_SAMPLE_RATE);
|
||||
|
||||
/* allocate memory */
|
||||
assert(MAX_SAMPLE_CHUNK < 0x10000);
|
||||
chip->scratch = auto_alloc_array(device->machine(), INT16, MAX_SAMPLE_CHUNK);
|
||||
m_scratch = auto_alloc_array(machine(), INT16, MAX_SAMPLE_CHUNK);
|
||||
|
||||
/* state save */
|
||||
save_item(NAME(m_current_register));
|
||||
save_item(NAME(m_status_register));
|
||||
save_item(NAME(m_irq_state));
|
||||
save_item(NAME(m_irq_mask));
|
||||
save_item(NAME(m_irq_enable));
|
||||
save_item(NAME(m_keyon_enable));
|
||||
save_item(NAME(m_ext_mem_enable));
|
||||
save_item(NAME(m_rom_readback_addr));
|
||||
save_item(NAME(m_rom_addr_hi));
|
||||
save_item(NAME(m_rom_addr_mid));
|
||||
for (int j = 0; j < 8; j++)
|
||||
{
|
||||
int j;
|
||||
device->save_item(NAME(chip->current_register));
|
||||
device->save_item(NAME(chip->status_register));
|
||||
device->save_item(NAME(chip->irq_state));
|
||||
device->save_item(NAME(chip->irq_mask));
|
||||
device->save_item(NAME(chip->irq_enable));
|
||||
device->save_item(NAME(chip->keyon_enable));
|
||||
device->save_item(NAME(chip->ext_mem_enable));
|
||||
device->save_item(NAME(chip->rom_readback_addr));
|
||||
device->save_item(NAME(chip->rom_addr_hi));
|
||||
device->save_item(NAME(chip->rom_addr_mid));
|
||||
for (j = 0; j < 8; j++)
|
||||
{
|
||||
device->save_item(NAME(chip->voice[j].playing), j);
|
||||
device->save_item(NAME(chip->voice[j].keyon), j);
|
||||
device->save_item(NAME(chip->voice[j].looping), j);
|
||||
device->save_item(NAME(chip->voice[j].mode), j);
|
||||
device->save_item(NAME(chip->voice[j].fnum), j);
|
||||
device->save_item(NAME(chip->voice[j].level), j);
|
||||
device->save_item(NAME(chip->voice[j].pan), j);
|
||||
device->save_item(NAME(chip->voice[j].start), j);
|
||||
device->save_item(NAME(chip->voice[j].stop), j);
|
||||
device->save_item(NAME(chip->voice[j].loop_start), j);
|
||||
device->save_item(NAME(chip->voice[j].loop_end), j);
|
||||
device->save_item(NAME(chip->voice[j].position), j);
|
||||
device->save_item(NAME(chip->voice[j].signal), j);
|
||||
device->save_item(NAME(chip->voice[j].step), j);
|
||||
device->save_item(NAME(chip->voice[j].loop_signal), j);
|
||||
device->save_item(NAME(chip->voice[j].loop_step), j);
|
||||
device->save_item(NAME(chip->voice[j].loop_count), j);
|
||||
device->save_item(NAME(chip->voice[j].output_left), j);
|
||||
device->save_item(NAME(chip->voice[j].output_right), j);
|
||||
device->save_item(NAME(chip->voice[j].output_pos), j);
|
||||
device->save_item(NAME(chip->voice[j].last_sample), j);
|
||||
device->save_item(NAME(chip->voice[j].curr_sample), j);
|
||||
device->save_item(NAME(chip->voice[j].irq_schedule), j);
|
||||
}
|
||||
save_item(NAME(m_voice[j].playing), j);
|
||||
save_item(NAME(m_voice[j].keyon), j);
|
||||
save_item(NAME(m_voice[j].looping), j);
|
||||
save_item(NAME(m_voice[j].mode), j);
|
||||
save_item(NAME(m_voice[j].fnum), j);
|
||||
save_item(NAME(m_voice[j].level), j);
|
||||
save_item(NAME(m_voice[j].pan), j);
|
||||
save_item(NAME(m_voice[j].start), j);
|
||||
save_item(NAME(m_voice[j].stop), j);
|
||||
save_item(NAME(m_voice[j].loop_start), j);
|
||||
save_item(NAME(m_voice[j].loop_end), j);
|
||||
save_item(NAME(m_voice[j].position), j);
|
||||
save_item(NAME(m_voice[j].signal), j);
|
||||
save_item(NAME(m_voice[j].step), j);
|
||||
save_item(NAME(m_voice[j].loop_signal), j);
|
||||
save_item(NAME(m_voice[j].loop_step), j);
|
||||
save_item(NAME(m_voice[j].loop_count), j);
|
||||
save_item(NAME(m_voice[j].output_left), j);
|
||||
save_item(NAME(m_voice[j].output_right), j);
|
||||
save_item(NAME(m_voice[j].output_pos), j);
|
||||
save_item(NAME(m_voice[j].last_sample), j);
|
||||
save_item(NAME(m_voice[j].curr_sample), j);
|
||||
save_item(NAME(m_voice[j].irq_schedule), j);
|
||||
}
|
||||
|
||||
device->machine().save().register_postload(save_prepost_delegate(FUNC(YMZ280B_state_save_update_step), chip));
|
||||
|
||||
#if MAKE_WAVS
|
||||
chip->wavresample = wav_open("resamp.wav", INTERNAL_SAMPLE_RATE, 2);
|
||||
m_wavresample = wav_open("resamp.wav", INTERNAL_SAMPLE_RATE, 2);
|
||||
#endif
|
||||
}
|
||||
|
||||
static DEVICE_RESET( ymz280b )
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void ymz280b_device::device_reset()
|
||||
{
|
||||
int i;
|
||||
ymz280b_state *chip = get_safe_token(device);
|
||||
|
||||
/* initial clear registers */
|
||||
for (i = 0xff; i >= 0; i--)
|
||||
{
|
||||
chip->current_register = i;
|
||||
write_to_register(chip, 0);
|
||||
m_current_register = i;
|
||||
write_to_register(0);
|
||||
}
|
||||
|
||||
chip->current_register = 0;
|
||||
chip->status_register = 0;
|
||||
chip->rom_readback_addr = 0;
|
||||
m_current_register = 0;
|
||||
m_status_register = 0;
|
||||
m_rom_readback_addr = 0;
|
||||
|
||||
/* clear other voice parameters */
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
struct YMZ280BVoice *voice = &chip->voice[i];
|
||||
struct YMZ280BVoice *voice = &m_voice[i];
|
||||
|
||||
voice->curr_sample = 0;
|
||||
voice->last_sample = 0;
|
||||
@ -787,6 +674,11 @@ static DEVICE_RESET( ymz280b )
|
||||
}
|
||||
|
||||
|
||||
void ymz280b_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
update_irq_state_timer_common( param );
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************************************
|
||||
|
||||
@ -794,21 +686,21 @@ static DEVICE_RESET( ymz280b )
|
||||
|
||||
***********************************************************************************************/
|
||||
|
||||
static void write_to_register(ymz280b_state *chip, int data)
|
||||
void ymz280b_device::write_to_register(int data)
|
||||
{
|
||||
struct YMZ280BVoice *voice;
|
||||
int i;
|
||||
|
||||
/* lower registers follow a pattern */
|
||||
if (chip->current_register < 0x80)
|
||||
if (m_current_register < 0x80)
|
||||
{
|
||||
voice = &chip->voice[(chip->current_register >> 2) & 7];
|
||||
voice = &m_voice[(m_current_register >> 2) & 7];
|
||||
|
||||
switch (chip->current_register & 0xe3)
|
||||
switch (m_current_register & 0xe3)
|
||||
{
|
||||
case 0x00: /* pitch low 8 bits */
|
||||
voice->fnum = (voice->fnum & 0x100) | (data & 0xff);
|
||||
update_step(chip, voice);
|
||||
update_step(voice);
|
||||
break;
|
||||
|
||||
case 0x01: /* pitch upper 1 bit, loop, key on, mode */
|
||||
@ -816,7 +708,7 @@ static void write_to_register(ymz280b_state *chip, int data)
|
||||
voice->looping = (data & 0x10) >> 4;
|
||||
if ((data & 0x60) == 0) data &= 0x7f; /* ignore mode setting and set to same state as KON=0 */
|
||||
else voice->mode = (data & 0x60) >> 5;
|
||||
if (!voice->keyon && (data & 0x80) && chip->keyon_enable)
|
||||
if (!voice->keyon && (data & 0x80) && m_keyon_enable)
|
||||
{
|
||||
voice->playing = 1;
|
||||
voice->position = voice->start;
|
||||
@ -835,7 +727,7 @@ static void write_to_register(ymz280b_state *chip, int data)
|
||||
voice->irq_schedule = 0;
|
||||
}
|
||||
voice->keyon = (data & 0x80) >> 7;
|
||||
update_step(chip, voice);
|
||||
update_step(voice);
|
||||
break;
|
||||
|
||||
case 0x02: /* total level */
|
||||
@ -897,7 +789,7 @@ static void write_to_register(ymz280b_state *chip, int data)
|
||||
break;
|
||||
|
||||
default:
|
||||
logerror("YMZ280B: unknown register write %02X = %02X\n", chip->current_register, data);
|
||||
logerror("YMZ280B: unknown register write %02X = %02X\n", m_current_register, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -905,71 +797,71 @@ static void write_to_register(ymz280b_state *chip, int data)
|
||||
/* upper registers are special */
|
||||
else
|
||||
{
|
||||
switch (chip->current_register)
|
||||
switch (m_current_register)
|
||||
{
|
||||
/* DSP related (not implemented yet) */
|
||||
case 0x80: // d0-2: DSP Rch, d3: enable Rch (0: yes, 1: no), d4-6: DSP Lch, d7: enable Lch (0: yes, 1: no)
|
||||
case 0x81: // d0: enable control of $82 (0: yes, 1: no)
|
||||
case 0x82: // DSP data
|
||||
logerror("YMZ280B: DSP register write %02X = %02X\n", chip->current_register, data);
|
||||
logerror("YMZ280B: DSP register write %02X = %02X\n", m_current_register, data);
|
||||
break;
|
||||
|
||||
case 0x84: /* ROM readback / RAM write (high) */
|
||||
chip->rom_addr_hi = data << 16;
|
||||
m_rom_addr_hi = data << 16;
|
||||
break;
|
||||
|
||||
case 0x85: /* ROM readback / RAM write (middle) */
|
||||
chip->rom_addr_mid = data << 8;
|
||||
m_rom_addr_mid = data << 8;
|
||||
break;
|
||||
|
||||
case 0x86: /* ROM readback / RAM write (low) -> update latch */
|
||||
chip->rom_readback_addr = chip->rom_addr_hi | chip->rom_addr_mid | data;
|
||||
m_rom_readback_addr = m_rom_addr_hi | m_rom_addr_mid | data;
|
||||
break;
|
||||
|
||||
case 0x87: /* RAM write */
|
||||
if (chip->ext_mem_enable)
|
||||
if (m_ext_mem_enable)
|
||||
{
|
||||
if (!chip->ext_ram_write.isnull())
|
||||
chip->ext_ram_write(chip->rom_readback_addr, data);
|
||||
if (!m_ext_write_handler.isnull())
|
||||
m_ext_write_handler(m_rom_readback_addr, data);
|
||||
else
|
||||
logerror("YMZ280B attempted RAM write to %X\n", chip->rom_readback_addr);
|
||||
chip->rom_readback_addr = (chip->rom_readback_addr + 1) & 0xffffff;
|
||||
logerror("YMZ280B attempted RAM write to %X\n", m_rom_readback_addr);
|
||||
m_rom_readback_addr = (m_rom_readback_addr + 1) & 0xffffff;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xfe: /* IRQ mask */
|
||||
chip->irq_mask = data;
|
||||
update_irq_state(chip);
|
||||
m_irq_mask = data;
|
||||
update_irq_state();
|
||||
break;
|
||||
|
||||
case 0xff: /* IRQ enable, test, etc */
|
||||
chip->ext_mem_enable = (data & 0x40) >> 6;
|
||||
chip->irq_enable = (data & 0x10) >> 4;
|
||||
update_irq_state(chip);
|
||||
m_ext_mem_enable = (data & 0x40) >> 6;
|
||||
m_irq_enable = (data & 0x10) >> 4;
|
||||
update_irq_state();
|
||||
|
||||
if (chip->keyon_enable && !(data & 0x80))
|
||||
if (m_keyon_enable && !(data & 0x80))
|
||||
{
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
chip->voice[i].playing = 0;
|
||||
m_voice[i].playing = 0;
|
||||
|
||||
/* if update_irq_state_timer is set, cancel it. */
|
||||
chip->voice[i].irq_schedule = 0;
|
||||
m_voice[i].irq_schedule = 0;
|
||||
}
|
||||
}
|
||||
else if (!chip->keyon_enable && (data & 0x80))
|
||||
else if (!m_keyon_enable && (data & 0x80))
|
||||
{
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (chip->voice[i].keyon && chip->voice[i].looping)
|
||||
chip->voice[i].playing = 1;
|
||||
if (m_voice[i].keyon && m_voice[i].looping)
|
||||
m_voice[i].playing = 1;
|
||||
}
|
||||
}
|
||||
chip->keyon_enable = (data & 0x80) >> 7;
|
||||
m_keyon_enable = (data & 0x80) >> 7;
|
||||
break;
|
||||
|
||||
default:
|
||||
logerror("YMZ280B: unknown register write %02X = %02X\n", chip->current_register, data);
|
||||
logerror("YMZ280B: unknown register write %02X = %02X\n", m_current_register, data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -983,18 +875,18 @@ static void write_to_register(ymz280b_state *chip, int data)
|
||||
|
||||
***********************************************************************************************/
|
||||
|
||||
static int compute_status(ymz280b_state *chip)
|
||||
int ymz280b_device::compute_status()
|
||||
{
|
||||
UINT8 result;
|
||||
|
||||
/* force an update */
|
||||
chip->stream->update();
|
||||
m_stream->update();
|
||||
|
||||
result = chip->status_register;
|
||||
result = m_status_register;
|
||||
|
||||
/* clear the IRQ state */
|
||||
chip->status_register = 0;
|
||||
update_irq_state(chip);
|
||||
m_status_register = 0;
|
||||
update_irq_state();
|
||||
|
||||
return result;
|
||||
}
|
||||
@ -1007,37 +899,33 @@ static int compute_status(ymz280b_state *chip)
|
||||
|
||||
***********************************************************************************************/
|
||||
|
||||
READ8_DEVICE_HANDLER( ymz280b_r )
|
||||
READ8_MEMBER( ymz280b_device::read )
|
||||
{
|
||||
ymz280b_state *chip = get_safe_token(device);
|
||||
|
||||
if ((offset & 1) == 0)
|
||||
{
|
||||
if (!chip->ext_mem_enable)
|
||||
if (!m_ext_mem_enable)
|
||||
return 0xff;
|
||||
|
||||
/* read from external memory */
|
||||
UINT8 result = ymz280b_read_memory(chip, chip->rom_readback_addr);
|
||||
chip->rom_readback_addr = (chip->rom_readback_addr + 1) & 0xffffff;
|
||||
UINT8 result = ymz280b_read_memory(m_rom_readback_addr);
|
||||
m_rom_readback_addr = (m_rom_readback_addr + 1) & 0xffffff;
|
||||
return result;
|
||||
}
|
||||
else
|
||||
return compute_status(chip);
|
||||
return compute_status();
|
||||
}
|
||||
|
||||
|
||||
WRITE8_DEVICE_HANDLER( ymz280b_w )
|
||||
WRITE8_MEMBER( ymz280b_device::write )
|
||||
{
|
||||
ymz280b_state *chip = get_safe_token(device);
|
||||
|
||||
if ((offset & 1) == 0)
|
||||
chip->current_register = data;
|
||||
m_current_register = data;
|
||||
else
|
||||
{
|
||||
/* force an update */
|
||||
chip->stream->update();
|
||||
m_stream->update();
|
||||
|
||||
write_to_register(chip, data);
|
||||
write_to_register(data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1046,9 +934,11 @@ const device_type YMZ280B = &device_creator<ymz280b_device>;
|
||||
|
||||
ymz280b_device::ymz280b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: device_t(mconfig, YMZ280B, "YMZ280B", tag, owner, clock),
|
||||
device_sound_interface(mconfig, *this)
|
||||
device_sound_interface(mconfig, *this),
|
||||
m_irq_handler(*this),
|
||||
m_ext_read_handler(*this),
|
||||
m_ext_write_handler(*this)
|
||||
{
|
||||
m_token = global_alloc_clear(ymz280b_state);
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
@ -1060,31 +950,3 @@ ymz280b_device::ymz280b_device(const machine_config &mconfig, const char *tag, d
|
||||
void ymz280b_device::device_config_complete()
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void ymz280b_device::device_start()
|
||||
{
|
||||
DEVICE_START_NAME( ymz280b )(this);
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void ymz280b_device::device_reset()
|
||||
{
|
||||
DEVICE_RESET_NAME( ymz280b )(this);
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// sound_stream_update - handle a stream update
|
||||
//-------------------------------------------------
|
||||
|
||||
void ymz280b_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
|
||||
{
|
||||
// should never get here
|
||||
fatalerror("sound_stream_update called; not applicable to legacy sound devices\n");
|
||||
}
|
||||
|
@ -10,39 +10,117 @@
|
||||
#ifndef __YMZ280B_H__
|
||||
#define __YMZ280B_H__
|
||||
|
||||
#include "devlegcy.h"
|
||||
#include "emu.h"
|
||||
|
||||
#define MAKE_WAVS 0
|
||||
|
||||
struct ymz280b_interface
|
||||
{
|
||||
devcb_write_line irq_callback; /* irq callback */
|
||||
devcb_read8 ext_read; /* external RAM read */
|
||||
devcb_write8 ext_write; /* external RAM write */
|
||||
};
|
||||
#define MCFG_YMZ280B_IRQ_HANDLER(_devcb) \
|
||||
devcb = &ymz280b_device::set_irq_handler(*device, DEVCB2_##_devcb);
|
||||
|
||||
DECLARE_READ8_DEVICE_HANDLER ( ymz280b_r );
|
||||
DECLARE_WRITE8_DEVICE_HANDLER( ymz280b_w );
|
||||
#define MCFG_YMZ280B_EXT_READ_HANDLER(_devcb) \
|
||||
devcb = &ymz280b_device::set_ext_read_handler(*device, DEVCB2_##_devcb);
|
||||
|
||||
#define MCFG_YMZ280B_EXT_WRITE_HANDLER(_devcb) \
|
||||
devcb = &ymz280b_device::set_ext_write_handler(*device, DEVCB2_##_devcb);
|
||||
|
||||
class ymz280b_device : public device_t,
|
||||
public device_sound_interface
|
||||
{
|
||||
public:
|
||||
ymz280b_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
~ymz280b_device() { global_free(m_token); }
|
||||
|
||||
// access to legacy token
|
||||
void *token() const { assert(m_token != NULL); return m_token; }
|
||||
// static configuration helpers
|
||||
template<class _Object> static devcb2_base &set_irq_handler(device_t &device, _Object object) { return downcast<ymz280b_device &>(device).m_irq_handler.set_callback(object); }
|
||||
template<class _Object> static devcb2_base &set_ext_read_handler(device_t &device, _Object object) { return downcast<ymz280b_device &>(device).m_ext_read_handler.set_callback(object); }
|
||||
template<class _Object> static devcb2_base &set_ext_write_handler(device_t &device, _Object object) { return downcast<ymz280b_device &>(device).m_ext_write_handler.set_callback(object); }
|
||||
|
||||
DECLARE_READ8_MEMBER( read );
|
||||
DECLARE_WRITE8_MEMBER( write );
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_config_complete();
|
||||
virtual void device_start();
|
||||
virtual void post_load();
|
||||
virtual void device_reset();
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
||||
|
||||
// sound stream update overrides
|
||||
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
|
||||
private:
|
||||
|
||||
/* struct describing a single playing ADPCM voice */
|
||||
struct YMZ280BVoice
|
||||
{
|
||||
UINT8 playing; /* 1 if we are actively playing */
|
||||
|
||||
UINT8 keyon; /* 1 if the key is on */
|
||||
UINT8 looping; /* 1 if looping is enabled */
|
||||
UINT8 mode; /* current playback mode */
|
||||
UINT16 fnum; /* frequency */
|
||||
UINT8 level; /* output level */
|
||||
UINT8 pan; /* panning */
|
||||
|
||||
UINT32 start; /* start address, in nibbles */
|
||||
UINT32 stop; /* stop address, in nibbles */
|
||||
UINT32 loop_start; /* loop start address, in nibbles */
|
||||
UINT32 loop_end; /* loop end address, in nibbles */
|
||||
UINT32 position; /* current position, in nibbles */
|
||||
|
||||
INT32 signal; /* current ADPCM signal */
|
||||
INT32 step; /* current ADPCM step */
|
||||
|
||||
INT32 loop_signal; /* signal at loop start */
|
||||
INT32 loop_step; /* step at loop start */
|
||||
UINT32 loop_count; /* number of loops so far */
|
||||
|
||||
INT32 output_left; /* output volume (left) */
|
||||
INT32 output_right; /* output volume (right) */
|
||||
INT32 output_step; /* step value for frequency conversion */
|
||||
INT32 output_pos; /* current fractional position */
|
||||
INT16 last_sample; /* last sample output */
|
||||
INT16 curr_sample; /* current sample target */
|
||||
UINT8 irq_schedule; /* 1 if the IRQ state is updated by timer */
|
||||
|
||||
emu_timer *timer;
|
||||
};
|
||||
|
||||
UINT8 ymz280b_read_memory(UINT32 offset);
|
||||
void update_irq_state();
|
||||
void update_step(struct YMZ280BVoice *voice);
|
||||
void update_volumes(struct YMZ280BVoice *voice);
|
||||
void update_irq_state_timer_common(int voicenum);
|
||||
int generate_adpcm(struct YMZ280BVoice *voice, INT16 *buffer, int samples);
|
||||
int generate_pcm8(struct YMZ280BVoice *voice, INT16 *buffer, int samples);
|
||||
int generate_pcm16(struct YMZ280BVoice *voice, INT16 *buffer, int samples);
|
||||
void write_to_register(int data);
|
||||
int compute_status();
|
||||
|
||||
// internal state
|
||||
void *m_token;
|
||||
sound_stream * m_stream; /* which stream are we using */
|
||||
UINT8 *m_region_base; /* pointer to the base of the region */
|
||||
UINT32 m_region_size;
|
||||
UINT8 m_current_register; /* currently accessible register */
|
||||
UINT8 m_status_register; /* current status register */
|
||||
UINT8 m_irq_state; /* current IRQ state */
|
||||
UINT8 m_irq_mask; /* current IRQ mask */
|
||||
UINT8 m_irq_enable; /* current IRQ enable */
|
||||
UINT8 m_keyon_enable; /* key on enable */
|
||||
UINT8 m_ext_mem_enable; /* external memory enable */
|
||||
double m_master_clock; /* master clock frequency */
|
||||
devcb2_write_line m_irq_handler; /* IRQ callback */
|
||||
struct YMZ280BVoice m_voice[8]; /* the 8 voices */
|
||||
UINT32 m_rom_addr_hi;
|
||||
UINT32 m_rom_addr_mid;
|
||||
UINT32 m_rom_readback_addr; /* where the CPU can read the ROM */
|
||||
devcb2_read8 m_ext_read_handler; /* external RAM read handler */
|
||||
devcb2_write8 m_ext_write_handler;/* external RAM write handler */
|
||||
|
||||
#if MAKE_WAVS
|
||||
void * m_wavresample; /* resampled waveform */
|
||||
#endif
|
||||
|
||||
INT16 *m_scratch;
|
||||
};
|
||||
|
||||
extern const device_type YMZ280B;
|
||||
|
@ -326,7 +326,7 @@ static ADDRESS_MAP_START( backfire_map, AS_PROGRAM, 32, backfire_state )
|
||||
// AM_RANGE(0x1e8000, 0x1e8003) AM_READ(backfire_wheel1_r)
|
||||
// AM_RANGE(0x1e8004, 0x1e8007) AM_READ(backfire_wheel2_r)
|
||||
|
||||
AM_RANGE(0x1c0000, 0x1c0007) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x000000ff)
|
||||
AM_RANGE(0x1c0000, 0x1c0007) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x000000ff)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
@ -438,11 +438,6 @@ WRITE_LINE_MEMBER(backfire_state::sound_irq_gen)
|
||||
logerror("sound irq\n");
|
||||
}
|
||||
|
||||
static const ymz280b_interface ymz280b_intf =
|
||||
{
|
||||
DEVCB_DRIVER_LINE_MEMBER(backfire_state,sound_irq_gen)
|
||||
};
|
||||
|
||||
INTERRUPT_GEN_MEMBER(backfire_state::deco32_vbl_interrupt)
|
||||
{
|
||||
device.execute().set_input_line(ARM_IRQ_LINE, HOLD_LINE);
|
||||
@ -545,7 +540,7 @@ static MACHINE_CONFIG_START( backfire, backfire_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, 28000000 / 2)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(backfire_state, sound_irq_gen))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -189,10 +189,10 @@ READ16_MEMBER(sc4_state::sc4_mem_r)
|
||||
return 0x0000;//space.machine().rand();;
|
||||
|
||||
case 0x1244:
|
||||
return ymz280b_r(m_ymz,space,0);
|
||||
return m_ymz->read(space,0);
|
||||
|
||||
case 0x1246:
|
||||
return ymz280b_r(m_ymz,space,1);
|
||||
return m_ymz->read(space,1);
|
||||
|
||||
default:
|
||||
logerror("%08x maincpu read access offset %08x mem_mask %04x cs %d (LAMPS etc.)\n", pc, offset*2, mem_mask, cs);
|
||||
@ -332,11 +332,11 @@ WRITE16_MEMBER(sc4_state::sc4_mem_w)
|
||||
break;
|
||||
|
||||
case 0x1248:
|
||||
ymz280b_w(m_ymz,space,0, data & 0xff);
|
||||
m_ymz->write(space,0, data & 0xff);
|
||||
break;
|
||||
|
||||
case 0x124a:
|
||||
ymz280b_w(m_ymz,space,1, data & 0xff);
|
||||
m_ymz->write(space,1, data & 0xff);
|
||||
break;
|
||||
|
||||
case 0x1330:
|
||||
@ -625,11 +625,6 @@ WRITE_LINE_MEMBER(sc4_state::bfm_sc4_irqhandler)
|
||||
logerror("YMZ280 is generating an interrupt. State=%08x\n",state);
|
||||
}
|
||||
|
||||
static const ymz280b_interface ymz280b_config =
|
||||
{
|
||||
DEVCB_DRIVER_LINE_MEMBER(sc4_state,bfm_sc4_irqhandler)
|
||||
};
|
||||
|
||||
|
||||
|
||||
void bfm_sc4_duart_irq_handler(device_t *device, int state, UINT8 vector)
|
||||
@ -760,7 +755,7 @@ MACHINE_CONFIG_START( sc4, sc4_state )
|
||||
MCFG_DEFAULT_LAYOUT(layout_bfm_sc4)
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, 16000000) // ?? Mhz
|
||||
MCFG_SOUND_CONFIG(ymz280b_config)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(sc4_state, bfm_sc4_irqhandler))
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
@ -191,11 +191,6 @@ WRITE_LINE_MEMBER(bfm_sc5_state::bfm_sc5_ym_irqhandler)
|
||||
logerror("YMZ280 is generating an interrupt. State=%08x\n",state);
|
||||
}
|
||||
|
||||
static const ymz280b_interface ymz280b_config =
|
||||
{
|
||||
DEVCB_DRIVER_LINE_MEMBER(bfm_sc5_state,bfm_sc5_ym_irqhandler)
|
||||
};
|
||||
|
||||
|
||||
|
||||
void bfm_sc5_duart_irq_handler(device_t *device, int state, UINT8 vector)
|
||||
@ -253,6 +248,6 @@ MACHINE_CONFIG_START( bfm_sc5, bfm_sc5_state )
|
||||
MCFG_DEFAULT_LAYOUT(layout_bfm_sc5)
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, 16000000) // ?? Mhz
|
||||
MCFG_SOUND_CONFIG(ymz280b_config)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(bfm_sc5_state, bfm_sc5_ym_irqhandler))
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -137,11 +137,6 @@ WRITE_LINE_MEMBER(bfm_swp_state::irqhandler)
|
||||
{
|
||||
}
|
||||
|
||||
static const ymz280b_interface ymz280b_config =
|
||||
{
|
||||
DEVCB_DRIVER_LINE_MEMBER(bfm_swp_state,irqhandler)
|
||||
};
|
||||
|
||||
|
||||
READ32_MEMBER(bfm_swp_state::bfm_swp_mem_r)
|
||||
{
|
||||
@ -223,7 +218,7 @@ static MACHINE_CONFIG_START( bfm_swp, bfm_swp_state )
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, 10000000 )
|
||||
MCFG_SOUND_CONFIG(ymz280b_config)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(bfm_swp_state, irqhandler))
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
@ -153,7 +153,7 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, bishi_state )
|
||||
AM_RANGE(0x840000, 0x840007) AM_DEVWRITE_LEGACY("k056832", k056832_b_word_w) // VSCCS
|
||||
AM_RANGE(0x850000, 0x85001f) AM_DEVWRITE_LEGACY("k054338", k054338_word_w) // CLTC
|
||||
AM_RANGE(0x870000, 0x8700ff) AM_DEVWRITE_LEGACY("k055555", k055555_word_w) // PCU2
|
||||
AM_RANGE(0x880000, 0x880003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0xff00)
|
||||
AM_RANGE(0x880000, 0x880003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0xff00)
|
||||
AM_RANGE(0xa00000, 0xa01fff) AM_DEVREADWRITE_LEGACY("k056832", k056832_ram_word_r, k056832_ram_word_w) // Graphic planes
|
||||
AM_RANGE(0xb00000, 0xb03fff) AM_RAM_WRITE(paletteram_xbgr_word_be_w) AM_SHARE("paletteram")
|
||||
AM_RANGE(0xb04000, 0xb047ff) AM_READ(bishi_mirror_r) // bug in the ram/rom test?
|
||||
@ -363,11 +363,6 @@ WRITE_LINE_MEMBER(bishi_state::sound_irq_gen)
|
||||
m_maincpu->set_input_line(M68K_IRQ_1, (state) ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
static const ymz280b_interface ymz280b_intf =
|
||||
{
|
||||
DEVCB_DRIVER_LINE_MEMBER(bishi_state,sound_irq_gen)
|
||||
};
|
||||
|
||||
|
||||
static const k056832_interface bishi_k056832_intf =
|
||||
{
|
||||
@ -426,7 +421,7 @@ static MACHINE_CONFIG_START( bishi, bishi_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, SOUND_CLOCK) /* 16.9344MHz */
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(bishi_state, sound_irq_gen))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -423,7 +423,7 @@ static const eeprom_interface eeprom_interface_93C46_pacslot =
|
||||
static ADDRESS_MAP_START( dfeveron_map, AS_PROGRAM, 16, cave_state )
|
||||
AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM
|
||||
AM_RANGE(0x100000, 0x10ffff) AM_RAM // RAM
|
||||
AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x00ff) // YMZ280
|
||||
AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // YMZ280
|
||||
/**/AM_RANGE(0x400000, 0x407fff) AM_RAM AM_SHARE("spriteram") // Sprites
|
||||
/**/AM_RANGE(0x408000, 0x40ffff) AM_RAM AM_SHARE("spriteram_2") // Sprites?
|
||||
/**/AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0
|
||||
@ -448,7 +448,7 @@ ADDRESS_MAP_END
|
||||
static ADDRESS_MAP_START( ddonpach_map, AS_PROGRAM, 16, cave_state )
|
||||
AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM
|
||||
AM_RANGE(0x100000, 0x10ffff) AM_RAM // RAM
|
||||
AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x00ff) // YMZ280
|
||||
AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // YMZ280
|
||||
/**/AM_RANGE(0x400000, 0x407fff) AM_RAM AM_SHARE("spriteram") // Sprites
|
||||
/**/AM_RANGE(0x408000, 0x40ffff) AM_RAM AM_SHARE("spriteram_2") // Sprites?
|
||||
/**/AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0
|
||||
@ -524,7 +524,7 @@ ADDRESS_MAP_END
|
||||
static ADDRESS_MAP_START( esprade_map, AS_PROGRAM, 16, cave_state )
|
||||
AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM
|
||||
AM_RANGE(0x100000, 0x10ffff) AM_RAM // RAM
|
||||
AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x00ff) // YMZ280
|
||||
AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // YMZ280
|
||||
/**/AM_RANGE(0x400000, 0x407fff) AM_RAM AM_SHARE("spriteram") // Sprites
|
||||
/**/AM_RANGE(0x408000, 0x40ffff) AM_RAM AM_SHARE("spriteram_2") // Sprites?
|
||||
/**/AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0
|
||||
@ -549,7 +549,7 @@ ADDRESS_MAP_END
|
||||
static ADDRESS_MAP_START( gaia_map, AS_PROGRAM, 16, cave_state )
|
||||
AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM
|
||||
AM_RANGE(0x100000, 0x10ffff) AM_RAM // RAM
|
||||
AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x00ff) // YMZ280
|
||||
AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // YMZ280
|
||||
AM_RANGE(0x400000, 0x407fff) AM_RAM AM_SHARE("spriteram") // Sprite bank 1
|
||||
AM_RANGE(0x408000, 0x40ffff) AM_RAM AM_SHARE("spriteram_2") // Sprite bank 2
|
||||
AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0
|
||||
@ -586,7 +586,7 @@ static ADDRESS_MAP_START( guwange_map, AS_PROGRAM, 16, cave_state )
|
||||
/**/AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0
|
||||
/**/AM_RANGE(0x600000, 0x607fff) AM_RAM_WRITE(cave_vram_1_w) AM_SHARE("vram.1") // Layer 1
|
||||
/**/AM_RANGE(0x700000, 0x707fff) AM_RAM_WRITE(cave_vram_2_w) AM_SHARE("vram.2") // Layer 2
|
||||
AM_RANGE(0x800000, 0x800003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x00ff) // YMZ280
|
||||
AM_RANGE(0x800000, 0x800003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // YMZ280
|
||||
/**/AM_RANGE(0x900000, 0x900005) AM_RAM AM_SHARE("vctrl.0") // Layer 0 Control
|
||||
/**/AM_RANGE(0xa00000, 0xa00005) AM_RAM AM_SHARE("vctrl.1") // Layer 1 Control
|
||||
/**/AM_RANGE(0xb00000, 0xb00005) AM_RAM AM_SHARE("vctrl.2") // Layer 2 Control
|
||||
@ -700,8 +700,8 @@ static ADDRESS_MAP_START( korokoro_map, AS_PROGRAM, 16, cave_state )
|
||||
AM_RANGE(0x1c0000, 0x1c0007) AM_READ(cave_irq_cause_r) // IRQ Cause
|
||||
AM_RANGE(0x1c0000, 0x1c007f) AM_WRITEONLY AM_SHARE("videoregs") // Video Regs
|
||||
AM_RANGE(0x200000, 0x207fff) AM_WRITEONLY AM_SHARE("paletteram") // Palette
|
||||
// AM_RANGE(0x240000, 0x240003) AM_DEVREAD8_LEGACY("ymz", ymz280b_r, 0x00ff) // YMZ280
|
||||
AM_RANGE(0x240000, 0x240003) AM_DEVWRITE8_LEGACY("ymz", ymz280b_w, 0x00ff) // YMZ280
|
||||
// AM_RANGE(0x240000, 0x240003) AM_DEVREAD8("ymz", ymz280b_device, read, 0x00ff) // YMZ280
|
||||
AM_RANGE(0x240000, 0x240003) AM_DEVWRITE8("ymz", ymz280b_device, write, 0x00ff) // YMZ280
|
||||
AM_RANGE(0x280000, 0x280001) AM_READ_PORT("IN0") // Inputs + ???
|
||||
AM_RANGE(0x280002, 0x280003) AM_READ_PORT("IN1") // Inputs + EEPROM
|
||||
AM_RANGE(0x280008, 0x280009) AM_WRITE(korokoro_leds_w) // Leds
|
||||
@ -716,7 +716,7 @@ static ADDRESS_MAP_START( crusherm_map, AS_PROGRAM, 16, cave_state )
|
||||
AM_RANGE(0x140000, 0x140005) AM_WRITEONLY AM_SHARE("vctrl.0") // Layer 0 Control
|
||||
AM_RANGE(0x180000, 0x187fff) AM_WRITEONLY AM_SHARE("spriteram") // Sprites
|
||||
AM_RANGE(0x200000, 0x207fff) AM_WRITEONLY AM_SHARE("paletteram") // Palette
|
||||
AM_RANGE(0x240000, 0x240003) AM_DEVWRITE8_LEGACY("ymz", ymz280b_w, 0x00ff) // YMZ280
|
||||
AM_RANGE(0x240000, 0x240003) AM_DEVWRITE8("ymz", ymz280b_device, write, 0x00ff) // YMZ280
|
||||
AM_RANGE(0x280000, 0x280001) AM_READ_PORT("IN0") // Inputs + ???
|
||||
AM_RANGE(0x280002, 0x280003) AM_READ_PORT("IN1") // Inputs + EEPROM
|
||||
AM_RANGE(0x280008, 0x280009) AM_WRITE(korokoro_leds_w) // Leds
|
||||
@ -991,7 +991,7 @@ ADDRESS_MAP_END
|
||||
static ADDRESS_MAP_START( uopoko_map, AS_PROGRAM, 16, cave_state )
|
||||
AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM
|
||||
AM_RANGE(0x100000, 0x10ffff) AM_RAM // RAM
|
||||
AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x00ff) // YMZ280
|
||||
AM_RANGE(0x300000, 0x300003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // YMZ280
|
||||
/**/AM_RANGE(0x400000, 0x407fff) AM_RAM AM_SHARE("spriteram") // Sprites
|
||||
/**/AM_RANGE(0x408000, 0x40ffff) AM_RAM AM_SHARE("spriteram_2") // Sprites?
|
||||
/**/AM_RANGE(0x500000, 0x507fff) AM_RAM_WRITE(cave_vram_0_w) AM_SHARE("vram.0") // Layer 0
|
||||
@ -1797,11 +1797,6 @@ MACHINE_RESET_MEMBER(cave_state,cave)
|
||||
m_agallet_vblank_irq = 0;
|
||||
}
|
||||
|
||||
static const ymz280b_interface ymz280b_intf =
|
||||
{
|
||||
DEVCB_DRIVER_LINE_MEMBER(cave_state,sound_irq_gen)
|
||||
};
|
||||
|
||||
WRITE_LINE_MEMBER(cave_state::irqhandler)
|
||||
{
|
||||
m_audiocpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE);
|
||||
@ -1852,7 +1847,7 @@ static MACHINE_CONFIG_START( dfeveron, cave_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
@ -1894,7 +1889,7 @@ static MACHINE_CONFIG_START( ddonpach, cave_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
@ -1986,7 +1981,7 @@ static MACHINE_CONFIG_START( esprade, cave_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
@ -2026,7 +2021,7 @@ static MACHINE_CONFIG_START( gaia, cave_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
@ -2067,7 +2062,7 @@ static MACHINE_CONFIG_START( guwange, cave_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
@ -2163,7 +2158,7 @@ static MACHINE_CONFIG_START( korokoro, cave_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
@ -2544,7 +2539,7 @@ static MACHINE_CONFIG_START( uopoko, cave_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(cave_state, sound_irq_gen))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -374,7 +374,7 @@ static ADDRESS_MAP_START( coinmvga_map, AS_PROGRAM, 16, coinmvga_state )
|
||||
|
||||
AM_RANGE(0x600000, 0x600001) AM_WRITE(ramdac_bg_w)
|
||||
AM_RANGE(0x600004, 0x600005) AM_WRITE(ramdac_fg_w)
|
||||
AM_RANGE(0x600008, 0x600009) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0xffff)
|
||||
AM_RANGE(0x600008, 0x600009) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0xffff)
|
||||
AM_RANGE(0x610000, 0x61000f) AM_RAM //touch screen i/o
|
||||
|
||||
AM_RANGE(0x700000, 0x7fffff) AM_ROM AM_REGION("maincpu", 0) // ?
|
||||
@ -655,11 +655,6 @@ GFXDECODE_END
|
||||
* Sound Interface *
|
||||
*************************/
|
||||
|
||||
static const ymz280b_interface ymz280b_intf =
|
||||
{
|
||||
DEVCB_NULL // irq ?
|
||||
};
|
||||
|
||||
INTERRUPT_GEN_MEMBER(coinmvga_state::vblank_irq)
|
||||
{
|
||||
//printf("1\n");
|
||||
@ -698,7 +693,6 @@ static MACHINE_CONFIG_START( coinmvga, coinmvga_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, SND_CLOCK)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -170,7 +170,7 @@ static ADDRESS_MAP_START( wcvol95_map, AS_PROGRAM, 32, deco156_state )
|
||||
AM_RANGE(0x160000, 0x161fff) AM_READWRITE(wcvol95_spriteram_r, wcvol95_spriteram_w)
|
||||
AM_RANGE(0x170000, 0x170003) AM_NOP // Irq ack?
|
||||
AM_RANGE(0x180000, 0x180fff) AM_RAM_WRITE(wcvol95_nonbuffered_palette_w) AM_SHARE("paletteram")
|
||||
AM_RANGE(0x1a0000, 0x1a0007) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x000000ff)
|
||||
AM_RANGE(0x1a0000, 0x1a0007) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x000000ff)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
@ -314,11 +314,6 @@ WRITE_LINE_MEMBER(deco156_state::sound_irq_gen)
|
||||
logerror("sound irq\n");
|
||||
}
|
||||
|
||||
static const ymz280b_interface ymz280b_intf =
|
||||
{
|
||||
DEVCB_DRIVER_LINE_MEMBER(deco156_state,sound_irq_gen)
|
||||
};
|
||||
|
||||
INTERRUPT_GEN_MEMBER(deco156_state::deco32_vbl_interrupt)
|
||||
{
|
||||
device.execute().set_input_line(ARM_IRQ_LINE, HOLD_LINE);
|
||||
@ -421,7 +416,7 @@ static MACHINE_CONFIG_START( wcvol95, deco156_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, 28000000 / 2)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(deco156_state, sound_irq_gen))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -324,7 +324,7 @@ static ADDRESS_MAP_START( decomlc_map, AS_PROGRAM, 32, deco_mlc_state )
|
||||
AM_RANGE(0x0440008, 0x044000b) AM_READ(mlc_440008_r) AM_MIRROR(0xff000000)
|
||||
AM_RANGE(0x044001c, 0x044001f) AM_READWRITE(mlc_44001c_r, mlc_44001c_w) AM_MIRROR(0xff000000)
|
||||
AM_RANGE(0x0500000, 0x0500003) AM_WRITE(avengrs_eprom_w) AM_MIRROR(0xff000000)
|
||||
AM_RANGE(0x0600000, 0x0600007) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0xff000000) AM_MIRROR(0xff000000)
|
||||
AM_RANGE(0x0600000, 0x0600007) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0xff000000) AM_MIRROR(0xff000000)
|
||||
AM_RANGE(0x070f000, 0x070ffff) AM_READWRITE(stadhr96_prot_146_r, stadhr96_prot_146_w) AM_MIRROR(0xff000000)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
@ -1852,7 +1852,7 @@ static ADDRESS_MAP_START( firebeat_map, AS_PROGRAM, 32, firebeat_state )
|
||||
AM_RANGE(0x74000000, 0x740003ff) AM_READWRITE(ppc_spu_share_r, ppc_spu_share_w) // SPU shared RAM
|
||||
AM_RANGE(0x7d000200, 0x7d00021f) AM_READ(cabinet_r)
|
||||
AM_RANGE(0x7d000340, 0x7d000347) AM_READ(sensor_r)
|
||||
AM_RANGE(0x7d000400, 0x7d000403) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0xffff0000)
|
||||
AM_RANGE(0x7d000400, 0x7d000403) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0xffff0000)
|
||||
AM_RANGE(0x7d000800, 0x7d000803) AM_READ(input_r)
|
||||
AM_RANGE(0x7d400000, 0x7d5fffff) AM_READWRITE(flashram_r, flashram_w)
|
||||
AM_RANGE(0x7d800000, 0x7dbfffff) AM_READWRITE(soundflash_r, soundflash_w)
|
||||
@ -1897,12 +1897,6 @@ WRITE_LINE_MEMBER(firebeat_state::sound_irq_callback)
|
||||
{
|
||||
}
|
||||
|
||||
static const ymz280b_interface ymz280b_intf =
|
||||
{
|
||||
DEVCB_DRIVER_LINE_MEMBER(firebeat_state,sound_irq_callback), // irq
|
||||
DEVCB_DRIVER_MEMBER(firebeat_state,soundram_r)
|
||||
};
|
||||
|
||||
static INPUT_PORTS_START(ppp)
|
||||
PORT_START("IN0")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) // Left
|
||||
@ -2095,7 +2089,8 @@ static MACHINE_CONFIG_START( firebeat, firebeat_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, 16934400)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(firebeat_state, sound_irq_callback))
|
||||
MCFG_YMZ280B_EXT_READ_HANDLER(READ8(firebeat_state, soundram_r))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
|
||||
@ -2148,7 +2143,8 @@ static MACHINE_CONFIG_START( firebeat2, firebeat_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, 16934400)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(firebeat_state, sound_irq_callback))
|
||||
MCFG_YMZ280B_EXT_READ_HANDLER(READ8(firebeat_state, soundram_r))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
|
||||
|
@ -493,17 +493,12 @@ static ADDRESS_MAP_START( galpani3_map, AS_PROGRAM, 16, galpani3_state )
|
||||
AM_RANGE(0xf00012, 0xf00013) AM_READ_PORT("P2")
|
||||
AM_RANGE(0xf00014, 0xf00015) AM_READ_PORT("COIN")
|
||||
AM_RANGE(0xf00016, 0xf00017) AM_NOP // ? read, but overwritten
|
||||
AM_RANGE(0xf00020, 0xf00023) AM_DEVWRITE8_LEGACY("ymz", ymz280b_w, 0x00ff) // sound
|
||||
AM_RANGE(0xf00020, 0xf00023) AM_DEVWRITE8("ymz", ymz280b_device, write, 0x00ff) // sound
|
||||
AM_RANGE(0xf00040, 0xf00041) AM_READWRITE(watchdog_reset16_r, watchdog_reset16_w) // watchdog
|
||||
AM_RANGE(0xf00050, 0xf00051) AM_NOP // ? written once (3rd opcode, $30.b)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
static const ymz280b_interface ymz280b_intf =
|
||||
{
|
||||
DEVCB_NULL // irq ?
|
||||
};
|
||||
|
||||
static MACHINE_CONFIG_START( galpani3, galpani3_state )
|
||||
MCFG_CPU_ADD("maincpu", M68000, XTAL_28_63636MHz/2) // Confirmed from PCB
|
||||
MCFG_CPU_PROGRAM_MAP(galpani3_map)
|
||||
@ -540,7 +535,6 @@ static MACHINE_CONFIG_START( galpani3, galpani3_state )
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_33_333MHz / 2) // Confirmed from PCB
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_SOUND_ROUTE(0, "mono", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "mono", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -1292,7 +1292,7 @@ static ADDRESS_MAP_START( io_map, AS_IO, 16, gunpey_state )
|
||||
AM_RANGE(0x7f40, 0x7f45) AM_READ8(gunpey_inputs_r,0xffff)
|
||||
|
||||
AM_RANGE(0x7f48, 0x7f49) AM_WRITE8(gunpey_output_w,0x00ff)
|
||||
AM_RANGE(0x7f80, 0x7f81) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0xffff)
|
||||
AM_RANGE(0x7f80, 0x7f81) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0xffff)
|
||||
|
||||
AM_RANGE(0x7f88, 0x7f89) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff)
|
||||
|
||||
@ -1316,11 +1316,6 @@ WRITE_LINE_MEMBER(gunpey_state::sound_irq_gen)
|
||||
logerror("sound irq\n");
|
||||
}
|
||||
|
||||
static const ymz280b_interface ymz280b_intf =
|
||||
{
|
||||
DEVCB_DRIVER_LINE_MEMBER(gunpey_state,sound_irq_gen)
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************************/
|
||||
|
||||
@ -1474,7 +1469,7 @@ static MACHINE_CONFIG_START( gunpey, gunpey_state )
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.25)
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(gunpey_state, sound_irq_gen))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 0.25)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 0.25)
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -468,7 +468,7 @@ static ADDRESS_MAP_START( jchan_sub, AS_PROGRAM, 16, jchan_state )
|
||||
AM_RANGE(0x700000, 0x703fff) AM_RAM_WRITE(jchan_suprnova_sprite32_2_w) AM_SHARE("spriteram_2")
|
||||
AM_RANGE(0x780000, 0x78003f) AM_RAM_WRITE(jchan_suprnova_sprite32regs_2_w) AM_SHARE("sprregs_2")
|
||||
|
||||
AM_RANGE(0x800000, 0x800003) AM_DEVWRITE8_LEGACY("ymz", ymz280b_w, 0x00ff) // sound
|
||||
AM_RANGE(0x800000, 0x800003) AM_DEVWRITE8("ymz", ymz280b_device, write, 0x00ff) // sound
|
||||
|
||||
AM_RANGE(0xa00000, 0xa00001) AM_READWRITE(watchdog_reset16_r, watchdog_reset16_w) // watchdog
|
||||
ADDRESS_MAP_END
|
||||
@ -577,14 +577,6 @@ static INPUT_PORTS_START( jchan2 )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
/* sound stuff */
|
||||
|
||||
static const ymz280b_interface ymz280b_intf =
|
||||
{
|
||||
DEVCB_NULL // irq ?
|
||||
};
|
||||
|
||||
|
||||
/* machine driver */
|
||||
|
||||
static MACHINE_CONFIG_START( jchan, jchan_state )
|
||||
@ -626,7 +618,6 @@ static MACHINE_CONFIG_START( jchan, jchan_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, 16000000)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -105,11 +105,6 @@ WRITE_LINE_MEMBER(maygayep_state::irqhandler)
|
||||
{
|
||||
}
|
||||
|
||||
static const ymz280b_interface ymz280b_config =
|
||||
{
|
||||
DEVCB_DRIVER_LINE_MEMBER(maygayep_state,irqhandler)
|
||||
};
|
||||
|
||||
|
||||
static MACHINE_CONFIG_START( maygayep, maygayep_state )
|
||||
MCFG_CPU_ADD("maincpu", H83002, 16000000 )
|
||||
@ -118,7 +113,7 @@ static MACHINE_CONFIG_START( maygayep, maygayep_state )
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, 10000000 )
|
||||
MCFG_SOUND_CONFIG(ymz280b_config)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(maygayep_state, irqhandler))
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
@ -288,7 +288,7 @@ static ADDRESS_MAP_START( livequiz_map, AS_PROGRAM, 16, midas_state )
|
||||
AM_RANGE(0xb40000, 0xb40001) AM_READ(ret_ffff )
|
||||
AM_RANGE(0xb60000, 0xb60001) AM_READ(ret_ffff )
|
||||
|
||||
AM_RANGE(0xb80008, 0xb8000b) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x00ff )
|
||||
AM_RANGE(0xb80008, 0xb8000b) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff )
|
||||
|
||||
AM_RANGE(0xba0000, 0xba0001) AM_READ_PORT("START3")
|
||||
AM_RANGE(0xbc0000, 0xbc0001) AM_READ_PORT("PLAYER3")
|
||||
@ -367,7 +367,7 @@ static ADDRESS_MAP_START( hammer_map, AS_PROGRAM, 16, midas_state )
|
||||
AM_RANGE(0xb40000, 0xb40001) AM_READ(ret_ffff )
|
||||
AM_RANGE(0xb60000, 0xb60001) AM_READ(ret_ffff )
|
||||
|
||||
AM_RANGE(0xb80008, 0xb8000b) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x00ff )
|
||||
AM_RANGE(0xb80008, 0xb8000b) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff )
|
||||
|
||||
AM_RANGE(0xba0000, 0xba0001) AM_READ_PORT("IN1")
|
||||
AM_RANGE(0xbc0000, 0xbc0001) AM_READ_PORT("HAMMER")
|
||||
@ -694,11 +694,6 @@ WRITE_LINE_MEMBER(midas_state::livequiz_irqhandler)
|
||||
logerror("YMZ280 is generating an interrupt. State=%08x\n",state);
|
||||
}
|
||||
|
||||
static const ymz280b_interface ymz280b_config =
|
||||
{
|
||||
DEVCB_DRIVER_LINE_MEMBER(midas_state,livequiz_irqhandler)
|
||||
};
|
||||
|
||||
static MACHINE_CONFIG_START( livequiz, midas_state )
|
||||
|
||||
/* basic machine hardware */
|
||||
@ -723,7 +718,7 @@ static MACHINE_CONFIG_START( livequiz, midas_state )
|
||||
/* sound hardware */
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
|
||||
MCFG_SOUND_CONFIG(ymz280b_config)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(midas_state, livequiz_irqhandler))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 0.80)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 0.80)
|
||||
MACHINE_CONFIG_END
|
||||
@ -756,7 +751,7 @@ static MACHINE_CONFIG_START( hammer, midas_state )
|
||||
/* sound hardware */
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
|
||||
MCFG_SOUND_CONFIG(ymz280b_config)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(midas_state, livequiz_irqhandler))
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 0.80)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 0.80)
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -161,7 +161,7 @@ static ADDRESS_MAP_START( base_mem, AS_PROGRAM, 16, realbrk_state )
|
||||
AM_RANGE(0x604000, 0x604fff) AM_RAM_WRITE(realbrk_vram_2_w) AM_SHARE("vram_2") // Text (2)
|
||||
AM_RANGE(0x606000, 0x60600f) AM_RAM_WRITE(realbrk_vregs_w) AM_SHARE("vregs") // Scroll + Video Regs
|
||||
AM_RANGE(0x605000, 0x61ffff) AM_RAM //
|
||||
AM_RANGE(0x800000, 0x800003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0xff00) // YMZ280
|
||||
AM_RANGE(0x800000, 0x800003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0xff00) // YMZ280
|
||||
AM_RANGE(0xfe0000, 0xfeffff) AM_RAM // RAM
|
||||
AM_RANGE(0xfffc00, 0xffffff) AM_READWRITE_LEGACY(tmp68301_regs_r, tmp68301_regs_w) // TMP68301 Registers
|
||||
ADDRESS_MAP_END
|
||||
|
@ -1145,13 +1145,13 @@ static ADDRESS_MAP_START( sys386f2_map, AS_PROGRAM, 32, seibuspi_state )
|
||||
AM_RANGE(0x00000090, 0x00000097) AM_RAM /* Unknown */
|
||||
AM_RANGE(0x00000400, 0x00000403) AM_READNOP AM_WRITE(input_select_w)
|
||||
AM_RANGE(0x00000404, 0x00000407) AM_WRITE(sys386f2_eeprom_w)
|
||||
AM_RANGE(0x00000408, 0x0000040f) AM_DEVWRITE8_LEGACY("ymz", ymz280b_w, 0x000000ff)
|
||||
AM_RANGE(0x00000408, 0x0000040f) AM_DEVWRITE8("ymz", ymz280b_device, write, 0x000000ff)
|
||||
AM_RANGE(0x00000484, 0x00000487) AM_WRITE(palette_dma_start_w)
|
||||
AM_RANGE(0x00000490, 0x00000493) AM_WRITE(video_dma_length_w)
|
||||
AM_RANGE(0x00000494, 0x00000497) AM_WRITE(video_dma_address_w)
|
||||
AM_RANGE(0x00000500, 0x0000054f) AM_RAM /* Unknown */
|
||||
AM_RANGE(0x00000560, 0x00000563) AM_WRITE(sprite_dma_start_w)
|
||||
AM_RANGE(0x00000600, 0x00000607) AM_DEVREAD8_LEGACY("ymz", ymz280b_r, 0x000000ff)
|
||||
AM_RANGE(0x00000600, 0x00000607) AM_DEVREAD8("ymz", ymz280b_device, read, 0x000000ff)
|
||||
AM_RANGE(0x00000608, 0x0000060b) AM_READ(spi_unknown_r)
|
||||
AM_RANGE(0x0000060c, 0x0000060f) AM_READ(spi_controls1_r) /* Player controls */
|
||||
AM_RANGE(0x00000800, 0x0003ffff) AM_RAM AM_SHARE("spimainram")
|
||||
|
@ -521,7 +521,7 @@ ADDRESS_MAP_END
|
||||
static ADDRESS_MAP_START( gegege_io_map, AS_IO, 8, sigmab98_state )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
|
||||
AM_RANGE( 0x00, 0x01 ) AM_DEVWRITE_LEGACY("ymz", ymz280b_w )
|
||||
AM_RANGE( 0x00, 0x01 ) AM_DEVWRITE("ymz", ymz280b_device, write )
|
||||
|
||||
AM_RANGE( 0xa0, 0xa1 ) AM_READWRITE(regs_r, regs_w )
|
||||
// AM_RANGE( 0xa2, 0xa3 )
|
||||
|
@ -685,7 +685,7 @@ static ADDRESS_MAP_START( skns_map, AS_PROGRAM, 32, skns_state )
|
||||
/* In between is write only */
|
||||
AM_RANGE(0x0040000c, 0x0040000f) AM_READ_PORT("40000c")
|
||||
AM_RANGE(0x00800000, 0x00801fff) AM_RAM AM_SHARE("nvram") /* 'backup' RAM */
|
||||
AM_RANGE(0x00c00000, 0x00c00003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0xffff0000) /* ymz280_w (sound) */
|
||||
AM_RANGE(0x00c00000, 0x00c00003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0xffff0000) /* ymz280_w (sound) */
|
||||
AM_RANGE(0x01000000, 0x0100000f) AM_DEVREADWRITE8("rtc", msm6242_device, read, write, 0xffffffff)
|
||||
AM_RANGE(0x01800000, 0x01800003) AM_WRITE(skns_hit2_w)
|
||||
AM_RANGE(0x02000000, 0x02003fff) AM_RAM AM_SHARE("spriteram") /* sprite ram */
|
||||
@ -741,12 +741,6 @@ GFXDECODE_END
|
||||
|
||||
/***** MACHINE DRIVER *****/
|
||||
|
||||
static const ymz280b_interface ymz280b_intf =
|
||||
{
|
||||
DEVCB_NULL // irq ?
|
||||
};
|
||||
|
||||
|
||||
static MSM6242_INTERFACE( rtc_intf )
|
||||
{
|
||||
DEVCB_NULL
|
||||
@ -788,7 +782,6 @@ static MACHINE_CONFIG_START( skns, skns_state )
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, 33333333 / 2)
|
||||
MCFG_SOUND_CONFIG(ymz280b_intf)
|
||||
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
|
||||
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
@ -351,7 +351,7 @@ static ADDRESS_MAP_START( io_map, AS_IO, 8, tecmosys_state )
|
||||
AM_RANGE(0x30, 0x30) AM_WRITE(tecmosys_z80_bank_w)
|
||||
AM_RANGE(0x40, 0x40) AM_READ(soundlatch_byte_r)
|
||||
AM_RANGE(0x50, 0x50) AM_WRITE(soundlatch2_byte_w)
|
||||
AM_RANGE(0x60, 0x61) AM_DEVREADWRITE_LEGACY("ymz", ymz280b_r, ymz280b_w)
|
||||
AM_RANGE(0x60, 0x61) AM_DEVREADWRITE("ymz", ymz280b_device, read, write)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
|
@ -305,7 +305,7 @@ static ADDRESS_MAP_START( tetrisp2_map, AS_PROGRAM, 16, tetrisp2_state )
|
||||
AM_RANGE(0x500000, 0x50ffff) AM_RAM // Line
|
||||
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(tetrisp2_vram_rot_w) AM_SHARE("vram_rot") // Rotation
|
||||
AM_RANGE(0x650000, 0x651fff) AM_RAM_WRITE(tetrisp2_vram_rot_w) // Rotation (mirror)
|
||||
AM_RANGE(0x800000, 0x800003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x00ff) // Sound
|
||||
AM_RANGE(0x800000, 0x800003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // Sound
|
||||
AM_RANGE(0x900000, 0x903fff) AM_READ(tetrisp2_nvram_r) AM_WRITE(tetrisp2_nvram_w) AM_SHARE("nvram") // NVRAM
|
||||
AM_RANGE(0x904000, 0x907fff) AM_READ(tetrisp2_nvram_r) AM_WRITE(tetrisp2_nvram_w) // NVRAM (mirror)
|
||||
AM_RANGE(0xb00000, 0xb00001) AM_WRITE(tetrisp2_coincounter_w) // Coin Counter
|
||||
@ -409,7 +409,7 @@ static ADDRESS_MAP_START( rockn1_map, AS_PROGRAM, 16, tetrisp2_state )
|
||||
AM_RANGE(0x600000, 0x60ffff) AM_RAM_WRITE(tetrisp2_vram_rot_w) AM_SHARE("vram_rot") // Rotation
|
||||
AM_RANGE(0x900000, 0x903fff) AM_READ(rockn_nvram_r) AM_WRITE(tetrisp2_nvram_w) AM_SHARE("nvram") // NVRAM
|
||||
AM_RANGE(0xa30000, 0xa30001) AM_READWRITE(rockn_soundvolume_r, rockn_soundvolume_w) // Sound Volume
|
||||
AM_RANGE(0xa40000, 0xa40003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x00ff) // Sound
|
||||
AM_RANGE(0xa40000, 0xa40003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // Sound
|
||||
AM_RANGE(0xa44000, 0xa44001) AM_READWRITE(rockn_adpcmbank_r, rockn_adpcmbank_w) // Sound Bank
|
||||
AM_RANGE(0xa48000, 0xa48001) AM_NOP // YMZ280 Reset
|
||||
AM_RANGE(0xb00000, 0xb00001) AM_WRITE(tetrisp2_coincounter_w) // Coin Counter
|
||||
@ -443,7 +443,7 @@ static ADDRESS_MAP_START( rockn2_map, AS_PROGRAM, 16, tetrisp2_state )
|
||||
AM_RANGE(0x808000, 0x809fff) AM_RAM // ???
|
||||
AM_RANGE(0x900000, 0x903fff) AM_READ(rockn_nvram_r) AM_WRITE(tetrisp2_nvram_w) AM_SHARE("nvram") // NVRAM
|
||||
AM_RANGE(0xa30000, 0xa30001) AM_READWRITE(rockn_soundvolume_r, rockn_soundvolume_w) // Sound Volume
|
||||
AM_RANGE(0xa40000, 0xa40003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x00ff) // Sound
|
||||
AM_RANGE(0xa40000, 0xa40003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // Sound
|
||||
AM_RANGE(0xa44000, 0xa44001) AM_READWRITE(rockn_adpcmbank_r, rockn2_adpcmbank_w) // Sound Bank
|
||||
AM_RANGE(0xa48000, 0xa48001) AM_WRITENOP // YMZ280 Reset
|
||||
AM_RANGE(0xb00000, 0xb00001) AM_WRITE(tetrisp2_coincounter_w) // Coin Counter
|
||||
@ -477,7 +477,7 @@ static ADDRESS_MAP_START( rocknms_main_map, AS_PROGRAM, 16, tetrisp2_state )
|
||||
// AM_RANGE(0x808000, 0x809fff) AM_RAM // ???
|
||||
AM_RANGE(0x900000, 0x903fff) AM_READ(rockn_nvram_r) AM_WRITE(tetrisp2_nvram_w) AM_SHARE("nvram") // NVRAM
|
||||
AM_RANGE(0xa30000, 0xa30001) AM_READWRITE(rockn_soundvolume_r, rockn_soundvolume_w) // Sound Volume
|
||||
AM_RANGE(0xa40000, 0xa40003) AM_DEVREADWRITE8_LEGACY("ymz", ymz280b_r, ymz280b_w, 0x00ff) // Sound
|
||||
AM_RANGE(0xa40000, 0xa40003) AM_DEVREADWRITE8("ymz", ymz280b_device, read, write, 0x00ff) // Sound
|
||||
AM_RANGE(0xa44000, 0xa44001) AM_READWRITE(rockn_adpcmbank_r, rockn_adpcmbank_w) // Sound Bank
|
||||
AM_RANGE(0xa48000, 0xa48001) AM_WRITENOP // YMZ280 Reset
|
||||
AM_RANGE(0xa00000, 0xa00001) AM_WRITE(rocknms_main2sub_w) // MAIN -> SUB Communication
|
||||
@ -512,7 +512,7 @@ static ADDRESS_MAP_START( rocknms_sub_map, AS_PROGRAM, 16, tetrisp2_state )
|
||||
// AM_RANGE(0x808000, 0x809fff) AM_RAM // ???
|
||||
AM_RANGE(0x900000, 0x907fff) AM_RAM // NVRAM
|
||||
AM_RANGE(0xa30000, 0xa30001) AM_WRITE(rockn_soundvolume_w) // Sound Volume
|
||||
AM_RANGE(0xa40000, 0xa40003) AM_DEVWRITE8_LEGACY("ymz", ymz280b_w, 0x00ff) // Sound
|
||||
AM_RANGE(0xa40000, 0xa40003) AM_DEVWRITE8("ymz", ymz280b_device, write, 0x00ff) // Sound
|
||||
AM_RANGE(0xa44000, 0xa44001) AM_WRITE(rockn_adpcmbank_w) // Sound Bank
|
||||
AM_RANGE(0xa48000, 0xa48001) AM_WRITENOP // YMZ280 Reset
|
||||
AM_RANGE(0xb00000, 0xb00001) AM_WRITE(rocknms_sub2main_w) // MAIN <- SUB Communication
|
||||
@ -618,7 +618,7 @@ static ADDRESS_MAP_START( stepstag_map, AS_PROGRAM, 16, stepstag_state )
|
||||
// AM_RANGE(0xa48000, 0xa48001) AM_WRITENOP // PC?
|
||||
// AM_RANGE(0xa4c000, 0xa4c001) AM_WRITENOP // PC?
|
||||
AM_RANGE(0xa50000, 0xa50001) AM_READWRITE( soundlatch_word_r, stepstag_soundlatch_word_w )
|
||||
AM_RANGE(0xa60000, 0xa60003) AM_DEVWRITE8_LEGACY("ymz", ymz280b_w, 0x00ff) // Sound
|
||||
AM_RANGE(0xa60000, 0xa60003) AM_DEVWRITE8("ymz", ymz280b_device, write, 0x00ff) // Sound
|
||||
|
||||
AM_RANGE(0xb00000, 0xb00001) AM_WRITENOP // Coin Counter plus other things
|
||||
AM_RANGE(0xb20000, 0xb20001) AM_WRITENOP // protection related?
|
||||
|
@ -1431,7 +1431,7 @@ static ADDRESS_MAP_START( bbakraid_sound_z80_port, AS_IO, 8, toaplan2_state )
|
||||
AM_RANGE(0x46, 0x46) AM_WRITE(batrider_clear_nmi_w)
|
||||
AM_RANGE(0x48, 0x48) AM_READ(soundlatch_byte_r)
|
||||
AM_RANGE(0x4a, 0x4a) AM_READ(soundlatch2_byte_r)
|
||||
AM_RANGE(0x80, 0x81) AM_DEVREADWRITE_LEGACY("ymz", ymz280b_r, ymz280b_w)
|
||||
AM_RANGE(0x80, 0x81) AM_DEVREADWRITE("ymz", ymz280b_device, read, write)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
|
||||
@ -2984,11 +2984,6 @@ WRITE_LINE_MEMBER(toaplan2_state::bbakraid_irqhandler)
|
||||
logerror("YMZ280 is generating an interrupt. State=%08x\n",state);
|
||||
}
|
||||
|
||||
static const ymz280b_interface ymz280b_config =
|
||||
{
|
||||
DEVCB_DRIVER_LINE_MEMBER(toaplan2_state,bbakraid_irqhandler)
|
||||
};
|
||||
|
||||
|
||||
static MACHINE_CONFIG_START( tekipaki, toaplan2_state )
|
||||
|
||||
@ -3845,7 +3840,7 @@ static MACHINE_CONFIG_START( bbakraid, toaplan2_state )
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
||||
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz)
|
||||
MCFG_SOUND_CONFIG(ymz280b_config)
|
||||
MCFG_YMZ280B_IRQ_HANDLER(WRITELINE(toaplan2_state, bbakraid_irqhandler))
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
@ -2511,7 +2511,7 @@ ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( cbaj_z80_port_map, AS_IO, 8, zn_state )
|
||||
ADDRESS_MAP_GLOBAL_MASK(0xff)
|
||||
AM_RANGE( 0x84, 0x85 ) AM_DEVREADWRITE_LEGACY("ymz", ymz280b_r, ymz280b_w )
|
||||
AM_RANGE( 0x84, 0x85 ) AM_DEVREADWRITE("ymz", ymz280b_device, read, write )
|
||||
AM_RANGE( 0x90, 0x90 ) AM_READWRITE(cbaj_z80_latch_r, cbaj_z80_latch_w )
|
||||
AM_RANGE( 0x91, 0x91 ) AM_READ(cbaj_z80_ready_r )
|
||||
ADDRESS_MAP_END
|
||||
|
Loading…
Reference in New Issue
Block a user