From bcf9a06fedbfc3978fe18a065fcc755bad2196ba Mon Sep 17 00:00:00 2001 From: Ian C Date: Sun, 1 Jul 2012 14:35:59 +0000 Subject: Updates --- src/Noddybox.Emulation.EightBit.Z80/Z80Cpu.cs | 10 +++++++++ src/Noddybox.Emulation.EightBit/ICpu.cs | 18 ++++++++++++++++ src/Noddybox.Emulation/EmulationStateException.cs | 1 + .../EmulationStateLoadManager.cs | 25 +++++++++++++++++++++- .../EmulationStateSaveManager.cs | 1 + 5 files changed, 54 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/Noddybox.Emulation.EightBit.Z80/Z80Cpu.cs b/src/Noddybox.Emulation.EightBit.Z80/Z80Cpu.cs index a802142..854cc9d 100644 --- a/src/Noddybox.Emulation.EightBit.Z80/Z80Cpu.cs +++ b/src/Noddybox.Emulation.EightBit.Z80/Z80Cpu.cs @@ -256,6 +256,16 @@ namespace Noddybox.Emulation.EightBit.Z80 } } + public void Run(CpuCallback callback) + { + VBL = false; + + do + { + Step(); + } while (callback(this)); + } + public void MaskableInterrupt(byte value) { raise = true; diff --git a/src/Noddybox.Emulation.EightBit/ICpu.cs b/src/Noddybox.Emulation.EightBit/ICpu.cs index 9d1909c..1ee7781 100644 --- a/src/Noddybox.Emulation.EightBit/ICpu.cs +++ b/src/Noddybox.Emulation.EightBit/ICpu.cs @@ -19,6 +19,15 @@ using System; namespace Noddybox.Emulation.EightBit { + /// + /// Defines a delegate that will be called after an instruction. + /// + /// The CPU being used. All state will be upto date prior to invoking + /// the callback. + /// True if the CPU should continue executing, or false if not. Users should simply + /// return Clock.VBL if they need no other than clock control. + public delegate bool CpuCallback(object sender); + /// /// Defines an 8-bit CPU. /// @@ -47,6 +56,15 @@ namespace Noddybox.Emulation.EightBit /// void Run(); + /// + /// Runs the CPU until the callback tells it to stop. + /// + /// A delegate that is called after every completed instruction + /// cycle and tells the CPU when to stop running. Note that at least one instruction + /// is always executed as the callback is made after the cycle has completed. + /// + void Run(CpuCallback callback); + /// /// Generates a maskable interrupt to the CPU. /// diff --git a/src/Noddybox.Emulation/EmulationStateException.cs b/src/Noddybox.Emulation/EmulationStateException.cs index c15bc57..84df165 100644 --- a/src/Noddybox.Emulation/EmulationStateException.cs +++ b/src/Noddybox.Emulation/EmulationStateException.cs @@ -30,6 +30,7 @@ namespace Noddybox.Emulation /// public enum Reason { + InvalidStream, InvalidVersion, StreamException, InvalidFieldType diff --git a/src/Noddybox.Emulation/EmulationStateLoadManager.cs b/src/Noddybox.Emulation/EmulationStateLoadManager.cs index bf131d9..cf9aa52 100644 --- a/src/Noddybox.Emulation/EmulationStateLoadManager.cs +++ b/src/Noddybox.Emulation/EmulationStateLoadManager.cs @@ -39,18 +39,41 @@ namespace Noddybox.Emulation try { + IEmulationState last = null; + foreach (IEmulationState obj in objects) { + uint magic = stream.ReadUInt32(); + + if (magic != EmulationStateSettings.MAGIC) + { + string message; + + if (last != null) + { + message = String.Format("Corrupted stream; {0} may have read too much or little", last.GetType()); + } + else + { + message = "Invalid stream - not an emulation state file."; + } + + throw new EmulationStateException(message, + EmulationStateException.Reason.InvalidStream); + } + int version = stream.ReadInt32(); if (version != obj.Version) { throw new EmulationStateException(String.Format("Object {0} expected version {1}; got {2}", - obj.GetType(), version, obj.Version), + obj.GetType(), obj.Version, version), EmulationStateException.Reason.InvalidVersion); } obj.LoadState(manager); + + last = obj; } } catch (IOException ex) diff --git a/src/Noddybox.Emulation/EmulationStateSaveManager.cs b/src/Noddybox.Emulation/EmulationStateSaveManager.cs index 1d5cea8..94716db 100644 --- a/src/Noddybox.Emulation/EmulationStateSaveManager.cs +++ b/src/Noddybox.Emulation/EmulationStateSaveManager.cs @@ -40,6 +40,7 @@ namespace Noddybox.Emulation { foreach (IEmulationState obj in objects) { + stream.Write(EmulationStateSettings.MAGIC); stream.Write(obj.Version); obj.SaveState(manager); } -- cgit v1.2.3