trunk/src/osd/portmedia/pmmidi.c
| r20255 | r20256 | |
| 16 | 16 | PortMidiStream *pmStream; |
| 17 | 17 | PmEvent rx_evBuf[20]; // up to 20 events |
| 18 | 18 | #endif |
| 19 | | UINT8 xmit_in[3]; // Pm_Messages mean we can at most have 3 residue bytes |
| 19 | UINT8 xmit_in[4]; // Pm_Messages mean we can at most have 3 residue bytes |
| 20 | int xmit_cnt; |
| 20 | 21 | }; |
| 21 | 22 | |
| 22 | 23 | void osd_list_midi_devices(void) |
| r20255 | r20256 | |
| 234 | 235 | #endif |
| 235 | 236 | } |
| 236 | 237 | |
| 238 | void osd_write_midi_channel(osd_midi_device *dev, UINT8 data) |
| 239 | { |
| 240 | #ifndef DISABLE_MIDI |
| 241 | int bytes_needed = 0; |
| 242 | |
| 243 | dev->xmit_in[dev->xmit_cnt++] = data; |
| 244 | |
| 245 | // are we there yet? |
| 246 | switch ((dev->xmit_in[0]>>4) & 0xf) |
| 247 | { |
| 248 | case 0xc: // 2-byte messages |
| 249 | case 0xd: |
| 250 | bytes_needed = 2; |
| 251 | break; |
| 252 | |
| 253 | case 0xf: // system common |
| 254 | switch (dev->xmit_in[0] & 0xf) |
| 255 | { |
| 256 | case 0: // System Exclusive |
| 257 | printf("No SEx please!\n"); |
| 258 | break; |
| 259 | |
| 260 | case 7: // End of System Exclusive |
| 261 | bytes_needed = 1; |
| 262 | break; |
| 263 | |
| 264 | case 2: // song pos |
| 265 | case 3: // song select |
| 266 | bytes_needed = 3; |
| 267 | break; |
| 268 | |
| 269 | default: // all other defined Fx messages are 1 byte |
| 270 | bytes_needed = 1; |
| 271 | break; |
| 272 | } |
| 273 | break; |
| 274 | |
| 275 | default: |
| 276 | bytes_needed = 3; |
| 277 | break; |
| 278 | } |
| 279 | |
| 280 | if (dev->xmit_cnt == bytes_needed) |
| 281 | { |
| 282 | PmEvent ev; |
| 283 | ev.message = Pm_Message(dev->xmit_in[0], dev->xmit_in[1], dev->xmit_in[2]); |
| 284 | ev.timestamp = 0; // use the current time |
| 285 | Pm_Write(dev->pmStream, &ev, 1); |
| 286 | dev->xmit_cnt = 0; |
| 287 | } |
| 288 | |
| 289 | #endif |
| 290 | } |
| 291 | |
| 237 | 292 | void osd_init_midi(void) |
| 238 | 293 | { |
| 239 | 294 | #ifndef DISABLE_MIDI |
trunk/src/emu/imagedev/midiout.c
| r0 | r20256 | |
| 1 | /********************************************************************* |
| 2 | |
| 3 | midiout.c |
| 4 | |
| 5 | MIDI Out image device and serial receiver |
| 6 | |
| 7 | *********************************************************************/ |
| 8 | |
| 9 | #include "emu.h" |
| 10 | #include "midiout.h" |
| 11 | |
| 12 | /*************************************************************************** |
| 13 | IMPLEMENTATION |
| 14 | ***************************************************************************/ |
| 15 | |
| 16 | const device_type MIDIOUT = &device_creator<midiout_device>; |
| 17 | |
| 18 | /*------------------------------------------------- |
| 19 | ctor |
| 20 | -------------------------------------------------*/ |
| 21 | |
| 22 | midiout_device::midiout_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 23 | : device_t(mconfig, MIDIOUT, "MIDI Out image device", tag, owner, clock), |
| 24 | device_image_interface(mconfig, *this), |
| 25 | device_serial_interface(mconfig, *this) |
| 26 | { |
| 27 | } |
| 28 | |
| 29 | /*------------------------------------------------- |
| 30 | device_start |
| 31 | -------------------------------------------------*/ |
| 32 | |
| 33 | void midiout_device::device_start() |
| 34 | { |
| 35 | } |
| 36 | |
| 37 | void midiout_device::device_reset() |
| 38 | { |
| 39 | // we don't Tx, we Rx at 31250 8-N-1 |
| 40 | set_rcv_rate(31250); |
| 41 | set_tra_rate(0); |
| 42 | set_data_frame(8, 1, SERIAL_PARITY_NONE); |
| 43 | } |
| 44 | |
| 45 | /*------------------------------------------------- |
| 46 | device_config_complete |
| 47 | -------------------------------------------------*/ |
| 48 | |
| 49 | void midiout_device::device_config_complete(void) |
| 50 | { |
| 51 | update_names(); |
| 52 | } |
| 53 | |
| 54 | /*------------------------------------------------- |
| 55 | call_load |
| 56 | -------------------------------------------------*/ |
| 57 | |
| 58 | bool midiout_device::call_load(void) |
| 59 | { |
| 60 | m_midi = osd_open_midi_output(filename()); |
| 61 | |
| 62 | if (m_midi == NULL) |
| 63 | { |
| 64 | return IMAGE_INIT_FAIL; |
| 65 | } |
| 66 | |
| 67 | return IMAGE_INIT_PASS; |
| 68 | } |
| 69 | |
| 70 | /*------------------------------------------------- |
| 71 | call_unload |
| 72 | -------------------------------------------------*/ |
| 73 | |
| 74 | void midiout_device::call_unload(void) |
| 75 | { |
| 76 | osd_close_midi_channel(m_midi); |
| 77 | } |
| 78 | |
| 79 | void midiout_device::rcv_complete() // Rx completed receiving byte |
| 80 | { |
| 81 | receive_register_extract(); |
| 82 | UINT8 data = get_received_char(); |
| 83 | |
| 84 | osd_write_midi_channel(m_midi, data); |
| 85 | } |
| 86 | |
| 87 | void midiout_device::input_callback(UINT8 state) |
| 88 | { |
| 89 | } |
| 90 | |
trunk/src/emu/imagedev/midiout.h
| r0 | r20256 | |
| 1 | /********************************************************************* |
| 2 | |
| 3 | midiout.h |
| 4 | |
| 5 | MIDI Out image device |
| 6 | |
| 7 | *********************************************************************/ |
| 8 | |
| 9 | #ifndef __MIDIOUT_H__ |
| 10 | #define __MIDIOUT_H__ |
| 11 | |
| 12 | #include "image.h" |
| 13 | |
| 14 | /*************************************************************************** |
| 15 | CONSTANTS |
| 16 | ***************************************************************************/ |
| 17 | |
| 18 | |
| 19 | #define MCFG_MIDIOUT_ADD(_tag) \ |
| 20 | MCFG_DEVICE_ADD(_tag, MIDIOUT, 0) |
| 21 | |
| 22 | |
| 23 | /*************************************************************************** |
| 24 | TYPE DEFINITIONS |
| 25 | ***************************************************************************/ |
| 26 | |
| 27 | class midiout_device : public device_t, |
| 28 | public device_image_interface, |
| 29 | public device_serial_interface |
| 30 | { |
| 31 | public: |
| 32 | // construction/destruction |
| 33 | midiout_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 34 | |
| 35 | // image-level overrides |
| 36 | virtual bool call_load(); |
| 37 | virtual void call_unload(); |
| 38 | |
| 39 | // image device |
| 40 | virtual iodevice_t image_type() const { return IO_MIDIOUT; } |
| 41 | virtual bool is_readable() const { return 0; } |
| 42 | virtual bool is_writeable() const { return 1; } |
| 43 | virtual bool is_creatable() const { return 0; } |
| 44 | virtual bool must_be_loaded() const { return 0; } |
| 45 | virtual bool is_reset_on_load() const { return 0; } |
| 46 | virtual const char *file_extensions() const { return "mid"; } |
| 47 | virtual bool core_opens_image_file() const { return FALSE; } |
| 48 | virtual const option_guide *create_option_guide() const { return NULL; } |
| 49 | |
| 50 | virtual void tx(UINT8 state) { check_for_start(state); } |
| 51 | |
| 52 | protected: |
| 53 | // device-level overrides |
| 54 | virtual void device_start(); |
| 55 | virtual void device_reset(); |
| 56 | |
| 57 | virtual void device_config_complete(); |
| 58 | |
| 59 | // serial overrides |
| 60 | virtual void rcv_complete(); // Rx completed receiving byte |
| 61 | void input_callback(UINT8 state); |
| 62 | |
| 63 | private: |
| 64 | osd_midi_device *m_midi; |
| 65 | }; |
| 66 | |
| 67 | // device type definition |
| 68 | extern const device_type MIDIOUT; |
| 69 | |
| 70 | // device iterator |
| 71 | typedef device_type_iterator<&device_creator<midiout_device>, midiout_device> midiout_device_iterator; |
| 72 | |
| 73 | #endif /* __MIDIOUT_H__ */ |
trunk/src/mess/machine/midioutport.c
| r0 | r20256 | |
| 1 | /********************************************************************* |
| 2 | |
| 3 | midioutport.c |
| 4 | |
| 5 | MIDI Out serial port - glues the image device to the pluggable serial port |
| 6 | |
| 7 | *********************************************************************/ |
| 8 | |
| 9 | #include "machine/midioutport.h" |
| 10 | |
| 11 | const device_type MIDIOUT_PORT = &device_creator<midiout_port_device>; |
| 12 | |
| 13 | midiout_port_device::midiout_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 14 | : device_t(mconfig, MIDIOUT_PORT, "MIDI Out port", tag, owner, clock), |
| 15 | device_serial_port_interface(mconfig, *this), |
| 16 | m_midiout(*this, "midiout") |
| 17 | { |
| 18 | } |
| 19 | |
| 20 | static MACHINE_CONFIG_FRAGMENT(midiout_port_config) |
| 21 | MCFG_MIDIOUT_ADD("midiout") |
| 22 | MACHINE_CONFIG_END |
| 23 | |
| 24 | machine_config_constructor midiout_port_device::device_mconfig_additions() const |
| 25 | { |
| 26 | return MACHINE_CONFIG_NAME(midiout_port_config); |
| 27 | } |
trunk/src/mess/machine/midioutport.h
| r0 | r20256 | |
| 1 | /********************************************************************* |
| 2 | |
| 3 | midioutport.h |
| 4 | |
| 5 | MIDI Out serial port - glues the image device to the pluggable serial port |
| 6 | |
| 7 | *********************************************************************/ |
| 8 | |
| 9 | #ifndef _MIDIOUTPORT_H_ |
| 10 | #define _MIDIOUTPORT_H_ |
| 11 | |
| 12 | #include "emu.h" |
| 13 | #include "machine/serial.h" |
| 14 | #include "imagedev/midiout.h" |
| 15 | |
| 16 | class midiout_port_device : |
| 17 | public device_t, |
| 18 | public device_serial_port_interface |
| 19 | { |
| 20 | public: |
| 21 | midiout_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 22 | virtual machine_config_constructor device_mconfig_additions() const; |
| 23 | DECLARE_WRITE_LINE_MEMBER( read ) { } |
| 24 | virtual void tx(UINT8 state) { m_midiout->tx(state); } |
| 25 | protected: |
| 26 | virtual void device_start() { } |
| 27 | virtual void device_reset() { } |
| 28 | virtual void device_config_complete() { m_shortname = "midiout_port"; } |
| 29 | private: |
| 30 | serial_port_device *m_owner; |
| 31 | required_device<midiout_device> m_midiout; |
| 32 | }; |
| 33 | |
| 34 | extern const device_type MIDIOUT_PORT; |
| 35 | #endif |
trunk/src/mess/drivers/esq5505.c
| r20255 | r20256 | |
| 110 | 110 | #include "machine/esqpanel.h" |
| 111 | 111 | #include "machine/serial.h" |
| 112 | 112 | #include "machine/midiinport.h" |
| 113 | #include "machine/midioutport.h" |
| 113 | 114 | |
| 114 | 115 | #define GENERIC (0) |
| 115 | 116 | #define EPS (1) |
| r20255 | r20256 | |
| 137 | 138 | m_epspanel(*this, "epspanel"), |
| 138 | 139 | m_sq1panel(*this, "sq1panel"), |
| 139 | 140 | m_panel(*this, "panel"), |
| 140 | | m_dmac(*this, "mc68450") |
| 141 | m_dmac(*this, "mc68450"), |
| 142 | m_mdout(*this, "mdout") |
| 141 | 143 | { } |
| 142 | 144 | |
| 143 | 145 | required_device<m68000_device> m_maincpu; |
| r20255 | r20256 | |
| 147 | 149 | optional_device<esqpanel2x40_sq1_device> m_sq1panel; |
| 148 | 150 | optional_device<esqpanel2x40_device> m_panel; |
| 149 | 151 | optional_device<hd63450_device> m_dmac; |
| 152 | required_device<serial_port_device> m_mdout; |
| 150 | 153 | |
| 151 | 154 | virtual void machine_reset(); |
| 152 | 155 | |
| r20255 | r20256 | |
| 527 | 530 | // MIDI send, we don't care yet |
| 528 | 531 | WRITE_LINE_MEMBER(esq5505_state::duart_tx_a) |
| 529 | 532 | { |
| 533 | m_mdout->tx(state); |
| 530 | 534 | } |
| 531 | 535 | |
| 532 | 536 | WRITE_LINE_MEMBER(esq5505_state::duart_tx_b) |
| r20255 | r20256 | |
| 767 | 771 | }; |
| 768 | 772 | |
| 769 | 773 | static SLOT_INTERFACE_START(midiout_slot) |
| 774 | SLOT_INTERFACE("midiout", MIDIOUT_PORT) |
| 770 | 775 | SLOT_INTERFACE_END |
| 771 | 776 | |
| 772 | 777 | static const serial_port_interface midiout_intf = |
| r20255 | r20256 | |
| 783 | 788 | MCFG_DUARTN68681_ADD("duart", 4000000, duart_config) |
| 784 | 789 | |
| 785 | 790 | MCFG_SERIAL_PORT_ADD("mdin", midiin_intf, midiin_slot, "midiin", NULL) |
| 786 | | MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, NULL, NULL) |
| 791 | MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, "midiout", NULL) |
| 787 | 792 | |
| 788 | 793 | MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") |
| 789 | 794 | MCFG_SOUND_ADD("ensoniq", ES5505, XTAL_10MHz) |
| r20255 | r20256 | |
| 823 | 828 | MCFG_DUARTN68681_ADD("duart", 4000000, duart_config) |
| 824 | 829 | |
| 825 | 830 | MCFG_SERIAL_PORT_ADD("mdin", midiin_intf, midiin_slot, "midiin", NULL) |
| 826 | | MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, NULL, NULL) |
| 831 | MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, "midiout", NULL) |
| 827 | 832 | |
| 828 | 833 | MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") |
| 829 | 834 | MCFG_SOUND_ADD("ensoniq", ES5505, XTAL_30_4761MHz / 2) |
trunk/src/mess/mess.mak
| r20255 | r20256 | |
| 558 | 558 | $(MESS_DEVICES)/sonydriv.o \ |
| 559 | 559 | $(MESS_DEVICES)/appldriv.o \ |
| 560 | 560 | $(MESS_MACHINE)/dp8390.o \ |
| 561 | | $(MESS_MACHINE)/midiinport.o \ |
| 562 | 561 | $(MESS_MACHINE)/ne1000.o \ |
| 563 | 562 | $(MESS_MACHINE)/ne2000.o \ |
| 564 | 563 | $(MESS_MACHINE)/3c503.o \ |
| 565 | 564 | $(MESS_FORMATS)/z80bin.o \ |
| 566 | 565 | $(MESS_MACHINE)/mb8795.o \ |
| 566 | $(MESS_MACHINE)/midiinport.o \ |
| 567 | $(MESS_MACHINE)/midioutport.o \ |
| 567 | 568 | $(MESS_MACHINE)/null_modem.o \ |
| 568 | 569 | $(MESS_MACHINE)/vcsctrl.o \ |
| 569 | 570 | $(MESS_MACHINE)/vcs_joy.o \ |