1 // license:BSD-3-Clause
2 // copyright-holders:Nigel Barnes
3 /**********************************************************************
4 
5     Didaktik Melodik
6 
7 **********************************************************************/
8 
9 #include "emu.h"
10 #include "melodik.h"
11 #include "speaker.h"
12 
13 //**************************************************************************
14 //  DEVICE DEFINITIONS
15 //**************************************************************************
16 
17 DEFINE_DEVICE_TYPE(SPECTRUM_MELODIK, spectrum_melodik_device, "spectrum_melodik", "Didaktik Melodik")
18 
19 
20 //-------------------------------------------------
21 //  device_add_mconfig - add device configuration
22 //-------------------------------------------------
23 
device_add_mconfig(machine_config & config)24 void spectrum_melodik_device::device_add_mconfig(machine_config &config)
25 {
26 	/* sound hardware */
27 	SPEAKER(config, "mono").front_center();
28 	AY8912(config, m_psg, 3.579545_MHz_XTAL / 2);
29 	m_psg->add_route(ALL_OUTPUTS, "mono", 0.25);
30 
31 	/* passthru */
32 	SPECTRUM_EXPANSION_SLOT(config, m_exp, spectrum_expansion_devices, nullptr);
33 	m_exp->irq_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::irq_w));
34 	m_exp->nmi_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::nmi_w));
35 }
36 
37 //**************************************************************************
38 //  LIVE DEVICE
39 //**************************************************************************
40 
41 //-------------------------------------------------
42 //  spectrum_melodik_device - constructor
43 //-------------------------------------------------
44 
spectrum_melodik_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)45 spectrum_melodik_device::spectrum_melodik_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
46 	: device_t(mconfig, SPECTRUM_MELODIK, tag, owner, clock)
47 	, device_spectrum_expansion_interface(mconfig, *this)
48 	, m_exp(*this, "exp")
49 	, m_psg(*this, "ay8912")
50 {
51 }
52 
53 
54 //-------------------------------------------------
55 //  device_start - device-specific startup
56 //-------------------------------------------------
57 
device_start()58 void spectrum_melodik_device::device_start()
59 {
60 }
61 
62 
63 //**************************************************************************
64 //  IMPLEMENTATION
65 //**************************************************************************
66 
iorq_r(offs_t offset)67 uint8_t spectrum_melodik_device::iorq_r(offs_t offset)
68 {
69 	uint8_t data = m_exp->iorq_r(offset);
70 
71 	switch (offset & 0xc002)
72 	{
73 	case 0xc000:
74 		data &= m_psg->data_r();
75 		break;
76 	}
77 	return data;
78 }
79 
iorq_w(offs_t offset,uint8_t data)80 void spectrum_melodik_device::iorq_w(offs_t offset, uint8_t data)
81 {
82 	switch (offset & 0xc002)
83 	{
84 	case 0x8000:
85 		m_psg->data_w(data);
86 		break;
87 	case 0xc000:
88 		m_psg->address_w(data);
89 		break;
90 	}
91 	m_exp->iorq_w(offset, data);
92 }
93