OPM/OPZ: new hard reset strat

also fix weird envelope after hard reset
This commit is contained in:
tildearrow 2023-01-20 04:28:18 -05:00
parent 7fbc188532
commit c0d1fe9c65
7 changed files with 116 additions and 51 deletions

View file

@ -559,7 +559,6 @@ void DivPlatformYM2610::tick(bool sysTick) {
mustHardReset=true;
for (int j=0; j<4; j++) {
unsigned short baseAddr=chanOffs[i]|opOffs[j];
oldWrites[baseAddr+ADDR_SL_RR]=-1;
immWrite(baseAddr+ADDR_SL_RR,0x0f);
hardResetElapsed++;
}
@ -740,6 +739,13 @@ void DivPlatformYM2610::tick(bool sysTick) {
for (int i=0; i<psgChanOffs; i++) {
if (i==1 && extMode) continue;
if ((chan[i].keyOn || chan[i].opMaskChanged) && chan[i].hardReset) {
// restore SL/RR
for (int j=0; j<4; j++) {
unsigned short baseAddr=chanOffs[i]|opOffs[j];
DivInstrumentFM::Operator& op=chan[i].state.op[j];
immWrite(baseAddr+ADDR_SL_RR,(op.rr&15)|(op.sl<<4));
}
immWrite(0x28,(chan[i].opMask<<4)|konOffs[i]);
chan[i].opMaskChanged=false;
chan[i].keyOn=false;