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

            int result = 0x00 - r.A;

            flags = FlagLookup.ByteArithmeticFlags(0x00, r.A, false, true);
            flags.ParityOverflow = r.A == 0x80;
            flags.Carry          = r.A != 0x00;
            r.A = (byte)result;

            return(new ExecutionResult(package, flags));
        }
Beispiel #2
0
        public ExecutionResult Execute(Processor cpu, InstructionPackage package)
        {
            Instruction     instruction = package.Instruction;
            InstructionData data        = package.Data;
            Registers       r           = cpu.Registers;
            byte            offset      = data.Argument1;
            Flags           flags       = cpu.Flags;

            if (instruction.TargetsWordRegister)
            {
                // inc 16-bit
                WordRegister register = instruction.Target.AsWordRegister();
                ushort       value    = r[register];
                r[register] = (ushort)(value + 1);
            }
            else
            {
                byte value = 0;
                if (instruction.TargetsByteInMemory)
                {
                    // inc byte in memory
                    if (instruction.IsIndexed)
                    {
                        cpu.Timing.InternalOperationCycle(5);
                    }
                    value = instruction.MarshalSourceByte(data, cpu, out ushort address, out ByteRegister source);
                    cpu.Memory.Timed.WriteByteAt(address, (byte)(value + 1));
                }
                else
                {
                    // it's an 8-bit inc
                    ByteRegister register = instruction.Target.AsByteRegister();
                    value       = r[register];
                    r[register] = (byte)(value + 1);
                }

                bool carry = flags.Carry;
                flags = FlagLookup.ByteArithmeticFlags(value, 1, false, false);
                flags.ParityOverflow = (value == 0x7F);
                flags.Carry          = carry; // always unaffected
                flags.Subtract       = false;
            }

            return(new ExecutionResult(package, flags));
        }
Beispiel #3
0
        public static (byte Result, Flags Flags) Add(byte left, byte right, bool carry)
        {
            Flags flags = FlagLookup.ByteArithmeticFlags(left, right, carry, false);

            return((byte)(left + right + (carry ? 1 : 0)), flags);
        }
Beispiel #4
0
        public static (byte Result, Flags Flags) Subtract(byte left, byte right, bool carry)
        {
            Flags flags = FlagLookup.ByteArithmeticFlags(left, right, carry, true);

            return((byte)(left - right - (carry ? 1 : 0)), flags);
        }