C64: possibly fix write delay issue in reSIDfp

This commit is contained in:
tildearrow 2022-12-11 16:46:25 -05:00
parent 315d7595a5
commit 1fe4230e82
2 changed files with 19 additions and 1 deletions

View File

@ -22,7 +22,7 @@
#include "sound/c64_fp/siddefs-fp.h"
#include <math.h>
#define rWrite(a,v) if (!skipRegisterWrites) {if (isFP) {sid_fp.write(a,v);} else {sid.write(a,v);}; regPool[(a)&0x1f]=v; if (dumpWrites) {addWrite(a,v);} }
#define rWrite(a,v) if (!skipRegisterWrites) {writes.emplace(a,v); if (dumpWrites) {addWrite(a,v);} }
#define CHIP_FREQBASE 524288
@ -66,6 +66,16 @@ const char** DivPlatformC64::getRegisterSheet() {
void DivPlatformC64::acquire(short* bufL, short* bufR, size_t start, size_t len) {
int dcOff=isFP?0:sid.get_dc(0);
for (size_t i=start; i<start+len; i++) {
if (!writes.empty()) {
QueuedWrite w=writes.front();
if (isFP) {
sid_fp.write(w.addr,w.val);
} else {
sid.write(w.addr,w.val);
};
regPool[w.addr&0x1f]=w.val;
writes.pop();
}
if (isFP) {
sid_fp.clock(4,&bufL[i]);
if (++writeOscBuf>=4) {
@ -483,6 +493,7 @@ float DivPlatformC64::getPostAmp() {
}
void DivPlatformC64::reset() {
while (!writes.empty()) writes.pop();
for (int i=0; i<3; i++) {
chan[i]=DivPlatformC64::Channel();
chan[i].std.setEngine(parent);

View File

@ -21,6 +21,7 @@
#define _C64_H
#include "../dispatch.h"
#include <queue>
#include "../macroInt.h"
#include "sound/c64/sid.h"
#include "sound/c64_fp/SID.h"
@ -73,6 +74,12 @@ class DivPlatformC64: public DivDispatch {
Channel chan[3];
DivDispatchOscBuffer* oscBuf[3];
bool isMuted[3];
struct QueuedWrite {
unsigned char addr;
unsigned char val;
QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {}
};
std::queue<QueuedWrite> writes;
unsigned char filtControl, filtRes, vol;
unsigned char writeOscBuf;