private void LogInstruction() { var nextInstr = Disassembler.DisassembleInstruction(InstructionLookahead.Passive(State)); _logger.WriteLine(); _logger.WriteLine($"--- PC = 0x{State.Registers.PC.Value:X4}; {nextInstr.Text} ---"); }
public static string Trace(IMachineState state) { var pc = state.Registers.PC.Value; var disassembledInstr = Disassembler.DisassembleInstruction(InstructionLookahead.Passive(state)); var bytes = string.Join(" ", Enumerable.Range(0, disassembledInstr.Length).Select(i => state.Memory[pc + i].ToString("X2"))); var hl = state.Memory[state.Registers.HL.Value]; return($"0x{pc:X4}: {bytes,-10} {disassembledInstr.Text,-15} {state.Registers.ToString()}; (HL)={hl:X2}"); }
public void Run() { runLoop: while (Running) { //if (State.Registers.PC.Value > 0x100) //{ // LogInstruction(); //} _stopwatch.Restart(); var lastElapsed = ElapsedCycles; var clockCounter = 0; var syncTarget = _targetClock / _syncsPerSecond; // TODO possibly inaccurate if there is a remainder! var phaseTime = 1000 / _syncsPerSecond; try { Step(); clockCounter += (int)(ElapsedCycles - lastElapsed); if (clockCounter >= syncTarget) { var elapsedTime = _stopwatch.ElapsedMilliseconds; if (elapsedTime <= phaseTime) { Thread.Sleep((int)(phaseTime - elapsedTime)); } else { _logger.WriteLine("Slowdown!"); } clockCounter -= syncTarget; _stopwatch.Restart(); } } catch (Exception e) { var instr = Disassembler.DisassembleInstruction(InstructionLookahead.Passive(State)); Console.WriteLine($"Exception at instruction: 0x{State.Registers.PC.Value:X2} {instr.Text}"); _logger.WriteLine(e.ToString()); } } //State.Registers.PC.Value = 0; // reset while (!Running) { Thread.Sleep(1000); } goto runLoop; }