MPU-401 read data now clears IRQ in UART mode if it was pending, fixes stuck pending MPU-401 IRQ (and broken wave audio).

This commit is contained in:
OBattler
2018-09-15 20:17:13 +02:00
parent 7f26f64882
commit 4e7d0e5b6b

View File

@@ -8,7 +8,7 @@
* *
* Roland MPU-401 emulation. * Roland MPU-401 emulation.
* *
* Version: @(#)snd_mpu401.c 1.0.16 2018/09/11 * Version: @(#)snd_mpu401.c 1.0.17 2018/09/15
* *
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/> * Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* DOSBox Team, * DOSBox Team,
@@ -117,7 +117,10 @@ MPU401_Reset(mpu_t *mpu)
{ {
uint8_t i; uint8_t i;
picintc(1 << mpu->irq); if (mpu->mode == M_INTELLIGENT) {
picintc(1 << mpu->irq);
mpu->state.irq_pending = 0;
}
mpu->mode = M_INTELLIGENT; mpu->mode = M_INTELLIGENT;
mpu->state.eoi_scheduled = 0; mpu->state.eoi_scheduled = 0;
@@ -128,7 +131,6 @@ MPU401_Reset(mpu_t *mpu)
mpu->state.cond_set = 0; mpu->state.cond_set = 0;
mpu->state.playing = 0; mpu->state.playing = 0;
mpu->state.run_irq = 0; mpu->state.run_irq = 0;
mpu->state.irq_pending = 0;
mpu->state.cmask = 0xff; mpu->state.cmask = 0xff;
mpu->state.amask = mpu->state.tmask = 0; mpu->state.amask = mpu->state.tmask = 0;
mpu->state.midi_mask = 0xffff; mpu->state.midi_mask = 0xffff;
@@ -733,11 +735,19 @@ MPU401_ReadData(mpu_t *mpu)
} }
/* Shouldn't this check mpu->mode? */ /* Shouldn't this check mpu->mode? */
if (mpu->mode == M_UART) if (mpu->mode == M_UART) {
return ret; if (mpu->state.irq_pending) {
picintc(1 << mpu->irq);
mpu->state.irq_pending = 0;
}
if (mpu->queue_used == 0) return ret;
}
if (mpu->queue_used == 0) {
picintc(1 << mpu->irq); picintc(1 << mpu->irq);
mpu->state.irq_pending = 0;
}
if ((ret >= 0xf0) && (ret <= 0xf7)) { if ((ret >= 0xf0) && (ret <= 0xf7)) {
/* MIDI data request */ /* MIDI data request */