diff options
| author | 2013-08-13 04:24:21 +0000 | |
|---|---|---|
| committer | 2013-08-13 04:24:21 +0000 | |
| commit | 72088cfa11046ed9e27e208b9fc4c56c1d110f8d (patch) | |
| tree | 81b69ac094420f8e8bf0fd6b9960d9b0d2a79966 | |
| parent | 161aa0f83398fe202bccd16443e7da477b5117d1 (diff) | |
MIDI: System Common messages should not override running status, fixes Sierra games crashing with the MT-32. [R. Belmont]
| -rw-r--r-- | src/mess/machine/mpu401.c | 4 | ||||
| -rw-r--r-- | src/osd/portmedia/pmmidi.c | 21 |
2 files changed, 18 insertions, 7 deletions
diff --git a/src/mess/machine/mpu401.c b/src/mess/machine/mpu401.c index 97426c11eb0..c11b4f0d885 100644 --- a/src/mess/machine/mpu401.c +++ b/src/mess/machine/mpu401.c @@ -182,7 +182,7 @@ READ8_MEMBER(mpu401_device::regs_mode2_r) case 6: case 7: case 0xf: - printf("MPU401: read @ unk %x (PC=%x)\n", offset, space.device().safe_pc()); +// printf("MPU401: read @ unk %x (PC=%x)\n", offset, space.device().safe_pc()); break; default: @@ -201,7 +201,7 @@ WRITE8_MEMBER(mpu401_device::regs_mode2_w) case 6: case 7: case 0xf: - printf("MPU401: %02x @ unk %x (PC=%x)\n", data, offset, space.device().safe_pc()); +// printf("MPU401: %02x @ unk %x (PC=%x)\n", data, offset, space.device().safe_pc()); break; default: diff --git a/src/osd/portmedia/pmmidi.c b/src/osd/portmedia/pmmidi.c index 0485f9e63d1..dcc17608b82 100644 --- a/src/osd/portmedia/pmmidi.c +++ b/src/osd/portmedia/pmmidi.c @@ -291,6 +291,14 @@ void osd_write_midi_channel(osd_midi_device *dev, UINT8 data) PmEvent ev; ev.timestamp = 0; // use the current time +// printf("write: %02x (%d)\n", data, dev->xmit_cnt); + + if (dev->xmit_cnt >= 4) + { + printf("MIDI out: packet assembly overflow, contact MAMEdev!\n"); + return; + } + // handle sysex if (dev->last_status == MIDI_SYSEX) { @@ -299,7 +307,7 @@ void osd_write_midi_channel(osd_midi_device *dev, UINT8 data) // if we get a status that isn't sysex, assume it's system common if ((data & 0x80) && (data != MIDI_EOX)) { -// printf("common during sysex!\n"); +// printf("common during sysex!\n"); ev.message = Pm_Message(data, 0, 0); Pm_Write(dev->pmStream, &ev, 1); return; @@ -315,7 +323,7 @@ void osd_write_midi_channel(osd_midi_device *dev, UINT8 data) dev->xmit_in[0] = dev->xmit_in[1] = dev->xmit_in[2] = dev->xmit_in[3] = 0; dev->xmit_cnt = 0; -// printf("SysEx packet: %08x\n", ev.message); +// printf("SysEx packet: %08x\n", ev.message); // if this is EOX, kill the running status if (data == MIDI_EOX) @@ -327,8 +335,8 @@ void osd_write_midi_channel(osd_midi_device *dev, UINT8 data) return; } - // handle running status - if ((dev->xmit_cnt == 0) && (data & 0x80)) + // handle running status. don't allow system real-time messages to be considered as running status. + if ((dev->xmit_cnt == 0) && (data & 0x80) && (data < 0xf8)) { dev->last_status = data; } @@ -337,20 +345,23 @@ void osd_write_midi_channel(osd_midi_device *dev, UINT8 data) { dev->xmit_in[dev->xmit_cnt++] = dev->last_status; dev->xmit_in[dev->xmit_cnt++] = data; +// printf("\trunning status: [%d] = %02x, [%d] = %02x, last_status = %02x\n", dev->xmit_cnt-2, dev->last_status, dev->xmit_cnt-1, data, dev->last_status); } else { dev->xmit_in[dev->xmit_cnt++] = data; +// printf("\tNRS: [%d] = %02x\n", dev->xmit_cnt-1, data); } if ((dev->xmit_cnt == 1) && (dev->xmit_in[0] == MIDI_SYSEX)) { -// printf("Start SysEx!\n"); +// printf("Start SysEx!\n"); dev->last_status = MIDI_SYSEX; return; } // are we there yet? +// printf("status check: %02x\n", dev->xmit_in[0]); switch ((dev->xmit_in[0]>>4) & 0xf) { case 0xc: // 2-byte messages |
