#include "memoire.h" #include "interne.h" #include "simulator.h" #include "exceptions.h" #ifdef HAVE_CONFIG_H #include "config.h" #else #define _(x) x #endif char temp[BUFSIZ]; /*****************************************/ /** **/ /** GESTION DE LA MEMOIRE PRINCIPALE **/ /** **/ /*****************************************/ /* Lit le mot qui se trouve à l'offset 'offset' en mémoire */ Uint32 LD(Uint32 offset) { Uint32 i; switch (offset) { case 0xffffff00: return (!feof(stdin)); case 0xffffff01: return (fgetc(stdin)); case 0xffffff05: fscanf(stdin, "%i", &i); return i; default: if (offset >= TAILLE_MEMOIRE) { exception(1, _("Invalid Memory Adress")); return (i); } else { i = memoire_principale[offset]; return (i); } break; } } static void copychaine(Uint32 * t, char * s) { while (*s) { *(t++) = *(s++); } } static void litchaine(char * s, Uint32 * t) { while (*t) { *(s++) = *(t++); } } static void Affiche(Uint32 * t) { while (*t) { fprintf(stdout, "%c", (*t++)); } } static void AfficheBinaire(Uint32 valeur) { if (valeur) { AfficheBinaire(valeur >> 1); fprintf(stdout, "%i", valeur & 1); } } /* Ecrit le mot 'valeur' à l'offset 'offset' en mémoire */ void ST(Uint32 offset, Uint32 valeur) { switch (offset) { case 0xffffff02: fgets(temp, BUFSIZ, stdin); copychaine(&memoire_principale[valeur], temp); break; case 0xffffff03: fprintf(stdout, "%c", valeur); break; case 0xffffff04: Affiche(&memoire_principale[valeur]); break; case 0xffffff06: fprintf(stdout, "%i", valeur); break; case 0xffffff07: fprintf(stdout, "%x", valeur); break; case 0xffffff08: fprintf(stdout, "%o", valeur); break; case 0xffffff09: if (valeur) { AfficheBinaire(valeur); } else { fprintf(stdout, "0"); } break; case 0xffffff0a: litchaine(temp, &memoire_principale[valeur]); ChargeBinaire(char * temp); default: if (offset < 0 || offset >= TAILLE_MEMOIRE) exception(1, _("Invalid Memory Adress")); else memoire_principale[offset] = valeur; break; } }