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