Guest User

Untitled

a guest
May 23rd, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 KB | None | 0 0
  1. void Emulator::callOpcode(int pos)
  2. {
  3.     char byte1 = memory[pos];
  4.     char byte2 = memory[pos + 1];
  5.  
  6.     opcode = (byte1 << 8) | byte2;
  7.  
  8.    
  9.     char x;
  10.     char y;
  11.  
  12.     switch(opcode & 0xF000)
  13.     {
  14.     case(0x0000):
  15.         //Calls RCA 1802 program at address NNN.
  16.         break;
  17.  
  18.     case(0x1000):
  19.         //Jumps to address NNN.
  20.         opcode_pos = opcode & 0x0FFF;
  21.         break;
  22.  
  23.     case (0x2000):
  24.         //Calls subroutine at NNN.
  25.         callOpcode(opcode & 0x0FFF);
  26.         break;
  27.  
  28.     case(0x6000):
  29.         //Sets VX to NN.
  30.         x = opcode & 0x0F00;
  31.         registers[x] = opcode & 0x00FF;
  32.         nextOpCode();
  33.         break;
  34.  
  35.     case(0x7000):
  36.         //Sets VX to NN.
  37.         x = opcode & 0x0F00;
  38.         registers[x] += (int)opcode &0x00FF;
  39.         nextOpCode();
  40.         break;
  41.  
  42.     case(0x8000):
  43.         /*
  44.         8XY0    Sets VX to the value of VY.
  45.         8XY1    Sets VX to VX or VY.
  46.         8XY2    Sets VX to VX and VY.
  47.         8XY3    Sets VX to VX xor VY.
  48.         8XY4    Adds VY to VX. VF is set to 1 when there's a carry, and to 0 when there isn't.
  49.         8XY5    VY is subtracted from VX. VF is set to 0 when there's a borrow, and 1 when there isn't.
  50.         8XY6    Shifts VX right by one. VF is set to the value of the least significant bit of VX before the shift.[2]
  51.         8XY7    Sets VX to VY minus VX. VF is set to 0 when there's a borrow, and 1 when there isn't.
  52.         */
  53.  
  54.         x = opcode & 0x0F00;
  55.         y = opcode & 0x00F0;
  56.  
  57.         char *reg   = &registers[x];
  58.         char *reg2  = &registers[y];
  59.  
  60.         switch(opcode & 0x000F)
  61.         {
  62.         case 0x0000:
  63.             *reg = *reg2;
  64.             break;
  65.         case 0x0001:
  66.             *reg = *reg | *reg2;
  67.             break;
  68.         case 0x0002:
  69.             *reg = *reg & *reg2;
  70.             break;
  71.         case 0x0003:
  72.             *reg = *reg ^ *reg2;
  73.             break;
  74.         case 0x0004:
  75.             *reg += *reg2;
  76.             break;
  77.         case 0x0005:
  78.             *reg -= *reg2;
  79.             break;
  80.         case 0x0006:
  81.             *reg = *reg >> 1;
  82.             break;
  83.         case 0x0007:
  84.             *reg = *reg2 - *reg;
  85.             break;
  86.         case 0x0008:
  87.             *reg = *reg << 1;
  88.             break;
  89.         }
  90.         nextOpCode();
  91.         break;
  92.     }
  93. }
Add Comment
Please, Sign In to add comment