public static void SaveSRAM() { if (board != null) { if (SaveSRAMAtShutdown && board.SRAMSaveRequired) { Trace.WriteLine("Saving SRAM ..."); byte[] sramBuffer = new byte[0]; ZlipWrapper.CompressData(board.GetSRAMBuffer(), out sramBuffer); Stream str = new FileStream(SRAMFileName, FileMode.Create, FileAccess.Write); str.Write(sramBuffer, 0, sramBuffer.Length); str.Flush(); str.Close(); Trace.WriteLine("SRAM saved successfully."); } } }
private static void MEMHardReset() { // memory WRAM = new byte[0x800]; WRAM[0x0008] = 0xF7; WRAM[0x0008] = 0xF7; WRAM[0x0009] = 0xEF; WRAM[0x000A] = 0xDF; WRAM[0x000F] = 0xBF; palettes_bank = new byte[] // Miscellaneous, real NES loads values similar to these during power up { 0x09, 0x01, 0x00, 0x01, 0x00, 0x02, 0x02, 0x0D, 0x08, 0x10, 0x08, 0x24, 0x00, 0x00, 0x04, 0x2C, // Bkg palette 0x09, 0x01, 0x34, 0x03, 0x00, 0x04, 0x00, 0x14, 0x08, 0x3A, 0x00, 0x02, 0x00, 0x20, 0x2C, 0x08 // Spr palette }; oam_ram = new byte[256]; oam_secondary = new byte[32]; BUS_ADDRESS = 0; BUS_RW = false; BUS_RW_P = false; // Read SRAM if found Trace.WriteLine("Reading SRAM"); if (File.Exists(SRAMFileName)) { Stream str = new FileStream(SRAMFileName, FileMode.Open, FileAccess.Read); byte[] inData = new byte[str.Length]; str.Read(inData, 0, inData.Length); str.Flush(); str.Close(); byte[] outData = new byte[0]; ZlipWrapper.DecompressData(inData, out outData); board.LoadSRAM(outData); Trace.WriteLine("SRAM read successfully."); } else { Trace.WriteLine("SRAM file not found; rom has no SRAM or file not exist."); } board.HardReset(); }
/// <summary> /// Save current game state as /// </summary> /// <param name="fileName">The complete path where to save the file</param> public void SaveStateAs(string fileName) { if (state_is_loading_state) { this.EmulationPaused = false; this.view.WriteNotification("Can't save state while loading a state !", 120, Color.Red); return; } if (state_is_saving_state) { this.EmulationPaused = false; this.view.WriteNotification("Already saving state !!", 120, Color.Red); return; } state_is_saving_state = true; // Create the stream Stream stream = new MemoryStream(); BinaryWriter bin = new BinaryWriter(stream); // Write header bin.Write(Encoding.ASCII.GetBytes("MNS")); // Write MNS (My Nes State) bin.Write(state_version); // Write version (1 byte) // Write SHA1 for compare later for (int i = 0; i < this.memory.board.RomSHA1.Length; i += 2) { string v = this.memory.board.RomSHA1.Substring(i, 2).ToUpper(); bin.Write(System.Convert.ToByte(v, 16)); } // Write data #region General bin.Write(this.emulator.palCyc); #endregion #region APU this.apu.SaveState(bin); #endregion #region CPU this.cpu.SaveState(bin); #endregion #region DMA this.dma.SaveState(bin); #endregion #region DMC this.apu.dmcChannel.SaveState(bin); #endregion #region Input bin.Write(this.input.PORT0); bin.Write(this.input.PORT1); bin.Write(this.input.inputStrobe); #endregion #region Interrupts this.interrupts.SaveState(bin); #endregion #region Memory this.memory.SaveState(bin); #endregion #region Noise this.apu.noiseChannel.SaveState(bin); #endregion #region PPU this.ppu.SaveState(bin); #endregion #region Pulse 1 this.apu.pulse1Channel.SaveState(bin); #endregion #region Pulse 2 this.apu.pulse2Channel.SaveState(bin); #endregion #region Triangle this.apu.triangleChannel.SaveState(bin); #endregion // Compress data ! byte[] outData = new byte[0]; ZlipWrapper.CompressData(((MemoryStream)bin.BaseStream).GetBuffer(), out outData); // Write file ! Stream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write); fileStream.Write(outData, 0, outData.Length); // Save snapshot this.view.TakeSnapshot(STATEFolder, Path.GetFileNameWithoutExtension(fileName), ".jpg", true); // Finished ! bin.Flush(); bin.Close(); fileStream.Flush(); fileStream.Close(); state_is_saving_state = false; this.EmulationPaused = false; this.view.WriteNotification("State saved at slot " + STATESlot, 120, Color.Green); }
/// <summary> /// Load current game state from file /// </summary> /// <param name="fileName">The complete path to the state file</param> public void LoadStateAs(string fileName) { if (state_is_saving_state) { this.EmulationPaused = false; this.view.WriteNotification("Can't load state while it's saving state !", 120, Color.Red); return; } if (state_is_loading_state) { this.EmulationPaused = false; this.view.WriteNotification("Already loading a state !", 120, Color.Red); return; } state_is_loading_state = true; // Read the file Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read); // Decompress byte[] inData = new byte[stream.Length]; byte[] outData = new byte[0]; stream.Read(inData, 0, inData.Length); stream.Close(); ZlipWrapper.DecompressData(inData, out outData); // Create the reader BinaryReader bin = new BinaryReader(new MemoryStream(outData)); // Read header byte[] header = new byte[3]; bin.Read(header, 0, header.Length); if (Encoding.ASCII.GetString(header) != "MNS") { this.EmulationPaused = false; this.view.WriteNotification("Unable load state at slot " + STATESlot + "; Not My Nes State File !", 120, Color.Red); state_is_loading_state = false; return; } // Read version if (bin.ReadByte() != state_version) { this.EmulationPaused = false; this.view.WriteNotification("Unable load state at slot " + STATESlot + "; Not compatible state file version !", 120, Color.Red); state_is_loading_state = false; return; } string sha1 = ""; for (int i = 0; i < this.memory.board.RomSHA1.Length; i += 2) { sha1 += (bin.ReadByte()).ToString("X2"); } if (sha1.ToLower() != this.memory.board.RomSHA1.ToLower()) { this.EmulationPaused = false; this.view.WriteNotification("Unable load state at slot " + STATESlot + "; This state file is not for this game; not same SHA1 !", 120, Color.Red); state_is_loading_state = false; return; } // Read data #region General this.emulator.palCyc = bin.ReadByte(); #endregion #region APU this.apu.LoadState(bin); #endregion #region CPU this.cpu.LoadState(bin); #endregion #region DMA this.dma.LoadState(bin); #endregion #region DMC this.apu.dmcChannel.LoadState(bin); #endregion #region Input this.input.LoadState(bin); #endregion #region Interrupts this.interrupts.LoadState(bin); #endregion #region Memory this.memory.LoadState(bin); #endregion #region Noise this.apu.noiseChannel.LoadState(bin); #endregion #region PPU this.ppu.LoadState(bin); #endregion #region Pulse this.apu.pulse1Channel.LoadState(bin); this.apu.pulse2Channel.LoadState(bin); #endregion #region Triangle this.apu.triangleChannel.LoadState(bin); #endregion // Finished ! bin.Close(); this.EmulationPaused = false; state_is_loading_state = false; this.view.WriteNotification("State loaded from slot " + STATESlot, 120, Color.Green); }
/// <summary> /// Save current game state as /// </summary> /// <param name="fileName">The complete path where to save the file</param> public static void SaveStateAs(string fileName) { if (state_is_loading_state) { EmulationPaused = false; videoOut.WriteNotification("Can't save state while loading a state !", 120, Color.Red); return; } if (state_is_saving_state) { EmulationPaused = false; videoOut.WriteNotification("Already saving state !!", 120, Color.Red); return; } state_is_saving_state = true; // Create the stream Stream stream = new MemoryStream(); BinaryWriter bin = new BinaryWriter(stream); // Write header bin.Write(Encoding.ASCII.GetBytes("MNS")); // Write MNS (My Nes State) bin.Write(state_version); // Write version (1 byte) // Write SHA1 for compare later for (int i = 0; i < board.RomSHA1.Length; i += 2) { string v = board.RomSHA1.Substring(i, 2).ToUpper(); bin.Write(System.Convert.ToByte(v, 16)); } // Write data #region General bin.Write(palCyc); #endregion #region APU bin.Write(Cycles); bin.Write(SequencingMode); bin.Write(CurrentSeq); bin.Write(isClockingDuration); bin.Write(FrameIrqEnabled); bin.Write(FrameIrqFlag); bin.Write(oddCycle); #endregion #region CPU bin.Write(registers.a); bin.Write(registers.c); bin.Write(registers.d); bin.Write(registers.eah); bin.Write(registers.eal); bin.Write(registers.i); bin.Write(registers.n); bin.Write(registers.pch); bin.Write(registers.pcl); bin.Write(registers.sph); bin.Write(registers.spl); bin.Write(registers.v); bin.Write(registers.x); bin.Write(registers.y); bin.Write(registers.z); bin.Write(M); bin.Write(opcode); bin.Write(byte_temp); bin.Write(int_temp); bin.Write(int_temp1); bin.Write(dummy); #endregion #region DMA bin.Write(dmaDMCDMAWaitCycles); bin.Write(dmaOAMDMAWaitCycles); bin.Write(isOamDma); bin.Write(oamdma_i); bin.Write(dmaDMCOn); bin.Write(dmaOAMOn); bin.Write(dmaDMC_occurring); bin.Write(dmaOAM_occurring); bin.Write(dmaOAMFinishCounter); bin.Write(dmaOamaddress); bin.Write(OAMCYCLE); bin.Write(latch); #endregion #region DMC bin.Write(DeltaIrqOccur); bin.Write(DMCIrqEnabled); bin.Write(dmc_dmaLooping); bin.Write(dmc_dmaEnabled); bin.Write(dmc_bufferFull); bin.Write(dmc_dmaAddrRefresh); bin.Write(dmc_dmaSizeRefresh); bin.Write(dmc_dmaSize); bin.Write(dmc_dmaBits); bin.Write(dmc_dmaByte); bin.Write(dmc_dmaAddr); bin.Write(dmc_dmaBuffer); bin.Write(dmc_output); bin.Write(dmc_cycles); bin.Write(dmc_freqTimer); #endregion #region Input bin.Write(PORT0); bin.Write(PORT1); bin.Write(inputStrobe); #endregion #region Interrupts bin.Write(NMI_Current); bin.Write(NMI_Old); bin.Write(NMI_Detected); bin.Write(IRQFlags); bin.Write(IRQ_Detected); bin.Write(interrupt_vector); bin.Write(interrupt_suspend_nmi); bin.Write(interrupt_suspend_irq); bin.Write(nmi_enabled); bin.Write(nmi_old); bin.Write(vbl_flag); bin.Write(vbl_flag_temp); #endregion #region Memory board.SaveState(bin); bin.Write(WRAM); bin.Write(palettes_bank); bin.Write(oam_ram); bin.Write(oam_secondary); bin.Write(BUS_ADDRESS); bin.Write(BUS_RW); bin.Write(BUS_RW_P); bin.Write(temp_4015); bin.Write(temp_4016); bin.Write(temp_4017); #endregion #region Noise bin.Write(noz_envelope); bin.Write(noz_env_startflag); bin.Write(noz_env_counter); bin.Write(noz_env_devider); bin.Write(noz_length_counter_halt_flag); bin.Write(noz_constant_volume_flag); bin.Write(noz_volume_decay_time); bin.Write(noz_duration_haltRequset); bin.Write(noz_duration_counter); bin.Write(noz_duration_reloadEnabled); bin.Write(noz_duration_reload); bin.Write(noz_duration_reloadRequst); bin.Write(noz_mode); bin.Write(noz_shiftRegister); bin.Write(noz_feedback); bin.Write(noz_frequency); bin.Write(noz_cycles); #endregion #region PPU bin.Write(VClock); bin.Write(HClock); bin.Write(oddSwap); bin.Write(current_pixel); bin.Write(temp); bin.Write(temp_comparator); bin.Write(bkg_pos); bin.Write(spr_pos); bin.Write(object0); bin.Write(infront); bin.Write(bkgPixel); bin.Write(sprPixel); bin.Write(bkg_fetch_address); bin.Write(bkg_fetch_nametable); bin.Write(bkg_fetch_attr); bin.Write(bkg_fetch_bit0); bin.Write(bkg_fetch_bit1); bin.Write(spr_fetch_address); bin.Write(spr_fetch_bit0); bin.Write(spr_fetch_bit1); bin.Write(spr_fetch_attr); for (int i = 0; i < spr_zero_buffer.Length; i++) { bin.Write(spr_zero_buffer[i]); } bin.Write(vram_temp); bin.Write(vram_address); bin.Write(vram_address_temp_access); bin.Write(vram_address_temp_access1); bin.Write(vram_increament); bin.Write(vram_flipflop); bin.Write(vram_fine); bin.Write(reg2007buffer); bin.Write(bkg_enabled); bin.Write(bkg_clipped); bin.Write(bkg_patternAddress); bin.Write(spr_enabled); bin.Write(spr_clipped); bin.Write(spr_patternAddress); bin.Write(spr_size16); bin.Write(spr_0Hit); bin.Write(spr_overflow); bin.Write(grayscale); bin.Write(emphasis); bin.Write(ppu_2002_temp); bin.Write(ppu_2004_temp); bin.Write(ppu_2007_temp); bin.Write(oam_address); bin.Write(oam_fetch_data); bin.Write(oam_evaluate_slot); bin.Write(oam_evaluate_count); bin.Write(oam_fetch_mode); bin.Write(oam_phase_index); bin.Write(spr_render_i); bin.Write(bkg_render_i); bin.Write(spr_evaluation_i); bin.Write(spr_render_temp_pixel); #endregion #region Pulse 1 bin.Write(sq1_envelope); bin.Write(sq1_env_startflag); bin.Write(sq1_env_counter); bin.Write(sq1_env_devider); bin.Write(sq1_length_counter_halt_flag); bin.Write(sq1_constant_volume_flag); bin.Write(sq1_volume_decay_time); bin.Write(sq1_duration_haltRequset); bin.Write(sq1_duration_counter); bin.Write(sq1_duration_reloadEnabled); bin.Write(sq1_duration_reload); bin.Write(sq1_duration_reloadRequst); bin.Write(sq1_dutyForm); bin.Write(sq1_dutyStep); bin.Write(sq1_sweepDeviderPeriod); bin.Write(sq1_sweepShiftCount); bin.Write(sq1_sweepCounter); bin.Write(sq1_sweepEnable); bin.Write(sq1_sweepReload); bin.Write(sq1_sweepNegateFlag); bin.Write(sq1_frequency); bin.Write(sq1_sweep); bin.Write(sq1_cycles); #endregion #region Pulse 2 bin.Write(sq2_envelope); bin.Write(sq2_env_startflag); bin.Write(sq2_env_counter); bin.Write(sq2_env_devider); bin.Write(sq2_length_counter_halt_flag); bin.Write(sq2_constant_volume_flag); bin.Write(sq2_volume_decay_time); bin.Write(sq2_duration_haltRequset); bin.Write(sq2_duration_counter); bin.Write(sq2_duration_reloadEnabled); bin.Write(sq2_duration_reload); bin.Write(sq2_duration_reloadRequst); bin.Write(sq2_dutyForm); bin.Write(sq2_dutyStep); bin.Write(sq2_sweepDeviderPeriod); bin.Write(sq2_sweepShiftCount); bin.Write(sq2_sweepCounter); bin.Write(sq2_sweepEnable); bin.Write(sq2_sweepReload); bin.Write(sq2_sweepNegateFlag); bin.Write(sq2_frequency); bin.Write(sq2_sweep); bin.Write(sq2_cycles); #endregion #region Triangle bin.Write(trl_length_counter_halt_flag); bin.Write(trl_duration_haltRequset); bin.Write(trl_duration_counter); bin.Write(trl_duration_reloadEnabled); bin.Write(trl_duration_reload); bin.Write(trl_duration_reloadRequst); bin.Write(trl_linearCounter); bin.Write(trl_linearCounterReload); bin.Write(trl_step); bin.Write(trl_linearCounterHalt); bin.Write(trl_halt); bin.Write(trl_frequency); bin.Write(trl_cycles); #endregion // Compress data ! byte[] outData = new byte[0]; ZlipWrapper.CompressData(((MemoryStream)bin.BaseStream).GetBuffer(), out outData); // Write file ! Stream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write); fileStream.Write(outData, 0, outData.Length); // Save snapshot videoOut.TakeSnapshot(STATEFolder, Path.GetFileNameWithoutExtension(fileName), ".jpg", true); // Finished ! bin.Flush(); bin.Close(); fileStream.Flush(); fileStream.Close(); state_is_saving_state = false; EmulationPaused = false; videoOut.WriteNotification("State saved at slot " + STATESlot, 120, Color.Green); }
/// <summary> /// Load current game state from file /// </summary> /// <param name="fileName">The complete path to the state file</param> public static void LoadStateAs(string fileName) { if (state_is_saving_state) { EmulationPaused = false; videoOut.WriteNotification("Can't load state while it's saving state !", 120, Color.Red); return; } if (state_is_loading_state) { EmulationPaused = false; videoOut.WriteNotification("Already loading a state !", 120, Color.Red); return; } if (!File.Exists(fileName)) { videoOut.WriteNotification("No state found at slot " + STATESlot, 120, Color.Red); return; } state_is_loading_state = true; // Read the file Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read); // Decompress byte[] inData = new byte[stream.Length]; byte[] outData = new byte[0]; stream.Read(inData, 0, inData.Length); stream.Close(); ZlipWrapper.DecompressData(inData, out outData); // Create the reader BinaryReader bin = new BinaryReader(new MemoryStream(outData)); // Read header byte[] header = new byte[3]; bin.Read(header, 0, header.Length); if (Encoding.ASCII.GetString(header) != "MNS") { EmulationPaused = false; videoOut.WriteNotification("Unable load state at slot " + STATESlot + "; Not My Nes State File !", 120, Color.Red); state_is_loading_state = false; return; } // Read version if (bin.ReadByte() != state_version) { EmulationPaused = false; videoOut.WriteNotification("Unable load state at slot " + STATESlot + "; Not compatible state file version !", 120, Color.Red); state_is_loading_state = false; return; } string sha1 = ""; for (int i = 0; i < board.RomSHA1.Length; i += 2) { sha1 += (bin.ReadByte()).ToString("X2"); } if (sha1.ToLower() != board.RomSHA1.ToLower()) { EmulationPaused = false; videoOut.WriteNotification("Unable load state at slot " + STATESlot + "; This state file is not for this game; not same SHA1 !", 120, Color.Red); state_is_loading_state = false; return; } // Read data #region General palCyc = bin.ReadByte(); #endregion #region APU Cycles = bin.ReadInt32(); SequencingMode = bin.ReadBoolean(); CurrentSeq = bin.ReadByte(); isClockingDuration = bin.ReadBoolean(); FrameIrqEnabled = bin.ReadBoolean(); FrameIrqFlag = bin.ReadBoolean(); oddCycle = bin.ReadBoolean(); #endregion #region CPU registers.a = bin.ReadByte(); registers.c = bin.ReadBoolean(); registers.d = bin.ReadBoolean(); registers.eah = bin.ReadByte(); registers.eal = bin.ReadByte(); registers.i = bin.ReadBoolean(); registers.n = bin.ReadBoolean(); registers.pch = bin.ReadByte(); registers.pcl = bin.ReadByte(); registers.sph = bin.ReadByte(); registers.spl = bin.ReadByte(); registers.v = bin.ReadBoolean(); registers.x = bin.ReadByte(); registers.y = bin.ReadByte(); registers.z = bin.ReadBoolean(); M = bin.ReadByte(); opcode = bin.ReadByte(); byte_temp = bin.ReadByte(); int_temp = bin.ReadInt32(); int_temp1 = bin.ReadInt32(); dummy = bin.ReadByte(); #endregion #region DMA dmaDMCDMAWaitCycles = bin.ReadInt32(); dmaOAMDMAWaitCycles = bin.ReadInt32(); isOamDma = bin.ReadBoolean(); oamdma_i = bin.ReadInt32(); dmaDMCOn = bin.ReadBoolean(); dmaOAMOn = bin.ReadBoolean(); dmaDMC_occurring = bin.ReadBoolean(); dmaOAM_occurring = bin.ReadBoolean(); dmaOAMFinishCounter = bin.ReadInt32(); dmaOamaddress = bin.ReadInt32(); OAMCYCLE = bin.ReadInt32(); latch = bin.ReadByte(); #endregion #region DMC DeltaIrqOccur = bin.ReadBoolean(); DMCIrqEnabled = bin.ReadBoolean(); dmc_dmaLooping = bin.ReadBoolean(); dmc_dmaEnabled = bin.ReadBoolean(); dmc_bufferFull = bin.ReadBoolean(); dmc_dmaAddrRefresh = bin.ReadInt32(); dmc_dmaSizeRefresh = bin.ReadInt32(); dmc_dmaSize = bin.ReadInt32(); dmc_dmaBits = bin.ReadInt32(); dmc_dmaByte = bin.ReadByte(); dmc_dmaAddr = bin.ReadInt32(); dmc_dmaBuffer = bin.ReadByte(); dmc_output = bin.ReadByte(); dmc_cycles = bin.ReadInt32(); dmc_freqTimer = bin.ReadInt32(); #endregion #region Input PORT0 = bin.ReadInt32(); PORT1 = bin.ReadInt32(); inputStrobe = bin.ReadInt32(); #endregion #region Interrupts NMI_Current = bin.ReadBoolean(); NMI_Old = bin.ReadBoolean(); NMI_Detected = bin.ReadBoolean(); IRQFlags = bin.ReadInt32(); IRQ_Detected = bin.ReadBoolean(); interrupt_vector = bin.ReadInt32(); interrupt_suspend_nmi = bin.ReadBoolean(); interrupt_suspend_irq = bin.ReadBoolean(); nmi_enabled = bin.ReadBoolean(); nmi_old = bin.ReadBoolean(); vbl_flag = bin.ReadBoolean(); vbl_flag_temp = bin.ReadBoolean(); #endregion #region Memory board.LoadState(bin); bin.Read(WRAM, 0, WRAM.Length); bin.Read(palettes_bank, 0, palettes_bank.Length); bin.Read(oam_ram, 0, oam_ram.Length); bin.Read(oam_secondary, 0, oam_secondary.Length); BUS_ADDRESS = bin.ReadInt32(); BUS_RW = bin.ReadBoolean(); BUS_RW_P = bin.ReadBoolean(); temp_4015 = bin.ReadByte(); temp_4016 = bin.ReadByte(); temp_4017 = bin.ReadByte(); #endregion #region Noise noz_envelope = bin.ReadInt32(); noz_env_startflag = bin.ReadBoolean(); noz_env_counter = bin.ReadInt32(); noz_env_devider = bin.ReadInt32(); noz_length_counter_halt_flag = bin.ReadBoolean(); noz_constant_volume_flag = bin.ReadBoolean(); noz_volume_decay_time = bin.ReadInt32(); noz_duration_haltRequset = bin.ReadBoolean(); noz_duration_counter = bin.ReadByte(); noz_duration_reloadEnabled = bin.ReadBoolean(); noz_duration_reload = bin.ReadByte(); noz_duration_reloadRequst = bin.ReadBoolean(); noz_mode = bin.ReadBoolean(); noz_shiftRegister = bin.ReadInt32(); noz_feedback = bin.ReadInt32(); noz_frequency = bin.ReadInt32(); noz_cycles = bin.ReadInt32(); #endregion #region PPU VClock = bin.ReadInt32(); HClock = bin.ReadInt32(); oddSwap = bin.ReadBoolean(); current_pixel = bin.ReadInt32(); temp = bin.ReadInt32(); temp_comparator = bin.ReadInt32(); bkg_pos = bin.ReadInt32(); spr_pos = bin.ReadInt32(); object0 = bin.ReadInt32(); infront = bin.ReadInt32(); bkgPixel = bin.ReadInt32(); sprPixel = bin.ReadInt32(); bkg_fetch_address = bin.ReadInt32(); bkg_fetch_nametable = bin.ReadByte(); bkg_fetch_attr = bin.ReadByte(); bkg_fetch_bit0 = bin.ReadByte(); bkg_fetch_bit1 = bin.ReadByte(); spr_fetch_address = bin.ReadInt32(); spr_fetch_bit0 = bin.ReadByte(); spr_fetch_bit1 = bin.ReadByte(); spr_fetch_attr = bin.ReadByte(); for (int i = 0; i < spr_zero_buffer.Length; i++) { spr_zero_buffer[i] = bin.ReadBoolean(); } vram_temp = bin.ReadInt32(); vram_address = bin.ReadInt32(); vram_address_temp_access = bin.ReadInt32(); vram_address_temp_access1 = bin.ReadInt32(); vram_increament = bin.ReadInt32(); vram_flipflop = bin.ReadBoolean(); vram_fine = bin.ReadByte(); reg2007buffer = bin.ReadByte(); bkg_enabled = bin.ReadBoolean(); bkg_clipped = bin.ReadBoolean(); bkg_patternAddress = bin.ReadInt32(); spr_enabled = bin.ReadBoolean(); spr_clipped = bin.ReadBoolean(); spr_patternAddress = bin.ReadInt32(); spr_size16 = bin.ReadInt32(); spr_0Hit = bin.ReadBoolean(); spr_overflow = bin.ReadBoolean(); grayscale = bin.ReadInt32(); emphasis = bin.ReadInt32(); ppu_2002_temp = bin.ReadByte(); ppu_2004_temp = bin.ReadByte(); ppu_2007_temp = bin.ReadByte(); oam_address = bin.ReadByte(); oam_fetch_data = bin.ReadByte(); oam_evaluate_slot = bin.ReadByte(); oam_evaluate_count = bin.ReadByte(); oam_fetch_mode = bin.ReadBoolean(); oam_phase_index = bin.ReadByte(); spr_render_i = bin.ReadInt32(); bkg_render_i = bin.ReadInt32(); spr_evaluation_i = bin.ReadInt32(); spr_render_temp_pixel = bin.ReadInt32(); #endregion #region Pulse 1 sq1_envelope = bin.ReadInt32(); sq1_env_startflag = bin.ReadBoolean(); sq1_env_counter = bin.ReadInt32(); sq1_env_devider = bin.ReadInt32(); sq1_length_counter_halt_flag = bin.ReadBoolean(); sq1_constant_volume_flag = bin.ReadBoolean(); sq1_volume_decay_time = bin.ReadInt32(); sq1_duration_haltRequset = bin.ReadBoolean(); sq1_duration_counter = bin.ReadByte(); sq1_duration_reloadEnabled = bin.ReadBoolean(); sq1_duration_reload = bin.ReadByte(); sq1_duration_reloadRequst = bin.ReadBoolean(); sq1_dutyForm = bin.ReadInt32(); sq1_dutyStep = bin.ReadInt32(); sq1_sweepDeviderPeriod = bin.ReadInt32(); sq1_sweepShiftCount = bin.ReadInt32(); sq1_sweepCounter = bin.ReadInt32(); sq1_sweepEnable = bin.ReadBoolean(); sq1_sweepReload = bin.ReadBoolean(); sq1_sweepNegateFlag = bin.ReadBoolean(); sq1_frequency = bin.ReadInt32(); sq1_sweep = bin.ReadInt32(); sq1_cycles = bin.ReadInt32(); #endregion #region Pulse 2 sq2_envelope = bin.ReadInt32(); sq2_env_startflag = bin.ReadBoolean(); sq2_env_counter = bin.ReadInt32(); sq2_env_devider = bin.ReadInt32(); sq2_length_counter_halt_flag = bin.ReadBoolean(); sq2_constant_volume_flag = bin.ReadBoolean(); sq2_volume_decay_time = bin.ReadInt32(); sq2_duration_haltRequset = bin.ReadBoolean(); sq2_duration_counter = bin.ReadByte(); sq2_duration_reloadEnabled = bin.ReadBoolean(); sq2_duration_reload = bin.ReadByte(); sq2_duration_reloadRequst = bin.ReadBoolean(); sq2_dutyForm = bin.ReadInt32(); sq2_dutyStep = bin.ReadInt32(); sq2_sweepDeviderPeriod = bin.ReadInt32(); sq2_sweepShiftCount = bin.ReadInt32(); sq2_sweepCounter = bin.ReadInt32(); sq2_sweepEnable = bin.ReadBoolean(); sq2_sweepReload = bin.ReadBoolean(); sq2_sweepNegateFlag = bin.ReadBoolean(); sq2_frequency = bin.ReadInt32(); sq2_sweep = bin.ReadInt32(); sq2_cycles = bin.ReadInt32(); #endregion #region Triangle trl_length_counter_halt_flag = bin.ReadBoolean(); trl_duration_haltRequset = bin.ReadBoolean(); trl_duration_counter = bin.ReadByte(); trl_duration_reloadEnabled = bin.ReadBoolean(); trl_duration_reload = bin.ReadByte(); trl_duration_reloadRequst = bin.ReadBoolean(); trl_linearCounter = bin.ReadByte(); trl_linearCounterReload = bin.ReadByte(); trl_step = bin.ReadByte(); trl_linearCounterHalt = bin.ReadBoolean(); trl_halt = bin.ReadBoolean(); trl_frequency = bin.ReadInt32(); trl_cycles = bin.ReadInt32(); #endregion // Finished ! bin.Close(); EmulationPaused = false; state_is_loading_state = false; videoOut.WriteNotification("State loaded from slot " + STATESlot, 120, Color.Green); }