diff --git a/scripts/src/sound.lua b/scripts/src/sound.lua index 30d049c72e1..ba2e689a820 100644 --- a/scripts/src/sound.lua +++ b/scripts/src/sound.lua @@ -1367,7 +1367,7 @@ end --------------------------------------------------- -- PCD3311 ---@src/devices/sound/gb.h,SOUNDS["PCD3311"] = true +--@src/devices/sound/pcd3311.h,SOUNDS["PCD3311"] = true --------------------------------------------------- if (SOUNDS["PCD3311"]~=null) then diff --git a/scripts/target/mame/virtual.lua b/scripts/target/mame/virtual.lua index 5bec4adb607..7cc49adb149 100644 --- a/scripts/target/mame/virtual.lua +++ b/scripts/target/mame/virtual.lua @@ -13,12 +13,18 @@ -- specify available CPU cores -------------------------------------------------- +CPUS["M6502"] = true -------------------------------------------------- -- specify available sound cores; some of these are -- only for MAME and so aren't included -------------------------------------------------- +SOUNDS["GB_SOUND"] = true +SOUNDS["AY8910"] = true +SOUNDS["YM2203"] = true +SOUNDS["YM3526"] = true +SOUNDS["NES_APU"] = true -------------------------------------------------- -- specify available video cores diff --git a/src/devices/cpu/m6502/n2a03.cpp b/src/devices/cpu/m6502/n2a03.cpp index 36d50261f3f..0f58f837f00 100644 --- a/src/devices/cpu/m6502/n2a03.cpp +++ b/src/devices/cpu/m6502/n2a03.cpp @@ -116,6 +116,11 @@ void n2a03_device::mi_2a03_nd::write(UINT16 adr, UINT8 val) program->write_byte(adr, val); } +void n2a03_device::device_clock_changed() +{ + m_apu->set_unscaled_clock(clock()); +} + const address_space_config *n2a03_device::memory_space_config(address_spacenum spacenum) const { switch(spacenum) diff --git a/src/devices/cpu/m6502/n2a03.h b/src/devices/cpu/m6502/n2a03.h index 266449bea36..57c8f6b43cd 100644 --- a/src/devices/cpu/m6502/n2a03.h +++ b/src/devices/cpu/m6502/n2a03.h @@ -25,6 +25,7 @@ public: virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override; virtual void do_exec_full() override; virtual void do_exec_partial() override; + virtual void device_clock_changed() override; READ8_MEMBER(psg1_4014_r); READ8_MEMBER(psg1_4015_r); diff --git a/src/devices/sound/2203intf.cpp b/src/devices/sound/2203intf.cpp index 8b1bada64ec..7fb9cf12609 100644 --- a/src/devices/sound/2203intf.cpp +++ b/src/devices/sound/2203intf.cpp @@ -121,8 +121,6 @@ void ym2203_device::device_start() { ay8910_device::device_start(); - int rate = clock()/72; /* ??? */ - m_irq_handler.resolve(); /* Timer Handler set */ @@ -130,13 +128,30 @@ void ym2203_device::device_start() m_timer[1] = timer_alloc(1); /* stream system initialize */ - m_stream = machine().sound().stream_alloc(*this,0,1,rate, stream_update_delegate(FUNC(ym2203_device::stream_generate),this)); + calculate_rates(); /* Initialize FM emurator */ + int rate = clock()/72; /* ??? */ m_chip = ym2203_init(this,this,clock(),rate,timer_handler,IRQHandler,&psgintf); assert_always(m_chip != nullptr, "Error creating YM2203 chip"); } +void ym2203_device::device_clock_changed() +{ + calculate_rates(); + ym2203_clock_changed(m_chip, clock(), clock() / 72); +} + +void ym2203_device::calculate_rates() +{ + int rate = clock()/72; /* ??? */ + + if (m_stream != nullptr) + m_stream->set_sample_rate(rate); + else + m_stream = machine().sound().stream_alloc(*this,0,1,rate, stream_update_delegate(FUNC(ym2203_device::stream_generate),this)); +} + //------------------------------------------------- // device_stop - device-specific stop //------------------------------------------------- diff --git a/src/devices/sound/2203intf.h b/src/devices/sound/2203intf.h index d9c44c2f7c7..973c824155f 100644 --- a/src/devices/sound/2203intf.h +++ b/src/devices/sound/2203intf.h @@ -39,10 +39,14 @@ protected: virtual void device_post_load() override; virtual void device_stop() override; virtual void device_reset() override; + virtual void device_clock_changed() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; void stream_generate(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); + private: + void calculate_rates(); + // internal state sound_stream * m_stream; emu_timer * m_timer[2]; diff --git a/src/devices/sound/3526intf.cpp b/src/devices/sound/3526intf.cpp index 81ae14881f5..b91c8e76498 100644 --- a/src/devices/sound/3526intf.cpp +++ b/src/devices/sound/3526intf.cpp @@ -107,7 +107,6 @@ void ym3526_device::device_start() m_chip = ym3526_init(this,clock(),rate); assert_always(m_chip != nullptr, "Error creating YM3526 chip"); - m_stream = machine().sound().stream_alloc(*this,0,1,rate); /* YM3526 setup */ ym3526_set_timer_handler (m_chip, timer_handler, this); ym3526_set_irq_handler (m_chip, IRQHandler, this); @@ -117,6 +116,22 @@ void ym3526_device::device_start() m_timer[1] = timer_alloc(1); } +void ym3526_device::device_clock_changed() +{ + calculate_rates(); + ym3526_clock_changed(m_chip, clock(), clock() / 72); +} + +void ym3526_device::calculate_rates() +{ + int rate = clock()/72; /* ??? */ + + if (m_stream != nullptr) + m_stream->set_sample_rate(rate); + else + m_stream = machine().sound().stream_alloc(*this,0,1,rate); +} + //------------------------------------------------- // device_stop - device-specific stop //------------------------------------------------- diff --git a/src/devices/sound/3526intf.h b/src/devices/sound/3526intf.h index 20ef0876292..038c6e5d261 100644 --- a/src/devices/sound/3526intf.h +++ b/src/devices/sound/3526intf.h @@ -37,6 +37,7 @@ protected: virtual void device_start() override; virtual void device_stop() override; virtual void device_reset() override; + virtual void device_clock_changed() override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; @@ -44,6 +45,8 @@ protected: virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; private: + void calculate_rates(); + // internal state sound_stream * m_stream; emu_timer * m_timer[2]; diff --git a/src/devices/sound/ay8910.cpp b/src/devices/sound/ay8910.cpp index b1afec02d29..4ff6ded98e7 100644 --- a/src/devices/sound/ay8910.cpp +++ b/src/devices/sound/ay8910.cpp @@ -1201,6 +1201,29 @@ ay8910_device::ay8910_device(const machine_config &mconfig, device_type type, co memset(&m_env_table,0,sizeof(m_env_table)); memset(&m_vol3d_table,0,sizeof(m_vol3d_table)); m_res_load[0] = m_res_load[1] = m_res_load[2] = 1000; //Default values for resistor loads + + set_type(psg_type); +} + +void ay8910_device::set_type(psg_type_t psg_type) +{ + m_type = psg_type; + if (psg_type == PSG_TYPE_AY) + { + m_env_step_mask = 0x0f; + m_step = 2; + m_zero_is_off = 1; + m_par = &ay8910_param; + m_par_env = &ay8910_param; + } + else + { + m_env_step_mask = 0x1f; + m_step = 1; + m_zero_is_off = 0; + m_par = &ym2149_param; + m_par_env = &ym2149_param_env; + } } const device_type AY8912 = &device_creator; diff --git a/src/devices/sound/ay8910.h b/src/devices/sound/ay8910.h index 6fda797d679..4ce77d8008c 100644 --- a/src/devices/sound/ay8910.h +++ b/src/devices/sound/ay8910.h @@ -106,6 +106,7 @@ public: // static configuration helpers static void set_flags(device_t &device, int flags) { downcast(device).m_flags = flags; } + static void set_psg_type(device_t &device, psg_type_t psg_type) { downcast(device).set_type(psg_type); } static void set_resistors_load(device_t &device, int res_load0, int res_load1, int res_load2) { downcast(device).m_res_load[0] = res_load0; downcast(device).m_res_load[1] = res_load1; downcast(device).m_res_load[2] = res_load2; } template static devcb_base &set_port_a_read_callback(device_t &device, _Object object) { return downcast(device).m_port_a_read_cb.set_callback(object); } template static devcb_base &set_port_b_read_callback(device_t &device, _Object object) { return downcast(device).m_port_b_read_cb.set_callback(object); } @@ -158,6 +159,7 @@ protected: private: // internal helpers + void set_type(psg_type_t psg_type); inline UINT16 mix_3D(); void ay8910_write_reg(int r, int v); void build_mixer_table(); diff --git a/src/devices/sound/fm.cpp b/src/devices/sound/fm.cpp index cc21baa300c..b2a8eeea8b2 100644 --- a/src/devices/sound/fm.cpp +++ b/src/devices/sound/fm.cpp @@ -2288,6 +2288,14 @@ void * ym2203_init(void *param, device_t *device, int clock, int rate, return F2203; } +void ym2203_clock_changed(void *chip, int clock, int rate) +{ + YM2203 *FM2203 = (YM2203 *)chip; + + FM2203->OPN.ST.clock = clock; + FM2203->OPN.ST.rate = rate; +} + /* shut down emulator */ void ym2203_shutdown(void *chip) { diff --git a/src/devices/sound/fm.h b/src/devices/sound/fm.h index 11b76eff45b..8615e83044b 100644 --- a/src/devices/sound/fm.h +++ b/src/devices/sound/fm.h @@ -112,6 +112,11 @@ typedef void (*FM_IRQHANDLER)(void *param,int irq); void * ym2203_init(void *param, device_t *device, int baseclock, int rate, FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg); +/* +** YM2203 clock changed notifier +*/ +void ym2203_clock_changed(void *chip, int clock, int rate); + /* ** shutdown the YM2203 emulators */ diff --git a/src/devices/sound/fmopl.cpp b/src/devices/sound/fmopl.cpp index c151fcfea91..de8182bd171 100644 --- a/src/devices/sound/fmopl.cpp +++ b/src/devices/sound/fmopl.cpp @@ -1961,6 +1961,15 @@ static void OPL_save_state(FM_OPL *OPL, device_t *device) device->machine().save().register_postload(save_prepost_delegate(FUNC(OPL_postload), OPL)); } +static void OPL_clock_changed(FM_OPL *OPL, UINT32 clock, UINT32 rate) +{ + OPL->clock = clock; + OPL->rate = rate; + + /* init global tables */ + OPL_initalize(OPL); +} + /* Create one of virtual YM3812/YM3526/Y8950 */ /* 'clock' is chip clock in Hz */ @@ -1997,11 +2006,7 @@ static FM_OPL *OPLCreate(device_t *device, UINT32 clock, UINT32 rate, int type) OPL->device = device; OPL->type = type; - OPL->clock = clock; - OPL->rate = rate; - - /* init global tables */ - OPL_initalize(OPL); + OPL_clock_changed(OPL, clock, rate); return OPL; } @@ -2281,6 +2286,11 @@ void ym3812_update_one(void *chip, OPLSAMPLE *buffer, int length) #if (BUILD_YM3526) +void ym3526_clock_changed(void *opl, UINT32 clock, UINT32 rate) +{ + OPL_clock_changed((FM_OPL *)opl, clock, rate); +} + void *ym3526_init(device_t *device, UINT32 clock, UINT32 rate) { /* emulator create */ diff --git a/src/devices/sound/fmopl.h b/src/devices/sound/fmopl.h index 1769cf57789..51becf4e370 100644 --- a/src/devices/sound/fmopl.h +++ b/src/devices/sound/fmopl.h @@ -68,6 +68,7 @@ void ym3812_set_update_handler(void *chip, OPL_UPDATEHANDLER UpdateHandler, void ** 'rate' is sampling rate */ void *ym3526_init(device_t *device, UINT32 clock, UINT32 rate); +void ym3526_clock_changed(void *opl, UINT32 clock, UINT32 rate); /* shutdown the YM3526 emulators*/ void ym3526_shutdown(void *chip); void ym3526_reset_chip(void *chip); diff --git a/src/devices/sound/k053260.cpp b/src/devices/sound/k053260.cpp index 01d70d0f676..a361fe1b8af 100644 --- a/src/devices/sound/k053260.cpp +++ b/src/devices/sound/k053260.cpp @@ -74,12 +74,12 @@ const device_type K053260 = &device_creator; //------------------------------------------------- k053260_device::k053260_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, K053260, "K053260 KDSC", tag, owner, clock, "k053260", __FILE__), - device_sound_interface(mconfig, *this), - m_stream(nullptr), - m_rom(*this, DEVICE_SELF), - m_keyon(0), - m_mode(0) + : device_t(mconfig, K053260, "K053260 KDSC", tag, owner, clock, "k053260", __FILE__) + , device_sound_interface(mconfig, *this) + , device_rom_interface(mconfig, *this, 21) + , m_stream(nullptr) + , m_keyon(0) + , m_mode(0) { memset(m_portdata, 0, sizeof(m_portdata)); } @@ -375,22 +375,12 @@ void k053260_device::KDSC_Voice::update_pan_volume() void k053260_device::KDSC_Voice::key_on() { - if (m_start >= m_device->m_rom.bytes()) - m_device->logerror("K053260: Attempting to start playing past the end of the ROM ( start = %06x, length = %06x )\n", m_start, m_length); - - else if (m_start + m_length >= m_device->m_rom.bytes()) - m_device->logerror("K053260: Attempting to play past the end of the ROM ( start = %06x, length = %06x )\n", - m_start, m_length); - - else - { - m_position = m_kadpcm ? 1 : 0; // for kadpcm low bit is nybble offset, so must start at 1 due to preincrement - m_counter = 0x1000 - CLOCKS_PER_SAMPLE; // force update on next sound_stream_update - m_output = 0; - m_playing = true; - if (LOG) m_device->logerror("K053260: start = %06x, length = %06x, pitch = %04x, vol = %02x, loop = %s, %s\n", - m_start, m_length, m_pitch, m_volume, m_loop ? "yes" : "no", m_kadpcm ? "KADPCM" : "PCM" ); - } + m_position = m_kadpcm ? 1 : 0; // for kadpcm low bit is nybble offset, so must start at 1 due to preincrement + m_counter = 0x1000 - CLOCKS_PER_SAMPLE; // force update on next sound_stream_update + m_output = 0; + m_playing = true; + if (LOG) m_device->logerror("K053260: start = %06x, length = %06x, pitch = %04x, vol = %02x, loop = %s, %s\n", + m_start, m_length, m_pitch, m_volume, m_loop ? "yes" : "no", m_kadpcm ? "KADPCM" : "PCM" ); } void k053260_device::KDSC_Voice::key_off() @@ -432,7 +422,7 @@ void k053260_device::KDSC_Voice::play(stream_sample_t *outputs) } } - UINT8 romdata = m_device->m_rom[m_start + bytepos]; + UINT8 romdata = m_device->read_byte(m_start + bytepos); if (m_kadpcm) { @@ -456,12 +446,5 @@ UINT8 k053260_device::KDSC_Voice::read_rom() m_position = (m_position + 1) & 0xffff; - if (offs >= m_device->m_rom.bytes()) - { - m_device->logerror("%s: K053260: Attempting to read past the end of the ROM (offs = %06x, size = %06x)\n", - m_device->machine().describe_context(), offs, m_device->m_rom.bytes()); - return 0; - } - - return m_device->m_rom[offs]; + return m_device->read_byte(offs); } diff --git a/src/devices/sound/k053260.h b/src/devices/sound/k053260.h index e80a2da87d7..18b5c9f25a7 100644 --- a/src/devices/sound/k053260.h +++ b/src/devices/sound/k053260.h @@ -32,14 +32,13 @@ // ======================> k053260_device class k053260_device : public device_t, - public device_sound_interface + public device_sound_interface, + public device_rom_interface { public: k053260_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); ~k053260_device() { } - static void set_region_tag(device_t &device, const char *tag) { downcast(device).m_rom.set_tag(tag); } - DECLARE_READ8_MEMBER( main_read ); DECLARE_WRITE8_MEMBER( main_write ); DECLARE_READ8_MEMBER( read ); @@ -56,7 +55,6 @@ protected: private: // configuration sound_stream * m_stream; - required_region_ptr m_rom; // live state UINT8 m_portdata[4]; diff --git a/src/devices/sound/multipcm.cpp b/src/devices/sound/multipcm.cpp index 60583bf04dc..28bc6862250 100644 --- a/src/devices/sound/multipcm.cpp +++ b/src/devices/sound/multipcm.cpp @@ -149,20 +149,20 @@ void multipcm_device::envelope_generator_calc(slot_t *slot) } INT32 rate; - if (slot->m_sample->m_key_rate_scale != 0xf) + if (slot->m_sample->key_rate_scale() != 0xf) { - rate = (octave + slot->m_sample->m_key_rate_scale) * 2 + ((slot->m_regs[3] >> 3) & 1); + rate = (octave + slot->m_sample->key_rate_scale()) * 2 + ((slot->m_regs[3] >> 3) & 1); } else { rate = 0; } - slot->m_envelope_gen.m_attack_rate = get_rate(m_attack_step, rate, slot->m_sample->m_attack_reg); - slot->m_envelope_gen.m_decay1_rate = get_rate(m_decay_release_step, rate, slot->m_sample->m_decay1_reg); - slot->m_envelope_gen.m_decay2_rate = get_rate(m_decay_release_step, rate, slot->m_sample->m_decay2_reg); - slot->m_envelope_gen.m_release_rate = get_rate(m_decay_release_step, rate, slot->m_sample->m_release_reg); - slot->m_envelope_gen.m_decay_level = 0xf - slot->m_sample->m_decay_level; + slot->m_envelope_gen.m_attack_rate = get_rate(m_attack_step, rate, slot->m_sample->attack_reg()); + slot->m_envelope_gen.m_decay1_rate = get_rate(m_decay_release_step, rate, slot->m_sample->decay1_reg()); + slot->m_envelope_gen.m_decay2_rate = get_rate(m_decay_release_step, rate, slot->m_sample->decay2_reg()); + slot->m_envelope_gen.m_release_rate = get_rate(m_decay_release_step, rate, slot->m_sample->release_reg()); + slot->m_envelope_gen.m_decay_level = 0xf - slot->m_sample->decay_level(); } @@ -316,9 +316,9 @@ void multipcm_device::write_slot(slot_t *slot, INT32 reg, UINT8 data) { //according to YMF278 sample write causes some base params written to the regs (envelope+lfos) //the game should never change the sample while playing. - sample_t *sample = m_samples + slot->m_regs[1]; - write_slot(slot, 6, sample->m_lfo_vibrato_reg); - write_slot(slot, 7, sample->m_lfo_amplitude_reg); + sample_t &sample = m_samples[slot->m_regs[1]]; + write_slot(slot, 6, sample.lfo_vibrato_reg()); + write_slot(slot, 7, sample.lfo_amplitude_reg()); break; } case 2: //Pitch @@ -341,9 +341,9 @@ void multipcm_device::write_slot(slot_t *slot, INT32 reg, UINT8 data) case 4: //KeyOn/Off (and more?) if (data & 0x80) //KeyOn { - slot->m_sample = m_samples + slot->m_regs[1]; + slot->m_sample = &m_samples[slot->m_regs[1]]; slot->m_playing = true; - slot->m_base = slot->m_sample->m_start; + slot->m_base = slot->m_sample->start(); slot->m_offset = 0; slot->m_prev_sample = 0; slot->m_total_level = slot->m_dest_total_level << TL_SHIFT; @@ -369,7 +369,7 @@ void multipcm_device::write_slot(slot_t *slot, INT32 reg, UINT8 data) { if (slot->m_playing) { - if (slot->m_sample->m_release_reg != 0xf) + if (slot->m_sample->release_reg() != 0xf) { slot->m_envelope_gen.m_state = RELEASE; } @@ -420,7 +420,6 @@ READ8_MEMBER( multipcm_device::read ) return 0; } - WRITE8_MEMBER( multipcm_device::write ) { switch(offset) @@ -444,6 +443,7 @@ void multipcm_device::set_bank(UINT32 leftoffs, UINT32 rightoffs) { m_bank_left = leftoffs; m_bank_right = rightoffs; + printf("%08x, %08x\n", leftoffs, rightoffs); } const device_type MULTIPCM = &device_creator; @@ -586,26 +586,9 @@ void multipcm_device::device_start() // Samples m_samples = auto_alloc_array_clear(machine(), sample_t, 0x200); - for(INT32 sample = 0; sample < 0x200; ++sample) + for(INT32 sample = 0; sample < 512; ++sample) { - UINT8 data[12]; - - for (INT32 sample_byte = 0; sample_byte < 12; sample_byte++) - { - data[sample_byte] = (UINT8)read_byte((sample * 12) + sample_byte); - } - - m_samples[sample].m_start = (data[0] << 16) | (data[1] << 8) | (data[2] << 0); - m_samples[sample].m_loop = (data[3] << 8) | (data[4] << 0); - m_samples[sample].m_end = 0xffff - ((data[5] << 8) | (data[6] << 0)); - m_samples[sample].m_lfo_vibrato_reg = data[7]; - m_samples[sample].m_decay1_reg = data[8] & 0xf; - m_samples[sample].m_attack_reg = (data[8] >> 4) & 0xf; - m_samples[sample].m_decay2_reg = data[9] & 0xf; - m_samples[sample].m_decay_level = (data[9] >> 4) & 0xf; - m_samples[sample].m_release_reg = data[10] & 0xf; - m_samples[sample].m_key_rate_scale = (data[10] >> 4) & 0xf; - m_samples[sample].m_lfo_amplitude_reg = data[11]; + m_samples[sample].init(sample, this); } save_item(NAME(m_cur_slot)); @@ -702,9 +685,9 @@ void multipcm_device::sound_stream_update(sound_stream &stream, stream_sample_t } slot->m_offset += step; - if (slot->m_offset >= (slot->m_sample->m_end << TL_SHIFT)) + if (slot->m_offset >= (slot->m_sample->end() << TL_SHIFT)) { - slot->m_offset = slot->m_sample->m_loop << TL_SHIFT; + slot->m_offset = slot->m_sample->loop() << TL_SHIFT; } if (adr ^ (slot->m_offset >> TL_SHIFT)) diff --git a/src/devices/sound/multipcm.h b/src/devices/sound/multipcm.h index 8b66783f67e..c9418c6a253 100644 --- a/src/devices/sound/multipcm.h +++ b/src/devices/sound/multipcm.h @@ -27,19 +27,28 @@ protected: virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; private: - struct sample_t + class sample_t { - UINT32 m_start; - UINT32 m_loop; - UINT32 m_end; - UINT8 m_attack_reg; - UINT8 m_decay1_reg; - UINT8 m_decay2_reg; - UINT8 m_decay_level; - UINT8 m_release_reg; - UINT8 m_key_rate_scale; - UINT8 m_lfo_vibrato_reg; - UINT8 m_lfo_amplitude_reg; + public: + sample_t() { } + + void init(UINT32 index, multipcm_device* rom) { m_address = index * 12; m_rom = rom; } + + UINT32 start() { return (m_rom->read_byte(m_address) << 16) | (m_rom->read_byte(m_address + 1) << 8) | m_rom->read_byte(m_address + 2); } + UINT32 loop() { return (m_rom->read_byte(m_address + 3) << 8) | m_rom->read_byte(m_address + 4); } + UINT32 end() { return 0xffff - ((m_rom->read_byte(m_address + 5) << 8) | m_rom->read_byte(m_address + 6)); } + UINT8 attack_reg() { return (m_rom->read_byte(m_address + 8) >> 4) & 0xf; } + UINT8 decay1_reg() { return m_rom->read_byte(m_address + 8) & 0xf; } + UINT8 decay2_reg() { return m_rom->read_byte(m_address + 9) & 0xf; } + UINT8 decay_level() { return (m_rom->read_byte(m_address + 9) >> 4) & 0xf; } + UINT8 release_reg() { return m_rom->read_byte(m_address + 10) & 0xf; } + UINT8 key_rate_scale() { return (m_rom->read_byte(m_address + 10) >> 4) & 0xf; } + UINT8 lfo_vibrato_reg() { return m_rom->read_byte(m_address + 7); } + UINT8 lfo_amplitude_reg() { return m_rom->read_byte(m_address + 11) & 0xf; } + + private: + UINT32 m_address; + multipcm_device* m_rom; }; enum state_t @@ -71,7 +80,6 @@ private: INT32 *m_scale; }; - struct slot_t { UINT8 m_slot_index; diff --git a/src/devices/sound/nes_apu.cpp b/src/devices/sound/nes_apu.cpp index 3792311c77e..97e65fdc35f 100644 --- a/src/devices/sound/nes_apu.cpp +++ b/src/devices/sound/nes_apu.cpp @@ -141,31 +141,52 @@ void nesapu_device::set_tag_memory(const char *tag) (m_APU.dpcm).memory = &machine().device(tag)->memory().space(AS_PROGRAM); } -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- +void nesapu_device::device_clock_changed() +{ + calculate_rates(); +} -void nesapu_device::device_start() +void nesapu_device::calculate_rates() { int rate = clock() / 4; - /* Initialize global variables */ - m_samps_per_sync = rate / ATTOSECONDS_TO_HZ(machine().first_screen()->frame_period().attoseconds()); + screen_device *screen = machine().first_screen(); + if (screen != nullptr) + { + m_samps_per_sync = rate / ATTOSECONDS_TO_HZ(machine().first_screen()->frame_period().attoseconds()); + m_real_rate = m_samps_per_sync * ATTOSECONDS_TO_HZ(machine().first_screen()->frame_period().attoseconds()); + } + else + { + m_samps_per_sync = rate / screen_device::DEFAULT_FRAME_RATE; + m_real_rate = m_samps_per_sync * screen_device::DEFAULT_FRAME_RATE; + } m_buffer_size = m_samps_per_sync; - m_real_rate = m_samps_per_sync * ATTOSECONDS_TO_HZ(machine().first_screen()->frame_period().attoseconds()); m_apu_incsize = (float) (clock() / (float) m_real_rate); - /* Use initializer calls */ - create_noise(m_noise_lut, 13, NOISE_LONG); create_vbltimes(m_vbl_times,vbl_length,m_samps_per_sync); create_syncs(m_samps_per_sync); /* Adjust buffer size if 16 bits */ m_buffer_size+=m_samps_per_sync; + if (m_stream != nullptr) + m_stream->set_sample_rate(rate); + else + m_stream = machine().sound().stream_alloc(*this, 0, 1, rate); +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void nesapu_device::device_start() +{ + create_noise(m_noise_lut, 13, NOISE_LONG); + set_tag_memory(m_cpu_tag); - m_stream = machine().sound().stream_alloc(*this, 0, 1, rate); + calculate_rates(); /* register for save */ for (int i = 0; i < 2; i++) diff --git a/src/devices/sound/nes_apu.h b/src/devices/sound/nes_apu.h index 6c1b51cc8fd..020b8a7d4e6 100644 --- a/src/devices/sound/nes_apu.h +++ b/src/devices/sound/nes_apu.h @@ -53,6 +53,8 @@ public: static void set_cpu_tag(device_t &device, const char *tag) { downcast(device).m_cpu_tag = tag; } void set_tag_memory(const char *tag); + virtual void device_clock_changed() override; + DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -78,6 +80,7 @@ private: const char *m_cpu_tag; + void calculate_rates(); void create_syncs(unsigned long sps); int8 apu_square(square_t *chan); int8 apu_triangle(triangle_t *chan); diff --git a/src/devices/sound/nes_defs.h b/src/devices/sound/nes_defs.h index b225b1e60a6..5ba6ed3bca1 100644 --- a/src/devices/sound/nes_defs.h +++ b/src/devices/sound/nes_defs.h @@ -28,8 +28,6 @@ #ifndef __NES_DEFS_H__ #define __NES_DEFS_H__ -#include "nes_defs.h" - /* BOOLEAN CONSTANTS */ #ifndef TRUE #define TRUE 1 diff --git a/src/mame/drivers/asterix.cpp b/src/mame/drivers/asterix.cpp index 51dd931f416..9bf5942e35d 100644 --- a/src/mame/drivers/asterix.cpp +++ b/src/mame/drivers/asterix.cpp @@ -188,6 +188,9 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, asterix_state ) AM_RANGE(0xfe00, 0xfe00) AM_DEVWRITE("ymsnd", ym2151_device, register_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( k053260_map, AS_0, 8, asterix_state ) + AM_RANGE(0x00000000, 0x001fffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END static INPUT_PORTS_START( asterix ) @@ -290,6 +293,7 @@ static MACHINE_CONFIG_START( asterix, asterix_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MCFG_K053260_ADD("k053260", XTAL_32MHz/8) // 4MHz + MCFG_DEVICE_ADDRESS_MAP(AS_0, k053260_map) MCFG_SOUND_ROUTE(0, "lspeaker", 0.75) MCFG_SOUND_ROUTE(1, "rspeaker", 0.75) MACHINE_CONFIG_END diff --git a/src/mame/drivers/overdriv.cpp b/src/mame/drivers/overdriv.cpp index 9d56c0d7225..1303062ee38 100644 --- a/src/mame/drivers/overdriv.cpp +++ b/src/mame/drivers/overdriv.cpp @@ -253,6 +253,9 @@ static ADDRESS_MAP_START( overdriv_sound_map, AS_PROGRAM, 8, overdriv_state ) AM_RANGE(0x1000, 0xffff) AM_ROM ADDRESS_MAP_END +static ADDRESS_MAP_START( overdriv_k053260_map, AS_0, 8, overdriv_state ) + AM_RANGE(0x00000000, 0x001fffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END /* Both IPT_START1 assignments are needed. The game will reset during */ /* the "continue" sequence if the assignment on the first port */ @@ -375,12 +378,12 @@ static MACHINE_CONFIG_START( overdriv, overdriv_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 0.5) MCFG_K053260_ADD("k053260_1", XTAL_3_579545MHz) - MCFG_K053260_REGION("shared") + MCFG_DEVICE_ADDRESS_MAP(AS_0, overdriv_k053260_map) MCFG_SOUND_ROUTE(0, "lspeaker", 0.35) MCFG_SOUND_ROUTE(1, "rspeaker", 0.35) MCFG_K053260_ADD("k053260_2", XTAL_3_579545MHz) - MCFG_K053260_REGION("shared") + MCFG_DEVICE_ADDRESS_MAP(AS_0, overdriv_k053260_map) MCFG_SOUND_ROUTE(0, "lspeaker", 0.35) MCFG_SOUND_ROUTE(1, "rspeaker", 0.35) MACHINE_CONFIG_END @@ -426,7 +429,7 @@ ROM_START( overdriv ) ROM_LOAD( "789e17.p17", 0x000000, 0x040000, CRC(04c07248) SHA1(873445002cbf90c9fc5a35bf4a8f6c43193ee342) ) ROM_LOAD( "789e16.p12", 0x040000, 0x040000, CRC(9348dee1) SHA1(367193373e28962b5b0e54cc15d68ed88ab83f12) ) - ROM_REGION( 0x200000, "shared", 0 ) /* 053260 samples */ + ROM_REGION( 0x200000, "k053260", 0 ) /* 053260 samples */ ROM_LOAD( "789e03.j1", 0x000000, 0x100000, CRC(51ebfebe) SHA1(17f0c23189258e801f48d5833fe934e7a48d071b) ) ROM_LOAD( "789e02.f1", 0x100000, 0x100000, CRC(bdd3b5c6) SHA1(412332d64052c0a3714f4002c944b0e7d32980a4) ) ROM_END @@ -464,7 +467,7 @@ ROM_START( overdriva ) ROM_LOAD( "789e17.p17", 0x000000, 0x040000, CRC(04c07248) SHA1(873445002cbf90c9fc5a35bf4a8f6c43193ee342) ) ROM_LOAD( "789e16.p12", 0x040000, 0x040000, CRC(9348dee1) SHA1(367193373e28962b5b0e54cc15d68ed88ab83f12) ) - ROM_REGION( 0x200000, "shared", 0 ) /* 053260 samples */ + ROM_REGION( 0x200000, "k053260", 0 ) /* 053260 samples */ ROM_LOAD( "789e03.j1", 0x000000, 0x100000, CRC(51ebfebe) SHA1(17f0c23189258e801f48d5833fe934e7a48d071b) ) ROM_LOAD( "789e02.f1", 0x100000, 0x100000, CRC(bdd3b5c6) SHA1(412332d64052c0a3714f4002c944b0e7d32980a4) ) ROM_END @@ -502,7 +505,7 @@ ROM_START( overdrivb ) ROM_LOAD( "789e17.p17", 0x000000, 0x040000, CRC(04c07248) SHA1(873445002cbf90c9fc5a35bf4a8f6c43193ee342) ) ROM_LOAD( "789e16.p12", 0x040000, 0x040000, CRC(9348dee1) SHA1(367193373e28962b5b0e54cc15d68ed88ab83f12) ) - ROM_REGION( 0x200000, "shared", 0 ) /* 053260 samples */ + ROM_REGION( 0x200000, "k053260", 0 ) /* 053260 samples */ ROM_LOAD( "789e03.j1", 0x000000, 0x100000, CRC(51ebfebe) SHA1(17f0c23189258e801f48d5833fe934e7a48d071b) ) ROM_LOAD( "789e02.f1", 0x100000, 0x100000, CRC(bdd3b5c6) SHA1(412332d64052c0a3714f4002c944b0e7d32980a4) ) ROM_END diff --git a/src/mame/drivers/parodius.cpp b/src/mame/drivers/parodius.cpp index a5fa9f3b9b9..21749862f3e 100644 --- a/src/mame/drivers/parodius.cpp +++ b/src/mame/drivers/parodius.cpp @@ -127,6 +127,9 @@ static ADDRESS_MAP_START( parodius_sound_map, AS_PROGRAM, 8, parodius_state ) AM_RANGE(0xfc00, 0xfc2f) AM_DEVREADWRITE("k053260", k053260_device, read, write) ADDRESS_MAP_END +static ADDRESS_MAP_START( parodius_k053260_map, AS_0, 8, parodius_state ) + AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END /*************************************************************************** @@ -281,6 +284,7 @@ static MACHINE_CONFIG_START( parodius, parodius_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MCFG_K053260_ADD("k053260", 3579545) + MCFG_DEVICE_ADDRESS_MAP(AS_0, parodius_k053260_map) MCFG_SOUND_ROUTE(0, "lspeaker", 0.70) MCFG_SOUND_ROUTE(1, "rspeaker", 0.70) MACHINE_CONFIG_END diff --git a/src/mame/drivers/rollerg.cpp b/src/mame/drivers/rollerg.cpp index 2e6353a0f4b..3317fe3b533 100644 --- a/src/mame/drivers/rollerg.cpp +++ b/src/mame/drivers/rollerg.cpp @@ -103,6 +103,9 @@ static ADDRESS_MAP_START( rollerg_sound_map, AS_PROGRAM, 8, rollerg_state ) AM_RANGE(0xfc00, 0xfc00) AM_WRITE(sound_arm_nmi_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( rollerg_k053260_map, AS_0, 8, rollerg_state ) + AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END /*************************************************************************** @@ -284,6 +287,7 @@ static MACHINE_CONFIG_START( rollerg, rollerg_state ) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MCFG_K053260_ADD("k053260", 3579545) + MCFG_DEVICE_ADDRESS_MAP(AS_0, rollerg_k053260_map) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70) MACHINE_CONFIG_END diff --git a/src/mame/drivers/simpsons.cpp b/src/mame/drivers/simpsons.cpp index 0d4b65eb120..342634ae622 100644 --- a/src/mame/drivers/simpsons.cpp +++ b/src/mame/drivers/simpsons.cpp @@ -148,6 +148,10 @@ static ADDRESS_MAP_START( bank2000_map, AS_PROGRAM, 8, simpsons_state ) AM_RANGE(0x3000, 0x3fff) AM_RAM ADDRESS_MAP_END +static ADDRESS_MAP_START( k053260_map, AS_0, 8, simpsons_state ) + AM_RANGE(0x00000000, 0x0013ffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END + WRITE8_MEMBER(simpsons_state::z80_bankswitch_w) { membank("bank2")->set_entry(data & 7); @@ -380,6 +384,7 @@ static MACHINE_CONFIG_START( simpsons, simpsons_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 0.0) MCFG_SOUND_ADD("k053260", K053260, XTAL_3_579545MHz) /* verified on pcb */ + MCFG_DEVICE_ADDRESS_MAP(AS_0, k053260_map) MCFG_SOUND_ROUTE(0, "lspeaker", 0.75) MCFG_SOUND_ROUTE(1, "rspeaker", 0.75) MACHINE_CONFIG_END diff --git a/src/mame/drivers/tmnt.cpp b/src/mame/drivers/tmnt.cpp index 9e10bef4773..472b497d973 100644 --- a/src/mame/drivers/tmnt.cpp +++ b/src/mame/drivers/tmnt.cpp @@ -548,6 +548,9 @@ static ADDRESS_MAP_START( punkshot_main_map, AS_PROGRAM, 16, tmnt_state ) AM_RANGE(0xfffffc, 0xffffff) AM_READ(punkshot_kludge_r) ADDRESS_MAP_END +static ADDRESS_MAP_START( punkshot_k053260_map, AS_0, 8, tmnt_state ) + AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END static ADDRESS_MAP_START( lgtnfght_main_map, AS_PROGRAM, 16, tmnt_state ) AM_RANGE(0x000000, 0x03ffff) AM_ROM @@ -568,6 +571,9 @@ static ADDRESS_MAP_START( lgtnfght_main_map, AS_PROGRAM, 16, tmnt_state ) AM_RANGE(0x100000, 0x107fff) AM_READWRITE(k052109_word_noA12_r, k052109_word_noA12_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( lgtnfght_k053260_map, AS_0, 8, tmnt_state ) + AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END WRITE16_MEMBER(tmnt_state::ssriders_soundkludge_w) { @@ -595,6 +601,9 @@ static ADDRESS_MAP_START( blswhstl_main_map, AS_PROGRAM, 16, tmnt_state ) AM_RANGE(0x780700, 0x78071f) AM_DEVWRITE("k053251", k053251_device, lsb_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( blswhstl_k053260_map, AS_0, 8, tmnt_state ) + AM_RANGE(0x00000000, 0x000fffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END WRITE16_MEMBER(tmnt_state::k053251_glfgreat_w) { @@ -640,6 +649,9 @@ static ADDRESS_MAP_START( glfgreat_main_map, AS_PROGRAM, 16, tmnt_state ) AM_RANGE(0x300000, 0x3fffff) AM_READ(glfgreat_rom_r) ADDRESS_MAP_END +static ADDRESS_MAP_START( glfgreat_k053260_map, AS_0, 8, tmnt_state ) + AM_RANGE(0x00000000, 0x000fffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END static ADDRESS_MAP_START( prmrsocr_main_map, AS_PROGRAM, 16, tmnt_state ) AM_RANGE(0x000000, 0x07ffff) AM_ROM @@ -925,6 +937,9 @@ static ADDRESS_MAP_START( tmnt2_main_map, AS_PROGRAM, 16, tmnt_state ) AM_RANGE(0x600000, 0x603fff) AM_DEVREADWRITE("k052109", k052109_device, word_r, word_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( tmnt2_k053260_map, AS_0, 8, tmnt_state ) + AM_RANGE(0x00000000, 0x001fffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END static ADDRESS_MAP_START( ssriders_main_map, AS_PROGRAM, 16, tmnt_state ) AM_RANGE(0x000000, 0x0bffff) AM_ROM @@ -950,6 +965,9 @@ static ADDRESS_MAP_START( ssriders_main_map, AS_PROGRAM, 16, tmnt_state ) AM_RANGE(0x600000, 0x603fff) AM_DEVREADWRITE("k052109", k052109_device, word_r, word_w) ADDRESS_MAP_END +static ADDRESS_MAP_START( ssriders_k053260_map, AS_0, 8, tmnt_state ) + AM_RANGE(0x00000000, 0x000fffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END static ADDRESS_MAP_START( sunsetbl_main_map, AS_PROGRAM, 16, tmnt_state ) AM_RANGE(0x000000, 0x0bffff) AM_ROM @@ -993,6 +1011,9 @@ static ADDRESS_MAP_START( thndrx2_main_map, AS_PROGRAM, 16, tmnt_state ) AM_RANGE(0x700400, 0x7007ff) AM_DEVREADWRITE8("k051960", k051960_device, k051960_r, k051960_w, 0xffff) ADDRESS_MAP_END +static ADDRESS_MAP_START( thndrx2_k053260_map, AS_0, 8, tmnt_state ) + AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END static ADDRESS_MAP_START( mia_audio_map, AS_PROGRAM, 8, tmnt_state ) @@ -2192,6 +2213,7 @@ static MACHINE_CONFIG_START( punkshot, tmnt_state ) MCFG_SOUND_ROUTE(1, "mono", 1.0) MCFG_K053260_ADD("k053260", XTAL_3_579545MHz) + MCFG_DEVICE_ADDRESS_MAP(AS_0, punkshot_k053260_map) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70) MACHINE_CONFIG_END @@ -2247,6 +2269,7 @@ static MACHINE_CONFIG_START( lgtnfght, tmnt_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MCFG_K053260_ADD("k053260", XTAL_3_579545MHz) + MCFG_DEVICE_ADDRESS_MAP(AS_0, lgtnfght_k053260_map) MCFG_SOUND_ROUTE(0, "lspeaker", 0.70) MCFG_SOUND_ROUTE(1, "rspeaker", 0.70) MACHINE_CONFIG_END @@ -2308,6 +2331,7 @@ static MACHINE_CONFIG_START( blswhstl, tmnt_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 0.70) MCFG_K053260_ADD("k053260", XTAL_3_579545MHz) + MCFG_DEVICE_ADDRESS_MAP(AS_0, blswhstl_k053260_map) MCFG_SOUND_ROUTE(0, "rspeaker", 0.50) /* fixed inverted stereo channels */ MCFG_SOUND_ROUTE(1, "lspeaker", 0.50) MACHINE_CONFIG_END @@ -2384,6 +2408,7 @@ static MACHINE_CONFIG_START( glfgreat, tmnt_state ) MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MCFG_K053260_ADD("k053260", XTAL_3_579545MHz) + MCFG_DEVICE_ADDRESS_MAP(AS_0, glfgreat_k053260_map) MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MACHINE_CONFIG_END @@ -2519,6 +2544,7 @@ static MACHINE_CONFIG_START( tmnt2, tmnt_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MCFG_K053260_ADD("k053260", XTAL_3_579545MHz) + MCFG_DEVICE_ADDRESS_MAP(AS_0, tmnt2_k053260_map) MCFG_SOUND_ROUTE(0, "lspeaker", 0.75) MCFG_SOUND_ROUTE(1, "rspeaker", 0.75) MACHINE_CONFIG_END @@ -2578,6 +2604,7 @@ static MACHINE_CONFIG_START( ssriders, tmnt_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MCFG_K053260_ADD("k053260", XTAL_3_579545MHz) + MCFG_DEVICE_ADDRESS_MAP(AS_0, ssriders_k053260_map) MCFG_SOUND_ROUTE(0, "lspeaker", 0.70) MCFG_SOUND_ROUTE(1, "rspeaker", 0.70) MACHINE_CONFIG_END @@ -2680,6 +2707,7 @@ static MACHINE_CONFIG_START( thndrx2, tmnt_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MCFG_K053260_ADD("k053260", XTAL_3_579545MHz) + MCFG_DEVICE_ADDRESS_MAP(AS_0, thndrx2_k053260_map) MCFG_SOUND_ROUTE(0, "lspeaker", 0.75) MCFG_SOUND_ROUTE(1, "rspeaker", 0.75) MACHINE_CONFIG_END diff --git a/src/mame/drivers/vendetta.cpp b/src/mame/drivers/vendetta.cpp index da15f8789c8..694fed9a835 100644 --- a/src/mame/drivers/vendetta.cpp +++ b/src/mame/drivers/vendetta.cpp @@ -265,6 +265,9 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, vendetta_state ) AM_RANGE(0xfc00, 0xfc2f) AM_DEVREADWRITE("k053260", k053260_device, read, write) ADDRESS_MAP_END +static ADDRESS_MAP_START( k053260_map, AS_0, 8, vendetta_state ) + AM_RANGE(0x00000000, 0x000fffff) AM_ROM AM_REGION("k053260", 0) +ADDRESS_MAP_END /*************************************************************************** @@ -481,6 +484,7 @@ static MACHINE_CONFIG_START( vendetta, vendetta_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 1.0) MCFG_K053260_ADD("k053260", XTAL_3_579545MHz) /* verified with PCB */ + MCFG_DEVICE_ADDRESS_MAP(AS_0, k053260_map) MCFG_SOUND_ROUTE(0, "lspeaker", 0.75) MCFG_SOUND_ROUTE(1, "rspeaker", 0.75) MACHINE_CONFIG_END @@ -614,7 +618,6 @@ ROM_START( vendetta2p ) ROM_LOAD( "vendetta.nv", 0x0000, 0x080, CRC(fbac4e30) SHA1(d3ff3a392550d9b06400b9292a44bdac7ba5c801) ) ROM_END - ROM_START( vendetta2peba ) ROM_REGION( 0x40000, "maincpu", 0 ) /* code + banked roms + banked ram */ ROM_LOAD( "081-eb-a01.17c", 0x00000, 0x40000, CRC(8430bb52) SHA1(54e896510fa44e76b0640b17150210fbf6b3b5bc)) // Label was unclear apart from EB stamp on the middle line. Bottom line looked like 401, but probably A01 diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp index 31292780bfb..4aad74874aa 100644 --- a/src/mame/drivers/vgmplay.cpp +++ b/src/mame/drivers/vgmplay.cpp @@ -10,11 +10,19 @@ #include "debugger.h" #include "imagedev/bitbngr.h" +#include "cpu/m6502/n2a03.h" #include "sound/2612intf.h" #include "sound/ym2151.h" #include "sound/ym2413.h" +#include "sound/2203intf.h" +#include "sound/3526intf.h" +#include "sound/ay8910.h" #include "sound/sn76496.h" +#include "sound/k053260.h" #include "sound/segapcm.h" +#include "sound/multipcm.h" +#include "sound/gb.h" +//#include "sound/nes_apu.h" class vgmplay_device : public cpu_device { @@ -24,12 +32,23 @@ public: A_YM2612 = 0x00000010, A_YM2151 = 0x00000020, A_YM2413 = 0x00000030, - A_SN76496 = 0x00000040, + A_YM2203A = 0x00000040, + A_YM2203B = 0x00000050, + A_YM3526 = 0x00000060, + A_AY8910A = 0x00000070, + A_AY8910B = 0x00000080, + A_SN76496 = 0x00000090, + A_K053260 = 0x000000a0, A_SEGAPCM = 0x00001000, + A_GAMEBOY = 0x00002000, + A_NESAPU = 0x00002030, + A_NESRAM = 0x00003000, + A_MULTIPCMA = 0x00013000, + A_MULTIPCMB = 0x00013010, }; vgmplay_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - + virtual void device_start() override; virtual void device_reset() override; @@ -50,6 +69,9 @@ public: virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override; READ8_MEMBER(segapcm_rom_r); + READ8_MEMBER(multipcma_rom_r); + READ8_MEMBER(multipcmb_rom_r); + READ8_MEMBER(k053260_rom_r); private: struct rom_block { @@ -68,17 +90,16 @@ private: int m_icount, m_state; - UINT32 m_pc; + UINT32 m_pc; - std::list m_rom_blocks[0x40]; - UINT32 m_rom_masks[0x40]; + std::list m_rom_blocks[2][0x40]; std::vector m_data_streams[0x40]; std::vector m_data_stream_starts[0x40]; UINT32 m_ym2612_stream_offset; - UINT8 rom_r(UINT8 type, offs_t offset); + UINT8 rom_r(int chip, UINT8 type, offs_t offset); UINT32 handle_data_block(UINT32 address); void blocks_clear(); }; @@ -92,8 +113,13 @@ public: virtual void machine_start() override; - READ8_MEMBER(file_r); - READ8_MEMBER(file_size_r); + DECLARE_READ8_MEMBER(file_r); + DECLARE_READ8_MEMBER(file_size_r); + + DECLARE_WRITE8_MEMBER(multipcm_bank_lo_a_w); + DECLARE_WRITE8_MEMBER(multipcm_bank_hi_a_w); + DECLARE_WRITE8_MEMBER(multipcm_bank_lo_b_w); + DECLARE_WRITE8_MEMBER(multipcm_bank_hi_b_w); private: std::vector m_file_data; @@ -101,10 +127,26 @@ private: required_device m_ym2612; required_device m_ym2151; required_device m_ym2413; + required_device m_ym2203a; + required_device m_ym2203b; + required_device m_ym3526; + required_device m_ay8910a; + required_device m_ay8910b; required_device m_sn76496; required_device m_segapcm; + required_device m_multipcma; + required_device m_multipcmb; + required_device m_dmg; + required_device m_nescpu; + required_shared_ptr m_nesram; + + UINT32 m_multipcma_bank_l; + UINT32 m_multipcma_bank_r; + UINT32 m_multipcmb_bank_l; + UINT32 m_multipcmb_bank_r; UINT32 r32(int offset) const; + UINT8 r8(int offset) const; }; vgmplay_device::vgmplay_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : @@ -153,8 +195,8 @@ UINT32 vgmplay_device::execute_input_lines() const void vgmplay_device::blocks_clear() { for(int i = 0; i < 0x40; i++) { - m_rom_blocks[i].clear(); - m_rom_masks[i] = 0; + m_rom_blocks[0][i].clear(); + m_rom_blocks[1][i].clear(); m_data_streams[i].clear(); m_data_stream_starts[i].clear(); } @@ -163,6 +205,9 @@ void vgmplay_device::blocks_clear() UINT32 vgmplay_device::handle_data_block(UINT32 address) { UINT32 size = m_file->read_dword(m_pc+3); + int second = (size & 0x80000000) ? 1 : 0; + size &= 0x7fffffff; + UINT8 type = m_file->read_byte(m_pc+2); if(type < 0x40) { UINT32 start = m_data_streams[type].size(); @@ -178,22 +223,22 @@ UINT32 vgmplay_device::handle_data_block(UINT32 address) logerror("ignored compression table size %x\n", size); else if(type < 0xc0) { - UINT32 rs = m_file->read_dword(m_pc+7); + //UINT32 rs = m_file->read_dword(m_pc+7); UINT32 start = m_file->read_dword(m_pc+11); std::unique_ptr block = std::make_unique(size - 8); for(UINT32 i=0; iread_byte(m_pc+15+i); - m_rom_blocks[type - 0x80].emplace_front(start, start+size-9, std::move(block)); - - UINT32 mask = rs-1; - mask |= mask >> 1; - mask |= mask >> 2; - mask |= mask >> 4; - mask |= mask >> 8; - mask |= mask >> 16; - m_rom_masks[type - 0x80] = mask; - } else + m_rom_blocks[second][type - 0x80].emplace_front(start, start+size-9, std::move(block)); + } else if (type == 0xc2) { + UINT16 start = m_file->read_word(m_pc+7); + UINT32 data_size = size - 2; + for (int i = 0; i < data_size; i++) + { + m_io->write_byte(A_NESRAM + start + i, m_file->read_byte(m_pc + 9 + i)); + } + } else { logerror("ignored ram block size %x type %02x\n", size, type); + } return 7+size; } @@ -252,6 +297,24 @@ void vgmplay_device::execute_run() m_pc += 3; break; + case 0x55: + m_io->write_byte(A_YM2203A+0, m_file->read_byte(m_pc+1)); + m_io->write_byte(A_YM2203A+1, m_file->read_byte(m_pc+2)); + m_pc += 3; + break; + + case 0xA5: + m_io->write_byte(A_YM2203B+0, m_file->read_byte(m_pc+1)); + m_io->write_byte(A_YM2203B+1, m_file->read_byte(m_pc+2)); + m_pc += 3; + break; + + case 0x5b: + m_io->write_byte(A_YM3526+0, m_file->read_byte(m_pc+1)); + m_io->write_byte(A_YM3526+1, m_file->read_byte(m_pc+2)); + m_pc += 3; + break; + case 0x61: { UINT32 duration = m_file->read_word(m_pc+1); m_icount -= duration; @@ -270,8 +333,17 @@ void vgmplay_device::execute_run() break; case 0x66: - m_state = DONE; + { + UINT32 loop_offset = m_file->read_dword(0x1c); + if (!loop_offset) + { + m_state = DONE; + break; + } + + m_pc = 0x1c + loop_offset; break; + } case 0x67: m_pc += handle_data_block(m_pc); @@ -296,11 +368,71 @@ void vgmplay_device::execute_run() m_icount -= code & 0xf; break; + case 0xb3: + m_io->write_byte(A_GAMEBOY + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + m_pc += 3; + break; + case 0xc0: m_io->write_byte(A_SEGAPCM + (m_file->read_word(m_pc+1) & 0x7ff), m_file->read_byte(m_pc+3)); m_pc += 4; break; + case 0xa0: + { + UINT8 reg = m_file->read_byte(m_pc+1); + if (reg & 0x80) + { + m_io->write_byte(A_AY8910A+1, reg & 0x7f); + m_io->write_byte(A_AY8910A+0, m_file->read_byte(m_pc+2)); + } + else + { + m_io->write_byte(A_AY8910B+1, reg & 0x7f); + m_io->write_byte(A_AY8910B+0, m_file->read_byte(m_pc+2)); + } + m_pc += 3; + break; + } + + case 0xb4: + m_io->write_byte(A_NESAPU + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + m_pc += 3; + break; + + case 0xb5: + { + UINT8 offset = m_file->read_byte(m_pc+1); + if (offset & 0x80) + m_io->write_byte(A_MULTIPCMB + (offset & 0x7f), m_file->read_byte(m_pc+2)); + else + m_io->write_byte(A_MULTIPCMA + (offset & 0x7f), m_file->read_byte(m_pc+2)); + m_pc += 3; + break; + } + + case 0xba: + m_io->write_byte(A_K053260 + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + m_pc += 3; + break; + + case 0xc3: + { + UINT8 offset = m_file->read_byte(m_pc+1); + if (offset & 0x80) + { + m_io->write_byte(A_MULTIPCMB + 4 + (offset & 0x7f), m_file->read_byte(m_pc+3)); + m_io->write_byte(A_MULTIPCMB + 8 + (offset & 0x7f), m_file->read_byte(m_pc+2)); + } + else + { + m_io->write_byte(A_MULTIPCMA + 4 + (offset & 0x7f), m_file->read_byte(m_pc+3)); + m_io->write_byte(A_MULTIPCMA + 8 + (offset & 0x7f), m_file->read_byte(m_pc+2)); + } + m_pc += 4; + break; + } + case 0xe0: m_ym2612_stream_offset = m_file->read_dword(m_pc+1); m_pc += 5; @@ -392,7 +524,7 @@ offs_t vgmplay_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 * return 3 | DASMFLAG_SUPPORTED; case 0x55: - sprintf(buffer, "ym2203 r%02x = %02x", oprom[1], oprom[2]); + sprintf(buffer, "ym2203a r%02x = %02x", oprom[1], oprom[2]); return 3 | DASMFLAG_SUPPORTED; case 0x56: @@ -515,7 +647,7 @@ offs_t vgmplay_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 * sprintf(buffer, "data-block %x, %s", size, rom_types[type & 0x7f]); else if(type < 0xc0) sprintf(buffer, "data-block %x, rom %02x", size, type); - else if(type < 0x93) + else if(type < 0xc3) sprintf(buffer, "data-block %x, %s", size, ram_types[type & 0x1f]); else if(type < 0xe0) sprintf(buffer, "data-block %x, ram %02x", size, type); @@ -544,6 +676,10 @@ offs_t vgmplay_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 * sprintf(buffer, "ay8910 r%02x = %02x", oprom[1], oprom[2]); return 3 | DASMFLAG_SUPPORTED; + case 0xa5: + sprintf(buffer, "ym2203b r%02x = %02x", oprom[1], oprom[2]); + return 3 | DASMFLAG_SUPPORTED; + case 0xb0: sprintf(buffer, "rf5c68 r%02x = %02x", oprom[1], oprom[2]); return 3 | DASMFLAG_SUPPORTED; @@ -561,7 +697,7 @@ offs_t vgmplay_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 * return 3 | DASMFLAG_SUPPORTED; case 0xb4: - sprintf(buffer, "apu r%02x = %02x", oprom[1], oprom[2]); + sprintf(buffer, "nesapu r%02x = %02x", oprom[1], oprom[2]); return 3 | DASMFLAG_SUPPORTED; case 0xb5: @@ -644,18 +780,36 @@ offs_t vgmplay_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 * } } -UINT8 vgmplay_device::rom_r(UINT8 type, offs_t offset) +UINT8 vgmplay_device::rom_r(int chip, UINT8 type, offs_t offset) { - for(const auto &b : m_rom_blocks[type - 0x80]) + for(const auto &b : m_rom_blocks[chip][type - 0x80]) + { if(offset >= b.start_address && offset <= b.end_address) + { return b.data[offset - b.start_address]; - logerror("Unmapped rom read, type %02x, offset %x\n", type, offset); + } + } return 0; } READ8_MEMBER(vgmplay_device::segapcm_rom_r) { - return rom_r(0x80, offset); + return rom_r(0, 0x80, offset); +} + +READ8_MEMBER(vgmplay_device::multipcma_rom_r) +{ + return rom_r(0, 0x89, offset); +} + +READ8_MEMBER(vgmplay_device::multipcmb_rom_r) +{ + return rom_r(1, 0x89, offset); +} + +READ8_MEMBER(vgmplay_device::k053260_rom_r) +{ + return rom_r(0, 0x8e, offset); } vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, const char *tag) : @@ -664,8 +818,18 @@ vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, co m_ym2612(*this, "ym2612"), m_ym2151(*this, "ym2151"), m_ym2413(*this, "ym2413"), + m_ym2203a(*this, "ym2203a"), + m_ym2203b(*this, "ym2203b"), + m_ym3526(*this, "ym3526"), + m_ay8910a(*this, "ay8910a"), + m_ay8910b(*this, "ay8910b"), m_sn76496(*this, "sn76496"), - m_segapcm(*this, "segapcm") + m_segapcm(*this, "segapcm"), + m_multipcma(*this, "multipcma"), + m_multipcmb(*this, "multipcmb"), + m_dmg(*this, "dmg"), + m_nescpu(*this, "nescpu"), + m_nesram(*this, "nesapu_ram") { } @@ -676,8 +840,16 @@ UINT32 vgmplay_state::r32(int off) const return 0; } +UINT8 vgmplay_state::r8(int off) const +{ + if(off < int(m_file_data.size())) + return m_file_data[off]; + return 0; +} + void vgmplay_state::machine_start() { + //m_nescpu-> UINT32 size = 0; if(m_file->exists()) { size = m_file->length(); @@ -744,16 +916,22 @@ void vgmplay_state::machine_start() m_segapcm->set_unscaled_clock(r32(0x38)); if(version >= 0x151 && r32(0x40)) logerror("Warning: file requests an unsupported RF5C68\n"); - if(version >= 0x151 && r32(0x44)) - logerror("Warning: file requests an unsupported YM2203\n"); + if(version >= 0x151 && r32(0x44)) { + UINT32 clock = r32(0x44); + if (clock & 0x40000000) + clock &= ~0x40000000; + m_ym2203a->set_unscaled_clock(clock); + m_ym2203b->set_unscaled_clock(clock); + } if(version >= 0x151 && r32(0x48)) logerror("Warning: file requests an unsupported YM2608\n"); if(version >= 0x151 && r32(0x4c)) logerror("Warning: file requests an unsupported %s\n", r32(0x4c) & 0x80000000 ? "YM2610B" : "YM2610"); if(version >= 0x151 && r32(0x50)) logerror("Warning: file requests an unsupported YM3812\n"); - if(version >= 0x151 && r32(0x54)) - logerror("Warning: file requests an unsupported YM3526\n"); + if(version >= 0x151 && r32(0x54)) { + m_ym3526->set_unscaled_clock(r32(0x54)); + } if(version >= 0x151 && r32(0x58)) logerror("Warning: file requests an unsupported Y8950\n"); if(version >= 0x151 && r32(0x5c)) @@ -768,9 +946,54 @@ void vgmplay_state::machine_start() logerror("Warning: file requests an unsupported RF5C164\n"); if(version >= 0x151 && r32(0x70)) logerror("Warning: file requests an unsupported PWM\n"); - if(version >= 0x151 && r32(0x74)) - logerror("Warning: file requests an unsupported AY8910\n"); - } + if(version >= 0x151 && r32(0x74)) { + m_ay8910a->set_unscaled_clock(r32(0x74) & ~0x40000000); + m_ay8910b->set_unscaled_clock(r32(0x74) & ~0x40000000); + } + if(version >= 0x151 && r8(0x78)) { + UINT8 type = r8(0x78); + if (type & 0x10) + { + ay8910_device::set_psg_type(*m_ay8910a, ay8910_device::PSG_TYPE_YM); + ay8910_device::set_psg_type(*m_ay8910b, ay8910_device::PSG_TYPE_YM); + } + } + if(version >= 0x151 && r8(0x79)) { + UINT8 flags = r8(0x79); + UINT8 to_set = 0; + if (flags & 1) + to_set |= AY8910_LEGACY_OUTPUT; + if (flags & 2) + to_set |= AY8910_SINGLE_OUTPUT; + if (flags & 4) + to_set |= AY8910_DISCRETE_OUTPUT; + ay8910_device::set_flags(*m_ay8910a, to_set); + ay8910_device::set_flags(*m_ay8910b, to_set); + } + if(version >= 0x151 && r8(0x7a)) { + UINT8 flags = r8(0x7a); + UINT8 to_set = 0; + if (flags & 1) + to_set |= AY8910_LEGACY_OUTPUT; + if (flags & 2) + to_set |= AY8910_SINGLE_OUTPUT; + if (flags & 4) + to_set |= AY8910_DISCRETE_OUTPUT; + ay8910_device::set_flags(*m_ym2203a, to_set); + ay8910_device::set_flags(*m_ym2203b, to_set); + } + if(version >= 0x161 && r32(0x80)) { + m_dmg->set_unscaled_clock(r32(0x80)); + } + if(version >= 0x161 && r32(0x84)) { + m_nescpu->set_unscaled_clock(r32(0x84)); + m_nescpu->m_apu->set_unscaled_clock(r32(0x84)); + } + if(version >= 0x161 && r32(0x88)) { + m_multipcma->set_unscaled_clock(r32(0x88) &~ 0x40000000); + m_multipcmb->set_unscaled_clock(r32(0x88) &~ 0x40000000); + } + } } READ8_MEMBER(vgmplay_state::file_r) @@ -785,7 +1008,43 @@ READ8_MEMBER(vgmplay_state::file_size_r) UINT32 size = m_file_data.size(); return size >> (8*offset); } - + +WRITE8_MEMBER(vgmplay_state::multipcm_bank_hi_a_w) +{ + if (offset & 1) + m_multipcma_bank_l = (m_multipcma_bank_l & 0xff) | (data << 16); + if (offset & 2) + m_multipcma_bank_r = (m_multipcma_bank_r & 0xff) | (data << 16); +} + +WRITE8_MEMBER(vgmplay_state::multipcm_bank_lo_a_w) +{ + if (offset & 1) + m_multipcma_bank_l = (m_multipcma_bank_l & 0xff00) | data; + if (offset & 2) + m_multipcma_bank_r = (m_multipcma_bank_r & 0xff00) | data; + + m_multipcma->set_bank(m_multipcma_bank_l << 16, m_multipcma_bank_r << 16); +} + +WRITE8_MEMBER(vgmplay_state::multipcm_bank_hi_b_w) +{ + if (offset & 1) + m_multipcmb_bank_l = (m_multipcmb_bank_l & 0xff) | (data << 16); + if (offset & 2) + m_multipcmb_bank_r = (m_multipcmb_bank_r & 0xff) | (data << 16); +} + +WRITE8_MEMBER(vgmplay_state::multipcm_bank_lo_b_w) +{ + if (offset & 1) + m_multipcmb_bank_l = (m_multipcmb_bank_l & 0xff00) | data; + if (offset & 2) + m_multipcmb_bank_r = (m_multipcmb_bank_r & 0xff00) | data; + + m_multipcmb->set_bank(m_multipcmb_bank_l << 16, m_multipcmb_bank_r << 16); +} + static INPUT_PORTS_START( vgmplay ) INPUT_PORTS_END @@ -794,19 +1053,53 @@ static ADDRESS_MAP_START( file_map, AS_PROGRAM, 8, vgmplay_state ) ADDRESS_MAP_END static ADDRESS_MAP_START( soundchips_map, AS_IO, 8, vgmplay_state ) - AM_RANGE(vgmplay_device::REG_SIZE, vgmplay_device::REG_SIZE+3) AM_READ(file_size_r) - AM_RANGE(vgmplay_device::A_YM2612, vgmplay_device::A_YM2612+3) AM_DEVREADWRITE("ym2612", ym2612_device, read, write) - AM_RANGE(vgmplay_device::A_YM2151, vgmplay_device::A_YM2151+1) AM_DEVREADWRITE("ym2151", ym2151_device, read, write) - AM_RANGE(vgmplay_device::A_YM2413, vgmplay_device::A_YM2413+1) AM_DEVWRITE ("ym2413", ym2413_device, write) -// AM_RANGE(vgmplay_device::A_SN76496+0, vgmplay_device::A_SN76496+0) AM_DEVWRITE ("sn76496", sn76496_device, stereo_w) - AM_RANGE(vgmplay_device::A_SN76496+1, vgmplay_device::A_SN76496+1) AM_DEVWRITE ("sn76496", sn76496_device, write) - AM_RANGE(vgmplay_device::A_SEGAPCM, vgmplay_device::A_SEGAPCM+0x7ff) AM_DEVREADWRITE("segapcm", segapcm_device, sega_pcm_r, sega_pcm_w) + AM_RANGE(vgmplay_device::REG_SIZE, vgmplay_device::REG_SIZE+3) AM_READ(file_size_r) + AM_RANGE(vgmplay_device::A_YM2612, vgmplay_device::A_YM2612+3) AM_DEVREADWRITE("ym2612", ym2612_device, read, write) + AM_RANGE(vgmplay_device::A_YM2151, vgmplay_device::A_YM2151+1) AM_DEVREADWRITE("ym2151", ym2151_device, read, write) + AM_RANGE(vgmplay_device::A_YM2413, vgmplay_device::A_YM2413+1) AM_DEVWRITE ("ym2413", ym2413_device, write) + AM_RANGE(vgmplay_device::A_YM2203A, vgmplay_device::A_YM2203A+1) AM_DEVREADWRITE("ym2203a", ym2203_device, read, write) + AM_RANGE(vgmplay_device::A_YM2203B, vgmplay_device::A_YM2203B+1) AM_DEVREADWRITE("ym2203b", ym2203_device, read, write) + AM_RANGE(vgmplay_device::A_YM3526, vgmplay_device::A_YM3526+1) AM_DEVWRITE ("ym3526", ym3526_device, write) + AM_RANGE(vgmplay_device::A_AY8910A, vgmplay_device::A_AY8910A) AM_DEVWRITE ("ay8910a", ay8910_device, data_w) + AM_RANGE(vgmplay_device::A_AY8910A+1, vgmplay_device::A_AY8910A+1) AM_DEVWRITE ("ay8910a", ay8910_device, address_w) + AM_RANGE(vgmplay_device::A_AY8910B, vgmplay_device::A_AY8910B) AM_DEVWRITE ("ay8910b", ay8910_device, data_w) + AM_RANGE(vgmplay_device::A_AY8910B+1, vgmplay_device::A_AY8910B+1) AM_DEVWRITE ("ay8910b", ay8910_device, address_w) +// AM_RANGE(vgmplay_device::A_SN76496+0, vgmplay_device::A_SN76496+0) AM_DEVWRITE ("sn76496", sn76496_device, stereo_w) + AM_RANGE(vgmplay_device::A_SN76496+1, vgmplay_device::A_SN76496+1) AM_DEVWRITE ("sn76496", sn76496_device, write) + AM_RANGE(vgmplay_device::A_K053260, vgmplay_device::A_K053260+0x2f) AM_DEVWRITE ("k053260", k053260_device, write) + AM_RANGE(vgmplay_device::A_SEGAPCM, vgmplay_device::A_SEGAPCM+0x7ff) AM_DEVREADWRITE("segapcm", segapcm_device, sega_pcm_r, sega_pcm_w) + AM_RANGE(vgmplay_device::A_GAMEBOY, vgmplay_device::A_GAMEBOY+0x16) AM_DEVREADWRITE("dmg", gameboy_sound_device, sound_r, sound_w) + AM_RANGE(vgmplay_device::A_GAMEBOY+0x20, vgmplay_device::A_GAMEBOY+0x2f) AM_DEVREADWRITE("dmg", gameboy_sound_device, wave_r, wave_w) + AM_RANGE(vgmplay_device::A_NESAPU, vgmplay_device::A_NESAPU+0x1f) AM_DEVREADWRITE("nescpu:nesapu", nesapu_device, read, write) + AM_RANGE(vgmplay_device::A_NESRAM, vgmplay_device::A_NESRAM+0xffff) AM_RAM AM_SHARE("nesapu_ram") + AM_RANGE(vgmplay_device::A_MULTIPCMA, vgmplay_device::A_MULTIPCMA+3) AM_DEVREADWRITE("multipcma", multipcm_device, read, write ) + AM_RANGE(vgmplay_device::A_MULTIPCMA+4, vgmplay_device::A_MULTIPCMA+7) AM_WRITE(multipcm_bank_hi_a_w) + AM_RANGE(vgmplay_device::A_MULTIPCMA+8, vgmplay_device::A_MULTIPCMA+11) AM_WRITE(multipcm_bank_lo_a_w) + AM_RANGE(vgmplay_device::A_MULTIPCMB, vgmplay_device::A_MULTIPCMB+3) AM_DEVREADWRITE("multipcmb", multipcm_device, read, write ) + AM_RANGE(vgmplay_device::A_MULTIPCMB+4, vgmplay_device::A_MULTIPCMB+7) AM_WRITE(multipcm_bank_hi_b_w) + AM_RANGE(vgmplay_device::A_MULTIPCMB+8, vgmplay_device::A_MULTIPCMB+11) AM_WRITE(multipcm_bank_lo_b_w) ADDRESS_MAP_END static ADDRESS_MAP_START( segapcm_map, AS_0, 8, vgmplay_state ) AM_RANGE(0, 0x1fffff) AM_DEVREAD("vgmplay", vgmplay_device, segapcm_rom_r) ADDRESS_MAP_END +static ADDRESS_MAP_START( multipcma_map, AS_0, 8, vgmplay_state ) + AM_RANGE(0, 0x3fffff) AM_DEVREAD("vgmplay", vgmplay_device, multipcma_rom_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( multipcmb_map, AS_0, 8, vgmplay_state ) + AM_RANGE(0, 0x3fffff) AM_DEVREAD("vgmplay", vgmplay_device, multipcmb_rom_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( k053260_map, AS_0, 8, vgmplay_state ) + AM_RANGE(0, 0x1fffff) AM_DEVREAD("vgmplay", vgmplay_device, k053260_rom_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( nescpu_map, AS_PROGRAM, 8, vgmplay_state ) + AM_RANGE(0x0000, 0xffff) AM_RAM AM_SHARE("nesapu_ram") +ADDRESS_MAP_END + static MACHINE_CONFIG_START( vgmplay, vgmplay_state ) MCFG_CPU_ADD("vgmplay", VGMPLAY, 44100) MCFG_CPU_PROGRAM_MAP( file_map ) @@ -815,6 +1108,7 @@ static MACHINE_CONFIG_START( vgmplay, vgmplay_state ) MCFG_DEVICE_ADD("file", BITBANGER, 0) MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") + MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("ym2612", YM2612, 7670454) MCFG_SOUND_ROUTE(0, "lspeaker", 1) @@ -837,6 +1131,51 @@ static MACHINE_CONFIG_START( vgmplay, vgmplay_state ) MCFG_DEVICE_ADDRESS_MAP(AS_0, segapcm_map) MCFG_SOUND_ROUTE(0, "lspeaker", 1) MCFG_SOUND_ROUTE(1, "rspeaker", 1) + + MCFG_SOUND_ADD("multipcma", MULTIPCM, 8000000) + MCFG_DEVICE_ADDRESS_MAP(AS_0, multipcma_map) + MCFG_SOUND_ROUTE(0, "lspeaker", 1) + MCFG_SOUND_ROUTE(1, "rspeaker", 1) + + MCFG_SOUND_ADD("multipcmb", MULTIPCM, 8000000) + MCFG_DEVICE_ADDRESS_MAP(AS_0, multipcmb_map) + MCFG_SOUND_ROUTE(0, "lspeaker", 1) + MCFG_SOUND_ROUTE(1, "rspeaker", 1) + + MCFG_SOUND_ADD("dmg", GAMEBOY, 0) + MCFG_SOUND_ROUTE(0, "lspeaker", 1) + MCFG_SOUND_ROUTE(1, "rspeaker", 1) + + MCFG_SOUND_ADD("ay8910a", AY8910, 1500000) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1) + + MCFG_SOUND_ADD("ay8910b", AY8910, 1500000) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1) + + MCFG_SOUND_ADD("ym2203a", YM2203, 4000000) + MCFG_SOUND_ROUTE(0, "mono", 0.25) + MCFG_SOUND_ROUTE(1, "mono", 0.25) + MCFG_SOUND_ROUTE(2, "mono", 0.25) + MCFG_SOUND_ROUTE(3, "mono", 0.25) + + MCFG_SOUND_ADD("ym2203b", YM2203, 4000000) + MCFG_SOUND_ROUTE(0, "mono", 0.25) + MCFG_SOUND_ROUTE(1, "mono", 0.25) + MCFG_SOUND_ROUTE(2, "mono", 0.25) + MCFG_SOUND_ROUTE(3, "mono", 0.25) + + MCFG_SOUND_ADD("ym3526", YM3526, 4000000) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1) + + MCFG_CPU_ADD("nescpu", N2A03, 1000000) + MCFG_CPU_PROGRAM_MAP(nescpu_map) + MCFG_DEVICE_DISABLE() + + MCFG_K053260_ADD("k053260", 3579545) + MCFG_DEVICE_ADDRESS_MAP(AS_0, k053260_map) + MCFG_SOUND_ROUTE(0, "lspeaker", 0.75) + MCFG_SOUND_ROUTE(1, "rspeaker", 0.75) MACHINE_CONFIG_END ROM_START( vgmplay )