コード例 #1
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            var operationAddress = addressingMode.GetAddress(memory, registers, operand1, operand2, out bool pageBoundaryCrossed);

            registers.PC = operationAddress;

            return((byte)(opCodeDefinition.ExecutionCycles + (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross && pageBoundaryCrossed ? 1 : 0)));
        }
コード例 #2
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            var operationValue = memory.Stack.Span[++registers.SP];

            registers.PS = (byte)((registers.PS & 0x30) | (operationValue & 0xCF));

            return(opCodeDefinition.ExecutionCycles);
        }
コード例 #3
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            registers.N_NegativeFlag = (byte)((registers.X & 0x80) >> 7);
            registers.Z_ZeroFlag     = (byte)(registers.X == 0 ? 1 : 0);

            registers.A = registers.X;

            return(opCodeDefinition.ExecutionCycles);
        }
コード例 #4
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            var pcLow  = (byte)(memory.Stack.Span[++registers.SP] + 1);
            var pcHigh = memory.Stack.Span[++registers.SP];

            registers.PC = (ushort)(pcLow | pcHigh << 0x08);

            return(opCodeDefinition.ExecutionCycles);
        }
コード例 #5
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            var operationValue = addressingMode.GetValue(memory, registers, operand1, operand2, out bool pageBoundaryCrossed);

            registers.N_NegativeFlag = (byte)((operationValue & 0x80) >> 7);
            registers.Z_ZeroFlag     = (byte)(operationValue == 0 ? 1 : 0);

            registers.X = operationValue;

            return((byte)(opCodeDefinition.ExecutionCycles + (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross && pageBoundaryCrossed ? 1 : 0)));
        }
コード例 #6
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            var pageBoundaryCrossed = false;

            if (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross)
            {
                addressingMode.GetAddress(memory, registers, operand1, operand2, out pageBoundaryCrossed);
            }

            return((byte)(opCodeDefinition.ExecutionCycles + (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross && pageBoundaryCrossed ? 1 : 0)));
        }
コード例 #7
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            var operationValue = memory.Stack.Span[++registers.SP];

            registers.N_NegativeFlag = (byte)((operationValue & 0x80) >> 7);
            registers.Z_ZeroFlag     = (byte)(operationValue == 0 ? 1 : 0);

            registers.A = operationValue;

            return(opCodeDefinition.ExecutionCycles);
        }
コード例 #8
0
        public string GetSyntax(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            if (opCodeDefinition.AddressingMode == AddressingMode.IMM)
            {
                return(string.Empty);
            }
            else
            {
                var operationValue = addressingMode.GetValue(memory, registers, operand1, operand2, out _);

                return($"= {operationValue:X02}");
            }
        }
コード例 #9
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            var operationAddress = addressingMode.GetAddress(memory, registers, operand1, operand2, out _);
            var operationValue   = addressingMode.GetValue(memory, registers, operationAddress);

            var result = operationValue + 1;

            registers.N_NegativeFlag = (byte)((result & 0x80) >> 7);
            registers.Z_ZeroFlag     = (byte)((byte)result == 0 ? 1 : 0);

            addressingMode.SetValue(memory, registers, operationAddress, (byte)result);

            return(opCodeDefinition.ExecutionCycles);
        }
コード例 #10
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            var operationAddress = addressingMode.GetAddress(memory, registers, operand1, operand2, out bool pageBoundaryCrossed);

            var branchTaken = false;

            if (registers.N_NegativeFlag == 0)
            {
                registers.PC = operationAddress;

                branchTaken = true;
            }

            return((byte)(opCodeDefinition.ExecutionCycles + (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross && pageBoundaryCrossed && branchTaken ? 1 : 0) + (branchTaken ? 1 : 0)));
        }
コード例 #11
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            var operationAddress = addressingMode.GetAddress(memory, registers, operand1, operand2, out bool pageBoundaryCrossed);
            var operationValue   = addressingMode.GetValue(memory, registers, operationAddress);

            var result = operationValue << 1 | registers.C_CarryFlag;

            registers.N_NegativeFlag = (byte)((result & 0x80) >> 7);
            registers.C_CarryFlag    = (byte)((operationValue & 0x80) >> 7);
            registers.Z_ZeroFlag     = (byte)((byte)result == 0x00 ? 1 : 0);

            addressingMode.SetValue(memory, registers, operationAddress, (byte)result);

            return((byte)(opCodeDefinition.ExecutionCycles + (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross && pageBoundaryCrossed ? 1 : 0)));
        }
コード例 #12
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            var operationValue = addressingMode.GetValue(memory, registers, operand1, operand2, out bool pageBoundaryCrossed);

            var result = registers.A - operationValue - (1 - registers.C_CarryFlag);

            registers.N_NegativeFlag = (byte)((result & 0x80) >> 7);
            registers.Z_ZeroFlag     = (byte)((byte)result == 0 ? 1 : 0);
            registers.C_CarryFlag    = (byte)(result >= 0x00 ? 1 : 0);
            registers.V_OverflowFlag =
                (byte)((result < 0x80 && registers.A >= 0x80) ||
                       (result >= 0x80 && registers.A < 0x80) ? 1 : 0);

            registers.A = (byte)result;

            return((byte)(opCodeDefinition.ExecutionCycles + (opCodeDefinition.AddExecutionCycleOnPageBoundaryCross && pageBoundaryCrossed ? 1 : 0)));
        }
コード例 #13
0
 public string GetSyntax(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
 {
     return(string.Empty);
 }
コード例 #14
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            registers.C_CarryFlag = 0;

            return(opCodeDefinition.ExecutionCycles);
        }
コード例 #15
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            registers.I_InterruptDisable = 1;

            return(opCodeDefinition.ExecutionCycles);
        }
コード例 #16
0
        public byte Execute(OpCodeDefinition opCodeDefinition, IAddressingMode addressingMode, CPUMemory memory, CPURegisters registers, byte operand1, byte operand2)
        {
            memory.Stack.Span[registers.SP--] = (byte)(registers.PS | (1 << 4) | (1 << 5));

            return(opCodeDefinition.ExecutionCycles);
        }