mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
sn76496: simplify writes
This commit is contained in:
parent
4f2cdbf551
commit
5103774f6d
1 changed files with 39 additions and 81 deletions
|
@ -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,25 +109,20 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
WRITE8_HANDLER( SN76496_0_w ) { SN76496Write(0,data); }
|
WRITE8_HANDLER( SN76496_0_w ) { SN76496Write(0,data); }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue