1 // license:BSD-3-Clause
2 // copyright-holders:Wilbert Pol
3 /*****************************************************************************
4  *
5  * includes/wswan.h
6  *
7  ****************************************************************************/
8 
9 #ifndef MAME_AUDIO_WSWAN_H
10 #define MAME_AUDIO_WSWAN_H
11 
12 #pragma once
13 
14 #include "dirom.h"
15 
16 //**************************************************************************
17 //  TYPE DEFINITIONS
18 //**************************************************************************
19 
20 // ======================> wswan_sound_device
21 
22 class wswan_sound_device : public device_t,
23 	public device_sound_interface,
24 	public device_rom_interface<14>
25 {
26 public:
27 	wswan_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
28 
29 	void port_w(offs_t offset, uint8_t data);
30 
31 protected:
32 	struct CHAN
33 	{
CHANCHAN34 		CHAN() :
35 		freq(0),
36 		period(0),
37 		pos(0),
38 		vol_left(0),
39 		vol_right(0),
40 		on(0),
41 		offset(0),
42 		signal(0) { }
43 
44 		uint16_t  freq;           /* frequency */
45 		uint16_t  period;         /* period */
46 		uint32_t  pos;            /* position */
47 		uint8_t   vol_left;       /* volume left */
48 		uint8_t   vol_right;      /* volume right */
49 		uint8_t   on;         /* on/off */
50 		uint8_t   offset;         /* sample offset */
51 		uint8_t    signal;        /* signal */
52 	};
53 
54 	// device-level overrides
55 	virtual void device_start() override;
56 	virtual void device_clock_changed() override;
57 	virtual void device_reset() override;
58 
59 	virtual void rom_bank_updated() override;
60 
61 	// sound stream update overrides
62 	virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
63 
64 private:
65 	void wswan_ch_set_freq( CHAN *ch, uint16_t freq );
66 	int fetch_sample(int channel, int offset);
67 
68 	sound_stream *m_channel;
69 	CHAN m_audio1;     /* Audio channel 1 */
70 	CHAN m_audio2;     /* Audio channel 2 */
71 	CHAN m_audio3;     /* Audio channel 3 */
72 	CHAN m_audio4;     /* Audio channel 4 */
73 	int8_t    m_sweep_step;     /* Sweep step */
74 	uint32_t  m_sweep_time;     /* Sweep time */
75 	uint32_t  m_sweep_count;        /* Sweep counter */
76 	uint8_t   m_noise_type;     /* Noise generator type */
77 	uint8_t   m_noise_reset;        /* Noise reset */
78 	uint8_t   m_noise_enable;       /* Noise enable */
79 	uint8_t   m_noise_output;       /* Noise output */
80 	uint16_t  m_sample_address;     /* Sample address */
81 	uint8_t   m_audio2_voice;       /* Audio 2 voice */
82 	uint8_t   m_audio3_sweep;       /* Audio 3 sweep */
83 	uint8_t   m_audio4_noise;       /* Audio 4 noise */
84 	uint8_t   m_mono;           /* mono */
85 	uint8_t   m_output_volume;      /* output volume */
86 	uint8_t   m_external_stereo;    /* external stereo */
87 	uint8_t   m_external_speaker;   /* external speaker */
88 	uint16_t  m_noise_shift;        /* Noise counter shift register */
89 	uint8_t   m_master_volume;      /* Master volume */
90 };
91 
92 DECLARE_DEVICE_TYPE(WSWAN_SND, wswan_sound_device)
93 
94 #endif // MAME_AUDIO_WSWAN_H
95