BizHawk/BizHawk.Emulation.Cores/Computers/Commodore64/Media/G64.cs

63 lines
1.8 KiB
C#
Raw Normal View History

2016-02-22 23:50:11 +00:00
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
2012-11-14 01:50:17 +00:00
2016-02-22 23:50:11 +00:00
namespace BizHawk.Emulation.Cores.Computers.Commodore64.Media
2012-11-14 01:50:17 +00:00
{
public static class G64
{
public static Disk Read(byte[] source)
{
2016-02-22 23:50:11 +00:00
var mem = new MemoryStream(source);
var reader = new BinaryReader(mem);
var id = new string(reader.ReadChars(8));
var trackDatas = new List<byte[]>();
var trackLengths = new List<int>();
var trackNumbers = new List<int>();
var trackDensities = new List<int>();
if (id == @"GCR-1541")
2012-11-14 01:50:17 +00:00
{
reader.ReadByte(); //version
2016-02-22 23:50:11 +00:00
int trackCount = reader.ReadByte();
2012-11-14 01:50:17 +00:00
reader.ReadInt16(); //max track size in bytes
2016-02-22 23:50:11 +00:00
var trackOffsetTable = new int[trackCount];
var trackSpeedTable = new int[trackCount];
for (var i = 0; i < trackCount; i++)
2012-11-14 01:50:17 +00:00
trackOffsetTable[i] = reader.ReadInt32();
2016-02-22 23:50:11 +00:00
for (var i = 0; i < trackCount; i++)
2012-11-14 01:50:17 +00:00
trackSpeedTable[i] = reader.ReadInt32();
2016-02-22 23:50:11 +00:00
for (var i = 0; i < trackCount; i++)
2012-11-14 01:50:17 +00:00
{
if (trackOffsetTable[i] > 0)
{
mem.Position = trackOffsetTable[i];
2016-02-22 23:50:11 +00:00
int trackLength = reader.ReadInt16();
var trackData = reader.ReadBytes(trackLength);
trackDatas.Add(trackData);
trackLengths.Add(trackLength * 8);
trackDensities.Add(trackSpeedTable[i]);
trackNumbers.Add(i);
2012-11-14 01:50:17 +00:00
}
}
2016-02-22 23:50:11 +00:00
if (trackSpeedTable.Any(ts => ts > 3 || ts < 0))
{
throw new Exception("Byte-level speeds are not yet supported in the G64 loader.");
}
2012-11-14 01:50:17 +00:00
2016-02-22 23:50:11 +00:00
return new Disk(trackDatas, trackNumbers, trackDensities, trackLengths, 84);
}
return new Disk(84);
2012-11-14 01:50:17 +00:00
}
2016-02-22 23:50:11 +00:00
}
2012-11-14 01:50:17 +00:00
}