コード例 #1
0
ファイル: Cartridge.cs プロジェクト: davignola/olcNESharp
        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);
            }
        }
コード例 #2
0
        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();
        }
コード例 #3
0
ファイル: Cartridge.cs プロジェクト: davignola/olcNESharp
        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;
            }
        }