Advertisement
gasolinewaltz

4241.cpp

Nov 3rd, 2011
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #include "4241.h"
  4.  
  5.  
  6. void Chip_4241::read_instruction(){
  7.    
  8.     // 1 byte instructions
  9.     /// These instructions preform operations on the registers, each made up of four bits.
  10.     switch ( CELL[ pc ].SLOT ) {
  11.         case 0: // HAULT
  12.             HAULT = true;
  13.             break;
  14.         case 1: // ADD
  15.             A.REG = A.REG + B.REG;
  16.             pc++;
  17.             break;
  18.         case 2: // SUBTRACT
  19.             A.REG = A.REG - B.REG;
  20.             pc++;
  21.             break;
  22.         case 3: // INCREMENT REGISTER A
  23.             A.REG = A.REG + 1;
  24.             pc++;
  25.             break;
  26.         case 4: // INCREMENT REGISTER B
  27.             B.REG = B.REG + 1;
  28.             pc++;
  29.             break;
  30.         case 5: // DECREMENT REGISTER A
  31.             A.REG = A.REG - 1;
  32.             pc++;
  33.             break;
  34.         case 6: // DECREMENT REGISTER B
  35.             B.REG = B.REG - 1;
  36.             pc++;
  37.             break;
  38.         case 7: // SWAP REGISTERS
  39.             unsigned char dummy = A.REG;
  40.             A.REG = B.REG;
  41.             B.REG = dummy;
  42.             pc++;
  43.             break;
  44.     }
  45.     /*2 byte instructions
  46.      These instructions preform operations on the memory cell next in line.
  47.      read_instruction() will take a two byte instruction, increase the program counter,
  48.      manipulate this value and then increase the program counter again.
  49.    
  50.     ex:
  51.     address
  52.         \ _   0     1     2
  53.             [ 8 ] [ 6 ] [ 0 ]
  54.            PC-^
  55.     executes as follows:
  56.         PC @ MEM 0: read_instruction() executes the content of CELL[0], which is 8 a two byte instruction, or print. PC increases.
  57.         PC @ MEM 1: read_instruction() uses this value to print. PC increases.
  58.         PC @ MEM 2: read_instruction() executes the content of CELL[2], 0. program haults.
  59.     */
  60.     switch ( CELL[ pc ].SLOT ){
  61.         case 8: // PRINT <DATA>
  62.             pc++;
  63.             std::cout <<  CELL[pc].SLOT << '\n';
  64.             pc++;
  65.             break;
  66.         case 9: // LOAD ADDRESS OF VALUE <DATA> INTO REGISTER A
  67.             pc++;
  68.             A.REG = CELL[pc].SLOT;
  69.             pc++;
  70.             break;
  71.         case 10: // LOAD ADDRESS OF VALUE <DATA> INTO REGISTER B
  72.             pc++;
  73.             B.REG = CELL[pc].SLOT;
  74.             pc++;
  75.             break;
  76.         case 11:  // STORE REGISTER A INTO ADDRESS <DATA>
  77.             pc++;
  78.             CELL[pc].SLOT = A.REG;
  79.             pc++;
  80.             break;
  81.         case 12:  // STORE REGISTER B    INTO ADDRESS <DATA>
  82.             pc++;
  83.             CELL[pc].SLOT = B.REG;
  84.             pc++;
  85.             break;
  86.         case 13: // JUMP TO ADDRESS <DATA>
  87.             pc++;
  88.             pc = CELL[ pc ].SLOT;
  89.             break;
  90.         case 14: // JUMP TO ADDRESS <DATA> IF REGISTER A == 0
  91.             pc++;
  92.             if( A.REG == 0 )
  93.                 pc = CELL[ pc ].SLOT;
  94.             else
  95.                 pc++;
  96.             break;
  97.         case 15:  // JUMP TO ADDRESS <DATA> IF REGISTER A != 0
  98.             pc++;
  99.             if( A.REG != 0 )
  100.                 pc = CELL[ pc ].SLOT;
  101.             else
  102.                 pc++;
  103.             break;
  104.     }
  105. }
  106.    
  107. void Chip_4241::debug(){
  108.     std::cout <<  "\nRegister A: " <<  this->A.REG << '\n'
  109.         << "Register B: " << this->B.REG << '\n'
  110.         << "Program Counter: " << this->pc <<'\n'
  111.         << "Hault Flag: " << this->HAULT << '\n';
  112.  
  113. }
  114.  
  115.  
  116.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement