Bonjour j'ai besoin d'aide concerant les jump tables en C, je les utilises pour décoder l'OPCODE d'un émulateur de l'interpreteur CHIP8 cepandant je me retrouve bloqué car je ne comprend pas comment faire le lien entre l'opcode et la jump table.
je met le code de mes fonctions, de ma function table et de void cycle(CHIP8* newCHIP8)
{
//fetch
newCHIP8->opcode = (((newCHIP8->memory[newCHIP8->PC]) << 8) | (newCHIP8->memory[newCHIP8->PC + 1]));
newCHIP8->PC += 2;
//decode
table[(newCHIP8->opcode)];
//execute
countdown(&newCHIP8);
}
void load(const char* FILENAME, CHIP8* newCHIP8)
{
FILE* fileptr;
fileptr = fopen(FILENAME, "rb");
if (fileptr == NULL)
{
printf("Cannot open file \n");
}
int size = fseek(fileptr, 0, SEEK_END);
byte* buffer = malloc(sizeof(byte)* size);
fread(buffer, size, 1, fileptr); // Maybe return an integer (might need to divide the result by 4)
long i;
for (i = 0; i < size; i++)
{
newCHIP8->memory[START_ADDRESS+i] = buffer[i];
}
free(buffer);
}
byte randNumGen()
{
srand(time(NULL));
byte randNum = randomrand() % 255 ;
return randNum;
}
void countdown(CHIP8* newCHIP8)
{
if (newCHIP8->delaytimer != 0)
{
newCHIP8->delaytimer--;
}
if (newCHIP8->soundtimer != 0)
{
newCHIP8->soundtimer--;
}
}
void OPCODE00E0(CHIP8* newCHIP8)
{
//clear the screen
}
void OPCODE00EE(CHIP8* newCHIP8)
{
newCHIP8->PC = newCHIP8->stack[STACKSIZE];
newCHIP8->SP--;
}
void OPCODE1nnn(CHIP8* newCHIP8)
{
unsigned short adress = newCHIP8->opcode & 0x0FFFu;
newCHIP8->PC = adress;
}
void OPCODE2nnn(CHIP8* newCHIP8)
{
newCHIP8->SP++;
newCHIP8->PC = newCHIP8->stack[STACKSIZE];
unsigned short adress = newCHIP8->opcode & 0x0FFFu;
newCHIP8->PC = adress;
}
void OPCODE3xkk(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte adress = (newCHIP8->opcode & 0x00FFu);
if (newCHIP8->reg[Vx] == adress)
{
newCHIP8->PC += 2;
}
}
void OPCODE4xkk(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte adress = (newCHIP8->opcode & 0x00FFu);
if (newCHIP8->reg[Vx] != adress)
{
newCHIP8->PC += 2;
}
}
void OPCODE5xy0(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte Vy = (newCHIP8->opcode & 0x00F0u) >> 4u;
if (newCHIP8->reg[Vx] == newCHIP8->reg[Vy])
{
newCHIP8->PC += 2;
}
}
void OPCODE6xkk(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte adress = (newCHIP8->opcode & 0x00FFu);
newCHIP8->reg[Vx] = adress;
}
void OPCODE7xkk(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte adress = (newCHIP8->opcode & 0x00FFu);
newCHIP8->reg[Vx] += adress;
}
void OPCODE8xy0(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte Vy = (newCHIP8->opcode & 0x00F0u) >> 4u;
newCHIP8->reg[Vx] = newCHIP8->reg[Vy];
}
void OPCODE8xy1(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte Vy = (newCHIP8->opcode & 0x00F0u) >> 4u;
newCHIP8->reg[Vx] = Vx | Vy;
}
void OPCODE8xy2(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte Vy = (newCHIP8->opcode & 0x00F0u) >> 4u;
newCHIP8->reg[Vx] = Vx & Vy;
}
void OPCODE8xy3(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte Vy = (newCHIP8->opcode & 0x00F0u) >> 4u;
newCHIP8->reg[Vx] = Vx ^ Vy;
}
void OPCODE8xy4(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte Vy = (newCHIP8->opcode & 0x00F0u) >> 4u;
byte result = newCHIP8->reg[Vx] + newCHIP8->reg[Vy];
if (result > 0x00FFu)
{
newCHIP8->reg[0xF] = 1;
}
else
{
newCHIP8->reg[0xF] = 0;
}
newCHIP8->reg[Vx] = result;
}
void OPCODE8xy5(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte Vy = (newCHIP8->opcode & 0x00F0u) >> 4u;
if (newCHIP8->reg[Vx] > newCHIP8->reg[Vy])
{
newCHIP8->reg[0xF] = 1;
}
else
{
newCHIP8->reg[0xF] = 0;
}
byte result = newCHIP8->reg[Vx] - newCHIP8->reg[Vy];
newCHIP8->reg[Vx] = result;
}
void OPCODE8xy6(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
if ((Vx & 0x1) == 1 )
{
newCHIP8->reg[0xF] = 1;
}
else
{
newCHIP8->reg[0xF] = 0;
}
byte result = newCHIP8->reg[Vx] >> 1;
newCHIP8->reg[Vx] = result;
}
void OPCODE8xy7(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte Vy = (newCHIP8->opcode & 0x00F0u) >> 4u;
if (newCHIP8->reg[Vy] > newCHIP8->reg[Vx])
{
newCHIP8->reg[0xF] = 1;
}
else
{
newCHIP8->reg[0xF] = 0;
}
byte result = newCHIP8->reg[Vy] - newCHIP8->reg[Vx];
newCHIP8->reg[Vx] = result;
}
void OPCODE8xyE(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
if ((newCHIP8->reg[Vx] & 0x80u) == 1)
{
newCHIP8->reg[0xF] = 1;
}
else
{
newCHIP8->reg[0xF] = 0;
}
byte result = newCHIP8->reg[Vx] << 1;
newCHIP8->reg[Vx] = result;
}
void OPCODE9xy0(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte Vy = (newCHIP8->opcode & 0x00F0u) >> 4u;
if (newCHIP8->reg[Vx] != newCHIP8->reg[Vy])
{
newCHIP8->PC += 2;
}
}
void OPCODEAnnn(CHIP8* newCHIP8)
{
newCHIP8->I = newCHIP8->opcode & 0x0FFFu;
}
void OPCODEBnnn(CHIP8* newCHIP8)
{
newCHIP8->PC = (newCHIP8->opcode & 0x0FFFu) + newCHIP8->reg[0x0];
}
void OPCODECxkk(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte adress = newCHIP8->opcode & 0x00FFu;
byte randNum = randNumGen();
newCHIP8->reg[Vx] = adress & randNum;
}
void OPCODEDxyn(CHIP8* newCHIP8)
{
newCHIP8->I = newCHIP8->opcode & 0x0FFFu;
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte Vy = (newCHIP8->opcode & 0x00F0u) >> 4u;
}
void OPCODEEx9E(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte key = newCHIP8->reg[Vx];
if (keypad[key])
{
newCHIP8->PC += 2;
}
}
void OPCODEExA1(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
byte key = newCHIP8->reg[Vx];
if (!keypad[key])
{
newCHIP8->PC += 2;
}
}
void OPCODEFx07(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
newCHIP8->reg[Vx] = newCHIP8->delaytimer;
}
void OPCODEFx0A(CHIP8* newCHIP8)
{
//TODO
}
void OPCODEFx15(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
newCHIP8->delaytimer = newCHIP8->reg[Vx];
}
void OPCODEFx18(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
newCHIP8->soundtimer = newCHIP8->reg[Vx];
}
void OPCODEFx1E(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
newCHIP8->I = newCHIP8->reg[Vx] + newCHIP8->I;
}
void OPCODEFx29(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
newCHIP8->I = START_ADDRESS + (5* newCHIP8->reg[Vx]);
}
void OPCODEFx33(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
//TODO
}
void OPCODEFx55(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
int i;
for (i = 0; i <= Vx ; i++)
{
newCHIP8->memory[newCHIP8->I + i] = newCHIP8->reg[i];
}
}
void OPCODEFx65(CHIP8* newCHIP8)
{
byte Vx = (newCHIP8->opcode & 0x0F00u) >> 8u;
int i;
for (i = 0; i <= Vx; i++)
{
newCHIP8->reg[i] = newCHIP8->memory[newCHIP8->I + i];
}
}
void (*table[0x65])(CHIP8* newCHIP8) = { OPCODE00E0, OPCODE00EE, OPCODE1nnn, OPCODE2nnn, OPCODE3xkk, OPCODE4xkk, OPCODE5xy0, OPCODE6xkk, OPCODE7xkk, OPCODE8xy0, OPCODE8xy1, OPCODE8xy2, OPCODE8xy3, OPCODE8xy4, OPCODE8xy5, OPCODE8xy6, OPCODE8xy7, OPCODE8xyE, OPCODE9xy0, OPCODEAnnn, OPCODEBnnn, OPCODECxkk, OPCODEDxyn, OPCODEEx9E, OPCODEExA1, OPCODEFx07, OPCODEFx0A, OPCODEFx15, OPCODEFx18, OPCODEFx1E, OPCODEFx29, OPCODEFx33, OPCODEFx55, OPCODEFx65 };