1 // license:BSD-3-Clause
2 // copyright-holders:R. Belmont
3 /*********************************************************************
4 
5     a2mockingboard.h
6 
7     Sweet Micro Systems Mockingboard and compatibles
8 
9 *********************************************************************/
10 
11 #ifndef MAME_BUS_A2BUS_A2MOCKINGBOARD_H
12 #define MAME_BUS_A2BUS_A2MOCKINGBOARD_H
13 
14 #include "a2bus.h"
15 #include "machine/6522via.h"
16 #include "sound/ay8910.h"
17 #include "sound/tms5220.h"
18 #include "sound/votrax.h"
19 
20 //**************************************************************************
21 //  TYPE DEFINITIONS
22 //**************************************************************************
23 
24 class a2bus_ayboard_device:
25 	public device_t,
26 	public device_a2bus_card_interface
27 {
28 public:
29 	DECLARE_WRITE_LINE_MEMBER( via1_irq_w );
30 	DECLARE_WRITE_LINE_MEMBER( via2_irq_w );
31 	void via1_out_a(uint8_t data);
32 	virtual void via1_out_b(uint8_t data);
33 	void via2_out_a(uint8_t data);
34 	virtual void via2_out_b(uint8_t data);
35 
36 protected:
37 	// construction/destruction
38 	a2bus_ayboard_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
39 
40 	virtual void device_start() override;
41 	virtual void device_reset() override;
42 	virtual void device_add_mconfig(machine_config &config) override;
43 
44 	// overrides of standard a2bus slot functions
read_c0nx(uint8_t offset)45 	virtual uint8_t read_c0nx(uint8_t offset) override { return 0xff; }
write_c0nx(uint8_t offset,uint8_t data)46 	virtual void write_c0nx(uint8_t offset, uint8_t data) override { }
47 	virtual uint8_t read_cnxx(uint8_t offset) override;
48 	virtual void write_cnxx(uint8_t offset, uint8_t data) override;
49 
50 	void add_common_devices(machine_config &config);
51 
52 	required_device<via6522_device> m_via1;
53 	required_device<via6522_device> m_via2;
54 	required_device<ay8913_device> m_ay1;
55 	required_device<ay8913_device> m_ay2;
56 
57 	uint8_t m_porta1;
58 	uint8_t m_porta2;
59 };
60 
61 class a2bus_mockingboard_device : public a2bus_ayboard_device
62 {
63 public:
64 	a2bus_mockingboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
65 
66 	virtual void via1_out_b(uint8_t data) override;
67 protected:
68 	virtual void device_add_mconfig(machine_config &config) override;
69 	virtual void device_reset() override;
70 
71 	required_device<votrax_sc01_device> m_sc01;
72 
73 private:
74 	DECLARE_WRITE_LINE_MEMBER(write_via1_cb2);
75 
76 	uint8_t m_portb1;
77 	int m_last_cb2_state;
78 };
79 
80 class a2bus_phasor_device : public a2bus_ayboard_device
81 {
82 public:
83 	a2bus_phasor_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
84 
85 	void via1_out_b(uint8_t data) override;
86 	void via2_out_b(uint8_t data) override;
87 
88 protected:
89 	virtual void device_add_mconfig(machine_config &config) override;
90 
91 	virtual uint8_t read_c0nx(uint8_t offset) override;
92 	virtual void write_c0nx(uint8_t offset, uint8_t data) override;
93 	virtual uint8_t read_cnxx(uint8_t offset) override;
94 	virtual void write_cnxx(uint8_t offset, uint8_t data) override;
95 
96 	required_device<ay8913_device> m_ay3;
97 	required_device<ay8913_device> m_ay4;
98 
99 private:
100 	void set_clocks();
101 
102 	bool m_native;
103 };
104 
105 class a2bus_echoplus_device : public a2bus_ayboard_device
106 {
107 public:
108 	a2bus_echoplus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
109 
110 protected:
111 	virtual void device_add_mconfig(machine_config &config) override;
112 
113 	virtual uint8_t read_c0nx(uint8_t offset) override;
114 	virtual void write_c0nx(uint8_t offset, uint8_t data) override;
115 
116 	required_device<tms5220_device> m_tms;
117 };
118 
119 // device type definition
120 DECLARE_DEVICE_TYPE(A2BUS_MOCKINGBOARD, a2bus_mockingboard_device)
121 DECLARE_DEVICE_TYPE(A2BUS_PHASOR,       a2bus_phasor_device)
122 DECLARE_DEVICE_TYPE(A2BUS_ECHOPLUS,     a2bus_echoplus_device)
123 
124 #endif  // MAME_BUS_A2BUS_A2MOCKINGBOARD_H
125