diff --git a/src/emu/sound/ymz280b.c b/src/emu/sound/ymz280b.c index 1cc26115d29..d74001596e9 100644 --- a/src/emu/sound/ymz280b.c +++ b/src/emu/sound/ymz280b.c @@ -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(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(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"); -} diff --git a/src/emu/sound/ymz280b.h b/src/emu/sound/ymz280b.h index de672acabb1..b01cad49a69 100644 --- a/src/emu/sound/ymz280b.h +++ b/src/emu/sound/ymz280b.h @@ -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 static devcb2_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } + template static devcb2_base &set_ext_read_handler(device_t &device, _Object object) { return downcast(device).m_ext_read_handler.set_callback(object); } + template static devcb2_base &set_ext_write_handler(device_t &device, _Object object) { return downcast(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; diff --git a/src/mame/drivers/backfire.c b/src/mame/drivers/backfire.c index 2060d0d502f..afcb68cc89c 100644 --- a/src/mame/drivers/backfire.c +++ b/src/mame/drivers/backfire.c @@ -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 diff --git a/src/mame/drivers/bfm_sc4h.c b/src/mame/drivers/bfm_sc4h.c index 534f3d346eb..7b08a7192ae 100644 --- a/src/mame/drivers/bfm_sc4h.c +++ b/src/mame/drivers/bfm_sc4h.c @@ -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 diff --git a/src/mame/drivers/bfm_sc5.c b/src/mame/drivers/bfm_sc5.c index e9eb758f8b0..99942dd7409 100644 --- a/src/mame/drivers/bfm_sc5.c +++ b/src/mame/drivers/bfm_sc5.c @@ -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 diff --git a/src/mame/drivers/bfm_swp.c b/src/mame/drivers/bfm_swp.c index c2c90be68a4..df1a2c850b5 100644 --- a/src/mame/drivers/bfm_swp.c +++ b/src/mame/drivers/bfm_swp.c @@ -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 diff --git a/src/mame/drivers/bishi.c b/src/mame/drivers/bishi.c index 7246015fe33..45df42c19fb 100644 --- a/src/mame/drivers/bishi.c +++ b/src/mame/drivers/bishi.c @@ -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 diff --git a/src/mame/drivers/cave.c b/src/mame/drivers/cave.c index 7f79ff8854b..c14876a7352 100644 --- a/src/mame/drivers/cave.c +++ b/src/mame/drivers/cave.c @@ -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 diff --git a/src/mame/drivers/coinmvga.c b/src/mame/drivers/coinmvga.c index 78964a702e6..e0304c51d92 100644 --- a/src/mame/drivers/coinmvga.c +++ b/src/mame/drivers/coinmvga.c @@ -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 diff --git a/src/mame/drivers/deco156.c b/src/mame/drivers/deco156.c index 400da4ea2c2..2c9de6c69e7 100644 --- a/src/mame/drivers/deco156.c +++ b/src/mame/drivers/deco156.c @@ -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 diff --git a/src/mame/drivers/deco_mlc.c b/src/mame/drivers/deco_mlc.c index ddcc10e1cef..43f72db7854 100644 --- a/src/mame/drivers/deco_mlc.c +++ b/src/mame/drivers/deco_mlc.c @@ -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 diff --git a/src/mame/drivers/firebeat.c b/src/mame/drivers/firebeat.c index 162f34a81bb..c66e976929c 100644 --- a/src/mame/drivers/firebeat.c +++ b/src/mame/drivers/firebeat.c @@ -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) diff --git a/src/mame/drivers/galpani3.c b/src/mame/drivers/galpani3.c index 80c9707cfd8..3fb5d787b26 100644 --- a/src/mame/drivers/galpani3.c +++ b/src/mame/drivers/galpani3.c @@ -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 diff --git a/src/mame/drivers/gunpey.c b/src/mame/drivers/gunpey.c index 7f2b6633728..03754839371 100644 --- a/src/mame/drivers/gunpey.c +++ b/src/mame/drivers/gunpey.c @@ -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 diff --git a/src/mame/drivers/jchan.c b/src/mame/drivers/jchan.c index 4feb882a50b..7922a8172a3 100644 --- a/src/mame/drivers/jchan.c +++ b/src/mame/drivers/jchan.c @@ -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 diff --git a/src/mame/drivers/maygayep.c b/src/mame/drivers/maygayep.c index fe53e405a14..30d00ce77cd 100644 --- a/src/mame/drivers/maygayep.c +++ b/src/mame/drivers/maygayep.c @@ -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 diff --git a/src/mame/drivers/midas.c b/src/mame/drivers/midas.c index a63bbbef9cb..18136b1ef42 100644 --- a/src/mame/drivers/midas.c +++ b/src/mame/drivers/midas.c @@ -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 diff --git a/src/mame/drivers/realbrk.c b/src/mame/drivers/realbrk.c index f6693fe1856..7ff53a04b25 100644 --- a/src/mame/drivers/realbrk.c +++ b/src/mame/drivers/realbrk.c @@ -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 diff --git a/src/mame/drivers/seibuspi.c b/src/mame/drivers/seibuspi.c index 54dabc7dc70..a78dd73c2a0 100644 --- a/src/mame/drivers/seibuspi.c +++ b/src/mame/drivers/seibuspi.c @@ -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") diff --git a/src/mame/drivers/sigmab98.c b/src/mame/drivers/sigmab98.c index 32facc430d0..b05a5f798b6 100644 --- a/src/mame/drivers/sigmab98.c +++ b/src/mame/drivers/sigmab98.c @@ -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 ) diff --git a/src/mame/drivers/suprnova.c b/src/mame/drivers/suprnova.c index 53d5025bc3e..ceb67202840 100644 --- a/src/mame/drivers/suprnova.c +++ b/src/mame/drivers/suprnova.c @@ -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 diff --git a/src/mame/drivers/tecmosys.c b/src/mame/drivers/tecmosys.c index 460aa93483e..5911797d7dc 100644 --- a/src/mame/drivers/tecmosys.c +++ b/src/mame/drivers/tecmosys.c @@ -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 diff --git a/src/mame/drivers/tetrisp2.c b/src/mame/drivers/tetrisp2.c index eef9075ae6f..e9d7346f878 100644 --- a/src/mame/drivers/tetrisp2.c +++ b/src/mame/drivers/tetrisp2.c @@ -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? diff --git a/src/mame/drivers/toaplan2.c b/src/mame/drivers/toaplan2.c index 7c70fc2258c..9e6ac7c298b 100644 --- a/src/mame/drivers/toaplan2.c +++ b/src/mame/drivers/toaplan2.c @@ -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 diff --git a/src/mame/drivers/zn.c b/src/mame/drivers/zn.c index 9b8f2be2dff..c427801972d 100644 --- a/src/mame/drivers/zn.c +++ b/src/mame/drivers/zn.c @@ -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