From 5ba88cba300a3ead645e6c43b0103e910bc4a1cc Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 13 May 2017 02:58:36 +0200 Subject: [PATCH] Reduced the MPU-401 reset timer multiplier to 33, should make Harball 3 work on most, if not all, emulated machines; The Read TOC command no longer sends more data than requested, and it always returns the correct value in the data field if the request data length is smaller than the actual data length. --- src/SOUND/snd_mpu401.c | 2 +- src/cdrom.c | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/SOUND/snd_mpu401.c b/src/SOUND/snd_mpu401.c index 837186188..eace343f3 100644 --- a/src/SOUND/snd_mpu401.c +++ b/src/SOUND/snd_mpu401.c @@ -271,7 +271,7 @@ static void MPU401_WriteCommand(mpu_t *mpu, uint8_t val) break; case 0xff: /* Reset MPU-401 */ pclog("MPU-401:Reset %X\n",val); - mpu401_reset_callback = MPU401_RESETBUSY * 200 * TIMER_USEC; + mpu401_reset_callback = MPU401_RESETBUSY * 33 * TIMER_USEC; mpu->state.reset=1; MPU401_Reset(mpu); if (mpu->mode==M_UART) return;//do not send ack in UART mode diff --git a/src/cdrom.c b/src/cdrom.c index 74968157d..8617e35af 100644 --- a/src/cdrom.c +++ b/src/cdrom.c @@ -2424,19 +2424,17 @@ void cdrom_command(uint8_t id, uint8_t *cdb) toc_format = (cdb[9] >> 6) & 3; } - len = cdb[8] + (cdb[7] << 8); - switch (toc_format) { case 0: /*Normal*/ - len = cdrom_drives[id].handler->readtoc(id, cdbufferb, cdb[6], msf, len, 0); + len = cdrom_drives[id].handler->readtoc(id, cdbufferb, cdb[6], msf, max_len, 0); break; case 1: /*Multi session*/ - len = cdrom_drives[id].handler->readtoc_session(id, cdbufferb, msf, len); + len = cdrom_drives[id].handler->readtoc_session(id, cdbufferb, msf, max_len); cdbufferb[0] = 0; cdbufferb[1] = 0xA; break; case 2: /*Raw*/ - len = cdrom_drives[id].handler->readtoc_raw(id, cdbufferb, msf, len); + len = cdrom_drives[id].handler->readtoc_raw(id, cdbufferb, msf, max_len); break; default: cdrom_invalid_field(id); @@ -2444,6 +2442,14 @@ void cdrom_command(uint8_t id, uint8_t *cdb) } } + if (len > max_len) + { + len = max_len; + + cdbufferb[0] = ((len - 2) >> 8) & 0xff; + cdbufferb[1] = (len - 2) & 0xff; + } + cdrom_data_command_finish(id, len, len, len, 0); /* cdrom_log("CD-ROM %i: READ_TOC_PMA_ATIP format %02X, length %i (%i)\n", id, toc_format, ide->cylinder, cdbufferb[1]); */ return;