public void Run() { int bailout = 1000; while (!_myZ80.Halt && bailout > 0) { _myZ80.Parse(); bailout--; //Console.WriteLine(_myZ80.DumpState()); //DumpRam(); } _dumpedState = _myZ80.GetState(); _hasDump = true; if (!_myZ80.Halt) { Console.WriteLine("BAILOUT!"); } }
public static void Main(string[] args) { Console.WriteLine("Loading Breakpoints"); LinkedList <Int16> breakpointList = new LinkedList <Int16>(); try { StreamReader breakpointsFileReader = new StreamReader(File.OpenRead("breakpoints")); while (!breakpointsFileReader.EndOfStream) { breakpointList.AddLast(Int16.Parse(breakpointsFileReader.ReadLine())); } } catch (System.Exception) { Console.WriteLine("Unable to read file 'breakpoints'"); } Console.WriteLine("Initializing memory"); var ram = new byte[65536]; Array.Clear(ram, 0, ram.Length); Console.WriteLine("Loading memory"); try { File.ReadAllBytes("code.bin").CopyTo(ram, 0); } catch (System.Exception) { Console.WriteLine("ERROR: Unable to read code.bin"); Console.WriteLine("Press RETURN to exit."); while (Console.Read() == -1) { } return; } var mem = new Memory(ram, 0); Console.WriteLine("Initializing I/O ports"); var ports = new SimplePorts(); Console.WriteLine("Initializing CPU"); var cpu = new Z80(mem, ports); Console.WriteLine("Starting CPU" + Environment.NewLine); Console.WriteLine("Press 'T' to terminate emulation"); Console.WriteLine("Press 'S' to single step and 'R' to run continuously" + Environment.NewLine); ConsoleKeyInfo keystroke; bool singleStep = true; bool running = true; int curPC = 0; while (running) { curPC = (cpu.GetState()[24] * 256) + cpu.GetState()[25]; foreach (int i in breakpointList) { if (i == curPC) { Console.WriteLine("Breakpoint hit, pausing"); singleStep = true; } } if (singleStep) { Console.WriteLine(cpu.DumpState()); keystroke = Console.ReadKey(true); if (keystroke.Key == ConsoleKey.S) { Console.WriteLine("Single stepping" + Environment.NewLine); singleStep = true; } else if (keystroke.Key == ConsoleKey.R) { Console.WriteLine("Running free" + Environment.NewLine); singleStep = false; } else if (keystroke.Key == ConsoleKey.T) { Console.WriteLine("Terminating emulation" + Environment.NewLine); break; } } cpu.Parse(); if (cpu.Halt) { Console.WriteLine("Halt executed, pausing simulation" + Environment.NewLine); singleStep = true; } } Console.WriteLine("Press RETURN to exit."); while (Console.Read() == -1) { } }