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