add new subchannel interleaving code and fix errors in CCD subcode loading

This commit is contained in:
zeromus 2015-06-23 19:37:22 -05:00
parent 87ff7f9a71
commit f2def57b90
2 changed files with 32 additions and 4 deletions

View File

@ -457,12 +457,12 @@ namespace BizHawk.Emulation.DiscSystem
if ((job.Parts & (ESectorSynthPart.SubcodeAny)) != 0)
{
ofs = job.LBA * 96;
imgBlob.Read(ofs, job.DestBuffer2448, 2352, 96);
subBlob.Read(ofs, job.DestBuffer2448, 2352, 96);
//we may still need to deinterleave it
if ((job.Parts & (ESectorSynthPart.SubcodeDeinterleave)) != 0)
//sub data comes to us deinterleved; we may still need to interleave it
if ((job.Parts & (ESectorSynthPart.SubcodeDeinterleave)) == 0)
{
SubcodeUtils.DeinterleaveInplace(job.DestBuffer2448, 2352);
SubcodeUtils.InterleaveInplace(job.DestBuffer2448, 2352);
}
}
}

View File

@ -72,6 +72,34 @@ namespace BizHawk.Emulation.DiscSystem
}
}
/// <summary>
/// Converts the useful (but unrealistic) deinterleaved data into the useless (but realistic) interleaved subchannel format.
/// </summary>
public unsafe static void InterleaveInplace(byte[] buf, int buf_index)
{
byte* out_buf = stackalloc byte[96];
for (int i = 0; i < 96; i++)
out_buf[i] = 0;
for (int d = 0; d < 12; d++)
{
for (int bitpoodle = 0; bitpoodle < 8; bitpoodle++)
{
int rawb = 0;
for (int ch = 0; ch < 8; ch++)
{
rawb |= ((buf[ch * 12 + d + buf_index] >> (7 - bitpoodle)) & 1) << (7 - ch);
}
out_buf[(d << 3) + bitpoodle] = (byte)rawb;
}
}
for (int i = 0; i < 96; i++)
buf[i + buf_index] = out_buf[i];
}
/// <summary>
/// Converts the useless (but realistic) interleaved subchannel data into a useful (but unrealistic) deinterleaved format.
/// </summary>