Professional Documents
Culture Documents
#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);
}
fclose(fp);
}
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 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 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;
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++;
}
}
}
1-Load
2-Print
3-Accept
4-Run
5-Trace
6-Exit
Enter choice =5
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]#
*/
1-Load
2-Print
3-Accept
4-Run
5-Trace
6-Exit
Enter choice =5
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
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]#
*/
1-Load
2-Print
3-Accept
4-Run
5-Trace
6-Exit
Enter choice =5
INPUT:4
reg[0] = 0 mem[103]=4
101 140103
Before Increment Memory
mem[103]=4 After Increment Memory
mem[103]=5
102 0
*/