From 48a1e6a9769be9f27610e8f1d01bacca824c8244 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 19 Jan 2023 14:36:15 -0500 Subject: [PATCH] YM2612: new experimental hard reset strategy --- src/engine/platform/fmsharedbase.h | 2 ++ src/engine/platform/genesis.cpp | 46 ++++++++++++++++++++---------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/engine/platform/fmsharedbase.h b/src/engine/platform/fmsharedbase.h index f64c723ac..90548aab9 100644 --- a/src/engine/platform/fmsharedbase.h +++ b/src/engine/platform/fmsharedbase.h @@ -83,6 +83,7 @@ class DivPlatformFMBase: public DivDispatch { unsigned char lastBusy; int delay; + unsigned int hardResetCycles; bool flushFirst; unsigned char regPool[512]; @@ -123,6 +124,7 @@ class DivPlatformFMBase: public DivDispatch { DivDispatch(), lastBusy(0), delay(0), + hardResetCycles(0), flushFirst(false) {} }; diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 5cbed89ed..1a9573cce 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -472,26 +472,20 @@ void DivPlatformGenesis::tick(bool sysTick) { } } + int hardResetElapsed=0; + bool mustHardReset=false; + for (int i=0; i<6; i++) { if (i==2 && extMode) continue; if (chan[i].keyOn || chan[i].keyOff) { - if (chan[i].hardReset && chan[i].keyOn) { - for (int j=0; j<4; j++) { - unsigned short baseAddr=chanOffs[i]|opOffs[j]; - immWrite(baseAddr+ADDR_SL_RR,0x0f); - immWrite(baseAddr+ADDR_TL,0x7f); - oldWrites[baseAddr+ADDR_SL_RR]=-1; - oldWrites[baseAddr+ADDR_TL]=-1; - //rWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4)); - } - } immWrite(0x28,0x00|konOffs[i]); if (chan[i].hardReset && chan[i].keyOn) { + mustHardReset=true; for (int j=0; j<4; j++) { unsigned short baseAddr=chanOffs[i]|opOffs[j]; - for (int k=0; k<5; k++) { - immWrite(baseAddr+ADDR_SL_RR,0x0f); - } + oldWrites[baseAddr+ADDR_SL_RR]=-1; + immWrite(baseAddr+ADDR_SL_RR,0x0f); + hardResetElapsed++; } } chan[i].keyOff=false; @@ -520,6 +514,7 @@ void DivPlatformGenesis::tick(bool sysTick) { if (i<6) { immWrite(chanOffs[i]+ADDR_FREQH,chan[i].freq>>8); immWrite(chanOffs[i]+ADDR_FREQ,chan[i].freq&0xff); + hardResetElapsed+=2; } if (chan[i].furnaceDac && chan[i].dacMode) { double off=1.0; @@ -538,12 +533,31 @@ void DivPlatformGenesis::tick(bool sysTick) { } chan[i].freqChanged=false; } - if (chan[i].keyOn || chan[i].opMaskChanged) { - if (i<6) immWrite(0x28,(chan[i].opMask<<4)|konOffs[i]); + if ((chan[i].keyOn || chan[i].opMaskChanged) && !chan[i].hardReset) { + if (i<6) { + immWrite(0x28,(chan[i].opMask<<4)|konOffs[i]); + hardResetElapsed++; + } chan[i].opMaskChanged=false; chan[i].keyOn=false; } } + + // hard reset handling + if (mustHardReset) { + for (unsigned int i=hardResetElapsed; irate=rate; }