#include #include #include "memoire.h" #include "interne.h" #include "simulator.h" #include "exceptions.h" #include "terminal.h" #ifdef HAVE_CONFIG_H #include "config.h" #else #define _(x) x #endif char temp[BUFSIZ]; Uint32 *memoire_principale; /*****************************************/ /** **/ /** GESTION DE LA MEMOIRE PRINCIPALE **/ /** **/ /*****************************************/ void InitMemoire(void) { memoire_principale = (Uint32 *) Emalloc(TAILLE_MEMOIRE * sizeof(Uint32)); } void FlushMemoire(void) { free(memoire_principale); } /* Lit le mot qui se trouve à l'offset 'offset' en mémoire */ Uint32 LD(Uint32 offset) { Uint32 i; switch (offset) { case 0xffffff00: initterm(); i = !feof(input); clearterm(); return (i); case 0xffffff01: initterm(); i = fgetc(input); clearterm(); break; case 0xffffff05: fscanf(input, "%i", &i); break; default: if (offset >= TAILLE_MEMOIRE) { exception(1, _("Invalid Memory Adress")); } else { i = memoire_principale[offset]; } break; } return i; } 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(temp); default: if (offset < 0 || offset >= TAILLE_MEMOIRE) exception(1, _("Invalid Memory Adress")); else memoire_principale[offset] = valeur; break; } fflush(stdout); }