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