SM8521: acquireDirect()

This commit is contained in:
tildearrow 2025-03-09 03:58:09 -05:00
parent 1c05bb8b05
commit d1234ad59e
3 changed files with 33 additions and 38 deletions

View file

@ -719,11 +719,6 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do
break; break;
case DIV_SYSTEM_SM8521: case DIV_SYSTEM_SM8521:
dispatch=new DivPlatformSM8521; dispatch=new DivPlatformSM8521;
if (isRender) {
((DivPlatformSM8521*)dispatch)->setCoreQuality(eng->getConfInt("smQualityRender",3));
} else {
((DivPlatformSM8521*)dispatch)->setCoreQuality(eng->getConfInt("smQuality",3));
}
break; break;
case DIV_SYSTEM_PV1000: case DIV_SYSTEM_PV1000:
dispatch=new DivPlatformPV1000; dispatch=new DivPlatformPV1000;

View file

@ -47,7 +47,7 @@ const char** DivPlatformSM8521::getRegisterSheet() {
return regCheatSheetSM8521; return regCheatSheetSM8521;
} }
void DivPlatformSM8521::acquire(short** buf, size_t len) { void DivPlatformSM8521::acquireDirect(blip_buffer_t** bb, size_t len) {
while (!writes.empty()) { while (!writes.empty()) {
QueuedWrite w=writes.front(); QueuedWrite w=writes.front();
sm8521_write(&sm8521,w.addr,w.val); sm8521_write(&sm8521,w.addr,w.val);
@ -60,8 +60,29 @@ void DivPlatformSM8521::acquire(short** buf, size_t len) {
} }
for (size_t h=0; h<len; h++) { for (size_t h=0; h<len; h++) {
sm8521_sound_tick(&sm8521,coreQuality); int advance=len-h;
buf[0][h]=sm8521.out<<6; if (sm8521.sgc&1) {
const int remain=(sm8521.sg[0].base.t+1)-sm8521.sg[0].base.counter;
if (remain<advance) advance=remain;
}
if (sm8521.sgc&2) {
const int remain=(sm8521.sg[1].base.t+1)-sm8521.sg[1].base.counter;
if (remain<advance) advance=remain;
}
if (sm8521.sgc&4) {
const int remain=(sm8521.noise.base.t+1)-sm8521.noise.base.counter;
if (remain<advance) advance=remain;
}
if (advance<1) advance=1;
sm8521_sound_tick(&sm8521,advance);
h+=advance-1;
int out=sm8521.out<<6;
if (out!=lastOut) {
blip_add_delta(bb[0],h,out-lastOut);
lastOut=out;
}
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
oscBuf[i]->putSample(h,sm8521.sg[i].base.out<<7); oscBuf[i]->putSample(h,sm8521.sg[i].base.out<<7);
} }
@ -346,6 +367,7 @@ void DivPlatformSM8521::reset() {
addWrite(0xffffffff,0); addWrite(0xffffffff,0);
} }
sm8521_reset(&sm8521); sm8521_reset(&sm8521);
lastOut=0;
rWrite(0x40,0x80); // initialize SGC rWrite(0x40,0x80); // initialize SGC
} }
@ -357,6 +379,10 @@ bool DivPlatformSM8521::keyOffAffectsArp(int ch) {
return true; return true;
} }
bool DivPlatformSM8521::hasAcquireDirect() {
return true;
}
void DivPlatformSM8521::notifyWaveChange(int wave) { void DivPlatformSM8521::notifyWaveChange(int wave) {
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
if (chan[i].wave==wave) { if (chan[i].wave==wave) {
@ -376,7 +402,7 @@ void DivPlatformSM8521::setFlags(const DivConfig& flags) {
chipClock=11059200; chipClock=11059200;
CHECK_CUSTOM_CLOCK; CHECK_CUSTOM_CLOCK;
antiClickEnabled=!flags.getBool("noAntiClick",false); antiClickEnabled=!flags.getBool("noAntiClick",false);
rate=chipClock/4/coreQuality; // CKIN -> fCLK(/2) -> Function blocks (/2) rate=chipClock/4; // CKIN -> fCLK(/2) -> Function blocks (/2)
for (int i=0; i<3; i++) { for (int i=0; i<3; i++) {
oscBuf[i]->setRate(rate); oscBuf[i]->setRate(rate);
} }
@ -390,32 +416,6 @@ void DivPlatformSM8521::poke(std::vector<DivRegWrite>& wlist) {
for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); for (DivRegWrite& i: wlist) rWrite(i.addr,i.val);
} }
void DivPlatformSM8521::setCoreQuality(unsigned char q) {
switch (q) {
case 0:
coreQuality=64;
break;
case 1:
coreQuality=32;
break;
case 2:
coreQuality=16;
break;
case 3:
coreQuality=8;
break;
case 4:
coreQuality=4;
break;
case 5:
coreQuality=1;
break;
default:
coreQuality=8;
break;
}
}
int DivPlatformSM8521::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { int DivPlatformSM8521::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) {
parent=p; parent=p;
dumpWrites=false; dumpWrites=false;

View file

@ -54,14 +54,14 @@ class DivPlatformSM8521: public DivDispatch {
FixedQueue<QueuedWrite,128> writes; FixedQueue<QueuedWrite,128> writes;
bool antiClickEnabled; bool antiClickEnabled;
int coreQuality; int coreQuality, lastOut;
struct sm8521_t sm8521; struct sm8521_t sm8521;
unsigned char regPool[256]; unsigned char regPool[256];
void updateWave(int ch); void updateWave(int ch);
friend void putDispatchChip(void*,int); friend void putDispatchChip(void*,int);
friend void putDispatchChan(void*,int,int); friend void putDispatchChan(void*,int,int);
public: public:
void acquire(short** buf, size_t len); void acquireDirect(blip_buffer_t** bb, size_t len);
int dispatch(DivCommand c); int dispatch(DivCommand c);
void* getChanState(int chan); void* getChanState(int chan);
DivMacroInt* getChanMacroInt(int ch); DivMacroInt* getChanMacroInt(int ch);
@ -74,13 +74,13 @@ class DivPlatformSM8521: public DivDispatch {
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
int getOutputCount(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
bool hasAcquireDirect();
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
void notifyWaveChange(int wave); void notifyWaveChange(int wave);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);
void poke(unsigned int addr, unsigned short val); void poke(unsigned int addr, unsigned short val);
void poke(std::vector<DivRegWrite>& wlist); void poke(std::vector<DivRegWrite>& wlist);
const char** getRegisterSheet(); const char** getRegisterSheet();
void setCoreQuality(unsigned char q);
int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags);
void quit(); void quit();
~DivPlatformSM8521(); ~DivPlatformSM8521();