some stuff, not ready yet

This commit is contained in:
goyuken 2015-02-19 03:16:33 +00:00
parent 18bb662017
commit 8bf7c960cf
2 changed files with 192 additions and 0 deletions

View File

@ -635,6 +635,7 @@
<Compile Include="Consoles\Nintendo\NES\BisqAPU.cs" />
<Compile Include="Consoles\Nintendo\NES\FDS\FDS.cs" />
<Compile Include="Consoles\Nintendo\NES\FDS\FDSAudio.cs" />
<Compile Include="Consoles\Nintendo\NES\FDS\FDSInspector.cs" />
<Compile Include="Consoles\Nintendo\NES\FDS\RamAdapter.cs" />
<Compile Include="Consoles\Nintendo\NES\INESPPUViewable.cs" />
<Compile Include="Consoles\Nintendo\NES\NES.BoardSystem.cs" />

View File

@ -0,0 +1,191 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace BizHawk.Emulation.Cores.Nintendo.NES
{
internal static class FTXT
{
public static readonly Encoding E = Encoding.GetEncoding("ISO-8859-1");
}
public class FDSFile
{
static byte[] Check = FTXT.E.GetBytes("FDS\x1a");
static byte[] CheckAlt = FTXT.E.GetBytes("\x01*NIN");
public List<FDSDisk> Disks = new List<FDSDisk>();
public byte[] ExtraData;
public FDSFile(BinaryReader r)
{
byte[] tmp = r.ReadBytes(4);
int numdisks;
if (tmp.SequenceEqual(Check))
{
numdisks = r.ReadByte();
ExtraData = r.ReadBytes(11);
}
else if (tmp.SequenceEqual(CheckAlt))
{
// compensate (won't write identically)
r.BaseStream.Seek(0, SeekOrigin.Begin);
numdisks = (int)(r.BaseStream.Length / 65500);
ExtraData = new byte[11];
}
else
{
throw new InvalidOperationException("Bad Header!");
}
if (r.BaseStream.Length - r.BaseStream.Position != numdisks * 65500)
throw new InvalidOperationException("Bad File Length!");
while (numdisks > 0)
{
Disks.Add(new FDSDisk(r));
numdisks--;
}
}
public void Write(BinaryWriter w)
{
w.Write(Check);
w.Write((byte)Disks.Count);
w.Write(ExtraData);
foreach (var disk in Disks)
disk.Write(w);
}
}
public class FDSDisk
{
static byte[] Check = FTXT.E.GetBytes("*NINTENDO-HVC*");
public List<FDSChunk> Chunks = new List<FDSChunk>();
public byte[] HeaderData;
public byte[] ExtraData;
public FDSDisk(BinaryReader r)
{
long startpos = r.BaseStream.Position;
long endpos = startpos + 65500;
if (r.ReadByte() != 1)
throw new InvalidOperationException("Bad Block Code");
if (!r.ReadBytes(14).SequenceEqual(Check))
throw new InvalidOperationException("Bad Verification Code");
// one could do quite a bit with this data
HeaderData = r.ReadBytes(41);
if (r.ReadByte() != 2)
throw new InvalidOperationException("Bad Block Code");
int nfiles = r.ReadByte();
while (nfiles > 0)
{
Chunks.Add(new FDSChunk(r));
nfiles--;
}
if (r.BaseStream.Position > endpos)
throw new InvalidOperationException("Disk too long");
long usedpos = r.BaseStream.Position;
while (true)
{
try
{
var chunk = new FDSChunk(r) { Hidden = true };
if (r.BaseStream.Position <= endpos)
{
Chunks.Add(chunk);
usedpos = r.BaseStream.Position;
}
else
{
break;
}
}
catch { break; }
}
r.BaseStream.Seek(usedpos, SeekOrigin.Begin);
ExtraData = r.ReadBytes((int)(endpos - usedpos));
}
public void Write(BinaryWriter w)
{
w.Write((byte)1);
w.Write(Check);
w.Write(HeaderData);
w.Write((byte)2);
w.Write((byte)Chunks.Count(c => !c.Hidden));
foreach (var chunk in Chunks)
{
chunk.Write(w);
}
w.Write(ExtraData);
}
}
public class FDSChunk
{
/// <summary>
/// true if BIOS will ignore this file. this flag is not directly stored.
/// </summary>
public bool Hidden;
public enum FileKindE : byte
{
PRAM = 0,
CRAM = 1,
VRAM = 2
}
public byte Number;
public byte ID;
public string Name;
public ushort Address;
public FileKindE FileKind;
public byte[] Data;
public FDSChunk(BinaryReader r)
{
if (r.ReadByte() != 3)
throw new InvalidOperationException("Bad Block Code");
Number = r.ReadByte();
ID = r.ReadByte();
Name = FTXT.E.GetString(r.ReadBytes(8));
Address = r.ReadUInt16();
int size = r.ReadUInt16();
FileKind = (FileKindE)r.ReadByte();
if (r.ReadByte() != 4)
throw new InvalidOperationException("Bad Block Code");
Data = r.ReadBytes(size);
}
public void Write(BinaryWriter w)
{
w.Write((byte)3);
w.Write(Number);
w.Write(ID);
w.Write(FTXT.E.GetBytes(Name));
w.Write(Address);
w.Write((ushort)Data.Length);
w.Write((byte)FileKind);
w.Write((byte)4);
w.Write(Data);
}
}
public class FDSInspector
{
}
}