diff options
Diffstat (limited to 'src/devices/sound/ym2203.cpp')
-rw-r--r-- | src/devices/sound/ym2203.cpp | 195 |
1 files changed, 0 insertions, 195 deletions
diff --git a/src/devices/sound/ym2203.cpp b/src/devices/sound/ym2203.cpp deleted file mode 100644 index a29a47aeec7..00000000000 --- a/src/devices/sound/ym2203.cpp +++ /dev/null @@ -1,195 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Aaron Giles - -#include "emu.h" -#include "ym2203.h" - - -DEFINE_DEVICE_TYPE(YM2203, ym2203_device, "ym2203", "YM2203 OPN") - - -//********************************************************* -// YM2203 DEVICE -//********************************************************* - -//------------------------------------------------- -// ym2203_device - constructor -//------------------------------------------------- - -ym2203_device::ym2203_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - ay8910_device(mconfig, YM2203, tag, owner, clock, PSG_TYPE_YM, 3, 2), - m_fm(*this), - m_stream(nullptr), - m_busy_duration(m_fm.compute_busy_duration()), - m_address(0) -{ -} - - -//------------------------------------------------- -// read - handle a read from the device -//------------------------------------------------- - -u8 ym2203_device::read(offs_t offset) -{ - u8 result = 0; - switch (offset & 1) - { - case 0: // status port - result = m_fm.status(); - break; - - case 1: // data port (only SSG) - if (m_address < 0x10) - result = ay8910_read_ym(); - break; - } - return result; -} - - -//------------------------------------------------- -// write - handle a write to the register -// interface -//------------------------------------------------- - -void ym2203_device::write(offs_t offset, u8 value) -{ - switch (offset & 1) - { - case 0: // address port - m_address = value; - if (m_address < 0x10) - { - // write register to SSG - ay8910_write_ym(0, m_address); - } - else if (m_address >= 0x2d && m_address <= 0x2f) - { - // prescaler select : 2d,2e,2f - if (m_address == 0x2d) - update_prescale(6); - else if (m_address == 0x2e && m_fm.clock_prescale() == 6) - update_prescale(3); - else if (m_address == 0x2f) - update_prescale(2); - } - break; - - case 1: // data port - if (m_address < 0x10) - { - // write to SSG - ay8910_write_ym(1, value); - } - else - { - // write to FM - m_stream->update(); - m_fm.write(m_address, value); - } - - // mark busy for a bit - m_fm.set_busy_end(machine().time() + m_busy_duration); - break; - } -} - - -//------------------------------------------------- -// device_start - start of emulation -//------------------------------------------------- - -void ym2203_device::device_start() -{ - // start the SSG device - ay8910_device::device_start(); - - // create our stream - m_stream = stream_alloc(0, fm_engine::OUTPUTS, m_fm.sample_rate(clock())); - - // save our data - save_item(YMFM_NAME(m_address)); - - // save the FM engine - m_fm.save(*this); -} - - -//------------------------------------------------- -// device_reset - start of emulation -//------------------------------------------------- - -void ym2203_device::device_reset() -{ - // reset the SSG device - ay8910_device::device_reset(); - - // reset the FM engine - m_fm.reset(); -} - - -//------------------------------------------------- -// device_clock_changed - update if clock changes -//------------------------------------------------- - -void ym2203_device::device_clock_changed() -{ - // refresh via prescale - update_prescale(m_fm.clock_prescale()); -} - - -//------------------------------------------------- -// sound_stream_update - update the sound stream -//------------------------------------------------- - -void ym2203_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) -{ - // if this is not our stream, pass it on - if (&stream != m_stream) - { - ay8910_device::sound_stream_update(stream, inputs, outputs); - return; - } - - // iterate over all target samples - for (int sampindex = 0; sampindex < outputs[0].samples(); sampindex++) - { - // clock the system - m_fm.clock(fm_engine::ALL_CHANNELS); - - // update the FM content; YM2203 is full 14-bit with no intermediate clipping - s32 sums[fm_engine::OUTPUTS] = { 0 }; - m_fm.output(sums, 0, 32767, fm_engine::ALL_CHANNELS); - - // convert to 10.3 floating point value for the DAC and back - // YM2203 is mono - for (int index = 0; index < fm_engine::OUTPUTS; index++) - outputs[index].put_int(sampindex, ymfm_roundtrip_fp(sums[index]), 32768); - } -} - - -//------------------------------------------------- -// update_prescale - set a new prescale value and -// update clocks as needed -//------------------------------------------------- - -void ym2203_device::update_prescale(u8 newval) -{ - // inform the FM engine and refresh our clock rate - m_fm.set_clock_prescale(newval); - m_stream->set_sample_rate(m_fm.sample_rate(clock())); - logerror("Prescale = %d; sample_rate = %d\n", newval, m_fm.sample_rate(clock())); - - // also scale the SSG streams - // mapping is (FM->SSG): 6->4, 3->2, 2->1 - u8 ssg_scale = 2 * newval / 3; - // QUESTION: where does the *2 come from?? - ay_set_clock(clock() * 2 / ssg_scale); - - // recompute the busy duration - m_busy_duration = m_fm.compute_busy_duration(); -} |