From f680229b17a355b84d223df2d922236f730c95c0 Mon Sep 17 00:00:00 2001 From: Yvan Date: Fri, 17 Dec 2021 16:38:22 +0100 Subject: [PATCH] envoie des derniers changements + explication fichier lfo.c --- lfo.c | 12 ++++++--- mars_main.c | 77 ++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 63 insertions(+), 26 deletions(-) diff --git a/lfo.c b/lfo.c index 35fe4cf..30169a1 100644 --- a/lfo.c +++ b/lfo.c @@ -19,11 +19,15 @@ union mars_instruction { int main(int argc, char* argv[]){ union mars_instruction toto; +union mars_instruction didier; -toto.mars.codeop = 2; -toto.mars.arga = 2; -toto.mars.argb = 8; +toto.instruction = 216173890264694884; -printf("%llx\n", toto.instruction); +didier.mars.codeop = 2; +didier.mars.arga = 2; +didier.mars.argb = 8; + +printf("Long long int: %lld\n", didier.instruction); +printf("Argument b de toto: %d\n", toto.mars.argb); } \ No newline at end of file diff --git a/mars_main.c b/mars_main.c index 8c8daf1..38bcadf 100644 --- a/mars_main.c +++ b/mars_main.c @@ -5,32 +5,65 @@ #include"mars_types.h" /* importe les types utilisés dans le programme */ #include"options.h" /* Inclus les options du programme */ -void initialiser_memoire(){ +void initialiser_memoire(char* fichier, int player, int positions[2]){ /* Boucle qui vient placer le programme dans la mémoire */ } /* Va initialiser la mémoire en plaçant les deux programmes dans des adresses aléatoires */ -int calculer_position(); /* Va permettre de calculer la position à laquelle le programme doit effectuer une action*/ +int calculer_position(int posActuelle, short int modeAddr, short int valeur, struct adresse memoire[TAILLE_MEM]){ + /* Permet de calculer l'adresse en fonction de la position actuelle et le mode d'adressage */ + if(modeAddr == DIRECT){ + printf("valeur: %d\n", valeur); + printf("Pos actuelle: %d\n", posActuelle); + return (posActuelle + (TAILLE_MEM + valeur)) % TAILLE_MEM; + } else if (modeAddr == INDIRECT){ + /* Va voir à la position + valeur, */ + } else if(modeAddr == IMMEDIAT) { + /* Retourne l'arguement de la position */ + return valeur; + } -void execute_instruction(union mars_instruction instruction, int player, struct adresse memoire[TAILLE_MEM], int position[2]){ + return valeur; +} + +void execute_instruction(union mars_instruction instruction, int player, struct adresse memoire[TAILLE_MEM], int positions[2]){ short int operation = instruction.instruct.codeOp; /* Pour rendre le code un peu plus lisible */ - + int position = positions[player]; + printf("Position dans le exec: %d\n", position); switch (operation){ - case MOV: - printf("on a demandé un mov noice\n"); - case ADD: + case MOV:{ + short int modeaddrA = instruction.instruct.modeAddrA; + + if(modeaddrA == IMMEDIAT){ + /* On écrit l'argument A dans la mémoire à l'aggr B */ + union mars_instruction to_write; + to_write.instruct.codeOp = 0; + to_write.instruct.ArgB = to_write.instruct.ArgA; + int position = calculer_position(position, instruction.instruct.modeAddrB, instruction.instruct.ArgB, memoire); + memoire[position].instruction = to_write.instructLL; + memoire[position].player = player; + } else { + + } + } + + case ADD: { + /* Addition de deux cases mémoires ? */ + } case SUB: - + /* Soustraction */ case JMP: { short int modeadresse = instruction.instruct.modeAddrA; - - if (modeadresse == IMMEDIAT){ - position[player] = (instruction.instruct.ArgA + TAILLE_MEM) % TAILLE_MEM; - } else if (modeadresse == DIRECT) { - position[player] += (instruction.instruct.ArgA + TAILLE_MEM) % TAILLE_MEM; - } else if (modeadresse == INDIRECT){ - /* TODO: Lire contenu mémoire à l'adresse demandée (DAT) puis aller à position actuelle + num contenu dans l'adresse relative */ - } + int position_calc = calculer_position(position, modeadresse, instruction.instruct.ArgA, memoire); + printf("Positon calculée: %d\n", position_calc); + positions[player] = position; + // if (modeadresse == IMMEDIAT){ + // positions[player] = (instruction.instruct.ArgA + TAILLE_MEM) % TAILLE_MEM; + // } else if (modeadresse == DIRECT) { + // positions[player] += (instruction.instruct.ArgA + TAILLE_MEM) % TAILLE_MEM; + // } else if (modeadresse == INDIRECT){ + // /* TODO: Lire contenu mémoire à l'adresse demandée (DAT) puis aller à position actuelle + num contenu dans l'adresse relative */ + // } } case DJZ: /* */ @@ -41,7 +74,7 @@ void execute_instruction(union mars_instruction instruction, int player, struct default: break; } - printf("Position après exécution: %d\n", position[player]); + printf("Position après exécution: %d\n", positions[player]); } @@ -49,7 +82,7 @@ int main(int argc, char* argv[]){ srand(time(NULL)); /* Initialise le pseudo aléatoire pour tout le programme */ struct adresse memoire[TAILLE_MEM]; // Initialisation de la mémoire 0->7999 - int position[2] = {0,10}; /* Position des joueurs */ + int positions[2] = {0,10}; /* Position des joueurs */ if (argc < 3){ printf("Vous n'avez pas rentrez assez d'arguments \n"); @@ -81,12 +114,12 @@ int main(int argc, char* argv[]){ fclose(fichier2); union mars_instruction to_do; - to_do.instruct.codeOp = 0; + to_do.instruct.codeOp = JMP; to_do.instruct.ArgA = 753; to_do.instruct.ArgB = 100; - to_do.instruct.modeAddrA = 1; - to_do.instruct.modeAddrB = 2; + to_do.instruct.modeAddrA = DIRECT; + to_do.instruct.modeAddrB = DIRECT; printf("Valeur instruction: %lld\n", to_do.instructLL); - + execute_instruction(to_do, 1, memoire, positions); return EXIT_SUCCESS; }