Example #1
0
        private void LogInstruction()
        {
            var nextInstr = Disassembler.DisassembleInstruction(InstructionLookahead.Passive(State));

            _logger.WriteLine();
            _logger.WriteLine($"--- PC = 0x{State.Registers.PC.Value:X4}; {nextInstr.Text} ---");
        }
Example #2
0
        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}");
        }
Example #3
0
        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;
        }