diff --git a/src/devices/sound/c6280.cpp b/src/devices/sound/c6280.cpp index d484b8281c0..f12d381e24f 100644 --- a/src/devices/sound/c6280.cpp +++ b/src/devices/sound/c6280.cpp @@ -239,26 +239,14 @@ c6280_device::c6280_device(const machine_config &mconfig, const char *tag, devic } //------------------------------------------------- -// device_start - device-specific startup +// calculate_clocks - (re)calculate clock-derived +// members //------------------------------------------------- -void c6280_device::device_start() +void c6280_device::calculate_clocks() { int rate = clock() / 16; - /* Create stereo stream */ - m_stream = machine().sound().stream_alloc(*this, 0, 2, rate); - - /* Loudest volume level for table */ - double level = 65535.0 / 6.0 / 32.0; - - /* Clear context */ - m_select = 0; - m_balance = 0; - m_lfo_frequency = 0; - m_lfo_control = 0; - memset(m_channel, 0, sizeof(channel) * 8); - /* Make waveform frequency table */ for (int i = 0; i < 4096; i += 1) { @@ -273,6 +261,35 @@ void c6280_device::device_start() m_noise_freq_tab[i] = (UINT32)step; } + if (m_stream != nullptr) + m_stream->set_sample_rate(rate); + else + m_stream = machine().sound().stream_alloc(*this, 0, 2, rate); +} + +void c6280_device::device_clock_changed() +{ + calculate_clocks(); +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void c6280_device::device_start() +{ + /* Loudest volume level for table */ + double level = 65535.0 / 6.0 / 32.0; + + /* Clear context */ + m_select = 0; + m_balance = 0; + m_lfo_frequency = 0; + m_lfo_control = 0; + memset(m_channel, 0, sizeof(channel) * 8); + + calculate_clocks(); + /* Make volume table */ /* PSG has 48dB volume range spread over 32 steps */ double step = 48.0 / 32.0; diff --git a/src/devices/sound/c6280.h b/src/devices/sound/c6280.h index 7b78f5efe0e..4949d693ef2 100644 --- a/src/devices/sound/c6280.h +++ b/src/devices/sound/c6280.h @@ -22,11 +22,14 @@ public: protected: // device-level overrides virtual void device_start() override; + virtual void device_clock_changed() override; // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; private: + void calculate_clocks(); + struct channel { UINT16 m_frequency; UINT8 m_control; diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp index 4aad74874aa..ce57b9d36ad 100644 --- a/src/mame/drivers/vgmplay.cpp +++ b/src/mame/drivers/vgmplay.cpp @@ -11,12 +11,14 @@ #include "imagedev/bitbngr.h" #include "cpu/m6502/n2a03.h" +#include "cpu/h6280/h6280.h" #include "sound/2612intf.h" #include "sound/ym2151.h" #include "sound/ym2413.h" #include "sound/2203intf.h" #include "sound/3526intf.h" #include "sound/ay8910.h" +#include "sound/c6280.h" #include "sound/sn76496.h" #include "sound/k053260.h" #include "sound/segapcm.h" @@ -39,6 +41,7 @@ public: A_AY8910B = 0x00000080, A_SN76496 = 0x00000090, A_K053260 = 0x000000a0, + A_C6280 = 0x000000d0, A_SEGAPCM = 0x00001000, A_GAMEBOY = 0x00002000, A_NESAPU = 0x00002030, @@ -139,6 +142,9 @@ private: required_device m_dmg; required_device m_nescpu; required_shared_ptr m_nesram; + required_device m_k053260; + required_device m_c6280; + required_device m_h6280; UINT32 m_multipcma_bank_l; UINT32 m_multipcma_bank_r; @@ -368,16 +374,6 @@ void vgmplay_device::execute_run() m_icount -= code & 0xf; break; - case 0xb3: - m_io->write_byte(A_GAMEBOY + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); - m_pc += 3; - break; - - case 0xc0: - m_io->write_byte(A_SEGAPCM + (m_file->read_word(m_pc+1) & 0x7ff), m_file->read_byte(m_pc+3)); - m_pc += 4; - break; - case 0xa0: { UINT8 reg = m_file->read_byte(m_pc+1); @@ -395,6 +391,16 @@ void vgmplay_device::execute_run() break; } + case 0xb3: + m_io->write_byte(A_GAMEBOY + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + m_pc += 3; + break; + + case 0xc0: + m_io->write_byte(A_SEGAPCM + (m_file->read_word(m_pc+1) & 0x7ff), m_file->read_byte(m_pc+3)); + m_pc += 4; + break; + case 0xb4: m_io->write_byte(A_NESAPU + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); m_pc += 3; @@ -411,6 +417,11 @@ void vgmplay_device::execute_run() break; } + case 0xb9: + m_io->write_byte(A_C6280 + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); + m_pc += 3; + break; + case 0xba: m_io->write_byte(A_K053260 + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2)); m_pc += 3; @@ -439,7 +450,7 @@ void vgmplay_device::execute_run() break; default: - logerror("unhandled code %02x\n", code); + logerror("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)); m_state = DONE; m_icount = 0; break; @@ -685,7 +696,7 @@ offs_t vgmplay_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 * return 3 | DASMFLAG_SUPPORTED; case 0xb1: - sprintf(buffer, "rf5c68 r%02x = %02x", oprom[1], oprom[2]); + sprintf(buffer, "rf5c164 r%02x = %02x", oprom[1], oprom[2]); return 3 | DASMFLAG_SUPPORTED; case 0xb2: @@ -713,19 +724,19 @@ offs_t vgmplay_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 * return 3 | DASMFLAG_SUPPORTED; case 0xb8: - sprintf(buffer, "huc6280 r%02x = %02x", oprom[1], oprom[2]); + sprintf(buffer, "okim6295 r%02x = %02x", oprom[1], oprom[2]); return 3 | DASMFLAG_SUPPORTED; case 0xb9: - sprintf(buffer, "k053260 r%02x = %02x", oprom[1], oprom[2]); + sprintf(buffer, "huc6280 r%02x = %02x", oprom[1], oprom[2]); return 3 | DASMFLAG_SUPPORTED; case 0xba: - sprintf(buffer, "pokey r%02x = %02x", oprom[1], oprom[2]); + sprintf(buffer, "k053260 r%02x = %02x", oprom[1], oprom[2]); return 3 | DASMFLAG_SUPPORTED; case 0xbb: - sprintf(buffer, "rf5c68 r%02x = %02x", oprom[1], oprom[2]); + sprintf(buffer, "pokey r%02x = %02x", oprom[1], oprom[2]); return 3 | DASMFLAG_SUPPORTED; case 0xc0: @@ -812,24 +823,27 @@ READ8_MEMBER(vgmplay_device::k053260_rom_r) return rom_r(0, 0x8e, offset); } -vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_file(*this, "file"), - m_ym2612(*this, "ym2612"), - m_ym2151(*this, "ym2151"), - m_ym2413(*this, "ym2413"), - m_ym2203a(*this, "ym2203a"), - m_ym2203b(*this, "ym2203b"), - m_ym3526(*this, "ym3526"), - m_ay8910a(*this, "ay8910a"), - m_ay8910b(*this, "ay8910b"), - m_sn76496(*this, "sn76496"), - m_segapcm(*this, "segapcm"), - m_multipcma(*this, "multipcma"), - m_multipcmb(*this, "multipcmb"), - m_dmg(*this, "dmg"), - m_nescpu(*this, "nescpu"), - m_nesram(*this, "nesapu_ram") +vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_file(*this, "file") + , m_ym2612(*this, "ym2612") + , m_ym2151(*this, "ym2151") + , m_ym2413(*this, "ym2413") + , m_ym2203a(*this, "ym2203a") + , m_ym2203b(*this, "ym2203b") + , m_ym3526(*this, "ym3526") + , m_ay8910a(*this, "ay8910a") + , m_ay8910b(*this, "ay8910b") + , m_sn76496(*this, "sn76496") + , m_segapcm(*this, "segapcm") + , m_multipcma(*this, "multipcma") + , m_multipcmb(*this, "multipcmb") + , m_dmg(*this, "dmg") + , m_nescpu(*this, "nescpu") + , m_nesram(*this, "nesapu_ram") + , m_k053260(*this, "k053260") + , m_c6280(*this, "c6280") + , m_h6280(*this, "h6280") { } @@ -993,6 +1007,12 @@ void vgmplay_state::machine_start() m_multipcma->set_unscaled_clock(r32(0x88) &~ 0x40000000); m_multipcmb->set_unscaled_clock(r32(0x88) &~ 0x40000000); } + if(version >= 0x161 && r32(0xac)) { + m_k053260->set_unscaled_clock(r32(0xac)); + } + if(version >= 0x161 && r32(0xa4)) { + m_c6280->set_unscaled_clock(r32(0xa4)); + } } } @@ -1054,12 +1074,12 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( soundchips_map, AS_IO, 8, vgmplay_state ) AM_RANGE(vgmplay_device::REG_SIZE, vgmplay_device::REG_SIZE+3) AM_READ(file_size_r) - AM_RANGE(vgmplay_device::A_YM2612, vgmplay_device::A_YM2612+3) AM_DEVREADWRITE("ym2612", ym2612_device, read, write) - AM_RANGE(vgmplay_device::A_YM2151, vgmplay_device::A_YM2151+1) AM_DEVREADWRITE("ym2151", ym2151_device, read, write) - AM_RANGE(vgmplay_device::A_YM2413, vgmplay_device::A_YM2413+1) AM_DEVWRITE ("ym2413", ym2413_device, write) - AM_RANGE(vgmplay_device::A_YM2203A, vgmplay_device::A_YM2203A+1) AM_DEVREADWRITE("ym2203a", ym2203_device, read, write) - AM_RANGE(vgmplay_device::A_YM2203B, vgmplay_device::A_YM2203B+1) AM_DEVREADWRITE("ym2203b", ym2203_device, read, write) - AM_RANGE(vgmplay_device::A_YM3526, vgmplay_device::A_YM3526+1) AM_DEVWRITE ("ym3526", ym3526_device, write) + AM_RANGE(vgmplay_device::A_YM2612, vgmplay_device::A_YM2612+3) AM_DEVWRITE ("ym2612", ym2612_device, write) + AM_RANGE(vgmplay_device::A_YM2151, vgmplay_device::A_YM2151+1) AM_DEVWRITE ("ym2151", ym2151_device, write) + AM_RANGE(vgmplay_device::A_YM2413, vgmplay_device::A_YM2413+1) AM_DEVWRITE ("ym2413", ym2413_device, write) + AM_RANGE(vgmplay_device::A_YM2203A, vgmplay_device::A_YM2203A+1) AM_DEVWRITE ("ym2203a", ym2203_device, write) + AM_RANGE(vgmplay_device::A_YM2203B, vgmplay_device::A_YM2203B+1) AM_DEVWRITE ("ym2203b", ym2203_device, write) + AM_RANGE(vgmplay_device::A_YM3526, vgmplay_device::A_YM3526+1) AM_DEVWRITE ("ym3526", ym3526_device, write) AM_RANGE(vgmplay_device::A_AY8910A, vgmplay_device::A_AY8910A) AM_DEVWRITE ("ay8910a", ay8910_device, data_w) AM_RANGE(vgmplay_device::A_AY8910A+1, vgmplay_device::A_AY8910A+1) AM_DEVWRITE ("ay8910a", ay8910_device, address_w) AM_RANGE(vgmplay_device::A_AY8910B, vgmplay_device::A_AY8910B) AM_DEVWRITE ("ay8910b", ay8910_device, data_w) @@ -1067,15 +1087,16 @@ static ADDRESS_MAP_START( soundchips_map, AS_IO, 8, vgmplay_state ) // AM_RANGE(vgmplay_device::A_SN76496+0, vgmplay_device::A_SN76496+0) AM_DEVWRITE ("sn76496", sn76496_device, stereo_w) AM_RANGE(vgmplay_device::A_SN76496+1, vgmplay_device::A_SN76496+1) AM_DEVWRITE ("sn76496", sn76496_device, write) AM_RANGE(vgmplay_device::A_K053260, vgmplay_device::A_K053260+0x2f) AM_DEVWRITE ("k053260", k053260_device, write) - AM_RANGE(vgmplay_device::A_SEGAPCM, vgmplay_device::A_SEGAPCM+0x7ff) AM_DEVREADWRITE("segapcm", segapcm_device, sega_pcm_r, sega_pcm_w) - AM_RANGE(vgmplay_device::A_GAMEBOY, vgmplay_device::A_GAMEBOY+0x16) AM_DEVREADWRITE("dmg", gameboy_sound_device, sound_r, sound_w) - AM_RANGE(vgmplay_device::A_GAMEBOY+0x20, vgmplay_device::A_GAMEBOY+0x2f) AM_DEVREADWRITE("dmg", gameboy_sound_device, wave_r, wave_w) - AM_RANGE(vgmplay_device::A_NESAPU, vgmplay_device::A_NESAPU+0x1f) AM_DEVREADWRITE("nescpu:nesapu", nesapu_device, read, write) + AM_RANGE(vgmplay_device::A_C6280, vgmplay_device::A_C6280+0xf) AM_DEVWRITE ("c6280", c6280_device, c6280_w) + AM_RANGE(vgmplay_device::A_SEGAPCM, vgmplay_device::A_SEGAPCM+0x7ff) AM_DEVWRITE ("segapcm", segapcm_device, sega_pcm_w) + AM_RANGE(vgmplay_device::A_GAMEBOY, vgmplay_device::A_GAMEBOY+0x16) AM_DEVWRITE ("dmg", gameboy_sound_device, sound_w) + AM_RANGE(vgmplay_device::A_GAMEBOY+0x20, vgmplay_device::A_GAMEBOY+0x2f) AM_DEVWRITE ("dmg", gameboy_sound_device, wave_w) + AM_RANGE(vgmplay_device::A_NESAPU, vgmplay_device::A_NESAPU+0x1f) AM_DEVWRITE ("nescpu:nesapu", nesapu_device, write) AM_RANGE(vgmplay_device::A_NESRAM, vgmplay_device::A_NESRAM+0xffff) AM_RAM AM_SHARE("nesapu_ram") - AM_RANGE(vgmplay_device::A_MULTIPCMA, vgmplay_device::A_MULTIPCMA+3) AM_DEVREADWRITE("multipcma", multipcm_device, read, write ) + AM_RANGE(vgmplay_device::A_MULTIPCMA, vgmplay_device::A_MULTIPCMA+3) AM_DEVWRITE ("multipcma", multipcm_device, write ) AM_RANGE(vgmplay_device::A_MULTIPCMA+4, vgmplay_device::A_MULTIPCMA+7) AM_WRITE(multipcm_bank_hi_a_w) AM_RANGE(vgmplay_device::A_MULTIPCMA+8, vgmplay_device::A_MULTIPCMA+11) AM_WRITE(multipcm_bank_lo_a_w) - AM_RANGE(vgmplay_device::A_MULTIPCMB, vgmplay_device::A_MULTIPCMB+3) AM_DEVREADWRITE("multipcmb", multipcm_device, read, write ) + AM_RANGE(vgmplay_device::A_MULTIPCMB, vgmplay_device::A_MULTIPCMB+3) AM_DEVWRITE ("multipcmb", multipcm_device, write ) AM_RANGE(vgmplay_device::A_MULTIPCMB+4, vgmplay_device::A_MULTIPCMB+7) AM_WRITE(multipcm_bank_hi_b_w) AM_RANGE(vgmplay_device::A_MULTIPCMB+8, vgmplay_device::A_MULTIPCMB+11) AM_WRITE(multipcm_bank_lo_b_w) ADDRESS_MAP_END @@ -1097,7 +1118,15 @@ static ADDRESS_MAP_START( k053260_map, AS_0, 8, vgmplay_state ) ADDRESS_MAP_END static ADDRESS_MAP_START( nescpu_map, AS_PROGRAM, 8, vgmplay_state ) - AM_RANGE(0x0000, 0xffff) AM_RAM AM_SHARE("nesapu_ram") + AM_RANGE(0, 0xffff) AM_RAM AM_SHARE("nesapu_ram") +ADDRESS_MAP_END + +static ADDRESS_MAP_START( h6280_map, AS_PROGRAM, 8, vgmplay_state ) + AM_RANGE(0, 0xffff) AM_NOP +ADDRESS_MAP_END + +static ADDRESS_MAP_START( h6280_io_map, AS_IO, 8, vgmplay_state ) + AM_RANGE(0, 3) AM_NOP ADDRESS_MAP_END static MACHINE_CONFIG_START( vgmplay, vgmplay_state ) @@ -1172,6 +1201,15 @@ static MACHINE_CONFIG_START( vgmplay, vgmplay_state ) MCFG_CPU_PROGRAM_MAP(nescpu_map) MCFG_DEVICE_DISABLE() + MCFG_CPU_ADD("h6280", H6280, 1000000) + MCFG_CPU_PROGRAM_MAP(h6280_map) + MCFG_CPU_IO_MAP(h6280_io_map) + MCFG_DEVICE_DISABLE() + + MCFG_SOUND_ADD("c6280", C6280, 3579545) + MCFG_C6280_CPU("h6280") + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.6) + MCFG_K053260_ADD("k053260", 3579545) MCFG_DEVICE_ADDRESS_MAP(AS_0, k053260_map) MCFG_SOUND_ROUTE(0, "lspeaker", 0.75)