mirror of
https://github.com/holub/mame
synced 2025-04-21 07:52:35 +03:00
Added YM2203, YM3526, AY-3-8910, NES APU, DMG APU, K053260, and MultiPCM to vgmplay, nw
This commit is contained in:
parent
6b83b0dbee
commit
de19eb547f
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
//-------------------------------------------------
|
||||
|
@ -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];
|
||||
|
@ -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
|
||||
//-------------------------------------------------
|
||||
|
@ -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];
|
||||
|
@ -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>;
|
||||
|
@ -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();
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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];
|
||||
|
@ -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))
|
||||
|
@ -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;
|
||||
|
@ -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++)
|
||||
|
@ -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);
|
||||
|
@ -28,8 +28,6 @@
|
||||
#ifndef __NES_DEFS_H__
|
||||
#define __NES_DEFS_H__
|
||||
|
||||
#include "nes_defs.h"
|
||||
|
||||
/* BOOLEAN CONSTANTS */
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 )
|
||||
|
Loading…
Reference in New Issue
Block a user