Esempio n. 1
0
 protected void AssertFlagsFalse(CPUResults results)
 {
     Assert.False(results.Flags.Sign);
     Assert.False(results.Flags.Zero);
     Assert.False(results.Flags.HalfCarry);
     Assert.False(results.Flags.ParityOverflow);
     Assert.False(results.Flags.Subtract);
     Assert.False(results.Flags.Carry);
 }
Esempio n. 2
0
 protected void AssertFlagsSame(CPUConfig initialState, CPUResults results)
 {
     Assert.Equal(initialState.Flags.Sign, results.Flags.Sign);
     Assert.Equal(initialState.Flags.Zero, results.Flags.Zero);
     Assert.Equal(initialState.Flags.HalfCarry, results.Flags.HalfCarry);
     Assert.Equal(initialState.Flags.ParityOverflow, results.Flags.ParityOverflow);
     Assert.Equal(initialState.Flags.Subtract, results.Flags.Subtract);
     Assert.Equal(initialState.Flags.Carry, results.Flags.Carry);
 }
Esempio n. 3
0
        /**
         * Used to start a unit test run with the given CPU instance. The instance is expected to
         * have a memory implementation loaded with a ROM and registers (program counter etc) set
         * to appropriate values. After the execution completes, a results object will be returned
         * which contains the state of the CPU that can be used for assertions.
         */
        protected CPUResults Execute(CPU cpu)
        {
            // Record the number of iterations (instructions), CPU cycles, and the address of the
            // program counter after each instruction is executed. This allows tests to assert each
            // of these values in addition to the CPU state.
            var iterations  = 0;
            var cycles      = 0;
            var pcAddresses = new List <UInt16>();

            while (!cpu.Halted)
            {
                // Ensure we don't have a run away program.
                if (iterations > 100)
                {
                    throw new Exception("More than 100 iterations occurred.");
                }

                pcAddresses.Add(cpu.Registers.PC);

                cycles += cpu.Step();

                iterations++;
            }

            // HACK: Originally the 8080 implementation did not increment the PC after a HALT.
            // This was copied forward to the Z80 codebase, and all of the existing unit tests
            // assert this value after a HALT. However, the Z80 actually increments the PC after
            // a HALT. I don't want to fix hundreds of tests, so I'm hacking this here...
            cpu.Registers.PC = (UInt16)(cpu.Registers.PC - Opcodes.HALT.Size);

            // Return the state of the CPU so tests can do verification.

            var results = new CPUResults()
            {
                Iterations = iterations,
                Cycles     = cycles,
                ProgramCounterAddresses = pcAddresses,
                Memory            = (cpu.Memory as SimpleMemory).Memory,
                Registers         = cpu.Registers,
                Flags             = cpu.Flags,
                ProgramCounter    = cpu.Registers.PC,
                StackPointer      = cpu.Registers.SP,
                InterruptsEnabled = cpu.InterruptsEnabled,
                InterruptsEnabledPreviousValue = cpu.InterruptsEnabledPreviousValue,
                InterruptMode = cpu.InterruptMode,
            };

            return(results);
        }