CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

AIDE FUNCTION TABLE

stuart4
stuart4
Niveau 5
29 décembre 2021 à 22:01:29

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 };

Magrozz
Magrozz
Niveau 7
30 décembre 2021 à 01:27:21

Tu trouves que c'est lisible ?

stuart4
stuart4
Niveau 5
30 décembre 2021 à 09:37:33

C'est la première fois que je fais un topic avec du code désolé.. ma question en réalité est comment faire une fonction jump et une jump table avec de l'opcode en index ?

Jency21
Jency21
Niveau 6
31 décembre 2021 à 19:27:57

J'ai déjà fait un truc similaire, tu commences p

stuart4
stuart4
Niveau 5
31 décembre 2021 à 20:27:09

??

Jean_Pc2000
Jean_Pc2000
Niveau 10
31 décembre 2021 à 21:39:08

c'est évident, enfaite il faut

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment