1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 /**********************************************************************
4 
5     Namesoft MIDI Interface cartridge emulation
6 
7 **********************************************************************/
8 
9 #include "emu.h"
10 #include "midi_namesoft.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_NAMESOFT, c64_namesoft_midi_cartridge_device, "c64_midins", "C64 Namesoft MIDI")
29 
30 
WRITE_LINE_MEMBER(c64_namesoft_midi_cartridge_device::acia_irq_w)31 WRITE_LINE_MEMBER( c64_namesoft_midi_cartridge_device::acia_irq_w )
32 {
33 	m_slot->nmi_w(state);
34 }
35 
WRITE_LINE_MEMBER(c64_namesoft_midi_cartridge_device::write_acia_clock)36 WRITE_LINE_MEMBER( c64_namesoft_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_namesoft_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_namesoft_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_namesoft_midi_cartridge_device::write_acia_clock));
59 }
60 
61 
62 
63 //**************************************************************************
64 //  LIVE DEVICE
65 //**************************************************************************
66 
67 //-------------------------------------------------
68 //  c64_namesoft_midi_cartridge_device - constructor
69 //-------------------------------------------------
70 
c64_namesoft_midi_cartridge_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)71 c64_namesoft_midi_cartridge_device::c64_namesoft_midi_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
72 	device_t(mconfig, C64_MIDI_NAMESOFT, 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_namesoft_midi_cartridge_device::device_start()
84 {
85 }
86 
87 //-------------------------------------------------
88 //  device_reset - device-specific reset
89 //-------------------------------------------------
90 
device_reset()91 void c64_namesoft_midi_cartridge_device::device_reset()
92 {
93 	m_acia->reset();
94 }
95 
96 
97 //-------------------------------------------------
98 //  c64_cd_r - cartridge data read
99 //-------------------------------------------------
100 
c64_cd_r(offs_t offset,uint8_t data,int sphi2,int ba,int roml,int romh,int io1,int io2)101 uint8_t c64_namesoft_midi_cartridge_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
102 {
103 	if (!io1)
104 	{
105 		switch (offset & 0xff)
106 		{
107 		case 2:
108 		case 3:
109 			data = m_acia->read(offset & 1);
110 			break;
111 		}
112 	}
113 
114 	return data;
115 }
116 
117 
118 //-------------------------------------------------
119 //  c64_cd_w - cartridge data write
120 //-------------------------------------------------
121 
c64_cd_w(offs_t offset,uint8_t data,int sphi2,int ba,int roml,int romh,int io1,int io2)122 void c64_namesoft_midi_cartridge_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
123 {
124 	if (!io1)
125 	{
126 		switch (offset & 0xff)
127 		{
128 		case 0:
129 		case 1:
130 			m_acia->write(offset & 1, data);
131 			break;
132 		}
133 	}
134 }
135