// Copyright 2011-2012 Paulo Augusto Peccin. See licence.txt distributed with this file. package org.javatari.general.m6502.instructions; import org.javatari.general.m6502.Instruction; import org.javatari.general.m6502.M6502; import org.javatari.general.m6502.OperandType; public final class AND extends Instruction { public AND(M6502 cpu, int type) { super(cpu); this.type = type; } @Override public int fetch() { if (type == OperandType.IMM) { ea = cpu.fetchImmediateAddress(); return 2; } if (type == OperandType.Z_PAGE) { ea = cpu.fetchZeroPageAddress(); return 3; } if (type == OperandType.Z_PAGE_X) { ea = cpu.fetchZeroPageXAddress(); return 4; } if (type == OperandType.ABS) { ea = cpu.fetchAbsoluteAddress(); return 4; } if (type == OperandType.ABS_X) { ea = cpu.fetchAbsoluteXAddress(); return 4 + (cpu.pageCrossed?1:0); } if (type == OperandType.ABS_Y) { ea = cpu.fetchAbsoluteYAddress(); return 4 + (cpu.pageCrossed?1:0); } if (type == OperandType.IND_X) { ea = cpu.fetchIndirectXAddress(); return 6; } if (type == OperandType.IND_Y) { ea = cpu.fetchIndirectYAddress(); return 5 + (cpu.pageCrossed?1:0); } throw new IllegalStateException("AND Invalid Operand Type: " + type); } @Override public void execute() { final byte val = (byte) (cpu.A & cpu.bus.readByte(ea)); cpu.A = val; cpu.ZERO = val == 0; cpu.NEGATIVE = val < 0; } private final int type; private int ea; public static final long serialVersionUID = 1L; }