public static NesHeader FromBytes(byte[] bytes) { BinaryHeader binHeader = new BinaryHeader(bytes); NesHeader header = new NesHeader(); header.IsNes20 = binHeader.GetRomHeaderVersion() == RomHeaderVersion.Nes2_0; header.PrgRom = (uint)(binHeader.GetPrgSize()); header.ChrRom = (uint)(binHeader.GetChrSize()); header.HasTrainer = binHeader.HasTrainer(); header.HasBattery = binHeader.HasBattery(); header.System = binHeader.GetTvSystem(); header.Timing = binHeader.GetFrameTiming(); header.Mirroring = binHeader.GetMirroringType(); header.MapperId = (uint)binHeader.GetMapperID(); header.SubmapperId = (uint)binHeader.GetSubMapper(); header.WorkRam = (MemorySizes)binHeader.GetWorkRamSize(); header.SaveRam = (MemorySizes)binHeader.GetSaveRamSize(); header.ChrRam = (MemorySizes)binHeader.GetChrRamSize(); header.ChrRamBattery = (MemorySizes)binHeader.GetSaveChrRamSize(); header.InputType = binHeader.GetInputType(); header.VsPpu = (VsPpuType)bytes[13]; header.VsSystem = binHeader.GetVsSystemType(); return(header); }
public BinaryHeader ReadHeader() { var header = new BinaryHeader(); // Check if the stream isn't too small to be a proper file if (mReader.BaseStreamLength < BinaryHeader.SIZE) { throw new InvalidDataException("Stream is too small to be valid"); } header.FileType = mReader.ReadByte(); header.IsCompressed = mReader.ReadByte() != 0; header.UserId = mReader.ReadInt16(); header.FileSize = mReader.ReadInt32(); header.Magic = mReader.ReadBytes(4); header.Field0C = mReader.ReadInt32(); header.RelocationTable.Offset = mReader.ReadInt32(); header.RelocationTableSize = mReader.ReadInt32(); header.DialogCount = mReader.ReadInt32(); header.IsRelocated = mReader.ReadInt16() != 0; header.Field1E = mReader.ReadInt16(); // swap endianness if (header.Magic.SequenceEqual(BinaryHeader.MAGIC_V1) || header.Magic.SequenceEqual(BinaryHeader.MAGIC_V0)) { if (mVersion.HasFlag(BinaryFormatVersion.BigEndian)) { SwapHeader(ref header); mReader.Endianness = Endianness.LittleEndian; } mVersion = BinaryFormatVersion.Version1; } else if (header.Magic.SequenceEqual(BinaryHeader.MAGIC_V1_BE)) { if (!mVersion.HasFlag(BinaryFormatVersion.BigEndian)) { SwapHeader(ref header); mReader.Endianness = Endianness.BigEndian; } mVersion = BinaryFormatVersion.Version1BigEndian; } else { throw new InvalidDataException("Header magic value does not match"); } if (header.RelocationTable.Offset != 0) { mReader.EnqueuePositionAndSeekBegin(mPositionBase + header.RelocationTable.Offset); header.RelocationTable.Value = mReader.ReadBytes(header.RelocationTableSize); mReader.SeekBeginToDequedPosition(); } return(header); }
private void SwapHeader(ref BinaryHeader header) { EndiannessHelper.Swap(ref header.UserId); EndiannessHelper.Swap(ref header.FileSize); EndiannessHelper.Swap(ref header.Field0C); EndiannessHelper.Swap(ref header.RelocationTable.Offset); EndiannessHelper.Swap(ref header.RelocationTableSize); EndiannessHelper.Swap(ref header.DialogCount); EndiannessHelper.Swap(ref header.Field1E); }
private void WriteHeader(ref BinaryHeader header) { mWriter.Write(header.FileType); mWriter.Write(header.IsCompressed ? ( byte )1 : ( byte )0); mWriter.Write(header.UserId); mWriter.Write(header.FileSize); mWriter.Write(header.Magic); mWriter.Write(header.Field0C); mWriter.Write(header.RelocationTable.Offset); mWriter.Write(header.RelocationTableSize); mWriter.Write(header.DialogCount); mWriter.Write(header.IsRelocated ? ( short )1 : ( short )0); mWriter.Write(header.Field1E); }
private void WriteHeader(ref BinaryHeader header) { mWriter.Write(header.FileType); mWriter.Write(header.Format); mWriter.Write(header.UserId); mWriter.Write(header.FileSize); mWriter.Write(header.Magic); mWriter.Write(header.ExtSize); mWriter.Write(header.RelocationTable.Offset); mWriter.Write(header.RelocationTableSize); mWriter.Write(header.DialogCount); mWriter.Write(header.IsRelocated ? ( short )1 : ( short )0); mWriter.Write(header.Version); }
/// <summary> /// 初期化 /// </summary> /// <param name="data"></param> public void Initialize(byte[] data) { var device = GraphicsCore.D3D11Device; // byte配列からポインタを取得 var handle = GCHandle.Alloc(data, GCHandleType.Pinned); IntPtr ptr = handle.AddrOfPinnedObject(); BinaryHeader header = (BinaryHeader)Marshal.PtrToStructure(ptr, typeof(BinaryHeader)); IntPtr vs_ptr = ptr + (int)header.vs_offset; IntPtr ps_ptr = ptr + (int)header.ps_offset; name_ = "0x" + header.id.ToString("x8"); shaderId_ = header.id; // 頂点シェーダ using (ShaderBytecode bytecode = new ShaderBytecode(new SlimDX.DataStream(vs_ptr, header.vs_size, true, false))) { vertexShader_ = new VertexShader(device, bytecode); using (ShaderReflection reflect = new ShaderReflection(bytecode)) { // レイアウト生成 vertexAttr_ = reflect.GetVertexLayoutAttribute(); int layout_id = Shader.GetVertexLayoutID(vertexAttr_); inputLayout_ = new InputLayout(device, bytecode, sLayoutList[layout_id]); // コンスタントバッファ解決 ResolveConstantBuffer(reflect); } } // ピクセルシェーダ using (ShaderBytecode bytecode = new ShaderBytecode(new SlimDX.DataStream(ps_ptr, header.ps_size, true, false))) { pixelShader_ = new PixelShader(device, bytecode); using (ShaderReflection reflect = new ShaderReflection(bytecode)) { // コンスタントバッファ解決 ResolveConstantBuffer(reflect); } } // ハンドル解放 handle.Free(); Initilaized = true; }
public static NesHeader FromBytes(byte[] bytes) { BinaryHeader binHeader = new BinaryHeader(bytes); NesHeader header = new NesHeader(); header.IsNes20 = binHeader.GetRomHeaderVersion() == RomHeaderVersion.Nes2_0; header.PrgRom = (uint)(binHeader.GetPrgSize() * 16); header.ChrRom = (uint)(binHeader.GetChrSize() * 8); header.HasTrainer = binHeader.HasTrainer(); header.HasBattery = binHeader.HasBattery(); if (binHeader.IsVsSystem()) { header.System = TvSystem.VsSystem; } else if (binHeader.IsPlaychoice()) { header.System = TvSystem.Playchoice; } else if (binHeader.IsPalRom()) { header.System = TvSystem.Pal; } else { header.System = TvSystem.Ntsc; } header.Mirroring = binHeader.GetMirroringType(); header.MapperId = (uint)binHeader.GetMapperID(); header.SubmapperId = (uint)binHeader.GetSubMapper(); header.WorkRam = (MemorySizes)binHeader.GetWorkRamSize(); header.SaveRam = (MemorySizes)binHeader.GetSaveRamSize(); header.ChrRam = (MemorySizes)binHeader.GetChrRamSize(); header.ChrRamBattery = (MemorySizes)binHeader.GetSaveChrRamSize(); header.VsPpu = (VsPpuType)bytes[13]; return(header); }