From 30bd991f27a1aad1147996ac6d96b9a8e4814a19 Mon Sep 17 00:00:00 2001 From: kub Date: Wed, 23 Sep 2020 22:26:43 +0200 Subject: [PATCH] mcd, GenesisPlusGX bugfix 18fca13,33a43e3: report SEEK status while seeking --- pico/cd/cdd.c | 44 ++++++++++++++------------------------------ 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/pico/cd/cdd.c b/pico/cd/cdd.c index d9707c44..0ef9a126 100644 --- a/pico/cd/cdd.c +++ b/pico/cd/cdd.c @@ -676,30 +676,16 @@ void cdd_update(void) error("LBA = %d (track n°%d)(latency=%d)\n", cdd.lba, cdd.index, cdd.latency); #endif - /* seeking disc */ - if (cdd.status == CD_SEEK) + /* drive latency */ + if (cdd.latency > 0) { - /* drive latency */ - if (cdd.latency > 0) - { - cdd.latency--; - return; - } - - /* drive is ready */ - cdd.status = CD_READY; + cdd.latency--; + return; } /* reading disc */ - else if (cdd.status == CD_PLAY) + if (cdd.status == CD_PLAY) { - /* drive latency */ - if (cdd.latency > 0) - { - cdd.latency--; - return; - } - /* track type */ if (!cdd.index) { @@ -900,14 +886,12 @@ void cdd_process(void) { case 0x00: /* Drive Status */ { - /* RS1-RS8 normally unchanged */ - Pico_mcd->s68k_regs[0x38+0] = cdd.status; + if (cdd.latency <= 3) { + /* RS1-RS8 normally unchanged */ + Pico_mcd->s68k_regs[0x38+0] = cdd.status; - /* unless RS1 indicated invalid track infos */ - if (Pico_mcd->s68k_regs[0x38+1] == 0x0f) - { - /* and SEEK has ended */ - if (cdd.status != CD_SEEK) + /* unless RS1 indicated invalid track infos */ + if (Pico_mcd->s68k_regs[0x38+1] == 0x0f) { /* then return valid track infos, e.g current track number in RS2-RS3 (fixes Lunar - The Silver Star) */ Pico_mcd->s68k_regs[0x38+1] = 0x02; @@ -1127,11 +1111,11 @@ void cdd_process(void) cdd.status = CD_PLAY; /* return track index in RS2-RS3 */ - set_reg16(0x38, (CD_PLAY << 8) | 0x02); - set_reg16(0x3a, (cdd.index < cdd.toc.last) ? lut_BCD_16[index + 1] : 0x0A0A); + set_reg16(0x38, (CD_SEEK << 8) | 0x02); + set_reg16(0x3a, 0x0000); set_reg16(0x3c, 0x0000); set_reg16(0x3e, 0x0000); - Pico_mcd->s68k_regs[0x40+0] = 0x00; + set_reg16(0x40, ~(CD_SEEK + 0xf) & 0x0f); break; } @@ -1223,7 +1207,7 @@ void cdd_process(void) Pico_mcd->s68k_regs[0x36+0] = 0x01; /* update status */ - cdd.status = CD_SEEK; + cdd.status = CD_READY; /* unknown RS1-RS8 values (returning 0xF in RS1 invalidates track infos in RS2-RS8 and fixes Final Fight CD intro when seek time is emulated) */ set_reg16(0x38, (CD_SEEK << 8) | 0x0f); -- 2.39.5