trunk/src/mess/machine/isa_gus.c
| r20648 | r20649 | |
| 10 | 10 | #include "sound/speaker.h" |
| 11 | 11 | #include "machine/6850acia.h" |
| 12 | 12 | |
| 13 | |
| 13 | 14 | //************************************************************************** |
| 14 | 15 | // GLOBAL VARIABLES |
| 15 | 16 | //************************************************************************** |
| r20648 | r20649 | |
| 1199 | 1200 | static const acia6850_interface gus_midi_interface = |
| 1200 | 1201 | { |
| 1201 | 1202 | 31250 * 16, |
| 1202 | | 31250 * 16, |
| 1203 | 0, |
| 1203 | 1204 | |
| 1204 | | DEVCB_NULL, |
| 1205 | | DEVCB_NULL, |
| 1205 | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, isa16_gus_device, rx_in), // rx in |
| 1206 | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, isa16_gus_device, tx_out), // tx out |
| 1206 | 1207 | |
| 1207 | 1208 | DEVCB_NULL, |
| 1208 | 1209 | DEVCB_NULL, |
| r20648 | r20649 | |
| 1211 | 1212 | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,midi_irq) |
| 1212 | 1213 | }; |
| 1213 | 1214 | |
| 1215 | static SLOT_INTERFACE_START(midiin_slot) |
| 1216 | SLOT_INTERFACE("midiin", MIDIIN_PORT) |
| 1217 | SLOT_INTERFACE_END |
| 1218 | |
| 1219 | static const serial_port_interface midiin_intf = |
| 1220 | { |
| 1221 | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, isa16_gus_device, midi_rx_w) |
| 1222 | }; |
| 1223 | |
| 1224 | static SLOT_INTERFACE_START(midiout_slot) |
| 1225 | SLOT_INTERFACE("midiout", MIDIOUT_PORT) |
| 1226 | SLOT_INTERFACE_END |
| 1227 | |
| 1228 | static const serial_port_interface midiout_intf = |
| 1229 | { |
| 1230 | DEVCB_NULL // midi out ports don't transmit inward |
| 1231 | }; |
| 1232 | |
| 1214 | 1233 | static const gf1_interface gus_gf1_config = |
| 1215 | 1234 | { |
| 1216 | 1235 | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER,isa16_gus_device,wavetable_irq), |
| r20648 | r20649 | |
| 1231 | 1250 | MCFG_SOUND_ROUTE(0,"lspeaker",0.50) |
| 1232 | 1251 | MCFG_SOUND_ROUTE(1,"rspeaker",0.50) |
| 1233 | 1252 | MCFG_ACIA6850_ADD("midi",gus_midi_interface) |
| 1253 | MCFG_SERIAL_PORT_ADD("mdin", midiin_intf, midiin_slot, "midiin", NULL) |
| 1254 | MCFG_SERIAL_PORT_ADD("mdout", midiout_intf, midiout_slot, "midiout", NULL) |
| 1234 | 1255 | MACHINE_CONFIG_END |
| 1235 | 1256 | |
| 1236 | 1257 | static INPUT_PORTS_START( gus_joy ) |
| r20648 | r20649 | |
| 1274 | 1295 | { |
| 1275 | 1296 | m_gf1 = subdevice<gf1_device>("gf1"); |
| 1276 | 1297 | m_midi = subdevice<acia6850_device>("midi"); |
| 1298 | m_mdout = subdevice<serial_port_device>("mdout"); |
| 1277 | 1299 | set_isa_device(); |
| 1278 | 1300 | m_isa->install_device(0x0200, 0x0201, 0, 0, read8_delegate(FUNC(isa16_gus_device::joy_r),this), write8_delegate(FUNC(isa16_gus_device::joy_w),this) ); |
| 1279 | 1301 | m_isa->install_device(0x0220, 0x022f, 0, 0, read8_delegate(FUNC(isa16_gus_device::board_r),this), write8_delegate(FUNC(isa16_gus_device::board_w),this) ); |
| r20648 | r20649 | |
| 1672 | 1694 | |
| 1673 | 1695 | WRITE_LINE_MEMBER( isa16_gus_device::midi_irq ) |
| 1674 | 1696 | { |
| 1675 | | if(state) |
| 1676 | | set_midi_irq(IRQ_MIDI_TRANSMIT); |
| 1697 | UINT8 irq_type; |
| 1698 | UINT8 st = m_midi->get_status(); |
| 1699 | |
| 1700 | logerror("GUS: MIDI IRQ: state: %i Status: %02x\n",state,st); |
| 1701 | |
| 1702 | if(state == ASSERT_LINE) |
| 1703 | { |
| 1704 | if(st & 0x01) // receive |
| 1705 | irq_type = IRQ_MIDI_RECEIVE; |
| 1706 | else |
| 1707 | if(st & 0x02) // transmit |
| 1708 | irq_type = IRQ_MIDI_TRANSMIT; |
| 1709 | else |
| 1710 | { |
| 1711 | logerror("GUS: MIDI IRQ unknown: %02x\n",st); |
| 1712 | return; // Should never reach here... |
| 1713 | } |
| 1714 | set_midi_irq(irq_type); |
| 1715 | } |
| 1677 | 1716 | else |
| 1678 | | reset_midi_irq(IRQ_MIDI_TRANSMIT); |
| 1717 | reset_midi_irq(IRQ_MIDI_TRANSMIT | IRQ_MIDI_RECEIVE); |
| 1679 | 1718 | } |
| 1680 | 1719 | |
| 1720 | WRITE_LINE_MEMBER( isa16_gus_device::midi_rx_w ) |
| 1721 | { |
| 1722 | m_rx_state = state; |
| 1723 | for (int i = 0; i < 16; i++) // divider is set to 16 |
| 1724 | { |
| 1725 | m_midi->rx_clock_in(); |
| 1726 | } |
| 1727 | } |
| 1728 | |
| 1729 | READ_LINE_MEMBER( isa16_gus_device::rx_in ) |
| 1730 | { |
| 1731 | return m_rx_state; |
| 1732 | } |
| 1733 | |
| 1734 | WRITE_LINE_MEMBER( isa16_gus_device::tx_out ) |
| 1735 | { |
| 1736 | m_mdout->tx(state); |
| 1737 | } |
| 1738 | |
| 1681 | 1739 | WRITE_LINE_MEMBER( isa16_gus_device::nmi_w) |
| 1682 | 1740 | { |
| 1683 | 1741 | m_irq_status |= IRQ_SB; |
trunk/src/mess/machine/isa_gus.h
| r20648 | r20649 | |
| 43 | 43 | #include "emu.h" |
| 44 | 44 | #include "machine/isa.h" |
| 45 | 45 | #include "machine/6850acia.h" |
| 46 | #include "machine/serial.h" |
| 47 | #include "machine/midiinport.h" |
| 48 | #include "machine/midioutport.h" |
| 46 | 49 | |
| 47 | 50 | //************************************************************************** |
| 48 | 51 | // TYPE DEFINITIONS |
| r20648 | r20649 | |
| 251 | 254 | DECLARE_WRITE_LINE_MEMBER(drq1_w); |
| 252 | 255 | DECLARE_WRITE_LINE_MEMBER(drq2_w); |
| 253 | 256 | DECLARE_WRITE_LINE_MEMBER(nmi_w); |
| 257 | DECLARE_WRITE_LINE_MEMBER( midi_rx_w ); |
| 258 | DECLARE_READ_LINE_MEMBER( rx_in ); |
| 259 | DECLARE_WRITE_LINE_MEMBER( tx_out ); |
| 254 | 260 | |
| 255 | 261 | // DMA overrides |
| 256 | 262 | virtual UINT8 dack_r(int line); |
| r20648 | r20649 | |
| 269 | 275 | private: |
| 270 | 276 | gf1_device* m_gf1; |
| 271 | 277 | acia6850_device* m_midi; |
| 278 | serial_port_device* m_mdout; |
| 272 | 279 | |
| 273 | 280 | UINT8 m_irq_status; |
| 274 | 281 | attotime m_joy_time; |
| 282 | int m_rx_state; |
| 275 | 283 | }; |
| 276 | 284 | |
| 277 | 285 | // device type definition |