public static void BRZ(StatusRegister statusRegister, ProgramCounter programCounter, Registers registers)
 {
     if (statusRegister.zero)
     {
         programCounter.programCounter = registers.R[7];
     }
 }
 public static void BRN(StatusRegister statusRegister, ProgramCounter programCounter, Registers registers)
 {
     if (statusRegister.negative)
     {
         programCounter.programCounter = registers.R[7];
     }
 }
 public static void BRO(StatusRegister statusRegister, ProgramCounter programCounter, Registers registers)
 {
     if (statusRegister.overflow)
     {
         programCounter.programCounter = registers.R[7];
     }
 }
 public static void BRC(StatusRegister statusRegister, ProgramCounter programCounter, Registers registers)
 {
     if (statusRegister.carry)
     {
         programCounter.programCounter = registers.R[7];
     }
 }
 public static void NEG(Accumulator accumulator, StatusRegister statusRegister)
 {
     int operator1 = accumulator.accumulator;
     byte operator1MSB = (byte)((int)operator1 >> 7);
     accumulator.accumulator = (byte)~accumulator.accumulator;
     accumulator.accumulator++;
     byte resMSB = (byte)((int)accumulator.accumulator >> 7);
     statusRegister.overflow = (operator1MSB == 0) && (0 != resMSB);
     statusRegister.carry = ((operator1 + 1) > 255);
     setNegativeAndZeroFlags(accumulator, statusRegister);
 }
 public static void ADDC(Accumulator accumulator, Registers registers, byte registerAddress, StatusRegister statusRegister)
 {
     ushort operator1 = accumulator.accumulator;
     ushort operator2 = registers.R[registerAddress];
     byte operator1MSB = (byte)((int)operator1 >> 7);
     byte operator2MSB = (byte)((int)operator2 >> 7);
     accumulator.accumulator = (byte)((int)operator1 + operator2 + Convert.ToUInt16(statusRegister.carry));
     byte resMSB = (byte)((int)accumulator.accumulator >> 7);
     statusRegister.overflow = (operator1MSB == operator2MSB) && (operator2MSB != resMSB);
     statusRegister.carry = ((operator1 + operator2 + Convert.ToUInt16(statusRegister.carry)) > 255);
     setNegativeAndZeroFlags(accumulator, statusRegister);
 }
 public static void NOT(Accumulator accumulator, StatusRegister statusRegister)
 {
     accumulator.accumulator = (byte)~accumulator.accumulator;
     resetCarryAndOverflow(statusRegister);
     setNegativeAndZeroFlags(accumulator, statusRegister);
 }
 public static void LDI(Accumulator accumulator, byte constant, StatusRegister statusRegister)
 {
     accumulator.accumulator = constant;
     resetCarryAndOverflow(statusRegister);
     setNegativeAndZeroFlags(accumulator, statusRegister);
 }
 public static void LDArf(Accumulator accumulator, Registers registers, byte registerAddress, StatusRegister statusRegister)
 {
     accumulator.accumulator = registers.R[registerAddress];
     resetCarryAndOverflow(statusRegister);
     setNegativeAndZeroFlags(accumulator, statusRegister);
 }
 public static void LDAaddr(Accumulator accumulator, Memory memory, byte address, StatusRegister statusRegister)
 {
     accumulator.accumulator = memory.memory[address];
     resetCarryAndOverflow(statusRegister);
     setNegativeAndZeroFlags(accumulator, statusRegister);
 }
 private static void setNegativeAndZeroFlags(Accumulator accumulator, StatusRegister statusRegister)
 {
     statusRegister.negative = (accumulator.accumulator & 128) == 128;
     statusRegister.zero = accumulator.accumulator == 0;
 }
 private static void resetCarryAndOverflow(StatusRegister statusRegister)
 {
     statusRegister.carry = false;
     statusRegister.overflow = false;
 }
 public static void VADD(Accumulator accumulator, VectorAdderBuffer vectorAdderBuffer, VectorStack vectorStack0, VectorStack vectorStack1, StatusRegister statusRegister)
 {
     ushort operator1 = vectorStack0.pop();
     ushort operator2 = vectorStack1.pop();
     byte operator1MSB = (byte)((int)operator1 >> 7);
     byte operator2MSB = (byte)((int)operator2 >> 7);
     accumulator.accumulator = (byte)((int)operator1 + operator2);
     byte resMSB = (byte)((int)accumulator.accumulator >> 7);
     statusRegister.overflow = (operator1MSB == operator2MSB) && (operator2MSB != resMSB);
     statusRegister.carry = ((operator1 + operator2) > 255);
     setNegativeAndZeroFlags(accumulator, statusRegister);
     vectorAdderBuffer.vectorAdderBuffer = (byte)((int)vectorStack0.pop() + vectorStack1.pop());
 }
 public static void SUB(Accumulator accumulator, Registers registers, byte registerAddress, StatusRegister statusRegister)
 {
     int operator1 = accumulator.accumulator;
     int operator2 = registers.R[registerAddress];
     operator2 = ~operator2++;
     byte accMSb = (byte)((int)accumulator.accumulator >> 7);
     byte regMSb = (byte)((int)registers.R[registerAddress] >> 7);
     accumulator.accumulator += (byte)operator2;
     if (statusRegister.carry)
     {
         accumulator.accumulator++;
     }
     byte resMSb = (byte)((int)accumulator.accumulator >> 7);
     statusRegister.overflow = (accMSb == regMSb) && (resMSb != accMSb);
     statusRegister.carry = ((operator1 + operator2) > 255);
     setNegativeAndZeroFlags(accumulator, statusRegister);
 }
 public static void RRC(Accumulator accumulator, StatusRegister statusRegister)
 {
     byte accLSB = (byte)((int)accumulator.accumulator & 1);
     accumulator.accumulator >>= 1;
     accumulator.accumulator |= (byte)(statusRegister.carry ? 255 : 0);
     statusRegister.carry = accLSB == 1;
     setNegativeAndZeroFlags(accumulator, statusRegister);
 }
 public static void RLC(Accumulator accumulator, StatusRegister statusRegister)
 {
     byte accMSB = (byte)((int)accumulator.accumulator >> 7);
     accumulator.accumulator <<= 1;
     accumulator.accumulator |= (byte)(statusRegister.carry ? 1 : 0);
     statusRegister.carry = accMSB == 1;
     setNegativeAndZeroFlags(accumulator, statusRegister);
 }