This commit is contained in:
cam900 2022-12-12 14:42:56 +09:00
commit 84990c759e
15 changed files with 520 additions and 89 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;

View file

@ -160,7 +160,7 @@ void DivPlatformSMS::tick(bool sysTick) {
if (!chan[i].inPorta) {
// TODO: add compatibility flag. this is horrible.
int areYouSerious=parent->calcArp(chan[i].note,chan[i].std.arp.val);
while (areYouSerious>0x60) areYouSerious-=12;
if (!easyNoise) while (areYouSerious>0x60) areYouSerious-=12;
chan[i].baseFreq=NOTE_SN(i,areYouSerious);
chan[i].actualNote=areYouSerious;
chan[i].freqChanged=true;