BizHawk/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NSFFormat.cs

85 lines
1.9 KiB
C#

using System;
using System.Linq;
using System.IO;
using System.Collections.Generic;
using BizHawk.Common;
using BizHawk.Common.BufferExtensions;
using BizHawk.Common.IOExtensions;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Cores.Nintendo.NES
{
//http://kevtris.org/nes/nsfspec.txt
//http://en.wikipedia.org/wiki/NES_Sound_Format
public class NSFFormat
{
public byte[] NSFData;
public byte Version;
public byte TotalSongs;
/// <summary>
/// 1-indexed. 0 is an invalid value, I guess
/// </summary>
public byte StartingSong;
public ushort LoadAddress;
public ushort InitAddress;
public ushort PlayAddress;
public string SongName;
public string ArtistName;
public string CopyrightHolder;
public ushort SpeedNTSC;
public byte[] BankswitchInitValues = new byte[8];
public ushort SpeedPAL;
public bool IsNTSC;
public bool IsPAL;
[Flags]
public enum eExtraChips
{
None = 0, VRC6 = 1, VRC7 = 2, FDS = 4, MMC5 = 8, Namco106 = 16, FME7 = 32
}
public eExtraChips ExtraChips;
public void WrapByteArray(byte[] data)
{
NSFData = data;
var ms = new MemoryStream(data);
var br = new BinaryReader(ms);
br.BaseStream.Position += 5;
Version = br.ReadByte();
TotalSongs = br.ReadByte();
StartingSong = br.ReadByte();
LoadAddress = br.ReadUInt16();
InitAddress = br.ReadUInt16();
PlayAddress = br.ReadUInt16();
SongName = br.ReadStringFixedAscii(32);
ArtistName = br.ReadStringFixedAscii(32);
CopyrightHolder = br.ReadStringFixedAscii(32);
SpeedNTSC = br.ReadUInt16();
br.Read(BankswitchInitValues, 0, 8);
SpeedPAL = br.ReadUInt16();
byte temp = br.ReadByte();
if ((temp & 2) != 0) IsNTSC = IsPAL = true;
else if ((temp & 1) != 0) IsPAL = true; else IsNTSC = true;
ExtraChips = (eExtraChips)br.ReadByte();
}
}
}