ym2612: more ports processed, DAC now plays in stereo

This commit is contained in:
beirich 2012-04-29 18:33:21 +00:00
parent 239cb213f0
commit 700ac116dd
4 changed files with 98 additions and 5 deletions

View File

@ -8,7 +8,8 @@ namespace BizHawk.Emulation.Sound
{
public readonly Operator[] Operators;
public int Frequency;
public int FrequencyNumber;
public int Block;
public int Feedback;
public int Algorithm;
@ -27,6 +28,43 @@ namespace BizHawk.Emulation.Sound
Operators[1] = new Operator();
Operators[2] = new Operator();
Operators[3] = new Operator();
LeftOutput = true; // Revenge of Shinobi does not output DAC if these arent initialized ??
RightOutput = true;
}
public void WriteFrequencyLow(byte value)
{
FrequencyNumber &= 0x700;
FrequencyNumber |= value;
// TODO maybe its 4-frequency mode
// TODO is this right, only reflect change when writing LSB?
Operators[0].FrequencyNumber = FrequencyNumber;
Operators[1].FrequencyNumber = FrequencyNumber;
Operators[2].FrequencyNumber = FrequencyNumber;
Operators[3].FrequencyNumber = FrequencyNumber;
}
public void WriteFrequencyHigh(byte value)
{
FrequencyNumber &= 0x0FF;
FrequencyNumber |= (value & 15) << 8;
Block = (value >> 3) & 7;
}
public void Write_Feedback_Algorithm(byte value)
{
Algorithm = value & 7;
Feedback = (value >> 3) & 7;
}
public void Write_Stereo_LfoSensitivy(byte value)
{
FMS_FrequencyModulationSensitivity = value & 3;
AMS_AmplitudeModulationSensitivity = (value >> 3) & 7;
RightOutput = (value & 0x40) != 0;
LeftOutput = (value & 0x80) != 0;
}
//----------------------

View File

@ -138,6 +138,8 @@ namespace BizHawk.Emulation.Sound
case 0x70: Channels[chan].Operators[oper].Write_SR(value); break;
case 0x80: Channels[chan].Operators[oper].Write_RR_SL(value); break;
case 0x90: Channels[chan].Operators[oper].Write_SSGEG(value); break;
case 0xA0:
case 0xB0: WriteHighBlockP1(register, value); break;
}
break;
@ -169,6 +171,52 @@ namespace BizHawk.Emulation.Sound
case 0x70: Channels[chan].Operators[oper].Write_SR(value); break;
case 0x80: Channels[chan].Operators[oper].Write_RR_SL(value); break;
case 0x90: Channels[chan].Operators[oper].Write_SSGEG(value); break;
case 0xA0:
case 0xB0: WriteHighBlockP2(register, value); break;
}
}
void WriteHighBlockP1(byte register, byte value)
{
switch (register)
{
case 0xA0: Channels[0].WriteFrequencyLow(value); break;
case 0xA1: Channels[1].WriteFrequencyLow(value); break;
case 0xA2: Channels[2].WriteFrequencyLow(value); break;
case 0xA4: Channels[0].WriteFrequencyHigh(value); break;
case 0xA5: Channels[1].WriteFrequencyHigh(value); break;
case 0xA6: Channels[2].WriteFrequencyHigh(value); break;
case 0xB0: Channels[0].Write_Feedback_Algorithm(value); break;
case 0xB1: Channels[1].Write_Feedback_Algorithm(value); break;
case 0xB2: Channels[2].Write_Feedback_Algorithm(value); break;
case 0xB4: Channels[0].Write_Stereo_LfoSensitivy(value); break;
case 0xB5: Channels[1].Write_Stereo_LfoSensitivy(value); break;
case 0xB6: Channels[2].Write_Stereo_LfoSensitivy(value); break;
}
}
void WriteHighBlockP2(byte register, byte value)
{
switch (register)
{
case 0xA0: Channels[3].WriteFrequencyLow(value); break;
case 0xA1: Channels[4].WriteFrequencyLow(value); break;
case 0xA2: Channels[5].WriteFrequencyLow(value); break;
case 0xA4: Channels[3].WriteFrequencyHigh(value); break;
case 0xA5: Channels[4].WriteFrequencyHigh(value); break;
case 0xA6: Channels[5].WriteFrequencyHigh(value); break;
case 0xB0: Channels[3].Write_Feedback_Algorithm(value); break;
case 0xB1: Channels[4].Write_Feedback_Algorithm(value); break;
case 0xB2: Channels[5].Write_Feedback_Algorithm(value); break;
case 0xB4: Channels[3].Write_Stereo_LfoSensitivy(value); break;
case 0xB5: Channels[4].Write_Stereo_LfoSensitivy(value); break;
case 0xB6: Channels[5].Write_Stereo_LfoSensitivy(value); break;
}
}

View File

@ -21,8 +21,9 @@ namespace BizHawk.Emulation.Sound
public bool AM_AmplitudeModulation;
public int Frequency;
public int FrequencyNumber;
public int Block;
// Internal State
public int PhaseCounter;
@ -65,6 +66,12 @@ namespace BizHawk.Emulation.Sound
{
SSG_EG = value & 15;
}
public void UpdateFrequency(int frequencyNumber, int block)
{
FrequencyNumber = frequencyNumber;
Block = block;
}
}
}
//TODO "the shape of the waves of the envelope changes in a exponential when attacking it, and it changes in the straight line at other rates."

View File

@ -73,8 +73,8 @@ namespace BizHawk.Emulation.Sound
if (DacEnable)
{
short dacValue = (short)(((DacValue-80) * channelVolume) / 80);
samples[pos] += dacValue;
samples[pos + 1] += dacValue;
if (Channels[5].LeftOutput) samples[pos] += dacValue;
if (Channels[5].RightOutput) samples[pos + 1] += dacValue;
}
pos += 2;
}