From aa95c28d75c88da0bc37e89bd46654dd1969902a Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 28 Apr 2024 16:29:41 -0500 Subject: [PATCH] YM2608-LLE, part 16 works special thanks to nukeykt --- src/engine/platform/ym2610.cpp | 35 ++++++++++++++++++++---------- src/engine/platform/ym2610shared.h | 4 +++- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 45b881986..72be23565 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -551,20 +551,33 @@ void DivPlatformYM2610::acquire_lle(short** buf, size_t len) { lastS=fm_lle.o_s; - // ADPCM data bus + // ADPCM-A data bus + if (fm_lle.o_rmpx && !rmpx) { + adMemAddrA&=~0x3ff; + adMemAddrA|=(fm_lle.o_rad&0xff)|((fm_lle.o_ra8&3)<<8); + } + if (!fm_lle.o_rmpx && rmpx) { + adMemAddrA&=0x3ff; + adMemAddrA|=((fm_lle.o_rad&0xff)|(fm_lle.o_ra8<<8)|(fm_lle.o_ra20<<10))<<10; + } if (!fm_lle.o_roe) { fm_lle.input.rad=adpcmAMem[adMemAddrA&0xffffff]; - } else { - if (!fm_lle.o_rmpx && rmpx) { - adMemAddrA&=~0x3ff; - adMemAddrA=(fm_lle.o_rad&0xff)|(fm_lle.o_ra8<<8); - } - if (fm_lle.o_rmpx && !rmpx) { - adMemAddrA&=0x3ff; - adMemAddrA=((fm_lle.o_rad&0xff)|(fm_lle.o_ra8<<8)|(fm_lle.o_ra20<<10))<<10; - } - rmpx=fm_lle.o_rmpx; } + rmpx=fm_lle.o_rmpx; + + // ADPCM-B data bus + if (fm_lle.o_pmpx && !pmpx) { + adMemAddrB&=~0xfff; + adMemAddrB|=(fm_lle.o_pad&0xff)|((fm_lle.o_pa8&15)<<8); + } + if (!fm_lle.o_pmpx && pmpx) { + adMemAddrB&=0xfff; + adMemAddrB|=((fm_lle.o_pad&0xff)|((fm_lle.o_pa8&15)<<8))<<12; + } + if (!fm_lle.o_poe) { + fm_lle.input.pad=adpcmBMem[adMemAddrB&0xffffff]; + } + pmpx=fm_lle.o_pmpx; if (have0 && have1) break; } diff --git a/src/engine/platform/ym2610shared.h b/src/engine/platform/ym2610shared.h index a9b480f0f..35901fc9a 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -65,7 +65,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN { bool lastSH; bool lastSH2; bool lastS; - unsigned char rmpx, pmpx, rssCycle, rssSubCycle; + unsigned char rmpx, pmpx, roe, poe, rssCycle, rssSubCycle; unsigned int adMemAddrA; unsigned int adMemAddrB; @@ -158,6 +158,8 @@ class DivPlatformYM2610Base: public DivPlatformOPN { lastS=0; rmpx=0; pmpx=0; + roe=0; + poe=0; rssCycle=0; rssSubCycle=0; adMemAddrA=0;