trunk/src/emu/bus/snes_ctrl/miracle.c
| r243317 | r243318 | |
| 1 | 1 | /********************************************************************** |
| 2 | 2 | |
| 3 | | Nintendo SNES - Miracle Piano Keyboard |
| 3 | Super Nintendo Entertainment System - Miracle Piano Keyboard |
| 4 | 4 | |
| 5 | | TODO: ??? |
| 6 | | |
| 7 | 5 | Copyright MESS Team. |
| 8 | 6 | Visit http://mamedev.org for licensing and usage restrictions. |
| 9 | | |
| 7 | |
| 8 | recv at PC = 008a4a |
| 9 | xmit at PC = 008adb |
| 10 | |
| 10 | 11 | **********************************************************************/ |
| 11 | 12 | |
| 12 | 13 | #include "miracle.h" |
| r243317 | r243318 | |
| 60 | 61 | //------------------------------------------------- |
| 61 | 62 | |
| 62 | 63 | snes_miracle_device::snes_miracle_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 63 | | device_t(mconfig, SNES_MIRACLE, "Miracle Piano Controller (SNES)", tag, owner, clock, "snes_miracle", __FILE__), |
| 64 | device_t(mconfig, SNES_MIRACLE, "Miracle Piano SNES Cable", tag, owner, clock, "snes_miracle", __FILE__), |
| 64 | 65 | device_serial_interface(mconfig, *this), |
| 65 | 66 | device_snes_control_port_interface(mconfig, *this), |
| 66 | 67 | m_midiin(*this, "mdin"), |
| r243317 | r243318 | |
| 106 | 107 | m_tx_busy = false; |
| 107 | 108 | } |
| 108 | 109 | |
| 109 | | |
| 110 | | //------------------------------------------------- |
| 111 | | // read |
| 112 | | //------------------------------------------------- |
| 113 | | |
| 114 | 110 | UINT8 snes_miracle_device::read_pin4() |
| 115 | 111 | { |
| 116 | 112 | UINT8 ret = 0; |
| r243317 | r243318 | |
| 132 | 128 | return ret; |
| 133 | 129 | } |
| 134 | 130 | |
| 135 | | //------------------------------------------------- |
| 136 | | // write |
| 137 | | //------------------------------------------------- |
| 131 | void snes_miracle_device::write_pin6(UINT8 data) |
| 132 | { |
| 133 | // printf("%02x to pin6\n", data); |
| 134 | } |
| 138 | 135 | |
| 139 | | // c4fc = start of recv routine |
| 140 | | // c53a = start of send routine |
| 141 | | |
| 142 | 136 | void snes_miracle_device::write_strobe(UINT8 data) |
| 143 | 137 | { |
| 144 | | // printf("write: %d (%d %02x %d)\n", data & 1, m_sent_bits, m_data_sent, m_midi_mode); |
| 138 | // printf("%02x to strobe\n", data); |
| 145 | 139 | |
| 146 | 140 | if (m_midi_mode == MIRACLE_MIDI_SEND) |
| 147 | 141 | { |
| 148 | | //SNES writes (data & 1) to Miracle Piano! |
| 142 | // console writes (data & 1) to Miracle Piano. |
| 149 | 143 | // 1st write is data present flag (1=data present) |
| 150 | 144 | // next 8 writes are actual data bits (with ^1) |
| 151 | 145 | m_sent_bits++; |
| r243317 | r243318 | |
| 177 | 171 | { |
| 178 | 172 | // printf("got strobe at %d clocks\n", m_strobe_clock); |
| 179 | 173 | |
| 180 | | if (m_strobe_clock < 528 && data == 0) |
| 174 | if (m_strobe_clock < 500 && data == 0) |
| 181 | 175 | { |
| 182 | 176 | // short delay is recieve mode |
| 183 | 177 | m_midi_mode = MIRACLE_MIDI_RECEIVE; |
| r243317 | r243318 | |
| 203 | 197 | } |
| 204 | 198 | return; |
| 205 | 199 | } |
| 206 | | else if (m_strobe_clock >= 528) |
| 200 | else if (m_strobe_clock >= 500) |
| 207 | 201 | { |
| 208 | | // more than 528 clocks since strobe on write means send mode |
| 202 | // more than ~520 clocks since strobe on write means send mode |
| 203 | // (ranges from 522-528 have been seen) |
| 209 | 204 | m_midi_mode = MIRACLE_MIDI_SEND; |
| 210 | 205 | strobe_timer->reset(); |
| 211 | 206 | m_strobe_on = 0; |
trunk/src/emu/bus/snes_ctrl/miracle.h
| r243317 | r243318 | |
| 1 | 1 | /********************************************************************** |
| 2 | 2 | |
| 3 | | Nintendo Entertainment System - Miracle Piano Keyboard |
| 3 | Super Nintendo Entertainment System - Miracle Piano Keyboard |
| 4 | 4 | |
| 5 | 5 | Copyright MESS Team. |
| 6 | 6 | Visit http://mamedev.org for licensing and usage restrictions. |
| r243317 | r243318 | |
| 51 | 51 | virtual void device_start(); |
| 52 | 52 | virtual void device_reset(); |
| 53 | 53 | |
| 54 | | virtual UINT8 read_pin4(); |
| 55 | | virtual void write_strobe(UINT8 data); |
| 54 | UINT8 read_pin4(); |
| 55 | void write_pin6(UINT8 data); |
| 56 | void write_strobe(UINT8 data); |
| 56 | 57 | |
| 57 | 58 | static const device_timer_id TIMER_STROBE_ON = 0; |
| 58 | 59 | emu_timer *strobe_timer; |