#ifndef DECOD_C #define DECOD_C #include #include #include #include #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