AY8930: finally implement auto noise freq

This commit is contained in:
tildearrow 2024-05-07 02:31:22 -05:00
parent c2565b1300
commit f64adfa8dd
3 changed files with 35 additions and 3 deletions

View file

@ -362,6 +362,29 @@ void DivPlatformAY8930::tick(bool sysTick) {
immWrite(regPeriodL[i],chan[i].envelope.period); immWrite(regPeriodL[i],chan[i].envelope.period);
immWrite(regPeriodH[i],chan[i].envelope.period>>8); immWrite(regPeriodH[i],chan[i].envelope.period>>8);
} }
if (chan[i].freqChanged && chan[i].autoNoiseMode) {
int noiseFreq=chan[i].freq;
switch (chan[i].autoNoiseMode) {
case 1: // noise
noiseFreq+=chan[i].autoNoiseOff;
if (noiseFreq<0) noiseFreq=0;
if (noiseFreq>255) noiseFreq=255;
rWrite(0x06,noiseFreq);
break;
case 2: { // noise + OR mask
if (noiseFreq<0) noiseFreq=0;
int noiseDiv=(noiseFreq>>8)+1;
noiseFreq/=noiseDiv;
ayNoiseOr=noiseDiv;
immWrite(0x1a,ayNoiseOr);
noiseFreq+=chan[i].autoNoiseOff;
if (noiseFreq<0) noiseFreq=0;
if (noiseFreq>255) noiseFreq=255;
rWrite(0x06,noiseFreq);
break;
}
}
}
chan[i].freqChanged=false; chan[i].freqChanged=false;
} }
@ -632,6 +655,12 @@ int DivPlatformAY8930::dispatch(DivCommand c) {
chan[c.chan].autoEnvDen=c.value&15; chan[c.chan].autoEnvDen=c.value&15;
chan[c.chan].freqChanged=true; chan[c.chan].freqChanged=true;
break; break;
case DIV_CMD_AY_AUTO_PWM:
chan[c.chan].autoNoiseMode=c.value>>4;
chan[c.chan].autoNoiseOff=c.value&15;
if (chan[c.chan].autoNoiseOff>=8) chan[c.chan].autoNoiseOff-=16;
chan[c.chan].freqChanged=true;
break;
case DIV_CMD_AY_IO_WRITE: case DIV_CMD_AY_IO_WRITE:
if (c.value==255) { if (c.value==255) {
immWrite(0x1f,c.value2); immWrite(0x1f,c.value2);

View file

@ -77,8 +77,8 @@ class DivPlatformAY8930: public DivDispatch {
setPos(false) {} setPos(false) {}
} dac; } dac;
unsigned char autoEnvNum, autoEnvDen, duty; unsigned char autoEnvNum, autoEnvDen, duty, autoNoiseMode;
signed char konCycles; signed char konCycles, autoNoiseOff;
Channel(): Channel():
SharedChannel<int>(31), SharedChannel<int>(31),
envelope(Envelope()), envelope(Envelope()),
@ -88,7 +88,9 @@ class DivPlatformAY8930: public DivDispatch {
autoEnvNum(0), autoEnvNum(0),
autoEnvDen(0), autoEnvDen(0),
duty(4), duty(4),
konCycles(0) {} autoNoiseMode(0),
konCycles(0),
autoNoiseOff(0) {}
}; };
Channel chan[3]; Channel chan[3];
bool isMuted[3]; bool isMuted[3];

View file

@ -452,6 +452,7 @@ void DivEngine::registerSystems() {
[](unsigned char, unsigned char val) -> int { return 0x10+(val&15); }}}, [](unsigned char, unsigned char val) -> int { return 0x10+(val&15); }}},
{0x27, {DIV_CMD_AY_NOISE_MASK_AND, "27xx: Set noise AND mask"}}, {0x27, {DIV_CMD_AY_NOISE_MASK_AND, "27xx: Set noise AND mask"}},
{0x28, {DIV_CMD_AY_NOISE_MASK_OR, "28xx: Set noise OR mask"}}, {0x28, {DIV_CMD_AY_NOISE_MASK_OR, "28xx: Set noise OR mask"}},
{0x2c, {DIV_CMD_AY_AUTO_PWM, "2Cxy: Automatic noise frequency (x: mode (0: disable, 1: freq, 2: freq + OR mask); y: offset"}},
{0x2d, {DIV_CMD_AY_IO_WRITE, "2Dxx: NOT TO BE EMPLOYED BY THE COMPOSER", constVal<255>, effectVal}}, {0x2d, {DIV_CMD_AY_IO_WRITE, "2Dxx: NOT TO BE EMPLOYED BY THE COMPOSER", constVal<255>, effectVal}},
}; };