From c0d1fe9c65d9c9cc4a965e75ac73a7697ea8f2c1 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 20 Jan 2023 04:28:18 -0500 Subject: [PATCH] OPM/OPZ: new hard reset strat also fix weird envelope after hard reset --- src/engine/platform/arcade.cpp | 64 +++++++++++++++++++++------------ src/engine/platform/genesis.cpp | 7 +++- src/engine/platform/tx81z.cpp | 64 ++++++++++++++++++++------------- src/engine/platform/ym2203.cpp | 8 ++++- src/engine/platform/ym2608.cpp | 8 ++++- src/engine/platform/ym2610.cpp | 8 ++++- src/engine/platform/ym2610b.cpp | 8 ++++- 7 files changed, 116 insertions(+), 51 deletions(-) diff --git a/src/engine/platform/arcade.cpp b/src/engine/platform/arcade.cpp index 20d844a3..e417c313 100644 --- a/src/engine/platform/arcade.cpp +++ b/src/engine/platform/arcade.cpp @@ -319,27 +319,6 @@ void DivPlatformArcade::tick(bool sysTick) { rWrite(baseAddr+ADDR_DT2_D2R,(op.d2r&31)|(op.dt2<<6)); } } - 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; - } - } - immWrite(0x08,i); - if (chan[i].hardReset && chan[i].keyOn) { - for (int j=0; j<4; j++) { - unsigned short baseAddr=chanOffs[i]|opOffs[j]; - for (int k=0; k<9; k++) { - immWrite(baseAddr+ADDR_SL_RR,0x0f); - } - } - } - chan[i].keyOff=false; - } } for (int i=0; i<256; i++) { @@ -349,6 +328,24 @@ void DivPlatformArcade::tick(bool sysTick) { } } + int hardResetElapsed=0; + bool mustHardReset=false; + + for (int i=0; i<8; i++) { + if (chan[i].keyOn || chan[i].keyOff) { + immWrite(0x08,i); + if (chan[i].hardReset && chan[i].keyOn) { + mustHardReset=true; + for (int j=0; j<4; j++) { + unsigned short baseAddr=chanOffs[i]|opOffs[j]; + immWrite(baseAddr+ADDR_SL_RR,0x0f); + hardResetElapsed++; + } + } + chan[i].keyOff=false; + } + } + for (int i=0; i<8; i++) { if (chan[i].freqChanged) { chan[i].freq=chan[i].baseFreq+(chan[i].pitch>>1)-64+chan[i].pitch2; @@ -363,14 +360,37 @@ void DivPlatformArcade::tick(bool sysTick) { if (chan[i].freq>=(95<<6)) chan[i].freq=(95<<6)-1; immWrite(i+0x28,hScale(chan[i].freq>>6)); immWrite(i+0x30,chan[i].freq<<2); + hardResetElapsed+=2; chan[i].freqChanged=false; } - if (chan[i].keyOn || chan[i].opMaskChanged) { + if ((chan[i].keyOn || chan[i].opMaskChanged) && !chan[i].hardReset) { immWrite(0x08,(chan[i].opMask<<3)|i); + hardResetElapsed++; chan[i].opMaskChanged=false; chan[i].keyOn=false; } } + + // hard reset handling + if (mustHardReset) { + for (unsigned int i=hardResetElapsed; i>1)-64+chan[i].pitch2; @@ -323,14 +319,34 @@ void DivPlatformTX81Z::tick(bool sysTick) { if (chan[i].freq>=(95<<6)) chan[i].freq=(95<<6)-1; immWrite(i+0x28,hScale(chan[i].freq>>6)); immWrite(i+0x30,(chan[i].freq<<2)|(chan[i].chVolL==chan[i].chVolR)); + hardResetElapsed+=2; chan[i].freqChanged=false; } - if (chan[i].keyOn) { - //immWrite(0x08,i); + if (chan[i].keyOn && !chan[i].hardReset) { immWrite(chanOffs[i]+ADDR_LR_FB_ALG,(chan[i].state.alg&7)|(chan[i].state.fb<<3)|0x40|(chan[i].chVolR<<7)); chan[i].keyOn=false; } } + + // hard reset handling + if (mustHardReset) { + for (unsigned int i=hardResetElapsed; i