diff options
Diffstat (limited to 'lib/registre.c')
-rw-r--r-- | lib/registre.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/lib/registre.c b/lib/registre.c new file mode 100644 index 0000000..f97595d --- /dev/null +++ b/lib/registre.c @@ -0,0 +1,166 @@ +#include "registre.h" +#include "interne.h" +#include "archi.h" + +/*****************************************/ +/** **/ +/** GESTION DES REGISTRES **/ +/** **/ +/*****************************************/ + +Uint32 LireRegistreRG(void) +{ + return (registre[REG_RG]); +} + +Uint32 LireRegistreRD(void) +{ + return (registre[REG_RD]); +} + +Uint32 LireRegistrePC(void) +{ + return (registre[REG_PC]); +} + +Uint32 LireRegistreFLAG(void) +{ + return (registre[REG_FLAG]); +} + +Uint32 LireRegistrePP(void) +{ + return (registre[REG_PUSHPOP]); +} + +void EcrireRegistreRG(Uint32 val) +{ + registre[REG_RG] = val; +} + +void EcrireRegistreRD(Uint32 val) +{ + registre[REG_RD] = val; +} + +void EcrireRegistrePC(Uint32 val) +{ + registre[REG_PC] = val; +} + +void EcrireRegistreFLAG(Uint32 val) +{ + registre[REG_FLAG] = val; +} + +void EcrireRegistrePP(Uint32 val) +{ + registre[REG_PUSHPOP] = val; +} + +/* Lit le mot qui se trouve dans le registre 'numero_registre' */ +Uint32 LireRegistre(Uint32 champ_registre) +{ + Uint32 i; + + if (ValeurBit(champ_registre, 5) == 0) { /* Test du bit S */ + Reset(&i); + if (champ_registre < 0 || champ_registre >= NB_REGISTRES_UTILISABLES) { /* Si on voudrait diminuer le nombre de registres */ + Set(&Err_Reg); /* Il n'y a que 32 registres */ + return (i); + } + i = registre[champ_registre]; /* Registre classique */ + return (i); + } else /* Registre spécial */ + switch (champ(champ_registre, 4)) { + case 0: + return (LireRegistreRG()); + case 1: + return (LireRegistreRD()); + case 2: + return (LireRegistrePC()); + case 3: + return (LireRegistreFLAG()); + default:{ + Set(&Err_Reg); + return (0); + } + } +} + +/* Ecrit le mot 'valeur' dans le registre 'numero_registre' */ +void EcrireRegistre(Uint32 champ_registre, Uint32 valeur) +{ + Uint32 i; + + if (ValeurBit(champ_registre, 5) == 0) { /* Test du bit S */ + Reset(&i); + if (champ_registre < 0 || champ_registre >= NB_REGISTRES_UTILISABLES) + Set(&Err_Reg); /* Il n'y a que 32 registres */ + else + registre[champ_registre] = valeur; /* Registre classique */ + } else /* Registre spécial */ + switch (champ(champ_registre, 4)) { + case 0: + EcrireRegistreRG(valeur); + case 1: + EcrireRegistreRD(valeur); + case 2: + EcrireRegistrePC(valeur); + case 3: + EcrireRegistreFLAG(valeur); + default: + Set(&Err_Reg); + } +} + +int Overflow(void) +{ + return (ValeurBit(LireRegistreFLAG(), 0)); +} +int Zero(void) +{ + return (ValeurBit(LireRegistreFLAG(), 1)); +} +int Sign(void) +{ + return (ValeurBit(LireRegistreFLAG(), 2)); +} +int Parity(void) +{ + return (ValeurBit(LireRegistreFLAG(), 3)); +} + +void SetOverflow(void) +{ + registre[REG_FLAG] |= 1; +} +void SetZero(void) +{ + registre[REG_FLAG] |= 2; +} +void SetSign(void) +{ + registre[REG_FLAG] |= 4; +} +void SetParity(void) +{ + registre[REG_FLAG] |= 8; +} + +void ResetOverflow(void) +{ + registre[REG_FLAG] &= (VAL_MAX - 1); +} +void ResetZero(void) +{ + registre[REG_FLAG] &= (VAL_MAX - 2); +} +void ResetSign(void) +{ + registre[REG_FLAG] &= (VAL_MAX - 4); +} +void ResetParity(void) +{ + registre[REG_FLAG] &= (VAL_MAX - 8); +} |