envoie des derniers changements + explication fichier lfo.c
This commit is contained in:
12
lfo.c
12
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);
|
||||
|
||||
}
|
77
mars_main.c
77
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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user