MIDI: System Common messages should not override running status, fixes Sierra games crashing with the MT-32. [R. Belmont]

This commit is contained in:
R. Belmont 2013-08-13 04:24:21 +00:00
parent 161aa0f833
commit 72088cfa11
2 changed files with 18 additions and 7 deletions

View File

@ -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:

View File

@ -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)
{
@ -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,10 +345,12 @@ 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))
@ -351,6 +361,7 @@ void osd_write_midi_channel(osd_midi_device *dev, UINT8 data)
}
// 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