1 // license:BSD-3-Clause
2 // copyright-holders:Barry Rodewald, Jonathan Gevaryahu
3 /*
4  * s11c_bg.h - Williams System 11C background sound (M68B09E + YM2151 + HC55516 + DAC)
5  *
6  *  Created on: 2/10/2013
7  */
8 
9 #ifndef MAME_AUDIO_S11C_BG_H
10 #define MAME_AUDIO_S11C_BG_H
11 
12 #pragma once
13 
14 #include "cpu/m6809/m6809.h"
15 #include "machine/6821pia.h"
16 #include "machine/rescap.h"
17 #include "sound/dac.h"
18 #include "sound/flt_biquad.h"
19 #include "sound/hc55516.h"
20 #include "sound/ym2151.h"
21 
22 
23 class s11c_bg_device : public device_t, public device_mixer_interface
24 {
25 public:
26 	// construction/destruction
27 	s11c_bg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
28 
29 	// base config
30 	void s11_bg_base(machine_config &config);
31 	// add ym2151
32 	void s11_bg_ym(machine_config &config);
33 	// add cvsd
34 	void s11_bg_cvsd(machine_config &config);
35 
36 	// note to keep synchronization working, the host machine should have synchronization timer expired delegates
37 	// before writing to the following 3 things:
38 	DECLARE_WRITE_LINE_MEMBER(extra_w); // external write to board CB2 (J4 pin 12), does anything actually do this?
39 	DECLARE_WRITE_LINE_MEMBER(ctrl_w); // external write to board CB1 (J4 pin 13)
40 	void data_w(uint8_t data); // external write to board data bus (J4 pins 3 thru 10 for D0-D7)
41 	virtual void device_reset() override; // power up reset
42 	DECLARE_WRITE_LINE_MEMBER(resetq_w); // external write to board /RESET (J4 pin 18)
43 
44 	// callbacks
cb2_cb()45 	auto cb2_cb() { return m_cb2_cb.bind(); }
pb_cb()46 	auto pb_cb() { return m_pb_cb.bind(); }
47 
48 	void s11c_bg_map(address_map &map);
49 	void s11c_bgm_map(address_map &map);
50 	void s11c_bgs_map(address_map &map);
51 
52 	//mc6809e_device *get_cpu() { return m_cpu; }
53 protected:
54 	// constructor with overridable type for subclass
55 	s11c_bg_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock = 0);
56 
57 	// overrides
58 	virtual void device_start() override;
59 	virtual void device_add_mconfig(machine_config &config) override;
60 
61 	TIMER_CALLBACK_MEMBER(deferred_cb2_w);
62 	TIMER_CALLBACK_MEMBER(deferred_pb_w);
63 
64 	required_device<mc6809e_device> m_cpu;
65 	required_device<mc1408_device> m_dac;
66 	optional_device<ym2151_device> m_ym2151;
67 	optional_device<hc55516_device> m_cvsd;
68 	optional_device<filter_biquad_device> m_cvsd_filter;
69 	optional_device<filter_biquad_device> m_cvsd_filter2;
70 	required_device<pia6821_device> m_pia40;
71 	required_memory_bank m_cpubank;
72 
73 private:
74 	devcb_write_line m_cb2_cb;
75 	devcb_write8 m_pb_cb;
76 
77 	void common_reset(); // common reset function used by both internal and external reset
78 	uint8_t m_old_resetq_state;
79 	DECLARE_WRITE_LINE_MEMBER(pia40_cb2_w);
80 	void pia40_pb_w(uint8_t data);
81 
82 	void bg_cvsd_clock_set_w(uint8_t data);
83 	void bg_cvsd_digit_clock_clear_w(uint8_t data);
84 	void bgbank_w(uint8_t data);
85 };
86 
87 class s11_bg_device : public s11c_bg_device
88 {
89 public:
90 	s11_bg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
91 protected:
92 	virtual void device_add_mconfig(machine_config &config) override;
93 };
94 
95 class s11_obg_device : public s11c_bg_device
96 {
97 public:
98 	s11_obg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
99 protected:
100 	virtual void device_add_mconfig(machine_config &config) override;
101 };
102 
103 class s11_bgm_device : public s11c_bg_device
104 {
105 public:
106 	s11_bgm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
107 protected:
108 	virtual void device_add_mconfig(machine_config &config) override;
109 };
110 
111 class s11_bgs_device : public s11c_bg_device
112 {
113 public:
114 	s11_bgs_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
115 protected:
116 	virtual void device_add_mconfig(machine_config &config) override;
117 };
118 
119 DECLARE_DEVICE_TYPE(S11C_BG, s11c_bg_device)
120 DECLARE_DEVICE_TYPE(S11_BG, s11_bg_device)
121 DECLARE_DEVICE_TYPE(S11_OBG, s11_obg_device)
122 DECLARE_DEVICE_TYPE(S11_BGM, s11_bgm_device)
123 DECLARE_DEVICE_TYPE(S11_BGS, s11_bgs_device)
124 
125 #endif // MAME_AUDIO_S11C_BG_H
126