diff options
author | Pixel <> | 2001-04-16 16:17:58 +0000 |
---|---|---|
committer | Pixel <> | 2001-04-16 16:17:58 +0000 |
commit | bb38c3ba0877cbbac1d8f0041280e7a923588e89 (patch) | |
tree | a5eaa928b0545e9247457cd7875eca68a14646f4 /lib/simulator.c | |
parent | c569966fd3e7df69ac0472dcc9999d58a6c1fae3 (diff) |
Alu & Simul
Diffstat (limited to 'lib/simulator.c')
-rw-r--r-- | lib/simulator.c | 25 |
1 files changed, 17 insertions, 8 deletions
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 */ |