#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