1 // license:BSD-3-Clause
2 // copyright-holders:Bryan McPhail, Aaron Giles, R. Belmont, Philip Bennett
3 /***************************************************************************
4 
5     Taito Ensoniq ES5505-based sound hardware
6 
7 ****************************************************************************/
8 #ifndef MAME_AUDIO_TAITO_EN_H
9 #define MAME_AUDIO_TAITO_EN_H
10 
11 #pragma once
12 
13 #include "cpu/es5510/es5510.h"
14 #include "cpu/m68000/m68000.h"
15 #include "sound/es5506.h"
16 #include "sound/esqpump.h"
17 #include "machine/mc68681.h"
18 #include "machine/mb87078.h"
19 #include "machine/mb8421.h"
20 
21 class taito_en_device : public device_t, public device_mixer_interface
22 
23 {
24 public:
imperfect_features()25 	static constexpr feature_type imperfect_features() { return feature::SOUND; }
26 
27 	taito_en_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
28 
audiocpu()29 	m68000_device &audiocpu() { return *m_audiocpu; }
30 
set_bank(int bank,int entry)31 	void set_bank(int bank, int entry) { m_cpubank[bank]->set_entry(entry); }
32 
33 protected:
34 	// device-level overrides
35 	virtual void device_start() override;
36 	virtual void device_reset() override;
37 	virtual void device_add_mconfig(machine_config &config) override;
38 
39 private:
40 	void en_sound_map(address_map &map);
41 	void en_otis_map(address_map &map);
42 	void fc7_map(address_map &map);
43 
44 	// inherited devices/pointers
45 	required_device<m68000_device> m_audiocpu;
46 	required_device<es5505_device> m_ensoniq;
47 	required_device<es5510_device> m_esp;
48 	required_device<esq_5505_5510_pump_device> m_pump;
49 	required_device<mc68681_device> m_duart68681;
50 	required_device<mb87078_device> m_mb87078;
51 
52 	required_shared_ptr<uint16_t> m_osram;
53 	required_shared_ptr<uint16_t> m_otisbank;
54 	required_region_ptr<uint16_t> m_otisrom;
55 
56 	required_memory_region m_osrom;
57 	required_memory_bank_array<3> m_cpubank;
58 
59 	uint32_t m_bankmask = 0;
60 	uint32_t m_old_clock = ~0;
61 
62 	std::unique_ptr<offs_t[]> m_calculated_otisbank;
63 
64 	IRQ_CALLBACK_MEMBER(duart_iack);
65 	void duart_output(uint8_t data);
66 
67 	void mb87078_gain_changed(offs_t offset, uint8_t data);
68 	void es5505_clock_changed(u32 data);
69 
70 	void en_es5505_bank_w(offs_t offset, uint16_t data);
71 	void en_volume_w(offs_t offset, uint8_t data);
72 };
73 
74 DECLARE_DEVICE_TYPE(TAITO_EN, taito_en_device)
75 
76 #endif // MAME_AUDIO_TAITO_EN_H
77