1 // license:BSD-3-Clause
2 // copyright-holders:Acho A. Tang, Nicola Salmoria
3 
4 //****************************************************************************
5 //    Functions to emulate the Alpha Denshi "59MC07" audio board
6 //****************************************************************************
7 
8 #ifndef MAME_AUDIO_AD_SOUND_H
9 #define MAME_AUDIO_AD_SOUND_H
10 
11 #pragma once
12 
13 #include "cpu/i8085/i8085.h"
14 #include "machine/gen_latch.h"
15 #include "machine/i8155.h"
16 #include "sound/dac.h"
17 #include "sound/msm5232.h"
18 #include "sound/samples.h"
19 
20 
21 //**************************************************************************
22 //  GLOBAL VARIABLES
23 //**************************************************************************
24 
DECLARE_DEVICE_TYPE(AD_59MC07,ad_59mc07_device)25 DECLARE_DEVICE_TYPE(AD_59MC07, ad_59mc07_device)
26 
27 
28 //**************************************************************************
29 //  TYPE DEFINITIONS
30 //**************************************************************************
31 
32 // ======================> ad_59mc07_device
33 
34 class ad_59mc07_device : public device_t
35 {
36 public:
37 	// construction/destruction
38 	ad_59mc07_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
39 
40 	void sound_command_w(uint8_t data) { m_soundlatch->write(data); }
41 
42 protected:
43 	// device level overrides
44 	virtual void device_add_mconfig(machine_config &config) override;
45 	virtual void device_start() override;
46 	virtual void device_reset() override;
47 
48 private:
49 	required_device<i8085a_cpu_device> m_audiocpu;
50 	required_device<i8155_device> m_audio8155;
51 	required_device<samples_device> m_samples;
52 	required_device<msm5232_device> m_msm;
53 	required_device<dac_byte_interface> m_dac_1;
54 	required_device<dac_byte_interface> m_dac_2;
55 	required_device<generic_latch_8_device> m_soundlatch;
56 	required_ioport m_frq_adjuster;
57 
58 	int       m_sound_prom_address;
59 	uint8_t   m_dac_latch;
60 	uint8_t   m_8155_port_b;
61 	uint8_t   m_8155_port_a;
62 	uint8_t   m_8155_port_c;
63 	uint8_t   m_ay_port_a;
64 	uint8_t   m_ay_port_b;
65 	uint8_t   m_cymbal_ctrl;
66 	float     m_cymvol;
67 	float     m_hihatvol;
68 	emu_timer *m_adjuster_timer;
69 
70 	void sound_map(address_map &map);
71 	void sound_portmap(address_map &map);
72 
73 	void c0f8_w(offs_t offset, uint8_t data);
74 	void cymbal_ctrl_w(uint8_t data);
75 	void dac_latch_w(uint8_t data);
76 	void i8155_porta_w(uint8_t data);
77 	void i8155_portb_w(uint8_t data);
78 	void i8155_portc_w(uint8_t data);
79 	void ay8910_porta_w(uint8_t data);
80 	void ay8910_portb_w(uint8_t data);
81 	DECLARE_WRITE_LINE_MEMBER(i8155_timer_pulse);
82 	TIMER_CALLBACK_MEMBER(frq_adjuster_callback);
83 	void update_dac();
84 	DECLARE_WRITE_LINE_MEMBER(msm5232_gate);
85 };
86 
87 
88 //****************************************************************************
89 //    Functions to emulate the Alpha Denshi "60MC01" audio board
90 //****************************************************************************
91 
92 //**************************************************************************
93 //  GLOBAL VARIABLES
94 //**************************************************************************
95 
DECLARE_DEVICE_TYPE(AD_60MC01,ad_60mc01_device)96 DECLARE_DEVICE_TYPE(AD_60MC01, ad_60mc01_device)
97 
98 
99 //**************************************************************************
100 //  TYPE DEFINITIONS
101 //**************************************************************************
102 
103 // ======================> ad_60mc01_device
104 
105 class ad_60mc01_device : public device_t
106 {
107 public:
108 	// construction/destruction
109 	ad_60mc01_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
110 
111 	static constexpr feature_type imperfect_features() { return feature::SOUND; } // TODO: fix interrupts, missing music?
112 
113 	void sound_command_w(uint8_t data) { m_soundlatch->write(data); }
114 
115 protected:
116 	// device level overrides
117 	virtual void device_add_mconfig(machine_config &config) override;
118 	virtual void device_start() override;
119 	virtual void device_reset() override;
120 
121 private:
122 	required_device<cpu_device> m_audiocpu;
123 	required_device<generic_latch_8_device> m_soundlatch;
124 
125 	void sound_map(address_map &map);
126 	void sound_portmap(address_map &map);
127 
128 	INTERRUPT_GEN_MEMBER(sound_irq) { m_audiocpu->set_input_line(0, HOLD_LINE); }
129 };
130 
131 #endif // MAME_AUDIO_AD_SOUND_H
132