SoundUnit: add 64K chip revision

This commit is contained in:
tildearrow 2022-08-03 00:05:58 -05:00
parent 1f57d09fbf
commit 0d4f20b7a6
5 changed files with 37 additions and 15 deletions

View File

@ -54,7 +54,7 @@ void SoundUnit::NextSample(short* l, short* r) {
chan[i].pcmpos=chan[i].pcmrst; chan[i].pcmpos=chan[i].pcmrst;
} }
} }
chan[i].pcmpos&=(SOUNDCHIP_PCM_SIZE-1); chan[i].pcmpos&=(pcmSize-1);
} else if (chan[i].flags.pcmloop) { } else if (chan[i].flags.pcmloop) {
chan[i].pcmpos=chan[i].pcmrst; chan[i].pcmpos=chan[i].pcmrst;
} }
@ -228,9 +228,10 @@ void SoundUnit::NextSample(short* l, short* r) {
*r=minval(32767,maxval(-32767,tnsR)); *r=minval(32767,maxval(-32767,tnsR));
} }
void SoundUnit::Init() { void SoundUnit::Init(int sampleMemSize) {
pcmSize=sampleMemSize;
Reset(); Reset();
memset(pcm,0,SOUNDCHIP_PCM_SIZE); memset(pcm,0,pcmSize);
for (int i=0; i<256; i++) { for (int i=0; i<256; i++) {
SCsine[i]=sin((i/128.0f)*M_PI)*127; SCsine[i]=sin((i/128.0f)*M_PI)*127;
SCtriangle[i]=(i>127)?(255-i):(i); SCtriangle[i]=(i>127)?(255-i):(i);
@ -242,9 +243,6 @@ void SoundUnit::Init() {
SCpantabR[128+i]=i-1; SCpantabR[128+i]=i-1;
} }
SCpantabR[128]=0; SCpantabR[128]=0;
for (int i=0; i<8; i++) {
muted[i]=false;
}
} }
void SoundUnit::Reset() { void SoundUnit::Reset() {
@ -282,6 +280,8 @@ void SoundUnit::Write(unsigned char addr, unsigned char data) {
} }
SoundUnit::SoundUnit() { SoundUnit::SoundUnit() {
Init(); Init(65536); // default
memset(pcm,0,SOUNDCHIP_PCM_SIZE); for (int i=0; i<8; i++) {
muted[i]=false;
}
} }

View File

@ -3,8 +3,6 @@
#include <math.h> #include <math.h>
#include <assert.h> #include <assert.h>
#define SOUNDCHIP_PCM_SIZE 8192
class SoundUnit { class SoundUnit {
signed char SCsine[256]; signed char SCsine[256];
signed char SCtriangle[256]; signed char SCtriangle[256];
@ -24,6 +22,7 @@ class SoundUnit {
int tnsL, tnsR; int tnsL, tnsR;
unsigned short oldfreq[8]; unsigned short oldfreq[8];
unsigned short oldflags[8]; unsigned short oldflags[8];
unsigned int pcmSize;
public: public:
unsigned short resetfreq[8]; unsigned short resetfreq[8];
unsigned short voldcycles[8]; unsigned short voldcycles[8];
@ -84,7 +83,7 @@ class SoundUnit {
unsigned short wc; unsigned short wc;
unsigned short restimer; unsigned short restimer;
} chan[8]; } chan[8];
signed char pcm[SOUNDCHIP_PCM_SIZE]; signed char pcm[65536];
bool muted[8]; bool muted[8];
void Write(unsigned char addr, unsigned char data); void Write(unsigned char addr, unsigned char data);
void NextSample(short* l, short* r); void NextSample(short* l, short* r);
@ -94,7 +93,7 @@ class SoundUnit {
if (ret>32767) ret=32767; if (ret>32767) ret=32767;
return ret; return ret;
} }
void Init(); void Init(int sampleMemSize=8192);
void Reset(); void Reset();
SoundUnit(); SoundUnit();
}; };

View File

@ -555,6 +555,11 @@ void DivPlatformSoundUnit::setFlags(unsigned int flags) {
for (int i=0; i<8; i++) { for (int i=0; i<8; i++) {
oscBuf[i]->rate=rate; oscBuf[i]->rate=rate;
} }
sampleMemSize=flags&16;
su->Init(sampleMemSize?65536:8192);
renderSamples();
} }
void DivPlatformSoundUnit::poke(unsigned int addr, unsigned short val) { void DivPlatformSoundUnit::poke(unsigned int addr, unsigned short val) {
@ -570,7 +575,7 @@ const void* DivPlatformSoundUnit::getSampleMem(int index) {
} }
size_t DivPlatformSoundUnit::getSampleMemCapacity(int index) { size_t DivPlatformSoundUnit::getSampleMemCapacity(int index) {
return (index==0)?8192:0; return (index==0)?(sampleMemSize?65536:8192):0;
} }
size_t DivPlatformSoundUnit::getSampleMemUsage(int index) { size_t DivPlatformSoundUnit::getSampleMemUsage(int index) {
@ -583,6 +588,7 @@ void DivPlatformSoundUnit::renderSamples() {
size_t memPos=0; size_t memPos=0;
for (int i=0; i<parent->song.sampleLen; i++) { for (int i=0; i<parent->song.sampleLen; i++) {
DivSample* s=parent->song.sample[i]; DivSample* s=parent->song.sample[i];
if (s->data8==NULL) continue;
int paddedLen=s->samples; int paddedLen=s->samples;
if (memPos>=getSampleMemCapacity(0)) { if (memPos>=getSampleMemCapacity(0)) {
logW("out of PCM memory for sample %d!",i); logW("out of PCM memory for sample %d!",i);
@ -609,9 +615,8 @@ int DivPlatformSoundUnit::init(DivEngine* p, int channels, int sugRate, unsigned
isMuted[i]=false; isMuted[i]=false;
oscBuf[i]=new DivDispatchOscBuffer; oscBuf[i]=new DivDispatchOscBuffer;
} }
setFlags(flags);
su=new SoundUnit(); su=new SoundUnit();
su->Init(); setFlags(flags);
reset(); reset();
return 6; return 6;
} }

View File

@ -96,6 +96,7 @@ class DivPlatformSoundUnit: public DivDispatch {
}; };
std::queue<QueuedWrite> writes; std::queue<QueuedWrite> writes;
unsigned char lastPan; unsigned char lastPan;
bool sampleMemSize;
int cycles, curChan, delay; int cycles, curChan, delay;
short tempL; short tempL;

View File

@ -120,6 +120,23 @@ void FurnaceGUI::drawSysConf(int chan, DivSystem type, unsigned int& flags, bool
} }
break; break;
} }
case DIV_SYSTEM_SOUND_UNIT: {
ImGui::Text("CPU rate:");
if (ImGui::RadioButton("6.18MHz (NTSC)",(flags&15)==0)) {
copyOfFlags=(flags&(~15))|0;
}
if (ImGui::RadioButton("5.95MHz (PAL)",(flags&15)==1)) {
copyOfFlags=(flags&(~15))|1;
}
ImGui::Text("Chip revision (sample memory):");
if (ImGui::RadioButton("A/B/E (8K)",(flags&16)==0)) {
copyOfFlags=(flags&(~16))|0;
}
if (ImGui::RadioButton("D/F (64K)",(flags&16)==16)) {
copyOfFlags=(flags&(~16))|16;
}
break;
}
case DIV_SYSTEM_GB: { case DIV_SYSTEM_GB: {
bool antiClick=flags&8; bool antiClick=flags&8;
if (ImGui::Checkbox("Disable anti-click",&antiClick)) { if (ImGui::Checkbox("Disable anti-click",&antiClick)) {