diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/emu/emu.mak | 1 | ||||
-rw-r--r-- | src/emu/imagedev/midiout.c | 90 | ||||
-rw-r--r-- | src/emu/imagedev/midiout.h | 73 | ||||
-rw-r--r-- | src/mess/drivers/esq5505.c | 11 | ||||
-rw-r--r-- | src/mess/machine/midioutport.c | 27 | ||||
-rw-r--r-- | src/mess/machine/midioutport.h | 35 | ||||
-rw-r--r-- | src/mess/mess.mak | 3 | ||||
-rw-r--r-- | src/osd/osdcore.h | 1 | ||||
-rw-r--r-- | src/osd/portmedia/pmmidi.c | 57 |
9 files changed, 293 insertions, 5 deletions
diff --git a/src/emu/emu.mak b/src/emu/emu.mak index 52459e696fd..7158fac1ead 100644 --- a/src/emu/emu.mak +++ b/src/emu/emu.mak @@ -346,6 +346,7 @@ EMUIMAGEDEVOBJS = \ $(EMUIMAGEDEV)/floppy.o \ $(EMUIMAGEDEV)/harddriv.o \ $(EMUIMAGEDEV)/midiin.o \ + $(EMUIMAGEDEV)/midiout.o \ $(EMUIMAGEDEV)/printer.o \ $(EMUIMAGEDEV)/serial.o \ $(EMUIMAGEDEV)/snapquik.o \ diff --git a/src/emu/imagedev/midiout.c b/src/emu/imagedev/midiout.c new file mode 100644 index 00000000000..cfc23058a93 --- /dev/null +++ b/src/emu/imagedev/midiout.c @@ -0,0 +1,90 @@ +/********************************************************************* + + midiout.c + + MIDI Out image device and serial receiver + +*********************************************************************/ + +#include "emu.h" +#include "midiout.h" + +/*************************************************************************** + IMPLEMENTATION +***************************************************************************/ + +const device_type MIDIOUT = &device_creator<midiout_device>; + +/*------------------------------------------------- + ctor +-------------------------------------------------*/ + +midiout_device::midiout_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, MIDIOUT, "MIDI Out image device", tag, owner, clock), + device_image_interface(mconfig, *this), + device_serial_interface(mconfig, *this) +{ +} + +/*------------------------------------------------- + device_start +-------------------------------------------------*/ + +void midiout_device::device_start() +{ +} + +void midiout_device::device_reset() +{ + // we don't Tx, we Rx at 31250 8-N-1 + set_rcv_rate(31250); + set_tra_rate(0); + set_data_frame(8, 1, SERIAL_PARITY_NONE); +} + +/*------------------------------------------------- + device_config_complete +-------------------------------------------------*/ + +void midiout_device::device_config_complete(void) +{ + update_names(); +} + +/*------------------------------------------------- + call_load +-------------------------------------------------*/ + +bool midiout_device::call_load(void) +{ + m_midi = osd_open_midi_output(filename()); + + if (m_midi == NULL) + { + return IMAGE_INIT_FAIL; + } + + return IMAGE_INIT_PASS; +} + +/*------------------------------------------------- + call_unload +-------------------------------------------------*/ + +void midiout_device::call_unload(void) +{ + osd_close_midi_channel(m_midi); +} + +void midiout_device::rcv_complete() // Rx completed receiving byte +{ + receive_register_extract(); + UINT8 data = get_received_char(); + + osd_write_midi_channel(m_midi, data); +} + +void midiout_device::input_callback(UINT8 state) +{ +} + diff --git a/src/emu/imagedev/midiout.h b/src/emu/imagedev/midiout.h new file mode 100644 index 00000000000..8ebb9aa4317 --- /dev/null +++ b/src/emu/imagedev/midiout.h @@ -0,0 +1,73 @@ +/********************************************************************* + + midiout.h + + MIDI Out image device + +*********************************************************************/ + +#ifndef __MIDIOUT_H__ +#define __MIDIOUT_H__ + +#include "image.h" + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + + +#define MCFG_MIDIOUT_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, MIDIOUT, 0) + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +class midiout_device : public device_t, + public device_image_interface, + public device_serial_interface +{ +public: + // construction/destruction + midiout_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // image-level overrides + virtual bool call_load(); + virtual void call_unload(); + + // image device + virtual iodevice_t image_type() const { return IO_MIDIOUT; } + virtual bool is_readable() const { return 0; } + virtual bool is_writeable() const { return 1; } + virtual bool is_creatable() const { return 0; } + virtual bool must_be_loaded() const { return 0; } + virtual bool is_reset_on_load() const { return 0; } + virtual const char *file_extensions() const { return "mid"; } + virtual bool core_opens_image_file() const { return FALSE; } + virtual const option_guide *create_option_guide() const { return NULL; } + + virtual void tx(UINT8 state) { check_for_start(state); } + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + + virtual void device_config_complete(); + + // serial overrides + virtual void rcv_complete(); // Rx completed receiving byte + void input_callback(UINT8 state); + +private: + osd_midi_device *m_midi; +}; + +// device type definition +extern const device_type MIDIOUT; + +// device iterator +typedef device_type_iterator<&device_creator<midiout_device>, midiout_device> midiout_device_iterator; + +#endif /* __MIDIOUT_H__ */ diff --git a/src/mess/drivers/esq5505.c b/src/mess/drivers/esq5505.c index 2e4f846bea0..0c7178829e6 100644 --- a/src/mess/drivers/esq5505.c +++ b/src/mess/drivers/esq5505.c @@ -110,6 +110,7 @@ #include "machine/esqpanel.h" #include "machine/serial.h" #include "machine/midiinport.h" +#include "machine/midioutport.h" #define GENERIC (0) #define EPS (1) @@ -137,7 +138,8 @@ public: m_epspanel(*this, "epspanel"), m_sq1panel(*this, "sq1panel"), m_panel(*this, "panel"), - m_dmac(*this, "mc68450") + m_dmac(*this, "mc68450"), + m_mdout(*this, "mdout") { } required_device<m68000_device> m_maincpu; @@ -147,6 +149,7 @@ public: optional_device<esqpanel2x40_sq1_device> m_sq1panel; optional_device<esqpanel2x40_device> m_panel; optional_device<hd63450_device> m_dmac; + required_device<serial_port_device> m_mdout; virtual void machine_reset(); @@ -527,6 +530,7 @@ WRITE8_MEMBER(esq5505_state::duart_output) // MIDI send, we don't care yet WRITE_LINE_MEMBER(esq5505_state::duart_tx_a) { + m_mdout->tx(state); } WRITE_LINE_MEMBER(esq5505_state::duart_tx_b) @@ -767,6 +771,7 @@ static const serial_port_interface midiin_intf = }; static SLOT_INTERFACE_START(midiout_slot) + SLOT_INTERFACE("midiout", MIDIOUT_PORT) SLOT_INTERFACE_END static const serial_port_interface midiout_intf = @@ -783,7 +788,7 @@ static MACHINE_CONFIG_START( vfx, esq5505_state ) MCFG_DUARTN68681_ADD("duart", 4000000, duart_config) MCFG_SERIAL_PORT_ADD("mdin", midiin_intf, midiin_slot, "midiin", NULL) - MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, NULL, NULL) + MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, "midiout", NULL) MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MCFG_SOUND_ADD("ensoniq", ES5505, XTAL_10MHz) @@ -823,7 +828,7 @@ static MACHINE_CONFIG_START(vfx32, esq5505_state) MCFG_DUARTN68681_ADD("duart", 4000000, duart_config) MCFG_SERIAL_PORT_ADD("mdin", midiin_intf, midiin_slot, "midiin", NULL) - MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, NULL, NULL) + MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, "midiout", NULL) MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MCFG_SOUND_ADD("ensoniq", ES5505, XTAL_30_4761MHz / 2) diff --git a/src/mess/machine/midioutport.c b/src/mess/machine/midioutport.c new file mode 100644 index 00000000000..68e997bb44e --- /dev/null +++ b/src/mess/machine/midioutport.c @@ -0,0 +1,27 @@ +/********************************************************************* + + midioutport.c + + MIDI Out serial port - glues the image device to the pluggable serial port + +*********************************************************************/ + +#include "machine/midioutport.h" + +const device_type MIDIOUT_PORT = &device_creator<midiout_port_device>; + +midiout_port_device::midiout_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, MIDIOUT_PORT, "MIDI Out port", tag, owner, clock), + device_serial_port_interface(mconfig, *this), + m_midiout(*this, "midiout") +{ +} + +static MACHINE_CONFIG_FRAGMENT(midiout_port_config) + MCFG_MIDIOUT_ADD("midiout") +MACHINE_CONFIG_END + +machine_config_constructor midiout_port_device::device_mconfig_additions() const +{ + return MACHINE_CONFIG_NAME(midiout_port_config); +} diff --git a/src/mess/machine/midioutport.h b/src/mess/machine/midioutport.h new file mode 100644 index 00000000000..f1b680a3efc --- /dev/null +++ b/src/mess/machine/midioutport.h @@ -0,0 +1,35 @@ +/********************************************************************* + + midioutport.h + + MIDI Out serial port - glues the image device to the pluggable serial port + +*********************************************************************/ + +#ifndef _MIDIOUTPORT_H_ +#define _MIDIOUTPORT_H_ + +#include "emu.h" +#include "machine/serial.h" +#include "imagedev/midiout.h" + +class midiout_port_device : + public device_t, + public device_serial_port_interface +{ +public: + midiout_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual machine_config_constructor device_mconfig_additions() const; + DECLARE_WRITE_LINE_MEMBER( read ) { } + virtual void tx(UINT8 state) { m_midiout->tx(state); } +protected: + virtual void device_start() { } + virtual void device_reset() { } + virtual void device_config_complete() { m_shortname = "midiout_port"; } +private: + serial_port_device *m_owner; + required_device<midiout_device> m_midiout; +}; + +extern const device_type MIDIOUT_PORT; +#endif diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 4a005003aa2..26c538c7ca4 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -558,12 +558,13 @@ $(MESSOBJ)/shared.a: \ $(MESS_DEVICES)/sonydriv.o \ $(MESS_DEVICES)/appldriv.o \ $(MESS_MACHINE)/dp8390.o \ - $(MESS_MACHINE)/midiinport.o \ $(MESS_MACHINE)/ne1000.o \ $(MESS_MACHINE)/ne2000.o \ $(MESS_MACHINE)/3c503.o \ $(MESS_FORMATS)/z80bin.o \ $(MESS_MACHINE)/mb8795.o \ + $(MESS_MACHINE)/midiinport.o \ + $(MESS_MACHINE)/midioutport.o \ $(MESS_MACHINE)/null_modem.o \ $(MESS_MACHINE)/vcsctrl.o \ $(MESS_MACHINE)/vcs_joy.o \ diff --git a/src/osd/osdcore.h b/src/osd/osdcore.h index bc078888669..4772a08e051 100644 --- a/src/osd/osdcore.h +++ b/src/osd/osdcore.h @@ -897,6 +897,7 @@ osd_midi_device *osd_open_midi_output(const char *devname); void osd_close_midi_channel(osd_midi_device *dev); bool osd_poll_midi_channel(osd_midi_device *dev); int osd_read_midi_channel(osd_midi_device *dev, UINT8 *pOut); +void osd_write_midi_channel(osd_midi_device *dev, UINT8 data); /*************************************************************************** UNCATEGORIZED INTERFACES diff --git a/src/osd/portmedia/pmmidi.c b/src/osd/portmedia/pmmidi.c index 9669d761ba4..390b113c99b 100644 --- a/src/osd/portmedia/pmmidi.c +++ b/src/osd/portmedia/pmmidi.c @@ -16,7 +16,8 @@ struct osd_midi_device PortMidiStream *pmStream; PmEvent rx_evBuf[20]; // up to 20 events #endif - UINT8 xmit_in[3]; // Pm_Messages mean we can at most have 3 residue bytes + UINT8 xmit_in[4]; // Pm_Messages mean we can at most have 3 residue bytes + int xmit_cnt; }; void osd_list_midi_devices(void) @@ -234,6 +235,60 @@ int osd_read_midi_channel(osd_midi_device *dev, UINT8 *pOut) #endif } +void osd_write_midi_channel(osd_midi_device *dev, UINT8 data) +{ + #ifndef DISABLE_MIDI + int bytes_needed = 0; + + dev->xmit_in[dev->xmit_cnt++] = data; + + // are we there yet? + switch ((dev->xmit_in[0]>>4) & 0xf) + { + case 0xc: // 2-byte messages + case 0xd: + bytes_needed = 2; + break; + + case 0xf: // system common + switch (dev->xmit_in[0] & 0xf) + { + case 0: // System Exclusive + printf("No SEx please!\n"); + break; + + case 7: // End of System Exclusive + bytes_needed = 1; + break; + + case 2: // song pos + case 3: // song select + bytes_needed = 3; + break; + + default: // all other defined Fx messages are 1 byte + bytes_needed = 1; + break; + } + break; + + default: + bytes_needed = 3; + break; + } + + if (dev->xmit_cnt == bytes_needed) + { + PmEvent ev; + ev.message = Pm_Message(dev->xmit_in[0], dev->xmit_in[1], dev->xmit_in[2]); + ev.timestamp = 0; // use the current time + Pm_Write(dev->pmStream, &ev, 1); + dev->xmit_cnt = 0; + } + + #endif +} + void osd_init_midi(void) { #ifndef DISABLE_MIDI |