Added YM2203, YM3526, AY-3-8910, NES APU, DMG APU, K053260, and MultiPCM to vgmplay, nw

This commit is contained in:
therealmogminer@gmail.com 2016-08-18 16:09:12 +02:00
parent 6b83b0dbee
commit de19eb547f
29 changed files with 638 additions and 156 deletions

View File

@ -1367,7 +1367,7 @@ end
---------------------------------------------------
-- PCD3311
--@src/devices/sound/gb.h,SOUNDS["PCD3311"] = true
--@src/devices/sound/pcd3311.h,SOUNDS["PCD3311"] = true
---------------------------------------------------
if (SOUNDS["PCD3311"]~=null) then

View File

@ -13,12 +13,18 @@
-- specify available CPU cores
--------------------------------------------------
CPUS["M6502"] = true
--------------------------------------------------
-- specify available sound cores; some of these are
-- only for MAME and so aren't included
--------------------------------------------------
SOUNDS["GB_SOUND"] = true
SOUNDS["AY8910"] = true
SOUNDS["YM2203"] = true
SOUNDS["YM3526"] = true
SOUNDS["NES_APU"] = true
--------------------------------------------------
-- specify available video cores

View File

@ -116,6 +116,11 @@ void n2a03_device::mi_2a03_nd::write(UINT16 adr, UINT8 val)
program->write_byte(adr, val);
}
void n2a03_device::device_clock_changed()
{
m_apu->set_unscaled_clock(clock());
}
const address_space_config *n2a03_device::memory_space_config(address_spacenum spacenum) const
{
switch(spacenum)

View File

@ -25,6 +25,7 @@ public:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
virtual void do_exec_full() override;
virtual void do_exec_partial() override;
virtual void device_clock_changed() override;
READ8_MEMBER(psg1_4014_r);
READ8_MEMBER(psg1_4015_r);

View File

@ -121,8 +121,6 @@ void ym2203_device::device_start()
{
ay8910_device::device_start();
int rate = clock()/72; /* ??? */
m_irq_handler.resolve();
/* Timer Handler set */
@ -130,13 +128,30 @@ void ym2203_device::device_start()
m_timer[1] = timer_alloc(1);
/* stream system initialize */
m_stream = machine().sound().stream_alloc(*this,0,1,rate, stream_update_delegate(FUNC(ym2203_device::stream_generate),this));
calculate_rates();
/* Initialize FM emurator */
int rate = clock()/72; /* ??? */
m_chip = ym2203_init(this,this,clock(),rate,timer_handler,IRQHandler,&psgintf);
assert_always(m_chip != nullptr, "Error creating YM2203 chip");
}
void ym2203_device::device_clock_changed()
{
calculate_rates();
ym2203_clock_changed(m_chip, clock(), clock() / 72);
}
void ym2203_device::calculate_rates()
{
int rate = clock()/72; /* ??? */
if (m_stream != nullptr)
m_stream->set_sample_rate(rate);
else
m_stream = machine().sound().stream_alloc(*this,0,1,rate, stream_update_delegate(FUNC(ym2203_device::stream_generate),this));
}
//-------------------------------------------------
// device_stop - device-specific stop
//-------------------------------------------------

View File

@ -39,10 +39,14 @@ protected:
virtual void device_post_load() override;
virtual void device_stop() override;
virtual void device_reset() override;
virtual void device_clock_changed() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
void stream_generate(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
private:
void calculate_rates();
// internal state
sound_stream * m_stream;
emu_timer * m_timer[2];

View File

@ -107,7 +107,6 @@ void ym3526_device::device_start()
m_chip = ym3526_init(this,clock(),rate);
assert_always(m_chip != nullptr, "Error creating YM3526 chip");
m_stream = machine().sound().stream_alloc(*this,0,1,rate);
/* YM3526 setup */
ym3526_set_timer_handler (m_chip, timer_handler, this);
ym3526_set_irq_handler (m_chip, IRQHandler, this);
@ -117,6 +116,22 @@ void ym3526_device::device_start()
m_timer[1] = timer_alloc(1);
}
void ym3526_device::device_clock_changed()
{
calculate_rates();
ym3526_clock_changed(m_chip, clock(), clock() / 72);
}
void ym3526_device::calculate_rates()
{
int rate = clock()/72; /* ??? */
if (m_stream != nullptr)
m_stream->set_sample_rate(rate);
else
m_stream = machine().sound().stream_alloc(*this,0,1,rate);
}
//-------------------------------------------------
// device_stop - device-specific stop
//-------------------------------------------------

View File

@ -37,6 +37,7 @@ protected:
virtual void device_start() override;
virtual void device_stop() override;
virtual void device_reset() override;
virtual void device_clock_changed() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
@ -44,6 +45,8 @@ protected:
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
private:
void calculate_rates();
// internal state
sound_stream * m_stream;
emu_timer * m_timer[2];

View File

@ -1201,6 +1201,29 @@ ay8910_device::ay8910_device(const machine_config &mconfig, device_type type, co
memset(&m_env_table,0,sizeof(m_env_table));
memset(&m_vol3d_table,0,sizeof(m_vol3d_table));
m_res_load[0] = m_res_load[1] = m_res_load[2] = 1000; //Default values for resistor loads
set_type(psg_type);
}
void ay8910_device::set_type(psg_type_t psg_type)
{
m_type = psg_type;
if (psg_type == PSG_TYPE_AY)
{
m_env_step_mask = 0x0f;
m_step = 2;
m_zero_is_off = 1;
m_par = &ay8910_param;
m_par_env = &ay8910_param;
}
else
{
m_env_step_mask = 0x1f;
m_step = 1;
m_zero_is_off = 0;
m_par = &ym2149_param;
m_par_env = &ym2149_param_env;
}
}
const device_type AY8912 = &device_creator<ay8912_device>;

View File

@ -106,6 +106,7 @@ public:
// static configuration helpers
static void set_flags(device_t &device, int flags) { downcast<ay8910_device &>(device).m_flags = flags; }
static void set_psg_type(device_t &device, psg_type_t psg_type) { downcast<ay8910_device &>(device).set_type(psg_type); }
static void set_resistors_load(device_t &device, int res_load0, int res_load1, int res_load2) { downcast<ay8910_device &>(device).m_res_load[0] = res_load0; downcast<ay8910_device &>(device).m_res_load[1] = res_load1; downcast<ay8910_device &>(device).m_res_load[2] = res_load2; }
template<class _Object> static devcb_base &set_port_a_read_callback(device_t &device, _Object object) { return downcast<ay8910_device &>(device).m_port_a_read_cb.set_callback(object); }
template<class _Object> static devcb_base &set_port_b_read_callback(device_t &device, _Object object) { return downcast<ay8910_device &>(device).m_port_b_read_cb.set_callback(object); }
@ -158,6 +159,7 @@ protected:
private:
// internal helpers
void set_type(psg_type_t psg_type);
inline UINT16 mix_3D();
void ay8910_write_reg(int r, int v);
void build_mixer_table();

View File

@ -2288,6 +2288,14 @@ void * ym2203_init(void *param, device_t *device, int clock, int rate,
return F2203;
}
void ym2203_clock_changed(void *chip, int clock, int rate)
{
YM2203 *FM2203 = (YM2203 *)chip;
FM2203->OPN.ST.clock = clock;
FM2203->OPN.ST.rate = rate;
}
/* shut down emulator */
void ym2203_shutdown(void *chip)
{

View File

@ -112,6 +112,11 @@ typedef void (*FM_IRQHANDLER)(void *param,int irq);
void * ym2203_init(void *param, device_t *device, int baseclock, int rate,
FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg);
/*
** YM2203 clock changed notifier
*/
void ym2203_clock_changed(void *chip, int clock, int rate);
/*
** shutdown the YM2203 emulators
*/

View File

@ -1961,6 +1961,15 @@ static void OPL_save_state(FM_OPL *OPL, device_t *device)
device->machine().save().register_postload(save_prepost_delegate(FUNC(OPL_postload), OPL));
}
static void OPL_clock_changed(FM_OPL *OPL, UINT32 clock, UINT32 rate)
{
OPL->clock = clock;
OPL->rate = rate;
/* init global tables */
OPL_initalize(OPL);
}
/* Create one of virtual YM3812/YM3526/Y8950 */
/* 'clock' is chip clock in Hz */
@ -1997,11 +2006,7 @@ static FM_OPL *OPLCreate(device_t *device, UINT32 clock, UINT32 rate, int type)
OPL->device = device;
OPL->type = type;
OPL->clock = clock;
OPL->rate = rate;
/* init global tables */
OPL_initalize(OPL);
OPL_clock_changed(OPL, clock, rate);
return OPL;
}
@ -2281,6 +2286,11 @@ void ym3812_update_one(void *chip, OPLSAMPLE *buffer, int length)
#if (BUILD_YM3526)
void ym3526_clock_changed(void *opl, UINT32 clock, UINT32 rate)
{
OPL_clock_changed((FM_OPL *)opl, clock, rate);
}
void *ym3526_init(device_t *device, UINT32 clock, UINT32 rate)
{
/* emulator create */

View File

@ -68,6 +68,7 @@ void ym3812_set_update_handler(void *chip, OPL_UPDATEHANDLER UpdateHandler, void
** 'rate' is sampling rate
*/
void *ym3526_init(device_t *device, UINT32 clock, UINT32 rate);
void ym3526_clock_changed(void *opl, UINT32 clock, UINT32 rate);
/* shutdown the YM3526 emulators*/
void ym3526_shutdown(void *chip);
void ym3526_reset_chip(void *chip);

View File

@ -74,12 +74,12 @@ const device_type K053260 = &device_creator<k053260_device>;
//-------------------------------------------------
k053260_device::k053260_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, K053260, "K053260 KDSC", tag, owner, clock, "k053260", __FILE__),
device_sound_interface(mconfig, *this),
m_stream(nullptr),
m_rom(*this, DEVICE_SELF),
m_keyon(0),
m_mode(0)
: device_t(mconfig, K053260, "K053260 KDSC", tag, owner, clock, "k053260", __FILE__)
, device_sound_interface(mconfig, *this)
, device_rom_interface(mconfig, *this, 21)
, m_stream(nullptr)
, m_keyon(0)
, m_mode(0)
{
memset(m_portdata, 0, sizeof(m_portdata));
}
@ -375,22 +375,12 @@ void k053260_device::KDSC_Voice::update_pan_volume()
void k053260_device::KDSC_Voice::key_on()
{
if (m_start >= m_device->m_rom.bytes())
m_device->logerror("K053260: Attempting to start playing past the end of the ROM ( start = %06x, length = %06x )\n", m_start, m_length);
else if (m_start + m_length >= m_device->m_rom.bytes())
m_device->logerror("K053260: Attempting to play past the end of the ROM ( start = %06x, length = %06x )\n",
m_start, m_length);
else
{
m_position = m_kadpcm ? 1 : 0; // for kadpcm low bit is nybble offset, so must start at 1 due to preincrement
m_counter = 0x1000 - CLOCKS_PER_SAMPLE; // force update on next sound_stream_update
m_output = 0;
m_playing = true;
if (LOG) m_device->logerror("K053260: start = %06x, length = %06x, pitch = %04x, vol = %02x, loop = %s, %s\n",
m_start, m_length, m_pitch, m_volume, m_loop ? "yes" : "no", m_kadpcm ? "KADPCM" : "PCM" );
}
m_position = m_kadpcm ? 1 : 0; // for kadpcm low bit is nybble offset, so must start at 1 due to preincrement
m_counter = 0x1000 - CLOCKS_PER_SAMPLE; // force update on next sound_stream_update
m_output = 0;
m_playing = true;
if (LOG) m_device->logerror("K053260: start = %06x, length = %06x, pitch = %04x, vol = %02x, loop = %s, %s\n",
m_start, m_length, m_pitch, m_volume, m_loop ? "yes" : "no", m_kadpcm ? "KADPCM" : "PCM" );
}
void k053260_device::KDSC_Voice::key_off()
@ -432,7 +422,7 @@ void k053260_device::KDSC_Voice::play(stream_sample_t *outputs)
}
}
UINT8 romdata = m_device->m_rom[m_start + bytepos];
UINT8 romdata = m_device->read_byte(m_start + bytepos);
if (m_kadpcm)
{
@ -456,12 +446,5 @@ UINT8 k053260_device::KDSC_Voice::read_rom()
m_position = (m_position + 1) & 0xffff;
if (offs >= m_device->m_rom.bytes())
{
m_device->logerror("%s: K053260: Attempting to read past the end of the ROM (offs = %06x, size = %06x)\n",
m_device->machine().describe_context(), offs, m_device->m_rom.bytes());
return 0;
}
return m_device->m_rom[offs];
return m_device->read_byte(offs);
}

View File

@ -32,14 +32,13 @@
// ======================> k053260_device
class k053260_device : public device_t,
public device_sound_interface
public device_sound_interface,
public device_rom_interface
{
public:
k053260_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
~k053260_device() { }
static void set_region_tag(device_t &device, const char *tag) { downcast<k053260_device &>(device).m_rom.set_tag(tag); }
DECLARE_READ8_MEMBER( main_read );
DECLARE_WRITE8_MEMBER( main_write );
DECLARE_READ8_MEMBER( read );
@ -56,7 +55,6 @@ protected:
private:
// configuration
sound_stream * m_stream;
required_region_ptr<UINT8> m_rom;
// live state
UINT8 m_portdata[4];

View File

@ -149,20 +149,20 @@ void multipcm_device::envelope_generator_calc(slot_t *slot)
}
INT32 rate;
if (slot->m_sample->m_key_rate_scale != 0xf)
if (slot->m_sample->key_rate_scale() != 0xf)
{
rate = (octave + slot->m_sample->m_key_rate_scale) * 2 + ((slot->m_regs[3] >> 3) & 1);
rate = (octave + slot->m_sample->key_rate_scale()) * 2 + ((slot->m_regs[3] >> 3) & 1);
}
else
{
rate = 0;
}
slot->m_envelope_gen.m_attack_rate = get_rate(m_attack_step, rate, slot->m_sample->m_attack_reg);
slot->m_envelope_gen.m_decay1_rate = get_rate(m_decay_release_step, rate, slot->m_sample->m_decay1_reg);
slot->m_envelope_gen.m_decay2_rate = get_rate(m_decay_release_step, rate, slot->m_sample->m_decay2_reg);
slot->m_envelope_gen.m_release_rate = get_rate(m_decay_release_step, rate, slot->m_sample->m_release_reg);
slot->m_envelope_gen.m_decay_level = 0xf - slot->m_sample->m_decay_level;
slot->m_envelope_gen.m_attack_rate = get_rate(m_attack_step, rate, slot->m_sample->attack_reg());
slot->m_envelope_gen.m_decay1_rate = get_rate(m_decay_release_step, rate, slot->m_sample->decay1_reg());
slot->m_envelope_gen.m_decay2_rate = get_rate(m_decay_release_step, rate, slot->m_sample->decay2_reg());
slot->m_envelope_gen.m_release_rate = get_rate(m_decay_release_step, rate, slot->m_sample->release_reg());
slot->m_envelope_gen.m_decay_level = 0xf - slot->m_sample->decay_level();
}
@ -316,9 +316,9 @@ void multipcm_device::write_slot(slot_t *slot, INT32 reg, UINT8 data)
{
//according to YMF278 sample write causes some base params written to the regs (envelope+lfos)
//the game should never change the sample while playing.
sample_t *sample = m_samples + slot->m_regs[1];
write_slot(slot, 6, sample->m_lfo_vibrato_reg);
write_slot(slot, 7, sample->m_lfo_amplitude_reg);
sample_t &sample = m_samples[slot->m_regs[1]];
write_slot(slot, 6, sample.lfo_vibrato_reg());
write_slot(slot, 7, sample.lfo_amplitude_reg());
break;
}
case 2: //Pitch
@ -341,9 +341,9 @@ void multipcm_device::write_slot(slot_t *slot, INT32 reg, UINT8 data)
case 4: //KeyOn/Off (and more?)
if (data & 0x80) //KeyOn
{
slot->m_sample = m_samples + slot->m_regs[1];
slot->m_sample = &m_samples[slot->m_regs[1]];
slot->m_playing = true;
slot->m_base = slot->m_sample->m_start;
slot->m_base = slot->m_sample->start();
slot->m_offset = 0;
slot->m_prev_sample = 0;
slot->m_total_level = slot->m_dest_total_level << TL_SHIFT;
@ -369,7 +369,7 @@ void multipcm_device::write_slot(slot_t *slot, INT32 reg, UINT8 data)
{
if (slot->m_playing)
{
if (slot->m_sample->m_release_reg != 0xf)
if (slot->m_sample->release_reg() != 0xf)
{
slot->m_envelope_gen.m_state = RELEASE;
}
@ -420,7 +420,6 @@ READ8_MEMBER( multipcm_device::read )
return 0;
}
WRITE8_MEMBER( multipcm_device::write )
{
switch(offset)
@ -444,6 +443,7 @@ void multipcm_device::set_bank(UINT32 leftoffs, UINT32 rightoffs)
{
m_bank_left = leftoffs;
m_bank_right = rightoffs;
printf("%08x, %08x\n", leftoffs, rightoffs);
}
const device_type MULTIPCM = &device_creator<multipcm_device>;
@ -586,26 +586,9 @@ void multipcm_device::device_start()
// Samples
m_samples = auto_alloc_array_clear(machine(), sample_t, 0x200);
for(INT32 sample = 0; sample < 0x200; ++sample)
for(INT32 sample = 0; sample < 512; ++sample)
{
UINT8 data[12];
for (INT32 sample_byte = 0; sample_byte < 12; sample_byte++)
{
data[sample_byte] = (UINT8)read_byte((sample * 12) + sample_byte);
}
m_samples[sample].m_start = (data[0] << 16) | (data[1] << 8) | (data[2] << 0);
m_samples[sample].m_loop = (data[3] << 8) | (data[4] << 0);
m_samples[sample].m_end = 0xffff - ((data[5] << 8) | (data[6] << 0));
m_samples[sample].m_lfo_vibrato_reg = data[7];
m_samples[sample].m_decay1_reg = data[8] & 0xf;
m_samples[sample].m_attack_reg = (data[8] >> 4) & 0xf;
m_samples[sample].m_decay2_reg = data[9] & 0xf;
m_samples[sample].m_decay_level = (data[9] >> 4) & 0xf;
m_samples[sample].m_release_reg = data[10] & 0xf;
m_samples[sample].m_key_rate_scale = (data[10] >> 4) & 0xf;
m_samples[sample].m_lfo_amplitude_reg = data[11];
m_samples[sample].init(sample, this);
}
save_item(NAME(m_cur_slot));
@ -702,9 +685,9 @@ void multipcm_device::sound_stream_update(sound_stream &stream, stream_sample_t
}
slot->m_offset += step;
if (slot->m_offset >= (slot->m_sample->m_end << TL_SHIFT))
if (slot->m_offset >= (slot->m_sample->end() << TL_SHIFT))
{
slot->m_offset = slot->m_sample->m_loop << TL_SHIFT;
slot->m_offset = slot->m_sample->loop() << TL_SHIFT;
}
if (adr ^ (slot->m_offset >> TL_SHIFT))

View File

@ -27,19 +27,28 @@ protected:
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
private:
struct sample_t
class sample_t
{
UINT32 m_start;
UINT32 m_loop;
UINT32 m_end;
UINT8 m_attack_reg;
UINT8 m_decay1_reg;
UINT8 m_decay2_reg;
UINT8 m_decay_level;
UINT8 m_release_reg;
UINT8 m_key_rate_scale;
UINT8 m_lfo_vibrato_reg;
UINT8 m_lfo_amplitude_reg;
public:
sample_t() { }
void init(UINT32 index, multipcm_device* rom) { m_address = index * 12; m_rom = rom; }
UINT32 start() { return (m_rom->read_byte(m_address) << 16) | (m_rom->read_byte(m_address + 1) << 8) | m_rom->read_byte(m_address + 2); }
UINT32 loop() { return (m_rom->read_byte(m_address + 3) << 8) | m_rom->read_byte(m_address + 4); }
UINT32 end() { return 0xffff - ((m_rom->read_byte(m_address + 5) << 8) | m_rom->read_byte(m_address + 6)); }
UINT8 attack_reg() { return (m_rom->read_byte(m_address + 8) >> 4) & 0xf; }
UINT8 decay1_reg() { return m_rom->read_byte(m_address + 8) & 0xf; }
UINT8 decay2_reg() { return m_rom->read_byte(m_address + 9) & 0xf; }
UINT8 decay_level() { return (m_rom->read_byte(m_address + 9) >> 4) & 0xf; }
UINT8 release_reg() { return m_rom->read_byte(m_address + 10) & 0xf; }
UINT8 key_rate_scale() { return (m_rom->read_byte(m_address + 10) >> 4) & 0xf; }
UINT8 lfo_vibrato_reg() { return m_rom->read_byte(m_address + 7); }
UINT8 lfo_amplitude_reg() { return m_rom->read_byte(m_address + 11) & 0xf; }
private:
UINT32 m_address;
multipcm_device* m_rom;
};
enum state_t
@ -71,7 +80,6 @@ private:
INT32 *m_scale;
};
struct slot_t
{
UINT8 m_slot_index;

View File

@ -141,31 +141,52 @@ void nesapu_device::set_tag_memory(const char *tag)
(m_APU.dpcm).memory = &machine().device(tag)->memory().space(AS_PROGRAM);
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void nesapu_device::device_clock_changed()
{
calculate_rates();
}
void nesapu_device::device_start()
void nesapu_device::calculate_rates()
{
int rate = clock() / 4;
/* Initialize global variables */
m_samps_per_sync = rate / ATTOSECONDS_TO_HZ(machine().first_screen()->frame_period().attoseconds());
screen_device *screen = machine().first_screen();
if (screen != nullptr)
{
m_samps_per_sync = rate / ATTOSECONDS_TO_HZ(machine().first_screen()->frame_period().attoseconds());
m_real_rate = m_samps_per_sync * ATTOSECONDS_TO_HZ(machine().first_screen()->frame_period().attoseconds());
}
else
{
m_samps_per_sync = rate / screen_device::DEFAULT_FRAME_RATE;
m_real_rate = m_samps_per_sync * screen_device::DEFAULT_FRAME_RATE;
}
m_buffer_size = m_samps_per_sync;
m_real_rate = m_samps_per_sync * ATTOSECONDS_TO_HZ(machine().first_screen()->frame_period().attoseconds());
m_apu_incsize = (float) (clock() / (float) m_real_rate);
/* Use initializer calls */
create_noise(m_noise_lut, 13, NOISE_LONG);
create_vbltimes(m_vbl_times,vbl_length,m_samps_per_sync);
create_syncs(m_samps_per_sync);
/* Adjust buffer size if 16 bits */
m_buffer_size+=m_samps_per_sync;
if (m_stream != nullptr)
m_stream->set_sample_rate(rate);
else
m_stream = machine().sound().stream_alloc(*this, 0, 1, rate);
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void nesapu_device::device_start()
{
create_noise(m_noise_lut, 13, NOISE_LONG);
set_tag_memory(m_cpu_tag);
m_stream = machine().sound().stream_alloc(*this, 0, 1, rate);
calculate_rates();
/* register for save */
for (int i = 0; i < 2; i++)

View File

@ -53,6 +53,8 @@ public:
static void set_cpu_tag(device_t &device, const char *tag) { downcast<nesapu_device &>(device).m_cpu_tag = tag; }
void set_tag_memory(const char *tag);
virtual void device_clock_changed() override;
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
@ -78,6 +80,7 @@ private:
const char *m_cpu_tag;
void calculate_rates();
void create_syncs(unsigned long sps);
int8 apu_square(square_t *chan);
int8 apu_triangle(triangle_t *chan);

View File

@ -28,8 +28,6 @@
#ifndef __NES_DEFS_H__
#define __NES_DEFS_H__
#include "nes_defs.h"
/* BOOLEAN CONSTANTS */
#ifndef TRUE
#define TRUE 1

View File

@ -188,6 +188,9 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, asterix_state )
AM_RANGE(0xfe00, 0xfe00) AM_DEVWRITE("ymsnd", ym2151_device, register_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( k053260_map, AS_0, 8, asterix_state )
AM_RANGE(0x00000000, 0x001fffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
static INPUT_PORTS_START( asterix )
@ -290,6 +293,7 @@ static MACHINE_CONFIG_START( asterix, asterix_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MCFG_K053260_ADD("k053260", XTAL_32MHz/8) // 4MHz
MCFG_DEVICE_ADDRESS_MAP(AS_0, k053260_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.75)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.75)
MACHINE_CONFIG_END

View File

@ -253,6 +253,9 @@ static ADDRESS_MAP_START( overdriv_sound_map, AS_PROGRAM, 8, overdriv_state )
AM_RANGE(0x1000, 0xffff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START( overdriv_k053260_map, AS_0, 8, overdriv_state )
AM_RANGE(0x00000000, 0x001fffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
/* Both IPT_START1 assignments are needed. The game will reset during */
/* the "continue" sequence if the assignment on the first port */
@ -375,12 +378,12 @@ static MACHINE_CONFIG_START( overdriv, overdriv_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 0.5)
MCFG_K053260_ADD("k053260_1", XTAL_3_579545MHz)
MCFG_K053260_REGION("shared")
MCFG_DEVICE_ADDRESS_MAP(AS_0, overdriv_k053260_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.35)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.35)
MCFG_K053260_ADD("k053260_2", XTAL_3_579545MHz)
MCFG_K053260_REGION("shared")
MCFG_DEVICE_ADDRESS_MAP(AS_0, overdriv_k053260_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.35)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.35)
MACHINE_CONFIG_END
@ -426,7 +429,7 @@ ROM_START( overdriv )
ROM_LOAD( "789e17.p17", 0x000000, 0x040000, CRC(04c07248) SHA1(873445002cbf90c9fc5a35bf4a8f6c43193ee342) )
ROM_LOAD( "789e16.p12", 0x040000, 0x040000, CRC(9348dee1) SHA1(367193373e28962b5b0e54cc15d68ed88ab83f12) )
ROM_REGION( 0x200000, "shared", 0 ) /* 053260 samples */
ROM_REGION( 0x200000, "k053260", 0 ) /* 053260 samples */
ROM_LOAD( "789e03.j1", 0x000000, 0x100000, CRC(51ebfebe) SHA1(17f0c23189258e801f48d5833fe934e7a48d071b) )
ROM_LOAD( "789e02.f1", 0x100000, 0x100000, CRC(bdd3b5c6) SHA1(412332d64052c0a3714f4002c944b0e7d32980a4) )
ROM_END
@ -464,7 +467,7 @@ ROM_START( overdriva )
ROM_LOAD( "789e17.p17", 0x000000, 0x040000, CRC(04c07248) SHA1(873445002cbf90c9fc5a35bf4a8f6c43193ee342) )
ROM_LOAD( "789e16.p12", 0x040000, 0x040000, CRC(9348dee1) SHA1(367193373e28962b5b0e54cc15d68ed88ab83f12) )
ROM_REGION( 0x200000, "shared", 0 ) /* 053260 samples */
ROM_REGION( 0x200000, "k053260", 0 ) /* 053260 samples */
ROM_LOAD( "789e03.j1", 0x000000, 0x100000, CRC(51ebfebe) SHA1(17f0c23189258e801f48d5833fe934e7a48d071b) )
ROM_LOAD( "789e02.f1", 0x100000, 0x100000, CRC(bdd3b5c6) SHA1(412332d64052c0a3714f4002c944b0e7d32980a4) )
ROM_END
@ -502,7 +505,7 @@ ROM_START( overdrivb )
ROM_LOAD( "789e17.p17", 0x000000, 0x040000, CRC(04c07248) SHA1(873445002cbf90c9fc5a35bf4a8f6c43193ee342) )
ROM_LOAD( "789e16.p12", 0x040000, 0x040000, CRC(9348dee1) SHA1(367193373e28962b5b0e54cc15d68ed88ab83f12) )
ROM_REGION( 0x200000, "shared", 0 ) /* 053260 samples */
ROM_REGION( 0x200000, "k053260", 0 ) /* 053260 samples */
ROM_LOAD( "789e03.j1", 0x000000, 0x100000, CRC(51ebfebe) SHA1(17f0c23189258e801f48d5833fe934e7a48d071b) )
ROM_LOAD( "789e02.f1", 0x100000, 0x100000, CRC(bdd3b5c6) SHA1(412332d64052c0a3714f4002c944b0e7d32980a4) )
ROM_END

View File

@ -127,6 +127,9 @@ static ADDRESS_MAP_START( parodius_sound_map, AS_PROGRAM, 8, parodius_state )
AM_RANGE(0xfc00, 0xfc2f) AM_DEVREADWRITE("k053260", k053260_device, read, write)
ADDRESS_MAP_END
static ADDRESS_MAP_START( parodius_k053260_map, AS_0, 8, parodius_state )
AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
/***************************************************************************
@ -281,6 +284,7 @@ static MACHINE_CONFIG_START( parodius, parodius_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MCFG_K053260_ADD("k053260", 3579545)
MCFG_DEVICE_ADDRESS_MAP(AS_0, parodius_k053260_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.70)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.70)
MACHINE_CONFIG_END

View File

@ -103,6 +103,9 @@ static ADDRESS_MAP_START( rollerg_sound_map, AS_PROGRAM, 8, rollerg_state )
AM_RANGE(0xfc00, 0xfc00) AM_WRITE(sound_arm_nmi_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( rollerg_k053260_map, AS_0, 8, rollerg_state )
AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
/***************************************************************************
@ -284,6 +287,7 @@ static MACHINE_CONFIG_START( rollerg, rollerg_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MCFG_K053260_ADD("k053260", 3579545)
MCFG_DEVICE_ADDRESS_MAP(AS_0, rollerg_k053260_map)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70)
MACHINE_CONFIG_END

View File

@ -148,6 +148,10 @@ static ADDRESS_MAP_START( bank2000_map, AS_PROGRAM, 8, simpsons_state )
AM_RANGE(0x3000, 0x3fff) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( k053260_map, AS_0, 8, simpsons_state )
AM_RANGE(0x00000000, 0x0013ffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
WRITE8_MEMBER(simpsons_state::z80_bankswitch_w)
{
membank("bank2")->set_entry(data & 7);
@ -380,6 +384,7 @@ static MACHINE_CONFIG_START( simpsons, simpsons_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 0.0)
MCFG_SOUND_ADD("k053260", K053260, XTAL_3_579545MHz) /* verified on pcb */
MCFG_DEVICE_ADDRESS_MAP(AS_0, k053260_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.75)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.75)
MACHINE_CONFIG_END

View File

@ -548,6 +548,9 @@ static ADDRESS_MAP_START( punkshot_main_map, AS_PROGRAM, 16, tmnt_state )
AM_RANGE(0xfffffc, 0xffffff) AM_READ(punkshot_kludge_r)
ADDRESS_MAP_END
static ADDRESS_MAP_START( punkshot_k053260_map, AS_0, 8, tmnt_state )
AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
static ADDRESS_MAP_START( lgtnfght_main_map, AS_PROGRAM, 16, tmnt_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
@ -568,6 +571,9 @@ static ADDRESS_MAP_START( lgtnfght_main_map, AS_PROGRAM, 16, tmnt_state )
AM_RANGE(0x100000, 0x107fff) AM_READWRITE(k052109_word_noA12_r, k052109_word_noA12_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( lgtnfght_k053260_map, AS_0, 8, tmnt_state )
AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
WRITE16_MEMBER(tmnt_state::ssriders_soundkludge_w)
{
@ -595,6 +601,9 @@ static ADDRESS_MAP_START( blswhstl_main_map, AS_PROGRAM, 16, tmnt_state )
AM_RANGE(0x780700, 0x78071f) AM_DEVWRITE("k053251", k053251_device, lsb_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( blswhstl_k053260_map, AS_0, 8, tmnt_state )
AM_RANGE(0x00000000, 0x000fffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
WRITE16_MEMBER(tmnt_state::k053251_glfgreat_w)
{
@ -640,6 +649,9 @@ static ADDRESS_MAP_START( glfgreat_main_map, AS_PROGRAM, 16, tmnt_state )
AM_RANGE(0x300000, 0x3fffff) AM_READ(glfgreat_rom_r)
ADDRESS_MAP_END
static ADDRESS_MAP_START( glfgreat_k053260_map, AS_0, 8, tmnt_state )
AM_RANGE(0x00000000, 0x000fffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
static ADDRESS_MAP_START( prmrsocr_main_map, AS_PROGRAM, 16, tmnt_state )
AM_RANGE(0x000000, 0x07ffff) AM_ROM
@ -925,6 +937,9 @@ static ADDRESS_MAP_START( tmnt2_main_map, AS_PROGRAM, 16, tmnt_state )
AM_RANGE(0x600000, 0x603fff) AM_DEVREADWRITE("k052109", k052109_device, word_r, word_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( tmnt2_k053260_map, AS_0, 8, tmnt_state )
AM_RANGE(0x00000000, 0x001fffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
static ADDRESS_MAP_START( ssriders_main_map, AS_PROGRAM, 16, tmnt_state )
AM_RANGE(0x000000, 0x0bffff) AM_ROM
@ -950,6 +965,9 @@ static ADDRESS_MAP_START( ssriders_main_map, AS_PROGRAM, 16, tmnt_state )
AM_RANGE(0x600000, 0x603fff) AM_DEVREADWRITE("k052109", k052109_device, word_r, word_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( ssriders_k053260_map, AS_0, 8, tmnt_state )
AM_RANGE(0x00000000, 0x000fffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
static ADDRESS_MAP_START( sunsetbl_main_map, AS_PROGRAM, 16, tmnt_state )
AM_RANGE(0x000000, 0x0bffff) AM_ROM
@ -993,6 +1011,9 @@ static ADDRESS_MAP_START( thndrx2_main_map, AS_PROGRAM, 16, tmnt_state )
AM_RANGE(0x700400, 0x7007ff) AM_DEVREADWRITE8("k051960", k051960_device, k051960_r, k051960_w, 0xffff)
ADDRESS_MAP_END
static ADDRESS_MAP_START( thndrx2_k053260_map, AS_0, 8, tmnt_state )
AM_RANGE(0x00000000, 0x0007ffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
static ADDRESS_MAP_START( mia_audio_map, AS_PROGRAM, 8, tmnt_state )
@ -2192,6 +2213,7 @@ static MACHINE_CONFIG_START( punkshot, tmnt_state )
MCFG_SOUND_ROUTE(1, "mono", 1.0)
MCFG_K053260_ADD("k053260", XTAL_3_579545MHz)
MCFG_DEVICE_ADDRESS_MAP(AS_0, punkshot_k053260_map)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.70)
MACHINE_CONFIG_END
@ -2247,6 +2269,7 @@ static MACHINE_CONFIG_START( lgtnfght, tmnt_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MCFG_K053260_ADD("k053260", XTAL_3_579545MHz)
MCFG_DEVICE_ADDRESS_MAP(AS_0, lgtnfght_k053260_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.70)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.70)
MACHINE_CONFIG_END
@ -2308,6 +2331,7 @@ static MACHINE_CONFIG_START( blswhstl, tmnt_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 0.70)
MCFG_K053260_ADD("k053260", XTAL_3_579545MHz)
MCFG_DEVICE_ADDRESS_MAP(AS_0, blswhstl_k053260_map)
MCFG_SOUND_ROUTE(0, "rspeaker", 0.50) /* fixed inverted stereo channels */
MCFG_SOUND_ROUTE(1, "lspeaker", 0.50)
MACHINE_CONFIG_END
@ -2384,6 +2408,7 @@ static MACHINE_CONFIG_START( glfgreat, tmnt_state )
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_K053260_ADD("k053260", XTAL_3_579545MHz)
MCFG_DEVICE_ADDRESS_MAP(AS_0, glfgreat_k053260_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MACHINE_CONFIG_END
@ -2519,6 +2544,7 @@ static MACHINE_CONFIG_START( tmnt2, tmnt_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MCFG_K053260_ADD("k053260", XTAL_3_579545MHz)
MCFG_DEVICE_ADDRESS_MAP(AS_0, tmnt2_k053260_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.75)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.75)
MACHINE_CONFIG_END
@ -2578,6 +2604,7 @@ static MACHINE_CONFIG_START( ssriders, tmnt_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MCFG_K053260_ADD("k053260", XTAL_3_579545MHz)
MCFG_DEVICE_ADDRESS_MAP(AS_0, ssriders_k053260_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.70)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.70)
MACHINE_CONFIG_END
@ -2680,6 +2707,7 @@ static MACHINE_CONFIG_START( thndrx2, tmnt_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MCFG_K053260_ADD("k053260", XTAL_3_579545MHz)
MCFG_DEVICE_ADDRESS_MAP(AS_0, thndrx2_k053260_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.75)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.75)
MACHINE_CONFIG_END

View File

@ -265,6 +265,9 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, vendetta_state )
AM_RANGE(0xfc00, 0xfc2f) AM_DEVREADWRITE("k053260", k053260_device, read, write)
ADDRESS_MAP_END
static ADDRESS_MAP_START( k053260_map, AS_0, 8, vendetta_state )
AM_RANGE(0x00000000, 0x000fffff) AM_ROM AM_REGION("k053260", 0)
ADDRESS_MAP_END
/***************************************************************************
@ -481,6 +484,7 @@ static MACHINE_CONFIG_START( vendetta, vendetta_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MCFG_K053260_ADD("k053260", XTAL_3_579545MHz) /* verified with PCB */
MCFG_DEVICE_ADDRESS_MAP(AS_0, k053260_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.75)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.75)
MACHINE_CONFIG_END
@ -614,7 +618,6 @@ ROM_START( vendetta2p )
ROM_LOAD( "vendetta.nv", 0x0000, 0x080, CRC(fbac4e30) SHA1(d3ff3a392550d9b06400b9292a44bdac7ba5c801) )
ROM_END
ROM_START( vendetta2peba )
ROM_REGION( 0x40000, "maincpu", 0 ) /* code + banked roms + banked ram */
ROM_LOAD( "081-eb-a01.17c", 0x00000, 0x40000, CRC(8430bb52) SHA1(54e896510fa44e76b0640b17150210fbf6b3b5bc)) // Label was unclear apart from EB stamp on the middle line. Bottom line looked like 401, but probably A01

View File

@ -10,11 +10,19 @@
#include "debugger.h"
#include "imagedev/bitbngr.h"
#include "cpu/m6502/n2a03.h"
#include "sound/2612intf.h"
#include "sound/ym2151.h"
#include "sound/ym2413.h"
#include "sound/2203intf.h"
#include "sound/3526intf.h"
#include "sound/ay8910.h"
#include "sound/sn76496.h"
#include "sound/k053260.h"
#include "sound/segapcm.h"
#include "sound/multipcm.h"
#include "sound/gb.h"
//#include "sound/nes_apu.h"
class vgmplay_device : public cpu_device
{
@ -24,12 +32,23 @@ public:
A_YM2612 = 0x00000010,
A_YM2151 = 0x00000020,
A_YM2413 = 0x00000030,
A_SN76496 = 0x00000040,
A_YM2203A = 0x00000040,
A_YM2203B = 0x00000050,
A_YM3526 = 0x00000060,
A_AY8910A = 0x00000070,
A_AY8910B = 0x00000080,
A_SN76496 = 0x00000090,
A_K053260 = 0x000000a0,
A_SEGAPCM = 0x00001000,
A_GAMEBOY = 0x00002000,
A_NESAPU = 0x00002030,
A_NESRAM = 0x00003000,
A_MULTIPCMA = 0x00013000,
A_MULTIPCMB = 0x00013010,
};
vgmplay_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual void device_start() override;
virtual void device_reset() override;
@ -50,6 +69,9 @@ public:
virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options) override;
READ8_MEMBER(segapcm_rom_r);
READ8_MEMBER(multipcma_rom_r);
READ8_MEMBER(multipcmb_rom_r);
READ8_MEMBER(k053260_rom_r);
private:
struct rom_block {
@ -68,17 +90,16 @@ private:
int m_icount, m_state;
UINT32 m_pc;
UINT32 m_pc;
std::list<rom_block> m_rom_blocks[0x40];
UINT32 m_rom_masks[0x40];
std::list<rom_block> m_rom_blocks[2][0x40];
std::vector<UINT8> m_data_streams[0x40];
std::vector<UINT32> m_data_stream_starts[0x40];
UINT32 m_ym2612_stream_offset;
UINT8 rom_r(UINT8 type, offs_t offset);
UINT8 rom_r(int chip, UINT8 type, offs_t offset);
UINT32 handle_data_block(UINT32 address);
void blocks_clear();
};
@ -92,8 +113,13 @@ public:
virtual void machine_start() override;
READ8_MEMBER(file_r);
READ8_MEMBER(file_size_r);
DECLARE_READ8_MEMBER(file_r);
DECLARE_READ8_MEMBER(file_size_r);
DECLARE_WRITE8_MEMBER(multipcm_bank_lo_a_w);
DECLARE_WRITE8_MEMBER(multipcm_bank_hi_a_w);
DECLARE_WRITE8_MEMBER(multipcm_bank_lo_b_w);
DECLARE_WRITE8_MEMBER(multipcm_bank_hi_b_w);
private:
std::vector<UINT8> m_file_data;
@ -101,10 +127,26 @@ private:
required_device<ym2612_device> m_ym2612;
required_device<ym2151_device> m_ym2151;
required_device<ym2413_device> m_ym2413;
required_device<ym2203_device> m_ym2203a;
required_device<ym2203_device> m_ym2203b;
required_device<ym3526_device> m_ym3526;
required_device<ay8910_device> m_ay8910a;
required_device<ay8910_device> m_ay8910b;
required_device<sn76496_device> m_sn76496;
required_device<segapcm_device> m_segapcm;
required_device<multipcm_device> m_multipcma;
required_device<multipcm_device> m_multipcmb;
required_device<gameboy_sound_device> m_dmg;
required_device<n2a03_device> m_nescpu;
required_shared_ptr<UINT8> m_nesram;
UINT32 m_multipcma_bank_l;
UINT32 m_multipcma_bank_r;
UINT32 m_multipcmb_bank_l;
UINT32 m_multipcmb_bank_r;
UINT32 r32(int offset) const;
UINT8 r8(int offset) const;
};
vgmplay_device::vgmplay_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
@ -153,8 +195,8 @@ UINT32 vgmplay_device::execute_input_lines() const
void vgmplay_device::blocks_clear()
{
for(int i = 0; i < 0x40; i++) {
m_rom_blocks[i].clear();
m_rom_masks[i] = 0;
m_rom_blocks[0][i].clear();
m_rom_blocks[1][i].clear();
m_data_streams[i].clear();
m_data_stream_starts[i].clear();
}
@ -163,6 +205,9 @@ void vgmplay_device::blocks_clear()
UINT32 vgmplay_device::handle_data_block(UINT32 address)
{
UINT32 size = m_file->read_dword(m_pc+3);
int second = (size & 0x80000000) ? 1 : 0;
size &= 0x7fffffff;
UINT8 type = m_file->read_byte(m_pc+2);
if(type < 0x40) {
UINT32 start = m_data_streams[type].size();
@ -178,22 +223,22 @@ UINT32 vgmplay_device::handle_data_block(UINT32 address)
logerror("ignored compression table size %x\n", size);
else if(type < 0xc0) {
UINT32 rs = m_file->read_dword(m_pc+7);
//UINT32 rs = m_file->read_dword(m_pc+7);
UINT32 start = m_file->read_dword(m_pc+11);
std::unique_ptr<UINT8[]> block = std::make_unique<UINT8[]>(size - 8);
for(UINT32 i=0; i<size-8; i++)
block[i] = m_file->read_byte(m_pc+15+i);
m_rom_blocks[type - 0x80].emplace_front(start, start+size-9, std::move(block));
UINT32 mask = rs-1;
mask |= mask >> 1;
mask |= mask >> 2;
mask |= mask >> 4;
mask |= mask >> 8;
mask |= mask >> 16;
m_rom_masks[type - 0x80] = mask;
} else
m_rom_blocks[second][type - 0x80].emplace_front(start, start+size-9, std::move(block));
} else if (type == 0xc2) {
UINT16 start = m_file->read_word(m_pc+7);
UINT32 data_size = size - 2;
for (int i = 0; i < data_size; i++)
{
m_io->write_byte(A_NESRAM + start + i, m_file->read_byte(m_pc + 9 + i));
}
} else {
logerror("ignored ram block size %x type %02x\n", size, type);
}
return 7+size;
}
@ -252,6 +297,24 @@ void vgmplay_device::execute_run()
m_pc += 3;
break;
case 0x55:
m_io->write_byte(A_YM2203A+0, m_file->read_byte(m_pc+1));
m_io->write_byte(A_YM2203A+1, m_file->read_byte(m_pc+2));
m_pc += 3;
break;
case 0xA5:
m_io->write_byte(A_YM2203B+0, m_file->read_byte(m_pc+1));
m_io->write_byte(A_YM2203B+1, m_file->read_byte(m_pc+2));
m_pc += 3;
break;
case 0x5b:
m_io->write_byte(A_YM3526+0, m_file->read_byte(m_pc+1));
m_io->write_byte(A_YM3526+1, m_file->read_byte(m_pc+2));
m_pc += 3;
break;
case 0x61: {
UINT32 duration = m_file->read_word(m_pc+1);
m_icount -= duration;
@ -270,8 +333,17 @@ void vgmplay_device::execute_run()
break;
case 0x66:
m_state = DONE;
{
UINT32 loop_offset = m_file->read_dword(0x1c);
if (!loop_offset)
{
m_state = DONE;
break;
}
m_pc = 0x1c + loop_offset;
break;
}
case 0x67:
m_pc += handle_data_block(m_pc);
@ -296,11 +368,71 @@ void vgmplay_device::execute_run()
m_icount -= code & 0xf;
break;
case 0xb3:
m_io->write_byte(A_GAMEBOY + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2));
m_pc += 3;
break;
case 0xc0:
m_io->write_byte(A_SEGAPCM + (m_file->read_word(m_pc+1) & 0x7ff), m_file->read_byte(m_pc+3));
m_pc += 4;
break;
case 0xa0:
{
UINT8 reg = m_file->read_byte(m_pc+1);
if (reg & 0x80)
{
m_io->write_byte(A_AY8910A+1, reg & 0x7f);
m_io->write_byte(A_AY8910A+0, m_file->read_byte(m_pc+2));
}
else
{
m_io->write_byte(A_AY8910B+1, reg & 0x7f);
m_io->write_byte(A_AY8910B+0, m_file->read_byte(m_pc+2));
}
m_pc += 3;
break;
}
case 0xb4:
m_io->write_byte(A_NESAPU + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2));
m_pc += 3;
break;
case 0xb5:
{
UINT8 offset = m_file->read_byte(m_pc+1);
if (offset & 0x80)
m_io->write_byte(A_MULTIPCMB + (offset & 0x7f), m_file->read_byte(m_pc+2));
else
m_io->write_byte(A_MULTIPCMA + (offset & 0x7f), m_file->read_byte(m_pc+2));
m_pc += 3;
break;
}
case 0xba:
m_io->write_byte(A_K053260 + m_file->read_byte(m_pc+1), m_file->read_byte(m_pc+2));
m_pc += 3;
break;
case 0xc3:
{
UINT8 offset = m_file->read_byte(m_pc+1);
if (offset & 0x80)
{
m_io->write_byte(A_MULTIPCMB + 4 + (offset & 0x7f), m_file->read_byte(m_pc+3));
m_io->write_byte(A_MULTIPCMB + 8 + (offset & 0x7f), m_file->read_byte(m_pc+2));
}
else
{
m_io->write_byte(A_MULTIPCMA + 4 + (offset & 0x7f), m_file->read_byte(m_pc+3));
m_io->write_byte(A_MULTIPCMA + 8 + (offset & 0x7f), m_file->read_byte(m_pc+2));
}
m_pc += 4;
break;
}
case 0xe0:
m_ym2612_stream_offset = m_file->read_dword(m_pc+1);
m_pc += 5;
@ -392,7 +524,7 @@ offs_t vgmplay_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *
return 3 | DASMFLAG_SUPPORTED;
case 0x55:
sprintf(buffer, "ym2203 r%02x = %02x", oprom[1], oprom[2]);
sprintf(buffer, "ym2203a r%02x = %02x", oprom[1], oprom[2]);
return 3 | DASMFLAG_SUPPORTED;
case 0x56:
@ -515,7 +647,7 @@ offs_t vgmplay_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *
sprintf(buffer, "data-block %x, %s", size, rom_types[type & 0x7f]);
else if(type < 0xc0)
sprintf(buffer, "data-block %x, rom %02x", size, type);
else if(type < 0x93)
else if(type < 0xc3)
sprintf(buffer, "data-block %x, %s", size, ram_types[type & 0x1f]);
else if(type < 0xe0)
sprintf(buffer, "data-block %x, ram %02x", size, type);
@ -544,6 +676,10 @@ offs_t vgmplay_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *
sprintf(buffer, "ay8910 r%02x = %02x", oprom[1], oprom[2]);
return 3 | DASMFLAG_SUPPORTED;
case 0xa5:
sprintf(buffer, "ym2203b r%02x = %02x", oprom[1], oprom[2]);
return 3 | DASMFLAG_SUPPORTED;
case 0xb0:
sprintf(buffer, "rf5c68 r%02x = %02x", oprom[1], oprom[2]);
return 3 | DASMFLAG_SUPPORTED;
@ -561,7 +697,7 @@ offs_t vgmplay_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *
return 3 | DASMFLAG_SUPPORTED;
case 0xb4:
sprintf(buffer, "apu r%02x = %02x", oprom[1], oprom[2]);
sprintf(buffer, "nesapu r%02x = %02x", oprom[1], oprom[2]);
return 3 | DASMFLAG_SUPPORTED;
case 0xb5:
@ -644,18 +780,36 @@ offs_t vgmplay_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *
}
}
UINT8 vgmplay_device::rom_r(UINT8 type, offs_t offset)
UINT8 vgmplay_device::rom_r(int chip, UINT8 type, offs_t offset)
{
for(const auto &b : m_rom_blocks[type - 0x80])
for(const auto &b : m_rom_blocks[chip][type - 0x80])
{
if(offset >= b.start_address && offset <= b.end_address)
{
return b.data[offset - b.start_address];
logerror("Unmapped rom read, type %02x, offset %x\n", type, offset);
}
}
return 0;
}
READ8_MEMBER(vgmplay_device::segapcm_rom_r)
{
return rom_r(0x80, offset);
return rom_r(0, 0x80, offset);
}
READ8_MEMBER(vgmplay_device::multipcma_rom_r)
{
return rom_r(0, 0x89, offset);
}
READ8_MEMBER(vgmplay_device::multipcmb_rom_r)
{
return rom_r(1, 0x89, offset);
}
READ8_MEMBER(vgmplay_device::k053260_rom_r)
{
return rom_r(0, 0x8e, offset);
}
vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, const char *tag) :
@ -664,8 +818,18 @@ vgmplay_state::vgmplay_state(const machine_config &mconfig, device_type type, co
m_ym2612(*this, "ym2612"),
m_ym2151(*this, "ym2151"),
m_ym2413(*this, "ym2413"),
m_ym2203a(*this, "ym2203a"),
m_ym2203b(*this, "ym2203b"),
m_ym3526(*this, "ym3526"),
m_ay8910a(*this, "ay8910a"),
m_ay8910b(*this, "ay8910b"),
m_sn76496(*this, "sn76496"),
m_segapcm(*this, "segapcm")
m_segapcm(*this, "segapcm"),
m_multipcma(*this, "multipcma"),
m_multipcmb(*this, "multipcmb"),
m_dmg(*this, "dmg"),
m_nescpu(*this, "nescpu"),
m_nesram(*this, "nesapu_ram")
{
}
@ -676,8 +840,16 @@ UINT32 vgmplay_state::r32(int off) const
return 0;
}
UINT8 vgmplay_state::r8(int off) const
{
if(off < int(m_file_data.size()))
return m_file_data[off];
return 0;
}
void vgmplay_state::machine_start()
{
//m_nescpu->
UINT32 size = 0;
if(m_file->exists()) {
size = m_file->length();
@ -744,16 +916,22 @@ void vgmplay_state::machine_start()
m_segapcm->set_unscaled_clock(r32(0x38));
if(version >= 0x151 && r32(0x40))
logerror("Warning: file requests an unsupported RF5C68\n");
if(version >= 0x151 && r32(0x44))
logerror("Warning: file requests an unsupported YM2203\n");
if(version >= 0x151 && r32(0x44)) {
UINT32 clock = r32(0x44);
if (clock & 0x40000000)
clock &= ~0x40000000;
m_ym2203a->set_unscaled_clock(clock);
m_ym2203b->set_unscaled_clock(clock);
}
if(version >= 0x151 && r32(0x48))
logerror("Warning: file requests an unsupported YM2608\n");
if(version >= 0x151 && r32(0x4c))
logerror("Warning: file requests an unsupported %s\n", r32(0x4c) & 0x80000000 ? "YM2610B" : "YM2610");
if(version >= 0x151 && r32(0x50))
logerror("Warning: file requests an unsupported YM3812\n");
if(version >= 0x151 && r32(0x54))
logerror("Warning: file requests an unsupported YM3526\n");
if(version >= 0x151 && r32(0x54)) {
m_ym3526->set_unscaled_clock(r32(0x54));
}
if(version >= 0x151 && r32(0x58))
logerror("Warning: file requests an unsupported Y8950\n");
if(version >= 0x151 && r32(0x5c))
@ -768,9 +946,54 @@ void vgmplay_state::machine_start()
logerror("Warning: file requests an unsupported RF5C164\n");
if(version >= 0x151 && r32(0x70))
logerror("Warning: file requests an unsupported PWM\n");
if(version >= 0x151 && r32(0x74))
logerror("Warning: file requests an unsupported AY8910\n");
}
if(version >= 0x151 && r32(0x74)) {
m_ay8910a->set_unscaled_clock(r32(0x74) & ~0x40000000);
m_ay8910b->set_unscaled_clock(r32(0x74) & ~0x40000000);
}
if(version >= 0x151 && r8(0x78)) {
UINT8 type = r8(0x78);
if (type & 0x10)
{
ay8910_device::set_psg_type(*m_ay8910a, ay8910_device::PSG_TYPE_YM);
ay8910_device::set_psg_type(*m_ay8910b, ay8910_device::PSG_TYPE_YM);
}
}
if(version >= 0x151 && r8(0x79)) {
UINT8 flags = r8(0x79);
UINT8 to_set = 0;
if (flags & 1)
to_set |= AY8910_LEGACY_OUTPUT;
if (flags & 2)
to_set |= AY8910_SINGLE_OUTPUT;
if (flags & 4)
to_set |= AY8910_DISCRETE_OUTPUT;
ay8910_device::set_flags(*m_ay8910a, to_set);
ay8910_device::set_flags(*m_ay8910b, to_set);
}
if(version >= 0x151 && r8(0x7a)) {
UINT8 flags = r8(0x7a);
UINT8 to_set = 0;
if (flags & 1)
to_set |= AY8910_LEGACY_OUTPUT;
if (flags & 2)
to_set |= AY8910_SINGLE_OUTPUT;
if (flags & 4)
to_set |= AY8910_DISCRETE_OUTPUT;
ay8910_device::set_flags(*m_ym2203a, to_set);
ay8910_device::set_flags(*m_ym2203b, to_set);
}
if(version >= 0x161 && r32(0x80)) {
m_dmg->set_unscaled_clock(r32(0x80));
}
if(version >= 0x161 && r32(0x84)) {
m_nescpu->set_unscaled_clock(r32(0x84));
m_nescpu->m_apu->set_unscaled_clock(r32(0x84));
}
if(version >= 0x161 && r32(0x88)) {
m_multipcma->set_unscaled_clock(r32(0x88) &~ 0x40000000);
m_multipcmb->set_unscaled_clock(r32(0x88) &~ 0x40000000);
}
}
}
READ8_MEMBER(vgmplay_state::file_r)
@ -785,7 +1008,43 @@ READ8_MEMBER(vgmplay_state::file_size_r)
UINT32 size = m_file_data.size();
return size >> (8*offset);
}
WRITE8_MEMBER(vgmplay_state::multipcm_bank_hi_a_w)
{
if (offset & 1)
m_multipcma_bank_l = (m_multipcma_bank_l & 0xff) | (data << 16);
if (offset & 2)
m_multipcma_bank_r = (m_multipcma_bank_r & 0xff) | (data << 16);
}
WRITE8_MEMBER(vgmplay_state::multipcm_bank_lo_a_w)
{
if (offset & 1)
m_multipcma_bank_l = (m_multipcma_bank_l & 0xff00) | data;
if (offset & 2)
m_multipcma_bank_r = (m_multipcma_bank_r & 0xff00) | data;
m_multipcma->set_bank(m_multipcma_bank_l << 16, m_multipcma_bank_r << 16);
}
WRITE8_MEMBER(vgmplay_state::multipcm_bank_hi_b_w)
{
if (offset & 1)
m_multipcmb_bank_l = (m_multipcmb_bank_l & 0xff) | (data << 16);
if (offset & 2)
m_multipcmb_bank_r = (m_multipcmb_bank_r & 0xff) | (data << 16);
}
WRITE8_MEMBER(vgmplay_state::multipcm_bank_lo_b_w)
{
if (offset & 1)
m_multipcmb_bank_l = (m_multipcmb_bank_l & 0xff00) | data;
if (offset & 2)
m_multipcmb_bank_r = (m_multipcmb_bank_r & 0xff00) | data;
m_multipcmb->set_bank(m_multipcmb_bank_l << 16, m_multipcmb_bank_r << 16);
}
static INPUT_PORTS_START( vgmplay )
INPUT_PORTS_END
@ -794,19 +1053,53 @@ static ADDRESS_MAP_START( file_map, AS_PROGRAM, 8, vgmplay_state )
ADDRESS_MAP_END
static ADDRESS_MAP_START( soundchips_map, AS_IO, 8, vgmplay_state )
AM_RANGE(vgmplay_device::REG_SIZE, vgmplay_device::REG_SIZE+3) AM_READ(file_size_r)
AM_RANGE(vgmplay_device::A_YM2612, vgmplay_device::A_YM2612+3) AM_DEVREADWRITE("ym2612", ym2612_device, read, write)
AM_RANGE(vgmplay_device::A_YM2151, vgmplay_device::A_YM2151+1) AM_DEVREADWRITE("ym2151", ym2151_device, read, write)
AM_RANGE(vgmplay_device::A_YM2413, vgmplay_device::A_YM2413+1) AM_DEVWRITE ("ym2413", ym2413_device, write)
// AM_RANGE(vgmplay_device::A_SN76496+0, vgmplay_device::A_SN76496+0) AM_DEVWRITE ("sn76496", sn76496_device, stereo_w)
AM_RANGE(vgmplay_device::A_SN76496+1, vgmplay_device::A_SN76496+1) AM_DEVWRITE ("sn76496", sn76496_device, write)
AM_RANGE(vgmplay_device::A_SEGAPCM, vgmplay_device::A_SEGAPCM+0x7ff) AM_DEVREADWRITE("segapcm", segapcm_device, sega_pcm_r, sega_pcm_w)
AM_RANGE(vgmplay_device::REG_SIZE, vgmplay_device::REG_SIZE+3) AM_READ(file_size_r)
AM_RANGE(vgmplay_device::A_YM2612, vgmplay_device::A_YM2612+3) AM_DEVREADWRITE("ym2612", ym2612_device, read, write)
AM_RANGE(vgmplay_device::A_YM2151, vgmplay_device::A_YM2151+1) AM_DEVREADWRITE("ym2151", ym2151_device, read, write)
AM_RANGE(vgmplay_device::A_YM2413, vgmplay_device::A_YM2413+1) AM_DEVWRITE ("ym2413", ym2413_device, write)
AM_RANGE(vgmplay_device::A_YM2203A, vgmplay_device::A_YM2203A+1) AM_DEVREADWRITE("ym2203a", ym2203_device, read, write)
AM_RANGE(vgmplay_device::A_YM2203B, vgmplay_device::A_YM2203B+1) AM_DEVREADWRITE("ym2203b", ym2203_device, read, write)
AM_RANGE(vgmplay_device::A_YM3526, vgmplay_device::A_YM3526+1) AM_DEVWRITE ("ym3526", ym3526_device, write)
AM_RANGE(vgmplay_device::A_AY8910A, vgmplay_device::A_AY8910A) AM_DEVWRITE ("ay8910a", ay8910_device, data_w)
AM_RANGE(vgmplay_device::A_AY8910A+1, vgmplay_device::A_AY8910A+1) AM_DEVWRITE ("ay8910a", ay8910_device, address_w)
AM_RANGE(vgmplay_device::A_AY8910B, vgmplay_device::A_AY8910B) AM_DEVWRITE ("ay8910b", ay8910_device, data_w)
AM_RANGE(vgmplay_device::A_AY8910B+1, vgmplay_device::A_AY8910B+1) AM_DEVWRITE ("ay8910b", ay8910_device, address_w)
// AM_RANGE(vgmplay_device::A_SN76496+0, vgmplay_device::A_SN76496+0) AM_DEVWRITE ("sn76496", sn76496_device, stereo_w)
AM_RANGE(vgmplay_device::A_SN76496+1, vgmplay_device::A_SN76496+1) AM_DEVWRITE ("sn76496", sn76496_device, write)
AM_RANGE(vgmplay_device::A_K053260, vgmplay_device::A_K053260+0x2f) AM_DEVWRITE ("k053260", k053260_device, write)
AM_RANGE(vgmplay_device::A_SEGAPCM, vgmplay_device::A_SEGAPCM+0x7ff) AM_DEVREADWRITE("segapcm", segapcm_device, sega_pcm_r, sega_pcm_w)
AM_RANGE(vgmplay_device::A_GAMEBOY, vgmplay_device::A_GAMEBOY+0x16) AM_DEVREADWRITE("dmg", gameboy_sound_device, sound_r, sound_w)
AM_RANGE(vgmplay_device::A_GAMEBOY+0x20, vgmplay_device::A_GAMEBOY+0x2f) AM_DEVREADWRITE("dmg", gameboy_sound_device, wave_r, wave_w)
AM_RANGE(vgmplay_device::A_NESAPU, vgmplay_device::A_NESAPU+0x1f) AM_DEVREADWRITE("nescpu:nesapu", nesapu_device, read, write)
AM_RANGE(vgmplay_device::A_NESRAM, vgmplay_device::A_NESRAM+0xffff) AM_RAM AM_SHARE("nesapu_ram")
AM_RANGE(vgmplay_device::A_MULTIPCMA, vgmplay_device::A_MULTIPCMA+3) AM_DEVREADWRITE("multipcma", multipcm_device, read, write )
AM_RANGE(vgmplay_device::A_MULTIPCMA+4, vgmplay_device::A_MULTIPCMA+7) AM_WRITE(multipcm_bank_hi_a_w)
AM_RANGE(vgmplay_device::A_MULTIPCMA+8, vgmplay_device::A_MULTIPCMA+11) AM_WRITE(multipcm_bank_lo_a_w)
AM_RANGE(vgmplay_device::A_MULTIPCMB, vgmplay_device::A_MULTIPCMB+3) AM_DEVREADWRITE("multipcmb", multipcm_device, read, write )
AM_RANGE(vgmplay_device::A_MULTIPCMB+4, vgmplay_device::A_MULTIPCMB+7) AM_WRITE(multipcm_bank_hi_b_w)
AM_RANGE(vgmplay_device::A_MULTIPCMB+8, vgmplay_device::A_MULTIPCMB+11) AM_WRITE(multipcm_bank_lo_b_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( segapcm_map, AS_0, 8, vgmplay_state )
AM_RANGE(0, 0x1fffff) AM_DEVREAD("vgmplay", vgmplay_device, segapcm_rom_r)
ADDRESS_MAP_END
static ADDRESS_MAP_START( multipcma_map, AS_0, 8, vgmplay_state )
AM_RANGE(0, 0x3fffff) AM_DEVREAD("vgmplay", vgmplay_device, multipcma_rom_r)
ADDRESS_MAP_END
static ADDRESS_MAP_START( multipcmb_map, AS_0, 8, vgmplay_state )
AM_RANGE(0, 0x3fffff) AM_DEVREAD("vgmplay", vgmplay_device, multipcmb_rom_r)
ADDRESS_MAP_END
static ADDRESS_MAP_START( k053260_map, AS_0, 8, vgmplay_state )
AM_RANGE(0, 0x1fffff) AM_DEVREAD("vgmplay", vgmplay_device, k053260_rom_r)
ADDRESS_MAP_END
static ADDRESS_MAP_START( nescpu_map, AS_PROGRAM, 8, vgmplay_state )
AM_RANGE(0x0000, 0xffff) AM_RAM AM_SHARE("nesapu_ram")
ADDRESS_MAP_END
static MACHINE_CONFIG_START( vgmplay, vgmplay_state )
MCFG_CPU_ADD("vgmplay", VGMPLAY, 44100)
MCFG_CPU_PROGRAM_MAP( file_map )
@ -815,6 +1108,7 @@ static MACHINE_CONFIG_START( vgmplay, vgmplay_state )
MCFG_DEVICE_ADD("file", BITBANGER, 0)
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ym2612", YM2612, 7670454)
MCFG_SOUND_ROUTE(0, "lspeaker", 1)
@ -837,6 +1131,51 @@ static MACHINE_CONFIG_START( vgmplay, vgmplay_state )
MCFG_DEVICE_ADDRESS_MAP(AS_0, segapcm_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 1)
MCFG_SOUND_ROUTE(1, "rspeaker", 1)
MCFG_SOUND_ADD("multipcma", MULTIPCM, 8000000)
MCFG_DEVICE_ADDRESS_MAP(AS_0, multipcma_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 1)
MCFG_SOUND_ROUTE(1, "rspeaker", 1)
MCFG_SOUND_ADD("multipcmb", MULTIPCM, 8000000)
MCFG_DEVICE_ADDRESS_MAP(AS_0, multipcmb_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 1)
MCFG_SOUND_ROUTE(1, "rspeaker", 1)
MCFG_SOUND_ADD("dmg", GAMEBOY, 0)
MCFG_SOUND_ROUTE(0, "lspeaker", 1)
MCFG_SOUND_ROUTE(1, "rspeaker", 1)
MCFG_SOUND_ADD("ay8910a", AY8910, 1500000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1)
MCFG_SOUND_ADD("ay8910b", AY8910, 1500000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1)
MCFG_SOUND_ADD("ym2203a", YM2203, 4000000)
MCFG_SOUND_ROUTE(0, "mono", 0.25)
MCFG_SOUND_ROUTE(1, "mono", 0.25)
MCFG_SOUND_ROUTE(2, "mono", 0.25)
MCFG_SOUND_ROUTE(3, "mono", 0.25)
MCFG_SOUND_ADD("ym2203b", YM2203, 4000000)
MCFG_SOUND_ROUTE(0, "mono", 0.25)
MCFG_SOUND_ROUTE(1, "mono", 0.25)
MCFG_SOUND_ROUTE(2, "mono", 0.25)
MCFG_SOUND_ROUTE(3, "mono", 0.25)
MCFG_SOUND_ADD("ym3526", YM3526, 4000000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1)
MCFG_CPU_ADD("nescpu", N2A03, 1000000)
MCFG_CPU_PROGRAM_MAP(nescpu_map)
MCFG_DEVICE_DISABLE()
MCFG_K053260_ADD("k053260", 3579545)
MCFG_DEVICE_ADDRESS_MAP(AS_0, k053260_map)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.75)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.75)
MACHINE_CONFIG_END
ROM_START( vgmplay )