/// <summary> /// Executes a single frame /// </summary> public virtual void ExecuteFrame(bool render, bool renderSound) { ULADevice.FrameEnd = false; ULADevice.ULACycleCounter = CurrentFrameCycle; InputRead = false; _render = render; _renderSound = renderSound; FrameCompleted = false; if (UPDDiskDevice == null || !UPDDiskDevice.FDD_IsDiskLoaded) { TapeDevice.StartFrame(); } if (_renderSound) { if (AYDevice != null) { AYDevice.StartFrame(); } } PollInput(); for (;;) { // run the CPU Monitor cycle CPUMon.ExecuteCycle(); // cycle the tape device if (UPDDiskDevice == null || !UPDDiskDevice.FDD_IsDiskLoaded) { TapeDevice.TapeCycle(); } // has frame end been reached? if (ULADevice.FrameEnd) { break; } } OverFlow = (int)CurrentFrameCycle - ULADevice.FrameLength; // we have reached the end of a frame LastFrameStartCPUTick = CPU.TotalExecutedCycles - OverFlow; ULADevice.LastTState = 0; if (AYDevice != null) { AYDevice.EndFrame(); } FrameCount++; if (UPDDiskDevice == null || !UPDDiskDevice.FDD_IsDiskLoaded) { TapeDevice.EndFrame(); } FrameCompleted = true; // is this a lag frame? Spectrum.IsLagFrame = !InputRead; // FDC debug if (UPDDiskDevice != null && UPDDiskDevice.writeDebug) { // only write UPD log every second if (FrameCount % 10 == 0) { System.IO.File.AppendAllLines(UPDDiskDevice.outputfile, UPDDiskDevice.dLog); UPDDiskDevice.dLog = new System.Collections.Generic.List <string>(); //System.IO.File.WriteAllText(UPDDiskDevice.outputfile, UPDDiskDevice.outputString); } } }
public void SyncState(Serializer ser) { ser.BeginSection("ZXMachine"); ser.Sync("FrameCompleted", ref FrameCompleted); ser.Sync("OverFlow", ref OverFlow); ser.Sync("FrameCount", ref FrameCount); ser.Sync("_frameCycles", ref _frameCycles); ser.Sync("inputRead", ref inputRead); ser.Sync("LastFrameStartCPUTick", ref LastFrameStartCPUTick); ser.Sync("LastULAOutByte", ref LastULAOutByte); ser.Sync("ROM0", ref ROM0, false); ser.Sync("ROM1", ref ROM1, false); ser.Sync("ROM2", ref ROM2, false); ser.Sync("ROM3", ref ROM3, false); ser.Sync("RAM0", ref RAM0, false); ser.Sync("RAM1", ref RAM1, false); ser.Sync("RAM2", ref RAM2, false); ser.Sync("RAM3", ref RAM3, false); ser.Sync("RAM4", ref RAM4, false); ser.Sync("RAM5", ref RAM5, false); ser.Sync("RAM6", ref RAM6, false); ser.Sync("RAM7", ref RAM7, false); ser.Sync("ROMPaged", ref ROMPaged); ser.Sync("SHADOWPaged", ref SHADOWPaged); ser.Sync("RAMPaged", ref RAMPaged); ser.Sync("PagingDisabled", ref PagingDisabled); ser.Sync("SpecialPagingMode", ref SpecialPagingMode); ser.Sync("PagingConfiguration", ref PagingConfiguration); ser.Sync("ROMhigh", ref ROMhigh); ser.Sync("ROMlow", ref ROMlow); ser.Sync("LastContendedReadByte", ref LastContendedReadByte); KeyboardDevice.SyncState(ser); BuzzerDevice.SyncState(ser); TapeBuzzer.SyncState(ser); ULADevice.SyncState(ser); CPUMon.SyncState(ser); if (AYDevice != null) { AYDevice.SyncState(ser); ((AY38912)AYDevice as AY38912).PanningConfiguration = Spectrum.Settings.AYPanConfig; } ser.Sync("tapeMediaIndex", ref tapeMediaIndex); if (ser.IsReader) { IsLoadState = true; TapeMediaIndex = tapeMediaIndex; IsLoadState = false; } TapeDevice.SyncState(ser); ser.Sync("diskMediaIndex", ref diskMediaIndex); if (ser.IsReader) { IsLoadState = true; DiskMediaIndex = diskMediaIndex; IsLoadState = false; } if (UPDDiskDevice != null) { UPDDiskDevice.SyncState(ser); } ser.EndSection(); }
public void SyncState(Serializer ser) { ser.BeginSection("ZXMachine"); ser.Sync(nameof(FrameCompleted), ref FrameCompleted); ser.Sync(nameof(OverFlow), ref OverFlow); ser.Sync(nameof(FrameCount), ref FrameCount); ser.Sync(nameof(_frameCycles), ref _frameCycles); ser.Sync(nameof(inputRead), ref inputRead); ser.Sync(nameof(LastFrameStartCPUTick), ref LastFrameStartCPUTick); ser.Sync(nameof(LastULAOutByte), ref LastULAOutByte); ser.Sync(nameof(ROM0), ref ROM0, false); ser.Sync(nameof(ROM1), ref ROM1, false); ser.Sync(nameof(ROM2), ref ROM2, false); ser.Sync(nameof(ROM3), ref ROM3, false); ser.Sync(nameof(RAM0), ref RAM0, false); ser.Sync(nameof(RAM1), ref RAM1, false); ser.Sync(nameof(RAM2), ref RAM2, false); ser.Sync(nameof(RAM3), ref RAM3, false); ser.Sync(nameof(RAM4), ref RAM4, false); ser.Sync(nameof(RAM5), ref RAM5, false); ser.Sync(nameof(RAM6), ref RAM6, false); ser.Sync(nameof(RAM7), ref RAM7, false); ser.Sync(nameof(ROMPaged), ref ROMPaged); ser.Sync(nameof(SHADOWPaged), ref SHADOWPaged); ser.Sync(nameof(RAMPaged), ref RAMPaged); ser.Sync(nameof(PagingDisabled), ref PagingDisabled); ser.Sync(nameof(SpecialPagingMode), ref SpecialPagingMode); ser.Sync(nameof(PagingConfiguration), ref PagingConfiguration); ser.Sync(nameof(ROMhigh), ref ROMhigh); ser.Sync(nameof(ROMlow), ref ROMlow); ser.Sync(nameof(LastContendedReadByte), ref LastContendedReadByte); KeyboardDevice.SyncState(ser); BuzzerDevice.SyncState(ser); TapeBuzzer.SyncState(ser); ULADevice.SyncState(ser); CPUMon.SyncState(ser); if (AYDevice != null) { AYDevice.SyncState(ser); ((AY38912)AYDevice).PanningConfiguration = Spectrum.Settings.AYPanConfig; } ser.Sync(nameof(tapeMediaIndex), ref tapeMediaIndex); if (ser.IsReader) { IsLoadState = true; TapeMediaIndex = tapeMediaIndex; IsLoadState = false; } TapeDevice.SyncState(ser); ser.Sync(nameof(diskMediaIndex), ref diskMediaIndex); if (ser.IsReader) { IsLoadState = true; DiskMediaIndex = diskMediaIndex; IsLoadState = false; } UPDDiskDevice?.SyncState(ser); ser.EndSection(); }