diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/CartridgeDevice.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/CartridgeDevice.cs index 13c9d3dda6..2c7ef4fddc 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/CartridgeDevice.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/Cartridge/CartridgeDevice.cs @@ -10,98 +10,100 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Cartridge { public static CartridgeDevice Load(byte[] crtFile) { - var mem = new MemoryStream(crtFile); - var reader = new BinaryReader(mem); - - if (new string(reader.ReadChars(16)) != "C64 CARTRIDGE ") + using (var mem = new MemoryStream(crtFile)) { - return null; - } + var reader = new BinaryReader(mem); - var chipAddress = new List(); - var chipBank = new List(); - var chipData = new List(); - var chipType = new List(); + if (new string(reader.ReadChars(16)) != "C64 CARTRIDGE ") + { + return null; + } - var headerLength = ReadCRTInt(reader); - var version = ReadCRTShort(reader); - var mapper = ReadCRTShort(reader); - var exrom = reader.ReadByte() != 0; - var game = reader.ReadByte() != 0; + var chipAddress = new List(); + var chipBank = new List(); + var chipData = new List(); + var chipType = new List(); - // reserved - reader.ReadBytes(6); + var headerLength = ReadCRTInt(reader); + var version = ReadCRTShort(reader); + var mapper = ReadCRTShort(reader); + var exrom = reader.ReadByte() != 0; + var game = reader.ReadByte() != 0; - // cartridge name - reader.ReadBytes(0x20); + // reserved + reader.ReadBytes(6); - // skip extra header bytes - if (headerLength > 0x40) - { - reader.ReadBytes(headerLength - 0x40); - } + // cartridge name + reader.ReadBytes(0x20); - // read chips - while (reader.PeekChar() >= 0) - { - if (new string(reader.ReadChars(4)) != "CHIP") - { - break; - } + // skip extra header bytes + if (headerLength > 0x40) + { + reader.ReadBytes(headerLength - 0x40); + } - var chipLength = ReadCRTInt(reader); - chipType.Add(ReadCRTShort(reader)); - 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); - } + // read chips + while (reader.PeekChar() >= 0) + { + if (new string(reader.ReadChars(4)) != "CHIP") + { + break; + } - if (chipData.Count <= 0) - { - return null; - } + var chipLength = ReadCRTInt(reader); + chipType.Add(ReadCRTShort(reader)); + 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; - 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(); + if (chipData.Count <= 0) + { + return null; + } - 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) { diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/Media/Disk.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/Media/Disk.cs index 00175d06bb..189066f5ee 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/Media/Disk.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/Media/Disk.cs @@ -13,12 +13,14 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Media [SaveState.DoNotSave] private int[][] _tracks; [SaveState.DoNotSave] private readonly int[] _originalMedia; [SaveState.DoNotSave] public bool Valid; + [SaveState.SaveWithName("DiskIsWriteProtected")] public bool WriteProtected; /// /// Create a blank, unformatted disk. /// public Disk(int trackCapacity) - { + { + WriteProtected = false; _tracks = new int[trackCapacity][]; FillMissingTracks(); _originalMedia = SerializeTracks(_tracks); @@ -35,6 +37,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Media /// Total number of tracks on the media. public Disk(IList trackData, IList trackNumbers, IList trackDensities, IList trackLengths, int trackCapacity) { + WriteProtected = true; _tracks = new int[trackCapacity][]; for (var i = 0; i < trackData.Count; i++) { diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/Serial/Drive1541.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/Serial/Drive1541.cs index 2ce00085d4..c31635e03c 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/Serial/Drive1541.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/Serial/Drive1541.cs @@ -177,6 +177,8 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64.Serial public void RemoveMedia() { _disk = null; + _trackImageData = null; + _diskBits = 0; } } }