C64: dSID core, part 1

This commit is contained in:
tildearrow 2023-07-05 17:09:02 -05:00
parent 56b786f55e
commit 621616ae25
9 changed files with 235 additions and 200 deletions

View file

@ -65,19 +65,29 @@ const char** DivPlatformC64::getRegisterSheet() {
}
void DivPlatformC64::acquire(short** buf, size_t len) {
int dcOff=isFP?0:sid.get_dc(0);
int dcOff=(sidCore)?0:sid.get_dc(0);
for (size_t i=0; i<len; i++) {
if (!writes.empty()) {
QueuedWrite w=writes.front();
if (isFP) {
if (sidCore==2) {
dSID_write(sid_d,w.addr,w.val);
} else if (sidCore==1) {
sid_fp.write(w.addr,w.val);
} else {
sid.write(w.addr,w.val);
};
}
regPool[w.addr&0x1f]=w.val;
writes.pop();
}
if (isFP) {
if (sidCore==2) {
buf[0][i]=32767.0*dSID_render(sid_d);
if (++writeOscBuf>=4) {
writeOscBuf=0;
oscBuf[0]->data[oscBuf[0]->needle++]=sid_d->lastOut[0];
oscBuf[1]->data[oscBuf[1]->needle++]=sid_d->lastOut[1];
oscBuf[2]->data[oscBuf[2]->needle++]=sid_d->lastOut[2];
}
} else if (sidCore==1) {
sid_fp.clock(4,&buf[0][i]);
if (++writeOscBuf>=4) {
writeOscBuf=0;
@ -452,7 +462,14 @@ int DivPlatformC64::dispatch(DivCommand c) {
void DivPlatformC64::muteChannel(int ch, bool mute) {
isMuted[ch]=mute;
if (isFP) {
if (sidCore==2) {
dSID_setMuteMask(
sid_d,
(isMuted[0]?1:0)|
(isMuted[1]?2:0)|
(isMuted[2]?4:0)
);
} else if (sidCore==1) {
sid_fp.mute(ch,mute);
} else {
sid.set_is_muted(ch,mute);
@ -514,7 +531,7 @@ bool DivPlatformC64::getWantPreNote() {
}
float DivPlatformC64::getPostAmp() {
return isFP?3.0f:1.0f;
return (sidCore==1)?3.0f:1.0f;
}
void DivPlatformC64::reset() {
@ -524,7 +541,9 @@ void DivPlatformC64::reset() {
chan[i].std.setEngine(parent);
}
if (isFP) {
if (sidCore==2) {
dSID_init(sid_d,chipClock,rate,sidIs6581?6581:8580,1);
} else if (sidCore==1) {
sid_fp.reset();
sid_fp.clockSilent(16000);
} else {
@ -555,22 +574,27 @@ void DivPlatformC64::poke(std::vector<DivRegWrite>& wlist) {
void DivPlatformC64::setChipModel(bool is6581) {
if (is6581) {
if (isFP) {
if (sidCore==2) {
// do nothing
} else if (sidCore==1) {
sid_fp.setChipModel(reSIDfp::MOS6581);
} else {
sid.set_chip_model(MOS6581);
}
} else {
if (isFP) {
if (sidCore==2) {
// do nothing
} else if (sidCore==1) {
sid_fp.setChipModel(reSIDfp::MOS8580);
} else {
sid.set_chip_model(MOS8580);
}
}
sidIs6581=is6581;
}
void DivPlatformC64::setFP(bool fp) {
isFP=fp;
void DivPlatformC64::setCore(unsigned char which) {
sidCore=which;
}
void DivPlatformC64::setFlags(const DivConfig& flags) {
@ -591,9 +615,9 @@ void DivPlatformC64::setFlags(const DivConfig& flags) {
for (int i=0; i<3; i++) {
oscBuf[i]->rate=rate/16;
}
if (isFP) {
if (sidCore>0) {
rate/=4;
sid_fp.setSamplingParameters(chipClock,reSIDfp::DECIMATE,rate,0);
if (sidCore==1) sid_fp.setSamplingParameters(chipClock,reSIDfp::DECIMATE,rate,0);
}
keyPriority=flags.getBool("keyPriority",true);
testAD=((flags.getInt("testAttack",0)&15)<<4)|(flags.getInt("testDecay",0)&15);
@ -609,6 +633,13 @@ int DivPlatformC64::init(DivEngine* p, int channels, int sugRate, const DivConfi
isMuted[i]=false;
oscBuf[i]=new DivDispatchOscBuffer;
}
if (sidCore==2) {
sid_d=new struct SID_chip;
} else {
sid_d=NULL;
}
setFlags(flags);
reset();
@ -620,6 +651,7 @@ void DivPlatformC64::quit() {
for (int i=0; i<3; i++) {
delete oscBuf[i];
}
if (sid_d!=NULL) delete sid_d;
}
DivPlatformC64::~DivPlatformC64() {