You are on page 1of 11

// Simulator Slot 1, Slot 2

#include<stdio.h>
#include<stdlib.h>
long int mem[1000]={0};
int flg=1,PC,LC,add,opc,reg[4],regno,op1,op2,tmp,ins,cc[6]={0};

main()
{
int ch;
void accept();
void print();
void load();
void run();
void trace();
do
{
printf("\n 1-Load ");
printf("\n 2-Print ");
printf("\n 3-Accept");
printf("\n 4-Run ");
printf("\n 5-Trace");
printf("\n 6-Exit");
printf("\n Enter choice =");
scanf("%d",&ch);
switch(ch)
{
case 1 : load();
break;
case 2 : print();
break;
case 3: accept();
break;
case 4 : run();
break;
case 5: trace();
break;
case 6: exit(0);
}
}while(ch != 6);
}
// this function is used to load the existing opcode file.

void load()
{
FILE *fp;
char fname[11];
int lc;
long int inst;
printf("\n Enter File name :");
scanf("%s",fname);
fp=fopen(fname,"r");
if(fp==NULL)
{
printf("\n file can't open");
exit(0);
}
printf("\n smaco program %s is loading ....into memory \n",fname);
while(1)
{
fscanf(fp,"%d %ld",&lc,&inst);
if(flg==1)
{
PC=lc;
flg=0;
}
mem[lc]=inst;
if(feof(fp))
break;
// printf("%d %ld\n",lc,mem[lc]);
}

LC=lc;
fclose(fp);
}

// this function is used to accept the new opcode file from user through console.
void accept()
{
FILE *fp;
char fname[11];
int lc;
long int inst;
printf("\n Enter File name :");
scanf("%s",fname);
fp=fopen(fname,"w");
if(fp==NULL)
{
printf("\n file can't open");
exit(0);
}
printf("\n Enter smaco program\n");
while(!feof(stdin))
{
scanf("%d %ld",&lc,&inst);
fprintf(fp,"%d %ld\n",lc,inst);
}
fclose(fp);
}

// this function is used to print the opcode file.


void print()
{
FILE *fp;
char fname[11];
int lc;
long int inst;
printf("\n Enter File name :");
scanf("%s",fname);
fp=fopen(fname,"r");
if(fp==NULL)
{
printf("\n file can't open");
exit(0);
}
printf("\n smaco program %s is\n",fname);
while(1)
{
fscanf(fp,"%d %ld",&lc,&inst);
if(feof(fp))
break;
printf("%d %ld\n",lc,inst);
}

fclose(fp);
}

// this function is used to run the opcode file.


void run()
{
int pc;
load();
pc=PC;
while(pc<=LC)
{
ins=mem[pc];
opc=ins/10000;
if(opc < 0)
mem[pc]=add;

if(opc>15)
{
printf("\7\nINVALID OPCODE AT LINE %d ",pc);
exit(0);
}
else //DIVIDING INSTRUCTION IN PARTS
{
tmp=ins%10000;
regno=(tmp/1000) ;
add=tmp%1000;
switch(opc)
{
case 0:mem[pc]=add;
exit(0); break; //STOP

case 1:reg[regno]+=mem[add];break; //ADD

case 2:reg[regno]-=mem[add];break; //SUB

case 3:reg[regno]*=mem[add];break; //MULT

case 4:reg[regno]=mem[add];break; //MOVER

case 5:mem[add]=reg[regno];break; //MOVEM

case 6:op1=reg[regno]; op2=mem[add];break; //COMP

case 7:switch(regno) //BC


{
case 0:if(op1<op2) pc=add-1;break; //LT
case 1:if(op1<=op2) pc=add-1;break; //LE
case 3:if(op1>op2) pc=add-1;break; //GT
case 4:if(op1>=op2) pc=add-1;break; //GE
case 2:if(op1==op2) pc=add-1;break; //EQ
case 5:pc=add-1;break; //ANY
}
break;

case 8:reg[regno]/=mem[add];break; //DIV

case 9:printf("\nINPUT:");
scanf("%ld",&mem[add]);break; //READ
case 10:printf("\n\tOUTPUT:%ld",mem[add]);
break; //PRINT
case 11:printf("Before Swap \nreg[%d] = %d
mem[%d]=%d",regno,reg[regno],add,mem[add]);

int temp=mem[add];
mem[add]=reg[regno];
reg[regno]=temp;
printf("After Swap \nreg[%d] = %d
mem[%d]=%d",regno,reg[regno],add,mem[add]);
break;
case 12:reg[regno]++;
break;
case 13:reg[regno]--;
break;
case 14:mem[add]++;
break;
}
pc++;
}
}
}
void trace()
{
int pc;
load();
pc=PC;
printf("\n Program is tracing ............");
while(pc<=LC)
{
ins=mem[pc];
opc=ins/10000;
printf("\n%d %ld\n",pc,mem[pc]);
if(opc < 0)
mem[pc]=add;

if(opc>15)
{
printf("\7\nINVALID OPCODE AT LINE %d ",pc);
exit(0);
}
else //DIVIDING INSTRUCTION IN PARTS
{
tmp=ins%10000;
regno=(tmp/1000)-1 ;
add=tmp%1000;
switch(opc)
{
case 0:mem[pc]=add ;
exit(0);
break; //STOP

case 1:reg[regno]+=mem[add];
printf("\nreg[%d] = %d mem[%d]=%d",regno,reg[regno],add,mem[add]);
break; //ADD

case 2:reg[regno]-=mem[add];
printf("\nreg[%d] = %d mem[%d]=%d",regno,reg[regno],add,mem[add]);
break; //SUB

case 3:reg[regno]*=mem[add];
printf("\nreg[%d] = %d mem[%d]=%d",regno,reg[regno],add,mem[add]);
break; //MULT

case 4:reg[regno]=mem[add];
printf("\nreg[%d] = %d mem[%d]=%d",regno,reg[regno],add,mem[add]);
break;
//MOVER

case 5:mem[add]=reg[regno];
printf("\nreg[%d] = %d mem[%d]=%d",regno,reg[regno],add,mem[add]);
break; //MOVEM

case 6:op1=reg[regno]; op2=mem[add];


printf("\nreg[%d] = %d mem[%d]=%d",regno,reg[regno],add,mem[add]);
break; //COMP
case 7:switch(regno) //BC
{
case 0:if(op1<op2) pc=add-1;break; //LT
case 1:if(op1<=op2) pc=add-1;break; //LE
case 3:if(op1>op2) pc=add-1;break; //GT
case 4:if(op1>=op2) pc=add-1;break; //GE
case 2:if(op1==op2) pc=add-1;break; //EQ
case 5:pc=add-1;break; //ANY
}
printf("\nreg[%d] = %d mem[%d]=%d
cc[%d]=%d",regno,reg[regno],add,mem[add],regno,op1);
break;

case 8:reg[regno]/=mem[add];
printf("\nreg[%d] = %d mem[%d]=%d",regno,reg[regno],add,mem[add]);
break; //DIV
case 9:printf("\nINPUT:");
scanf("%ld",&mem[add]);
printf("\nreg[%d] = %d mem[%d]=%d\n",regno+1,reg[regno+1],add,mem[add]);
break; //READ

case 10:printf("\n\tOUTPUT:%d",mem[add]);
break; //PRINT

case 11:printf("%d\n",add);
printf("\nBefore Swap \nreg[%d] = %d
mem[%d]=%d\n",regno+1,reg[regno],add,mem[add]);

int temp=mem[add];
mem[add]=reg[regno];
reg[regno]=temp;

printf("\nAfter Swap \nreg[%d] = %d


mem[%d]=%d\n",regno+1,reg[regno],add,mem[add]);
break;
case 12:printf("Before Increment register \nreg[%d] = %d ",regno,reg[regno]);
reg[regno]++;
printf("After Increment register \nreg[%d] = %d ",regno,reg[regno]);
break;
case 13:printf("Before Decrement register \nreg[%d] = %d ",regno,reg[regno]);
reg[regno]--;
printf("After Increment register \nreg[%d] = %d ",regno,reg[regno]);

break;
case 14:printf("Before Increment Memory \nmem[%d]=%d ",add,mem[add]);
mem[add]++;
printf("After Increment Memory \nmem[%d]=%d ",add,mem[add]);
break;
}
pc++;
}
}
}

/*Output For Swap:


[root@localhost simulator]# gcc new_simulator.c
[root@localhost simulator]# ./a.out

1-Load
2-Print
3-Accept
4-Run
5-Trace
6-Exit
Enter choice =5

Enter File name :swap.sm0

smaco program swap.sm0 is loading ....into memory

Program is tracing ............


100 90107

INPUT:4

reg[0] = 0 mem[107]=4

101 90108

INPUT:5

reg[0] = 0 mem[108]=5

102 41107

reg[0] = 4 mem[107]=4
103 42108

reg[1] = 5 mem[108]=5
104 52107

reg[1] = 5 mem[107]=5
105 51108

reg[0] = 4 mem[108]=4
106 0
[root@localhost simulator]#
*/

/* Output for Increment

1-Load
2-Print
3-Accept
4-Run
5-Trace
6-Exit
Enter choice =5

Enter File name :incr.sm0

smaco program incr.sm0 is loading ....into memory

Program is tracing ............


100 90105

INPUT:4

reg[0] = 0 mem[105]=4

101 41105

reg[0] = 4 mem[105]=4
102 121000
Before Increment register
reg[0] = 4 After Increment register
reg[0] = 5
103 51105

reg[0] = 5 mem[105]=5
104 0
[root@localhost simulator]#

*/

/*
[root@localhost simulator]# ./a.out

1-Load
2-Print
3-Accept
4-Run
5-Trace
6-Exit
Enter choice =5

Enter File name :decr.sm0

smaco program decr.sm0 is loading ....into memory

Program is tracing ............


100 90105
INPUT:5

reg[0] = 0 mem[105]=5

101 41105

reg[0] = 5 mem[105]=5
102 131000
Before Decrement register
reg[0] = 5 After Increment register
reg[0] = 4
103 51105

reg[0] = 4 mem[105]=4
104 0
[root@localhost simulator]#

*/

/* OutPut for Incrtement Memory:


[root@localhost simulator]# ./a.out

1-Load
2-Print
3-Accept
4-Run
5-Trace
6-Exit
Enter choice =5

Enter File name :m_incr.sm0

smaco program m_incr.sm0 is loading ....into memory

Program is tracing ............


100 90103

INPUT:4

reg[0] = 0 mem[103]=4

101 140103
Before Increment Memory
mem[103]=4 After Increment Memory
mem[103]=5
102 0
*/

You might also like