summaryrefslogtreecommitdiff
path: root/lib/registre.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/registre.c')
-rw-r--r--lib/registre.c166
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);
+}