C64: Manage memory for Cartridge, Write protect on media.

This commit is contained in:
Anthony Konzel 2016-03-04 16:15:01 -06:00
parent f4f45f73a8
commit b0e4e18ebc
3 changed files with 89 additions and 82 deletions

View File

@ -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)
{ {

View File

@ -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++)
{ {

View File

@ -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;
} }
} }
} }