Fixed the MPU-401 tempo stuff.

This commit is contained in:
OBattler
2020-01-23 06:40:20 +01:00
parent 771241a474
commit e1e2d2d17d

View File

@@ -8,7 +8,7 @@
*
* Roland MPU-401 emulation.
*
* Version: @(#)snd_mpu401.c 1.0.19 2020/01/19
* Version: @(#)snd_mpu401.c 1.0.20 2020/01/23
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* DOSBox Team,
@@ -86,12 +86,19 @@ MPU401_ReCalcClock(mpu_t *mpu)
int32_t maxtempo = 240, mintempo = 16;
int32_t freq;
if (mpu->clock.timebase >= 168)
maxtempo = 179;
if (mpu->clock.timebase == 144)
if (mpu->clock.timebase < 72) {
maxtempo = 240;
mintempo = 32;
} else if (mpu->clock.timebase < 120) {
maxtempo = 240;
mintempo = 16;
} else if (mpu->clock.timebase < 168) {
maxtempo = 208;
if (mpu->clock.timebase >= 120)
maxtempo = 8;
mintempo = 8;
} else {
maxtempo = 179;
mintempo = 8;
}
mpu->clock.freq = ((uint32_t)(mpu->clock.tempo * 2 * mpu->clock.tempo_rel)) >> 6;
mpu->clock.freq = mpu->clock.timebase * (mpu->clock.freq < (mintempo * 2) ? mintempo :
@@ -141,7 +148,7 @@ MPU401_RunClock(mpu_t *mpu)
static void
MPU401_QueueByte(mpu_t *mpu, uint8_t data)
MPU401_QueueByteEx(mpu_t *mpu, uint8_t data, int irq)
{
if (mpu->state.block_ack) {
mpu->state.block_ack = 0;
@@ -150,7 +157,8 @@ MPU401_QueueByte(mpu_t *mpu, uint8_t data)
if (mpu->queue_used == 0) {
mpu->state.irq_pending = 1;
picint(1 << mpu->irq);
if (irq)
picint(1 << mpu->irq);
}
if (mpu->queue_used < MPU401_QUEUE) {
@@ -167,6 +175,13 @@ MPU401_QueueByte(mpu_t *mpu, uint8_t data)
}
static void
MPU401_QueueByte(mpu_t *mpu, uint8_t data)
{
MPU401_QueueByteEx(mpu, data, 1);
}
static void
MPU401_RecQueueBuffer(mpu_t *mpu, uint8_t *buf, uint32_t len, int block)
{
@@ -610,7 +625,7 @@ MPU401_WriteCommand(mpu_t *mpu, uint8_t val)
was_uart = (mpu->mode == M_UART);
MPU401_Reset(mpu);
if (was_uart)
return; /* do not send ack in UART mode */
return;
break;
/* default:
@@ -1545,10 +1560,8 @@ MPU401_InputMsg(void *p, uint8_t *msg)
}
/* UART mode input. */
for (i = 0; i < len; i++) {
for (i = 0; i < len; i++)
MPU401_QueueByte(mpu, msg[i]);
picint(1 << mpu->irq);
}
}