Showing posts with label system programming. Show all posts
Showing posts with label system programming. Show all posts

One Pass Assembler [ SIC Load and Go Assembler Simulation]


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
struct node
{
int addr;
struct node *link;
};
struct symbol
{
char label[10];
int addr;
struct node *ptr;
}symtab[100];
void inserttosymtab(char *,int,int);
void resolve(int,int);
void modifyobjectcode(int,int);
int checkresolved(void) ;
int searchsymbol(char *,int*);
int searchopcode(char *);
int current=0,start;
char objectcode[500]={'\0'} ;
void main()
{
FILE *fin;
int i,locctr,found,det,x,nloc,len,addr,loadaddr;
char s[10],operand[10],opcode[10],label[10];
fin=fopen("input.txt","r");
fscanf(fin,"%s%s%s",label,opcode,operand);
if(strcmp(opcode,"START")==0)
{

locctr=atoi(operand);
start=locctr;
}
else
locctr=0;

fscanf(fin,"%s%s%s",label,opcode,operand);

while(strcmp(opcode,"END")!=0)
{
if(strcmp(label,"-")!=0)
{
      found=searchsymbol(label,&addr);
      if(found==1)
      {
printf("Duplicate label found\n");
exit(0);
      }
      else if(found==0)
      {
inserttosymtab(label,locctr,0);
       }
      else
resolve(locctr,addr);

}
det=searchopcode(opcode );
if(det==1)
{
strcat(objectcode,opcode);
locctr=locctr+1;
found=searchsymbol(operand,&addr);
if(found==0|| found==2)
{
strcat(objectcode,"0000");
if(strcmp(operand,"-")!=0)
inserttosymtab(operand,locctr,1);
locctr=locctr+2;
}
else if(found==1)
{

sprintf(operand,"%d",addr);
strcat(objectcode,operand);
locctr=locctr+2;
}
  }
else if((strcmp(opcode,"BYTE")==0)||(strcmp(opcode,"WORD")==0))
{
if(strcmp(opcode,"WORD")==0)
{
    len=strlen(operand);
    for(i=0;i<(6-len);i++)
    strcat(objectcode,"0");
    strcat(objectcode,operand);
    locctr=locctr+3;

}
else
{
len=strlen(operand);
for(i=2;i<len-1;i++)
{
x=toascii(operand[i]);
sprintf(s,"%d",x);
strcat(objectcode,s);
}
locctr=locctr+len-3;

}
}
else if(strcmp(opcode,"RESW")==0)
{
nloc=3*atoi(operand);
locctr=locctr+3*atoi(operand);
for(i=0;i<nloc;i++)
strcat(objectcode,"X");
}
else if(strcmp(opcode,"RESB")==0)
{
nloc=atoi(operand);
locctr=locctr+atoi(operand);
for(i=0;i<nloc;i++)
strcat(objectcode,"XX");
}


    fscanf(fin,"%s%s%s",label,opcode,operand);

}
fclose(fin);
if(checkresolved())
{
i=0;
loadaddr=start;
printf("\n......Load and Go One Pass assembler loaded memory map....\n");

while(objectcode[i]!='\0')
{
if(i%32==0)
{
printf("\n%d",loadaddr);
loadaddr=loadaddr+16;
}
if(i%8==0 )
printf("  ");
printf("%c",objectcode[i]);
i++;
}
}

}

void inserttosymtab(char *label,int locctr,int flag)
{
struct node *temp;
int det,pos;

if(flag==0)
{
strcpy(symtab[current].label,label);
symtab[current].addr=locctr;
symtab[current].ptr=NULL;
current++;
}
else
{
det=searchsymbol(label,&pos);
if(det==0)
{
pos=current;
current++;
}
strcpy(symtab[pos].label,label);
temp=(struct node *)malloc(sizeof(struct node));
temp->addr=locctr;
temp->link=symtab[pos].ptr;
symtab[pos].ptr=temp;
}

}
int searchsymbol(char *label,int *addr)
{
int i=0;
for(i=0;i<current;i++)
{
if(strcmp(symtab[i].label ,label)==0)
{
if(symtab[i].ptr==NULL)
{
*addr=symtab[i].addr;
return 1;
}
else
{ *addr=i;
return 2;
}
}
}
return 0;
}
void resolve(int locctr,int loc)
{
struct node *temp;
temp=symtab[loc].ptr;
while(temp!=NULL)
{
modifyobjectcode(temp->addr,locctr);
temp=temp->link;
}
symtab[loc].ptr=NULL;
symtab[loc].addr=locctr;
}

void modifyobjectcode(int addr,int locctr)
{

char operand[10];
int i=0;
sprintf(operand,"%d",locctr);
addr=(addr-start)*2;
while(operand[i]!='\0')
{
objectcode[addr]=operand[i];
addr++;
i++;
}
}

int searchopcode(char *opcode)
{
char opmne[10],op[10];
int flag=0;
FILE *optab;
optab=fopen("optab.txt","r");

fscanf(optab,"%s%s",opmne,op);

while(!feof(optab))
{
if(strcmp(opcode,opmne)==0)
{
flag=1;
strcpy(opcode,op);
break;


}
else
fscanf(optab,"%s%s",opmne,op);
}
fclose(optab);
return flag;
}

int checkresolved(void)
{
int i=0,flag=1;
for(i=0;i<current;i++)
{
if(symtab[i].ptr!=NULL)
{
printf("%s is not resoved,",symtab[i].label);
flag=0;
}
}
return(flag);
}
INPUT FILES
input.txt
optab.txt
Output

Pass 2 of SIC Assembler(updated for gcc)

C Program for Pass 2 of SIC Assembler
Note:- first run pass1 of SIC Assembler program in the blog
Output- object.txt
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

int main()
{
 FILE *fint,*ftab,*flen,*fsym,*fout;
 int c,op1[10],txtlen,txtlen1,i,j=0,x,len,txtstart;
 char add[5],starttemp[5],txtrec[70]={'\0'},s[70],symadd[5],op[5],start[10],temp[30],line[20],label[20],mne[10],operand[10],symtab[10],opmne[10];

 fint=fopen("interm.txt","r");
 flen=fopen("length.txt","r");
 ftab=fopen("optab.txt","r");
 fsym=fopen("symtab.txt","r");
 fout=fopen("objectcode.txt","w");
 
 fscanf(fint,"%s%s%s%s",add,label,mne,operand);
 if(strcmp(mne,"START")==0)
 {
  strcpy(start,operand);
  fscanf(flen,"%d",&len);
 }
 strcpy(starttemp,start);
 fprintf(fout,"H%6s%6s%06d\n",label,start,len);
 fscanf(fint,"%s%s%s%s",add,label,mne,operand);
 strcat(txtrec,"T00");
 txtstart=atoi(start);
 strcat(txtrec,start);
 strcat(txtrec,"00");
 c=8;

 while(strcmp(mne,"END")!=0)
 {
  fscanf(ftab,"%s%s",opmne,op);
  while(!feof(ftab))
  {
   if(strcmp(mne,opmne)==0)
   {
    fclose(ftab);
    fscanf(fsym,"%s%s",symadd,symtab);
    while(!feof(fsym))
    {
     if(strcmp(operand,symtab)==0)
     {       fclose(fsym);
      strcat(txtrec,op);
      strcat(txtrec,symadd);

      c=c+6;
      break;
     }
     else
      fscanf(fsym,"%s%s",symadd,symtab);
    }
    break;
   }
   else
    fscanf(ftab,"%s%s",opmne,op);
  }
  if((strcmp(mne,"BYTE")==0)||(strcmp(mne,"WORD")==0))
  {
   if(strcmp(mne,"WORD")==0)
   {
        len=strlen(operand);
        for(j=0;j<(6-len);j++)
        strcat(txtrec,"0");
        strcat(txtrec,operand);
         c=c+6;
   }
   else
   {
    len=strlen(operand);
    for(i=2;i<len;i++)
    {
     x=toascii(operand[i]);
     sprintf(s,"%d",x);
     strcat(txtrec,s);
    }
    c=c+len*2;

   }
  }
  if(c==68)
  {
   x=(c-9)/2;
   x++;
   sprintf(s,"%d",x);
   txtrec[7]=s[0];
   txtrec[8]=s[1];
   fprintf(fout,"%s\n",txtrec);
   strcpy(txtrec,"\0");
   strcat(txtrec,"T00");
   txtstart=txtstart+x;
   sprintf(s,"%d",txtstart);
   strcat(txtrec,s);
   strcat(txtrec,"00");
   c=8;
  }

  fscanf(fint,"%s%s%s%s",add,label,mne,operand);
  ftab=fopen("optab.txt","r");
  fsym=fopen("symtab.txt","r");
  fseek(fsym,SEEK_SET,0);
  fseek(ftab,SEEK_SET,0);
 }
 x=(c-9)/2;
 x++;
 sprintf(s,"%d",x);
 txtrec[7]=s[0];
 txtrec[8]=s[1];
 fprintf(fout,"%s\n",txtrec) ;
 fprintf(fout,"E00%s",start);
 fclose(fint);

 
 fclose(fout);
 fclose(flen);
 printf("object code is generated. check objectcode.txt file\n");


       
}
Output
Objectc.txt
H  copy  1000000061
T001000304410481810531C10550C10580010481810531C10550C1058001048181053
T001030281C10550C10580010481810531C10550C10587576786769000005
E001000

Pass 1 of SIC Assembler Simulation

C Program for Pass 1 of SIC Assembler Simulation

Note: - use input.txt --SIC input program              Use optab.txt--opcode table of SIC

 Output:-symtab.txt--symbol table                interm.txt- intermediate code

Here addresses are in decimal format
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
int  main()
{
FILE *f1,*f2,*f3,*f4,*f5;
int lc,sa,l,op1,o,len;
char m1[20],la[20],op[20],otp[20];
f1=fopen("input.txt","r");
f3=fopen("symtab.txt","w");
f4=fopen("interm.txt","w");
f5=fopen("length.txt","w");
fscanf(f1,"%s%s%d",la,m1,&op1);
if(strcmp(m1,"START")==0)
{
sa=op1;
lc=sa;
fprintf(f4,"%d\t\%s\t%s\t%d\n",op1,la,m1,op1);
}
else
{
lc=0;
}
fscanf(f1,"%s%s",la,m1);
while(!feof(f1))
{
fscanf(f1,"%s",op);
fprintf(f4,"\n%d\t%s\t%s\t%s\n",lc,la,m1,op);
if(strcmp(la,"-")!=0)
{
fprintf(f3,"\n%d\t%s\n",lc,la);
}
f2=fopen("optab.txt","r");
fscanf(f2,"%s%d",otp,&o);
while(!feof(f2))
{
if(strcmp(m1,otp)==0)
{
lc=lc+3;
break;
}
fscanf(f2,"%s%d",otp,&o);
}
fclose(f2);
if(strcmp(m1,"WORD")==0)
{
lc=lc+3;
}
else if(strcmp(m1,"RESW")==0)
{
op1=atoi(op);
lc=lc+(3*op1);
}
else if(strcmp(m1,"BYTE")==0)
{
if(op[0]=='X')
{
lc=lc+1;
}
else
{
len=strlen(op)-2;
lc=lc+len;
}
}
else if(strcmp(m1,"RESB")==0)
{
op1=atoi(op);
lc=lc+op1;
}
fscanf(f1,"%s%s",la,m1);
}
if(strcmp(m1,"END")==0)
{
fprintf(f5,"%d",lc-sa);
}
fclose(f1);
fclose(f4);
fclose(f5) ;
fclose(f3);
      
}

Input files
optab.txt( use tab key between mnemonic code and opcode)
ADD 18
AND 40
COMP 28
DIV         24
FIX         C4
J         3C
JEQ         30
JGT          34
JLT          38
JSUB  48
LDA 00
LDB 68
LDCH 50
LDL 08
LDX 04
MUL D0
OR          44
RD          D8
RSUB  4C
STA           0C
STB           78
STCH 54
STL            14
STX           10
SUB            1C
TD             E0
TIX           2C
WD               DC

input.txt (if symbol is not in the label field place a - mark)
copy    START   1000 
-       OR      ALPHA
-       ADD     ONE
-       SUB     TWO
-       STA     BETA
- LDA     ALPHA
-       ADD     ONE
-       SUB     TWO
-       STA     BETA
- LDA     ALPHA
-       ADD     ONE
-       SUB     TWO
-       STA     BETA
- LDA     ALPHA
-       ADD     ONE
-       SUB     TWO
-       STA     BETA
ALPHA   BYTE    C'KLNCE
ONE     RESB    2
TWO     WORD    5
BETA    RESW    1
_       END     _

Output
symtab.txt

1048 ALPHA

1053 ONE

1055 TWO

1058 BETA

1061 _

interm.txt

1000 copy START 1000

1000 - OR ALPHA

1003 - ADD ONE

1006 - SUB TWO

1009 - STA BETA

1012 - LDA ALPHA

1015 - ADD ONE

1018 - SUB TWO

1021 - STA BETA

1024 - LDA ALPHA

1027 - ADD ONE

1030 - SUB TWO

1033 - STA BETA

1036 - LDA ALPHA

1039 - ADD ONE

1042 - SUB TWO

1045 - STA BETA

1048 ALPHA BYTE C'KLNCE

1053 ONE RESB 2

1055 TWO WORD 5

1058 BETA RESW 1

1061 _ END _