diff options
Diffstat (limited to 'src/devices/sound/mmc5.h')
-rw-r--r-- | src/devices/sound/mmc5.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/devices/sound/mmc5.h b/src/devices/sound/mmc5.h new file mode 100644 index 00000000000..a9fd920f63f --- /dev/null +++ b/src/devices/sound/mmc5.h @@ -0,0 +1,75 @@ +// license:GPL-2.0+ +// copyright-holders:Matthew Conte +/***************************************************************************** + + MAME/MESS NES APU CORE + + Based on the Nofrendo/Nosefart NES RP2A03 sound emulation core written by + Matthew Conte (matt@conte.com) and redesigned for use in MAME/MESS by + Who Wants to Know? (wwtk@mail.com) + + This core is written with the advise and consent of Matthew Conte and is + released under the GNU Public License. + + ***************************************************************************** + + mmc5.h + + MMC5 sound emulation core. + + *****************************************************************************/ + +#ifndef MAME_SOUND_MMC5_H +#define MAME_SOUND_MMC5_H + +#pragma once + + +#include "nes_defs.h" + +class mmc5_sound_device : public device_t, + public device_sound_interface +{ +public: + mmc5_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // configuration helpers + auto irq() { return m_irq_handler.bind(); } + + u8 read(offs_t offset); + void write(offs_t offset, u8 data); + void pcm_w(u8 data); + +protected: + // device-level overrides + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + virtual void device_clock_changed() override; + + // sound stream update overrides + virtual void sound_stream_update(sound_stream &stream) override; + +private: + /* GLOBAL CONSTANTS */ + static constexpr unsigned SYNCS_MAX1 = 0x20; + + // internal state + mmc5_sound_t m_core; /* Sound core */ + u32 m_samps_per_sync; /* Number of samples per vsync */ + u32 m_vbl_times[SYNCS_MAX1]; /* VBL durations in samples */ + u32 m_sync_times1[SYNCS_MAX1]; /* Samples per sync table */ + sound_stream::sample_t m_square_lut[31]; // Non-linear Square wave output LUT + + sound_stream *m_stream; + devcb_write_line m_irq_handler; + + u16 m_frame_clocks; + + void calculate_rates(); + void tick_square(mmc5_sound_t::square_t &chan); +}; + + +DECLARE_DEVICE_TYPE(MMC5_SOUND, mmc5_sound_device) + +#endif // MAME_SOUND_MMC5_H |