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