diff options
Diffstat (limited to 'src/mame/drivers/vgmplay.cpp')
-rw-r--r-- | src/mame/drivers/vgmplay.cpp | 4023 |
1 files changed, 0 insertions, 4023 deletions
diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp deleted file mode 100644 index c8bfcdc61c9..00000000000 --- a/src/mame/drivers/vgmplay.cpp +++ /dev/null @@ -1,4023 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders: Olivier Galibert - -// A "virtual" driver to play vgm files -// Use with mame vgmplay -quik file.vgm - -#include "emu.h" - -#define QSOUND_LLE - -#include "imagedev/snapquik.h" - -#include "cpu/h6280/h6280.h" -#include "cpu/m6502/n2a03.h" -#include "cpu/m68000/m68000.h" -#include "cpu/sh/sh2.h" -#include "sound/2203intf.h" -#include "sound/2608intf.h" -#include "sound/2610intf.h" -#include "sound/2612intf.h" -#include "sound/262intf.h" -#include "sound/3526intf.h" -#include "sound/3812intf.h" -#include "sound/ay8910.h" -#include "sound/8950intf.h" -#include "sound/c140.h" -#include "sound/c352.h" -#include "sound/c6280.h" -#include "sound/es5503.h" -#include "sound/es5506.h" -#include "sound/gb.h" -#include "sound/iremga20.h" -#include "sound/k051649.h" -#include "sound/k053260.h" -#include "sound/k054539.h" -#include "sound/multipcm.h" -#include "sound/okim6258.h" -#include "sound/okim6295.h" -#include "sound/pokey.h" -#include "sound/qsound.h" -#include "sound/rf5c68.h" -#include "sound/saa1099.h" -#include "sound/scsp.h" -#include "sound/segapcm.h" -#include "sound/sn76496.h" -#include "sound/upd7759.h" -#include "sound/vgm_visualizer.h" -#include "sound/x1_010.h" -#include "sound/ym2151.h" -#include "sound/ym2413.h" -#include "sound/ymf271.h" -#include "sound/ymf278b.h" -#include "sound/ymz280b.h" -#include "audio/vboy.h" -#include "audio/wswan.h" -#include "machine/mega32x.h" - -#include "vgmplay.lh" -#include "debugger.h" -#include "speaker.h" - -#include <zlib.h> - -#include <algorithm> -#include <iterator> -#include <list> -#include <memory> -#include <queue> -#include <utility> -#include <vector> - -#define AS_IO16 1 - -class vgmplay_disassembler : public util::disasm_interface -{ -public: - vgmplay_disassembler() = default; - virtual ~vgmplay_disassembler() = default; - - virtual uint32_t opcode_alignment() const override; - 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, -}; - -enum C140_TYPE -{ - C140_LINEAR = 0, - C140_SYSTEM2, - C140_SYSTEM21, - C140_ASIC219 -}; - -class vgmplay_device : public cpu_device -{ -public: - enum io8_t - { - REG_SIZE = 0xff000000, - A_SN76489_0 = 0x00000000, - A_SN76489_1 = 0x80000000, - A_YM2413_0 = 0x01000000, - A_YM2413_1 = 0x81000000, - A_YM2612_0 = 0x02000000, - A_YM2612_1 = 0x82000000, - A_YM2151_0 = 0x03000000, - A_YM2151_1 = 0x83000000, - A_SEGAPCM_0 = 0x04000000, - A_SEGAPCM_1 = 0x84000000, - A_RF5C68 = 0x05000000, - A_RF5C68_RAM = 0x85000000, - A_YM2203_0 = 0x06000000, - A_YM2203_1 = 0x86000000, - A_YM2608_0 = 0x07000000, - A_YM2608_1 = 0x87000000, - A_YM2610_0 = 0x08000000, - A_YM2610_1 = 0x88000000, - A_YM3812_0 = 0x09000000, - A_YM3812_1 = 0x89000000, - A_YM3526_0 = 0x0a000000, - A_YM3526_1 = 0x8a000000, - A_Y8950_0 = 0x0b000000, - A_Y8950_1 = 0x8b000000, - A_YMF262_0 = 0x0c000000, - A_YMF262_1 = 0x8c000000, - A_YMF278B_0 = 0x0d000000, - A_YMF278B_1 = 0x8d000000, - A_YMF271_0 = 0x0e000000, - A_YMF271_1 = 0x8e000000, - A_YMZ280B_0 = 0x0f000000, - A_YMZ280B_1 = 0x8f000000, - A_RF5C164 = 0x10000000, - A_RF5C164_RAM = 0x90000000, - A_32X_PWM = 0x11000000, - A_AY8910_0 = 0x12000000, - A_AY8910_1 = 0x92000000, - A_GAMEBOY_0 = 0x13000000, - A_GAMEBOY_1 = 0x93000000, - A_NESAPU_0 = 0x14000000, - A_NES_RAM_0 = 0x14010000, - A_NESAPU_1 = 0x94000000, - A_NES_RAM_1 = 0x94010000, - A_MULTIPCM_0 = 0x15000000, - A_MULTIPCM_1 = 0x95000000, - A_UPD7759_0 = 0x16000000, - A_UPD7759_1 = 0x96000000, - A_OKIM6258_0 = 0x17000000, - A_OKIM6258_1 = 0x97000000, - A_OKIM6295_0 = 0x18000000, - A_OKIM6295_1 = 0x98000000, - A_K051649_0 = 0x19000000, - A_K051649_1 = 0x99000000, - A_K054539_0 = 0x1a000000, - A_K054539_1 = 0x9a000000, - A_C6280_0 = 0x1b000000, - A_C6280_1 = 0x9b000000, - A_C140_0 = 0x1c000000, - A_C140_1 = 0x9c000000, - A_K053260_0 = 0x1d000000, - A_K053260_1 = 0x9d000000, - A_POKEY_0 = 0x1e000000, - A_POKEY_1 = 0x9e000000, - A_QSOUND = 0x1f000000, - A_SCSP_0 = 0x20000000, - A_SCSP_RAM_0 = 0x20010000, - A_SCSP_1 = 0xa0000000, - A_SCSP_RAM_1 = 0xa0010000, - A_WSWAN_0 = 0x21000000, - A_WSWAN_RAM_0 = 0x21000100, - A_WSWAN_1 = 0xa1000000, - A_WSWAN_RAM_1 = 0xa1000100, - A_VSU_VUE_0 = 0x22000000, - A_VSU_VUE_1 = 0xa2000000, - A_SAA1099_0 = 0x23000000, - A_SAA1099_1 = 0xa3000000, - A_ES5503_0 = 0x24000000, - A_ES5503_RAM_0 = 0x24000100, - A_ES5503_1 = 0xa4000000, - A_ES5503_RAM_1 = 0xa4000100, - A_ES5505_0 = 0x25000000, - A_ES5505_1 = 0xa5000000, - A_X1_010_0 = 0x26000000, - A_X1_010_1 = 0xa6000000, - A_C352_0 = 0x27000000, - A_C352_1 = 0xa7000000, - A_GA20_0 = 0x28000000, - A_GA20_1 = 0xa8000000, - }; - - vgmplay_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - virtual uint32_t execute_min_cycles() const noexcept override; - virtual uint32_t execute_max_cycles() const noexcept override; - virtual uint32_t execute_input_lines() const noexcept override; - virtual void execute_run() override; - virtual void execute_set_input(int inputnum, int state) override; - - virtual space_config_vector memory_space_config() const override; - - virtual void state_import(const device_state_entry &entry) override; - virtual void state_export(const device_state_entry &entry) override; - virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; - - virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; - - template<int Index> uint8_t segapcm_rom_r(offs_t offset); - template<int Index> uint8_t ym2608_rom_r(offs_t offset); - template<int Index> uint8_t ym2610_adpcm_a_rom_r(offs_t offset); - template<int Index> uint8_t ym2610_adpcm_b_rom_r(offs_t offset); - template<int Index> uint8_t y8950_rom_r(offs_t offset); - template<int Index> uint8_t ymf278b_rom_r(offs_t offset); - template<int Index> uint8_t ymf271_rom_r(offs_t offset); - template<int Index> uint8_t ymz280b_rom_r(offs_t offset); - template<int Index> uint8_t multipcm_rom_r(offs_t offset); - template<int Index> uint8_t upd7759_rom_r(offs_t offset); - template<int Index> uint8_t okim6295_rom_r(offs_t offset); - template<int Index> uint8_t k054539_rom_r(offs_t offset); - template<int Index> uint16_t c140_rom_r(offs_t offset); - template<int Index> uint16_t c219_rom_r(offs_t offset); - template<int Index> uint8_t k053260_rom_r(offs_t offset); - template<int Index> uint8_t qsound_rom_r(offs_t offset); - template<int Index> uint8_t es5505_rom_r(offs_t offset); - template<int Index> uint8_t x1_010_rom_r(offs_t offset); - template<int Index> uint8_t c352_rom_r(offs_t offset); - template<int Index> uint8_t ga20_rom_r(offs_t offset); - - template<int Index> void multipcm_bank_hi_w(offs_t offset, uint8_t data); - template<int Index> void multipcm_bank_lo_w(offs_t offset, uint8_t data); - - template<int Index> void upd7759_bank_w(uint8_t data); - - template<int Index> void okim6295_nmk112_enable_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0); - template<int Index> void okim6295_bank_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0); - template<int Index> void okim6295_nmk112_bank_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0); - - void set_c140_bank_type(int index, C140_TYPE type); - C140_TYPE c140_bank(int index) { return m_c140_bank[index]; } - - void stop(); - void pause(); - bool paused() const { return m_paused; } - void play(); - void toggle_loop() { m_loop = !m_loop; } - -protected: - virtual void device_start() override; - virtual void device_reset() override; - -private: - enum { ACT_LED_PERSIST_MS = 100 }; - - enum { RESET, RUN, DONE }; - - using led_expiry = std::pair<vgm_chip, attotime>; - using led_expiry_list = std::list<led_expiry>; - using led_expiry_iterator = led_expiry_list::iterator; - - struct rom_block - { - offs_t start_address; - offs_t end_address; - std::unique_ptr<uint8_t[]> data; - - rom_block(rom_block &&) = default; - rom_block(offs_t start, offs_t end, std::unique_ptr<uint8_t[]> &&d) : start_address(start), end_address(end), data(std::move(d)) {} - }; - - struct stream - { - uint8_t byte_depth; - uint32_t position; - emu_timer *timer; - // stream control - vgm_chip chip_type; - uint8_t port; - uint8_t reg; - // stream data - uint8_t bank; - uint8_t step_size; - uint8_t step_base; - // frequency - uint32_t frequency; - // start stream - uint32_t offset; - uint32_t length; - bool loop; - bool reverse; - }; - - TIMER_CALLBACK_MEMBER(stream_timer_expired); - - stream m_streams[0xff]; - - void pulse_act_led(vgm_chip led); - TIMER_CALLBACK_MEMBER(act_led_expired); - - 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<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; - emu_timer *m_act_led_timer = nullptr; - - address_space_config m_file_config, m_io_config, m_io16_config; - address_space *m_file = nullptr, *m_io = nullptr, *m_io16 = nullptr; - - int m_icount = 0; - int m_state = RESET; - bool m_paused = false; - bool m_loop = false; - - uint32_t m_pc = 0U; - - std::list<rom_block> m_rom_blocks[2][0x40]; - - struct data_block - { - uint32_t start; - uint32_t size; - data_block(uint32_t _start, uint32_t _size) { start = _start; size = _size; } - }; - - std::array<std::vector<uint8_t>, 0x40> m_data_streams; - std::array<std::vector<data_block>, 0x40> m_data_stream_blocks; - - struct - { - uint8_t cmp_type; - uint8_t cmp_sub_type; - uint8_t bit_dec; - uint8_t bit_cmp; - std::vector<uint8_t> entries; - } m_dec_table; - - uint32_t m_ym2612_stream_offset = 0U; - - uint32_t m_multipcm_bank_l[2]; - uint32_t m_multipcm_bank_r[2]; - uint32_t m_multipcm_banked[2]; - - uint32_t m_upd7759_bank[2]; - - uint32_t m_okim6295_nmk112_enable[2]; - uint32_t m_okim6295_bank[2]; - uint32_t m_okim6295_nmk112_bank[2][4]; - - C140_TYPE m_c140_bank[2]; - - int m_sega32x_channel_hack; - int m_nes_apu_channel_hack[2]; - uint8_t m_c6280_channel[2]; -}; - -DEFINE_DEVICE_TYPE(VGMPLAY, vgmplay_device, "vgmplay_core", "VGM Player engine") - -enum vgmplay_inputs : uint8_t -{ - VGMPLAY_STOP, - VGMPLAY_PAUSE, - VGMPLAY_PLAY, - VGMPLAY_RESTART, - VGMPLAY_LOOP, - VGMPLAY_VIZ, - VGMPLAY_RATE_DOWN, - VGMPLAY_RATE_UP, - VGMPLAY_RATE_RST, - VGMPLAY_HOLD, -}; - -class vgmplay_state : public driver_device -{ -public: - vgmplay_state(const machine_config &mconfig, device_type type, const char *tag); - - DECLARE_QUICKLOAD_LOAD_MEMBER(load_file); - - uint8_t file_r(offs_t offset); - uint8_t file_size_r(offs_t offset); - DECLARE_INPUT_CHANGED_MEMBER(key_pressed); - - template<int Index> void upd7759_reset_w(uint8_t data); - template<int Index> void upd7759_data_w(uint8_t data); - template<int Index> DECLARE_WRITE_LINE_MEMBER(upd7759_drq_w); - template<int Index> void okim6258_clock_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0); - template<int Index> void okim6258_divider_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0); - template<int Index> void okim6295_clock_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0); - template<int Index> void okim6295_pin7_w(offs_t offset, uint8_t data, uint8_t mem_mask = ~0); - template<int Index> void scc_w(offs_t offset, uint8_t data); - template<int Index> void c140_c219_w(offs_t offset, uint8_t data); - - 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 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 c219_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: - virtual void machine_start() override; - - uint32_t m_held_clock; - std::vector<uint8_t> m_file_data; - required_device<vgmplay_device> m_vgmplay; - required_device<vgmviz_device> m_mixer; - required_device<speaker_device> m_lspeaker; - required_device<speaker_device> m_rspeaker; - 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; - required_device_array<segapcm_device, 2> m_segapcm; - required_device<rf5c68_device> m_rf5c68; - required_device_array<ym2203_device, 2> m_ym2203; - required_device_array<ym2608_device, 2> m_ym2608; - required_device_array<ym2610_device, 2> m_ym2610; - required_device_array<ym3812_device, 2> m_ym3812; - required_device_array<ym3526_device, 2> m_ym3526; - required_device_array<y8950_device, 2> m_y8950; - required_device_array<ymf262_device, 2> m_ymf262; - required_device_array<ymf278b_device, 2> m_ymf278b; - required_device_array<ymf271_device, 2> m_ymf271; - required_device_array<ymz280b_device, 2> m_ymz280b; - required_device<rf5c164_device> m_rf5c164; - required_device<sega_32x_ntsc_device> m_sega32x; - required_device_array<ay8910_device, 2> m_ay8910; - required_device_array<gameboy_sound_device, 2> m_dmg; - required_device_array<n2a03_device, 2> m_nescpu; - required_device_array<multipcm_device, 2> m_multipcm; - required_device_array<upd7759_device, 2> m_upd7759; - required_device_array<okim6258_device, 2> m_okim6258; - required_device_array<okim6295_device, 2> m_okim6295; - required_device_array<k051649_device, 2> m_k051649; - required_device_array<k054539_device, 2> m_k054539; - required_device_array<h6280_device, 2> m_huc6280; - required_device_array<c140_device, 2> m_c140; - required_device_array<c219_device, 2> m_c219; - required_device_array<k053260_device, 2> m_k053260; - required_device_array<pokey_device, 2> m_pokey; - required_device<qsound_device> m_qsound; - required_device_array<scsp_device, 2> m_scsp; - required_device_array<wswan_sound_device, 2> m_wswan; - required_device_array<vboysnd_device, 2> m_vsu_vue; - required_device_array<saa1099_device, 2> m_saa1099; - required_device_array<es5503_device, 2> m_es5503; - required_device_array<es5505_device, 2> m_es5505; - required_device_array<x1_010_device, 2> m_x1_010; - required_device_array<c352_device, 2> m_c352; - required_device_array<iremga20_device, 2> m_ga20; - - uint8_t m_okim6258_divider[2]; - uint8_t m_okim6295_pin7[2]; - uint8_t m_scc_reg[2]; - - int m_upd7759_md[2]; - int m_upd7759_reset[2]; - int m_upd7759_drq[2]; - std::queue<uint8_t> m_upd7759_slave_data[2]; - - uint32_t r32(int offset) const; - uint8_t r8(int offset) const; -}; - -vgmplay_device::vgmplay_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - cpu_device(mconfig, VGMPLAY, tag, owner, clock), - m_act_leds(*this, "led_act_%u", 0U), - m_file_config("file", ENDIANNESS_LITTLE, 8, 32), - m_io_config("io", ENDIANNESS_LITTLE, 8, 32), - m_io16_config("io16", ENDIANNESS_LITTLE, 16, 32) -{ -} - -void vgmplay_device::device_start() -{ - set_icountptr(m_icount); - m_file = &space(AS_PROGRAM); - m_io = &space(AS_IO); - m_io16 = &space(AS_IO16); - - m_act_leds.resolve(); - 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)); - - for (int i = 0; i < 0xff; i++) - m_streams[i].timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(vgmplay_device::stream_timer_expired), this)); - - save_item(NAME(m_pc)); - //save_item(NAME(m_streams)); - - state_add(STATE_GENPC, "GENPC", m_pc).noshow(); - state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow(); -} - -void vgmplay_device::device_reset() -{ - m_state = RESET; - m_paused = false; - - m_ym2612_stream_offset = 0; - std::fill(std::begin(m_upd7759_bank), std::end(m_upd7759_bank), 0); - blocks_clear(); - - for (int i = 0; i < 0xff; i++) - { - stream& s(m_streams[i]); - s.chip_type = vgm_chip(0xff); - s.bank = 0xff; - s.frequency = 0; - s.timer->enable(false); - } - - m_sega32x_channel_hack = 0; - m_nes_apu_channel_hack[0] = 0; - m_nes_apu_channel_hack[1] = 0; - m_c6280_channel[0] = 0; - m_c6280_channel[1] = 0; -} - -void vgmplay_device::pulse_act_led(vgm_chip led) -{ - m_act_leds[led] = 1; - - bool const was_first(m_act_led_expiries.begin() == m_act_led_index[led]); - bool const all_off(m_act_led_expiries.begin() == m_act_led_off); - attotime const now(machine().time()); - - m_act_led_index[led]->second = now + attotime::from_msec(ACT_LED_PERSIST_MS); - if (m_act_led_off != m_act_led_index[led]) - m_act_led_expiries.splice(m_act_led_off, m_act_led_expiries, m_act_led_index[led]); - else - ++m_act_led_off; - if (all_off) - m_act_led_timer->adjust(attotime::from_msec(ACT_LED_PERSIST_MS)); - else if (was_first) - m_act_led_timer->adjust(m_act_led_expiries.begin()->second - now); -} - -TIMER_CALLBACK_MEMBER(vgmplay_device::act_led_expired) -{ - attotime const now(machine().time()); - - while ((now + attotime::from_msec(1)) >= m_act_led_expiries.begin()->second) - { - led_expiry_iterator const expired(m_act_led_expiries.begin()); - m_act_leds[expired->first] = 0; - expired->second = attotime::never; - if (expired != m_act_led_off) - { - m_act_led_expiries.splice(m_act_led_off, m_act_led_expiries, expired); - m_act_led_off = expired; - } - } - - if (m_act_led_expiries.begin() != m_act_led_off) - m_act_led_timer->adjust(m_act_led_expiries.begin()->second - now); -} - -void vgmplay_device::stop() -{ - device_reset(); - m_paused = true; -} - -void vgmplay_device::pause() -{ - m_paused = !m_paused; -} - -void vgmplay_device::play() -{ - if (m_paused && m_state != DONE) - m_paused = false; - else - device_reset(); -} - -uint32_t vgmplay_device::execute_min_cycles() const noexcept -{ - return 0; -} - -uint32_t vgmplay_device::execute_max_cycles() const noexcept -{ - return 65536; -} - -uint32_t vgmplay_device::execute_input_lines() const noexcept -{ - return 0; -} - -void vgmplay_device::blocks_clear() -{ - for (int i = 0; i < 0x40; i++) - { - m_rom_blocks[0][i].clear(); - m_rom_blocks[1][i].clear(); - m_data_streams[i].clear(); - m_data_stream_blocks[i].clear(); - } - - m_dec_table.entries.clear(); -} - -uint32_t vgmplay_device::handle_data_block(uint32_t address) -{ - uint32_t size = m_file->read_dword(m_pc + 3); - int second = (size & 0x80000000) ? 1 : 0; - size &= 0x7fffffff; - - uint8_t type = m_file->read_byte(m_pc + 2); - if (type < 0x40) - { - uint32_t start = m_data_streams[type].size(); - m_data_stream_blocks[type].push_back(data_block(start, size)); - m_data_streams[type].resize(start + size); - for (uint32_t i = 0; i<size; i++) - m_data_streams[type][start + i] = m_file->read_byte(m_pc + 7 + i); - } - else if (type < 0x7f) - { - uint8_t cmp_type = m_file->read_byte(m_pc + 0x07); - uint32_t out_size = m_file->read_dword(m_pc + 0x08); - - uint32_t start = m_data_streams[type - 0x40].size(); - m_data_stream_blocks[type - 0x40].push_back(data_block(start, out_size)); - m_data_streams[type - 0x40].resize(start + out_size); - - if (cmp_type == 0) - { - uint8_t bit_dec = m_file->read_byte(m_pc + 0x0c); - uint8_t bit_cmp = m_file->read_byte(m_pc + 0x0d); - uint8_t cmp_sub_type = m_file->read_byte(m_pc + 0x0e); - uint16_t add_val = m_file->read_word(m_pc + 0x0f); - - if (cmp_sub_type == 0x02 && m_dec_table.entries.size() == 0) - osd_printf_error("invalid n-bit compressed stream, no decompression table\n"); - else if (cmp_sub_type == 0x02 && (m_dec_table.cmp_type != cmp_type || m_dec_table.cmp_sub_type != cmp_sub_type || m_dec_table.bit_dec != bit_dec || m_dec_table.bit_cmp != bit_cmp )) - osd_printf_error("invalid n-bit compressed stream, decompression table mismatch\n"); - else - { - int in_pos = 0x11 - 0x07; - int in_shift = 0; - int out_pos = 0; - - while (out_pos < out_size && in_pos < size) - { - int in_bits = bit_cmp; - uint16_t in_val = 0; - int out_bits = 0; - - while (in_bits > 0 && in_pos < size) - { - int bits = std::min(in_bits, 8); - uint8_t mask = (1 << bits) - 1; - in_shift += bits; - in_bits -= bits; - - uint16_t val = (m_file->read_byte(m_pc + 0x7 + in_pos) << in_shift >> 8) & mask; - if (in_shift >= 8) - { - in_pos++; - - in_shift -= 8; - if (in_shift > 0) - { - if (in_pos < size) - val |= (m_file->read_byte(m_pc + 0x7 + in_pos) << in_shift >> 8) & mask; - else - break; - } - } - - in_val |= val << out_bits; - out_bits += bits; - } - - if (out_bits == bit_cmp) - { - uint16_t out_val = 0; - - if (cmp_sub_type == 0) - out_val = in_val + add_val; - else if (cmp_sub_type == 1) - out_val = (in_val << (bit_dec - bit_cmp)) + add_val; - else if (cmp_sub_type == 2) - { - if (bit_dec <= 8) - out_val = m_dec_table.entries[in_val]; - else if (bit_dec <= 16) - out_val = m_dec_table.entries[in_val << 1] | (m_dec_table.entries[(in_val << 1) + 1] << 8); - } - else - osd_printf_error("invalid n-bit compressed stream size %x->%x type %02x bit_dec %02x bit_cmp %02x unsupported cmp_sub_type %02x add_val %04x\n", size, out_size, type - 0x40, bit_dec, bit_cmp, cmp_sub_type, add_val); - - for (int i = 0; i < bit_dec; i += 8) - { - m_data_streams[type - 0x40][start + out_pos] = out_val; - out_pos++; - out_val >>= 8; - } - } - } - - if (out_pos != out_size) - osd_printf_error("invalid n-bit compressed stream %02x in %x/%x out %x/%x\n", type - 0x40, in_pos, size, out_pos, out_size); - } - } - else if (cmp_type == 1) - osd_printf_error("unhandled delta-t compressed stream size %x->%x type %02x\n", size, out_size, type - 0x40); - else - osd_printf_error("unhandled unknown %02x compressed stream size %x->%x type %02x\n", cmp_type, size, out_size, type - 0x40); - } - else if (type == 0x7f) - { - m_dec_table.cmp_type = m_file->read_byte(m_pc + 0x07); - m_dec_table.cmp_sub_type = m_file->read_byte(m_pc + 0x08); - m_dec_table.bit_dec = m_file->read_byte(m_pc + 0x09); - m_dec_table.bit_cmp = m_file->read_byte(m_pc + 0x0a); - - m_dec_table.entries.resize(m_file->read_word(m_pc + 0x0b) * ((m_dec_table.bit_dec + 7) / 8)); - for (size_t i = 0; i < m_dec_table.entries.size(); i++) - m_dec_table.entries[i] = m_file->read_byte(m_pc + 0x0d + i); - } - else if (type < 0xc0) - { - uint32_t rom_size = m_file->read_dword(m_pc + 7); - uint32_t start = m_file->read_dword(m_pc + 11); - - uint32_t data_size = start < rom_size ? std::min(size - 8, rom_size - start) : 0; - - if (data_size) - { - std::unique_ptr<uint8_t[]> block = std::make_unique<uint8_t[]>(data_size); - for (uint32_t i = 0; i < data_size; i++) - block[i] = m_file->read_byte(m_pc + 15 + i); - m_rom_blocks[second][type - 0x80].emplace_front(start, start + size - 9, std::move(block)); - } - } - else if (type <= 0xc2) - { - uint16_t start = m_file->read_word(m_pc + 7); - uint32_t data_size = size - 2; - if (type == 0xc0) - for (int i = 0; i < data_size; i++) - m_io->write_byte(A_RF5C68_RAM + start + i, m_file->read_byte(m_pc + 9 + i)); - else if (type == 0xc1) - for (int i = 0; i < data_size; i++) - m_io->write_byte(A_RF5C164_RAM + start + i, m_file->read_byte(m_pc + 9 + i)); - else if (type == 0xc2) - for (int i = 0; i < data_size; i++) - m_io->write_byte((second ? A_NES_RAM_1 : A_NES_RAM_0) + start + i, m_file->read_byte(m_pc + 9 + i)); - } - else if (type >= 0xe0 && type <= 0xe1) - { - uint32_t start = m_file->read_dword(m_pc + 7); - uint32_t data_size = size - 4; - if (type == 0xe0) - for (int i = 0; i < data_size; i++) - m_io16->write_byte((second ? A_SCSP_RAM_1 : A_SCSP_RAM_0) + ((start + i) ^ 1), m_file->read_byte(m_pc + 0xb + i)); - else if (type == 0xe1) - for (int i = 0; i < data_size; i++) - m_io->write_byte((second ? A_ES5503_RAM_1 : A_ES5503_RAM_0) + start + i, m_file->read_byte(m_pc + 0xb + i)); - } - else - { - osd_printf_error("unhandled ram block size %x type %02x\n", size, type); - } - return 7 + size; -} - -uint32_t vgmplay_device::handle_pcm_write(uint32_t address) -{ - uint8_t type = m_file->read_byte(m_pc + 2); - uint32_t src = m_file->read_dword(m_pc + 3) & 0xffffff; - uint32_t dst = m_file->read_dword(m_pc + 6) & 0xffffff; - uint32_t size = m_file->read_dword(m_pc + 9) & 0xffffff; - if (size == 0) size = 0x01000000; - - int second = (type & 0x80) ? 1 : 0; - type &= 0x7f; - - if (m_data_streams.size() <= type || m_data_streams[type].size() < src + size) - osd_printf_error("invalid pcm ram writes src %x dst %x size %x type %02x\n", src, dst, size, type); - else if (type == 0x01 && !second) - { - for (int i = 0; i < size; i++) - m_io->write_byte(A_RF5C68_RAM + dst + i, m_data_streams[type][src + i]); - } - else if (type == 0x02 && !second) - { - for (int i = 0; i < size; i++) - m_io->write_byte(A_RF5C164_RAM + dst + i, m_data_streams[type][src + i]); - } - else if (type == 0x06) - { - for (int i = 0; i < size; i++) - m_io16->write_byte((second ? A_SCSP_RAM_1 : A_SCSP_RAM_0) + ((dst + i) ^ 1), m_data_streams[type][src + i]); - } - else if (type == 0x07) - { - for (int i = 0; i < size; i++) - m_io->write_byte((second ? A_NES_RAM_1 : A_NES_RAM_0) + dst + i, m_data_streams[type][src + i]); - } - else - osd_printf_error("unhandled pcm ram writes src %x dst %x size %x type %02x\n", src, dst, size, type); - - return 12; -} - -TIMER_CALLBACK_MEMBER(vgmplay_device::stream_timer_expired) -{ - stream& s(m_streams[param]); - - uint32_t offset = s.offset; - if (s.reverse) - offset += (s.length - s.position - 1) * s.step_size * s.byte_depth; - else - offset += s.position * s.step_size * s.byte_depth; - - if (offset + s.byte_depth > m_data_streams[s.bank].size()) - { - 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 == CT_SN76489) - { - 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_SN76489_0, ((m_data_streams[s.bank][offset + 1] & 3) << 4) | (m_data_streams[s.bank][offset] >> 4)); - } - 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 == 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 == 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 == CT_SEGA32X) - { - if (m_sega32x_channel_hack >= 0) - { - osd_printf_error("bad rip detected, enabling sega32x channels\n"); - m_io16->write_word(A_32X_PWM, 5); - - m_sega32x_channel_hack = -2; - } - - 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 == CT_C6280) - { - if (s.port != 0xff) - m_io->write_byte(A_C6280_0 + (s.reg >> 4), s.port); - - m_io->write_byte(A_C6280_0 + (s.reg & 0xf), m_data_streams[s.bank][offset]); - - 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 == CT_OKIM6258) - m_io->write_byte(A_OKIM6258_0 + s.reg, m_data_streams[s.bank][offset]); - else - { - osd_printf_error("stream_timer_expired %02x: unsupported stream to chip %02x\n", param, s.chip_type); - s.timer->enable(false); - } - - s.position++; - if (s.position >= s.length) - { - if (s.loop) - { - pulse_act_led(s.chip_type); - s.position = 0; - } - else - s.timer->enable(false); - } -} - -void vgmplay_device::execute_run() -{ - while (m_icount > 0) - { - switch (m_state) - { - case RESET: - { - uint32_t size = m_io->read_dword(REG_SIZE); - if (!size) - { - logerror("zero length file\n"); - - m_pc = 0; - m_state = DONE; - break; - } - - uint32_t version = m_file->read_dword(8); - m_pc = 0x34 + m_file->read_dword(0x34); - - if ((version < 0x150 && m_pc != 0x34) || (version >= 0x150 && m_pc == 0x34)) - { - osd_printf_error("bad rip detected, v%x invalid header size 0x%x\n", version, m_pc); - m_pc = 0x40; - } - else if (version < 0x150) - { - m_pc = 0x40; - } - - m_state = RUN; - break; - } - case RUN: - { - if (m_paused) - { - machine().sound().system_mute(1); - m_icount = 0; - return; - } - else - { - machine().sound().system_mute(0); - } - - if (machine().debug_flags & DEBUG_FLAG_ENABLED) - debugger_instruction_hook(m_pc); - - uint8_t code = m_file->read_byte(m_pc); - switch (code) - { - case 0x30: - 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(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(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(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(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; - break; - - case 0x52: - case 0x53: - 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(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(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; - break; - - case 0x56: - case 0x57: - 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; - break; - - case 0x58: - case 0x59: - 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(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(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(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(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; - break; - - case 0x5e: - case 0x5f: - 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; - break; - - case 0x61: - { - uint32_t duration = m_file->read_word(m_pc + 1); - m_icount -= duration; - m_pc += 3; - break; - } - - case 0x62: - m_icount -= 735; - m_pc++; - break; - - case 0x63: - m_icount -= 882; - m_pc++; - break; - - case 0x66: - { - uint32_t loop_offset = m_file->read_dword(0x1c); - if (!loop_offset) - { - if (m_loop) - device_reset(); - else - { - logerror("done\n"); - m_state = DONE; - } - break; - } - - m_pc = 0x1c + loop_offset; - break; - } - - case 0x67: - m_pc += handle_data_block(m_pc); - break; - - case 0x68: - m_pc += handle_pcm_write(m_pc); - break; - - case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: - case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: - m_icount -= 1 + (code & 0xf); - m_pc += 1; - break; - - 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(CT_YM2612); - if (!m_data_streams[0].empty()) - { - if (m_ym2612_stream_offset >= int(m_data_streams[0].size())) - m_ym2612_stream_offset = 0; - - m_io->write_byte(A_YM2612_0 + 0, 0x2a); - m_io->write_byte(A_YM2612_0 + 1, m_data_streams[0][m_ym2612_stream_offset]); - m_ym2612_stream_offset++; - } - m_pc += 1; - m_icount -= code & 0xf; - break; - - case 0x90: - { - uint8_t id = m_file->read_byte(m_pc + 1); - if (id == 0xff) - osd_printf_error("stream control invalid id\n"); - else - { - stream& s(m_streams[id]); - - 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 == CT_SN76489 && (s.reg & 0x10) == 0) || s.chip_type == CT_SEGA32X) ? 2 : 1; - - if (s.timer->enabled()) - { - osd_printf_error("stream %02x control while playing\n", id); - s.timer->enable(false); - } - } - m_pc += 5; - break; - } - - case 0x91: - { - uint8_t id = m_file->read_byte(m_pc + 1); - if (id == 0xff) - osd_printf_error("stream data invalid id\n"); - else - { - stream& s(m_streams[id]); - - s.bank = m_file->read_byte(m_pc + 2); - s.step_size = m_file->read_byte(m_pc + 3); - s.step_base = m_file->read_byte(m_pc + 4); - - if (s.step_size == 0) - { - osd_printf_error("stream %02x data invalid step size %d\n", id, s.step_size); - s.step_size = 1; - } - - if (s.step_base >= s.step_size) - { - osd_printf_error("stream %02x data step size %d invalid step base %d\n", id, s.step_size, s.step_base); - s.step_base %= s.step_size; - } - - if (s.timer->enabled()) - { - osd_printf_error("stream %02x data while playing\n", id); - s.timer->enable(false); - } - } - m_pc += 5; - break; - } - - case 0x92: - { - uint8_t id = m_file->read_byte(m_pc + 1); - if (id == 0xff) - osd_printf_error("stream frequency invalid id\n"); - else - { - stream& s(m_streams[id]); - - s.frequency = m_file->read_dword(m_pc + 2); - - if (s.timer->enabled()) - { - osd_printf_error("stream %02x frequency %d while playing\n", id, s.frequency); - s.timer->enable(false); - } - } - m_pc += 6; - break; - } - - case 0x93: - { - 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 >= CT_COUNT) - osd_printf_error("stream start %02x invalid chip type %02x\n", id, m_streams[id].chip_type); - else - { - stream& s(m_streams[id]); - - pulse_act_led(s.chip_type); - - uint32_t offset = m_file->read_dword(m_pc + 2); - uint8_t flags = m_file->read_byte(m_pc + 6); - uint32_t length = m_file->read_dword(m_pc + 7); - - if (s.bank >= m_data_stream_blocks.size()) - osd_printf_error("stream start %02x invalid bank %u>=%u\n", id, s.bank, uint8_t(m_data_stream_blocks.size())); - else if (s.frequency == 0) - osd_printf_error("stream start %02x invalid frequency\n", id); - else - { - if (offset != 0xffffffff) - s.offset = offset + (s.step_base * s.byte_depth); - - s.reverse = BIT(flags, 4); - s.loop = BIT(flags, 7); - - switch (flags & 3) - { - case 0: - break; - case 1: - s.length = length; - break; - case 2: - s.length = (length * 1000) / s.frequency; - break; - case 3: - s.length = (m_data_streams[s.bank].size() - (s.offset - (s.step_base * s.byte_depth))) / (s.step_size * s.byte_depth); - break; - } - - s.position = 0; - s.timer->adjust(attotime::zero, id, attotime::from_hz(s.frequency)); - } - } - m_pc += 11; - break; - } - - case 0x94: - { - uint8_t id = m_file->read_byte(m_pc + 1); - if (id == 0xff) - for (int i = 0; i < 0xff; i++) - m_streams[id].timer->enable(false); - else - m_streams[id].timer->enable(false); - - m_pc += 2; - break; - } - - case 0x95: - { - 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 >= CT_COUNT) - osd_printf_error("stream start short %02x invalid chip type %02x\n", id, m_streams[id].chip_type); - else - { - stream& s(m_streams[id]); - - pulse_act_led(s.chip_type); - - uint8_t block = m_file->read_word(m_pc + 2); - uint8_t flags = m_file->read_byte(m_pc + 4); - - if (s.bank >= m_data_stream_blocks.size()) - osd_printf_error("stream start short %02x invalid bank %u>=%u\n", id, s.bank, uint8_t(m_data_stream_blocks.size())); - else if (block >= m_data_stream_blocks[s.bank].size()) - osd_printf_error("stream start short %02x bank %u invalid block %u>=%u\n", id, s.bank, block, uint8_t(m_data_stream_blocks[s.bank].size())); - else if (s.frequency == 0) - osd_printf_error("stream start %02x invalid frequency\n", id); - else - { - s.loop = BIT(flags, 0); - s.reverse = BIT(flags, 4); - s.offset = m_data_stream_blocks[s.bank][block].start + (s.step_base * s.byte_depth); - s.length = m_data_stream_blocks[s.bank][block].size / (s.step_size * s.byte_depth); - - s.position = 0; - s.timer->adjust(attotime::zero, id, attotime::from_hz(s.frequency)); - } - } - m_pc += 5; - break; - } - - case 0xa0: - { - pulse_act_led(CT_AY8910); - uint8_t reg = m_file->read_byte(m_pc + 1); - if (reg & 0x80) - { - m_io->write_byte(A_AY8910_1 + 1, reg & 0x7f); - m_io->write_byte(A_AY8910_1 + 0, m_file->read_byte(m_pc + 2)); - } - else - { - m_io->write_byte(A_AY8910_0 + 1, reg & 0x7f); - m_io->write_byte(A_AY8910_0 + 0, m_file->read_byte(m_pc + 2)); - } - m_pc += 3; - break; - } - - case 0xa1: - 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; - break; - - case 0xa2: - case 0xa3: - 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(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(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; - break; - - case 0xa6: - case 0xa7: - 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; - break; - - case 0xa8: - case 0xa9: - 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(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(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(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(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; - break; - - case 0xae: - case 0xaf: - 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(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(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(CT_SEGA32X); - uint8_t offset = m_file->read_byte(m_pc + 1); - uint8_t data = m_file->read_byte(m_pc + 2); - - if (m_sega32x_channel_hack >= 0) - { - if ((offset & 0xf0) == 0) - { - if (data != 0) - m_sega32x_channel_hack = -1; - } - else - { - m_sega32x_channel_hack++; - if (m_sega32x_channel_hack == 32) - { - osd_printf_error("bad rip detected, enabling sega32x channels\n"); - m_io16->write_word(A_32X_PWM, 5); - - m_sega32x_channel_hack = -2; - } - } - } - - m_io16->write_word(A_32X_PWM + ((offset & 0xf0) >> 3), ((offset & 0xf) << 8) | data); - m_pc += 3; - break; - } - - case 0xb3: - { - 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)); - else - m_io->write_byte(A_GAMEBOY_0 + (reg & 0x7f), m_file->read_byte(m_pc + 2)); - m_pc += 3; - break; - } - - case 0xb4: - { - pulse_act_led(CT_NESAPU); - uint8_t offset = m_file->read_byte(m_pc + 1); - - 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[index] = -1; - } - else - { - 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", 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[index] = -2; - } - } - } - //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", index, m_pc, m_io->read_dword(REG_SIZE)); - // m_nes_apu_channel_hack[index] = -1; - //} - - if (offset & 0x80) - m_io->write_byte(A_NESAPU_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - else - m_io->write_byte(A_NESAPU_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - m_pc += 3; - break; - } - - case 0xb5: - { - 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)); - else - m_io->write_byte(A_MULTIPCM_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - m_pc += 3; - break; - } - - case 0xb6: - { - 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)); - else - m_io->write_byte(A_UPD7759_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - m_pc += 3; - break; - } - - case 0xb7: - { - 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)); - else - m_io->write_byte(A_OKIM6258_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - m_pc += 3; - break; - } - - case 0xb8: - { - 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)); - else - m_io->write_byte(A_OKIM6295_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - m_pc += 3; - break; - } - - case 0xb9: - { - 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); - if (offset & 0x80) - m_io->write_byte(A_C6280_1 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - else - m_io->write_byte(A_C6280_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - m_pc += 3; - break; - } - - case 0xba: - { - 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)); - else - m_io->write_byte(A_K053260_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - m_pc += 3; - break; - } - - case 0xbb: - { - 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)); - else - m_io->write_byte(A_POKEY_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - m_pc += 3; - break; - } - - case 0xbc: - { - 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)); - else - m_io->write_byte(A_WSWAN_0 + (offset & 0x7f) + 0x80, m_file->read_byte(m_pc + 2)); - m_pc += 3; - break; - } - - case 0xbd: - { - pulse_act_led(CT_SAA1099); - uint8_t offset = m_file->read_byte(m_pc + 1); - if (offset & 0x80) - { - m_io->write_byte(A_SAA1099_1 + 1, offset & 0x7f); - m_io->write_byte(A_SAA1099_1 + 0, m_file->read_byte(m_pc + 2)); - } - else - { - m_io->write_byte(A_SAA1099_0 + 1, offset & 0x7f); - m_io->write_byte(A_SAA1099_0 + 0, m_file->read_byte(m_pc + 2)); - } - m_pc += 3; - break; - } - - case 0xbe: - { - pulse_act_led(CT_ES5505); - // TODO: es5505 - m_pc += 3; - break; - } - - case 0xbf: - { - 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)); - else - m_io->write_byte(A_GA20_0 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - m_pc += 3; - break; - } - - case 0xc0: - { - 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)); - else - m_io->write_byte(A_SEGAPCM_0 + (offset & 0x7fff), m_file->read_byte(m_pc + 3)); - m_pc += 4; - break; - } - - case 0xc1: - 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(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(CT_MULTIPCM); - uint8_t offset = m_file->read_byte(m_pc + 1); - if (offset & 0x80) - { - m_io->write_byte(A_MULTIPCM_1 + 4 + (offset & 0x7f), m_file->read_byte(m_pc + 3)); - m_io->write_byte(A_MULTIPCM_1 + 8 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - } - else - { - m_io->write_byte(A_MULTIPCM_0 + 4 + (offset & 0x7f), m_file->read_byte(m_pc + 3)); - m_io->write_byte(A_MULTIPCM_0 + 8 + (offset & 0x7f), m_file->read_byte(m_pc + 2)); - } - m_pc += 4; - break; - } - - case 0xc4: - 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)); - m_pc += 4; - break; - - case 0xc5: - { - 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)); - else - m_io16->write_byte(A_SCSP_0 + ((offset & 0x7f) << 8) + (m_file->read_byte(m_pc + 2) ^ 1), m_file->read_byte(m_pc + 3)); - m_pc += 4; - break; - } - - case 0xc6: - { - 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)); - else - m_io->write_byte(A_WSWAN_RAM_0 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); - m_pc += 4; - break; - } - - case 0xc7: - { - 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)); - else - m_io->write_byte(A_VSU_VUE_0 + ((offset & 0x7f) << 10) + (m_file->read_byte(m_pc + 2) << 2), m_file->read_byte(m_pc + 3)); - m_pc += 4; - break; - } - - case 0xc8: - { - 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)); - else - m_io->write_byte(A_X1_010_0 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); - m_pc += 4; - break; - } - - case 0xd0: - { - pulse_act_led(CT_YMF278B); - uint8_t offset = m_file->read_byte(m_pc + 1); - if (offset & 0x80) - { - m_io->write_byte(A_YMF278B_1 + ((offset & 0x7f) << 1) + 0, m_file->read_byte(m_pc + 2)); - m_io->write_byte(A_YMF278B_1 + ((offset & 0x7f) << 1) + 1, m_file->read_byte(m_pc + 3)); - } - else - { - m_io->write_byte(A_YMF278B_0 + ((offset & 0x7f) << 1) + 0, m_file->read_byte(m_pc + 2)); - m_io->write_byte(A_YMF278B_0 + ((offset & 0x7f) << 1) + 1, m_file->read_byte(m_pc + 3)); - } - m_pc += 4; - break; - } - - case 0xd1: - { - pulse_act_led(CT_YMF271); - uint8_t offset = m_file->read_byte(m_pc + 1); - if (offset & 0x80) - { - m_io->write_byte(A_YMF271_1 + ((offset & 0x7f) << 1) + 0, m_file->read_byte(m_pc + 2)); - m_io->write_byte(A_YMF271_1 + ((offset & 0x7f) << 1) + 1, m_file->read_byte(m_pc + 3)); - } - else - { - m_io->write_byte(A_YMF271_0 + ((offset & 0x7f) << 1) + 0, m_file->read_byte(m_pc + 2)); - m_io->write_byte(A_YMF271_0 + ((offset & 0x7f) << 1) + 1, m_file->read_byte(m_pc + 3)); - } - m_pc += 4; - break; - } - - case 0xd2: - { - pulse_act_led(CT_K051649); - uint8_t offset = m_file->read_byte(m_pc + 1); - if (offset & 0x80) - { - m_io->write_byte(A_K051649_1 + ((offset & 0x7f) << 1) + 0, m_file->read_byte(m_pc + 2)); - m_io->write_byte(A_K051649_1 + ((offset & 0x7f) << 1) + 1, m_file->read_byte(m_pc + 3)); - } - else - { - m_io->write_byte(A_K051649_0 + ((offset & 0x7f) << 1) + 0, m_file->read_byte(m_pc + 2)); - m_io->write_byte(A_K051649_0 + ((offset & 0x7f) << 1) + 1, m_file->read_byte(m_pc + 3)); - } - m_pc += 4; - break; - } - - case 0xd3: - { - 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)); - else - m_io->write_byte(A_K054539_0 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); - m_pc += 4; - break; - } - - case 0xd4: - { - 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)); - else - m_io->write_byte(A_C140_0 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); - m_pc += 4; - break; - } - - case 0xd5: - { - 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)); - else - m_io->write_byte(A_ES5503_0 + ((offset & 0x7f) << 8) + m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3)); - m_pc += 4; - break; - } - - case 0xd6: - { - pulse_act_led(CT_ES5505); - // TODO: es5505 - m_pc += 4; - break; - } - - case 0xe0: - 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(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); - if (offset & 0x80) - m_io16->write_word(A_C352_1 + (addr << 1), data); - else - m_io16->write_word(A_C352_0 + (addr << 1), data); - m_pc += 5; - break; - } - - default: - osd_printf_error("unhandled code %02x (%02x %02x %02x %02x)\n", code, m_file->read_byte(m_pc + 1), m_file->read_byte(m_pc + 2), m_file->read_byte(m_pc + 3), m_file->read_byte(m_pc + 4)); - - if (machine().debug_flags & DEBUG_FLAG_ENABLED) - debugger_instruction_hook(m_pc); - - m_state = DONE; - m_icount = 0; - break; - } - break; - } - case DONE: - { - machine().sound().system_mute(1); - m_icount = 0; - break; - } - } - } -} - -void vgmplay_device::execute_set_input(int inputnum, int state) -{ -} - -device_memory_interface::space_config_vector vgmplay_device::memory_space_config() const -{ - return space_config_vector - { - std::make_pair(AS_PROGRAM, &m_file_config), - std::make_pair(AS_IO, &m_io_config), - std::make_pair(AS_IO16, &m_io16_config), - }; -} - -void vgmplay_device::state_import(const device_state_entry &entry) -{ -} - -void vgmplay_device::state_export(const device_state_entry &entry) -{ -} - -void vgmplay_device::state_string_export(const device_state_entry &entry, std::string &str) const -{ -} - -std::unique_ptr<util::disasm_interface> vgmplay_device::create_disassembler() -{ - return std::make_unique<vgmplay_disassembler>(); -} - -uint32_t vgmplay_disassembler::opcode_alignment() const -{ - return 1; -} - -offs_t vgmplay_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) -{ - static const char *const basic_types[8] = - { - "ym2612.%d pcm", - "rf5c68 pcm", - "rf5c164 pcm", - "sega32x.%d pcm", - "okim6258.%d adpcm", - "huc6280.%d pcm", - "scsp.%d pcm", - "nesapu.%d dpcm", - }; - - switch (opcodes.r8(pc)) - { - case 0x30: - util::stream_format(stream, "psg.1 write %02x", opcodes.r8(pc + 1)); - return 2 | SUPPORTED; - - case 0x3f: - util::stream_format(stream, "psg.1 r06 = %02x", opcodes.r8(pc + 1)); - return 2 | SUPPORTED; - - case 0x4f: - util::stream_format(stream, "psg.0 r06 = %02x", opcodes.r8(pc + 1)); - return 2 | SUPPORTED; - - case 0x50: - util::stream_format(stream, "psg.0 write %02x", opcodes.r8(pc + 1)); - return 2 | SUPPORTED; - - case 0x51: - util::stream_format(stream, "ym2413.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0x52: - case 0x53: - util::stream_format(stream, "ym2612.0 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0x54: - util::stream_format(stream, "ym2151.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0x55: - util::stream_format(stream, "ym2203.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0x56: - case 0x57: - util::stream_format(stream, "ym2608.0 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0x58: - case 0x59: - util::stream_format(stream, "ym2610.0 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0x5a: - util::stream_format(stream, "ym3812.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0x5b: - util::stream_format(stream, "ym3526.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0x5c: - util::stream_format(stream, "y8950.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0x5d: - util::stream_format(stream, "ymz280b.0 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0x5e: - case 0x5f: - util::stream_format(stream, "ymf262.0 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0x61: - { - uint32_t duration = opcodes.r8(pc + 1) | (opcodes.r8(pc + 2) << 8); - util::stream_format(stream, "wait %d", duration); - return 3 | SUPPORTED; - } - - case 0x62: - util::stream_format(stream, "wait 735"); - return 1 | SUPPORTED; - - case 0x63: - util::stream_format(stream, "wait 882"); - return 1 | SUPPORTED; - - case 0x66: - util::stream_format(stream, "end"); - return 1 | SUPPORTED; - - case 0x67: - { - static const char *const rom_types[20] = - { - "segapcm.%d rom", - "ym2608.%d delta-t rom", - "ym2610.%d adpcm rom", - "ym2610.%d delta-t rom", - "ymf278b.%d rom", - "ymf271.%d rom", - "ymz280b.%d rom", - "ymf278b.%d ram", - "y8950.%d delta-t rom", - "multipcm.%d rom", - "upd7759.%d rom", - "okim6295.%d rom", - "k054539.%d rom", - "c140.%d rom", - "k053260.%d rom", - "qsound.%d rom", - "es5505.%d rom", - "x1-010.%d rom", - "c352.%d rom", - "ga20.%d rom" - }; - - static const char *const small_ram_types[3] = - { - "rf5c68 ram", - "rf5c164 ram", - "nesapu.%d ram" - }; - - static const char *const large_ram_types[2] = - { - "scsp.%d ram", - "es5503.%d ram" - }; - - uint8_t type = opcodes.r8(pc + 2); - uint32_t size = opcodes.r32(pc + 3); - int second = (size & 0x80000000) ? 1 : 0; - size &= 0x7fffffff; - - if (type < 0x8) - { - util::stream_format(stream, basic_types[type], second); util::stream_format(stream, " data-block %x", size); - } - else if (type < 0x40) - util::stream_format(stream, "unknown%02x.%d stream data-block %x", type, second, size); - else if (type < 0x48) - { - util::stream_format(stream, basic_types[type - 0x40], second); util::stream_format(stream, " comp. data-block %x", size); - } - else if (type < 0x7f) - util::stream_format(stream, "unknown%02x.%d stream comp. data-block %x", type - 0x40, second, size); - else if (type == 0x7f) - util::stream_format(stream, "decomp-table %x, %02x/%02x", size, opcodes.r8(pc + 7), opcodes.r8(pc + 8)); - else if (type < 0x94) - { - util::stream_format(stream, rom_types[type - 0x80], second); util::stream_format(stream, " data-block %x", size); - } - else if (type < 0xc0) - util::stream_format(stream, "unknown%02x.%d rom data-block %x", type - 0x80, second, size); - else if (type < 0xc3) - { - util::stream_format(stream, small_ram_types[type - 0xc0], second); util::stream_format(stream, " data-block %x", size); - } - else if (type < 0xe0) - util::stream_format(stream, "unknown%02x.%d small ram data-block %x", type - 0xc0, second, size); - else if (type < 0xe2) - { - util::stream_format(stream, large_ram_types[type - 0xe0], second); util::stream_format(stream, " data-block %x", size); - } - else - util::stream_format(stream, "unknown%02x.%d large ram data-block %x", type - 0xe0, second, size); - return (7 + size) | SUPPORTED; - } - - case 0x68: - { - uint8_t type = opcodes.r8(pc + 2); - uint32_t src = opcodes.r32(pc + 3) & 0xffffff; - uint32_t dst = opcodes.r32(pc + 6) & 0xffffff; - uint32_t size = opcodes.r32(pc + 9) & 0xffffff; - if (size == 0) size = 0x01000000; - int second = (type & 0x80) ? 1 : 0; - - if (type < 8) - { - util::stream_format(stream, basic_types[type], second); util::stream_format(stream, " write src %x dst %x size %x\n", src, dst, size); - } - else - util::stream_format(stream, "unknown%02x.%d pcm write src %x dst %x size %x\n", type, second, src, dst, size); - - return 12 | SUPPORTED; - } - - case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: - case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: - util::stream_format(stream, "wait %d", 1 + (opcodes.r8(pc) & 0x0f)); - return 1 | SUPPORTED; - - case 0x80: - util::stream_format(stream, "ym2612.0 r2a = rom++"); - return 1 | SUPPORTED; - - 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: - util::stream_format(stream, "ym2612.0 r2a = rom++; wait %d", opcodes.r8(pc) & 0xf); - return 1 | SUPPORTED; - - case 0x90: - util::stream_format(stream, "stream control %02x %02x %02x %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4)); - return 5 | SUPPORTED; - - case 0x91: - util::stream_format(stream, "stream data %02x %02x %02x %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4)); - return 5 | SUPPORTED; - - case 0x92: - util::stream_format(stream, "stream frequency %02x %d", opcodes.r8(pc + 1), opcodes.r32(pc + 2)); - return 6 | SUPPORTED; - - case 0x93: - util::stream_format(stream, "stream start %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4), opcodes.r8(pc + 5), opcodes.r8(pc + 6), opcodes.r8(pc + 7), opcodes.r8(pc + 8), opcodes.r8(pc + 9), opcodes.r8(pc + 10)); - return 11 | SUPPORTED; - - case 0x94: - util::stream_format(stream, "stream stop %02x", opcodes.r8(pc + 1)); - return 2 | SUPPORTED; - - case 0x95: - util::stream_format(stream, "stream start short %02x %02x %02x %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3), opcodes.r8(pc + 4)); - return 5 | SUPPORTED; - - case 0xa0: - util::stream_format(stream, "ay8910.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xa1: - util::stream_format(stream, "ym2413.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xa2: - case 0xa3: - util::stream_format(stream, "ym2612.1 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xa4: - util::stream_format(stream, "ym2151.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xa5: - util::stream_format(stream, "ym2203.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xa6: - case 0xa7: - util::stream_format(stream, "ym2608.1 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xa8: - case 0xa9: - util::stream_format(stream, "ym2610.1 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xaa: - util::stream_format(stream, "ym3812.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xab: - util::stream_format(stream, "ym3526.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xac: - util::stream_format(stream, "y8950.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xad: - util::stream_format(stream, "ymz280b.1 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xae: - case 0xaf: - util::stream_format(stream, "ymf262.1 %d r%02x = %02x", opcodes.r8(pc) & 1, opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xb0: - util::stream_format(stream, "rf5c68 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xb1: - util::stream_format(stream, "rf5c164 r%02x = %02x", opcodes.r8(pc + 1), opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xb2: - util::stream_format(stream, "32x_pwm r%x = %03x", opcodes.r8(pc + 1) >> 4, opcodes.r8(pc + 2) | ((opcodes.r8(pc + 1) & 0xf) << 8)); - return 3 | SUPPORTED; - - case 0xb3: - util::stream_format(stream, "dmg.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xb4: - util::stream_format(stream, "nesapu.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xb5: - util::stream_format(stream, "multipcm.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xb6: - util::stream_format(stream, "upd7759.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xb7: - util::stream_format(stream, "okim6258.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xb8: - util::stream_format(stream, "okim6295.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xb9: - util::stream_format(stream, "huc6280.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xba: - util::stream_format(stream, "k053260.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xbb: - util::stream_format(stream, "pokey.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xbc: - util::stream_format(stream, "wonderswan.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xbd: - util::stream_format(stream, "saa1099.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xbe: - util::stream_format(stream, "es5505.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xbf: - util::stream_format(stream, "ga20.%d r%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2)); - return 3 | SUPPORTED; - - case 0xc0: - util::stream_format(stream, "segapcm.%d %04x = %02x", BIT(opcodes.r8(pc + 2), 7), opcodes.r8(pc + 1) | ((opcodes.r8(pc + 2) & 0x7f) << 8), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xc1: - util::stream_format(stream, "rf5c68 %04x = %02x", opcodes.r8(pc + 1) | (opcodes.r8(pc + 2) << 8), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xc2: - util::stream_format(stream, "rf5c164 %04x = %02x", opcodes.r8(pc + 1) | (opcodes.r8(pc + 2) << 8), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xc3: - util::stream_format(stream, "multipcm.%d c%02x.off = %04x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2) | (opcodes.r8(pc + 3) << 8)); - return 4 | SUPPORTED; - - case 0xc4: - util::stream_format(stream, "qsound %02x = %04x", opcodes.r8(pc + 3), opcodes.r8(pc + 2) | (opcodes.r8(pc + 1) << 8)); - return 4 | SUPPORTED; - - case 0xc5: - util::stream_format(stream, "scsp.%d %04x = %02x", BIT(opcodes.r8(pc + 1), 7), ((opcodes.r8(pc + 1) & 0x7f) << 8) | opcodes.r8(pc + 2), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xc6: - util::stream_format(stream, "wswan.%d %04x = %02x", BIT(opcodes.r8(pc + 1), 7), ((opcodes.r8(pc + 1) & 0x7f) << 8) | opcodes.r8(pc + 2), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xc7: - util::stream_format(stream, "vsu-vue.%d %04x = %02x", BIT(opcodes.r8(pc + 1), 7), ((opcodes.r8(pc + 1) & 0x7f) << 8) | opcodes.r8(pc + 2), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xc8: - util::stream_format(stream, "x1-010.%d %04x = %02x", BIT(opcodes.r8(pc + 1), 7), ((opcodes.r8(pc + 1) & 0x7f) << 8) | opcodes.r8(pc + 2), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xd0: - util::stream_format(stream, "ymf278b.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xd1: - util::stream_format(stream, "ymf271.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1), opcodes.r8(pc + 2), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xd2: - util::stream_format(stream, "scc1.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xd3: - util::stream_format(stream, "k054539.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xd4: - util::stream_format(stream, "c140.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xd5: - util::stream_format(stream, "ess5503.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xd6: - util::stream_format(stream, "ess5505.%d r%02x.%02x = %02x", BIT(opcodes.r8(pc + 1), 7), opcodes.r8(pc + 1) & 0x7f, opcodes.r8(pc + 2), opcodes.r8(pc + 3)); - return 4 | SUPPORTED; - - case 0xe0: - { - uint32_t off = opcodes.r8(pc + 1) | (opcodes.r8(pc + 2) << 8) | (opcodes.r8(pc + 3) << 16) | (opcodes.r8(pc + 4) << 24); - util::stream_format(stream, "ym2612 offset = %x", off); - return 5 | SUPPORTED; - } - - case 0xe1: - { - uint16_t addr = (opcodes.r8(pc + 1) << 8) | opcodes.r8(pc + 2); - uint16_t data = (opcodes.r8(pc + 3) << 8) | opcodes.r8(pc + 4); - util::stream_format(stream, "c352 r%04x = %04x", addr, data); - return 5 | SUPPORTED; - } - - default: - util::stream_format(stream, "?? %02x", opcodes.r8(pc)); - return 1 | SUPPORTED; - } -} - -uint8_t vgmplay_device::rom_r(int index, uint8_t type, offs_t offset) -{ - for (const auto &b : m_rom_blocks[index][type - 0x80]) - { - if (offset >= b.start_address && offset <= b.end_address) - { - return b.data[offset - b.start_address]; - } - } - return 0; -} - -template<int Index> -uint8_t vgmplay_device::segapcm_rom_r(offs_t offset) -{ - return rom_r(Index, 0x80, offset); -} - -template<int Index> -uint8_t vgmplay_device::ym2608_rom_r(offs_t offset) -{ - return rom_r(Index, 0x81, offset); -} - -template<int Index> -uint8_t vgmplay_device::ym2610_adpcm_a_rom_r(offs_t offset) -{ - return rom_r(Index, 0x82, offset); -} - -template<int Index> -uint8_t vgmplay_device::ym2610_adpcm_b_rom_r(offs_t offset) -{ - return rom_r(Index, 0x83, offset); -} - -template<int Index> -uint8_t vgmplay_device::ymf278b_rom_r(offs_t offset) -{ - return rom_r(Index, 0x84, offset); -} - -template<int Index> -uint8_t vgmplay_device::ymf271_rom_r(offs_t offset) -{ - return rom_r(Index, 0x85, offset); -} - -template<int Index> -uint8_t vgmplay_device::ymz280b_rom_r(offs_t offset) -{ - return rom_r(Index, 0x86, offset); -} - -template<int Index> -uint8_t vgmplay_device::y8950_rom_r(offs_t offset) -{ - return rom_r(Index, 0x88, offset); -} - -template<int Index> -uint8_t vgmplay_device::multipcm_rom_r(offs_t offset) -{ - if (m_multipcm_banked[Index] == 1) - { - offset &= 0x1fffff; - if (offset & 0x100000) - { - if (m_multipcm_bank_l[Index] == m_multipcm_bank_r[Index]) - { - offset = ((m_multipcm_bank_r[Index] & ~0xf) << 16) | (offset & 0xfffff); - } - else - { - if (offset & 0x80000) - { - offset = ((m_multipcm_bank_l[Index] & ~0x7) << 16) | (offset & 0x7ffff); - } - else - { - offset = ((m_multipcm_bank_r[Index] & ~0x7) << 16) | (offset & 0x7ffff); - } - } - } - } - return rom_r(Index, 0x89, offset); -} - -template<int Index> -uint8_t vgmplay_device::upd7759_rom_r(offs_t offset) -{ - return rom_r(Index, 0x8a, m_upd7759_bank[Index] | offset); -} - -template<int Index> -uint8_t vgmplay_device::okim6295_rom_r(offs_t offset) -{ - if (m_okim6295_nmk112_enable[Index]) - { - if ((offset < 0x400) && (m_okim6295_nmk112_enable[Index] & 0x80)) - { - offset = (m_okim6295_nmk112_bank[Index][(offset >> 8) & 0x3] << 16) | (offset & 0x3ff); - } - else - { - offset = (m_okim6295_nmk112_bank[Index][(offset >> 16) & 0x3] << 16) | (offset & 0xffff); - } - } - else - { - offset = (m_okim6295_bank[Index] * 0x40000) | offset; - } - return rom_r(Index, 0x8b, offset); -} - -template<int Index> -uint8_t vgmplay_device::k054539_rom_r(offs_t offset) -{ - return rom_r(Index, 0x8c, offset); -} - -template<int Index> -uint16_t vgmplay_device::c140_rom_r(offs_t offset) -{ - switch (m_c140_bank[Index]) - { - case C140_SYSTEM2: - offset = ((offset & 0x200000) >> 2) | (offset & 0x7ffff); - return rom_r(Index, 0x8d, offset) << 8; // high 8 bit only - case C140_SYSTEM21: - offset = ((offset & 0x300000) >> 1) | (offset & 0x7ffff); - return rom_r(Index, 0x8d, offset) << 8; // high 8 bit only - case C140_ASIC219: - return 0; // c140 not used in this mode - default: - return (rom_r(Index, 0x8d, offset * 2 + 1) << 8) | rom_r(Index, 0x8d, offset * 2); // 8 bit sample - } - return 0; -} - -template<int Index> -uint16_t vgmplay_device::c219_rom_r(offs_t offset) -{ - if (m_c140_bank[Index] == C140_ASIC219) - return (rom_r(Index, 0x8d, offset * 2 + 1) << 8) | rom_r(Index, 0x8d, offset * 2); // 8 bit sample - - return 0; -} - -template<int Index> -uint8_t vgmplay_device::k053260_rom_r(offs_t offset) -{ - return rom_r(Index, 0x8e, offset); -} - -template<int Index> -uint8_t vgmplay_device::qsound_rom_r(offs_t offset) -{ - return rom_r(Index, 0x8f, offset); -} - -template<int Index> -uint8_t vgmplay_device::es5505_rom_r(offs_t offset) -{ - return rom_r(Index, 0x90, offset); -} - -template<int Index> -uint8_t vgmplay_device::x1_010_rom_r(offs_t offset) -{ - return rom_r(Index, 0x91, offset); -} - -template<int Index> -uint8_t vgmplay_device::c352_rom_r(offs_t offset) -{ - return rom_r(Index, 0x92, offset); -} - -template<int Index> -uint8_t vgmplay_device::ga20_rom_r(offs_t offset) -{ - return rom_r(Index, 0x93, offset); -} - -vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_vgmplay(*this, "vgmplay") - , m_mixer(*this, "mixer") - , m_lspeaker(*this, "lspeaker") - , m_rspeaker(*this, "rspeaker") - , m_sn76489(*this, "sn76489.%d", 0) - , m_ym2413(*this, "ym2413.%d", 0) - , m_ym2612(*this, "ym2612.%d", 0) - , m_ym2151(*this, "ym2151.%d", 0) - , m_segapcm(*this, "segapcm.%d", 0) - , m_rf5c68(*this, "rf5c68") - , m_ym2203(*this, "ym2203.%d", 0) - , m_ym2608(*this, "ym2608.%d", 0) - , m_ym2610(*this, "ym2610.%d", 0) - , m_ym3812(*this, "ym3812.%d", 0) - , m_ym3526(*this, "ym3526.%d", 0) - , m_y8950(*this, "y8950.%d", 0) - , m_ymf262(*this, "ymf262.%d", 0) - , m_ymf278b(*this, "ymf278b.%d", 0) - , m_ymf271(*this, "ymf271.%d", 0) - , m_ymz280b(*this, "ymz280b.%d", 0) - , m_rf5c164(*this, "rf5c164") - , m_sega32x(*this, "sega32x") - , m_ay8910(*this, "ay8910.%d", 0) - , m_dmg(*this, "dmg.%d", 0) - , m_nescpu(*this, "nescpu.%d", 0) - , m_multipcm(*this, "multipcm.%d", 0) - , m_upd7759(*this, "upd7759.%d", 0) - , m_okim6258(*this, "okim6258.%d", 0) - , m_okim6295(*this, "okim6295.%d", 0) - , m_k051649(*this, "k051649.%d", 0) - , m_k054539(*this, "k054539.%d", 0) - , m_huc6280(*this, "huc6280.%d", 0) - , m_c140(*this, "c140.%d", 0) - , m_c219(*this, "c219.%d", 0) - , m_k053260(*this, "k053260.%d", 0) - , m_pokey(*this, "pokey.%d", 0) - , m_qsound(*this, "qsound") - , m_scsp(*this, "scsp.%d", 0) - , m_wswan(*this, "wswan.%d", 0) - , m_vsu_vue(*this, "vsu_vue.%d", 0) - , m_saa1099(*this, "saa1099.%d", 0) - , m_es5503(*this, "es5503.%d", 0) - , m_es5505(*this, "es5505.%d", 0) - , m_x1_010(*this, "x1_010.%d", 0) - , m_c352(*this, "c352.%d", 0) - , m_ga20(*this, "ga20.%d", 0) -{ - std::fill(std::begin(m_upd7759_md), std::end(m_upd7759_md), 0); - std::fill(std::begin(m_upd7759_reset), std::end(m_upd7759_drq), 0); - std::fill(std::begin(m_upd7759_drq), std::end(m_upd7759_drq), 0); -} - -void vgmplay_state::machine_start() -{ - save_item(NAME(m_held_clock)); -} - -uint32_t vgmplay_state::r32(int off) const -{ - if (off + 3 < int(m_file_data.size())) - return m_file_data[off] | (m_file_data[off + 1] << 8) | (m_file_data[off + 2] << 16) | (m_file_data[off + 3] << 24); - return 0; -} - -uint8_t vgmplay_state::r8(int off) const -{ - if (off < int(m_file_data.size())) - return m_file_data[off]; - return 0; -} - -static const ay8910_device::psg_type_t vgm_ay8910_type(uint8_t vgm_type) -{ - return (vgm_type & 0x10) ? ay8910_device::PSG_TYPE_YM : ay8910_device::PSG_TYPE_AY; -} - -static const uint8_t vgm_ay8910_flags(uint8_t vgm_flags) -{ - uint8_t flags = 0; - if (vgm_flags & 1) flags |= AY8910_LEGACY_OUTPUT; - if (vgm_flags & 2) flags |= AY8910_SINGLE_OUTPUT; - if (vgm_flags & 4) flags |= AY8910_DISCRETE_OUTPUT; - return flags; -} - -static const C140_TYPE c140_bank_type(uint8_t vgm_type) -{ - switch (vgm_type) - { - case 0: - default: - return C140_SYSTEM2; - case 1: - return C140_SYSTEM21; - case 2: - return C140_ASIC219; - } -} - -void vgmplay_device::set_c140_bank_type(int index, C140_TYPE type) -{ - m_c140_bank[index] = type; -} - -QUICKLOAD_LOAD_MEMBER(vgmplay_state::load_file) -{ - m_vgmplay->stop(); - - m_file_data.resize(quickload_size); - - if (!quickload_size || - image.fread(&m_file_data[0], quickload_size) != quickload_size) - { - m_file_data.clear(); - return image_init_result::FAIL; - } - else - { - // Decompress gzip-compressed files (aka vgz) - if(m_file_data[0] == 0x1f && m_file_data[1] == 0x8b) - { - std::vector<uint8_t> decomp; - int bs = m_file_data.size(); - decomp.resize(2*bs); - z_stream str; - str.zalloc = nullptr; - str.zfree = nullptr; - str.opaque = nullptr; - str.data_type = 0; - str.next_in = &m_file_data[0]; - str.avail_in = m_file_data.size(); - str.total_in = 0; - str.total_out = 0; - int err = inflateInit2(&str, 31); - if(err != Z_OK) - { - logerror("gzip header but not a gzip file\n"); - m_file_data.clear(); - return image_init_result::FAIL; - } - do - { - if(str.total_out >= decomp.size()) - decomp.resize(decomp.size() + bs); - str.next_out = &decomp[str.total_out]; - str.avail_out = decomp.size() - str.total_out; - err = inflate(&str, Z_SYNC_FLUSH); - } while(err == Z_OK); - - if(err != Z_STREAM_END) - { - logerror("broken gzip file\n"); - m_file_data.clear(); - return image_init_result::FAIL; - } - m_file_data.resize(str.total_out); - memcpy(&m_file_data[0], &decomp[0], str.total_out); - } - - if(m_file_data.size() < 0x40 || r32(0) != 0x206d6756) - { - logerror("Not a vgm/vgz file\n"); - m_file_data.clear(); - return image_init_result::FAIL; - } - - uint32_t version = r32(8); - logerror("File version %x.%02x\n", version >> 8, version & 0xff); - - uint32_t data_start = version >= 0x150 ? r32(0x34) + 0x34 : 0x40; - int volbyte = version >= 0x160 && data_start >= 0x7d ? r8(0x7c) : 0; - logerror("Volume %02x\n", volbyte); - - if (volbyte == 0xc1) // 0x00~0xc0 0~192, 0xc1 -64, 0xc2~0xff -62~-1 - volbyte = -0x40; - else if (volbyte > 0xc1) - volbyte -= 0x100; - - float volume = version >= 0x160 && data_start >= 0x7d ? powf(2.0f, float(volbyte) / float(0x20)) : 1.0f; - - 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; - - 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 (chip_volume_start != 0) - osd_printf_warning("Warning: file has unsupported chip volumes\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; - float chip_volume = volume; - bool has_2chip = false; - - if (min_version <= version && offset + 4 <= header_size && (chip_num == 0 || (r32(offset) & 0x40000000) != 0)) - { - c = r32(offset); - has_2chip = (c & 0x40000000) != 0; - - 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; - } - } - } - - if (has_2chip) - { - chip_volume /= 2.0f; - } - device.set_unscaled_clock(c & ~0xc0000000); - if (device.unscaled_clock() != 0) - dynamic_cast<device_sound_interface *>(&device)->set_output_gain(ALL_OUTPUTS, chip_volume); - else - dynamic_cast<device_sound_interface *>(&device)->set_output_gain(ALL_OUTPUTS, 0); - - 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"); - - 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"); - - 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); - - 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)); - m_ay8910[1]->set_flags(vgm_ay8910_flags(version >= 0x151 && header_size >= 0x7a ? r8(0x79) : 0)); - m_ym2203[0]->set_flags(vgm_ay8910_flags(version >= 0x151 && header_size >= 0x7b ? r8(0x7a) : 0)); - m_ym2203[1]->set_flags(vgm_ay8910_flags(version >= 0x151 && header_size >= 0x7b ? r8(0x7a) : 0)); - 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)); - - 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"); - - setup_device(*m_multipcm[0], 0, CT_MULTIPCM, 0x88, 0x161); - setup_device(*m_multipcm[1], 1, CT_MULTIPCM, 0x88, 0x161); - - 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]); - - 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; - m_okim6258[0]->set_divider(m_okim6258_divider[0]); - m_okim6258[0]->set_outbits(BIT(okim6258_flags, 3) ? 12 : 10); - m_okim6258[0]->set_type(BIT(okim6258_flags, 2)); - m_okim6258_divider[1] = okim6258_flags & 3; - m_okim6258[1]->set_divider(m_okim6258_divider[1]); - m_okim6258[1]->set_outbits(BIT(okim6258_flags, 3) ? 12 : 10); - m_okim6258[1]->set_type(BIT(okim6258_flags, 2)); - - m_k054539[0]->init_flags(version >= 0x161 && header_size >= 0x96 ? r8(0x95) : 0); - m_k054539[1]->init_flags(version >= 0x161 && header_size >= 0x96 ? r8(0x95) : 0); - - C140_TYPE c140_type = c140_bank_type(version >= 0x161 && header_size >= 0x96 ? r8(0x96) : 0); - m_vgmplay->set_c140_bank_type(0, c140_type); - m_vgmplay->set_c140_bank_type(1, c140_type); - - 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); - - 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 - 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"); - - // 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); - - setup_device(*m_huc6280[0], 0, CT_C6280, 0xa4, 0x161); - setup_device(*m_huc6280[1], 1, CT_C6280, 0xa4, 0x161); - if (c140_type == C140_ASIC219) - { - setup_device(*m_c219[0], 0, CT_C140, 0xa8, 0x161); - setup_device(*m_c219[1], 1, CT_C140, 0xa8, 0x161); - } - else - { - 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); - - setup_device(*m_qsound, 0, CT_QSOUND, 0xb4, 0x161); - - // HACK: VGMs contain 4,000,000 instead of 60,000,000 - 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"); - - 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); - //m_es5503[1]->set_channels(version >= 0x171 && header_size >= 0xd5 ? r8(0xd4) : 0); - //m_es5505[0]->set_channels(version >= 0x171 && header_size >= 0xd6 ? r8(0xd5) : 0); - //m_es5505[1]->set_channels(version >= 0x171 && header_size >= 0xd6 ? r8(0xd5) : 0); - - 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); - - setup_device(*m_x1_010[0], 0, CT_X1_010, 0xd8, 0x171); - setup_device(*m_x1_010[1], 1, CT_X1_010, 0xd8, 0x171); - - 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"); - - 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) - logerror("%s %d\n", child.tag(), child.clock()); - - //for (auto &stream : machine().sound().streams()) - // if (stream->sample_rate() != 0) - // logerror("%s %d\n", stream->device().tag(), stream->sample_rate()); - - machine().schedule_soft_reset(); - - return image_init_result::PASS; - } -} - -uint8_t vgmplay_state::file_r(offs_t offset) -{ - if (offset < m_file_data.size()) - return m_file_data[offset]; - return 0; -} - -uint8_t vgmplay_state::file_size_r(offs_t offset) -{ - uint32_t size = m_file_data.size(); - return size >> (8 * offset); -} - -template<int Index> -void vgmplay_device::multipcm_bank_hi_w(offs_t offset, uint8_t data) -{ - if (offset & 1) - m_multipcm_bank_l[Index] = (m_multipcm_bank_l[Index] & 0xff) | (data << 16); - if (offset & 2) - m_multipcm_bank_r[Index] = (m_multipcm_bank_r[Index] & 0xff) | (data << 16); -} - -template<int Index> -void vgmplay_device::multipcm_bank_lo_w(offs_t offset, uint8_t data) -{ - if (offset & 1) - m_multipcm_bank_l[Index] = (m_multipcm_bank_l[Index] & 0xff00) | data; - if (offset & 2) - m_multipcm_bank_r[Index] = (m_multipcm_bank_r[Index] & 0xff00) | data; - - m_multipcm_banked[Index] = 1; -} - -template<int Index> -void vgmplay_state::upd7759_reset_w(uint8_t data) -{ - int reset = data != 0; - - m_upd7759[Index]->reset_w(reset); - - if (m_upd7759_reset[Index] != reset) - { - m_upd7759_reset[Index] = reset; - - if (!reset) - std::queue<uint8_t>().swap(m_upd7759_slave_data[Index]); - } -} - -template<int Index> -void vgmplay_state::upd7759_data_w(uint8_t data) -{ - if (!m_upd7759_md[Index] && !m_upd7759_drq[Index]) - { - m_upd7759_slave_data[Index].push(data); - } - else - { - m_upd7759[Index]->port_w(data); - m_upd7759_drq[Index] = 0; - } -} - -template<int Index> -WRITE_LINE_MEMBER(vgmplay_state::upd7759_drq_w) -{ - if (m_upd7759_drq[Index] && !state) - osd_printf_error("upd7759.%d underflow\n", Index); - - m_upd7759_drq[Index] = state; - - if (!m_upd7759_md[Index] && m_upd7759_drq[Index] && !m_upd7759_slave_data[Index].empty()) - { - 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 Index> -void vgmplay_device::upd7759_bank_w(uint8_t data) -{ - // TODO: upd7759 update stream - m_upd7759_bank[Index] = data * 0x20000; -} - -template<int Index> -void vgmplay_state::okim6258_clock_w(offs_t offset, uint8_t data, uint8_t mem_mask) -{ - int shift = ((offset & 3) << 3); - uint32_t c = (m_okim6258[Index]->unscaled_clock() & ~(mem_mask << shift)) | ((data & mem_mask) << shift); - m_okim6258[Index]->set_unscaled_clock(c); - -} - -template<int Index> -void vgmplay_state::okim6258_divider_w(offs_t offset, uint8_t data, uint8_t mem_mask) -{ - if ((data & mem_mask) != (m_okim6258_divider[Index] & mem_mask)) - { - COMBINE_DATA(&m_okim6258_divider[Index]); - m_okim6258[Index]->set_divider(m_okim6258_divider[Index]); - } -} - -template<int Index> -void vgmplay_state::okim6295_clock_w(offs_t offset, uint8_t data, uint8_t mem_mask) -{ - int shift = ((offset & 3) << 3); - uint32_t c = (m_okim6295[Index]->unscaled_clock() & ~(mem_mask << shift)) | ((data & mem_mask) << shift); - m_okim6295[Index]->set_unscaled_clock(c); - -} - -template<int Index> -void vgmplay_state::okim6295_pin7_w(offs_t offset, uint8_t data, uint8_t mem_mask) -{ - if ((data & mem_mask) != (m_okim6295_pin7[Index] & mem_mask)) - { - COMBINE_DATA(&m_okim6295_pin7[Index]); - m_okim6295[Index]->set_pin7(m_okim6295_pin7[Index]); - } -} - -template<int Index> -void vgmplay_device::okim6295_nmk112_enable_w(offs_t offset, uint8_t data, uint8_t mem_mask) -{ - COMBINE_DATA(&m_okim6295_nmk112_enable[Index]); -} - -template<int Index> -void vgmplay_device::okim6295_bank_w(offs_t offset, uint8_t data, uint8_t mem_mask) -{ - if ((data & mem_mask) != (m_okim6295_bank[Index] & mem_mask)) - { - COMBINE_DATA(&m_okim6295_bank[Index]); - } -} - -template<int Index> -void vgmplay_device::okim6295_nmk112_bank_w(offs_t offset, uint8_t data, uint8_t mem_mask) -{ - offset &= 3; - if ((data & mem_mask) != (m_okim6295_nmk112_bank[Index][offset] & mem_mask)) - { - COMBINE_DATA(&m_okim6295_nmk112_bank[Index][offset]); - } -} - -template<int Index> -void vgmplay_state::scc_w(offs_t offset, uint8_t data) -{ - switch (offset & 1) - { - case 0x00: - m_scc_reg[Index] = data; - break; - case 0x01: - switch (offset >> 1) - { - case 0x00: - m_k051649[Index]->k051649_waveform_w(m_scc_reg[Index], data); - break; - case 0x01: - m_k051649[Index]->k051649_frequency_w(m_scc_reg[Index], data); - break; - case 0x02: - m_k051649[Index]->k051649_volume_w(m_scc_reg[Index], data); - break; - case 0x03: - m_k051649[Index]->k051649_keyonoff_w(data); - break; - case 0x04: - m_k051649[Index]->k052539_waveform_w(m_scc_reg[Index], data); - break; - case 0x05: - m_k051649[Index]->k051649_test_w(data); - break; - } - break; - } -} - -template<int Index> -void vgmplay_state::c140_c219_w(offs_t offset, uint8_t data) -{ - if (m_vgmplay->c140_bank(Index) == C140_ASIC219) - m_c219[Index]->c219_w(offset, data); - else - m_c140[Index]->c140_w(offset, data); -} - -INPUT_CHANGED_MEMBER(vgmplay_state::key_pressed) -{ - if (!newval && param != VGMPLAY_HOLD) - return; - - switch (param) - { - case VGMPLAY_STOP: - m_vgmplay->stop(); - break; - case VGMPLAY_PAUSE: - m_vgmplay->pause(); - break; - case VGMPLAY_PLAY: - m_vgmplay->play(); - break; - case VGMPLAY_RESTART: - m_vgmplay->reset(); - break; - case VGMPLAY_LOOP: - m_vgmplay->toggle_loop(); - break; - case VGMPLAY_VIZ: - m_mixer->cycle_viz_mode(); - break; - case VGMPLAY_RATE_DOWN: - m_vgmplay->set_unscaled_clock((uint32_t)(m_vgmplay->clock() * 0.95f)); - break; - case VGMPLAY_RATE_UP: - m_vgmplay->set_unscaled_clock((uint32_t)(m_vgmplay->clock() / 0.95f)); - break; - case VGMPLAY_RATE_RST: - m_vgmplay->set_unscaled_clock(44100); - break; - case VGMPLAY_HOLD: - if (newval) - { - m_held_clock = m_vgmplay->clock(); - m_vgmplay->set_unscaled_clock(0); - } - else - { - m_vgmplay->set_unscaled_clock(m_held_clock); - } - } -} - -static INPUT_PORTS_START( vgmplay ) - PORT_START("CONTROLS") - PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_STOP) PORT_NAME("Stop") - PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_PAUSE) PORT_NAME("Pause") - PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_PLAY) PORT_NAME("Play") - PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_BUTTON4) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_RESTART) PORT_NAME("Restart") - PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_BUTTON5) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_LOOP) PORT_NAME("Loop") - PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_BUTTON6) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_VIZ) PORT_NAME("Visualization Mode") - PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_BUTTON7) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_RATE_DOWN) PORT_CODE(KEYCODE_R) PORT_NAME("Rate Down") - PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_BUTTON8) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_RATE_UP) PORT_CODE(KEYCODE_T) PORT_NAME("Rate Up") - PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_BUTTON9) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_RATE_RST) PORT_CODE(KEYCODE_Y) PORT_NAME("Rate Reset") - PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_BUTTON10) PORT_CHANGED_MEMBER(DEVICE_SELF, vgmplay_state, key_pressed, VGMPLAY_HOLD) PORT_CODE(KEYCODE_U) PORT_NAME("Rate Hold") -INPUT_PORTS_END - -void vgmplay_state::file_map(address_map &map) -{ - map(0x00000000, 0xffffffff).r(FUNC(vgmplay_state::file_r)); -} - -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_SN76489_0 + 0, vgmplay_device::A_SN76489_0 + 0).w(m_sn76489[0], FUNC(sn76489_device::write)); - //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::write)); - //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)); - map(vgmplay_device::A_YM2612_1, vgmplay_device::A_YM2612_1 + 3).w(m_ym2612[1], FUNC(ym2612_device::write)); - map(vgmplay_device::A_YM2151_0, vgmplay_device::A_YM2151_0 + 1).w(m_ym2151[0], FUNC(ym2151_device::write)); - map(vgmplay_device::A_YM2151_1, vgmplay_device::A_YM2151_1 + 1).w(m_ym2151[1], FUNC(ym2151_device::write)); - map(vgmplay_device::A_SEGAPCM_0, vgmplay_device::A_SEGAPCM_0 + 0x7ff).w(m_segapcm[0], FUNC(segapcm_device::write)); - map(vgmplay_device::A_SEGAPCM_1, vgmplay_device::A_SEGAPCM_1 + 0x7ff).w(m_segapcm[1], FUNC(segapcm_device::write)); - map(vgmplay_device::A_RF5C68, vgmplay_device::A_RF5C68 + 0xf).w(m_rf5c68, FUNC(rf5c68_device::rf5c68_w)); - map(vgmplay_device::A_RF5C68_RAM, vgmplay_device::A_RF5C68_RAM + 0xffff).w(m_rf5c68, FUNC(rf5c68_device::rf5c68_mem_w)); - map(vgmplay_device::A_YM2203_0, vgmplay_device::A_YM2203_0 + 1).w(m_ym2203[0], FUNC(ym2203_device::write)); - map(vgmplay_device::A_YM2203_1, vgmplay_device::A_YM2203_1 + 1).w(m_ym2203[1], FUNC(ym2203_device::write)); - map(vgmplay_device::A_YM2608_0, vgmplay_device::A_YM2608_0 + 0x3).w(m_ym2608[0], FUNC(ym2608_device::write)); - map(vgmplay_device::A_YM2608_1, vgmplay_device::A_YM2608_1 + 0x3).w(m_ym2608[1], FUNC(ym2608_device::write)); - map(vgmplay_device::A_YM2610_0, vgmplay_device::A_YM2610_0 + 0x3).w(m_ym2610[0], FUNC(ym2610_device::write)); - map(vgmplay_device::A_YM2610_1, vgmplay_device::A_YM2610_1 + 0x3).w(m_ym2610[1], FUNC(ym2610_device::write)); - map(vgmplay_device::A_YM3812_0, vgmplay_device::A_YM3812_0 + 1).w(m_ym3812[0], FUNC(ym3812_device::write)); - map(vgmplay_device::A_YM3812_1, vgmplay_device::A_YM3812_1 + 1).w(m_ym3812[1], FUNC(ym3812_device::write)); - map(vgmplay_device::A_YM3526_0, vgmplay_device::A_YM3526_0 + 1).w(m_ym3526[0], FUNC(ym3526_device::write)); - map(vgmplay_device::A_YM3526_1, vgmplay_device::A_YM3526_1 + 1).w(m_ym3526[1], FUNC(ym3526_device::write)); - map(vgmplay_device::A_Y8950_0, vgmplay_device::A_Y8950_0 + 1).w(m_y8950[0], FUNC(y8950_device::write)); - map(vgmplay_device::A_Y8950_1, vgmplay_device::A_Y8950_1 + 1).w(m_y8950[1], FUNC(y8950_device::write)); - map(vgmplay_device::A_YMF262_0, vgmplay_device::A_YMF262_0 + 3).w(m_ymf262[0], FUNC(ymf262_device::write)); - map(vgmplay_device::A_YMF262_1, vgmplay_device::A_YMF262_1 + 3).w(m_ymf262[1], FUNC(ymf262_device::write)); - map(vgmplay_device::A_YMF278B_0, vgmplay_device::A_YMF278B_0 + 0xf).w(m_ymf278b[0], FUNC(ymf278b_device::write)); - map(vgmplay_device::A_YMF278B_1, vgmplay_device::A_YMF278B_1 + 0xf).w(m_ymf278b[1], FUNC(ymf278b_device::write)); - map(vgmplay_device::A_YMF271_0, vgmplay_device::A_YMF271_0 + 0xf).w(m_ymf271[0], FUNC(ymf271_device::write)); - map(vgmplay_device::A_YMF271_1, vgmplay_device::A_YMF271_1 + 0xf).w(m_ymf271[1], FUNC(ymf271_device::write)); - map(vgmplay_device::A_YMZ280B_0, vgmplay_device::A_YMZ280B_0 + 0x1).w(m_ymz280b[0], FUNC(ymz280b_device::write)); - map(vgmplay_device::A_YMZ280B_1, vgmplay_device::A_YMZ280B_1 + 0x1).w(m_ymz280b[1], FUNC(ymz280b_device::write)); - map(vgmplay_device::A_RF5C164, vgmplay_device::A_RF5C164 + 0xf).w(m_rf5c164, FUNC(rf5c68_device::rf5c68_w)); - map(vgmplay_device::A_RF5C164_RAM, vgmplay_device::A_RF5C164_RAM + 0xffff).w(m_rf5c164, FUNC(rf5c68_device::rf5c68_mem_w)); - map(vgmplay_device::A_AY8910_0, vgmplay_device::A_AY8910_0).w(m_ay8910[0], FUNC(ay8910_device::data_w)); - map(vgmplay_device::A_AY8910_0 + 1, vgmplay_device::A_AY8910_0 + 1).w(m_ay8910[0], FUNC(ay8910_device::address_w)); - map(vgmplay_device::A_AY8910_1, vgmplay_device::A_AY8910_1).w(m_ay8910[1], FUNC(ay8910_device::data_w)); - map(vgmplay_device::A_AY8910_1 + 1, vgmplay_device::A_AY8910_1 + 1).w(m_ay8910[1], FUNC(ay8910_device::address_w)); - map(vgmplay_device::A_GAMEBOY_0, vgmplay_device::A_GAMEBOY_0 + 0x16).w(m_dmg[0], FUNC(gameboy_sound_device::sound_w)); - map(vgmplay_device::A_GAMEBOY_0 + 0x20, vgmplay_device::A_GAMEBOY_0 + 0x2f).w(m_dmg[0], FUNC(gameboy_sound_device::wave_w)); - map(vgmplay_device::A_GAMEBOY_1, vgmplay_device::A_GAMEBOY_1 + 0x16).w(m_dmg[1], FUNC(gameboy_sound_device::sound_w)); - map(vgmplay_device::A_GAMEBOY_1 + 0x20, vgmplay_device::A_GAMEBOY_1 + 0x2f).w(m_dmg[1], FUNC(gameboy_sound_device::wave_w)); - map(vgmplay_device::A_NESAPU_0, vgmplay_device::A_NESAPU_0 + 0x1f).w("nescpu.0:nesapu", FUNC(nesapu_device::write)); - map(vgmplay_device::A_NES_RAM_0, vgmplay_device::A_NES_RAM_0 + 0xffff).ram().share("nesapu_ram.0"); - map(vgmplay_device::A_NESAPU_1, vgmplay_device::A_NESAPU_1 + 0x1f).w("nescpu.1:nesapu", FUNC(nesapu_device::write)); - map(vgmplay_device::A_NES_RAM_1, vgmplay_device::A_NES_RAM_1 + 0xffff).ram().share("nesapu_ram.1"); - map(vgmplay_device::A_MULTIPCM_0, vgmplay_device::A_MULTIPCM_0 + 3).w(m_multipcm[0], FUNC(multipcm_device::write)); - map(vgmplay_device::A_MULTIPCM_0 + 4, vgmplay_device::A_MULTIPCM_0 + 7).w("vgmplay", FUNC(vgmplay_device::multipcm_bank_hi_w<0>)); - map(vgmplay_device::A_MULTIPCM_0 + 8, vgmplay_device::A_MULTIPCM_0 + 11).w("vgmplay", FUNC(vgmplay_device::multipcm_bank_lo_w<0>)); - map(vgmplay_device::A_MULTIPCM_1, vgmplay_device::A_MULTIPCM_1 + 3).w(m_multipcm[1], FUNC(multipcm_device::write)); - map(vgmplay_device::A_MULTIPCM_1 + 4, vgmplay_device::A_MULTIPCM_1 + 7).w("vgmplay", FUNC(vgmplay_device::multipcm_bank_hi_w<1>)); - map(vgmplay_device::A_MULTIPCM_1 + 8, vgmplay_device::A_MULTIPCM_1 + 11).w("vgmplay", FUNC(vgmplay_device::multipcm_bank_lo_w<1>)); - map(vgmplay_device::A_UPD7759_0 + 0, vgmplay_device::A_UPD7759_0 + 0).w(FUNC(vgmplay_state::upd7759_reset_w<0>)); - map(vgmplay_device::A_UPD7759_0 + 1, vgmplay_device::A_UPD7759_0 + 1).lw8(NAME([this](uint8_t data) {m_upd7759[0]->start_w(data != 0); })); - map(vgmplay_device::A_UPD7759_0 + 2, vgmplay_device::A_UPD7759_0 + 2).w(FUNC(vgmplay_state::upd7759_data_w<0>)); - map(vgmplay_device::A_UPD7759_0 + 3, vgmplay_device::A_UPD7759_0 + 3).w("vgmplay", FUNC(vgmplay_device::upd7759_bank_w<0>)); - map(vgmplay_device::A_UPD7759_1 + 0, vgmplay_device::A_UPD7759_1 + 0).w(FUNC(vgmplay_state::upd7759_reset_w<1>)); - map(vgmplay_device::A_UPD7759_1 + 1, vgmplay_device::A_UPD7759_1 + 1).lw8(NAME([this](uint8_t data) {m_upd7759[1]->start_w(data != 0); })); - map(vgmplay_device::A_UPD7759_1 + 2, vgmplay_device::A_UPD7759_1 + 2).w(FUNC(vgmplay_state::upd7759_data_w<1>)); - map(vgmplay_device::A_UPD7759_1 + 3, vgmplay_device::A_UPD7759_1 + 3).w("vgmplay", FUNC(vgmplay_device::upd7759_bank_w<1>)); - map(vgmplay_device::A_OKIM6258_0 + 0x0, vgmplay_device::A_OKIM6258_0 + 0x0).w(m_okim6258[0], FUNC(okim6258_device::ctrl_w)); - map(vgmplay_device::A_OKIM6258_0 + 0x1, vgmplay_device::A_OKIM6258_0 + 0x1).w(m_okim6258[0], FUNC(okim6258_device::data_w)); - map(vgmplay_device::A_OKIM6258_0 + 0x2, vgmplay_device::A_OKIM6258_0 + 0x2).nopw(); // TODO: okim6258 pan - map(vgmplay_device::A_OKIM6258_0 + 0x8, vgmplay_device::A_OKIM6258_0 + 0xb).w(FUNC(vgmplay_state::okim6258_clock_w<0>)); - map(vgmplay_device::A_OKIM6258_0 + 0xc, vgmplay_device::A_OKIM6258_0 + 0xc).w(FUNC(vgmplay_state::okim6258_divider_w<0>)); - map(vgmplay_device::A_OKIM6258_1 + 0x0, vgmplay_device::A_OKIM6258_1 + 0x0).w(m_okim6258[1], FUNC(okim6258_device::ctrl_w)); - map(vgmplay_device::A_OKIM6258_1 + 0x1, vgmplay_device::A_OKIM6258_1 + 0x1).w(m_okim6258[1], FUNC(okim6258_device::data_w)); - map(vgmplay_device::A_OKIM6258_1 + 0x2, vgmplay_device::A_OKIM6258_1 + 0x2).nopw(); // TODO: okim6258 pan - map(vgmplay_device::A_OKIM6258_1 + 0x8, vgmplay_device::A_OKIM6258_1 + 0xb).w(FUNC(vgmplay_state::okim6258_clock_w<1>)); - map(vgmplay_device::A_OKIM6258_1 + 0xc, vgmplay_device::A_OKIM6258_1 + 0xc).w(FUNC(vgmplay_state::okim6258_divider_w<1>)); - map(vgmplay_device::A_OKIM6295_0, vgmplay_device::A_OKIM6295_0).w(m_okim6295[0], FUNC(okim6295_device::write)); - map(vgmplay_device::A_OKIM6295_0 + 0x8, vgmplay_device::A_OKIM6295_0 + 0xb).w(FUNC(vgmplay_state::okim6295_clock_w<0>)); - map(vgmplay_device::A_OKIM6295_0 + 0xc, vgmplay_device::A_OKIM6295_0 + 0xc).w(FUNC(vgmplay_state::okim6295_pin7_w<0>)); - map(vgmplay_device::A_OKIM6295_0 + 0xe, vgmplay_device::A_OKIM6295_0 + 0xe).w("vgmplay", FUNC(vgmplay_device::okim6295_nmk112_enable_w<0>)); - map(vgmplay_device::A_OKIM6295_0 + 0xf, vgmplay_device::A_OKIM6295_0 + 0xf).w("vgmplay", FUNC(vgmplay_device::okim6295_bank_w<0>)); - map(vgmplay_device::A_OKIM6295_0 + 0x10, vgmplay_device::A_OKIM6295_0 + 0x13).w("vgmplay", FUNC(vgmplay_device::okim6295_nmk112_bank_w<0>)); - map(vgmplay_device::A_OKIM6295_1, vgmplay_device::A_OKIM6295_1).w(m_okim6295[1], FUNC(okim6295_device::write)); - map(vgmplay_device::A_OKIM6295_1 + 0x8, vgmplay_device::A_OKIM6295_1 + 0xb).w(FUNC(vgmplay_state::okim6295_clock_w<1>)); - map(vgmplay_device::A_OKIM6295_1 + 0xc, vgmplay_device::A_OKIM6295_1 + 0xc).w(FUNC(vgmplay_state::okim6295_pin7_w<1>)); - map(vgmplay_device::A_OKIM6295_1 + 0xe, vgmplay_device::A_OKIM6295_1 + 0xe).w("vgmplay", FUNC(vgmplay_device::okim6295_nmk112_enable_w<1>)); - map(vgmplay_device::A_OKIM6295_1 + 0xf, vgmplay_device::A_OKIM6295_1 + 0xf).w("vgmplay", FUNC(vgmplay_device::okim6295_bank_w<1>)); - map(vgmplay_device::A_OKIM6295_1 + 0x10, vgmplay_device::A_OKIM6295_1 + 0x13).w("vgmplay", FUNC(vgmplay_device::okim6295_nmk112_bank_w<1>)); - map(vgmplay_device::A_K051649_0, vgmplay_device::A_K051649_0 + 0xf).w(FUNC(vgmplay_state::scc_w<0>)); - map(vgmplay_device::A_K051649_1, vgmplay_device::A_K051649_1 + 0xf).w(FUNC(vgmplay_state::scc_w<1>)); - map(vgmplay_device::A_K054539_0, vgmplay_device::A_K054539_0 + 0x22f).w(m_k054539[0], FUNC(k054539_device::write)); - map(vgmplay_device::A_K054539_1, vgmplay_device::A_K054539_1 + 0x22f).w(m_k054539[1], FUNC(k054539_device::write)); - map(vgmplay_device::A_C6280_0, vgmplay_device::A_C6280_0 + 0xf).w("huc6280.0:psg", FUNC(c6280_device::c6280_w)); - map(vgmplay_device::A_C6280_1, vgmplay_device::A_C6280_1 + 0xf).w("huc6280.1:psg", FUNC(c6280_device::c6280_w)); - map(vgmplay_device::A_C140_0, vgmplay_device::A_C140_0 + 0x1ff).w(FUNC(vgmplay_state::c140_c219_w<0>)); - map(vgmplay_device::A_C140_1, vgmplay_device::A_C140_1 + 0x1ff).w(FUNC(vgmplay_state::c140_c219_w<1>)); - map(vgmplay_device::A_K053260_0, vgmplay_device::A_K053260_0 + 0x2f).w(m_k053260[0], FUNC(k053260_device::write)); - map(vgmplay_device::A_K053260_1, vgmplay_device::A_K053260_1 + 0x2f).w(m_k053260[1], FUNC(k053260_device::write)); - map(vgmplay_device::A_POKEY_0, vgmplay_device::A_POKEY_0 + 0xf).w(m_pokey[0], FUNC(pokey_device::write)); - map(vgmplay_device::A_POKEY_1, vgmplay_device::A_POKEY_1 + 0xf).w(m_pokey[1], FUNC(pokey_device::write)); - map(vgmplay_device::A_QSOUND, vgmplay_device::A_QSOUND + 0x2).w(m_qsound, FUNC(qsound_device::qsound_w)); - map(vgmplay_device::A_WSWAN_0, vgmplay_device::A_WSWAN_0 + 0xff).w(m_wswan[0], FUNC(wswan_sound_device::port_w)); - map(vgmplay_device::A_WSWAN_1, vgmplay_device::A_WSWAN_1 + 0xff).w(m_wswan[1], FUNC(wswan_sound_device::port_w)); - map(vgmplay_device::A_WSWAN_RAM_0, vgmplay_device::A_WSWAN_RAM_0 + 0x3fff).ram().share("wswan_ram.0"); - map(vgmplay_device::A_WSWAN_RAM_1, vgmplay_device::A_WSWAN_RAM_1 + 0x3fff).ram().share("wswan_ram.1"); - map(vgmplay_device::A_VSU_VUE_0, vgmplay_device::A_VSU_VUE_0 + 0x5ff).w(m_vsu_vue[0], FUNC(vboysnd_device::write)); - map(vgmplay_device::A_VSU_VUE_1, vgmplay_device::A_VSU_VUE_1 + 0x5ff).w(m_vsu_vue[1], FUNC(vboysnd_device::write)); - map(vgmplay_device::A_SAA1099_0, vgmplay_device::A_SAA1099_0 + 1).w(m_saa1099[0], FUNC(saa1099_device::write)); - map(vgmplay_device::A_SAA1099_1, vgmplay_device::A_SAA1099_1 + 1).w(m_saa1099[1], FUNC(saa1099_device::write)); - map(vgmplay_device::A_ES5503_0, vgmplay_device::A_ES5503_0 + 0xe2).w(m_es5503[0], FUNC(es5503_device::write)); - map(vgmplay_device::A_ES5503_RAM_0, vgmplay_device::A_ES5503_RAM_0 + 0x1ffff).ram().share("es5503_ram.0"); - map(vgmplay_device::A_ES5503_1, vgmplay_device::A_ES5503_1 + 0xe2).w(m_es5503[1], FUNC(es5503_device::write)); - map(vgmplay_device::A_ES5503_RAM_1, vgmplay_device::A_ES5503_RAM_1 + 0x1ffff).ram().share("es5503_ram.1"); - // TODO: es5505 - map(vgmplay_device::A_X1_010_0, vgmplay_device::A_X1_010_0 + 0x1fff).w(m_x1_010[0], FUNC(x1_010_device::write)); - map(vgmplay_device::A_X1_010_1, vgmplay_device::A_X1_010_1 + 0x1fff).w(m_x1_010[1], FUNC(x1_010_device::write)); - map(vgmplay_device::A_GA20_0, vgmplay_device::A_GA20_0 + 0x1f).w(m_ga20[0], FUNC(iremga20_device::write)); - map(vgmplay_device::A_GA20_1, vgmplay_device::A_GA20_1 + 0x1f).w(m_ga20[1], FUNC(iremga20_device::write)); -} - -void vgmplay_state::soundchips16_map(address_map &map) -{ - map(vgmplay_device::A_32X_PWM, vgmplay_device::A_32X_PWM + 0xf).w(m_sega32x, FUNC(sega_32x_device::pwm_w)); - map(vgmplay_device::A_SCSP_0, vgmplay_device::A_SCSP_0 + 0xfff).w(m_scsp[0], FUNC(scsp_device::write)); - map(vgmplay_device::A_SCSP_1, vgmplay_device::A_SCSP_1 + 0xfff).w(m_scsp[1], FUNC(scsp_device::write)); - map(vgmplay_device::A_SCSP_RAM_0, vgmplay_device::A_SCSP_RAM_0 + 0xfffff).ram().share("scsp_ram.0"); - map(vgmplay_device::A_SCSP_RAM_1, vgmplay_device::A_SCSP_RAM_1 + 0xfffff).ram().share("scsp_ram.1"); - map(vgmplay_device::A_C352_0, vgmplay_device::A_C352_0 + 0x7fff).w(m_c352[0], FUNC(c352_device::write)); - map(vgmplay_device::A_C352_1, vgmplay_device::A_C352_1 + 0x7fff).w(m_c352[1], FUNC(c352_device::write)); -} - -template<int Index> -void vgmplay_state::segapcm_map(address_map &map) -{ - map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::segapcm_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::rf5c68_map(address_map &map) -{ - map(0, 0xffff).ram().share(Index ? "rf5c68_ram.1" : "rf5c68_ram.0"); -} - -template<int Index> -void vgmplay_state::ym2608_map(address_map &map) -{ - map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::ym2608_rom_r<Index>)); -} - -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<Index>)); -} - -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<Index>)); -} - -template<int Index> -void vgmplay_state::y8950_map(address_map &map) -{ - map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::y8950_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::ymf278b_map(address_map &map) -{ - map(0, 0x3fffff).r("vgmplay", FUNC(vgmplay_device::ymf278b_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::ymf271_map(address_map &map) -{ - map(0, 0x7fffff).r("vgmplay", FUNC(vgmplay_device::ymf271_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::ymz280b_map(address_map &map) -{ - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::ymz280b_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::nescpu_map(address_map &map) -{ - map(0, 0xffff).ram().share(Index ? "nesapu_ram.1" : "nesapu_ram.0"); -} - -template<int Index> -void vgmplay_state::multipcm_map(address_map &map) -{ - map(0, 0x3fffff).r("vgmplay", FUNC(vgmplay_device::multipcm_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::upd7759_map(address_map &map) -{ - map(0, 0x1ffff).r("vgmplay", FUNC(vgmplay_device::upd7759_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::okim6295_map(address_map &map) -{ - map(0, 0x3ffff).r("vgmplay", FUNC(vgmplay_device::okim6295_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::k054539_map(address_map &map) -{ - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::k054539_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::c140_map(address_map &map) -{ - map(0, 0x1ffffff).r("vgmplay", FUNC(vgmplay_device::c140_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::c219_map(address_map &map) -{ - map(0, 0x07ffff).r("vgmplay", FUNC(vgmplay_device::c219_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::k053260_map(address_map &map) -{ - map(0, 0x1fffff).r("vgmplay", FUNC(vgmplay_device::k053260_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::qsound_map(address_map &map) -{ - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::qsound_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::scsp_map(address_map &map) -{ - map(0, 0xfffff).ram().share(Index ? "scsp_ram.1" : "scsp_ram.0"); -} - -template<int Index> -void vgmplay_state::wswan_map(address_map &map) -{ - map(0, 0x3fff).ram().share(Index ? "wswan_ram.1" : "wswan_ram.0"); -} - -template<int Index> -void vgmplay_state::es5503_map(address_map &map) -{ - map(0, 0x1ffff).ram().share(Index ? "es5503_ram.1" : "es5503_ram.0"); -} - -template<int Index> -void vgmplay_state::es5505_map(address_map &map) -{ - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::es5505_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::x1_010_map(address_map &map) -{ - map(0, 0xfffff).r("vgmplay", FUNC(vgmplay_device::x1_010_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::c352_map(address_map &map) -{ - map(0, 0xffffff).r("vgmplay", FUNC(vgmplay_device::c352_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::ga20_map(address_map &map) -{ - map(0, 0xfffff).r("vgmplay", FUNC(vgmplay_device::ga20_rom_r<Index>)); -} - -template<int Index> -void vgmplay_state::rf5c164_map(address_map &map) -{ - map(0, 0xffff).ram().share("rf5c164_ram"); -} - -void vgmplay_state::vgmplay(machine_config &config) -{ - VGMPLAY(config, m_vgmplay, 44100); - m_vgmplay->set_addrmap(AS_PROGRAM, &vgmplay_state::file_map); - m_vgmplay->set_addrmap(AS_IO, &vgmplay_state::soundchips_map); - m_vgmplay->set_addrmap(AS_IO16, &vgmplay_state::soundchips16_map); - - quickload_image_device &quickload(QUICKLOAD(config, "quickload", "vgm,vgz")); - quickload.set_load_callback(FUNC(vgmplay_state::load_file)); - quickload.set_interface("vgm_quik"); - - SOFTWARE_LIST(config, "vgm_list").set_original("vgmplay"); - - config.set_default_layout(layout_vgmplay); - - SN76489(config, m_sn76489[0], 0); - m_sn76489[0]->add_route(0, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_sn76489[0]->add_route(0, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - SN76489(config, m_sn76489[1], 0); - m_sn76489[1]->add_route(0, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_sn76489[1]->add_route(0, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - YM2413(config, m_ym2413[0], 0); - m_ym2413[0]->add_route(ALL_OUTPUTS, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_ym2413[0]->add_route(ALL_OUTPUTS, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - YM2413(config, m_ym2413[1], 0); - m_ym2413[1]->add_route(ALL_OUTPUTS, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_ym2413[1]->add_route(ALL_OUTPUTS, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - YM2612(config, m_ym2612[0], 0); - m_ym2612[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_ym2612[0]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - YM2612(config, m_ym2612[1], 0); - m_ym2612[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_ym2612[1]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - YM2151(config, m_ym2151[0], 0); - m_ym2151[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_ym2151[0]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - YM2151(config, m_ym2151[1], 0); - m_ym2151[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_ym2151[1]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - SEGAPCM(config, m_segapcm[0], 0); - m_segapcm[0]->set_addrmap(0, &vgmplay_state::segapcm_map<0>); - m_segapcm[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_segapcm[0]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - SEGAPCM(config, m_segapcm[1], 0); - m_segapcm[1]->set_addrmap(0, &vgmplay_state::segapcm_map<1>); - m_segapcm[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_segapcm[1]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - RF5C68(config, m_rf5c68, 0); - m_rf5c68->set_addrmap(0, &vgmplay_state::rf5c68_map<0>); - m_rf5c68->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_rf5c68->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - // TODO: prevent error.log spew - YM2203(config, m_ym2203[0], 0); - m_ym2203[0]->add_route(ALL_OUTPUTS, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_ym2203[0]->add_route(ALL_OUTPUTS, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - - YM2203(config, m_ym2203[1], 0); - m_ym2203[1]->add_route(ALL_OUTPUTS, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_ym2203[1]->add_route(ALL_OUTPUTS, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - - // TODO: prevent error.log spew - YM2608(config, m_ym2608[0], 0); - m_ym2608[0]->set_addrmap(0, &vgmplay_state::ym2608_map<0>); - m_ym2608[0]->add_route(0, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_ym2608[0]->add_route(0, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - m_ym2608[0]->add_route(1, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_ym2608[0]->add_route(2, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - - YM2608(config, m_ym2608[1], 0); - m_ym2608[1]->set_addrmap(0, &vgmplay_state::ym2608_map<1>); - m_ym2608[1]->add_route(0, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_ym2608[1]->add_route(0, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - m_ym2608[1]->add_route(1, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_ym2608[1]->add_route(2, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - - // TODO: prevent error.log spew - YM2610(config, m_ym2610[0], 0); - m_ym2610[0]->set_addrmap(0, &vgmplay_state::ym2610_adpcm_a_map<0>); - m_ym2610[0]->set_addrmap(1, &vgmplay_state::ym2610_adpcm_b_map<0>); - m_ym2610[0]->add_route(0, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_ym2610[0]->add_route(0, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - m_ym2610[0]->add_route(1, m_mixer, 0.50, AUTO_ALLOC_INPUT, 0); - m_ym2610[0]->add_route(2, m_mixer, 0.50, AUTO_ALLOC_INPUT, 1); - - YM2610(config, m_ym2610[1], 0); - m_ym2610[1]->set_addrmap(0, &vgmplay_state::ym2610_adpcm_a_map<1>); - m_ym2610[1]->set_addrmap(1, &vgmplay_state::ym2610_adpcm_b_map<1>); - m_ym2610[1]->add_route(0, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_ym2610[1]->add_route(0, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - m_ym2610[1]->add_route(1, m_mixer, 0.50, AUTO_ALLOC_INPUT, 0); - m_ym2610[1]->add_route(2, m_mixer, 0.50, AUTO_ALLOC_INPUT, 1); - - YM3812(config, m_ym3812[0], 0); - m_ym3812[0]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_ym3812[0]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - YM3812(config, m_ym3812[1], 0); - m_ym3812[1]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_ym3812[1]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - YM3526(config, m_ym3526[0], 0); - m_ym3526[0]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_ym3526[0]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - YM3526(config, m_ym3526[1], 0); - m_ym3526[1]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_ym3526[1]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - Y8950(config, m_y8950[0], 0); - m_y8950[0]->set_addrmap(0, &vgmplay_state::y8950_map<0>); - m_y8950[0]->add_route(ALL_OUTPUTS, m_mixer, 0.40, AUTO_ALLOC_INPUT, 0); - m_y8950[0]->add_route(ALL_OUTPUTS, m_mixer, 0.40, AUTO_ALLOC_INPUT, 1); - - Y8950(config, m_y8950[1], 0); - m_y8950[1]->set_addrmap(0, &vgmplay_state::y8950_map<1>); - m_y8950[1]->add_route(ALL_OUTPUTS, m_mixer, 0.40, AUTO_ALLOC_INPUT, 0); - m_y8950[1]->add_route(ALL_OUTPUTS, m_mixer, 0.40, AUTO_ALLOC_INPUT, 1); - - YMF262(config, m_ymf262[0], 0); - m_ymf262[0]->add_route(0, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_ymf262[0]->add_route(1, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - m_ymf262[0]->add_route(2, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_ymf262[0]->add_route(3, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - - YMF262(config, m_ymf262[1], 0); - m_ymf262[1]->add_route(0, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_ymf262[1]->add_route(1, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - m_ymf262[1]->add_route(2, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_ymf262[1]->add_route(3, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - - // TODO: prevent error.log spew - YMF278B(config, m_ymf278b[0], 0); - m_ymf278b[0]->set_addrmap(0, &vgmplay_state::ymf278b_map<0>); - m_ymf278b[0]->add_route(0, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_ymf278b[0]->add_route(1, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - m_ymf278b[0]->add_route(2, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_ymf278b[0]->add_route(3, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - m_ymf278b[0]->add_route(4, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_ymf278b[0]->add_route(5, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - - YMF278B(config, m_ymf278b[1], 0); - m_ymf278b[1]->set_addrmap(0, &vgmplay_state::ymf278b_map<1>); - m_ymf278b[1]->add_route(0, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_ymf278b[1]->add_route(1, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - m_ymf278b[1]->add_route(2, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_ymf278b[1]->add_route(3, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - m_ymf278b[1]->add_route(4, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_ymf278b[1]->add_route(5, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - - YMF271(config, m_ymf271[0], 0); - m_ymf271[0]->set_addrmap(0, &vgmplay_state::ymf271_map<0>); - m_ymf271[0]->add_route(0, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_ymf271[0]->add_route(1, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - m_ymf271[0]->add_route(2, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_ymf271[0]->add_route(3, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - - YMF271(config, m_ymf271[1], 0); - m_ymf271[1]->set_addrmap(0, &vgmplay_state::ymf271_map<0>); - m_ymf271[1]->add_route(0, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_ymf271[1]->add_route(1, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - m_ymf271[1]->add_route(2, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_ymf271[1]->add_route(3, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - - // TODO: prevent error.log spew - YMZ280B(config, m_ymz280b[0], 0); - m_ymz280b[0]->set_addrmap(0, &vgmplay_state::ymz280b_map<0>); - m_ymz280b[0]->add_route(0, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_ymz280b[0]->add_route(1, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - - YMZ280B(config, m_ymz280b[1], 0); - m_ymz280b[1]->set_addrmap(0, &vgmplay_state::ymz280b_map<1>); - m_ymz280b[1]->add_route(0, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_ymz280b[1]->add_route(1, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - - RF5C164(config, m_rf5c164, 0); - m_rf5c164->set_addrmap(0, &vgmplay_state::rf5c164_map<0>); - m_rf5c164->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_rf5c164->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - /// TODO: rewrite to generate audio without using DAC devices - SEGA_32X_NTSC(config, m_sega32x, 0, "sega32x_maincpu", "sega32x_scanline_timer"); - m_sega32x->add_route(0, m_mixer, 1.00, AUTO_ALLOC_INPUT, 0); - m_sega32x->add_route(1, m_mixer, 1.00, AUTO_ALLOC_INPUT, 1); - - auto& sega32x_maincpu(M68000(config, "sega32x_maincpu", 0)); - sega32x_maincpu.set_disable(); - - TIMER(config, "sega32x_scanline_timer", 0); - - m_sega32x->subdevice<cpu_device>("32x_master_sh2")->set_disable(); - m_sega32x->subdevice<cpu_device>("32x_slave_sh2")->set_disable(); - - // TODO: prevent error.log spew - AY8910(config, m_ay8910[0], 0); - m_ay8910[0]->add_route(ALL_OUTPUTS, m_mixer, 0.33, AUTO_ALLOC_INPUT, 0); - m_ay8910[0]->add_route(ALL_OUTPUTS, m_mixer, 0.33, AUTO_ALLOC_INPUT, 1); - - AY8910(config, m_ay8910[1], 0); - m_ay8910[1]->add_route(ALL_OUTPUTS, m_mixer, 0.33, AUTO_ALLOC_INPUT, 0); - m_ay8910[1]->add_route(ALL_OUTPUTS, m_mixer, 0.33, AUTO_ALLOC_INPUT, 1); - - DMG_APU(config, m_dmg[0], 0); - m_dmg[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_dmg[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - DMG_APU(config, m_dmg[1], 0); - m_dmg[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_dmg[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - N2A03(config, m_nescpu[0], 0); - m_nescpu[0]->set_addrmap(AS_PROGRAM, &vgmplay_state::nescpu_map<0>); - m_nescpu[0]->set_disable(); - m_nescpu[0]->add_route(ALL_OUTPUTS, m_mixer, 0.50, AUTO_ALLOC_INPUT, 0); - m_nescpu[0]->add_route(ALL_OUTPUTS, m_mixer, 0.50, AUTO_ALLOC_INPUT, 1); - - N2A03(config, m_nescpu[1], 0); - m_nescpu[1]->set_addrmap(AS_PROGRAM, &vgmplay_state::nescpu_map<1>); - m_nescpu[1]->set_disable(); - m_nescpu[1]->add_route(ALL_OUTPUTS, m_mixer, 0.50, AUTO_ALLOC_INPUT, 0); - m_nescpu[1]->add_route(ALL_OUTPUTS, m_mixer, 0.50, AUTO_ALLOC_INPUT, 1); - - MULTIPCM(config, m_multipcm[0], 0); - m_multipcm[0]->set_addrmap(0, &vgmplay_state::multipcm_map<0>); - m_multipcm[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_multipcm[0]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - MULTIPCM(config, m_multipcm[1], 0); - m_multipcm[1]->set_addrmap(0, &vgmplay_state::multipcm_map<1>); - m_multipcm[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_multipcm[1]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - UPD7759(config, m_upd7759[0], 0); - m_upd7759[0]->drq().set(FUNC(vgmplay_state::upd7759_drq_w<0>)); - m_upd7759[0]->set_addrmap(0, &vgmplay_state::upd7759_map<0>); - m_upd7759[0]->add_route(ALL_OUTPUTS, m_mixer, 1.0, AUTO_ALLOC_INPUT, 0); - m_upd7759[0]->add_route(ALL_OUTPUTS, m_mixer, 1.0, AUTO_ALLOC_INPUT, 1); - - UPD7759(config, m_upd7759[1], 0); - m_upd7759[1]->drq().set(FUNC(vgmplay_state::upd7759_drq_w<1>)); - m_upd7759[1]->set_addrmap(0, &vgmplay_state::upd7759_map<1>); - m_upd7759[1]->add_route(ALL_OUTPUTS, m_mixer, 1.0, AUTO_ALLOC_INPUT, 0); - m_upd7759[1]->add_route(ALL_OUTPUTS, m_mixer, 1.0, AUTO_ALLOC_INPUT, 1); - - OKIM6258(config, m_okim6258[0], 0); - m_okim6258[0]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_okim6258[0]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - OKIM6258(config, m_okim6258[1], 0); - m_okim6258[1]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_okim6258[1]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - OKIM6295(config, m_okim6295[0], 0, okim6295_device::PIN7_HIGH); - m_okim6295[0]->set_addrmap(0, &vgmplay_state::okim6295_map<0>); - m_okim6295[0]->add_route(ALL_OUTPUTS, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_okim6295[0]->add_route(ALL_OUTPUTS, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - - OKIM6295(config, m_okim6295[1], 0, okim6295_device::PIN7_HIGH); - m_okim6295[1]->set_addrmap(0, &vgmplay_state::okim6295_map<1>); - m_okim6295[1]->add_route(ALL_OUTPUTS, m_mixer, 0.25, AUTO_ALLOC_INPUT, 0); - m_okim6295[1]->add_route(ALL_OUTPUTS, m_mixer, 0.25, AUTO_ALLOC_INPUT, 1); - - K051649(config, m_k051649[0], 0); - m_k051649[0]->add_route(ALL_OUTPUTS, m_mixer, 0.33, AUTO_ALLOC_INPUT, 0); - m_k051649[0]->add_route(ALL_OUTPUTS, m_mixer, 0.33, AUTO_ALLOC_INPUT, 1); - - K051649(config, m_k051649[1], 0); - m_k051649[1]->add_route(ALL_OUTPUTS, m_mixer, 0.33, AUTO_ALLOC_INPUT, 0); - m_k051649[1]->add_route(ALL_OUTPUTS, m_mixer, 0.33, AUTO_ALLOC_INPUT, 1); - - K054539(config, m_k054539[0], 0); - m_k054539[0]->set_addrmap(0, &vgmplay_state::k054539_map<0>); - m_k054539[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_k054539[0]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - K054539(config, m_k054539[1], 0); - m_k054539[1]->set_addrmap(0, &vgmplay_state::k054539_map<1>); - m_k054539[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_k054539[1]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - // TODO: prevent error.log spew - H6280(config, m_huc6280[0], 0); - m_huc6280[0]->set_disable(); - m_huc6280[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_huc6280[0]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - H6280(config, m_huc6280[1], 0); - m_huc6280[1]->set_disable(); - m_huc6280[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_huc6280[1]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - C140(config, m_c140[0], 0); - m_c140[0]->set_addrmap(0, &vgmplay_state::c140_map<0>); - m_c140[0]->add_route(0, m_mixer, 0.50, AUTO_ALLOC_INPUT, 0); - m_c140[0]->add_route(1, m_mixer, 0.50, AUTO_ALLOC_INPUT, 1); - - C140(config, m_c140[1], 0); - m_c140[1]->set_addrmap(0, &vgmplay_state::c140_map<1>); - m_c140[1]->add_route(0, m_mixer, 0.50, AUTO_ALLOC_INPUT, 0); - m_c140[1]->add_route(1, m_mixer, 0.50, AUTO_ALLOC_INPUT, 1); - - C219(config, m_c219[0], 0); - m_c219[0]->set_addrmap(0, &vgmplay_state::c219_map<0>); - m_c219[0]->add_route(0, m_mixer, 0.50, AUTO_ALLOC_INPUT, 0); - m_c219[0]->add_route(1, m_mixer, 0.50, AUTO_ALLOC_INPUT, 1); - - C219(config, m_c219[1], 0); - m_c219[1]->set_addrmap(0, &vgmplay_state::c219_map<1>); - m_c219[1]->add_route(0, m_mixer, 0.50, AUTO_ALLOC_INPUT, 0); - m_c219[1]->add_route(1, m_mixer, 0.50, AUTO_ALLOC_INPUT, 1); - - K053260(config, m_k053260[0], 0); - m_k053260[0]->set_addrmap(0, &vgmplay_state::k053260_map<0>); - m_k053260[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_k053260[0]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - K053260(config, m_k053260[1], 0); - m_k053260[1]->set_addrmap(0, &vgmplay_state::k053260_map<1>); - m_k053260[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_k053260[1]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - POKEY(config, m_pokey[0], 0); - m_pokey[0]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_pokey[0]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - POKEY(config, m_pokey[1], 0); - m_pokey[1]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_pokey[1]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - QSOUND(config, m_qsound, 0); - m_qsound->set_addrmap(0, &vgmplay_state::qsound_map<0>); - m_qsound->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_qsound->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - SCSP(config, m_scsp[0], 0); - m_scsp[0]->set_addrmap(0, &vgmplay_state::scsp_map<0>); - m_scsp[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_scsp[0]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - SCSP(config, m_scsp[1], 0); - m_scsp[1]->set_addrmap(0, &vgmplay_state::scsp_map<1>); - m_scsp[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_scsp[1]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - WSWAN_SND(config, m_wswan[0], 0); - m_wswan[0]->set_addrmap(0, &vgmplay_state::wswan_map<0>); - m_wswan[0]->add_route(0, m_mixer, 0.50, AUTO_ALLOC_INPUT, 0); - m_wswan[0]->add_route(1, m_mixer, 0.50, AUTO_ALLOC_INPUT, 1); - - WSWAN_SND(config, m_wswan[1], 0); - m_wswan[1]->set_addrmap(0, &vgmplay_state::wswan_map<1>); - m_wswan[1]->add_route(0, m_mixer, 0.50, AUTO_ALLOC_INPUT, 0); - m_wswan[1]->add_route(1, m_mixer, 0.50, AUTO_ALLOC_INPUT, 1); - - VBOYSND(config, m_vsu_vue[0], 0); - m_vsu_vue[0]->add_route(0, m_mixer, 1.0, AUTO_ALLOC_INPUT, 0); - m_vsu_vue[0]->add_route(1, m_mixer, 1.0, AUTO_ALLOC_INPUT, 1); - - VBOYSND(config, m_vsu_vue[1], 0); - m_vsu_vue[1]->add_route(0, m_mixer, 1.0, AUTO_ALLOC_INPUT, 0); - m_vsu_vue[1]->add_route(1, m_mixer, 1.0, AUTO_ALLOC_INPUT, 1); - - SAA1099(config, m_saa1099[0], 0); - m_saa1099[0]->add_route(0, m_mixer, 1.0, AUTO_ALLOC_INPUT, 0); - m_saa1099[0]->add_route(1, m_mixer, 1.0, AUTO_ALLOC_INPUT, 1); - - SAA1099(config, m_saa1099[1], 0); - m_saa1099[1]->add_route(0, m_mixer, 1.0, AUTO_ALLOC_INPUT, 0); - m_saa1099[1]->add_route(1, m_mixer, 1.0, AUTO_ALLOC_INPUT, 1); - - ES5503(config, m_es5503[0], 0); - m_es5503[0]->set_channels(2); - m_es5503[0]->set_addrmap(0, &vgmplay_state::es5503_map<0>); - m_es5503[0]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_es5503[0]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - ES5503(config, m_es5503[1], 0); - m_es5503[1]->set_channels(2); - m_es5503[1]->set_addrmap(0, &vgmplay_state::es5503_map<1>); - m_es5503[1]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_es5503[1]->add_route(ALL_OUTPUTS, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - ES5505(config, m_es5505[0], 0); - // TODO m_es5505[0]->set_addrmap(0, &vgmplay_state::es5505_map<0>); - // TODO m_es5505[0]->set_addrmap(1, &vgmplay_state::es5505_map<0>); - m_es5505[0]->set_channels(1); - m_es5505[0]->add_route(0, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_es5505[0]->add_route(1, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - ES5505(config, m_es5505[1], 0); - // TODO m_es5505[1]->set_addrmap(0, &vgmplay_state::es5505_map<1>); - // TODO m_es5505[1]->set_addrmap(1, &vgmplay_state::es5505_map<1>); - m_es5505[1]->set_channels(1); - m_es5505[1]->add_route(0, m_mixer, 0.5, AUTO_ALLOC_INPUT, 0); - m_es5505[1]->add_route(1, m_mixer, 0.5, AUTO_ALLOC_INPUT, 1); - - X1_010(config, m_x1_010[0], 0); - m_x1_010[0]->set_addrmap(0, &vgmplay_state::x1_010_map<0>); - m_x1_010[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_x1_010[0]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - X1_010(config, m_x1_010[1], 0); - m_x1_010[1]->set_addrmap(0, &vgmplay_state::x1_010_map<1>); - m_x1_010[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_x1_010[1]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - C352(config, m_c352[0], 0, 1); - m_c352[0]->set_addrmap(0, &vgmplay_state::c352_map<0>); - m_c352[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_c352[0]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - m_c352[0]->add_route(2, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_c352[0]->add_route(3, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - C352(config, m_c352[1], 0, 1); - m_c352[1]->set_addrmap(0, &vgmplay_state::c352_map<1>); - m_c352[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_c352[1]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - m_c352[1]->add_route(2, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_c352[1]->add_route(3, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - IREMGA20(config, m_ga20[0], 0); - m_ga20[0]->set_addrmap(0, &vgmplay_state::ga20_map<0>); - m_ga20[0]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_ga20[0]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - IREMGA20(config, m_ga20[1], 0); - m_ga20[1]->set_addrmap(0, &vgmplay_state::ga20_map<1>); - m_ga20[1]->add_route(0, m_mixer, 1, AUTO_ALLOC_INPUT, 0); - m_ga20[1]->add_route(1, m_mixer, 1, AUTO_ALLOC_INPUT, 1); - - VGMVIZ(config, m_mixer, 0); - m_mixer->add_route(0, "lspeaker", 1); - m_mixer->add_route(1, "rspeaker", 1); - - SPEAKER(config, m_lspeaker).front_left(); - SPEAKER(config, m_rspeaker).front_right(); -} - -ROM_START( vgmplay ) - // TODO: split up 32x to remove dependencies - ROM_REGION( 0x4000, "master", ROMREGION_ERASE00 ) - ROM_REGION( 0x4000, "slave", ROMREGION_ERASE00 ) - ROM_REGION( 0x400000, "gamecart", ROMREGION_ERASE00 ) - ROM_REGION32_BE( 0x400000, "gamecart_sh2", ROMREGION_ERASE00 ) -ROM_END - -CONS( 2016, vgmplay, 0, 0, vgmplay, vgmplay, vgmplay_state, empty_init, "MAME", "VGM player", MACHINE_CLICKABLE_ARTWORK ) |