/// <summary> /// コンストラクタ /// </summary> /// <param name="rom"></param> public Nes(byte[] rom) { this.Cartridge = NesCartridge.Load(rom); this.Controller = new NesGameController(); this.Ppu = new Ppu.NesPpu(this.Cartridge.GetCopyChrRom1(), this.Cartridge.GetCopyChrRom2(), this.Cartridge.IsHMirror, this.Cartridge.IsVMirror, x => this.Image = x); this.MemoryMap = new Cpu.NesCpuMemoryMap(this.Cartridge.GetCopyPgRom1(), this.Cartridge.GetCopyPgRom2(), this.Ppu,this.Controller); this.Cpu = new Cpu.NesCpu(this.MemoryMap, this.Ppu); }
/// <summary> /// カートリッジ情報を取得 /// </summary> /// <param name="rom"></param> /// <returns></returns> public static NesCartridge Load(byte[] rom) { var cartridge = new NesCartridge(); var header = rom.Take(16).ToArray(); if (!(header[0] ==78 && header[1] == 69 && header[2] == 83)) { throw new ArgumentException(); } var programRomPageCount = header[4]; var characterRomPageCount = header[5]; var isHMirror = (header[6] & (byte)0x01) == 0; var isVMirror = (header[6] & (byte)0x01) != 0; cartridge.IsHMirror = isHMirror; cartridge.IsVMirror = isVMirror; if (programRomPageCount == 1) { cartridge.ProgramRom1 = rom.Skip(16).Take(16384).ToArray(); cartridge.ProgramRom2 = cartridge.ProgramRom1; } else { var roms = rom.Skip(16).Buffer(16384).Take(2).ToArray(); cartridge.ProgramRom1 = roms[0]; cartridge.ProgramRom2 = roms[1]; } { var roms = rom.Skip(programRomPageCount * 16384 + 16).Buffer(4096).Take(2).ToArray(); cartridge.CharacterRom1 = roms[0]; cartridge.CharacterRom2 = roms[1]; } return cartridge; }