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