trunk/src/mess/machine/isa_sblaster.c
| r20663 | r20664 | |
| 71 | 71 | NULL |
| 72 | 72 | }; |
| 73 | 73 | |
| 74 | static SLOT_INTERFACE_START(midiin_slot) |
| 75 | SLOT_INTERFACE("midiin", MIDIIN_PORT) |
| 76 | SLOT_INTERFACE_END |
| 77 | |
| 78 | static const serial_port_interface midiin_intf = |
| 79 | { |
| 80 | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, sb_device, midi_rx_w) |
| 81 | }; |
| 82 | |
| 74 | 83 | static SLOT_INTERFACE_START(midiout_slot) |
| 75 | 84 | SLOT_INTERFACE("midiout", MIDIOUT_PORT) |
| 76 | 85 | SLOT_INTERFACE_END |
| r20663 | r20664 | |
| 99 | 108 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00) |
| 100 | 109 | |
| 101 | 110 | MCFG_PC_JOY_ADD("joy") |
| 111 | MCFG_SERIAL_PORT_ADD("mdin", midiin_intf, midiin_slot, "midiin", NULL) |
| 102 | 112 | MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, "midiout", NULL) |
| 103 | 113 | MACHINE_CONFIG_END |
| 104 | 114 | |
| r20663 | r20664 | |
| 116 | 126 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00) |
| 117 | 127 | |
| 118 | 128 | MCFG_PC_JOY_ADD("joy") |
| 129 | MCFG_SERIAL_PORT_ADD("mdin", midiin_intf, midiin_slot, "midiin", NULL) |
| 119 | 130 | MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, "midiout", NULL) |
| 120 | 131 | MACHINE_CONFIG_END |
| 121 | 132 | |
| r20663 | r20664 | |
| 133 | 144 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00) |
| 134 | 145 | |
| 135 | 146 | MCFG_PC_JOY_ADD("joy") |
| 147 | MCFG_SERIAL_PORT_ADD("mdin", midiin_intf, midiin_slot, "midiin", NULL) |
| 136 | 148 | MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, "midiout", NULL) |
| 137 | 149 | MACHINE_CONFIG_END |
| 138 | 150 | |
| r20663 | r20664 | |
| 272 | 284 | m_tx_busy = false; |
| 273 | 285 | m_xmit_read = m_xmit_write = 0; |
| 274 | 286 | m_recv_read = m_recv_write = 0; |
| 275 | | m_uart_xmitfull = false; |
| 287 | m_rx_waiting = m_tx_waiting = false; |
| 276 | 288 | |
| 277 | 289 | //printf("%02x\n",data); |
| 278 | 290 | } |
| r20663 | r20664 | |
| 285 | 297 | |
| 286 | 298 | if (m_uart_midi) |
| 287 | 299 | { |
| 288 | | UINT8 rv = m_recvring[m_recv_read]; |
| 289 | | |
| 290 | | // only advance the read pointer if the ring wasn't empty |
| 291 | | if (m_recv_read != m_xmit_read) |
| 300 | UINT8 rv = m_recvring[m_recv_read++]; |
| 301 | if (m_rx_waiting) |
| 292 | 302 | { |
| 293 | | m_recv_read++; |
| 303 | m_rx_waiting--; |
| 294 | 304 | } |
| 295 | 305 | |
| 296 | 306 | return rv; |
| r20663 | r20664 | |
| 325 | 335 | // to read. |
| 326 | 336 | if (m_uart_midi || m_onebyte_midi) |
| 327 | 337 | { |
| 328 | | if (m_recv_read != m_recv_write) |
| 338 | if (m_rx_waiting) |
| 329 | 339 | { |
| 330 | 340 | return 0x80; |
| 331 | 341 | } |
| r20663 | r20664 | |
| 347 | 357 | // set = buffer full |
| 348 | 358 | if (m_uart_midi || m_onebyte_midi) |
| 349 | 359 | { |
| 350 | | if (m_uart_xmitfull) |
| 360 | if (m_tx_waiting >= MIDI_RING_SIZE) |
| 351 | 361 | { |
| 352 | 362 | return 0x80; |
| 353 | 363 | } |
| r20663 | r20664 | |
| 429 | 439 | |
| 430 | 440 | case 0x34: |
| 431 | 441 | m_uart_midi = true; |
| 432 | | m_uart_irq = true; |
| 442 | m_uart_irq = false; |
| 433 | 443 | break; |
| 434 | 444 | |
| 435 | 445 | case 0x35: |
| 436 | 446 | m_uart_midi = true; |
| 437 | | m_uart_irq = false; |
| 447 | m_uart_irq = true; |
| 438 | 448 | break; |
| 439 | 449 | |
| 440 | 450 | case 0x36: |
| r20663 | r20664 | |
| 1228 | 1238 | m_tx_busy = false; |
| 1229 | 1239 | m_xmit_read = m_xmit_write = 0; |
| 1230 | 1240 | m_recv_read = m_recv_write = 0; |
| 1231 | | m_uart_xmitfull = false; |
| 1241 | m_rx_waiting = m_tx_waiting = false; |
| 1232 | 1242 | |
| 1233 | 1243 | // MIDI is 31250 baud, 8-N-1 |
| 1234 | 1244 | set_rcv_rate(31250); |
| r20663 | r20664 | |
| 1534 | 1544 | if (m_uart_midi) |
| 1535 | 1545 | { |
| 1536 | 1546 | m_recvring[m_recv_write++] = data; |
| 1537 | | |
| 1538 | | // if not polling mode, trigger the DMA8 IRQ |
| 1547 | if (m_recv_write != m_recv_read) |
| 1548 | { |
| 1549 | m_rx_waiting++; |
| 1550 | } |
| 1539 | 1551 | if (m_uart_irq) |
| 1540 | 1552 | { |
| 1541 | 1553 | irq_w(1, IRQ_DMA8); |
| r20663 | r20664 | |
| 1552 | 1564 | if (m_uart_midi) |
| 1553 | 1565 | { |
| 1554 | 1566 | m_recvring[m_recv_write++] = data; |
| 1555 | | irq_w(1, IRQ_DMA8); |
| 1567 | if (m_recv_write != m_recv_read) |
| 1568 | { |
| 1569 | m_rx_waiting++; |
| 1570 | } |
| 1571 | if (m_uart_irq) |
| 1572 | { |
| 1573 | irq_w(1, IRQ_DMA8); |
| 1574 | } |
| 1556 | 1575 | } |
| 1557 | 1576 | |
| 1558 | 1577 | // in MPU MIDI mode, do this instead |
| r20663 | r20664 | |
| 1571 | 1590 | { |
| 1572 | 1591 | // printf("Tx complete\n"); |
| 1573 | 1592 | // is there more waiting to send? |
| 1574 | | if ((m_xmit_read != m_xmit_write) || (m_uart_xmitfull)) |
| 1593 | if (m_tx_waiting) |
| 1575 | 1594 | { |
| 1576 | 1595 | transmit_register_setup(m_xmitring[m_xmit_read++]); |
| 1577 | 1596 | if (m_xmit_read >= MIDI_RING_SIZE) |
| 1578 | 1597 | { |
| 1579 | 1598 | m_xmit_read = 0; |
| 1580 | 1599 | } |
| 1581 | | m_uart_xmitfull = false; |
| 1600 | m_tx_waiting--; |
| 1582 | 1601 | } |
| 1583 | 1602 | else |
| 1584 | 1603 | { |
| r20663 | r20664 | |
| 1610 | 1629 | { |
| 1611 | 1630 | m_xmit_write = 0; |
| 1612 | 1631 | } |
| 1613 | | |
| 1614 | | if (m_xmit_write == m_xmit_read) |
| 1615 | | { |
| 1616 | | m_uart_xmitfull = true; |
| 1617 | | } |
| 1632 | m_tx_waiting++; |
| 1618 | 1633 | } |
| 1619 | 1634 | } |
| 1620 | 1635 | |
trunk/src/mess/machine/isa_sblaster.h
| r20663 | r20664 | |
| 117 | 117 | DECLARE_WRITE8_MEMBER(dsp_rbuf_status_w); |
| 118 | 118 | DECLARE_WRITE8_MEMBER(dsp_cmd_w); |
| 119 | 119 | |
| 120 | DECLARE_WRITE_LINE_MEMBER( midi_rx_w ) { check_for_start((UINT8)state); } |
| 121 | |
| 120 | 122 | protected: |
| 121 | 123 | // device-level overrides |
| 122 | 124 | virtual void device_reset(); |
| r20663 | r20664 | |
| 140 | 142 | struct sb8_dsp_state m_dsp; |
| 141 | 143 | UINT8 m_dack_out; |
| 142 | 144 | void xmit_char(UINT8 data); |
| 143 | | bool m_onebyte_midi, m_uart_midi, m_uart_irq, m_mpu_midi, m_uart_xmitfull; |
| 145 | bool m_onebyte_midi, m_uart_midi, m_uart_irq, m_mpu_midi; |
| 146 | int m_rx_waiting, m_tx_waiting; |
| 144 | 147 | UINT8 m_recvring[MIDI_RING_SIZE]; |
| 145 | 148 | UINT8 m_xmitring[MIDI_RING_SIZE]; |
| 146 | 149 | int m_xmit_read, m_xmit_write; |