sn76496: simplify writes

This commit is contained in:
notaz 2017-09-30 18:14:20 +03:00
parent 4f2cdbf551
commit 5103774f6d

View file

@ -73,66 +73,29 @@ int *sn76496_regs;
void SN76496Write(int data) void SN76496Write(int data)
{ {
struct SN76496 *R = &ono_sn; struct SN76496 *R = &ono_sn;
int n; int n, r, c;
/* update the output buffer before changing the registers */ /* update the output buffer before changing the registers */
//stream_update(R->Channel,0); //stream_update(R->Channel,0);
r = R->LastRegister;
if (data & 0x80) if (data & 0x80)
{ r = R->LastRegister = (data & 0x70) >> 4;
int r = (data & 0x70) >> 4; c = r / 2;
int c = r/2;
R->LastRegister = r; if (!(data & 0x80) && (r == 0 || r == 2 || r == 4))
R->Register[r] = (R->Register[r] & 0x3f0) | (data & 0x0f); // data byte (tone only)
switch (r)
{
case 0: /* tone 0 : frequency */
case 2: /* tone 1 : frequency */
case 4: /* tone 2 : frequency */
R->Period[c] = R->UpdateStep * R->Register[r];
if (R->Period[c] == 0) R->Period[c] = R->UpdateStep;
if (r == 4)
{
/* update noise shift frequency */
if ((R->Register[6] & 0x03) == 0x03)
R->Period[3] = 2 * R->Period[2];
}
break;
case 1: /* tone 0 : volume */
case 3: /* tone 1 : volume */
case 5: /* tone 2 : volume */
case 7: /* noise : volume */
R->Volume[c] = R->VolTable[data & 0x0f];
break;
case 6: /* noise : frequency, mode */
{
int n = R->Register[6];
R->NoiseFB = (n & 4) ? FB_WNOISE : FB_PNOISE;
n &= 3;
/* N/512,N/1024,N/2048,Tone #3 output */
R->Period[3] = ((n&3) == 3) ? 2 * R->Period[2] : (R->UpdateStep << (5+(n&3)));
/* reset noise shifter */
R->RNG = NG_PRESET;
R->Output[3] = R->RNG & 1;
}
break;
}
}
else
{
int r = R->LastRegister;
int c = r/2;
switch (r)
{
case 0: /* tone 0 : frequency */
case 2: /* tone 1 : frequency */
case 4: /* tone 2 : frequency */
R->Register[r] = (R->Register[r] & 0x0f) | ((data & 0x3f) << 4); R->Register[r] = (R->Register[r] & 0x0f) | ((data & 0x3f) << 4);
R->Period[c] = R->UpdateStep * R->Register[r]; else
R->Register[r] = (R->Register[r] & 0x3f0) | (data & 0x0f);
data = R->Register[r];
switch (r)
{
case 0: /* tone 0 : frequency */
case 2: /* tone 1 : frequency */
case 4: /* tone 2 : frequency */
R->Period[c] = R->UpdateStep * data;
if (R->Period[c] == 0) R->Period[c] = R->UpdateStep; if (R->Period[c] == 0) R->Period[c] = R->UpdateStep;
if (r == 4) if (r == 4)
{ {
@ -146,24 +109,19 @@ void SN76496Write(int data)
case 5: /* tone 2 : volume */ case 5: /* tone 2 : volume */
case 7: /* noise : volume */ case 7: /* noise : volume */
R->Volume[c] = R->VolTable[data & 0x0f]; R->Volume[c] = R->VolTable[data & 0x0f];
R->Register[r] = (R->Register[r] & 0x3f0) | (data & 0x0f);
break; break;
case 6: /* noise : frequency, mode */ case 6: /* noise : frequency, mode */
{ n = data;
R->Register[r] = (R->Register[r] & 0x3f0) | (data & 0x0f);
n = R->Register[6];
R->NoiseFB = (n & 4) ? FB_WNOISE : FB_PNOISE; R->NoiseFB = (n & 4) ? FB_WNOISE : FB_PNOISE;
n &= 3; n &= 3;
/* N/512,N/1024,N/2048,Tone #3 output */ /* N/512,N/1024,N/2048,Tone #3 output */
R->Period[3] = ((n&3) == 3) ? 2 * R->Period[2] : (R->UpdateStep << (5+(n&3))); R->Period[3] = (n == 3) ? 2 * R->Period[2] : (R->UpdateStep << (5 + n));
/* reset noise shifter */ /* reset noise shifter */
R->RNG = NG_PRESET; R->RNG = NG_PRESET;
R->Output[3] = R->RNG & 1; R->Output[3] = R->RNG & 1;
}
break; break;
} }
}
} }
/* /*