Пример #1
0
        public void LSR(OpcodeContainer container, ushort address)
        {
            switch (container.AddressingMode)
            {
            case AddressingModes.Accumulator:
                CPU.IsCarry = (CPU.Registers.A & 1) == 1;
                CPU.Registers.A.Write((byte)(CPU.Registers.A >> 1));

                CPU.IsNegative = false;
                this.HandleZero(CPU.Registers.A);
                break;

            default:
                var value = CPU.ReadByteAt(address);
                CPU.IsCarry = (value & 1) == 1;
                byte shiftedValue = (byte)(value >> 1);

                // Spin cycle for the work above.
                CPU.CycleFinished();
                CPU.WriteByteAt(address, shiftedValue);

                CPU.IsNegative = false;
                this.HandleZero(shiftedValue);
                break;
            }
        }
Пример #2
0
        public void BIT(OpcodeContainer container, ushort address)
        {
            var value = CPU.ReadByteAt(address);

            CPU.IsOverflowed = (value & 0x40) != 0;
            CPU.IsNegative   = (value & 0x80) != 0;
            CPU.IsZero       = (value & CPU.Registers.A) == 0;
        }
Пример #3
0
        public void AND(OpcodeContainer container, ushort address)
        {
            var value = CPU.ReadByteAt(address);

            var newValue = CPU.Registers.A & value;

            this.WriteByteToRegister(CPU.Registers.A, (byte)newValue, S: true, Z: true);

            //this.HandlePageBoundaryCrossed(container, isSamePage);
        }
Пример #4
0
        public void ORA(OpcodeContainer container, ushort address)
        {
            var value = CPU.ReadByteAt(address);

            CPU.Registers.A.Write((byte)(CPU.Registers.A | value));

            this.HandleNegative(CPU.Registers.A);
            this.HandleZero(CPU.Registers.A);

            // this.HandlePageBoundaryCrossed(container, isSamePage);
        }
Пример #5
0
        public static string GetAddressAsString(MOS6502 CPU, OpcodeContainer container)
        {
            if (container.Name == "RTS")
            {
                return("");
            }

            switch (container.AddressingMode)
            {
            case AddressingModes.Implied:
                return("");

            case AddressingModes.Accumulator:
                return("A");

            case AddressingModes.Indirect:
                return($"(${intermediateAddress:X4}) @ ${address:X4}");

            case AddressingModes.IndirectYWrite:
            case AddressingModes.IndirectY:
                return($"(${intermediateAddress:X2}),Y @ ${address:X4}");

            case AddressingModes.IndirectX:
                return($"(${intermediateAddress:X2},X) @ ${address:X4}");

            case AddressingModes.ZeroPage:
                return($"${address:X2}");

            case AddressingModes.ZeroPageX:
                return($"${intermediateAddress:X2},X @ ${address:X2}");

            case AddressingModes.ZeroPageY:
                return($"${intermediateAddress:X2},Y @ ${address:X2}");

            case AddressingModes.AbsoluteY:
                return($"${intermediateAddress:X4},Y @ ${address:X4}");

            case AddressingModes.AbsoluteX:
            case AddressingModes.AbsoluteXWrite:
                return($"${intermediateAddress:X4},X @ ${address:X4}");

            case AddressingModes.Absolute:
                return($"${address:X4}");

            case AddressingModes.Immediate:
                return($"#${operandValue:X2}");

            default:
                return($"0x{address:X4}");
            }
        }
Пример #6
0
        public static ushort GetAddressedOperand(MOS6502 CPU, OpcodeContainer container)
        {
            operandValue        = 0;
            intermediateAddress = 0;
            address             = 0;

            switch (container.AddressingMode)
            {
            case AddressingModes.Implied:
                address = 0x0000;
                CPU.CycleFinished();
                break;

            case AddressingModes.Accumulator:
                address = 0x0000;
                CPU.CycleFinished();
                break;

            case AddressingModes.Immediate:
                address = AddressingMode.GetImmediate(CPU);
                break;

            case AddressingModes.Absolute:
                address = AddressingMode.GetAbsolute(CPU);
                break;

            case AddressingModes.AbsoluteX:
                address = AddressingMode.GetAbsoluteX(CPU);
                break;

            case AddressingModes.AbsoluteXWrite:
                address = AddressingMode.GetAbsoluteXWrite(CPU);
                break;

            case AddressingModes.AbsoluteY:
                address = AddressingMode.GetAbsoluteY(CPU);
                break;

            case AddressingModes.Indirect:
                address = AddressingMode.GetIndirect(CPU);
                break;

            case AddressingModes.IndirectX:
                address = AddressingMode.GetIndirectX(CPU);
                break;

            case AddressingModes.IndirectY:
                address = AddressingMode.GetIndirectY(CPU);
                break;

            case AddressingModes.IndirectYWrite:
                address = AddressingMode.GetIndirectYWrite(CPU);
                break;

            case AddressingModes.ZeroPage:
                address = AddressingMode.GetZeroPage(CPU);
                break;

            case AddressingModes.ZeroPageX:
                address = AddressingMode.GetZeroPageX(CPU);
                break;

            case AddressingModes.ZeroPageY:
                address = AddressingMode.GetZeroPageY(CPU);
                break;

            case AddressingModes.Relative:
                address = AddressingMode.GetRelative(CPU);
                break;

            default:
                throw new InvalidOperationException();
            }

            if (MOS6502.IsDebug)
            {
                CPU.LastAccessedAddress = AddressingMode.GetAddressAsString(CPU, container);
            }

            return(address);
        }
Пример #7
0
 public void ROR(OpcodeContainer container, ushort address)
 {
     switch (container !.AddressingMode)
     {