diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2020-11-30 17:33:25 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2020-11-30 17:33:25 +0300 |
commit | eb10ea5213b4362d9cc859593a89adab05237765 (patch) | |
tree | fde607aad441c723b1b4c6ebb8df0017e0c1cc4e /FdsDiskSide.cs | |
parent | 93445c376eaf4bebf3e6f36bbe35d6337c17c76d (diff) |
Much more FDS stuff
Diffstat (limited to 'FdsDiskSide.cs')
-rw-r--r-- | FdsDiskSide.cs | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/FdsDiskSide.cs b/FdsDiskSide.cs index 11f16d3..4d1af1f 100644 --- a/FdsDiskSide.cs +++ b/FdsDiskSide.cs @@ -9,12 +9,15 @@ namespace com.clusterrr.Famicom.Containers public class FdsDiskSide
{
FdsBlockDiskInfo diskInfoBlock;
-
+ /// <summary>
+ /// Disk info block
+ /// </summary>
+ public FdsBlockDiskInfo DiskInfoBlock { get => diskInfoBlock; }
public string DiskVerification { get => diskInfoBlock.DiskVerification; }
/// <summary>
/// Manufacturer code. $00 = Unlicensed, $01 = Nintendo
/// </summary>
- public byte ManufacturerCode { get => diskInfoBlock.ManufacturerCode; set => diskInfoBlock.ManufacturerCode = value; }
+ public FdsBlockDiskInfo.Manufacturer ManufacturerCode { get => diskInfoBlock.ManufacturerCode; set => diskInfoBlock.ManufacturerCode = value; }
/// <summary>
/// 3-letter ASCII code per game (e.g. ZEL for The Legend of Zelda)
/// </summary>
@@ -125,15 +128,23 @@ namespace com.clusterrr.Famicom.Containers pos += 2;
while (pos < data.Length)
{
- var fileHeaderBlock = FdsBlockFileHeader.FromBytes(data.Skip(pos).Take(16).ToArray());
- if (!fileHeaderBlock.IsValid)
- break;
- pos += 16;
- var fileDataBlock = FdsBlockFileData.FromBytes(data.Skip(pos).Take(fileHeaderBlock.FileSize + 1).ToArray());
- if (!fileDataBlock.IsValid)
+ try
+ {
+ var fileHeaderBlock = FdsBlockFileHeader.FromBytes(data.Skip(pos).Take(16).ToArray());
+ if (!fileHeaderBlock.IsValid)
+ break;
+ pos += 16;
+ var fileDataBlock = FdsBlockFileData.FromBytes(data.Skip(pos).Take(fileHeaderBlock.FileSize + 1).ToArray());
+ if (!fileDataBlock.IsValid)
+ break;
+ pos += fileHeaderBlock.FileSize + 1;
+ files.Add(new FdsDiskFile(fileHeaderBlock, fileDataBlock));
+ }
+ catch
+ {
+ // just break on out of range
break;
- pos += fileHeaderBlock.FileSize + 1;
- files.Add(new FdsDiskFile(fileHeaderBlock, fileDataBlock));
+ }
}
}
@@ -143,6 +154,15 @@ namespace com.clusterrr.Famicom.Containers files[i].FileNumber = (byte)i;
}
+ public IEnumerable<IFdsBlock> GetBlocks()
+ {
+ var blocks = new List<IFdsBlock>();
+ blocks.Add(diskInfoBlock);
+ blocks.Add(fileAmountBlock);
+ blocks.AddRange(files.SelectMany(f => new IFdsBlock[] { f.HeaderBlock, f.DataBlock }));
+ return blocks;
+ }
+
public static FdsDiskSide FromBytes(byte[] data)
{
return new FdsDiskSide(data);
|