C64: possibly fix write delay issue in reSIDfp
This commit is contained in:
parent
315d7595a5
commit
1fe4230e82
|
@ -22,7 +22,7 @@
|
||||||
#include "sound/c64_fp/siddefs-fp.h"
|
#include "sound/c64_fp/siddefs-fp.h"
|
||||||
#include <math.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
|
#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) {
|
void DivPlatformC64::acquire(short* bufL, short* bufR, size_t start, size_t len) {
|
||||||
int dcOff=isFP?0:sid.get_dc(0);
|
int dcOff=isFP?0:sid.get_dc(0);
|
||||||
for (size_t i=start; i<start+len; i++) {
|
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) {
|
if (isFP) {
|
||||||
sid_fp.clock(4,&bufL[i]);
|
sid_fp.clock(4,&bufL[i]);
|
||||||
if (++writeOscBuf>=4) {
|
if (++writeOscBuf>=4) {
|
||||||
|
@ -483,6 +493,7 @@ float DivPlatformC64::getPostAmp() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformC64::reset() {
|
void DivPlatformC64::reset() {
|
||||||
|
while (!writes.empty()) writes.pop();
|
||||||
for (int i=0; i<3; i++) {
|
for (int i=0; i<3; i++) {
|
||||||
chan[i]=DivPlatformC64::Channel();
|
chan[i]=DivPlatformC64::Channel();
|
||||||
chan[i].std.setEngine(parent);
|
chan[i].std.setEngine(parent);
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#define _C64_H
|
#define _C64_H
|
||||||
|
|
||||||
#include "../dispatch.h"
|
#include "../dispatch.h"
|
||||||
|
#include <queue>
|
||||||
#include "../macroInt.h"
|
#include "../macroInt.h"
|
||||||
#include "sound/c64/sid.h"
|
#include "sound/c64/sid.h"
|
||||||
#include "sound/c64_fp/SID.h"
|
#include "sound/c64_fp/SID.h"
|
||||||
|
@ -73,6 +74,12 @@ class DivPlatformC64: public DivDispatch {
|
||||||
Channel chan[3];
|
Channel chan[3];
|
||||||
DivDispatchOscBuffer* oscBuf[3];
|
DivDispatchOscBuffer* oscBuf[3];
|
||||||
bool isMuted[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 filtControl, filtRes, vol;
|
||||||
unsigned char writeOscBuf;
|
unsigned char writeOscBuf;
|
||||||
|
|
Loading…
Reference in New Issue