1 // license:BSD-3-Clause 2 // copyright-holders:Nicola Salmoria, Dan Boris 3 /************************************************************************* 4 5 rokola hardware 6 7 *************************************************************************/ 8 #ifndef MAME_AUDIO_SNK6502_H 9 #define MAME_AUDIO_SNK6502_H 10 11 #pragma once 12 13 #include "sound/discrete.h" 14 #include "sound/samples.h" 15 #include "sound/sn76477.h" 16 17 class snk6502_sound_device : public device_t, public device_sound_interface 18 { 19 public: 20 snk6502_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 21 22 DECLARE_READ_LINE_MEMBER(music0_playing); 23 24 void set_music_freq(int freq); 25 void set_music_clock(double clock_time); 26 void set_channel_base(int channel, int base, int mask = 0xff); 27 void mute_channel(int channel); 28 void unmute_channel(int channel); set_sound0_stop_on_rollover(int value)29 void set_sound0_stop_on_rollover(int value) { m_sound0_stop_on_rollover = value; } reset_offset(int channel)30 void reset_offset(int channel) { m_tone_channels[channel].offset = 0; } 31 32 void speech_w(uint8_t data, const uint16_t *table, int start); 33 34 void build_waveform(int channel, int mask); 35 void sasuke_build_waveform(int mask); 36 void satansat_build_waveform(int mask); 37 38 protected: 39 // device-level overrides 40 virtual void device_start() override; 41 42 // sound stream update overrides 43 virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override; 44 45 private: 46 static constexpr unsigned NUM_CHANNELS = 3; 47 48 struct tone_t 49 { 50 int mute; 51 int offset; 52 int base; 53 int mask; 54 int32_t sample_rate; 55 int32_t sample_step; 56 int32_t sample_cur; 57 int16_t form[16]; 58 }; 59 60 // internal state 61 tone_t m_tone_channels[NUM_CHANNELS]; 62 int32_t m_tone_clock_expire; 63 int32_t m_tone_clock; 64 sound_stream * m_tone_stream; 65 66 optional_device<samples_device> m_samples; 67 required_memory_region m_rom; 68 int m_sound0_stop_on_rollover; 69 70 int m_hd38880_cmd; 71 uint32_t m_hd38880_addr; 72 int m_hd38880_data_bytes; 73 double m_hd38880_speed; 74 75 void validate_tone_channel(int channel); 76 }; 77 78 79 class vanguard_sound_device : public device_t 80 { 81 public: 82 vanguard_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 83 84 void sound_w(offs_t offset, uint8_t data); 85 void speech_w(uint8_t data); 86 87 protected: 88 virtual void device_add_mconfig(machine_config &config) override; 89 virtual void device_start() override; 90 virtual void device_reset() override; 91 92 private: 93 required_device<snk6502_sound_device> m_custom; 94 required_device<sn76477_device> m_sn76477_2; 95 required_device<samples_device> m_samples; 96 97 uint8_t m_last_port1; 98 }; 99 100 101 class fantasy_sound_device : public device_t 102 { 103 public: 104 fantasy_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 105 106 void sound_w(offs_t offset, uint8_t data); 107 void speech_w(uint8_t data); 108 109 protected: 110 fantasy_sound_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); 111 112 virtual void device_add_mconfig(machine_config &config) override; 113 virtual void device_start() override; 114 virtual void device_reset() override; 115 116 required_device<snk6502_sound_device> m_custom; 117 118 private: 119 required_device<discrete_sound_device> m_discrete; 120 121 uint8_t m_last_port1; 122 }; 123 124 125 class nibbler_sound_device : public fantasy_sound_device 126 { 127 public: 128 nibbler_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 129 130 protected: 131 virtual void device_add_mconfig(machine_config &config) override; 132 }; 133 134 135 class pballoon_sound_device : public fantasy_sound_device 136 { 137 public: 138 pballoon_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 139 140 protected: 141 virtual void device_add_mconfig(machine_config &config) override; 142 virtual void device_reset() override; 143 }; 144 145 146 class sasuke_sound_device : public device_t 147 { 148 public: 149 sasuke_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 150 151 void sound_w(offs_t offset, uint8_t data); 152 153 protected: 154 virtual void device_add_mconfig(machine_config &config) override; 155 virtual void device_start() override; 156 virtual void device_reset() override; 157 158 private: 159 required_device<snk6502_sound_device> m_custom; 160 required_device<samples_device> m_samples; 161 162 uint8_t m_last_port1; 163 }; 164 165 166 class satansat_sound_device : public device_t 167 { 168 public: 169 satansat_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 170 171 void sound_w(offs_t offset, uint8_t data); 172 173 protected: 174 virtual void device_add_mconfig(machine_config &config) override; 175 virtual void device_start() override; 176 virtual void device_reset() override; 177 178 private: 179 required_device<snk6502_sound_device> m_custom; 180 required_device<samples_device> m_samples; 181 182 uint8_t m_last_port1; 183 }; 184 185 186 DECLARE_DEVICE_TYPE(SNK6502_SOUND, snk6502_sound_device) 187 188 DECLARE_DEVICE_TYPE(VANGUARD_SOUND, vanguard_sound_device) 189 DECLARE_DEVICE_TYPE(FANTASY_SOUND, fantasy_sound_device) 190 DECLARE_DEVICE_TYPE(NIBBLER_SOUND, nibbler_sound_device) 191 DECLARE_DEVICE_TYPE(PBALLOON_SOUND, pballoon_sound_device) 192 DECLARE_DEVICE_TYPE(SASUKE_SOUND, sasuke_sound_device) 193 DECLARE_DEVICE_TYPE(SATANSAT_SOUND, satansat_sound_device) 194 195 #endif // MAME_AUDIO_SNK6502_H 196