AY8930: finally implement auto noise freq
This commit is contained in:
parent
c2565b1300
commit
f64adfa8dd
|
@ -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);
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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}},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue