diff options
author | smf- <smf-@users.noreply.github.com> | 2018-09-26 10:16:29 +0100 |
---|---|---|
committer | smf- <smf-@users.noreply.github.com> | 2018-09-26 12:02:18 +0100 |
commit | 1c9aa4917782c5f3edf126b6a0bce598b44d59fd (patch) | |
tree | 240bd7df6c562de2f251c04a4daf854c83bc0474 | |
parent | 48c2597d658173fedf927e9f5595f26f182c3786 (diff) |
VGMPLAY: Support extra clocks in extended header, for cases like Super Locomotive that has two chips with different clock speeds. [smf]
-rw-r--r-- | src/mame/drivers/vgmplay.cpp | 1025 |
1 files changed, 511 insertions, 514 deletions
diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp index e3ef4814be5..ca168193182 100644 --- a/src/mame/drivers/vgmplay.cpp +++ b/src/mame/drivers/vgmplay.cpp @@ -78,14 +78,61 @@ public: virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; }; +enum vgm_chip +{ + CT_SN76489 = 0, + CT_YM2413, + CT_YM2612, + CT_YM2151, + CT_SEGAPCM, + CT_RF5C68, + CT_YM2203, + CT_YM2608, + CT_YM2610, + CT_YM3812, + CT_YM3526, + CT_Y8950, + CT_YMF262, + CT_YMF278B, + CT_YMF271, + CT_YMZ280B, + CT_RF5C164, + CT_SEGA32X, + CT_AY8910, + CT_GAMEBOY, + CT_NESAPU, + CT_MULTIPCM, + CT_UPD7759, + CT_OKIM6258, + CT_OKIM6295, + CT_K051649, + CT_K054539, + CT_C6280, + CT_C140, + CT_K053260, + CT_POKEY, + CT_QSOUND, + CT_SCSP, + CT_WSWAN, + CT_VSU_VUE, + CT_SAA1099, + CT_ES5503, + CT_ES5505, + CT_X1_010, + CT_C352, + CT_GA20, + + CT_COUNT, +}; + class vgmplay_device : public cpu_device { public: enum io8_t { REG_SIZE = 0xff000000, - A_SN76496_0 = 0x00000000, - A_SN76496_1 = 0x80000000, + A_SN76489_0 = 0x00000000, + A_SN76489_1 = 0x80000000, A_YM2413_0 = 0x01000000, A_YM2413_1 = 0x81000000, A_YM2612_0 = 0x02000000, @@ -190,34 +237,34 @@ public: virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; - template<int Chip> DECLARE_READ8_MEMBER(segapcm_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(ym2608_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(ym2610_adpcm_a_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(ym2610_adpcm_b_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(y8950_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(ymf278b_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(ymf271_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(ymz280b_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(multipcm_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(upd7759_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(okim6295_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(k054539_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(c140_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(k053260_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(qsound_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(es5505_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(x1_010_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(c352_rom_r); - template<int Chip> DECLARE_READ8_MEMBER(ga20_rom_r); - - template<int Chip> DECLARE_WRITE8_MEMBER(multipcm_bank_hi_w); - template<int Chip> DECLARE_WRITE8_MEMBER(multipcm_bank_lo_w); - - template<int Chip> DECLARE_WRITE8_MEMBER(upd7759_bank_w); - - template<int Chip> DECLARE_WRITE8_MEMBER(okim6295_nmk112_enable_w); - template<int Chip> DECLARE_WRITE8_MEMBER(okim6295_bank_w); - template<int Chip> DECLARE_WRITE8_MEMBER(okim6295_nmk112_bank_w); + template<int Index> DECLARE_READ8_MEMBER(segapcm_rom_r); + template<int Index> DECLARE_READ8_MEMBER(ym2608_rom_r); + template<int Index> DECLARE_READ8_MEMBER(ym2610_adpcm_a_rom_r); + template<int Index> DECLARE_READ8_MEMBER(ym2610_adpcm_b_rom_r); + template<int Index> DECLARE_READ8_MEMBER(y8950_rom_r); + template<int Index> DECLARE_READ8_MEMBER(ymf278b_rom_r); + template<int Index> DECLARE_READ8_MEMBER(ymf271_rom_r); + template<int Index> DECLARE_READ8_MEMBER(ymz280b_rom_r); + template<int Index> DECLARE_READ8_MEMBER(multipcm_rom_r); + template<int Index> DECLARE_READ8_MEMBER(upd7759_rom_r); + template<int Index> DECLARE_READ8_MEMBER(okim6295_rom_r); + template<int Index> DECLARE_READ8_MEMBER(k054539_rom_r); + template<int Index> DECLARE_READ8_MEMBER(c140_rom_r); + template<int Index> DECLARE_READ8_MEMBER(k053260_rom_r); + template<int Index> DECLARE_READ8_MEMBER(qsound_rom_r); + template<int Index> DECLARE_READ8_MEMBER(es5505_rom_r); + template<int Index> DECLARE_READ8_MEMBER(x1_010_rom_r); + template<int Index> DECLARE_READ8_MEMBER(c352_rom_r); + template<int Index> DECLARE_READ8_MEMBER(ga20_rom_r); + + template<int Index> DECLARE_WRITE8_MEMBER(multipcm_bank_hi_w); + template<int Index> DECLARE_WRITE8_MEMBER(multipcm_bank_lo_w); + + template<int Index> DECLARE_WRITE8_MEMBER(upd7759_bank_w); + + template<int Index> DECLARE_WRITE8_MEMBER(okim6295_nmk112_enable_w); + template<int Index> DECLARE_WRITE8_MEMBER(okim6295_bank_w); + template<int Index> DECLARE_WRITE8_MEMBER(okim6295_nmk112_bank_w); void stop(); void pause(); @@ -232,56 +279,9 @@ protected: private: enum { ACT_LED_PERSIST_MS = 100 }; - enum act_led - { - LED_SN76496 = 0, - LED_YM2413, - LED_YM2612, - LED_YM2151, - LED_SEGAPCM, - LED_RF5C68, - LED_YM2203, - LED_YM2608, - LED_YM2610, - LED_YM3812, - LED_YM3526, - LED_Y8950, - LED_YMF262, - LED_YMF278B, - LED_YMF271, - LED_YMZ280B, - LED_RF5C164, - LED_32X_PWM, - LED_AY8910, - LED_GAMEBOY, - LED_NESAPU, - LED_MULTIPCM, - LED_UPD7759, - LED_OKIM6258, - LED_OKIM6295, - LED_K051649, - LED_K054539, - LED_C6280, - LED_C140, - LED_K053260, - LED_POKEY, - LED_QSOUND, - LED_SCSP, - LED_WSWAN, - LED_VSU_VUE, - LED_SAA1099, - LED_ES5503, - LED_ES5505, - LED_X1_010, - LED_C352, - LED_GA20, - - LED_COUNT - }; - enum { RESET, RUN, DONE }; - using led_expiry = std::pair<act_led, attotime>; + using led_expiry = std::pair<vgm_chip, attotime>; using led_expiry_list = std::list<led_expiry>; using led_expiry_iterator = led_expiry_list::iterator; @@ -301,7 +301,7 @@ private: uint32_t position; emu_timer *timer; // stream control - act_led chip_type; + vgm_chip chip_type; uint8_t port; uint8_t reg; // stream data @@ -321,15 +321,15 @@ private: stream m_streams[0xff]; - void pulse_act_led(act_led led); + void pulse_act_led(vgm_chip led); TIMER_CALLBACK_MEMBER(act_led_expired); - uint8_t rom_r(int chip, uint8_t type, offs_t offset); + uint8_t rom_r(int index, uint8_t type, offs_t offset); uint32_t handle_data_block(uint32_t address); uint32_t handle_pcm_write(uint32_t address); void blocks_clear(); - output_finder<LED_COUNT> m_act_leds; + output_finder<CT_COUNT> m_act_leds; led_expiry_list m_act_led_expiries; std::unique_ptr<led_expiry_iterator[]> m_act_led_index; led_expiry_iterator m_act_led_off; @@ -405,51 +405,51 @@ public: DECLARE_READ8_MEMBER(file_size_r); DECLARE_INPUT_CHANGED_MEMBER(key_pressed); - template<int Chip> DECLARE_WRITE8_MEMBER(upd7759_reset_w); - template<int Chip> DECLARE_WRITE8_MEMBER(upd7759_data_w); - template<int Chip> DECLARE_WRITE_LINE_MEMBER(upd7759_drq_w); - template<int Chip> DECLARE_WRITE8_MEMBER(okim6258_clock_w); - template<int Chip> DECLARE_WRITE8_MEMBER(okim6258_divider_w); - template<int Chip> DECLARE_WRITE8_MEMBER(okim6295_clock_w); - template<int Chip> DECLARE_WRITE8_MEMBER(okim6295_pin7_w); - template<int Chip> DECLARE_WRITE8_MEMBER(scc_w); + template<int Index> DECLARE_WRITE8_MEMBER(upd7759_reset_w); + template<int Index> DECLARE_WRITE8_MEMBER(upd7759_data_w); + template<int Index> DECLARE_WRITE_LINE_MEMBER(upd7759_drq_w); + template<int Index> DECLARE_WRITE8_MEMBER(okim6258_clock_w); + template<int Index> DECLARE_WRITE8_MEMBER(okim6258_divider_w); + template<int Index> DECLARE_WRITE8_MEMBER(okim6295_clock_w); + template<int Index> DECLARE_WRITE8_MEMBER(okim6295_pin7_w); + template<int Index> DECLARE_WRITE8_MEMBER(scc_w); void vgmplay(machine_config &config); void file_map(address_map &map); void soundchips_map(address_map &map); void soundchips16_map(address_map &map); - template<int Chip> void segapcm_map(address_map &map); - template<int Chip> void rf5c68_map(address_map &map); - template<int Chip> void ym2608_map(address_map &map); - template<int Chip> void ym2610_adpcm_a_map(address_map &map); - template<int Chip> void ym2610_adpcm_b_map(address_map &map); - template<int Chip> void y8950_map(address_map &map); - template<int Chip> void ymf278b_map(address_map &map); - template<int Chip> void ymf271_map(address_map &map); - template<int Chip> void ymz280b_map(address_map &map); - template<int Chip> void rf5c164_map(address_map &map); - template<int Chip> void nescpu_map(address_map &map); - template<int Chip> void multipcm_map(address_map &map); - template<int Chip> void upd7759_map(address_map &map); - template<int Chip> void okim6295_map(address_map &map); - template<int Chip> void k054539_map(address_map &map); - template<int Chip> void c140_map(address_map &map); - template<int Chip> void k053260_map(address_map &map); - template<int Chip> void qsound_map(address_map &map); - template<int Chip> void scsp_map(address_map &map); - template<int Chip> void wswan_map(address_map &map); - template<int Chip> void es5503_map(address_map &map); - template<int Chip> void es5505_map(address_map &map); - template<int Chip> void x1_010_map(address_map &map); - template<int Chip> void c352_map(address_map &map); - template<int Chip> void ga20_map(address_map &map); + template<int Index> void segapcm_map(address_map &map); + template<int Index> void rf5c68_map(address_map &map); + template<int Index> void ym2608_map(address_map &map); + template<int Index> void ym2610_adpcm_a_map(address_map &map); + template<int Index> void ym2610_adpcm_b_map(address_map &map); + template<int Index> void y8950_map(address_map &map); + template<int Index> void ymf278b_map(address_map &map); + template<int Index> void ymf271_map(address_map &map); + template<int Index> void ymz280b_map(address_map &map); + template<int Index> void rf5c164_map(address_map &map); + template<int Index> void nescpu_map(address_map &map); + template<int Index> void multipcm_map(address_map &map); + template<int Index> void upd7759_map(address_map &map); + template<int Index> void okim6295_map(address_map &map); + template<int Index> void k054539_map(address_map &map); + template<int Index> void c140_map(address_map &map); + template<int Index> void k053260_map(address_map &map); + template<int Index> void qsound_map(address_map &map); + template<int Index> void scsp_map(address_map &map); + template<int Index> void wswan_map(address_map &map); + template<int Index> void es5503_map(address_map &map); + template<int Index> void es5505_map(address_map &map); + template<int Index> void x1_010_map(address_map &map); + template<int Index> void c352_map(address_map &map); + template<int Index> void ga20_map(address_map &map); private: std::vector<uint8_t> m_file_data; required_device<vgmplay_device> m_vgmplay; required_device<speaker_device> m_lspeaker; required_device<speaker_device> m_rspeaker; - required_device_array<sn76496_device, 2> m_sn76496; + required_device_array<sn76489_device, 2> m_sn76489; required_device_array<ym2413_device, 2> m_ym2413; required_device_array<ym2612_device, 2> m_ym2612; required_device_array<ym2151_device, 2> m_ym2151; @@ -491,9 +491,7 @@ private: required_device_array<c352_device, 2> m_c352; required_device_array<iremga20_device, 2> m_ga20; - uint32_t m_okim6258_clock[2]; uint8_t m_okim6258_divider[2]; - uint32_t m_okim6295_clock[2]; uint8_t m_okim6295_pin7[2]; uint8_t m_scc_reg[2]; @@ -523,8 +521,8 @@ void vgmplay_device::device_start() m_io16 = &space(AS_IO16); m_act_leds.resolve(); - m_act_led_index = std::make_unique<led_expiry_iterator[]>(LED_COUNT); - for (act_led led = act_led(0); LED_COUNT != led; led = act_led(led + 1)) + m_act_led_index = std::make_unique<led_expiry_iterator[]>(CT_COUNT); + for (vgm_chip led = vgm_chip(0); led != CT_COUNT; led = vgm_chip(led + 1)) m_act_led_index[led] = m_act_led_expiries.emplace(m_act_led_expiries.end(), led, attotime::never); m_act_led_off = m_act_led_expiries.begin(); m_act_led_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(vgmplay_device::act_led_expired), this)); @@ -551,7 +549,7 @@ void vgmplay_device::device_reset() for (int i = 0; i < 0xff; i++) { stream& s(m_streams[i]); - s.chip_type = act_led(0xff); + s.chip_type = vgm_chip(0xff); s.bank = 0xff; s.frequency = 0; s.timer->enable(false); @@ -564,7 +562,7 @@ void vgmplay_device::device_reset() m_c6280_channel[1] = 0; } -void vgmplay_device::pulse_act_led(act_led led) +void vgmplay_device::pulse_act_led(vgm_chip led) { m_act_leds[led] = 1; @@ -871,28 +869,28 @@ TIMER_CALLBACK_MEMBER(vgmplay_device::stream_timer_expired) osd_printf_error("stream_timer_expired %02x: stream beyond end %d/%d %u>=%u\n", param, s.position, s.length, offset, uint32_t(m_data_streams[s.bank].size())); s.timer->enable(false); } - else if (s.chip_type == LED_SN76496) + else if (s.chip_type == CT_SN76489) { - m_io->write_byte(A_SN76496_0, (s.reg & 0xf0) | (m_data_streams[s.bank][offset] & 0xf)); + m_io->write_byte(A_SN76489_0, (s.reg & 0xf0) | (m_data_streams[s.bank][offset] & 0xf)); if ((s.reg & 0x10) == 0) - m_io->write_byte(A_SN76496_0, ((m_data_streams[s.bank][offset + 1] & 3) << 4) | (m_data_streams[s.bank][offset] >> 4)); + m_io->write_byte(A_SN76489_0, ((m_data_streams[s.bank][offset + 1] & 3) << 4) | (m_data_streams[s.bank][offset] >> 4)); } - else if (s.chip_type == LED_YM2612) + else if (s.chip_type == CT_YM2612) { m_io->write_byte(A_YM2612_0 + 0 + ((s.port & 1) << 1), s.reg); m_io->write_byte(A_YM2612_0 + 1 + ((s.port & 1) << 1), m_data_streams[s.bank][offset]); } - else if (s.chip_type == LED_YM2203) + else if (s.chip_type == CT_YM2203) { m_io->write_byte(A_YM2203_0 + 0 + ((s.port & 1) << 1), s.reg); m_io->write_byte(A_YM2203_0 + 1 + ((s.port & 1) << 1), m_data_streams[s.bank][offset]); } - else if (s.chip_type == LED_YM2608) + else if (s.chip_type == CT_YM2608) { m_io->write_byte(A_YM2608_0 + 0 + ((s.port & 1) << 1), s.reg); m_io->write_byte(A_YM2608_0 + 1 + ((s.port & 1) << 1), m_data_streams[s.bank][offset]); } - else if (s.chip_type == LED_32X_PWM) + else if (s.chip_type == CT_SEGA32X) { if (m_sega32x_channel_hack >= 0) { @@ -904,7 +902,7 @@ TIMER_CALLBACK_MEMBER(vgmplay_device::stream_timer_expired) m_io16->write_word(A_32X_PWM + (s.reg << 1), ((m_data_streams[s.bank][offset + 1] & 0xf) << 8) | m_data_streams[s.bank][offset]); } - else if (s.chip_type == LED_C6280) + else if (s.chip_type == CT_C6280) { if (s.port != 0xff) m_io->write_byte(A_C6280_0 + (s.reg >> 4), s.port); @@ -914,7 +912,7 @@ TIMER_CALLBACK_MEMBER(vgmplay_device::stream_timer_expired) if (s.port != 0xff && s.port != m_c6280_channel[0]) m_io->write_byte(A_C6280_0 + (s.reg >> 4), m_c6280_channel[0]); } - else if (s.chip_type == LED_OKIM6258) + else if (s.chip_type == CT_OKIM6258) m_io->write_byte(A_OKIM6258_0 + s.reg, m_data_streams[s.bank][offset]); else { @@ -988,31 +986,31 @@ void vgmplay_device::execute_run() switch (code) { case 0x30: - pulse_act_led(LED_SN76496); - m_io->write_byte(A_SN76496_1 + 0, m_file->read_byte(m_pc + 1)); + pulse_act_led(CT_SN76489); + m_io->write_byte(A_SN76489_1 + 0, m_file->read_byte(m_pc + 1)); m_pc += 2; break; case 0x3f: - pulse_act_led(LED_SN76496); - m_io->write_byte(A_SN76496_1 + 1, m_file->read_byte(m_pc + 1)); + pulse_act_led(CT_SN76489); + m_io->write_byte(A_SN76489_1 + 1, m_file->read_byte(m_pc + 1)); m_pc += 2; break; case 0x4f: - pulse_act_led(LED_SN76496); - m_io->write_byte(A_SN76496_0 + 1, m_file->read_byte(m_pc + 1)); + pulse_act_led(CT_SN76489); + m_io->write_byte(A_SN76489_0 + 1, m_file->read_byte(m_pc + 1)); m_pc += 2; break; case 0x50: - pulse_act_led(LED_SN76496); - m_io->write_byte(A_SN76496_0 + 0, m_file->read_byte(m_pc + 1)); + pulse_act_led(CT_SN76489); + m_io->write_byte(A_SN76489_0 + 0, m_file->read_byte(m_pc + 1)); m_pc += 2; break; case 0x51: - pulse_act_led(LED_YM2413); + pulse_act_led(CT_YM2413); m_io->write_byte(A_YM2413_0 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM2413_0 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; @@ -1020,21 +1018,21 @@ void vgmplay_device::execute_run() case 0x52: case 0x53: - pulse_act_led(LED_YM2612); + pulse_act_led(CT_YM2612); m_io->write_byte(A_YM2612_0 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM2612_0 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x54: - pulse_act_led(LED_YM2151); + pulse_act_led(CT_YM2151); m_io->write_byte(A_YM2151_0 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM2151_0 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x55: - pulse_act_led(LED_YM2203); + pulse_act_led(CT_YM2203); m_io->write_byte(A_YM2203_0 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM2203_0 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; @@ -1042,7 +1040,7 @@ void vgmplay_device::execute_run() case 0x56: case 0x57: - pulse_act_led(LED_YM2608); + pulse_act_led(CT_YM2608); m_io->write_byte(A_YM2608_0 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM2608_0 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); m_pc += 3; @@ -1050,35 +1048,35 @@ void vgmplay_device::execute_run() case 0x58: case 0x59: - pulse_act_led(LED_YM2610); + pulse_act_led(CT_YM2610); m_io->write_byte(A_YM2610_0 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM2610_0 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x5a: - pulse_act_led(LED_YM3812); + pulse_act_led(CT_YM3812); m_io->write_byte(A_YM3812_0 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM3812_0 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x5b: - pulse_act_led(LED_YM3526); + pulse_act_led(CT_YM3526); m_io->write_byte(A_YM3526_0 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM3526_0 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x5c: - pulse_act_led(LED_Y8950); + pulse_act_led(CT_Y8950); m_io->write_byte(A_Y8950_0 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_Y8950_0 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0x5d: - pulse_act_led(LED_YMZ280B); + pulse_act_led(CT_YMZ280B); m_io->write_byte(A_YMZ280B_0 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YMZ280B_0 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; @@ -1086,7 +1084,7 @@ void vgmplay_device::execute_run() case 0x5e: case 0x5f: - pulse_act_led(LED_YMF262); + pulse_act_led(CT_YMF262); m_io->write_byte(A_YMF262_0 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YMF262_0 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); m_pc += 3; @@ -1145,7 +1143,7 @@ void vgmplay_device::execute_run() case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f: - pulse_act_led(LED_YM2612); + pulse_act_led(CT_YM2612); if (!m_data_streams[0].empty()) { if (m_ym2612_stream_offset >= int(m_data_streams[0].size())) @@ -1168,11 +1166,11 @@ void vgmplay_device::execute_run() { stream& s(m_streams[id]); - s.chip_type = act_led(m_file->read_byte(m_pc + 2)); + s.chip_type = vgm_chip(m_file->read_byte(m_pc + 2)); s.port = m_file->read_byte(m_pc + 3); s.reg = m_file->read_byte(m_pc + 4); - s.byte_depth = ((s.chip_type == LED_SN76496 && (s.reg & 0x10) == 0) || s.chip_type == LED_32X_PWM) ? 2 : 1; + s.byte_depth = ((s.chip_type == CT_SN76489 && (s.reg & 0x10) == 0) || s.chip_type == CT_SEGA32X) ? 2 : 1; if (s.timer->enabled()) { @@ -1245,7 +1243,7 @@ void vgmplay_device::execute_run() uint8_t id = m_file->read_byte(m_pc + 1); if (id == 0xff) osd_printf_error("stream start invalid id\n"); - else if (m_streams[id].chip_type >= LED_COUNT) + else if (m_streams[id].chip_type >= CT_COUNT) osd_printf_error("stream start %02x invalid chip type %02x\n", id, m_streams[id].chip_type); else { @@ -1310,7 +1308,7 @@ void vgmplay_device::execute_run() uint8_t id = m_file->read_byte(m_pc + 1); if (id == 0xff) osd_printf_error("stream start short invalid id\n"); - else if (m_streams[id].chip_type >= LED_COUNT) + else if (m_streams[id].chip_type >= CT_COUNT) osd_printf_error("stream start short %02x invalid chip type %02x\n", id, m_streams[id].chip_type); else { @@ -1344,7 +1342,7 @@ void vgmplay_device::execute_run() case 0xa0: { - pulse_act_led(LED_AY8910); + pulse_act_led(CT_AY8910); uint8_t reg = m_file->read_byte(m_pc + 1); if (reg & 0x80) { @@ -1361,7 +1359,7 @@ void vgmplay_device::execute_run() } case 0xa1: - pulse_act_led(LED_YM2413); + pulse_act_led(CT_YM2413); m_io->write_byte(A_YM2413_1 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM2413_1 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; @@ -1369,21 +1367,21 @@ void vgmplay_device::execute_run() case 0xa2: case 0xa3: - pulse_act_led(LED_YM2612); + pulse_act_led(CT_YM2612); m_io->write_byte(A_YM2612_1 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM2612_1 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0xa4: - pulse_act_led(LED_YM2151); + pulse_act_led(CT_YM2151); m_io->write_byte(A_YM2151_1 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM2151_1 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0xa5: - pulse_act_led(LED_YM2203); + pulse_act_led(CT_YM2203); m_io->write_byte(A_YM2203_1 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM2203_1 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; @@ -1391,7 +1389,7 @@ void vgmplay_device::execute_run() case 0xa6: case 0xa7: - pulse_act_led(LED_YM2608); + pulse_act_led(CT_YM2608); m_io->write_byte(A_YM2608_0 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM2608_0 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); m_pc += 3; @@ -1399,35 +1397,35 @@ void vgmplay_device::execute_run() case 0xa8: case 0xa9: - pulse_act_led(LED_YM2610); + pulse_act_led(CT_YM2610); m_io->write_byte(A_YM2610_0 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM2610_0 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0xaa: - pulse_act_led(LED_YM3812); + pulse_act_led(CT_YM3812); m_io->write_byte(A_YM3812_1 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM3812_1 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0xab: - pulse_act_led(LED_YM3526); + pulse_act_led(CT_YM3526); m_io->write_byte(A_YM3526_1 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YM3526_1 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0xac: - pulse_act_led(LED_Y8950); + pulse_act_led(CT_Y8950); m_io->write_byte(A_Y8950_1 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_Y8950_1 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0xad: - pulse_act_led(LED_YMZ280B); + pulse_act_led(CT_YMZ280B); m_io->write_byte(A_YMZ280B_1 + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YMZ280B_1 + 1, m_file->read_byte(m_pc + 2)); m_pc += 3; @@ -1435,27 +1433,27 @@ void vgmplay_device::execute_run() case 0xae: case 0xaf: - pulse_act_led(LED_YMF262); + pulse_act_led(CT_YMF262); m_io->write_byte(A_YMF262_1 + 0 + ((code & 1) << 1), m_file->read_byte(m_pc + 1)); m_io->write_byte(A_YMF262_1 + 1 + ((code & 1) << 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0xb0: - pulse_act_led(LED_RF5C68); + pulse_act_led(CT_RF5C68); m_io->write_byte(A_RF5C68 + m_file->read_byte(m_pc + 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0xb1: - pulse_act_led(LED_RF5C164); + pulse_act_led(CT_RF5C164); m_io->write_byte(A_RF5C164 + m_file->read_byte(m_pc + 1), m_file->read_byte(m_pc + 2)); m_pc += 3; break; case 0xb2: { - pulse_act_led(LED_32X_PWM); + pulse_act_led(CT_SEGA32X); uint8_t offset = m_file->read_byte(m_pc + 1); uint8_t data = m_file->read_byte(m_pc + 2); @@ -1486,7 +1484,7 @@ void vgmplay_device::execute_run() case 0xb3: { - pulse_act_led(LED_GAMEBOY); + pulse_act_led(CT_GAMEBOY); uint8_t reg = m_file->read_byte(m_pc + 1); if (reg & 0x80) m_io->write_byte(A_GAMEBOY_1 + (reg & 0x7f), m_file->read_byte(m_pc + 2)); @@ -1498,36 +1496,36 @@ void vgmplay_device::execute_run() case 0xb4: { - pulse_act_led(LED_NESAPU); + pulse_act_led(CT_NESAPU); uint8_t offset = m_file->read_byte(m_pc + 1); - int chip = offset & 0x80 ? 1 : 0; - if (m_nes_apu_channel_hack[chip] >= 0) + int index = offset & 0x80 ? 1 : 0; + if (m_nes_apu_channel_hack[index] >= 0) { if ((offset & 0x7f) == 0x15) { if ((m_file->read_byte(m_pc + 2) & 0x1f) != 0) - m_nes_apu_channel_hack[chip] = -1; + m_nes_apu_channel_hack[index] = -1; } else { - m_nes_apu_channel_hack[chip]++; - if (m_nes_apu_channel_hack[chip] == 32) + m_nes_apu_channel_hack[index]++; + if (m_nes_apu_channel_hack[index] == 32) { - osd_printf_error("bad rip detected, enabling nesapu.%d channels\n", chip); - if (chip) + osd_printf_error("bad rip detected, enabling nesapu.%d channels\n", index); + if (index) m_io->write_byte(A_NESAPU_1 + 0x15, 0x0f); else m_io->write_byte(A_NESAPU_0 + 0x15, 0x0f); - m_nes_apu_channel_hack[chip] = -2; + m_nes_apu_channel_hack[index] = -2; } } } - //else if ((offset & 0x7f) == 0x15 && m_nes_apu_channel_hack[chip] == -2 && (m_file->read_byte(m_pc + 2) & 0x1f) != 0) + //else if ((offset & 0x7f) == 0x15 && m_nes_apu_channel_hack[index] == -2 && (m_file->read_byte(m_pc + 2) & 0x1f) != 0) //{ - // osd_printf_error("bad rip false positive, late enabling nesapu.%d channels %x/%x\n", chip, m_pc, m_io->read_dword(REG_SIZE)); - // m_nes_apu_channel_hack[chip] = -1; + // osd_printf_error("bad rip false positive, late enabling nesapu.%d channels %x/%x\n", index, m_pc, m_io->read_dword(REG_SIZE)); + // m_nes_apu_channel_hack[index] = -1; //} if (offset & 0x80) @@ -1540,7 +1538,7 @@ void vgmplay_device::execute_run() case 0xb5: { - pulse_act_led(LED_MULTIPCM); + pulse_act_led(CT_MULTIPCM); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_MULTIPCM_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); @@ -1552,7 +1550,7 @@ void vgmplay_device::execute_run() case 0xb6: { - pulse_act_led(LED_UPD7759); + pulse_act_led(CT_UPD7759); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_UPD7759_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); @@ -1564,7 +1562,7 @@ void vgmplay_device::execute_run() case 0xb7: { - pulse_act_led(LED_OKIM6258); + pulse_act_led(CT_OKIM6258); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_OKIM6258_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); @@ -1576,7 +1574,7 @@ void vgmplay_device::execute_run() case 0xb8: { - pulse_act_led(LED_OKIM6295); + pulse_act_led(CT_OKIM6295); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_OKIM6295_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); @@ -1588,7 +1586,7 @@ void vgmplay_device::execute_run() case 0xb9: { - pulse_act_led(LED_C6280); + pulse_act_led(CT_C6280); uint8_t offset = m_file->read_byte(m_pc + 1); if ((offset & 0x7f) == 0) m_c6280_channel[BIT(offset, 7)] = m_file->read_byte(m_pc + 2); @@ -1602,7 +1600,7 @@ void vgmplay_device::execute_run() case 0xba: { - pulse_act_led(LED_K053260); + pulse_act_led(CT_K053260); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_K053260_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); @@ -1614,7 +1612,7 @@ void vgmplay_device::execute_run() case 0xbb: { - pulse_act_led(LED_POKEY); + pulse_act_led(CT_POKEY); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_POKEY_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); @@ -1626,7 +1624,7 @@ void vgmplay_device::execute_run() case 0xbc: { - pulse_act_led(LED_WSWAN); + pulse_act_led(CT_WSWAN); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_WSWAN_1 + (offset & 0x7f) + 0x80, m_file->read_byte(m_pc + 2)); @@ -1638,7 +1636,7 @@ void vgmplay_device::execute_run() case 0xbd: { - pulse_act_led(LED_SAA1099); + pulse_act_led(CT_SAA1099); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) { @@ -1656,7 +1654,7 @@ void vgmplay_device::execute_run() case 0xbe: { - pulse_act_led(LED_ES5505); + pulse_act_led(CT_ES5505); // TODO: es5505 m_pc += 3; break; @@ -1664,7 +1662,7 @@ void vgmplay_device::execute_run() case 0xbf: { - pulse_act_led(LED_GA20); + pulse_act_led(CT_GA20); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_GA20_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); @@ -1676,7 +1674,7 @@ void vgmplay_device::execute_run() case 0xc0: { - pulse_act_led(LED_SEGAPCM); + pulse_act_led(CT_SEGAPCM); uint16_t offset = m_file->read_word(m_pc + 1); if (offset & 0x8000) m_io->write_byte(A_SEGAPCM_1 + (offset & 0x7fff), m_file->read_byte(m_pc + 3)); @@ -1687,20 +1685,20 @@ void vgmplay_device::execute_run() } case 0xc1: - pulse_act_led(LED_RF5C68); + pulse_act_led(CT_RF5C68); m_io->write_byte(A_RF5C68_RAM + m_file->read_word(m_pc + 1), m_file->read_byte(m_pc + 3)); m_pc += 4; break; case 0xc2: - pulse_act_led(LED_RF5C164); + pulse_act_led(CT_RF5C164); m_io->write_byte(A_RF5C164_RAM + m_file->read_word(m_pc + 1), m_file->read_byte(m_pc + 3)); m_pc += 4; break; case 0xc3: { - pulse_act_led(LED_MULTIPCM); + pulse_act_led(CT_MULTIPCM); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) { @@ -1717,7 +1715,7 @@ void vgmplay_device::execute_run() } case 0xc4: - pulse_act_led(LED_QSOUND); + pulse_act_led(CT_QSOUND); m_io->write_byte(A_QSOUND + 0, m_file->read_byte(m_pc + 1)); m_io->write_byte(A_QSOUND + 1, m_file->read_byte(m_pc + 2)); m_io->write_byte(A_QSOUND + 2, m_file->read_byte(m_pc + 3)); @@ -1726,7 +1724,7 @@ void vgmplay_device::execute_run() case 0xc5: { - pulse_act_led(LED_SCSP); + pulse_act_led(CT_SCSP); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io16->write_byte(A_SCSP_1 + ((offset & 0x7f) << 8) + (m_file->read_byte(m_pc + 2) ^ 1), m_file->read_byte(m_pc + 3)); @@ -1738,7 +1736,7 @@ void vgmplay_device::execute_run() case 0xc6: { - pulse_act_led(LED_WSWAN); + pulse_act_led(CT_WSWAN); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_WSWAN_RAM_1 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); @@ -1750,7 +1748,7 @@ void vgmplay_device::execute_run() case 0xc7: { - pulse_act_led(LED_VSU_VUE); + pulse_act_led(CT_VSU_VUE); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_VSU_VUE_1 + ((offset & 0x7f) << 10) + (m_file->read_byte(m_pc + 2) << 2), m_file->read_byte(m_pc + 3)); @@ -1762,7 +1760,7 @@ void vgmplay_device::execute_run() case 0xc8: { - pulse_act_led(LED_X1_010); + pulse_act_led(CT_X1_010); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_X1_010_1 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); @@ -1774,7 +1772,7 @@ void vgmplay_device::execute_run() case 0xd0: { - pulse_act_led(LED_YMF278B); + pulse_act_led(CT_YMF278B); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) { @@ -1792,7 +1790,7 @@ void vgmplay_device::execute_run() case 0xd1: { - pulse_act_led(LED_YMF271); + pulse_act_led(CT_YMF271); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) { @@ -1810,7 +1808,7 @@ void vgmplay_device::execute_run() case 0xd2: { - pulse_act_led(LED_K051649); + pulse_act_led(CT_K051649); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) { @@ -1828,7 +1826,7 @@ void vgmplay_device::execute_run() case 0xd3: { - pulse_act_led(LED_K054539); + pulse_act_led(CT_K054539); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_K054539_1 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); @@ -1840,7 +1838,7 @@ void vgmplay_device::execute_run() case 0xd4: { - pulse_act_led(LED_C140); + pulse_act_led(CT_C140); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_C140_1 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); @@ -1852,7 +1850,7 @@ void vgmplay_device::execute_run() case 0xd5: { - pulse_act_led(LED_ES5503); + pulse_act_led(CT_ES5503); uint8_t offset = m_file->read_byte(m_pc + 1); if (offset & 0x80) m_io->write_byte(A_ES5503_1 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); @@ -1864,21 +1862,21 @@ void vgmplay_device::execute_run() case 0xd6: { - pulse_act_led(LED_ES5505); + pulse_act_led(CT_ES5505); // TODO: es5505 m_pc += 4; break; } case 0xe0: - pulse_act_led(LED_YM2612); + pulse_act_led(CT_YM2612); m_ym2612_stream_offset = m_file->read_dword(m_pc + 1); m_pc += 5; break; case 0xe1: { - pulse_act_led(LED_C352); + pulse_act_led(CT_C352); uint8_t offset = m_file->read_byte(m_pc + 1); uint32_t addr = ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2); uint16_t data = (m_file->read_byte(m_pc + 3) << 8) + m_file->read_byte(m_pc + 4); @@ -2384,9 +2382,9 @@ offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const } } -uint8_t vgmplay_device::rom_r(int chip, uint8_t type, offs_t offset) +uint8_t vgmplay_device::rom_r(int index, uint8_t type, offs_t offset) { - for (const auto &b : m_rom_blocks[chip][type - 0x80]) + for (const auto &b : m_rom_blocks[index][type - 0x80]) { if (offset >= b.start_address && offset <= b.end_address) { @@ -2396,155 +2394,155 @@ uint8_t vgmplay_device::rom_r(int chip, uint8_t type, offs_t offset) return 0; } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::segapcm_rom_r) { - return rom_r(Chip, 0x80, offset); + return rom_r(Index, 0x80, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::ym2608_rom_r) { - return rom_r(Chip, 0x81, offset); + return rom_r(Index, 0x81, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::ym2610_adpcm_a_rom_r) { - return rom_r(Chip, 0x82, offset); + return rom_r(Index, 0x82, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::ym2610_adpcm_b_rom_r) { - return rom_r(Chip, 0x83, offset); + return rom_r(Index, 0x83, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::ymf278b_rom_r) { - return rom_r(Chip, 0x84, offset); + return rom_r(Index, 0x84, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::ymf271_rom_r) { - return rom_r(Chip, 0x85, offset); + return rom_r(Index, 0x85, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::ymz280b_rom_r) { - return rom_r(Chip, 0x86, offset); + return rom_r(Index, 0x86, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::y8950_rom_r) { - return rom_r(Chip, 0x88, offset); + return rom_r(Index, 0x88, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::multipcm_rom_r) { - if (m_multipcm_banked[Chip] == 1) + if (m_multipcm_banked[Index] == 1) { offset &= 0x1fffff; if (offset & 0x100000) { - if (m_multipcm_bank_l[Chip] == m_multipcm_bank_r[Chip]) + if (m_multipcm_bank_l[Index] == m_multipcm_bank_r[Index]) { - offset = ((m_multipcm_bank_r[Chip] & ~0xf) << 16) | (offset & 0xfffff); + offset = ((m_multipcm_bank_r[Index] & ~0xf) << 16) | (offset & 0xfffff); } else { if (offset & 0x80000) { - offset = ((m_multipcm_bank_l[Chip] & ~0x7) << 16) | (offset & 0x7ffff); + offset = ((m_multipcm_bank_l[Index] & ~0x7) << 16) | (offset & 0x7ffff); } else { - offset = ((m_multipcm_bank_r[Chip] & ~0x7) << 16) | (offset & 0x7ffff); + offset = ((m_multipcm_bank_r[Index] & ~0x7) << 16) | (offset & 0x7ffff); } } } } - return rom_r(Chip, 0x89, offset); + return rom_r(Index, 0x89, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::upd7759_rom_r) { - return rom_r(Chip, 0x8a, m_upd7759_bank[Chip] | offset); + return rom_r(Index, 0x8a, m_upd7759_bank[Index] | offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::okim6295_rom_r) { - if (m_okim6295_nmk112_enable[Chip]) + if (m_okim6295_nmk112_enable[Index]) { - if ((offset < 0x400) && (m_okim6295_nmk112_enable[Chip] & 0x80)) + if ((offset < 0x400) && (m_okim6295_nmk112_enable[Index] & 0x80)) { - offset = (m_okim6295_nmk112_bank[Chip][(offset >> 8) & 0x3] << 16) | (offset & 0x3ff); + offset = (m_okim6295_nmk112_bank[Index][(offset >> 8) & 0x3] << 16) | (offset & 0x3ff); } else { - offset = (m_okim6295_nmk112_bank[Chip][(offset >> 16) & 0x3] << 16) | (offset & 0xffff); + offset = (m_okim6295_nmk112_bank[Index][(offset >> 16) & 0x3] << 16) | (offset & 0xffff); } } else { - offset = (m_okim6295_bank[Chip] * 0x40000) | offset; + offset = (m_okim6295_bank[Index] * 0x40000) | offset; } - return rom_r(Chip, 0x8b, offset); + return rom_r(Index, 0x8b, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::k054539_rom_r) { - return rom_r(Chip, 0x8c, offset); + return rom_r(Index, 0x8c, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::c140_rom_r) { - return rom_r(Chip, 0x8d, offset); + return rom_r(Index, 0x8d, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::k053260_rom_r) { - return rom_r(Chip, 0x8e, offset); + return rom_r(Index, 0x8e, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::qsound_rom_r) { - return rom_r(Chip, 0x8f, offset); + return rom_r(Index, 0x8f, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::es5505_rom_r) { - return rom_r(Chip, 0x90, offset); + return rom_r(Index, 0x90, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::x1_010_rom_r) { - return rom_r(Chip, 0x91, offset); + return rom_r(Index, 0x91, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::c352_rom_r) { - return rom_r(Chip, 0x92, offset); + return rom_r(Index, 0x92, offset); } -template<int Chip> +template<int Index> READ8_MEMBER(vgmplay_device::ga20_rom_r) { - return rom_r(Chip, 0x93, offset); + return rom_r(Index, 0x93, offset); } vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, const char *tag) @@ -2552,7 +2550,7 @@ vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, co , m_vgmplay(*this, "vgmplay") , m_lspeaker(*this, "lspeaker") , m_rspeaker(*this, "rspeaker") - , m_sn76496(*this, "sn76496.%d", 0) + , m_sn76489(*this, "sn76489.%d", 0) , m_ym2413(*this, "ym2413.%d", 0) , m_ym2612(*this, "ym2612.%d", 0) , m_ym2151(*this, "ym2151.%d", 0) @@ -2710,68 +2708,92 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) uint32_t extra_header_start = version >= 0x170 && data_start >= 0xc0 && r32(0xbc) ? r32(0xbc) + 0xbc : 0; uint32_t header_size = extra_header_start ? extra_header_start : data_start; - // Parse clocks - m_sn76496[0]->set_unscaled_clock(r32(0x0c) & ~0xc0000000); - m_sn76496[1]->set_unscaled_clock((r32(0x0c) & 0x40000000) ? r32(0x0c) & ~0xc0000000 : 0); + uint32_t extra_header_size = extra_header_start ? r32(extra_header_start) : 0; + uint32_t chip_clock_start = extra_header_size >= 4 && r32(extra_header_start + 4) ? r32(extra_header_start + 4) + extra_header_start + 4: 0; + uint32_t chip_volume_start = extra_header_size >= 8 && r32(extra_header_start + 8) ? r32(extra_header_start + 8) + extra_header_start + 8 : 0; - if (r32(0x0c) & 0x80000000) - logerror("Warning: file requests an unsupported T6W28"); + if (chip_volume_start != 0) + osd_printf_warning("Warning: file has unsupported chip volumes\n"); - m_ym2413[0]->set_unscaled_clock(r32(0x10) & ~0xc0000000); - m_ym2413[1]->set_unscaled_clock((r32(0x10) & 0x40000000) ? r32(0x10) & ~0xc0000000 : 0); - if (version >= 0x110 && (r32(0x2c) & 0x80000000)) - logerror("Warning: file requests an unsupported VRC7\n"); + const auto&& setup_device([&](device_t &device, int chip_num, vgm_chip chip_type, uint32_t offset, uint32_t min_version = 0) + { + uint32_t c = 0; - m_ym2612[0]->set_unscaled_clock((version >= 0x110 ? r32(0x2c) : r32(0x10)) & ~0xc0000000); - m_ym2612[1]->set_unscaled_clock(((version >= 0x110 ? r32(0x2c) : r32(0x10)) & 0x40000000) ? (version >= 0x110 ? r32(0x2c) : r32(0x10)) & ~0xc0000000 : 0); - if (version >= 0x110 && (r32(0x2c) & 0x80000000)) - logerror("Warning: file requests an unsupported YM3438\n"); + if (min_version <= version && offset + 4 <= header_size && (chip_num == 0 || (r32(offset) & 0x40000000) != 0)) + { + c = r32(offset); + + if (chip_clock_start && chip_num != 0) + for (auto i(0); i < r8(chip_clock_start); i++) + { + if (r8(chip_clock_start + 1 + (i * 5)) == chip_type) + { + c = r32(chip_clock_start + 2 + (i * 5)); + break; + } + } + } + + device.set_unscaled_clock(c & ~0xc0000000); + + return (c & 0x80000000) != 0; + }); + + // Parse clocks + if (setup_device(*m_sn76489[0], 0, CT_SN76489, 0x0c) || + setup_device(*m_sn76489[1], 1, CT_SN76489, 0x0c)) + osd_printf_warning("Warning: file requests an unsupported T6W28\n"); - m_ym2151[0]->set_unscaled_clock((version >= 0x110 ? r32(0x30) : r32(0x10)) & ~0x40000000); - m_ym2151[1]->set_unscaled_clock(((version >= 0x110 ? r32(0x30) : r32(0x10)) & 0x40000000) ? (version >= 0x110 ? r32(0x30) : r32(0x10)) & ~0x40000000 : 0); + if (setup_device(*m_ym2413[0], 0, CT_YM2413, 0x10) || + setup_device(*m_ym2413[1], 1, CT_YM2413, 0x10)) + osd_printf_warning("Warning: file requests an unsupported VRC7\n"); - m_segapcm[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x3c ? r32(0x38) & ~0x40000000 : 0); - m_segapcm[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x3c && (r32(0x38) & 0x40000000) ? r32(0x38) & ~0x40000000 : 0); + if (setup_device(*m_ym2612[0], 0, CT_YM2612, version < 110 ? 0x10 : 0x2c) || + setup_device(*m_ym2612[1], 1, CT_YM2612, version < 110 ? 0x10 : 0x2c)) + osd_printf_warning("Warning: file requests an unsupported YM3438\n"); + + setup_device(*m_ym2151[0], 0, CT_YM2151, version < 110 ? 0x10 : 0x30); + setup_device(*m_ym2151[1], 1, CT_YM2151, version < 110 ? 0x10 : 0x30); + + setup_device(*m_segapcm[0], 0, CT_SEGAPCM, 0x38, 0x151); + setup_device(*m_segapcm[1], 1, CT_SEGAPCM, 0x38, 0x151); m_segapcm[0]->set_bank(version >= 0x151 && header_size >= 0x40 ? r32(0x3c) : 0); m_segapcm[1]->set_bank(version >= 0x151 && header_size >= 0x40 ? r32(0x3c) : 0); - m_rf5c68->set_unscaled_clock(version >= 0x151 && header_size >= 0x44 ? r32(0x40) : 0); - m_ym2203[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x48 ? r32(0x44) & ~0x40000000 : 0); - m_ym2203[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x48 && (r32(0x44) & 0x40000000) ? r32(0x44) & ~0x40000000 : 0); - m_ym2608[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x4c ? r32(0x48) & ~0x40000000 : 0); - m_ym2608[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x4c && (r32(0x48) & 0x40000000) ? r32(0x48) & ~0x40000000 : 0); - - m_ym2610[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x50 ? r32(0x4c) & ~0xc0000000 : 0); - m_ym2610[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x50 && (r32(0x4c) & 0x40000000) ? r32(0x4c) & ~0xc0000000 : 0); - if (version >= 0x151 && header_size >= 0x50 && (r32(0x4c) & 0x80000000)) - logerror("Warning: file requests an unsupported YM2610B\n"); - - m_ym3812[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x54 ? r32(0x50) & ~0xc0000000 : 0); - m_ym3812[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x54 && (r32(0x50) & 0x40000000) ? r32(0x50) & ~0xc0000000 : 0); - if (version >= 0x151 && header_size >= 0x54 && (r32(0x50) & 0x80000000)) - logerror("Warning: file requests an unsupported SoundBlaster Pro\n"); - - m_ym3526[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x58 ? r32(0x54) & ~0x40000000 : 0); - m_ym3526[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x58 && (r32(0x54) & 0x40000000) ? r32(0x54) & ~0x40000000 : 0); - m_y8950[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x5c ? r32(0x58) & ~0x40000000 : 0); - m_y8950[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x5c && (r32(0x58) & 0x40000000) ? r32(0x58) & ~0x40000000 : 0); - m_ymf262[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x60 ? r32(0x5c) & ~0x40000000 : 0); - m_ymf262[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x60 && (r32(0x5c) & 0x40000000) ? r32(0x5c) & ~0x40000000 : 0); - m_ymf278b[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x64 ? r32(0x60) & ~0x40000000 : 0); - m_ymf278b[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x64 && r32(0x60) & 0x40000000 ? r32(0x60) & ~0x40000000 : 0); - m_ymf271[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x68 ? r32(0x64) & ~0x40000000 : 0); - m_ymf271[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x68 && r32(0x64) & 0x40000000 ? r32(0x64) & ~0x40000000 : 0); - m_ymz280b[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x6c ? r32(0x68) & ~0x40000000 : 0); - m_ymz280b[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x6c && r32(0x68) & 0x40000000 ? r32(0x68) & ~0x40000000 : 0); - - m_rf5c164->set_unscaled_clock(version >= 0x151 && header_size >= 0x70 ? r32(0x6c) & ~0x80000000 : 0); - if (version >= 0x151 && header_size >= 0x70 && (r32(0x6c) & 0x80000000)) - logerror("Warning: file requests an unsupported Cosmic Fantasy Stories HACK\n"); - - m_sega32x->set_unscaled_clock(version >= 0x151 && header_size >= 0x74 && r32(0x70) ? r32(0x70) : 0); - - m_ay8910[0]->set_unscaled_clock(version >= 0x151 && header_size >= 0x78 ? r32(0x74) & ~0x40000000 : 0); - m_ay8910[1]->set_unscaled_clock(version >= 0x151 && header_size >= 0x78 && (r32(0x74) & 0x40000000) ? r32(0x74) & ~0x40000000 : 0); + setup_device(*m_rf5c68, 0, CT_RF5C68, 0x40, 0x151); + setup_device(*m_ym2203[0], 0, CT_YM2203, 0x44, 0x151); + setup_device(*m_ym2203[1], 1, CT_YM2203, 0x44, 0x151); + setup_device(*m_ym2608[0], 0, CT_YM2608, 0x48, 0x151); + setup_device(*m_ym2608[1], 1, CT_YM2608, 0x48, 0x151); + + if (setup_device(*m_ym2610[0], 0, CT_YM2610, 0x4c, 0x151) || + setup_device(*m_ym2610[1], 1, CT_YM2610, 0x4c, 0x151)) + osd_printf_warning("Warning: file requests an unsupported YM2610B\n"); + + if (setup_device(*m_ym3812[0], 0, CT_YM3812, 0x50, 0x151) || + setup_device(*m_ym3812[1], 1, CT_YM3812, 0x50, 0x151)) + osd_printf_warning("Warning: file requests an unsupported SoundBlaster Pro\n"); + + setup_device(*m_ym3526[0], 0, CT_YM3526, 0x54, 0x151); + setup_device(*m_ym3526[1], 1, CT_YM3526, 0x54, 0x151); + setup_device(*m_y8950[0], 0, CT_Y8950, 0x58, 0x151); + setup_device(*m_y8950[1], 1, CT_Y8950, 0x58, 0x151); + setup_device(*m_ymf262[0], 0, CT_YMF262, 0x5c, 0x151); + setup_device(*m_ymf262[1], 1, CT_YMF262, 0x5c, 0x151); + setup_device(*m_ymf278b[0], 0, CT_YMF278B, 0x60, 0x151); + setup_device(*m_ymf278b[1], 1, CT_YMF278B, 0x60, 0x151); + setup_device(*m_ymf271[0], 0, CT_YMF271, 0x64, 0x151); + setup_device(*m_ymf271[1], 1, CT_YMF271, 0x64, 0x151); + setup_device(*m_ymz280b[0], 0, CT_YMZ280B, 0x68, 0x151); + setup_device(*m_ymz280b[1], 1, CT_YMZ280B, 0x68, 0x151); + + if (setup_device(*m_rf5c164, 0, CT_RF5C164, 0x6c, 0x151)) + osd_printf_warning("Warning: file requests an unsupported Cosmic Fantasy Stories HACK\n"); + + setup_device(*m_sega32x, 0, CT_SEGA32X, 0x70, 0x151); + + setup_device(*m_ay8910[0], 0, CT_AY8910, 0x74, 0x151); + setup_device(*m_ay8910[1], 1, CT_AY8910, 0x74, 0x151); m_ay8910[0]->set_psg_type(vgm_ay8910_type(version >= 0x151 && header_size >= 0x7c ? r8(0x78) : 0)); m_ay8910[1]->set_psg_type(vgm_ay8910_type(version >= 0x151 && header_size >= 0x7c ? r8(0x78) : 0)); m_ay8910[0]->set_flags(vgm_ay8910_flags(version >= 0x151 && header_size >= 0x7a ? r8(0x79) : 0)); @@ -2781,25 +2803,25 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) m_ym2608[0]->set_flags(vgm_ay8910_flags(version >= 0x151 && header_size >= 0x7c ? r8(0x7b) : 0)); m_ym2608[1]->set_flags(vgm_ay8910_flags(version >= 0x151 && header_size >= 0x7c ? r8(0x7b) : 0)); - m_dmg[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0x84 ? r32(0x80) & ~0x40000000 : 0); - m_dmg[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0x84 && (r32(0x80) & 0x40000000) ? r32(0x80) & ~0x40000000 : 0); - m_nescpu[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0x88 ? r32(0x84) & ~0xc0000000 : 0); - m_nescpu[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0x88 && (r32(0x84) & 0x40000000) ? r32(0x84) & ~0xc0000000 : 0); - if (version >= 0x161 && header_size >= 0x88 && (r32(0x84) & 0x80000000)) - logerror("Warning: file requests an unsupported FDS sound addon\n"); + setup_device(*m_dmg[0], 0, CT_GAMEBOY, 0x80, 0x161); + setup_device(*m_dmg[1], 1, CT_GAMEBOY, 0x80, 0x161); + + if (setup_device(*m_nescpu[0], 0, CT_NESAPU, 0x84, 0x161) || + setup_device(*m_nescpu[1], 1, CT_NESAPU, 0x84, 0x161)) + osd_printf_warning("Warning: file requests an unsupported FDS sound addon\n"); - m_multipcm[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0x8c ? r32(0x88) & ~0x40000000 : 0); - m_multipcm[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0x8c && (r32(0x88) & 0x40000000) ? r32(0x88) & ~0x40000000 : 0); + setup_device(*m_multipcm[0], 0, CT_MULTIPCM, 0x88, 0x161); + setup_device(*m_multipcm[1], 1, CT_MULTIPCM, 0x88, 0x161); - m_upd7759[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0x90 ? r32(0x8c) & ~0xc0000000 : 0); - m_upd7759[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0x90 && (r32(0x8c) & 0x40000000) ? r32(0x8c) & ~0xc0000000 : 0); + setup_device(*m_upd7759[0], 0, CT_UPD7759, 0x8c, 0x161); + setup_device(*m_upd7759[1], 1, CT_UPD7759, 0x8c, 0x161); m_upd7759_md[0] = r32(0x8c) & 0x80000000 ? 0 : 1; m_upd7759_md[1] = r32(0x8c) & 0x80000000 ? 0 : 1; m_upd7759[0]->md_w(m_upd7759_md[0]); m_upd7759[1]->md_w(m_upd7759_md[1]); - m_okim6258[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0x94 ? r32(0x90) & ~0x40000000 : 0); - m_okim6258[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0x94 && (r32(0x90) & 0x40000000) ? r32(0x90) & ~0x40000000 : 0); + setup_device(*m_okim6258[0], 0, CT_OKIM6258, 0x90, 0x161); + setup_device(*m_okim6258[1], 1, CT_OKIM6258, 0x90, 0x161); uint8_t okim6258_flags = version >= 0x161 && header_size >= 0x95 ? r8(0x94) : 0; m_okim6258_divider[0] = okim6258_flags & 3; @@ -2817,78 +2839,58 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) m_c140[0]->set_bank_type(c140_bank_type(version >= 0x161 && header_size >= 0x96 ? r8(0x96) : 0)); m_c140[1]->set_bank_type(c140_bank_type(version >= 0x161 && header_size >= 0x96 ? r8(0x96) : 0)); - m_okim6295_clock[0] = version >= 0x161 && header_size >= 0x9c ? r32(0x98) & ~0xc0000000 : 0; - m_okim6295_clock[1] = version >= 0x161 && header_size >= 0x9c && (r32(0x98) & 0x40000000) ? r32(0x98) & ~0xc0000000 : 0; - m_okim6295[0]->set_unscaled_clock(m_okim6295_clock[0]); - m_okim6295[1]->set_unscaled_clock(m_okim6295_clock[1]); - - m_okim6295_pin7[0] = version >= 0x161 && header_size >= 0x9c && (r32(0x98) & 0x80000000) ? 1 : 0; - m_okim6295_pin7[1] = version >= 0x161 && header_size >= 0x9c && (r32(0x98) & 0x40000000) && (r32(0x98) & 0x80000000) ? 1 : 0; + m_okim6295_pin7[0] = setup_device(*m_okim6295[0], 0, CT_OKIM6295, 0x98, 0x161); + m_okim6295_pin7[1] = setup_device(*m_okim6295[1], 1, CT_OKIM6295, 0x98, 0x161); m_okim6295[0]->set_pin7(m_okim6295_pin7[0] ? okim6295_device::PIN7_HIGH : okim6295_device::PIN7_LOW); m_okim6295[1]->set_pin7(m_okim6295_pin7[1] ? okim6295_device::PIN7_HIGH : okim6295_device::PIN7_LOW); - m_k051649[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xa0 ? r32(0x9c) & ~0xc0000000 : 0); - m_k051649[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xa0 && (r32(0x9c) & 0x40000000) ? r32(0x9c) & ~0xc0000000 : 0); - if (version >= 0x161 && header_size >= 0xa0 && (r32(0x9c) & 0x80000000)) - logerror("Warning: file requests an unsupported Konami SCC\n"); + if (setup_device(*m_k051649[0], 0, CT_K051649, 0x9c, 0x161) || + setup_device(*m_k051649[1], 1, CT_K051649, 0x9c, 0x161)) + osd_printf_warning("Warning: file requests an unsupported Konami SCC\n"); + + setup_device(*m_k054539[0], 0, CT_K054539, 0xa0, 0x161); + setup_device(*m_k054539[1], 1, CT_K054539, 0xa0, 0x161); // HACK: Some VGMs contain 48,000 instead of 18,432,000 - if (version >= 0x161 && header_size >= 0xa4 && (r32(0xa0) & ~0x40000000) == 48000) - { + m_k054539[0]->set_clock_scale(m_k054539[0]->unscaled_clock() == 48000 ? 384.0 : 1.0); + m_k054539[1]->set_clock_scale(m_k054539[1]->unscaled_clock() == 48000 ? 384.0 : 1.0); + if (m_k054539[0]->unscaled_clock() == 48000 || m_k054539[1]->unscaled_clock() == 48000) osd_printf_error("bad rip detected, correcting k054539 clock\n"); - m_k054539[0]->set_clock_scale(384); - m_k054539[1]->set_clock_scale(384); - } - - m_k054539[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xa4 ? r32(0xa0) & ~0x40000000 : 0); - m_k054539[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xa4 && (r32(0xa0) & 0x40000000) ? r32(0xa0) & ~0x40000000 : 0); // HACK: VGM contain the halved clock speed of the sound core inside the HUC6280 m_huc6280[0]->set_clock_scale(2); m_huc6280[1]->set_clock_scale(2); - m_huc6280[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xa8 ? r32(0xa4) & ~0x40000000 : 0); - m_huc6280[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xa8 && (r32(0xa4) & 0x40000000) ? r32(0xa4) & ~0x40000000 : 0); - - m_c140[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xac ? r32(0xa8) & ~0x40000000 : 0); - m_c140[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xac && (r32(0xa8) & 0x40000000) ? r32(0xa8) & ~0x40000000 : 0); + setup_device(*m_huc6280[0], 0, CT_C6280, 0xa4, 0x161); + setup_device(*m_huc6280[1], 1, CT_C6280, 0xa4, 0x161); + setup_device(*m_c140[0], 0, CT_C140, 0xa8, 0x161); + setup_device(*m_c140[1], 1, CT_C140, 0xa8, 0x161); + setup_device(*m_k053260[0], 0, CT_K053260, 0xac, 0x161); + setup_device(*m_k053260[1], 1, CT_K053260, 0xac, 0x161); + setup_device(*m_pokey[0], 0, CT_POKEY, 0xb0, 0x161); + setup_device(*m_pokey[1], 1, CT_POKEY, 0xb0, 0x161); - m_k053260[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xb0 ? r32(0xac) & ~0x40000000 : 0); - m_k053260[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xb0 && (r32(0xac) & 0x40000000) ? r32(0xac) & ~0x40000000 : 0); - - m_pokey[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xb4 ? r32(0xb0) & ~0x40000000 : 0); - m_pokey[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xb4 && (r32(0xb0) & 0x40000000) ? r32(0xb0) & ~0x40000000 : 0); + setup_device(*m_qsound, 0, CT_QSOUND, 0xb4, 0x161); // HACK: VGMs contain 4,000,000 instead of 60,000,000 - if (version >= 0x161 && header_size >= 0xb8 && r32(0xb4) == 4000000) - { + m_qsound->set_clock_scale(m_qsound->unscaled_clock() == 4000000 ? 15.0 : 1.0); + if (m_qsound->unscaled_clock() == 4000000) osd_printf_error("bad rip detected, correcting qsound clock\n"); - m_qsound->set_clock_scale(15); - } - - m_qsound->set_unscaled_clock(version >= 0x161 && header_size >= 0xb8 ? r32(0xb4) : 0); - m_scsp[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xbc ? r32(0xb8) & ~0x40000000 : 0); - m_scsp[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xbc && (r32(0xb8) & 0x40000000) ? r32(0xb8) & ~0x40000000 : 0); - - if (version >= 0x170 && header_size >= 0xc0 && r32(0xbc)) - logerror("Warning: file requests an unsupported Extra Header\n"); - - m_wswan[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xc4 ? r32(0xc0) & ~0x40000000 : 0); - m_wswan[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xc4 && (r32(0xc0) & 0x40000000) ? r32(0xc0) & ~0x40000000 : 0); - - m_vsu_vue[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xc8 ? r32(0xc4) & ~0x40000000 : 0); - m_vsu_vue[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xc8 && (r32(0xc4) & 0x40000000) ? r32(0xc4) & ~0x40000000 : 0); - - m_saa1099[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xcc ? r32(0xc8) & ~0x40000000 : 0); - m_saa1099[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xcc && (r32(0xc8) & 0x40000000) ? r32(0xc8) & ~0x40000000 : 0); - - m_es5503[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xd0 ? r32(0xcc) & ~0x40000000 : 0); - m_es5503[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xd0 && (r32(0xcc) & 0x40000000) ? r32(0xcc) & ~0x40000000 : 0); - m_es5505[0]->set_unscaled_clock(version >= 0x161 && header_size >= 0xd4 ? r32(0xd0) & ~0x40000000 : 0); - m_es5505[1]->set_unscaled_clock(version >= 0x161 && header_size >= 0xd4 && (r32(0xd0) & 0x40000000) ? r32(0xd0) & ~0x40000000 : 0); - if (version >= 0x171 && header_size >= 0xd4 && r32(0xd0) & 0x80000000) - logerror("Warning: file requests an unsupported ES5506\n"); + setup_device(*m_scsp[0], 0, CT_SCSP, 0xb8, 0x171); + setup_device(*m_scsp[1], 1, CT_SCSP, 0xb8, 0x171); + setup_device(*m_wswan[0], 0, CT_WSWAN, 0xc0, 0x171); + setup_device(*m_wswan[1], 1, CT_WSWAN, 0xc0, 0x171); + setup_device(*m_vsu_vue[0], 0, CT_VSU_VUE, 0xc4, 0x171); + setup_device(*m_vsu_vue[1], 1, CT_VSU_VUE, 0xc4, 0x171); + setup_device(*m_saa1099[0], 0, CT_SAA1099, 0xc8, 0x171); + setup_device(*m_saa1099[1], 1, CT_SAA1099, 0xc8, 0x171); + setup_device(*m_es5503[0], 0, CT_ES5503, 0xcc, 0x171); + setup_device(*m_es5503[1], 1, CT_ES5503, 0xcc, 0x171); + + if (setup_device(*m_es5505[0], 0, CT_ES5505, 0xd0, 0x171) || + setup_device(*m_es5505[1], 1, CT_ES5503, 0xd0, 0x171)) + osd_printf_warning("Warning: file requests an unsupported ES5506\n"); // TODO: dynamically remap es5503/es5505 channels? //m_es5503[0]->set_channels(version >= 0x171 && header_size >= 0xd5 ? r8(0xd4) : 0); @@ -2899,16 +2901,15 @@ QUICKLOAD_LOAD_MEMBER(vgmplay_state, load_file) m_c352[0]->set_divider(version >= 0x171 && header_size >= 0xd7 && r8(0xd6) ? r8(0xd6) * 4 : 1); m_c352[1]->set_divider(version >= 0x171 && header_size >= 0xd7 && r8(0xd6) ? r8(0xd6) * 4 : 1); - m_x1_010[0]->set_unscaled_clock(version >= 0x171 && header_size >= 0xdc ? r32(0xd8) & ~0x40000000 : 0); - m_x1_010[1]->set_unscaled_clock(version >= 0x171 && header_size >= 0xdc && (r32(0xd8) & 0x40000000) ? r32(0xd8) & ~0x40000000 : 0); + setup_device(*m_x1_010[0], 0, CT_X1_010, 0xd8, 0x171); + setup_device(*m_x1_010[1], 1, CT_X1_010, 0xd8, 0x171); - m_c352[0]->set_unscaled_clock(version >= 0x171 && header_size >= 0xe0 ? r32(0xdc) & ~0xc0000000 : 0); - m_c352[1]->set_unscaled_clock(version >= 0x171 && header_size >= 0xe0 && (r32(0xdc) & 0x40000000) ? r32(0xdc) & ~0xc0000000 : 0); - if (version >= 0x171 && header_size >= 0xe0 && r32(0xdc) & 0x80000000) - logerror("Warning: file requests an unsupported disable rear speakers\n"); + if (setup_device(*m_c352[0], 0, CT_C352, 0xdc, 0x171) || + setup_device(*m_c352[1], 1, CT_C352, 0xdc, 0x171)) + osd_printf_warning("Warning: file requests an unsupported disable rear speakers\n"); - m_ga20[0]->set_unscaled_clock(version >= 0x171 && header_size >= 0xe4 ? r32(0xe0) & ~0x40000000 : 0); - m_ga20[1]->set_unscaled_clock(version >= 0x171 && header_size >= 0xe4 && (r32(0xe0) & 0x40000000) ? r32(0xe0) & ~0x40000000 : 0); + setup_device(*m_ga20[0], 0, CT_GA20, 0xe0, 0x171); + setup_device(*m_ga20[1], 1, CT_GA20, 0xe0, 0x171); for (device_t &child : subdevices()) if (child.clock() != 0) @@ -2937,175 +2938,171 @@ READ8_MEMBER(vgmplay_state::file_size_r) return size >> (8 * offset); } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_device::multipcm_bank_hi_w) { if (offset & 1) - m_multipcm_bank_l[Chip] = (m_multipcm_bank_l[Chip] & 0xff) | (data << 16); + m_multipcm_bank_l[Index] = (m_multipcm_bank_l[Index] & 0xff) | (data << 16); if (offset & 2) - m_multipcm_bank_r[Chip] = (m_multipcm_bank_r[Chip] & 0xff) | (data << 16); + m_multipcm_bank_r[Index] = (m_multipcm_bank_r[Index] & 0xff) | (data << 16); } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_device::multipcm_bank_lo_w) { if (offset & 1) - m_multipcm_bank_l[Chip] = (m_multipcm_bank_l[Chip] & 0xff00) | data; + m_multipcm_bank_l[Index] = (m_multipcm_bank_l[Index] & 0xff00) | data; if (offset & 2) - m_multipcm_bank_r[Chip] = (m_multipcm_bank_r[Chip] & 0xff00) | data; + m_multipcm_bank_r[Index] = (m_multipcm_bank_r[Index] & 0xff00) | data; - m_multipcm_banked[Chip] = 1; + m_multipcm_banked[Index] = 1; } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_state::upd7759_reset_w) { int reset = data != 0; - m_upd7759[Chip]->reset_w(reset); + m_upd7759[Index]->reset_w(reset); - if (m_upd7759_reset[Chip] != reset) + if (m_upd7759_reset[Index] != reset) { - m_upd7759_reset[Chip] = reset; + m_upd7759_reset[Index] = reset; if (!reset) - std::queue<uint8_t>().swap(m_upd7759_slave_data[Chip]); + std::queue<uint8_t>().swap(m_upd7759_slave_data[Index]); } } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_state::upd7759_data_w) { - if (!m_upd7759_md[Chip] && !m_upd7759_drq[Chip]) + if (!m_upd7759_md[Index] && !m_upd7759_drq[Index]) { - m_upd7759_slave_data[Chip].push(data); + m_upd7759_slave_data[Index].push(data); } else { - m_upd7759[Chip]->port_w(data); - m_upd7759_drq[Chip] = 0; + m_upd7759[Index]->port_w(data); + m_upd7759_drq[Index] = 0; } } -template<int Chip> +template<int Index> WRITE_LINE_MEMBER(vgmplay_state::upd7759_drq_w) { - if (m_upd7759_drq[Chip] && !state) - osd_printf_error("upd7759.%d underflow\n", Chip); + if (m_upd7759_drq[Index] && !state) + osd_printf_error("upd7759.%d underflow\n", Index); - m_upd7759_drq[Chip] = state; + m_upd7759_drq[Index] = state; - if (!m_upd7759_md[Chip] && m_upd7759_drq[Chip] && !m_upd7759_slave_data[Chip].empty()) + if (!m_upd7759_md[Index] && m_upd7759_drq[Index] && !m_upd7759_slave_data[Index].empty()) { - const uint8_t data(m_upd7759_slave_data[Chip].front()); - m_upd7759_slave_data[Chip].pop(); - m_upd7759[Chip]->port_w(data); - m_upd7759_drq[Chip] = 0; + const uint8_t data(m_upd7759_slave_data[Index].front()); + m_upd7759_slave_data[Index].pop(); + m_upd7759[Index]->port_w(data); + m_upd7759_drq[Index] = 0; } } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_device::upd7759_bank_w) { // TODO: upd7759 update stream - m_upd7759_bank[Chip] = data * 0x20000; + m_upd7759_bank[Index] = data * 0x20000; } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_state::okim6258_clock_w) { - uint32_t old = m_okim6258_clock[Chip]; int shift = ((offset & 3) << 3); - m_okim6258_clock[Chip] = (m_okim6258_clock[Chip] & ~(mem_mask << shift)) | ((data & mem_mask) << shift); - if (old != m_okim6258_clock[Chip]) - m_okim6258[Chip]->set_unscaled_clock(m_okim6258_clock[Chip]); + uint32_t c = (m_okim6258[Index]->unscaled_clock() & ~(mem_mask << shift)) | ((data & mem_mask) << shift); + m_okim6258[Index]->set_unscaled_clock(c); } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_state::okim6258_divider_w) { - if ((data & mem_mask) != (m_okim6258_divider[Chip] & mem_mask)) + if ((data & mem_mask) != (m_okim6258_divider[Index] & mem_mask)) { - COMBINE_DATA(&m_okim6258_divider[Chip]); - m_okim6258[Chip]->set_divider(m_okim6258_divider[Chip]); + COMBINE_DATA(&m_okim6258_divider[Index]); + m_okim6258[Index]->set_divider(m_okim6258_divider[Index]); } } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_state::okim6295_clock_w) { - uint32_t old = m_okim6295_clock[Chip]; int shift = ((offset & 3) << 3); - m_okim6295_clock[Chip] = (m_okim6295_clock[Chip] & ~(mem_mask << shift)) | ((data & mem_mask) << shift); - if (old != m_okim6295_clock[Chip]) - m_okim6295[Chip]->set_unscaled_clock(m_okim6295_clock[Chip]); + uint32_t c = (m_okim6295[Index]->unscaled_clock() & ~(mem_mask << shift)) | ((data & mem_mask) << shift); + m_okim6295[Index]->set_unscaled_clock(c); } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_state::okim6295_pin7_w) { - if ((data & mem_mask) != (m_okim6295_pin7[Chip] & mem_mask)) + if ((data & mem_mask) != (m_okim6295_pin7[Index] & mem_mask)) { - COMBINE_DATA(&m_okim6295_pin7[Chip]); - m_okim6295[Chip]->set_pin7(m_okim6295_pin7[Chip]); + COMBINE_DATA(&m_okim6295_pin7[Index]); + m_okim6295[Index]->set_pin7(m_okim6295_pin7[Index]); } } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_device::okim6295_nmk112_enable_w) { - COMBINE_DATA(&m_okim6295_nmk112_enable[Chip]); + COMBINE_DATA(&m_okim6295_nmk112_enable[Index]); } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_device::okim6295_bank_w) { - if ((data & mem_mask) != (m_okim6295_bank[Chip] & mem_mask)) + if ((data & mem_mask) != (m_okim6295_bank[Index] & mem_mask)) { - COMBINE_DATA(&m_okim6295_bank[Chip]); + COMBINE_DATA(&m_okim6295_bank[Index]); } } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_device::okim6295_nmk112_bank_w) { offset &= 3; - if ((data & mem_mask) != (m_okim6295_nmk112_bank[Chip][offset] & mem_mask)) + if ((data & mem_mask) != (m_okim6295_nmk112_bank[Index][offset] & mem_mask)) { - COMBINE_DATA(&m_okim6295_nmk112_bank[Chip][offset]); + COMBINE_DATA(&m_okim6295_nmk112_bank[Index][offset]); } } -template<int Chip> +template<int Index> WRITE8_MEMBER(vgmplay_state::scc_w) { switch (offset & 1) { case 0x00: - m_scc_reg[Chip] = data; + m_scc_reg[Index] = data; break; case 0x01: switch (offset >> 1) { case 0x00: - m_k051649[Chip]->k051649_waveform_w(space, m_scc_reg[Chip], data); + m_k051649[Index]->k051649_waveform_w(space, m_scc_reg[Index], data); break; case 0x01: - m_k051649[Chip]->k051649_frequency_w(space, m_scc_reg[Chip], data); + m_k051649[Index]->k051649_frequency_w(space, m_scc_reg[Index], data); break; case 0x02: - m_k051649[Chip]->k051649_volume_w(space, m_scc_reg[Chip], data); + m_k051649[Index]->k051649_volume_w(space, m_scc_reg[Index], data); break; case 0x03: - m_k051649[Chip]->k051649_keyonoff_w(space, m_scc_reg[Chip], data); + m_k051649[Index]->k051649_keyonoff_w(space, m_scc_reg[Index], data); break; case 0x04: - m_k051649[Chip]->k052539_waveform_w(space, m_scc_reg[Chip], data); + m_k051649[Index]->k052539_waveform_w(space, m_scc_reg[Index], data); break; case 0x05: - m_k051649[Chip]->k051649_test_w(space, m_scc_reg[Chip], data); + m_k051649[Index]->k051649_test_w(space, m_scc_reg[Index], data); break; } break; @@ -3155,10 +3152,10 @@ void vgmplay_state::file_map(address_map &map) void vgmplay_state::soundchips_map(address_map &map) { map(vgmplay_device::REG_SIZE, vgmplay_device::REG_SIZE + 3).r(FUNC(vgmplay_state::file_size_r)); - map(vgmplay_device::A_SN76496_0 + 0, vgmplay_device::A_SN76496_0 + 0).w(m_sn76496[0], FUNC(sn76496_device::command_w)); - //map(vgmplay_device::A_SN76496_0 + 1, vgmplay_device::A_SN76496_0 + 1).w(m_sn76496[0], FUNC(sn76496_device::stereo_w)); // TODO: GG stereo - map(vgmplay_device::A_SN76496_1 + 0, vgmplay_device::A_SN76496_1 + 0).w(m_sn76496[1], FUNC(sn76496_device::command_w)); - //map(vgmplay_device::A_SN76496_1 + 1, vgmplay_device::A_SN76496_1 + 1).w(m_sn76496[1], FUNC(sn76496_device::stereo_w)); // TODO: GG stereo + map(vgmplay_device::A_SN76489_0 + 0, vgmplay_device::A_SN76489_0 + 0).w(m_sn76489[0], FUNC(sn76489_device::command_w)); + //map(vgmplay_device::A_SN76489_0 + 1, vgmplay_device::A_SN76489_0 + 1).w(m_sn76489[0], FUNC(sn76489_device::stereo_w)); // TODO: GG stereo + map(vgmplay_device::A_SN76489_1 + 0, vgmplay_device::A_SN76489_1 + 0).w(m_sn76489[1], FUNC(sn76489_device::command_w)); + //map(vgmplay_device::A_SN76489_1 + 1, vgmplay_device::A_SN76489_1 + 1).w(m_sn76489[1], FUNC(sn76489_device::stereo_w)); // TODO: GG stereo map(vgmplay_device::A_YM2413_0, vgmplay_device::A_YM2413_0 + 1).w(m_ym2413[0], FUNC(ym2413_device::write)); map(vgmplay_device::A_YM2413_1, vgmplay_device::A_YM2413_1 + 1).w(m_ym2413[1], FUNC(ym2413_device::write)); map(vgmplay_device::A_YM2612_0, vgmplay_device::A_YM2612_0 + 3).w(m_ym2612[0], FUNC(ym2612_device::write)); @@ -3282,151 +3279,151 @@ void vgmplay_state::soundchips16_map(address_map &map) map(vgmplay_device::A_C352_1, vgmplay_device::A_C352_1 + 0x7fff).w(m_c352[1], FUNC(c352_device::write)); } -template<int Chip> +template<int Index> void vgmplay_state::segapcm_map(address_map &map) { - map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::segapcm_rom_r<Chip>)); + map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::segapcm_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::rf5c68_map(address_map &map) { - map(0, 0xffff).ram().share(Chip ? "rf5c68_ram.1" : "rf5c68_ram.0"); + map(0, 0xffff).ram().share(Index ? "rf5c68_ram.1" : "rf5c68_ram.0"); } -template<int Chip> +template<int Index> void vgmplay_state::ym2608_map(address_map &map) { - map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::ym2608_rom_r<Chip>)); + map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::ym2608_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::ym2610_adpcm_a_map(address_map &map) { - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ym2610_adpcm_a_rom_r<Chip>)); + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ym2610_adpcm_a_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::ym2610_adpcm_b_map(address_map &map) { - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ym2610_adpcm_b_rom_r<Chip>)); + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ym2610_adpcm_b_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::y8950_map(address_map &map) { - map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::y8950_rom_r<Chip>)); + map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::y8950_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::ymf278b_map(address_map &map) { - map(0, 0x3fffff).r("vgmplay", FUNC(vgmplay_device::ymf278b_rom_r<Chip>)); + map(0, 0x3fffff).r("vgmplay", FUNC(vgmplay_device::ymf278b_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::ymf271_map(address_map &map) { - map(0, 0x7fffff).r("vgmplay", FUNC(vgmplay_device::ymf271_rom_r<Chip>)); + map(0, 0x7fffff).r("vgmplay", FUNC(vgmplay_device::ymf271_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::ymz280b_map(address_map &map) { - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ymz280b_rom_r<Chip>)); + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ymz280b_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::nescpu_map(address_map &map) { - map(0, 0xffff).ram().share(Chip ? "nesapu_ram.1" : "nesapu_ram.0"); + map(0, 0xffff).ram().share(Index ? "nesapu_ram.1" : "nesapu_ram.0"); } -template<int Chip> +template<int Index> void vgmplay_state::multipcm_map(address_map &map) { - map(0, 0x3fffff).r("vgmplay", FUNC(vgmplay_device::multipcm_rom_r<Chip>)); + map(0, 0x3fffff).r("vgmplay", FUNC(vgmplay_device::multipcm_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::upd7759_map(address_map &map) { - map(0, 0x1ffff).r("vgmplay", FUNC(vgmplay_device::upd7759_rom_r<Chip>)); + map(0, 0x1ffff).r("vgmplay", FUNC(vgmplay_device::upd7759_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::okim6295_map(address_map &map) { - map(0, 0x3ffff).r("vgmplay", FUNC(vgmplay_device::okim6295_rom_r<Chip>)); + map(0, 0x3ffff).r("vgmplay", FUNC(vgmplay_device::okim6295_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::k054539_map(address_map &map) { - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::k054539_rom_r<Chip>)); + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::k054539_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::c140_map(address_map &map) { - map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::c140_rom_r<Chip>)); + map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::c140_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::k053260_map(address_map &map) { - map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::k053260_rom_r<Chip>)); + map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::k053260_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::qsound_map(address_map &map) { - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::qsound_rom_r<Chip>)); + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::qsound_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::scsp_map(address_map &map) { - map(0, 0xfffff).ram().share(Chip ? "scsp_ram.1" : "scsp_ram.0"); + map(0, 0xfffff).ram().share(Index ? "scsp_ram.1" : "scsp_ram.0"); } -template<int Chip> +template<int Index> void vgmplay_state::wswan_map(address_map &map) { - map(0, 0x3fff).ram().share(Chip ? "wswan_ram.1" : "wswan_ram.0"); + map(0, 0x3fff).ram().share(Index ? "wswan_ram.1" : "wswan_ram.0"); } -template<int Chip> +template<int Index> void vgmplay_state::es5503_map(address_map &map) { - map(0, 0x1ffff).ram().share(Chip ? "es5503_ram.1" : "es5503_ram.0"); + map(0, 0x1ffff).ram().share(Index ? "es5503_ram.1" : "es5503_ram.0"); } -template<int Chip> +template<int Index> void vgmplay_state::es5505_map(address_map &map) { - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::es5505_rom_r<Chip>)); + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::es5505_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::x1_010_map(address_map &map) { - map(0, 0xfffff).r("vgmplay", FUNC(vgmplay_device::x1_010_rom_r<Chip>)); + map(0, 0xfffff).r("vgmplay", FUNC(vgmplay_device::x1_010_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::c352_map(address_map &map) { - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::c352_rom_r<Chip>)); + map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::c352_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::ga20_map(address_map &map) { - map(0, 0xfffff).r("vgmplay", FUNC(vgmplay_device::ga20_rom_r<Chip>)); + map(0, 0xfffff).r("vgmplay", FUNC(vgmplay_device::ga20_rom_r<Index>)); } -template<int Chip> +template<int Index> void vgmplay_state::rf5c164_map(address_map &map) { map(0, 0xffff).ram().share("rf5c164_ram"); @@ -3445,13 +3442,13 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) config.set_default_layout(layout_vgmplay); - SN76496(config, m_sn76496[0], 0); - m_sn76496[0]->add_route(0, "lspeaker", 0.5); - m_sn76496[0]->add_route(0, "rspeaker", 0.5); + SN76489(config, m_sn76489[0], 0); + m_sn76489[0]->add_route(0, "lspeaker", 0.5); + m_sn76489[0]->add_route(0, "rspeaker", 0.5); - SN76496(config, m_sn76496[1], 0); - m_sn76496[1]->add_route(0, "lspeaker", 0.5); - m_sn76496[1]->add_route(0, "rspeaker", 0.5); + SN76489(config, m_sn76489[1], 0); + m_sn76489[1]->add_route(0, "lspeaker", 0.5); + m_sn76489[1]->add_route(0, "rspeaker", 0.5); YM2413(config, m_ym2413[0], 0); m_ym2413[0]->add_route(ALL_OUTPUTS, "lspeaker", 1); |