Don't like ads? PRO users don't see any ads ;-)
Guest

ADD

By: a guest on Aug 4th, 2012  |  syntax: C++  |  size: 7.49 KB  |  hits: 15  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1.             case InstructionSet::ADD:
  2.                 if ((instruction.isRegisterInPosition(0) || instruction.isRegisterInPosition(1)) && (instruction.numOprands > 1)) {
  3.                     Registers reg = Registers::UNKNOWN;
  4.                     Registers reg1 = Registers::UNKNOWN;
  5.                     RegisterSizes regSize = RegisterSizes::ZERO;
  6.                     RegisterSizes regSize1 = RegisterSizes::ZERO;
  7.                     Byte* data = nullptr;
  8.                     Byte* data1 = nullptr;
  9.                    
  10.                     if (instruction.isRegisterInPosition(0)) {
  11.                         reg = Registers(instruction.args[0].doubleWord);
  12.                         regSize = registerToSize(reg);
  13.                     } else {
  14.                         std::cerr<<"ElectroCraft CPU: Invaid arguments for ADD!"<<std::endl;
  15.                         break;
  16.                     }
  17.                    
  18.                     if (instruction.isRegisterInPosition(1)) {
  19.                         reg1 = Registers(instruction.args[1].doubleWord);
  20.                         regSize1 = registerToSize(reg1);
  21.                     } else {
  22.                         data1 = doubleWordToBytes(instruction.args[1]);
  23.                     }
  24.                    
  25.                     if (reg != Registers::UNKNOWN) {
  26.                         switch (regSize) {
  27.                             case RegisterSizes::FOUR:
  28.                                 data = memory->readData(getRegisterData(reg), 4);
  29.                                 break;
  30.                             case RegisterSizes::TWO:
  31.                                 data = memory->readData(getRegisterData(reg), 2);
  32.                             case RegisterSizes::ONE:
  33.                                 data = memory->readData(getRegisterData(reg), 1);
  34.                             default:
  35.                                 break;
  36.                         }
  37.                     } else {
  38.                         std::cerr<<"ElectroCraft CPU: Invaid arguments for ADD!"<<std::endl;
  39.                         break;
  40.                     }
  41.                    
  42.                     if (reg1 != Registers::UNKNOWN) {
  43.                         switch (regSize1) {
  44.                             case RegisterSizes::FOUR:
  45.                                 data1 = memory->readData(getRegisterData(reg1), 4);
  46.                                 break;
  47.                             case RegisterSizes::TWO:
  48.                                 data1 = memory->readData(getRegisterData(reg1), 2);
  49.                             case RegisterSizes::ONE:
  50.                                 data1 = memory->readData(getRegisterData(reg1), 1);
  51.                             default:
  52.                                 break;
  53.                         }
  54.                     }
  55.                    
  56.                     if(data != nullptr && data1 != nullptr) {
  57.                         if (regSize != RegisterSizes::ZERO && regSize1 != RegisterSizes::ZERO) {
  58.                             if (regSize == RegisterSizes::FOUR || regSize1 == RegisterSizes::FOUR) {
  59.                                 DoubleWord result;
  60.                                 if (regSize < regSize1) {
  61.                                     std::cerr<<"ElectroCraft CPU: Invaid arguments for ADD: First register too small for storage!"<<std::endl;
  62.                                 } else if(regSize > regSize1) {
  63.                                     DoubleWord value = readDoubleWord(data);
  64.                                     if (regSize == RegisterSizes::TWO) {
  65.                                         DoubleWord::Word value1 = readWord(data);
  66.                                         result.doubleWord = value.doubleWord + value1.lowWord.word;
  67.                                     } else {
  68.                                         result.doubleWord = value.doubleWord + data1[0];
  69.                                     }
  70.                                     memory->writeData(getRegisterData(reg), 4, doubleWordToBytes(result));
  71.                                 } else {
  72.                                     DoubleWord value = readDoubleWord(data);
  73.                                     DoubleWord value1 = readDoubleWord(data1);
  74.                                     result.doubleWord = value.doubleWord + value1.doubleWord;
  75.                                     memory->writeData(getRegisterData(reg), 4, doubleWordToBytes(result));
  76.  
  77.                                 }
  78.                             } else if (regSize == RegisterSizes::TWO || regSize1 == RegisterSizes::TWO) {
  79.                                 DoubleWord::Word result;
  80.                                 if (regSize < regSize1) {
  81.                                     std::cerr<<"ElectroCraft CPU: Invaid arguments for ADD: First register too small for storage!"<<std::endl;
  82.                                 } else if(regSize > regSize1) {
  83.                                     DoubleWord::Word value = readWord(data);
  84.                                     result.lowWord.word = value.lowWord.word + data1[0];
  85.                                     memory->writeData(getRegisterData(reg), 2, wordToBytes(result));
  86.                                 } else {
  87.                                     DoubleWord::Word value = readWord(data);
  88.                                     DoubleWord::Word value1 = readWord(data1);
  89.                                     result.lowWord.word = value.lowWord.word + value1.lowWord.word;
  90.                                     memory->writeData(getRegisterData(reg), 2, wordToBytes(result));
  91.                                 }
  92.                             } else {
  93.                                 Byte result = data[0] + data1[0];
  94.                                 memory->writeData(getRegisterData(reg), 1, &result);
  95.                             }
  96.                         } else if (regSize != RegisterSizes::ZERO && data1 != nullptr) {
  97.                             DoubleWord result;
  98.                             if (regSize == RegisterSizes::FOUR) {
  99.                                 DoubleWord value = readDoubleWord(data);
  100.                                 result.doubleWord = value.doubleWord + readDoubleWord(data1).doubleWord;
  101.                                 memory->writeData(getRegisterData(reg), 4, doubleWordToBytes(result));
  102.                             } else if (regSize == RegisterSizes::TWO) {
  103.                                 DoubleWord::Word value = readWord(data);
  104.                                 result.word.lowWord.word = value.lowWord.word + readDoubleWord(data1).doubleWord;
  105.                                 memory->writeData(getRegisterData(reg), 2, wordToBytes(result.word));
  106.                             } else if (regSize == RegisterSizes::ONE) {
  107.                                 result.word.lowWord.byte.lowByte = data[0] + readDoubleWord(data1).doubleWord;
  108.                                 memory->writeData(getRegisterData(reg), 1, static_cast<Byte*>(&result.word.lowWord.byte.lowByte));
  109.                             } else {
  110.                                 std::cerr<<"ElectroCraft CPU: Invaid arguments for ADD!"<<std::endl;
  111.                             }
  112.                         } else {
  113.                             std::cerr<<"ElectroCraft CPU: Invaid arguments for ADD!"<<std::endl;
  114.                         }
  115.                        
  116.                     } else {
  117.                         std::cerr<<"ElectroCraft CPU: Invaid arguments for ADD!"<<std::endl;
  118.                     }
  119.                 } else {
  120.                     std::cerr<<"ElectroCraft CPU: Invaid arguments for ADD!"<<std::endl;
  121.                 }
  122.                 break;