// Path: src/main/java/uk/co/skyem/projects/emuZ80/cpu/Register.java
// public static class Register16 extends Register<Short> {
// 
// 	public static final int SIZE = Short.SIZE;
// 
// 	private final Register8 lower;
// 	private final Register8 upper;
// 
// 	public Register16() {
// 		this(new Register8(), new Register8());
// 	}
// 
// 	public Register16(Register8 upper, Register8 lower) {
// 		this.lower = lower;
// 		this.upper = upper;
// 	}
// 
// 	@Override
// 	public boolean getFlag(long flag) {
// 		if (flag > 127) {
// 			return upper.getFlag(flag >>> 8);
// 		} else {
// 			return lower.getFlag(flag);
// 		}
// 	}
// 
// 	@Override
// 	public void setFlag(long flag, boolean value) {
// 		if (flag > 127) {
// 			upper.setFlag(flag >>> 8, value);
// 		} else {
// 			lower.setFlag(flag, value);
// 		}
// 	}
// 
// 	@Override
// 	public void toggleFlag(long flag) {
// 		if (flag > 127) {
// 			upper.toggleFlag(flag >>> 8);
// 		} else {
// 			lower.toggleFlag(flag);
// 		}
// 	}
// 
// 	@Override
// 	public Short getData() {
// 		return (short) ((lower.getData() & 0xFF) | upper.getData() << 8);
// 	}
// 
// 	@Override
// 	public void setData(Short data) {
// 		byte data1 = (byte) (data & 0xFF);
// 		byte data2 = (byte) (data >>> 8);
// 		lower.setData(data1);
// 		upper.setData(data2);
// 	}
// 
// 	@Override
// 	public void setData(Register<?> register) {
// 		setData((Short) register.getData());
// 	}
// 
// 	@Override
// 	public void increment() {
// 		increment((short)1);
// 	}
// 
// 	@Override
// 	public void decrement() {
// 		decrement((short)1);
// 	}
// 
// 	@Override
// 	public void increment(Short value) {
// 		setData((short) ((getData() + value) & 0xFFFF));
// 	}
// 
// 	@Override
// 	public void decrement(Short value) {
// 		setData((short) ((getData() - value) & 0xFFFF));
// 	}
// 
// 	@Override
// 	public void clear() {
// 		setData((short) 0);
// 	}
// 
// 	@Override
// 	public void rotate(int amount) {
// 		setData(ALU.rotate(getData(), SIZE, amount));
// 	}
// 
// 	@Override
// 	public int getSize() {
// 		return SIZE;
// 	}
// }
// 
// Path: src/main/java/uk/co/skyem/projects/emuZ80/cpu/Register.java
// public static class Register8 extends Register<Byte> {
// 
// 	public byte data;
// 	public static final int SIZE = Byte.SIZE;
// 
// 	@Override
// 	public boolean getFlag(long flag) {
// 		return (data & flag) != 0;
// 	}
// 
// 	@Override
// 	public void setFlag(long flag, boolean value) {
// 		if (value) {
// 			data = (byte) (data | flag);
// 		} else {
// 			data = (byte) (data & ~flag);
// 		}
// 	}
// 
// 	@Override
// 	public void toggleFlag(long flag) {
// 		data = (byte) (data ^ flag);
// 	}
// 
// 	@Override
// 	public Byte getData() {
// 		return data;
// 	}
// 
// 	@Override
// 	public void setData(Byte data) {
// 		this.data = data;
// 	}
// 
// 	@Override
// 	public void setData(Register<?> register) {
// 		setData((Byte) register.getData());
// 	}
// 
// 	@Override
// 	public void increment() {
// 		++data;
// 	}
// 
// 	@Override
// 	public void decrement() {
// 		--data;
// 	}
// 
// 	@Override
// 	public void increment(Byte value) {
// 		setData((byte) (getData() + value));
// 	}
// 
// 	@Override
// 	public void decrement(Byte value) {
// 		setData((byte) (getData() - value));
// 	}
// 
// 	@Override
// 	public void clear() {
// 		setData((byte) 0);
// 	}
// 
// 	@Override
// 	public void rotate(int amount) {
// 		setData(ALU.rotate(getData(), SIZE, amount));
// 	}
// 
// 	@Override
// 	public int getSize() {
// 		return SIZE;
// 	}
// }


import uk.co.skyem.projects.emuZ80.cpu.Register.Register16;
import uk.co.skyem.projects.emuZ80.cpu.Register.Register8;
	 * Invert the carry flag
	 **/
	public void invertCarry(byte regA) {

		flags.setFlag(Flags.HALF_CARRY, flags.getFlag(Flags.CARRY));
		flags.toggleFlag(Flags.CARRY);
		flags.setFlag(Flags.ADD_SUB, false);

		flags.setFlag(Flags.X_3, getBit(regA, 3));
		flags.setFlag(Flags.X_5, getBit(regA, 5));
	}

	public byte and8(byte a, byte b, int flagControl) {
		byte r = (byte) (a & b);
		bitOpFlags(flagControl, r, true);
		return r;
	}

	public byte xor8(byte a, byte b, int flagControl) {
		byte r = (byte) (a ^ b);
		bitOpFlags(flagControl, r, false);
		return r;
	}

	public byte or8(byte a, byte b, int flagControl) {
		byte r = (byte) (a | b);
		bitOpFlags(flagControl, r, false);
		return r;
	}

// Path: src/main/java/uk/co/skyem/projects/emuZ80/cpu/Register.java
// public static class Register16 extends Register<Short> {
// 
// 	public static final int SIZE = Short.SIZE;
// 
// 	private final Register8 lower;
// 	private final Register8 upper;
// 
// 	public Register16() {
// 		this(new Register8(), new Register8());
// 	}
// 
// 	public Register16(Register8 upper, Register8 lower) {
// 		this.lower = lower;
// 		this.upper = upper;
// 	}
// 
// 	@Override
// 	public boolean getFlag(long flag) {
// 		if (flag > 127) {
// 			return upper.getFlag(flag >>> 8);
// 		} else {
// 			return lower.getFlag(flag);
// 		}
// 	}
// 
// 	@Override
// 	public void setFlag(long flag, boolean value) {
// 		if (flag > 127) {
// 			upper.setFlag(flag >>> 8, value);
// 		} else {
// 			lower.setFlag(flag, value);
// 		}
// 	}
// 
// 	@Override
// 	public void toggleFlag(long flag) {
// 		if (flag > 127) {
// 			upper.toggleFlag(flag >>> 8);
// 		} else {
// 			lower.toggleFlag(flag);
// 		}
// 	}
// 
// 	@Override
// 	public Short getData() {
// 		return (short) ((lower.getData() & 0xFF) | upper.getData() << 8);
// 	}
// 
// 	@Override
// 	public void setData(Short data) {
// 		byte data1 = (byte) (data & 0xFF);
// 		byte data2 = (byte) (data >>> 8);
// 		lower.setData(data1);
// 		upper.setData(data2);
// 	}
// 
// 	@Override
// 	public void setData(Register<?> register) {
// 		setData((Short) register.getData());
// 	}
// 
// 	@Override
// 	public void increment() {
// 		increment((short)1);
// 	}
// 
// 	@Override
// 	public void decrement() {
// 		decrement((short)1);
// 	}
// 
// 	@Override
// 	public void increment(Short value) {
// 		setData((short) ((getData() + value) & 0xFFFF));
// 	}
// 
// 	@Override
// 	public void decrement(Short value) {
// 		setData((short) ((getData() - value) & 0xFFFF));
// 	}
// 
// 	@Override
// 	public void clear() {
// 		setData((short) 0);
// 	}
// 
// 	@Override
// 	public void rotate(int amount) {
// 		setData(ALU.rotate(getData(), SIZE, amount));
// 	}
// 
// 	@Override
// 	public int getSize() {
// 		return SIZE;
// 	}
// }
// 
// Path: src/main/java/uk/co/skyem/projects/emuZ80/cpu/Register.java
// public static class Register8 extends Register<Byte> {
// 
// 	public byte data;
// 	public static final int SIZE = Byte.SIZE;
// 
// 	@Override
// 	public boolean getFlag(long flag) {
// 		return (data & flag) != 0;
// 	}
// 
// 	@Override
// 	public void setFlag(long flag, boolean value) {
// 		if (value) {
// 			data = (byte) (data | flag);
// 		} else {
// 			data = (byte) (data & ~flag);
// 		}
// 	}
// 
// 	@Override
// 	public void toggleFlag(long flag) {
// 		data = (byte) (data ^ flag);
// 	}
// 
// 	@Override
// 	public Byte getData() {
// 		return data;
// 	}
// 
// 	@Override
// 	public void setData(Byte data) {
// 		this.data = data;
// 	}
// 
// 	@Override
// 	public void setData(Register<?> register) {
// 		setData((Byte) register.getData());
// 	}
// 
// 	@Override
// 	public void increment() {
// 		++data;
// 	}
// 
// 	@Override
// 	public void decrement() {
// 		--data;
// 	}
// 
// 	@Override
// 	public void increment(Byte value) {
// 		setData((byte) (getData() + value));
// 	}
// 
// 	@Override
// 	public void decrement(Byte value) {
// 		setData((byte) (getData() - value));
// 	}
// 
// 	@Override
// 	public void clear() {
// 		setData((byte) 0);
// 	}
// 
// 	@Override
// 	public void rotate(int amount) {
// 		setData(ALU.rotate(getData(), SIZE, amount));
// 	}
// 
// 	@Override
// 	public int getSize() {
// 		return SIZE;
// 	}
// }


// Path: src/main/java/uk/co/skyem/projects/emuZ80/cpu/ALU.java
import uk.co.skyem.projects.emuZ80.cpu.Register.Register16;
import uk.co.skyem.projects.emuZ80.cpu.Register.Register8;

	 * Invert the carry flag
	 **/
	public void invertCarry(byte regA) {

		flags.setFlag(Flags.HALF_CARRY, flags.getFlag(Flags.CARRY));
		flags.toggleFlag(Flags.CARRY);
		flags.setFlag(Flags.ADD_SUB, false);

		flags.setFlag(Flags.X_3, getBit(regA, 3));
		flags.setFlag(Flags.X_5, getBit(regA, 5));
	}

	public byte and8(byte a, byte b, int flagControl) {
		byte r = (byte) (a & b);
		bitOpFlags(flagControl, r, true);
		return r;
	}

	public byte xor8(byte a, byte b, int flagControl) {
		byte r = (byte) (a ^ b);
		bitOpFlags(flagControl, r, false);
		return r;
	}

	public byte or8(byte a, byte b, int flagControl) {
		byte r = (byte) (a | b);
		bitOpFlags(flagControl, r, false);
		return r;
	}

	private void bitOpFlags(int flagControl, byte r, boolean isAnd) {