public MIRROR GetMirror() { MIRROR m = pMapper.Mirror; if (m == MIRROR.HARDWARE) { // GetMirror configuration was defined // in hardware via soldering return(HwMirror); } else { // GetMirror configuration can be // dynamically set via mapper return(m); } }
public Cartridge(string sFileName) { sHeader header = new sHeader(); header.name = new char[4]; header.unused = new char[5]; bImageValid = false; BinaryReader br; try { br = new BinaryReader(new FileStream(sFileName, FileMode.Open)); } catch (IOException e) { return; } header.name = Encoding.ASCII.GetChars(br.ReadBytes(4)); header.prg_rom_chunks = br.ReadByte(); header.chr_rom_chunks = br.ReadByte(); header.mapper1 = br.ReadByte(); header.mapper2 = br.ReadByte(); header.prg_ram_size = br.ReadByte(); header.tv_system1 = br.ReadByte(); header.tv_system2 = br.ReadByte(); header.unused = Encoding.ASCII.GetChars(br.ReadBytes(5)); if ((header.mapper1 & 0x04) != 0) { br.BaseStream.Seek(512, SeekOrigin.Current); } nMapperID = (byte)(((header.mapper2 >> 4) << 4) | (header.mapper1 >> 4)); mirror = ((header.mapper1 & 0x01) != 0) ? MIRROR.VERTICAL : MIRROR.HORIZONTAL; byte nFileType = 1; if (nFileType == 1) { nPRGBanks = header.prg_rom_chunks; vPRGMemory = new List <byte>(nPRGBanks * 16384); vPRGMemory = br.ReadBytes(vPRGMemory.Capacity).ToList(); nCHRBanks = header.chr_rom_chunks; vCHRMemory = new List <byte>(nCHRBanks * 8192); vCHRMemory = br.ReadBytes(vCHRMemory.Capacity).ToList(); //ifs.read((char*)vCHRMemory.data(), vCHRMemory.size()); } switch (nMapperID) { case 0: pMapper = new Mapper000(nPRGBanks, nCHRBanks); break; } bImageValid = true; br.Close(); }
public Cartridge(string fileName) { if (!File.Exists(fileName)) { return; } try { using (var fileReader = File.OpenRead(fileName)) { if (!fileReader.CanRead) { return; } // Read header data into a buffer var rawHeader = new byte[INES_HEADER_SIZE]; fileReader.Read(rawHeader, 0, INES_HEADER_SIZE); // Init the header Header = new HeaderINES(rawHeader); // If a "trainer" exists we just need to read past // it before we get to the good stuff if ((Header.Mapper1 & 0x04) != 0) { fileReader.Seek(512, SeekOrigin.Current); } // Determine Mapper ID nMapperID = (byte)(((Header.Mapper2 >> 4) << 4) | (Header.Mapper1 >> 4)); HwMirror = (Header.Mapper1 & 0x01) != 0 ? MIRROR.VERTICAL : MIRROR.HORIZONTAL; // "Discover" File Format byte nFileType = 1; if ((Header.Mapper2 & 0x0C) == 0x08) { nFileType = 2; } if (nFileType == 0) { } if (nFileType == 1) { nPRGBanks = Header.Prg_rom_chunks; vPRGMemory = new byte[nPRGBanks * 16384]; fileReader.Read(vPRGMemory, 0, vPRGMemory.Length); nCHRBanks = Header.Chr_rom_chunks; if (nCHRBanks == 0) { // Create CHR RAM vCHRMemory = new byte[8192]; } else { // Allocate for ROM vCHRMemory = new byte[nCHRBanks * 8192]; } fileReader.Read(vCHRMemory, 0, vCHRMemory.Length); } if (nFileType == 2) { nPRGBanks = (byte)(((Header.Prg_ram_size & 0x07) << 8) | Header.Prg_rom_chunks); vPRGMemory = new byte[nPRGBanks * 16384]; fileReader.Read(vPRGMemory, 0, vPRGMemory.Length); nCHRBanks = (byte)(((Header.Prg_ram_size & 0x38) << 8) | Header.Chr_rom_chunks); vCHRMemory = new byte[nCHRBanks * 8192]; fileReader.Read(vCHRMemory, 0, vCHRMemory.Length); } // Load appropriate mapper switch (nMapperID) { case 0: pMapper = new Mapper000(nPRGBanks, nCHRBanks); break; case 1: pMapper = new Mapper001(nPRGBanks, nCHRBanks); break; case 2: pMapper = new Mapper002(nPRGBanks, nCHRBanks); break; case 3: pMapper = new Mapper003(nPRGBanks, nCHRBanks); break; case 4: pMapper = new Mapper004(nPRGBanks, nCHRBanks); break; case 66: pMapper = new Mapper066(nPRGBanks, nCHRBanks); break; default: throw new Exception($"Mapper {nMapperID} not implemented"); } IsImageValid = true; } } catch (Exception) { throw; } }