SAE12_2021/decod_instruction.c
2021-12-17 17:59:37 +01:00

266 lines
4.4 KiB
C

#ifndef DECOD_C
#define DECOD_C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <graph.h>
#include "graphique.h"
void convertion(int* binraire, unsigned long int valeur){
int i=0;
int max=63;
unsigned long int verif;
for(i=0;i<64;i++){
max=63-i;
verif=1;
for(;max>=1;max--){
verif=verif*2;
}
if(verif<=valeur){
valeur-=verif;
binraire[i]=1;
}else{
binraire[i]=0;
}
}
}
unsigned long int transtypage(int tab_binaire[], int nb){
int i;
int j;
unsigned long int entier = 0;
unsigned long int pow = 0;
if(nb==1){
for(i=8;i<36;i++){
}
for(i = 8; i < 36; i++){
if(tab_binaire[i] == 1){
pow =1;
for(j = 0; j < 27+8-i ; j++ ){
pow = pow * 2;
}
entier += pow;
}
}
}
if(nb==2){
for(i=36;i<64;i++){
}
for(i = 36; i < 64; i++){
if(tab_binaire[i] == 1){
pow =1;
for(j = 0; j < 27+36-i ; j++ ){
pow = pow * 2;
}
entier += pow;
}
}
}
return entier;
}
int decodeur_instruction( int tab[], unsigned long int memoire[], int* adresse){
int bin[4];
int adresse1;
int adresse2=12;
int i;
int resultat = 0;
int allocation1=0;
int allocation2=0;
for(i = 0; i < 4; i++)
{
bin[i]= tab[i];
}
if(tab[4]==0 && tab[5]==1){
allocation1=1;
}
if(tab[4]==1 && tab[5]==0){
allocation1=2;
}
if(tab[4]==1 && tab[5]==1){
allocation1=3;
}
if(tab[6]==0 && tab[7]==1){
allocation2=1;
}
if(tab[6]==1 && tab[7]==0){
allocation2=2;
}
if(tab[6]==1 && tab[7]==1){
allocation2=3;
}
adresse1=transtypage(tab, 1);
adresse2=transtypage(tab, 2);
if(allocation1==3){
resultat++;
}
if(allocation1==1){
adresse1=*adresse+adresse1;
}
if(allocation1==2){
adresse1=*adresse+adresse1;
if(adresse1>7999){
adresse1=adresse1%8000;
}
if(adresse2>7999){
adresse2=adresse2%8000;
}
unsigned long int valeur=memoire[adresse1];
adresse1=*adresse+valeur;
}
if(allocation2==3){
resultat++;
}
if(allocation2==1){
adresse2=*adresse+adresse2;
}
if(allocation2==2){
adresse2=*adresse+adresse2;
if(adresse1>7999){
adresse1=adresse1%8000;
}
if(adresse2>7999){
adresse2=adresse2%8000;
}
unsigned long int valeur=memoire[adresse2];
adresse2=*adresse+valeur;
}
if(adresse1>7999){
adresse1=adresse1%8000;
}
if(adresse2>7999){
adresse2=adresse2%8000;
}
if(bin[0] == 0 && bin[1] == 0 && bin[2] == 0 && bin[3] == 0) /* DAT */
{
if(adresse2==0){
return -1;
}else{
*adresse=*adresse+1;
resultat--;
}
}
if(bin[0] == 0 && bin[1] == 0 && bin[2] == 0 && bin[3] == 1) /* 1 MOV */
{
if(allocation1!=0){
memoire[adresse2]=memoire[adresse1];
}else{
memoire[adresse2]=adresse1;
}
*adresse=*adresse+1;
resultat--;
DessinerVirus(adresse2, "red");
}
if(bin[0] == 0 && bin[1] == 0 && bin[2] == 1 && bin[3] == 0) /* 2 ADD */
{
if(allocation1!=0){
memoire[adresse2]=memoire[adresse1]+memoire[adresse2];
}else{
memoire[adresse2]+=adresse1;
}
*adresse=*adresse+1;
resultat--;
DessinerVirus(adresse2, "red");
}
if(bin[0] == 0 && bin[1] == 0 && bin[2] == 1 && bin[3] == 1) /* 3 SUB */
{
unsigned long int retenue;
if(allocation1!=0){
retenue=memoire[adresse1]-memoire[adresse2];
}else{
retenue=adresse1-memoire[adresse2];
}
if(retenue<0){
retenue+=8000;
}
memoire[adresse1]=retenue;
*adresse=*adresse+1;
resultat--;
DessinerVirus(adresse1, "red");
}
if(bin[0] == 0 && bin[1] == 1 && bin[2] == 0 && bin[3] == 0) /* 4 JMP */
{
*adresse=adresse1;
resultat--;
}
if(bin[0] == 0 && bin[1] == 1 && bin[2] == 0 && bin[3] == 1) /* 5 JMZ */
{
if(memoire[adresse2]==0){
*adresse=adresse1;
}else{
*adresse=*adresse+1;
}
resultat--;
}
if(bin[0] == 0 && bin[1] == 1 && bin[2] == 1 && bin[3] == 0) /* 6 JMG */
{
if(memoire[adresse2]>0){
*adresse=adresse1;
}else{
*adresse=*adresse+1;
resultat--;
}
}
if(bin[0] == 0 && bin[1] == 1 && bin[2] == 1 && bin[3] == 1) /* 7 DJZ */
{
if(allocation2!=0){
memoire[adresse2]=memoire[adresse2]-1;
if(memoire[adresse2]==0){
*adresse=adresse1;
}
}else{
adresse2=adresse2-1;
if(adresse2==0){
*adresse=adresse1;
}
}
DessinerVirus(adresse2, "red");
resultat--;
}
if(bin[0] == 1 && bin[1] == 0 && bin[2] == 0 && bin[3] == 0) /* 8 CMP */
{
if(allocation1!=0){
if(memoire[adresse2]==memoire[adresse1]){
*adresse=*adresse+1;
}else{
*adresse=*adresse+2;
}
}else{
if(memoire[adresse2]==adresse1){
*adresse=*adresse+1;
}else{
*adresse=*adresse+2;
}
}
resultat--;
}
resultat++;
return resultat;
}
#endif