Example #1
0
        public ExecutionResult Execute(Processor cpu, InstructionPackage package)
        {
            Instruction     instruction = package.Instruction;
            InstructionData data        = package.Data;
            Registers       r           = cpu.Registers;

            if (instruction.Opcode == 0x08)
            {
                // EX AF,AF'
                r.ExchangeAF();
            }
            else
            {
                if (instruction.Target == InstructionElement.AddressFromSP)
                {
                    // EX (SP),HL/IX/IY
                    ushort value     = instruction.MarshalSourceWord(data, cpu, out ushort address);
                    ushort valueAtSP = cpu.Memory.Untimed.ReadWordAt(r.SP);

                    r[instruction.Source.AsWordRegister()] = valueAtSP;
                    cpu.Memory.Timed.WriteWordAt(r.SP, value);

                    r.WZ = valueAtSP;
                }
                else
                {
                    // EX DE,HL
                    ushort de = r.DE;
                    r.DE = r.HL;
                    r.HL = de;
                }
            }

            return(new ExecutionResult(package, null));
        }
Example #2
0
        public void EX_AF_AF()
        {
            Registers.AF = 0x80;
            Registers.ExchangeAF();
            Registers.AF = 0x90;
            Registers.ExchangeAF();

            ExecuteInstruction("EX AF,AF'");
            Assert.That(CPU.Registers.AF == 0x90);

            ExecuteInstruction("EX AF,AF'");
            Assert.That(CPU.Registers.AF == 0x80);
        }