AY8930: finally implement auto noise freq
This commit is contained in:
parent
c2565b1300
commit
f64adfa8dd
3 changed files with 35 additions and 3 deletions
|
|
@ -362,6 +362,29 @@ void DivPlatformAY8930::tick(bool sysTick) {
|
|||
immWrite(regPeriodL[i],chan[i].envelope.period);
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
@ -632,6 +655,12 @@ int DivPlatformAY8930::dispatch(DivCommand c) {
|
|||
chan[c.chan].autoEnvDen=c.value&15;
|
||||
chan[c.chan].freqChanged=true;
|
||||
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:
|
||||
if (c.value==255) {
|
||||
immWrite(0x1f,c.value2);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue