From 79fa3aba35b43b300e781766b59e85d021668916 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 12 Dec 2025 04:12:50 -0500 Subject: [PATCH] remove remnants of legacy sample mode --- src/engine/platform/genesis.cpp | 84 +++++++++++++++---------------- src/engine/platform/vrc6.cpp | 82 +++++++++++++++---------------- src/engine/platform/vrc6.h | 3 +- src/engine/platform/x1_010.cpp | 87 +++++++++++++++------------------ src/engine/platform/x1_010.h | 5 +- 5 files changed, 121 insertions(+), 140 deletions(-) diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 0d607319c..a0fd760c0 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -1060,51 +1060,47 @@ int DivPlatformGenesis::dispatch(DivCommand c) { } if (c.chan>=5 && chan[c.chan].dacMode) { //if (skipRegisterWrites) break; - if (ins->type==DIV_INS_AMIGA) { // Furnace mode - if (c.value!=DIV_NOTE_NULL) { - chan[c.chan].dacSample=ins->amiga.getSample(c.value); - chan[c.chan].sampleNote=c.value; - c.value=ins->amiga.getFreq(c.value); - chan[c.chan].sampleNoteDelta=c.value-chan[c.chan].sampleNote; - } else if (chan[c.chan].sampleNote!=DIV_NOTE_NULL) { - chan[c.chan].dacSample=ins->amiga.getSample(chan[c.chan].sampleNote); - c.value=ins->amiga.getFreq(chan[c.chan].sampleNote); - } - if (chan[c.chan].dacSample<0 || chan[c.chan].dacSample>=parent->song.sampleLen) { - chan[c.chan].dacSample=-1; - if (dumpWrites) addWrite(0xffff0002,0); - break; - } else { - rWrite(0x2b,1<<7); - if (dumpWrites) { - addWrite(0xffff0000,chan[c.chan].dacSample); - addWrite(0xffff0003,chan[c.chan].dacDirection); - } - } - if (chan[c.chan].setPos) { - chan[c.chan].setPos=false; - } else { - chan[c.chan].dacPos=0; - } - chan[c.chan].dacPeriod=0; - if (c.value!=DIV_NOTE_NULL) { - chan[c.chan].baseFreq=parent->calcBaseFreq(1,1,c.value,false); - chan[c.chan].portaPause=false; - chan[c.chan].note=c.value; - chan[c.chan].freqChanged=true; - } - - chan[c.chan].macroInit(ins); - if (!chan[c.chan].std.vol.will) { - chan[c.chan].outVol=chan[c.chan].vol; - } - - // ??? - //chan[c.chan].keyOn=true; - chan[c.chan].active=true; - } else { // compatible mode - assert(false && "LEGACY SAMPLE MODE!!!"); + if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].dacSample=ins->amiga.getSample(c.value); + chan[c.chan].sampleNote=c.value; + c.value=ins->amiga.getFreq(c.value); + chan[c.chan].sampleNoteDelta=c.value-chan[c.chan].sampleNote; + } else if (chan[c.chan].sampleNote!=DIV_NOTE_NULL) { + chan[c.chan].dacSample=ins->amiga.getSample(chan[c.chan].sampleNote); + c.value=ins->amiga.getFreq(chan[c.chan].sampleNote); } + if (chan[c.chan].dacSample<0 || chan[c.chan].dacSample>=parent->song.sampleLen) { + chan[c.chan].dacSample=-1; + if (dumpWrites) addWrite(0xffff0002,0); + break; + } else { + rWrite(0x2b,1<<7); + if (dumpWrites) { + addWrite(0xffff0000,chan[c.chan].dacSample); + addWrite(0xffff0003,chan[c.chan].dacDirection); + } + } + if (chan[c.chan].setPos) { + chan[c.chan].setPos=false; + } else { + chan[c.chan].dacPos=0; + } + chan[c.chan].dacPeriod=0; + if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].baseFreq=parent->calcBaseFreq(1,1,c.value,false); + chan[c.chan].portaPause=false; + chan[c.chan].note=c.value; + chan[c.chan].freqChanged=true; + } + + chan[c.chan].macroInit(ins); + if (!chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } + + // ??? + //chan[c.chan].keyOn=true; + chan[c.chan].active=true; break; } if (c.chan>=6) break; diff --git a/src/engine/platform/vrc6.cpp b/src/engine/platform/vrc6.cpp index 62e2bd658..16f92a466 100644 --- a/src/engine/platform/vrc6.cpp +++ b/src/engine/platform/vrc6.cpp @@ -219,7 +219,7 @@ void DivPlatformVRC6::tick(bool sysTick) { chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,true,0,chan[i].pitch2,chipClock,14)-1; } else { // pulse chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,true,0,chan[i].pitch2,chipClock,16)-1; - if (chan[i].furnaceDac) { + if (chan[i].pcm) { double off=1.0; if (chan[i].dacSample>=0 && chan[i].dacSamplesong.sampleLen) { DivSample* s=parent->getSample(chan[i].dacSample); @@ -256,55 +256,51 @@ int DivPlatformVRC6::dispatch(DivCommand c) { DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_VRC6); if (ins->type==DIV_INS_AMIGA || ins->amiga.useSample) { chan[c.chan].pcm=true; - } else if (chan[c.chan].furnaceDac) { + } else { chan[c.chan].pcm=false; chan[c.chan].sampleNote=DIV_NOTE_NULL; chan[c.chan].sampleNoteDelta=0; } if (chan[c.chan].pcm) { + // TODO: do we really have to? if (skipRegisterWrites) break; - if (ins->type==DIV_INS_AMIGA || ins->amiga.useSample) { - if (c.value!=DIV_NOTE_NULL) { - chan[c.chan].dacSample=ins->amiga.getSample(c.value); - chan[c.chan].sampleNote=c.value; - c.value=ins->amiga.getFreq(c.value); - chan[c.chan].sampleNoteDelta=c.value-chan[c.chan].sampleNote; - } else if (chan[c.chan].sampleNote!=DIV_NOTE_NULL) { - chan[c.chan].dacSample=ins->amiga.getSample(chan[c.chan].sampleNote); - c.value=ins->amiga.getFreq(chan[c.chan].sampleNote); - } - if (chan[c.chan].dacSample<0 || chan[c.chan].dacSample>=parent->song.sampleLen) { - chan[c.chan].dacSample=-1; - if (dumpWrites) addWrite(0xffff0002+(c.chan<<8),0); - break; - } else { - if (dumpWrites) { - chWrite(c.chan,2,0x80); - chWrite(c.chan,0,isMuted[c.chan]?0:0x80); - addWrite(0xffff0000+(c.chan<<8),chan[c.chan].dacSample); - } - } - if (chan[c.chan].setPos) { - chan[c.chan].setPos=false; - } else { - chan[c.chan].dacPos=0; - } - chan[c.chan].dacPeriod=0; - if (c.value!=DIV_NOTE_NULL) { - chan[c.chan].baseFreq=NOTE_PERIODIC(c.value); - chan[c.chan].freqChanged=true; - chan[c.chan].note=c.value; - } - chan[c.chan].active=true; - chan[c.chan].macroInit(ins); - if (!parent->song.compatFlags.brokenOutVol && !chan[c.chan].std.vol.will) { - chan[c.chan].outVol=chan[c.chan].vol; - } - //chan[c.chan].keyOn=true; - chan[c.chan].furnaceDac=true; - } else { - assert(false && "LEGACY SAMPLE MODE!!!"); + if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].dacSample=ins->amiga.getSample(c.value); + chan[c.chan].sampleNote=c.value; + c.value=ins->amiga.getFreq(c.value); + chan[c.chan].sampleNoteDelta=c.value-chan[c.chan].sampleNote; + } else if (chan[c.chan].sampleNote!=DIV_NOTE_NULL) { + chan[c.chan].dacSample=ins->amiga.getSample(chan[c.chan].sampleNote); + c.value=ins->amiga.getFreq(chan[c.chan].sampleNote); } + if (chan[c.chan].dacSample<0 || chan[c.chan].dacSample>=parent->song.sampleLen) { + chan[c.chan].dacSample=-1; + if (dumpWrites) addWrite(0xffff0002+(c.chan<<8),0); + break; + } else { + if (dumpWrites) { + chWrite(c.chan,2,0x80); + chWrite(c.chan,0,isMuted[c.chan]?0:0x80); + addWrite(0xffff0000+(c.chan<<8),chan[c.chan].dacSample); + } + } + if (chan[c.chan].setPos) { + chan[c.chan].setPos=false; + } else { + chan[c.chan].dacPos=0; + } + chan[c.chan].dacPeriod=0; + if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].baseFreq=NOTE_PERIODIC(c.value); + chan[c.chan].freqChanged=true; + chan[c.chan].note=c.value; + } + chan[c.chan].active=true; + chan[c.chan].macroInit(ins); + if (!parent->song.compatFlags.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + } + //chan[c.chan].keyOn=true; break; } } diff --git a/src/engine/platform/vrc6.h b/src/engine/platform/vrc6.h index eb4a6eecc..63c6cf2dc 100644 --- a/src/engine/platform/vrc6.h +++ b/src/engine/platform/vrc6.h @@ -31,7 +31,7 @@ class DivPlatformVRC6: public DivDispatch, public vrcvi_intf { unsigned int dacPos; int dacSample; unsigned char duty; - bool pcm, furnaceDac, setPos; + bool pcm, setPos; Channel(): SharedChannel(15), dacPeriod(0), @@ -41,7 +41,6 @@ class DivPlatformVRC6: public DivDispatch, public vrcvi_intf { dacSample(-1), duty(0), pcm(false), - furnaceDac(false), setPos(false) {} }; Channel chan[3]; diff --git a/src/engine/platform/x1_010.cpp b/src/engine/platform/x1_010.cpp index b8615f30f..1ca69e262 100644 --- a/src/engine/platform/x1_010.cpp +++ b/src/engine/platform/x1_010.cpp @@ -339,15 +339,13 @@ void DivPlatformX1_010::tick(bool sysTick) { chan[i].envChanged=true; } } - if ((!chan[i].pcm) || chan[i].furnacePCM) { - if (NEW_ARP_STRAT) { - chan[i].handleArp(); - } else if (chan[i].std.arp.had) { - if (!chan[i].inPorta) { - chan[i].baseFreq=NoteX1_010(i,parent->calcArp(chan[i].note,chan[i].std.arp.val)); - } - chan[i].freqChanged=true; + if (NEW_ARP_STRAT) { + chan[i].handleArp(); + } else if (chan[i].std.arp.had) { + if (!chan[i].inPorta) { + chan[i].baseFreq=NoteX1_010(i,parent->calcArp(chan[i].note,chan[i].std.arp.val)); } + chan[i].freqChanged=true; } if (chan[i].std.wave.had && !chan[i].pcm) { if (chan[i].wave!=chan[i].std.wave.val || chan[i].ws.activeChanged()) { @@ -543,10 +541,8 @@ int DivPlatformX1_010::dispatch(DivCommand c) { chan[c.chan].macroVolMul=ins->type==DIV_INS_AMIGA?64:15; if ((ins->type==DIV_INS_AMIGA || ins->amiga.useSample) || chan[c.chan].pcm) { if (ins->type==DIV_INS_AMIGA || ins->amiga.useSample) { - chan[c.chan].furnacePCM=true; chan[c.chan].pcm=true; } else { - chan[c.chan].furnacePCM=false; chan[c.chan].pcm=false; chan[c.chan].sampleNote=DIV_NOTE_NULL; chan[c.chan].sampleNoteDelta=0; @@ -560,47 +556,42 @@ int DivPlatformX1_010::dispatch(DivCommand c) { } if (chan[c.chan].pcm) { if (skipRegisterWrites) break; - if (chan[c.chan].furnacePCM) { - chan[c.chan].pcm=true; - chan[c.chan].macroInit(ins); - if (c.value!=DIV_NOTE_NULL) { - chan[c.chan].sample=ins->amiga.getSample(c.value); - chan[c.chan].sampleNote=c.value; - c.value=ins->amiga.getFreq(c.value); - chan[c.chan].sampleNoteDelta=c.value-chan[c.chan].sampleNote; - } - if (chan[c.chan].sample>=0 && chan[c.chan].samplesong.sampleLen) { - DivSample* s=parent->getSample(chan[c.chan].sample); - if (isBanked) { - chan[c.chan].bankSlot=ins->x1_010.bankSlot; - bankSlot[chan[c.chan].bankSlot]=sampleOffX1[chan[c.chan].sample]>>17; - unsigned int bankedOffs=(chan[c.chan].bankSlot<<17)|(sampleOffX1[chan[c.chan].sample]&0x1ffff); - chWrite(c.chan,4,(bankedOffs>>12)&0xff); - int end=(bankedOffs+MIN(s->length8,0x1ffff)+0xfff)&~0xfff; // padded - chWrite(c.chan,5,(0x100-(end>>12))&0xff); - } else { - chWrite(c.chan,4,(sampleOffX1[chan[c.chan].sample]>>12)&0xff); - int end=(sampleOffX1[chan[c.chan].sample]+s->length8+0xfff)&~0xfff; // padded - chWrite(c.chan,5,(0x100-(end>>12))&0xff); - } - if (c.value!=DIV_NOTE_NULL) { - chan[c.chan].note=c.value; - chan[c.chan].baseFreq=NoteX1_010(c.chan,chan[c.chan].note); - chan[c.chan].fixedFreq=0; - chan[c.chan].freqChanged=true; - } + chan[c.chan].macroInit(ins); + if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].sample=ins->amiga.getSample(c.value); + chan[c.chan].sampleNote=c.value; + c.value=ins->amiga.getFreq(c.value); + chan[c.chan].sampleNoteDelta=c.value-chan[c.chan].sampleNote; + } + if (chan[c.chan].sample>=0 && chan[c.chan].samplesong.sampleLen) { + DivSample* s=parent->getSample(chan[c.chan].sample); + if (isBanked) { + chan[c.chan].bankSlot=ins->x1_010.bankSlot; + bankSlot[chan[c.chan].bankSlot]=sampleOffX1[chan[c.chan].sample]>>17; + unsigned int bankedOffs=(chan[c.chan].bankSlot<<17)|(sampleOffX1[chan[c.chan].sample]&0x1ffff); + chWrite(c.chan,4,(bankedOffs>>12)&0xff); + int end=(bankedOffs+MIN(s->length8,0x1ffff)+0xfff)&~0xfff; // padded + chWrite(c.chan,5,(0x100-(end>>12))&0xff); } else { - chan[c.chan].macroInit(NULL); - chan[c.chan].outVol=chan[c.chan].vol; - // TODO: there was a check for legacy sample bank here. why? - chWrite(c.chan,0,0); // reset - chWrite(c.chan,1,0); - chWrite(c.chan,2,0); - chWrite(c.chan,4,0); - chWrite(c.chan,5,0); + chWrite(c.chan,4,(sampleOffX1[chan[c.chan].sample]>>12)&0xff); + int end=(sampleOffX1[chan[c.chan].sample]+s->length8+0xfff)&~0xfff; // padded + chWrite(c.chan,5,(0x100-(end>>12))&0xff); + } + if (c.value!=DIV_NOTE_NULL) { + chan[c.chan].note=c.value; + chan[c.chan].baseFreq=NoteX1_010(c.chan,chan[c.chan].note); + chan[c.chan].fixedFreq=0; + chan[c.chan].freqChanged=true; } } else { - assert(false && "LEGACY SAMPLE MODE!!!"); + chan[c.chan].macroInit(NULL); + chan[c.chan].outVol=chan[c.chan].vol; + // TODO: there was a check for legacy sample bank here. why? + chWrite(c.chan,0,0); // reset + chWrite(c.chan,1,0); + chWrite(c.chan,2,0); + chWrite(c.chan,4,0); + chWrite(c.chan,5,0); } } else if (c.value!=DIV_NOTE_NULL) { chan[c.chan].note=c.value; diff --git a/src/engine/platform/x1_010.h b/src/engine/platform/x1_010.h index e16f51f3f..721400914 100644 --- a/src/engine/platform/x1_010.h +++ b/src/engine/platform/x1_010.h @@ -70,7 +70,7 @@ class DivPlatformX1_010: public DivDispatch, public vgsound_emu_mem_intf { int fixedFreq; int wave, sample; unsigned char pan, autoEnvNum, autoEnvDen; - bool envChanged, furnacePCM, pcm, setPos; + bool envChanged, pcm, setPos; int lvol, rvol; int macroVolMul; unsigned char waveBank; @@ -84,7 +84,7 @@ class DivPlatformX1_010: public DivDispatch, public vgsound_emu_mem_intf { autoEnvNum=autoEnvDen=0; active=false; insChanged=envChanged=freqChanged=true; - keyOn=keyOff=inPorta=furnacePCM=pcm=setPos=false; + keyOn=keyOff=inPorta=pcm=setPos=false; vol=outVol=lvol=rvol=15; waveBank=0; } @@ -97,7 +97,6 @@ class DivPlatformX1_010: public DivDispatch, public vgsound_emu_mem_intf { autoEnvNum(0), autoEnvDen(0), envChanged(true), - furnacePCM(false), pcm(false), setPos(false), lvol(15),