Advertisement
Guest User

Untitled

a guest
Jun 25th, 2012
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.79 KB | None | 0 0
  1.  
  2. unsigned char cpunext(unsigned short opcode)
  3. {
  4. int w = 0;
  5. unsigned char screenUpdated = 0;
  6. unsigned char height = 0;
  7. unsigned char* image;
  8. int numOfLines = 0;
  9. switch ((opcode & 0xF000) >> 12)
  10. {
  11. case 0x0:
  12. if ((opcode & 0x00F0) >> 4 == 0xC)
  13. {
  14. numOfLines = opcode & 0x000F;
  15. SCHIP_ScrollScreenDown(numOfLines);
  16. screenUpdated = true;
  17. }
  18.  
  19. switch (opcode & 0x00FF)
  20. {
  21. case 0xE0:
  22. Screen_Clear();
  23. screenUpdated = true;
  24. break;
  25.  
  26. case 0xEE:
  27. PC = PopOffStack();
  28. break;
  29.  
  30. case 0xFB:
  31. SCHIP_ScrollScreenRight();
  32. screenUpdated = true;
  33. break;
  34.  
  35. case 0xFC:
  36. SCHIP_ScrollScreenLeft();
  37. screenUpdated = true;
  38. break;
  39.  
  40. case 0xFD:
  41. stop = true;
  42. break;
  43.  
  44. case 0xFE:
  45. mode = CHIP8_SCREEN;
  46. screenUpdated = true;
  47. break;
  48.  
  49. case 0xFF:
  50. mode = SCHIP8_SCREEN;
  51. screenUpdated = true;
  52. break;
  53.  
  54. }
  55. break;
  56.  
  57. case 0x1:
  58. PC = (opcode & 0x0FFF)-2;
  59. break;
  60.  
  61. case 0x2:
  62. PushToStack(PC);
  63. PC = (opcode & 0x0FFF)-2;
  64. break;
  65.  
  66. case 0x3:
  67. if (registers[((opcode & 0x0F00) >> 8)] == (opcode & 0x00FF))
  68. PC += 2;
  69. break;
  70.  
  71. case 0x4:
  72. if (registers[((opcode & 0x0F00) >> 8)] != (opcode & 0x00FF))
  73. PC += 2;
  74. break;
  75.  
  76. case 0x5:
  77. if (registers[((opcode & 0x0F00) >> 8)] == registers[((opcode & 0x00F0) >> 4)])
  78. PC += 2;
  79. break;
  80.  
  81. case 0x6:
  82. registers[((opcode & 0x0F00) >> 8)] = opcode & 0x00FF;
  83. break;
  84.  
  85. case 0x7:
  86. registers[((opcode & 0x0F00) >> 8)] += opcode & 0x00FF;
  87. break;
  88.  
  89. case 0x8:
  90. switch (opcode & 0x000F)
  91. {
  92. case 0x0:
  93. registers[((opcode & 0x0F00) >> 8)] = registers[((opcode & 0x00F0) >> 4)];
  94.  
  95. break;
  96.  
  97. case 0x1:
  98. registers[((opcode & 0x0F00) >> 8)] |= registers[((opcode & 0x00F0) >> 4)];
  99. break;
  100.  
  101. case 0x2:
  102. registers[((opcode & 0x0F00) >> 8)] &= registers[((opcode & 0x00F0) >> 4)];
  103. break;
  104.  
  105. case 0x3:
  106. registers[((opcode & 0x0F00) >> 8)] ^= registers[((opcode & 0x00F0) >> 4)];
  107. break;
  108.  
  109. case 0x4:
  110. w = (int)(registers[((opcode & 0x0F00) >> 8)]) + (int)(registers[((opcode & 0x00F0) >> 4)]);
  111.  
  112. if (w > 255)
  113. registers[0xF] = 1;
  114. else
  115. registers[0xF] = 0;
  116.  
  117. registers[((opcode & 0x0F00) >> 8)] = w;
  118. break;
  119.  
  120. case 0x5:
  121. if (registers[((opcode & 0x0F00) >> 8)] >= registers[((opcode & 0x00F0) >> 4)])
  122. registers[0xF] = 1;
  123. else
  124. registers[0xF] = 0;
  125.  
  126. registers[((opcode & 0x0F00) >> 8)] -= registers[((opcode & 0x00F0) >> 4)];
  127. break;
  128.  
  129. case 0x6:
  130. registers[0xF] = registers[((opcode & 0x0F00) >> 8)] & 0x1;
  131. registers[((opcode & 0x0F00) >> 8)] >>= 1;
  132. break;
  133.  
  134. case 0x7:
  135. if (registers[((opcode & 0x00F0) >> 4)] >= registers[((opcode & 0x0F00) >> 8)])
  136. registers[0xF] = 1;
  137. else
  138. registers[0xF] = 0;
  139.  
  140. registers[((opcode & 0x0F00) >> 8)] = registers[((opcode & 0x00F0) >> 4)] - registers[((opcode & 0x0F00) >> 8)];
  141. break;
  142.  
  143. case 0xE:
  144. registers[0xF] = (registers[((opcode & 0x0F00) >> 8)] >> 7) & 0x01;
  145. registers[((opcode & 0x0F00) >> 8)] <<= 1;
  146. break;
  147.  
  148. }
  149. break;
  150.  
  151. case 0x9:
  152. if (registers[((opcode & 0x0F00) >> 8)] != registers[((opcode & 0x00F0) >> 4)]) PC += 2;
  153. break;
  154.  
  155. case 0xA:
  156. I = opcode & 0x0FFF;
  157. break;
  158.  
  159. case 0xB:
  160. PC = (opcode & 0x0FFF) + registers[0];
  161. break;
  162.  
  163. case 0xC:
  164. registers[((opcode & 0x0F00) >> 8)] = (rand() % 255) & (opcode & 0x00FF);
  165. break;
  166.  
  167. case 0xD:
  168. height = (opcode & 0x000F);
  169. image = (unsigned char*)(RAM+I);
  170. registers[15] = DrawSprite(registers[GetHexPart(opcode,2)], registers[GetHexPart(opcode,3)], image, height); //set flag
  171. screenUpdated = true;
  172. break;
  173.  
  174. case 0xE:
  175. switch (opcode & 0x00FF)
  176. {
  177. case 0x9E:
  178. if (key[registers[((opcode & 0x0F00) >> 8)]] == 1)
  179. PC += 2;
  180. break;
  181.  
  182. case 0xA1:
  183. if ((key[registers[((opcode & 0x0F00) >> 8)]] == 0))
  184. PC += 2;
  185. break;
  186.  
  187. }
  188. break;
  189.  
  190. case 0xF:
  191. switch (opcode & 0x00FF)
  192. {
  193. case 0x07:
  194. registers[((opcode & 0x0F00) >> 8)] = D_Timer;
  195. break;
  196.  
  197. case 0x0A:
  198. PC -= 2;
  199. for (unsigned char n=0; n < 16; n++)
  200. {
  201. if (key[n] == 1)
  202. {
  203. registers[((opcode & 0x0F00) >> 8)] = n;
  204. PC += 2;
  205. break;
  206. }
  207. }
  208. break;
  209.  
  210. case 0x15:
  211. D_Timer = registers[((opcode & 0x0F00) >> 8)];
  212. break;
  213.  
  214. case 0x18:
  215. S_Timer = registers[((opcode & 0x0F00) >> 8)];
  216. break;
  217.  
  218. case 0x1E:
  219. if ((I += registers[((opcode & 0x0F00) >> 8)]) > 0xfff)
  220. registers[0xF] = 1;
  221. else
  222. registers[0xF] = 0;
  223. break;
  224.  
  225. case 0x29:
  226. I = registers[((opcode & 0x0F00) >> 8)] * 5;
  227. break;
  228.  
  229. case 0x30:
  230. I = registers[((opcode & 0x0F00) >> 8)] * 10 + 80;
  231. break;
  232.  
  233. case 0x33:
  234. w = registers[((opcode & 0x0F00) >> 8)];
  235. RAM[I] = (w - (w % 100)) / 100;
  236. w -= RAM[I] * 100;
  237. RAM[I+1] = (w - (w % 10)) / 10;
  238. w -= RAM[I+1] * 10;
  239. RAM[I+2] = w;
  240. break;
  241.  
  242. case 0x55:
  243. for (int n=0; n <= ((opcode & 0x0F00) >> 8); n++)
  244. RAM[I++] = registers[n];
  245. break;
  246.  
  247. case 0x65:
  248. for (int n=0; n <= ((opcode & 0x0F00) >> 8); n++)
  249. registers[n] = RAM[I++];
  250. break;
  251.  
  252. case 0x75:
  253. for (int i=0; i <= ((opcode & 0x0F00) >> 8); i++)
  254. Flags[i] = registers[i];
  255. break;
  256.  
  257. case 0x85:
  258. for (int i=0; i <= ((opcode & 0x0F00) >> 8); i++)
  259. registers[i] = Flags[i];
  260. break;
  261.  
  262.  
  263. }
  264. break;
  265.  
  266.  
  267. }
  268. return screenUpdated;
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement