protected void ReadSectionNames(byte[] source) { for (int i = 0; i < SectionHeader.Length; i++) { SectionName[i] = ValueRead.ASCIIString(source, SectionHeader[i].sh_name); if (NameMaxLength < SectionName[i].Length) { NameMaxLength = SectionName[i].Length; } } }
protected virtual void ReadInfo(string filename) { ValueRead read = new ValueRead(Header.e_ident[(byte)EI.DataEncoding]); FileStream fs; for (int i = 0; i < Header.e_shnum; i++) { if (SectionHeader[i].sh_offset != 0) { if ((SectionHeader[i].sh_type & (uint)SHT_RPL.FILEINFO) == (uint)SHT_RPL.FILEINFO) { fs = File.Open(filename, FileMode.Open); byte[] sectiondata = new byte[SectionHeader[i].sh_size]; fs.Position = SectionHeader[i].sh_offset; fs.Read(sectiondata, 0, sectiondata.Length); fs.Close(); Info = new RPX.FileInfo(sectiondata, 0, read); if (Info.mSrcFileNameOffset != 0) { SrcFileName = ValueRead.ASCIIString(sectiondata, Info.mSrcFileNameOffset); } if (Info.mTagsOffset != 0) { ulong offset = Info.mTagsOffset; string tag = ValueRead.ASCIIString(sectiondata, offset); while (tag.Length != 0) { Tags.Add(tag); offset += (ulong)tag.Length + 1; tag = ValueRead.ASCIIString(sectiondata, offset); } } } else if ((SectionHeader[i].sh_type & (uint)SHT_RPL.CRCS) == (uint)SHT_RPL.CRCS) { fs = File.Open(filename, FileMode.Open); byte[] sectiondata = new byte[SectionHeader[i].sh_size]; fs.Position = SectionHeader[i].sh_offset; fs.Read(sectiondata, 0, sectiondata.Length); fs.Close(); for (int j = 0; j < Header.e_shnum; j++) { CRC[j] = read.UInt32(sectiondata, (ulong)(j * 4)); } } } } }
public ROMInfo(byte[] data) { if (!(data[0x44] == 'W' && data[0x45] == 'U' && data[0x46] == 'P' && data[0x47] == '-')) { throw new FormatException("It is not an VC SNES ROM."); } HeaderData = new int[12]; HeaderData[0] = ValueRead.StandardInt32(data, 0x20); //Always 0x00000100 HeaderData[1] = ValueRead.StandardInt32(data, 0x24); //Size HeaderData[2] = ValueRead.StandardInt32(data, 0x28); //ROM offset (Always 0x00000030) HeaderData[3] = ValueRead.StandardInt32(data, 0x2C); //PCM samples offset HeaderData[4] = ValueRead.StandardInt32(data, 0x30); //PCM footer offset HeaderData[5] = ValueRead.StandardInt32(data, 0x34); //Footer offset HeaderData[6] = ValueRead.StandardInt32(data, 0x38); //X0 offset HeaderData[7] = ValueRead.StandardInt32(data, 0x3C); //X1 offset HeaderData[8] = ValueRead.StandardInt32(data, 0x40); //X2 offset HeaderData[9] = ValueRead.StandardInt32(data, 0x44); //Always 0x2D505557 ("WUP-") HeaderData[10] = ValueRead.StandardInt32(data, 0x48); //Product code HeaderData[11] = ValueRead.StandardInt32(data, 0x4C); //Always 0x00000000 if (data[0x31 + HeaderData[5]] == 0x14 || data[0x31 + HeaderData[5]] == 0x15) { FooterData = new byte[19]; } else { FooterData = new byte[16]; } FooterData[0] = data[0x20 + HeaderData[5]]; //Emulation speed (Always 0x3C (60 FPS)) FooterData[1] = data[0x21 + HeaderData[5]]; //ROM size byte 0 FooterData[2] = data[0x22 + HeaderData[5]]; //ROM size byte 1 FooterData[3] = data[0x23 + HeaderData[5]]; //ROM size byte 2 FooterData[4] = data[0x24 + HeaderData[5]]; //ROM size byte 3 FooterData[5] = data[0x25 + HeaderData[5]]; //PCM samples size byte 0 FooterData[6] = data[0x26 + HeaderData[5]]; //PCM samples size byte 1 FooterData[7] = data[0x27 + HeaderData[5]]; //PCM samples size byte 2 FooterData[8] = data[0x28 + HeaderData[5]]; //PCM samples size byte 3 FooterData[9] = data[0x29 + HeaderData[5]]; //PCM footer size byte 0 FooterData[10] = data[0x2A + HeaderData[5]]; //PCM footer size byte 1 FooterData[11] = data[0x2B + HeaderData[5]]; //PCM footer size byte 2 FooterData[12] = data[0x2C + HeaderData[5]]; //PCM footer size byte 3 FooterData[13] = data[0x2D + HeaderData[5]]; //Game preset ID byte 0 FooterData[14] = data[0x2E + HeaderData[5]]; //Game preset ID byte 1 FooterData[15] = data[0x2F + HeaderData[5]]; //Amount of players if (FooterData.Length == 19) { FooterData[16] = data[0x30 + HeaderData[5]]; //Sound volume FooterData[17] = data[0x31 + HeaderData[5]]; //ROM type (0x14 LoROM, 0x15 HiROM) FooterData[18] = data[0x32 + HeaderData[5]]; //Enhancement chip //0x00 Normal //0x02 DSP-1 //0x03 S-DD1 //0x04 Cx4 //0x05 ??? (DSP-2?) //0x06 SA-1 //0x07 SA-1 //0x08 SA-1 //0x09 SA-1 //0x0A SA-1 //0x0B SA-1 //0x0C SuperFX/GSU } ExtraData = new byte[HeaderData[1] - (HeaderData[5] + FooterData.Length)]; for (int i = 0; i < ExtraData.Length; i++) { ExtraData[i] = data[0x20 + HeaderData[5] + FooterData.Length + i]; } FormatCode = (char)data[0x48]; ShortID = ValueRead.ASCIIString(data, 0x49, 2); RegionCode = (char)data[0x4B]; RawSize = ValueRead.StandardInt32(data, (ulong)(0x21 + HeaderData[5])); PCMSamplesSize = ValueRead.StandardInt32(data, (ulong)(0x25 + HeaderData[5])); PCMFooterSize = ValueRead.StandardInt32(data, (ulong)(0x29 + HeaderData[5])); Data = new byte[RawSize]; Array.Copy(data, 0x20 + HeaderData[2], Data, 0, Data.Length); AdditionalData = new byte[data.Length - 0x20 - HeaderData[1]]; Array.Copy(data, 0x20 + HeaderData[1], AdditionalData, 0, AdditionalData.Length); }