modernised YMZ280B [smf]

This commit is contained in:
smf- 2013-05-10 14:02:35 +00:00
parent 605a9d3728
commit 27c8cc66a4
25 changed files with 320 additions and 467 deletions

View File

@ -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");
}

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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")

View File

@ -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 )

View File

@ -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

View File

@ -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

View File

@ -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?

View File

@ -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

View File

@ -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