266 lines
4.4 KiB
C
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 |