ADPCM-B: fixes to compatible mode

This commit is contained in:
tildearrow 2022-05-13 22:43:00 -05:00
parent d902652a5d
commit d7ec3b13c5
3 changed files with 17 additions and 8 deletions

View file

@ -797,10 +797,11 @@ int DivPlatformYM2608::dispatch(DivCommand c) {
int end=s->offB+s->lengthB-1; int end=s->offB+s->lengthB-1;
immWrite(0x104,(end>>5)&0xff); immWrite(0x104,(end>>5)&0xff);
immWrite(0x105,(end>>13)&0xff); immWrite(0x105,(end>>13)&0xff);
immWrite(0x101,isMuted[c.chan]?0:(chan[c.chan].pan<<6)); immWrite(0x101,(isMuted[c.chan]?0:(chan[c.chan].pan<<6))|2);
immWrite(0x100,(s->loopStart>=0)?0x90:0x80); // start/repeat immWrite(0x100,(s->loopStart>=0)?0xb0:0xa0); // start/repeat
chan[c.chan].baseFreq=(((unsigned int)s->rate)<<16)/(chipClock/144); int freq=(65536.0*(double)s->rate)/((double)chipClock/144.0);
chan[c.chan].freqChanged=true; immWrite(0x109,freq&0xff);
immWrite(0x10a,(freq>>8)&0xff);
} }
break; break;
} }
@ -942,6 +943,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) {
break; break;
} }
case DIV_CMD_PITCH: { case DIV_CMD_PITCH: {
if (c.chan==15 && !chan[c.chan].furnacePCM) break;
chan[c.chan].pitch=c.value; chan[c.chan].pitch=c.value;
chan[c.chan].freqChanged=true; chan[c.chan].freqChanged=true;
break; break;
@ -1022,6 +1024,7 @@ int DivPlatformYM2608::dispatch(DivCommand c) {
iface.sampleBank=sampleBank; iface.sampleBank=sampleBank;
break; break;
case DIV_CMD_LEGATO: { case DIV_CMD_LEGATO: {
if (c.chan==15 && !chan[c.chan].furnacePCM) break;
chan[c.chan].baseFreq=NOTE_OPNB(c.chan,c.value); chan[c.chan].baseFreq=NOTE_OPNB(c.chan,c.value);
chan[c.chan].freqChanged=true; chan[c.chan].freqChanged=true;
break; break;

View file

@ -840,8 +840,9 @@ int DivPlatformYM2610::dispatch(DivCommand c) {
immWrite(0x15,end>>16); immWrite(0x15,end>>16);
immWrite(0x11,isMuted[c.chan]?0:(chan[c.chan].pan<<6)); immWrite(0x11,isMuted[c.chan]?0:(chan[c.chan].pan<<6));
immWrite(0x10,(s->loopStart>=0)?0x90:0x80); // start/repeat immWrite(0x10,(s->loopStart>=0)?0x90:0x80); // start/repeat
chan[c.chan].baseFreq=(((unsigned int)s->rate)<<16)/(chipClock/144); int freq=(65536.0*(double)s->rate)/((double)chipClock/144.0);
chan[c.chan].freqChanged=true; immWrite(0x19,freq&0xff);
immWrite(0x1a,(freq>>8)&0xff);
} }
break; break;
} }
@ -997,6 +998,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) {
break; break;
} }
case DIV_CMD_PITCH: { case DIV_CMD_PITCH: {
if (c.chan==13 && !chan[c.chan].furnacePCM) break;
chan[c.chan].pitch=c.value; chan[c.chan].pitch=c.value;
chan[c.chan].freqChanged=true; chan[c.chan].freqChanged=true;
break; break;
@ -1077,6 +1079,7 @@ int DivPlatformYM2610::dispatch(DivCommand c) {
iface.sampleBank=sampleBank; iface.sampleBank=sampleBank;
break; break;
case DIV_CMD_LEGATO: { case DIV_CMD_LEGATO: {
if (c.chan==13 && !chan[c.chan].furnacePCM) break;
chan[c.chan].baseFreq=NOTE_OPNB(c.chan,c.value); chan[c.chan].baseFreq=NOTE_OPNB(c.chan,c.value);
chan[c.chan].freqChanged=true; chan[c.chan].freqChanged=true;
break; break;

View file

@ -818,8 +818,9 @@ int DivPlatformYM2610B::dispatch(DivCommand c) {
immWrite(0x15,end>>16); immWrite(0x15,end>>16);
immWrite(0x11,isMuted[c.chan]?0:(chan[c.chan].pan<<6)); immWrite(0x11,isMuted[c.chan]?0:(chan[c.chan].pan<<6));
immWrite(0x10,(s->loopStart>=0)?0x90:0x80); // start/repeat immWrite(0x10,(s->loopStart>=0)?0x90:0x80); // start/repeat
chan[c.chan].baseFreq=(((unsigned int)s->rate)<<16)/(chipClock/144); int freq=(65536.0*(double)s->rate)/((double)chipClock/144.0);
chan[c.chan].freqChanged=true; immWrite(0x19,freq&0xff);
immWrite(0x1a,(freq>>8)&0xff);
} }
break; break;
} }
@ -975,6 +976,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) {
break; break;
} }
case DIV_CMD_PITCH: { case DIV_CMD_PITCH: {
if (c.chan==15 && !chan[c.chan].furnacePCM) break;
chan[c.chan].pitch=c.value; chan[c.chan].pitch=c.value;
chan[c.chan].freqChanged=true; chan[c.chan].freqChanged=true;
break; break;
@ -1055,6 +1057,7 @@ int DivPlatformYM2610B::dispatch(DivCommand c) {
iface.sampleBank=sampleBank; iface.sampleBank=sampleBank;
break; break;
case DIV_CMD_LEGATO: { case DIV_CMD_LEGATO: {
if (c.chan==15 && !chan[c.chan].furnacePCM) break;
chan[c.chan].baseFreq=NOTE_OPNB(c.chan,c.value); chan[c.chan].baseFreq=NOTE_OPNB(c.chan,c.value);
chan[c.chan].freqChanged=true; chan[c.chan].freqChanged=true;
break; break;