summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPixel <>2001-04-16 16:17:58 +0000
committerPixel <>2001-04-16 16:17:58 +0000
commitbb38c3ba0877cbbac1d8f0041280e7a923588e89 (patch)
treea5eaa928b0545e9247457cd7875eca68a14646f4
parentc569966fd3e7df69ac0472dcc9999d58a6c1fae3 (diff)
Alu & Simul
-rw-r--r--include/alu.h2
-rw-r--r--lib/alu.c2
-rw-r--r--lib/simulator.c25
3 files changed, 21 insertions, 8 deletions
diff --git a/include/alu.h b/include/alu.h
index 4427060..760de41 100644
--- a/include/alu.h
+++ b/include/alu.h
@@ -15,4 +15,6 @@ Uint32 OR(Uint32 a, Uint32 b);
Uint32 SHL(Uint32 a);
Uint32 SHR(Uint32 a);
+extern int errRet, Rapide;
+extern Uint32 SecondResult;
#endif
diff --git a/lib/alu.c b/lib/alu.c
index 2f5b5e2..0419ffd 100644
--- a/lib/alu.c
+++ b/lib/alu.c
@@ -10,6 +10,8 @@
int errRet = 0, Rapide = 0;
+Uint32 SecondResult = 0;
+
/* ALU rapide */
Uint32 RAdditionNonSigne(Uint32 a, Uint32 b)
diff --git a/lib/simulator.c b/lib/simulator.c
index cd393b6..21e34bd 100644
--- a/lib/simulator.c
+++ b/lib/simulator.c
@@ -84,13 +84,15 @@ void DecodeExec(Uint32 instruction, Uint32 entrypoint)
/* ALU */
champ_registre_resultat = Champ1(instruction); /* Champ du registre dans lequel va etre stocké le résultat */
val1 = LireRegistre(Champ2(instruction)); /* Premier entier qui va etre utilisé dans l'opération */
- if (ValeurBit(Extension(instruction), 0) == 0)
- val2 = LireRegistre(Champ3(instruction)); /* Deuxième entier, stocké dans un registre, qui va etre utilisé dans l'opération */
- else {
- val2 = LireInstruction(); /* Deuxième entier, stocké après l'instruction, qui va etre utilisé dans l'opération */
- IncrementeCompteurOrdinal();
+ if (Opcode(instruction) < 6) {
+ if (ValeurBit(Extension(instruction), 0) == 0)
+ val2 = LireRegistre(Champ3(instruction)); /* Deuxième entier, stocké dans un registre, qui va etre utilisé dans l'opération */
+ else {
+ val2 = LireInstruction(); /* Deuxième entier, stocké après l'instruction, qui va etre utilisé dans l'opération */
+ IncrementeCompteurOrdinal();
+ }
}
- if (ValeurBit(Extension(instruction), 1) == 0) /* Teste si l'opération est signée ou pas */
+ if (ValeurBit(Extension(instruction), 1) == 0) {/* Teste si l'opération est signée ou pas */
switch (Opcode(instruction)) {
case 0:
resultat = AdditionNonSigne(val1, val2);
@@ -116,7 +118,8 @@ void DecodeExec(Uint32 instruction, Uint32 entrypoint)
case 7:
resultat = SHR(val1);
break;
- } else
+ }
+ } else {
switch (Opcode(instruction)) {
case 0:
resultat = AdditionSigne(val1, val2);
@@ -143,7 +146,13 @@ void DecodeExec(Uint32 instruction, Uint32 entrypoint)
resultat = SHR(val1);
break;
}
- EcrireRegistre(champ_registre_resultat, resultat); /* On écrit le résultat dans le registre de sortie */
+ }
+ if ((Opcode(instruction) & 2) && !(Opcode(instruction & 3))) {
+ EcrireRegistre(32, resultat);
+ EcrireRegistre(33, SecondResultat);
+ } else {
+ EcrireRegistre(champ_registre_resultat, resultat); /* On écrit le résultat dans le registre de sortie */
+ }
break;
case 8: /* MOV */
if (ValeurBit(Extension(instruction), 4) == 1) { /* MOV conditionnel */