OPNA: RSS write optimization

This commit is contained in:
tildearrow 2022-05-14 01:02:28 -05:00
parent c685b60a3c
commit 031a0fc133
2 changed files with 17 additions and 4 deletions

View file

@ -696,6 +696,11 @@ void DivPlatformYM2608::tick(bool sysTick) {
chan[15].freqChanged=false; chan[15].freqChanged=false;
} }
if (writeRSSOff) {
immWrite(0x10,0x80|writeRSSOff);
writeRSSOff=0;
}
for (int i=16; i<512; i++) { for (int i=16; i<512; i++) {
if (pendingWrites[i]!=oldWrites[i]) { if (pendingWrites[i]!=oldWrites[i]) {
immWrite(i,pendingWrites[i]&0xff); immWrite(i,pendingWrites[i]&0xff);
@ -731,6 +736,11 @@ void DivPlatformYM2608::tick(bool sysTick) {
chan[i].keyOn=false; chan[i].keyOn=false;
} }
} }
if (writeRSSOn) {
immWrite(0x10,writeRSSOn);
writeRSSOn=0;
}
} }
int DivPlatformYM2608::dispatch(DivCommand c) { int DivPlatformYM2608::dispatch(DivCommand c) {
@ -805,10 +815,10 @@ int DivPlatformYM2608::dispatch(DivCommand c) {
} }
break; break;
} }
if (c.chan>8) { // RSS TODO: improve rhythm writing strategy if (c.chan>8) { // RSS
if (skipRegisterWrites) break; if (skipRegisterWrites) break;
writeRSSOn|=(1<<(c.chan-9));
immWrite(0x18+(c.chan-9),isMuted[c.chan]?0:((chan[c.chan].pan<<6)|chan[c.chan].vol)); immWrite(0x18+(c.chan-9),isMuted[c.chan]?0:((chan[c.chan].pan<<6)|chan[c.chan].vol));
immWrite(0x10,0x00|(1<<(c.chan-9)));
break; break;
} }
DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM); DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_FM);
@ -866,7 +876,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) {
break; break;
} }
if (c.chan>8) { if (c.chan>8) {
immWrite(0x10,0x80|(1<<(c.chan-9))); writeRSSOff|=1<<(c.chan-9);
break; break;
} }
chan[c.chan].keyOff=true; chan[c.chan].keyOff=true;
@ -880,7 +890,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) {
break; break;
} }
if (c.chan>8) { if (c.chan>8) {
immWrite(0x10,0x80|(1<<(c.chan-9))); writeRSSOff|=1<<(c.chan-9);
break; break;
} }
chan[c.chan].keyOff=true; chan[c.chan].keyOff=true;
@ -1340,6 +1350,8 @@ void DivPlatformYM2608::reset() {
lastBusy=60; lastBusy=60;
sampleBank=0; sampleBank=0;
writeRSSOff=0;
writeRSSOn=0;
delay=0; delay=0;

View file

@ -104,6 +104,7 @@ class DivPlatformYM2608: public DivDispatch {
DivPlatformAY8910* ay; DivPlatformAY8910* ay;
unsigned char sampleBank; unsigned char sampleBank;
unsigned char writeRSSOff, writeRSSOn;
int delay; int delay;