1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 /**********************************************************************
4
5 Sequential Circuits MIDI Interface cartridge emulation
6
7 **********************************************************************/
8
9 #include "emu.h"
10 #include "midi_sci.h"
11 #include "machine/clock.h"
12 #include "bus/midi/midi.h"
13
14
15
16 //**************************************************************************
17 // MACROS/CONSTANTS
18 //**************************************************************************
19
20 #define MC6850_TAG "mc6850"
21
22
23
24 //**************************************************************************
25 // DEVICE DEFINITIONS
26 //**************************************************************************
27
28 DEFINE_DEVICE_TYPE(C64_MIDI_SCI, c64_sequential_midi_cartridge_device, "c64_midisci", "C64 Sequential Circuits MIDI")
29
30
WRITE_LINE_MEMBER(c64_sequential_midi_cartridge_device::acia_irq_w)31 WRITE_LINE_MEMBER( c64_sequential_midi_cartridge_device::acia_irq_w )
32 {
33 m_slot->irq_w(state);
34 }
35
WRITE_LINE_MEMBER(c64_sequential_midi_cartridge_device::write_acia_clock)36 WRITE_LINE_MEMBER( c64_sequential_midi_cartridge_device::write_acia_clock )
37 {
38 m_acia->write_txc(state);
39 m_acia->write_rxc(state);
40 }
41
42
43 //-------------------------------------------------
44 // device_add_mconfig - add device configuration
45 //-------------------------------------------------
46
device_add_mconfig(machine_config & config)47 void c64_sequential_midi_cartridge_device::device_add_mconfig(machine_config &config)
48 {
49 ACIA6850(config, m_acia, 0);
50 m_acia->txd_handler().set("mdout", FUNC(midi_port_device::write_txd));
51 m_acia->irq_handler().set(FUNC(c64_sequential_midi_cartridge_device::acia_irq_w));
52
53 MIDI_PORT(config, "mdin", midiin_slot, "midiin").rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
54
55 MIDI_PORT(config, "mdout", midiout_slot, "midiout");
56
57 clock_device &acia_clock(CLOCK(config, "acia_clock", 31250*16));
58 acia_clock.signal_handler().set(FUNC(c64_sequential_midi_cartridge_device::write_acia_clock));
59 }
60
61
62
63 //**************************************************************************
64 // LIVE DEVICE
65 //**************************************************************************
66
67 //-------------------------------------------------
68 // c64_sequential_midi_cartridge_device - constructor
69 //-------------------------------------------------
70
c64_sequential_midi_cartridge_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)71 c64_sequential_midi_cartridge_device::c64_sequential_midi_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
72 device_t(mconfig, C64_MIDI_SCI, tag, owner, clock),
73 device_c64_expansion_card_interface(mconfig, *this),
74 m_acia(*this, MC6850_TAG)
75 {
76 }
77
78
79 //-------------------------------------------------
80 // device_start - device-specific startup
81 //-------------------------------------------------
82
device_start()83 void c64_sequential_midi_cartridge_device::device_start()
84 {
85 // state saving
86 }
87
88 //-------------------------------------------------
89 // device_reset - device-specific reset
90 //-------------------------------------------------
91
device_reset()92 void c64_sequential_midi_cartridge_device::device_reset()
93 {
94 m_acia->reset();
95 }
96
97
98 //-------------------------------------------------
99 // c64_cd_r - cartridge data read
100 //-------------------------------------------------
101
c64_cd_r(offs_t offset,uint8_t data,int sphi2,int ba,int roml,int romh,int io1,int io2)102 uint8_t c64_sequential_midi_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
103 {
104 if (!io1)
105 {
106 switch (offset & 0xff)
107 {
108 case 2:
109 case 3:
110 data = m_acia->read(offset & 1);
111 break;
112 }
113 }
114
115 return data;
116 }
117
118
119 //-------------------------------------------------
120 // c64_cd_w - cartridge data write
121 //-------------------------------------------------
122
c64_cd_w(offs_t offset,uint8_t data,int sphi2,int ba,int roml,int romh,int io1,int io2)123 void c64_sequential_midi_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
124 {
125 if (!io1)
126 {
127 switch (offset & 0xff)
128 {
129 case 0:
130 case 1:
131 m_acia->write(offset & 1, data);
132 break;
133 }
134 }
135 }
136