Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unsigned char cpunext(unsigned short opcode)
- {
- int w = 0;
- unsigned char screenUpdated = 0;
- unsigned char height = 0;
- unsigned char* image;
- int numOfLines = 0;
- switch ((opcode & 0xF000) >> 12)
- {
- case 0x0:
- if ((opcode & 0x00F0) >> 4 == 0xC)
- {
- numOfLines = opcode & 0x000F;
- SCHIP_ScrollScreenDown(numOfLines);
- screenUpdated = true;
- }
- switch (opcode & 0x00FF)
- {
- case 0xE0:
- Screen_Clear();
- screenUpdated = true;
- break;
- case 0xEE:
- PC = PopOffStack();
- break;
- case 0xFB:
- SCHIP_ScrollScreenRight();
- screenUpdated = true;
- break;
- case 0xFC:
- SCHIP_ScrollScreenLeft();
- screenUpdated = true;
- break;
- case 0xFD:
- stop = true;
- break;
- case 0xFE:
- mode = CHIP8_SCREEN;
- screenUpdated = true;
- break;
- case 0xFF:
- mode = SCHIP8_SCREEN;
- screenUpdated = true;
- break;
- }
- break;
- case 0x1:
- PC = (opcode & 0x0FFF)-2;
- break;
- case 0x2:
- PushToStack(PC);
- PC = (opcode & 0x0FFF)-2;
- break;
- case 0x3:
- if (registers[((opcode & 0x0F00) >> 8)] == (opcode & 0x00FF))
- PC += 2;
- break;
- case 0x4:
- if (registers[((opcode & 0x0F00) >> 8)] != (opcode & 0x00FF))
- PC += 2;
- break;
- case 0x5:
- if (registers[((opcode & 0x0F00) >> 8)] == registers[((opcode & 0x00F0) >> 4)])
- PC += 2;
- break;
- case 0x6:
- registers[((opcode & 0x0F00) >> 8)] = opcode & 0x00FF;
- break;
- case 0x7:
- registers[((opcode & 0x0F00) >> 8)] += opcode & 0x00FF;
- break;
- case 0x8:
- switch (opcode & 0x000F)
- {
- case 0x0:
- registers[((opcode & 0x0F00) >> 8)] = registers[((opcode & 0x00F0) >> 4)];
- break;
- case 0x1:
- registers[((opcode & 0x0F00) >> 8)] |= registers[((opcode & 0x00F0) >> 4)];
- break;
- case 0x2:
- registers[((opcode & 0x0F00) >> 8)] &= registers[((opcode & 0x00F0) >> 4)];
- break;
- case 0x3:
- registers[((opcode & 0x0F00) >> 8)] ^= registers[((opcode & 0x00F0) >> 4)];
- break;
- case 0x4:
- w = (int)(registers[((opcode & 0x0F00) >> 8)]) + (int)(registers[((opcode & 0x00F0) >> 4)]);
- if (w > 255)
- registers[0xF] = 1;
- else
- registers[0xF] = 0;
- registers[((opcode & 0x0F00) >> 8)] = w;
- break;
- case 0x5:
- if (registers[((opcode & 0x0F00) >> 8)] >= registers[((opcode & 0x00F0) >> 4)])
- registers[0xF] = 1;
- else
- registers[0xF] = 0;
- registers[((opcode & 0x0F00) >> 8)] -= registers[((opcode & 0x00F0) >> 4)];
- break;
- case 0x6:
- registers[0xF] = registers[((opcode & 0x0F00) >> 8)] & 0x1;
- registers[((opcode & 0x0F00) >> 8)] >>= 1;
- break;
- case 0x7:
- if (registers[((opcode & 0x00F0) >> 4)] >= registers[((opcode & 0x0F00) >> 8)])
- registers[0xF] = 1;
- else
- registers[0xF] = 0;
- registers[((opcode & 0x0F00) >> 8)] = registers[((opcode & 0x00F0) >> 4)] - registers[((opcode & 0x0F00) >> 8)];
- break;
- case 0xE:
- registers[0xF] = (registers[((opcode & 0x0F00) >> 8)] >> 7) & 0x01;
- registers[((opcode & 0x0F00) >> 8)] <<= 1;
- break;
- }
- break;
- case 0x9:
- if (registers[((opcode & 0x0F00) >> 8)] != registers[((opcode & 0x00F0) >> 4)]) PC += 2;
- break;
- case 0xA:
- I = opcode & 0x0FFF;
- break;
- case 0xB:
- PC = (opcode & 0x0FFF) + registers[0];
- break;
- case 0xC:
- registers[((opcode & 0x0F00) >> 8)] = (rand() % 255) & (opcode & 0x00FF);
- break;
- case 0xD:
- height = (opcode & 0x000F);
- image = (unsigned char*)(RAM+I);
- registers[15] = DrawSprite(registers[GetHexPart(opcode,2)], registers[GetHexPart(opcode,3)], image, height); //set flag
- screenUpdated = true;
- break;
- case 0xE:
- switch (opcode & 0x00FF)
- {
- case 0x9E:
- if (key[registers[((opcode & 0x0F00) >> 8)]] == 1)
- PC += 2;
- break;
- case 0xA1:
- if ((key[registers[((opcode & 0x0F00) >> 8)]] == 0))
- PC += 2;
- break;
- }
- break;
- case 0xF:
- switch (opcode & 0x00FF)
- {
- case 0x07:
- registers[((opcode & 0x0F00) >> 8)] = D_Timer;
- break;
- case 0x0A:
- PC -= 2;
- for (unsigned char n=0; n < 16; n++)
- {
- if (key[n] == 1)
- {
- registers[((opcode & 0x0F00) >> 8)] = n;
- PC += 2;
- break;
- }
- }
- break;
- case 0x15:
- D_Timer = registers[((opcode & 0x0F00) >> 8)];
- break;
- case 0x18:
- S_Timer = registers[((opcode & 0x0F00) >> 8)];
- break;
- case 0x1E:
- if ((I += registers[((opcode & 0x0F00) >> 8)]) > 0xfff)
- registers[0xF] = 1;
- else
- registers[0xF] = 0;
- break;
- case 0x29:
- I = registers[((opcode & 0x0F00) >> 8)] * 5;
- break;
- case 0x30:
- I = registers[((opcode & 0x0F00) >> 8)] * 10 + 80;
- break;
- case 0x33:
- w = registers[((opcode & 0x0F00) >> 8)];
- RAM[I] = (w - (w % 100)) / 100;
- w -= RAM[I] * 100;
- RAM[I+1] = (w - (w % 10)) / 10;
- w -= RAM[I+1] * 10;
- RAM[I+2] = w;
- break;
- case 0x55:
- for (int n=0; n <= ((opcode & 0x0F00) >> 8); n++)
- RAM[I++] = registers[n];
- break;
- case 0x65:
- for (int n=0; n <= ((opcode & 0x0F00) >> 8); n++)
- registers[n] = RAM[I++];
- break;
- case 0x75:
- for (int i=0; i <= ((opcode & 0x0F00) >> 8); i++)
- Flags[i] = registers[i];
- break;
- case 0x85:
- for (int i=0; i <= ((opcode & 0x0F00) >> 8); i++)
- registers[i] = Flags[i];
- break;
- }
- break;
- }
- return screenUpdated;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement