From 1fe4230e82df49592742e0e83be5b66a1349bab1 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 11 Dec 2022 16:46:25 -0500 Subject: [PATCH] C64: possibly fix write delay issue in reSIDfp --- src/engine/platform/c64.cpp | 13 ++++++++++++- src/engine/platform/c64.h | 7 +++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 068dd1b33..4992fb249 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -22,7 +22,7 @@ #include "sound/c64_fp/siddefs-fp.h" #include -#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=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); diff --git a/src/engine/platform/c64.h b/src/engine/platform/c64.h index ba9a05129..4fe68f4e6 100644 --- a/src/engine/platform/c64.h +++ b/src/engine/platform/c64.h @@ -21,6 +21,7 @@ #define _C64_H #include "../dispatch.h" +#include #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 writes; unsigned char filtControl, filtRes, vol; unsigned char writeOscBuf;