C64: Manage memory for Cartridge, Write protect on media.
This commit is contained in:
parent
f4f45f73a8
commit
b0e4e18ebc
|
@ -10,98 +10,100 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge
|
||||||
{
|
{
|
||||||
public static CartridgeDevice Load(byte[] crtFile)
|
public static CartridgeDevice Load(byte[] crtFile)
|
||||||
{
|
{
|
||||||
var mem = new MemoryStream(crtFile);
|
using (var mem = new MemoryStream(crtFile))
|
||||||
var reader = new BinaryReader(mem);
|
|
||||||
|
|
||||||
if (new string(reader.ReadChars(16)) != "C64 CARTRIDGE ")
|
|
||||||
{
|
{
|
||||||
return null;
|
var reader = new BinaryReader(mem);
|
||||||
}
|
|
||||||
|
|
||||||
var chipAddress = new List<int>();
|
if (new string(reader.ReadChars(16)) != "C64 CARTRIDGE ")
|
||||||
var chipBank = new List<int>();
|
{
|
||||||
var chipData = new List<int[]>();
|
return null;
|
||||||
var chipType = new List<int>();
|
}
|
||||||
|
|
||||||
var headerLength = ReadCRTInt(reader);
|
var chipAddress = new List<int>();
|
||||||
var version = ReadCRTShort(reader);
|
var chipBank = new List<int>();
|
||||||
var mapper = ReadCRTShort(reader);
|
var chipData = new List<int[]>();
|
||||||
var exrom = reader.ReadByte() != 0;
|
var chipType = new List<int>();
|
||||||
var game = reader.ReadByte() != 0;
|
|
||||||
|
|
||||||
// reserved
|
var headerLength = ReadCRTInt(reader);
|
||||||
reader.ReadBytes(6);
|
var version = ReadCRTShort(reader);
|
||||||
|
var mapper = ReadCRTShort(reader);
|
||||||
|
var exrom = reader.ReadByte() != 0;
|
||||||
|
var game = reader.ReadByte() != 0;
|
||||||
|
|
||||||
// cartridge name
|
// reserved
|
||||||
reader.ReadBytes(0x20);
|
reader.ReadBytes(6);
|
||||||
|
|
||||||
// skip extra header bytes
|
// cartridge name
|
||||||
if (headerLength > 0x40)
|
reader.ReadBytes(0x20);
|
||||||
{
|
|
||||||
reader.ReadBytes(headerLength - 0x40);
|
|
||||||
}
|
|
||||||
|
|
||||||
// read chips
|
// skip extra header bytes
|
||||||
while (reader.PeekChar() >= 0)
|
if (headerLength > 0x40)
|
||||||
{
|
{
|
||||||
if (new string(reader.ReadChars(4)) != "CHIP")
|
reader.ReadBytes(headerLength - 0x40);
|
||||||
{
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
var chipLength = ReadCRTInt(reader);
|
// read chips
|
||||||
chipType.Add(ReadCRTShort(reader));
|
while (reader.PeekChar() >= 0)
|
||||||
chipBank.Add(ReadCRTShort(reader));
|
{
|
||||||
chipAddress.Add(ReadCRTShort(reader));
|
if (new string(reader.ReadChars(4)) != "CHIP")
|
||||||
var chipDataLength = ReadCRTShort(reader);
|
{
|
||||||
chipData.Add(reader.ReadBytes(chipDataLength).Select(x => (int)x).ToArray());
|
break;
|
||||||
chipLength -= chipDataLength + 0x10;
|
}
|
||||||
if (chipLength > 0)
|
|
||||||
reader.ReadBytes(chipLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chipData.Count <= 0)
|
var chipLength = ReadCRTInt(reader);
|
||||||
{
|
chipType.Add(ReadCRTShort(reader));
|
||||||
return null;
|
chipBank.Add(ReadCRTShort(reader));
|
||||||
}
|
chipAddress.Add(ReadCRTShort(reader));
|
||||||
|
var chipDataLength = ReadCRTShort(reader);
|
||||||
|
chipData.Add(reader.ReadBytes(chipDataLength).Select(x => (int)x).ToArray());
|
||||||
|
chipLength -= chipDataLength + 0x10;
|
||||||
|
if (chipLength > 0)
|
||||||
|
reader.ReadBytes(chipLength);
|
||||||
|
}
|
||||||
|
|
||||||
CartridgeDevice result;
|
if (chipData.Count <= 0)
|
||||||
switch (mapper)
|
{
|
||||||
{
|
return null;
|
||||||
case 0x0000:
|
}
|
||||||
result = new Mapper0000(chipAddress, chipData, game, exrom);
|
|
||||||
break;
|
|
||||||
case 0x0005:
|
|
||||||
result = new Mapper0005(chipAddress, chipBank, chipData);
|
|
||||||
break;
|
|
||||||
case 0x000A:
|
|
||||||
result = new Mapper000A(chipAddress, chipBank, chipData);
|
|
||||||
break;
|
|
||||||
case 0x000B:
|
|
||||||
result = new Mapper000B(chipAddress, chipData);
|
|
||||||
break;
|
|
||||||
case 0x000F:
|
|
||||||
result = new Mapper000F(chipAddress, chipBank, chipData);
|
|
||||||
break;
|
|
||||||
case 0x0011:
|
|
||||||
result = new Mapper0011(chipAddress, chipBank, chipData);
|
|
||||||
break;
|
|
||||||
case 0x0012:
|
|
||||||
result = new Mapper0012(chipAddress, chipBank, chipData);
|
|
||||||
break;
|
|
||||||
case 0x0013:
|
|
||||||
result = new Mapper0013(chipAddress, chipBank, chipData);
|
|
||||||
break;
|
|
||||||
case 0x0020:
|
|
||||||
result = new Mapper0020(chipAddress, chipBank, chipData);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new Exception("This cartridge file uses an unrecognized mapper: " + mapper);
|
|
||||||
}
|
|
||||||
result.HardReset();
|
|
||||||
|
|
||||||
return result;
|
CartridgeDevice result;
|
||||||
}
|
switch (mapper)
|
||||||
|
{
|
||||||
|
case 0x0000:
|
||||||
|
result = new Mapper0000(chipAddress, chipData, game, exrom);
|
||||||
|
break;
|
||||||
|
case 0x0005:
|
||||||
|
result = new Mapper0005(chipAddress, chipBank, chipData);
|
||||||
|
break;
|
||||||
|
case 0x000A:
|
||||||
|
result = new Mapper000A(chipAddress, chipBank, chipData);
|
||||||
|
break;
|
||||||
|
case 0x000B:
|
||||||
|
result = new Mapper000B(chipAddress, chipData);
|
||||||
|
break;
|
||||||
|
case 0x000F:
|
||||||
|
result = new Mapper000F(chipAddress, chipBank, chipData);
|
||||||
|
break;
|
||||||
|
case 0x0011:
|
||||||
|
result = new Mapper0011(chipAddress, chipBank, chipData);
|
||||||
|
break;
|
||||||
|
case 0x0012:
|
||||||
|
result = new Mapper0012(chipAddress, chipBank, chipData);
|
||||||
|
break;
|
||||||
|
case 0x0013:
|
||||||
|
result = new Mapper0013(chipAddress, chipBank, chipData);
|
||||||
|
break;
|
||||||
|
case 0x0020:
|
||||||
|
result = new Mapper0020(chipAddress, chipBank, chipData);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Exception("This cartridge file uses an unrecognized mapper: " + mapper);
|
||||||
|
}
|
||||||
|
result.HardReset();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static int ReadCRTShort(BinaryReader reader)
|
private static int ReadCRTShort(BinaryReader reader)
|
||||||
{
|
{
|
||||||
|
|
|
@ -13,12 +13,14 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Media
|
||||||
[SaveState.DoNotSave] private int[][] _tracks;
|
[SaveState.DoNotSave] private int[][] _tracks;
|
||||||
[SaveState.DoNotSave] private readonly int[] _originalMedia;
|
[SaveState.DoNotSave] private readonly int[] _originalMedia;
|
||||||
[SaveState.DoNotSave] public bool Valid;
|
[SaveState.DoNotSave] public bool Valid;
|
||||||
|
[SaveState.SaveWithName("DiskIsWriteProtected")] public bool WriteProtected;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a blank, unformatted disk.
|
/// Create a blank, unformatted disk.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Disk(int trackCapacity)
|
public Disk(int trackCapacity)
|
||||||
{
|
{
|
||||||
|
WriteProtected = false;
|
||||||
_tracks = new int[trackCapacity][];
|
_tracks = new int[trackCapacity][];
|
||||||
FillMissingTracks();
|
FillMissingTracks();
|
||||||
_originalMedia = SerializeTracks(_tracks);
|
_originalMedia = SerializeTracks(_tracks);
|
||||||
|
@ -35,6 +37,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Media
|
||||||
/// <param name="trackCapacity">Total number of tracks on the media.</param>
|
/// <param name="trackCapacity">Total number of tracks on the media.</param>
|
||||||
public Disk(IList<byte[]> trackData, IList<int> trackNumbers, IList<int> trackDensities, IList<int> trackLengths, int trackCapacity)
|
public Disk(IList<byte[]> trackData, IList<int> trackNumbers, IList<int> trackDensities, IList<int> trackLengths, int trackCapacity)
|
||||||
{
|
{
|
||||||
|
WriteProtected = true;
|
||||||
_tracks = new int[trackCapacity][];
|
_tracks = new int[trackCapacity][];
|
||||||
for (var i = 0; i < trackData.Count; i++)
|
for (var i = 0; i < trackData.Count; i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -177,6 +177,8 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Serial
|
||||||
public void RemoveMedia()
|
public void RemoveMedia()
|
||||||
{
|
{
|
||||||
_disk = null;
|
_disk = null;
|
||||||
|
_trackImageData = null;
|
||||||
|
_diskBits = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue