trunk/src/mess/machine/isa_sblaster.c
| r20664 | r20665 | |
| 284 | 284 | m_tx_busy = false; |
| 285 | 285 | m_xmit_read = m_xmit_write = 0; |
| 286 | 286 | m_recv_read = m_recv_write = 0; |
| 287 | | m_rx_waiting = m_tx_waiting = false; |
| 287 | m_rx_waiting = m_tx_waiting = 0; |
| 288 | 288 | |
| 289 | 289 | //printf("%02x\n",data); |
| 290 | 290 | } |
| r20664 | r20665 | |
| 298 | 298 | if (m_uart_midi) |
| 299 | 299 | { |
| 300 | 300 | UINT8 rv = m_recvring[m_recv_read++]; |
| 301 | if (m_recv_read >= MIDI_RING_SIZE) |
| 302 | { |
| 303 | m_recv_read = 0; |
| 304 | } |
| 305 | |
| 301 | 306 | if (m_rx_waiting) |
| 302 | 307 | { |
| 303 | 308 | m_rx_waiting--; |
| r20664 | r20665 | |
| 777 | 782 | irq_w(0, IRQ_MPU); |
| 778 | 783 | if(offset == 0) // data |
| 779 | 784 | { |
| 780 | | if(m_head != m_tail) |
| 785 | res = m_recvring[m_recv_read++]; |
| 786 | if (m_recv_read >= MIDI_RING_SIZE) |
| 781 | 787 | { |
| 782 | | res = m_mpu_queue[m_tail++]; |
| 783 | | m_tail %= 16; |
| 788 | m_recv_read = 0; |
| 784 | 789 | } |
| 785 | | else |
| 786 | | res = 0xff; |
| 790 | |
| 791 | if (m_rx_waiting) |
| 792 | { |
| 793 | m_rx_waiting--; |
| 794 | } |
| 787 | 795 | } |
| 788 | 796 | else // status |
| 789 | 797 | { |
| 790 | | res = ((m_head != m_tail)?0:0x80) | 0x3f; // bit 7 queue empty (DSR), bit 6 DRR (Data Receive Ready?) |
| 798 | res = 0; |
| 799 | if (m_tx_waiting >= MIDI_RING_SIZE) |
| 800 | { |
| 801 | res |= 0x40; // tx full |
| 802 | } |
| 803 | if (m_rx_waiting == 0) |
| 804 | { |
| 805 | res |= 0x80; // rx empty |
| 806 | } |
| 791 | 807 | } |
| 792 | 808 | |
| 793 | 809 | return res; |
| r20664 | r20665 | |
| 811 | 827 | { |
| 812 | 828 | case 0x3f: // enter MPU-401 UART mode |
| 813 | 829 | irq_w(1, IRQ_MPU); |
| 814 | | m_head = m_tail = 0; |
| 815 | | m_mpu_queue[m_head++] = 0xfe; |
| 830 | m_recv_read = m_recv_write = 0; |
| 831 | m_xmit_read = m_xmit_write = m_tx_waiting = 0; |
| 832 | m_recvring[m_recv_write++] = 0xfe; |
| 833 | m_rx_waiting = 1; |
| 816 | 834 | m_mpu_midi = true; |
| 817 | 835 | break; |
| 818 | 836 | |
| 819 | 837 | case 0xff: // reset |
| 820 | 838 | irq_w(1, IRQ_MPU); |
| 821 | | m_head = m_tail = 0; |
| 822 | | m_mpu_queue[m_head++] = 0xfe; |
| 839 | m_recv_read = m_recv_write = 0; |
| 840 | m_recvring[m_recv_write++] = 0xfe; |
| 841 | m_rx_waiting = 1; |
| 823 | 842 | m_mpu_midi = false; |
| 824 | 843 | break; |
| 825 | 844 | } |
| r20664 | r20665 | |
| 1199 | 1218 | m_isa->install_device(subdevice("ymf262"), 0x0220, 0x0223, 0, 0, FUNC(ymf262_r), FUNC(ymf262_w) ); |
| 1200 | 1219 | m_isa->install_device(subdevice("ymf262"), 0x0228, 0x0229, 0, 0, FUNC(ymf262_r), FUNC(ymf262_w) ); |
| 1201 | 1220 | |
| 1202 | | m_head = 0; |
| 1203 | | m_tail = 0; |
| 1204 | 1221 | m_timer = timer_alloc(0, NULL); |
| 1205 | 1222 | } |
| 1206 | 1223 | |
| r20664 | r20665 | |
| 1238 | 1255 | m_tx_busy = false; |
| 1239 | 1256 | m_xmit_read = m_xmit_write = 0; |
| 1240 | 1257 | m_recv_read = m_recv_write = 0; |
| 1241 | | m_rx_waiting = m_tx_waiting = false; |
| 1258 | m_rx_waiting = m_tx_waiting = 0; |
| 1242 | 1259 | |
| 1243 | 1260 | // MIDI is 31250 baud, 8-N-1 |
| 1244 | 1261 | set_rcv_rate(31250); |
| r20664 | r20665 | |
| 1544 | 1561 | if (m_uart_midi) |
| 1545 | 1562 | { |
| 1546 | 1563 | m_recvring[m_recv_write++] = data; |
| 1564 | if (m_recv_write >= MIDI_RING_SIZE) |
| 1565 | { |
| 1566 | m_recv_write = 0; |
| 1567 | } |
| 1568 | |
| 1547 | 1569 | if (m_recv_write != m_recv_read) |
| 1548 | 1570 | { |
| 1549 | 1571 | m_rx_waiting++; |
| r20664 | r20665 | |
| 1560 | 1582 | receive_register_extract(); |
| 1561 | 1583 | UINT8 data = get_received_char(); |
| 1562 | 1584 | |
| 1563 | | // in UART MIDI mode, we set the DMA8 IRQ on receiving a character |
| 1564 | | if (m_uart_midi) |
| 1585 | // for UART or MPU, add character to the receive queue |
| 1586 | if (m_uart_midi || m_mpu_midi) |
| 1565 | 1587 | { |
| 1566 | 1588 | m_recvring[m_recv_write++] = data; |
| 1589 | if (m_recv_write >= MIDI_RING_SIZE) |
| 1590 | { |
| 1591 | m_recv_write = 0; |
| 1592 | } |
| 1593 | |
| 1567 | 1594 | if (m_recv_write != m_recv_read) |
| 1568 | 1595 | { |
| 1569 | 1596 | m_rx_waiting++; |
| 1570 | 1597 | } |
| 1598 | |
| 1571 | 1599 | if (m_uart_irq) |
| 1572 | 1600 | { |
| 1573 | 1601 | irq_w(1, IRQ_DMA8); |
| 1574 | 1602 | } |
| 1575 | | } |
| 1576 | 1603 | |
| 1577 | | // in MPU MIDI mode, do this instead |
| 1578 | | if (m_mpu_midi) |
| 1579 | | { |
| 1580 | | m_mpu_queue[m_head++] = data; |
| 1581 | | if (m_head >= 16) |
| 1604 | if (m_mpu_midi) |
| 1582 | 1605 | { |
| 1583 | | m_head = 0; |
| 1606 | irq_w(1, IRQ_MPU); |
| 1584 | 1607 | } |
| 1585 | | irq_w(1, IRQ_MPU); |
| 1586 | 1608 | } |
| 1587 | 1609 | } |
| 1588 | 1610 | |