Skip to content

Commit 2b87aa5

Browse files
committed
bus/spectrum: Added The Music Machine
1 parent 8381197 commit 2b87aa5

File tree

4 files changed

+173
-0
lines changed

4 files changed

+173
-0
lines changed

scripts/src/bus.lua

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4842,6 +4842,8 @@ if (BUSES["SPECTRUM"]~=null) then
48424842
MAME_DIR .. "src/devices/bus/spectrum/mikroplus.h",
48434843
MAME_DIR .. "src/devices/bus/spectrum/mpoker.cpp",
48444844
MAME_DIR .. "src/devices/bus/spectrum/mpoker.h",
4845+
MAME_DIR .. "src/devices/bus/spectrum/musicmachine.cpp",
4846+
MAME_DIR .. "src/devices/bus/spectrum/musicmachine.h",
48454847
MAME_DIR .. "src/devices/bus/spectrum/opus.cpp",
48464848
MAME_DIR .. "src/devices/bus/spectrum/opus.h",
48474849
MAME_DIR .. "src/devices/bus/spectrum/plus2test.cpp",

src/devices/bus/spectrum/exp.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ void spectrum_expansion_slot_device::mreq_w(offs_t offset, uint8_t data)
167167
#include "mgt.h"
168168
#include "mikroplus.h"
169169
#include "mpoker.h"
170+
#include "musicmachine.h"
170171
#include "opus.h"
171172
#include "plus2test.h"
172173
#include "protek.h"
@@ -215,6 +216,7 @@ void spectrum_expansion_devices(device_slot_interface &device)
215216
device.option_add("mikroplus", SPECTRUM_MIKROPLUS);
216217
device.option_add("mpoker", SPECTRUM_MPOKER);
217218
device.option_add("mprint", SPECTRUM_MPRINT);
219+
device.option_add("musicmachine", SPECTRUM_MUSICMACHINE);
218220
device.option_add("opus", SPECTRUM_OPUS);
219221
device.option_add("plusd", SPECTRUM_PLUSD);
220222
device.option_add("proceed", SPECTRUM_PROCEED);
@@ -244,6 +246,7 @@ void spec128_expansion_devices(device_slot_interface &device)
244246
device.option_add("mface128", SPECTRUM_MFACE128);
245247
device.option_add("mikroplus", SPECTRUM_MIKROPLUS);
246248
device.option_add("mprint", SPECTRUM_MPRINT);
249+
device.option_add("musicmachine", SPECTRUM_MUSICMACHINE);
247250
device.option_add("opus", SPECTRUM_OPUS);
248251
device.option_add("plusd", SPECTRUM_PLUSD);
249252
device.option_add("plus2test", SPECTRUM_PLUS2TEST);
@@ -259,5 +262,6 @@ void specpls3_expansion_devices(device_slot_interface &device)
259262
{
260263
device.option_add("kempjoy", SPECTRUM_KEMPJOY);
261264
device.option_add("mface3", SPECTRUM_MFACE3);
265+
device.option_add("musicmachine", SPECTRUM_MUSICMACHINE);
262266
}
263267

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
// license:BSD-3-Clause
2+
// copyright-holders:Barry Rodewald, Andrei I. Holub
3+
/*
4+
* The Music Machine - MIDI and sampling expansion
5+
* by Ram Electronics
6+
*/
7+
8+
#include "emu.h"
9+
#include "musicmachine.h"
10+
11+
#include "bus/midi/midi.h"
12+
#include "machine/clock.h"
13+
#include "speaker.h"
14+
15+
//**************************************************************************
16+
// DEVICE DEFINITIONS
17+
//**************************************************************************
18+
19+
DEFINE_DEVICE_TYPE(SPECTRUM_MUSICMACHINE, spectrum_musicmachine_device, "spectrummusic", "The Music Machine")
20+
21+
22+
void spectrum_musicmachine_device::device_add_mconfig(machine_config &config)
23+
{
24+
ACIA6850(config, m_acia).txd_handler().set("mdout", FUNC(midi_port_device::write_txd));
25+
m_acia->irq_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::nmi_w));
26+
MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
27+
MIDI_PORT(config, "mdout", midiout_slot, "midiout");
28+
clock_device &acia_clock(CLOCK(config, "acia_clock", 31250*16));
29+
acia_clock.signal_handler().set(FUNC(spectrum_musicmachine_device::write_acia_clock));
30+
31+
SPEAKER(config, "speaker").front_center();
32+
ZN429E(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.2);
33+
34+
SPECTRUM_EXPANSION_SLOT(config, m_exp, spectrum_expansion_devices, nullptr);
35+
m_exp->irq_handler().set(DEVICE_SELF_OWNER, FUNC(spectrum_expansion_slot_device::irq_w));
36+
}
37+
38+
//**************************************************************************
39+
// LIVE DEVICE
40+
//**************************************************************************
41+
42+
spectrum_musicmachine_device::spectrum_musicmachine_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
43+
device_t(mconfig, SPECTRUM_MUSICMACHINE, tag, owner, clock)
44+
, device_spectrum_expansion_interface(mconfig, *this)
45+
, m_acia(*this,"acia")
46+
, m_dac(*this,"dac")
47+
, m_exp(*this, "exp")
48+
{
49+
}
50+
51+
//-------------------------------------------------
52+
// device_start - device-specific startup
53+
//-------------------------------------------------
54+
55+
void spectrum_musicmachine_device::device_start()
56+
{
57+
}
58+
59+
//-------------------------------------------------
60+
// device_reset - device-specific reset
61+
//-------------------------------------------------
62+
63+
void spectrum_musicmachine_device::device_reset()
64+
{
65+
m_irq_select = false;
66+
}
67+
68+
void spectrum_musicmachine_device::write_acia_clock(u8 data)
69+
{
70+
m_acia->write_txc(data);
71+
m_acia->write_rxc(data);
72+
}
73+
74+
u8 spectrum_musicmachine_device::iorq_r(offs_t offset)
75+
{
76+
u8 data = m_exp->iorq_r(offset);
77+
78+
switch (offset & 0xff)
79+
{
80+
case 0x7f:
81+
if (offset == 0xfc7f)
82+
data = m_acia->status_r();
83+
else
84+
data = m_acia->data_r();
85+
break;
86+
// TODO ADC_READ
87+
// TODO Strobe: ADC_START
88+
//case 0x??:
89+
// break;
90+
}
91+
92+
return data;
93+
}
94+
95+
void spectrum_musicmachine_device::iorq_w(offs_t offset, u8 data)
96+
{
97+
switch (offset & 0xff)
98+
{
99+
case 0x5f:
100+
m_irq_select = data & 1;
101+
break;
102+
case 0x7f:
103+
if (offset == 0xfc7f)
104+
m_acia->control_w(data);
105+
else
106+
m_acia->data_w(data);
107+
break;
108+
case 0x9f:
109+
m_dac->write(data);
110+
break;
111+
// TODO Strobe: ADC_START
112+
//case 0x??:
113+
// break;
114+
}
115+
116+
m_exp->iorq_w(offset, data);
117+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// license:BSD-3-Clause
2+
// copyright-holders:Barry Rodewald
3+
/*
4+
* The Music Machine - MIDI and sampling expansion
5+
* by Ram Electronics
6+
*
7+
* Contains a 6850 AICA, Ferranti ZN429E8 DAC and ZN449 ADC
8+
*/
9+
10+
#ifndef MAME_BUS_SPECTRUM_MUSICMACHINE_H
11+
#define MAME_BUS_SPECTRUM_MUSICMACHINE_H
12+
13+
#pragma once
14+
15+
#include "exp.h"
16+
#include "machine/6850acia.h"
17+
#include "sound/dac.h"
18+
19+
class spectrum_musicmachine_device : public device_t,
20+
public device_spectrum_expansion_interface
21+
{
22+
public:
23+
// construction/destruction
24+
spectrum_musicmachine_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
25+
26+
void write_acia_clock(u8 data);
27+
28+
protected:
29+
// device-level overrides
30+
virtual void device_start() override ATTR_COLD;
31+
virtual void device_reset() override ATTR_COLD;
32+
33+
// optional information overrides
34+
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
35+
36+
virtual u8 iorq_r(offs_t offset) override;
37+
virtual void iorq_w(offs_t offset, u8 data) override;
38+
39+
private:
40+
required_device<acia6850_device> m_acia;
41+
required_device<dac_byte_interface> m_dac;
42+
required_device<spectrum_expansion_slot_device> m_exp;
43+
44+
bool m_irq_select;
45+
};
46+
47+
// device type definition
48+
DECLARE_DEVICE_TYPE(SPECTRUM_MUSICMACHINE, spectrum_musicmachine_device)
49+
50+
#endif // MAME_BUS_SPECTRUM_MUSICMACHINE_H

0 commit comments

Comments
 (0)