SIC Assembler PASS 2

This is the code i did for pass2 of a SIC assembler. Please go through it and feedback on how to improve it.


#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
int newrec(FILE *fp,int *lim,int l,int pos,int c,char add[]){
	if(l>=30){
		*lim=30;
		}
	else{
		*lim=l;
		}
	fseek(fp,pos,SEEK_SET);
	fprintf(fp,"%02X",c);
	fseek(fp,0,SEEK_END);
	fprintf(fp,"\nT^00%s^",add);
	pos=ftell(fp);
	fprintf(fp,"--");
	c=0;
	return pos;
	}
int convhex(char str[]){
	int hex=0,l,d,i=0;
	l=strlen(str)-1;
	while(str[i]!='\0'){
		switch(str[i]){
			case '0':case '1':case '2':case '3':
			case '4':case '5':case '6':case '7':
			case '8':case '9':
			d=str[i]-48;
			break;
			case 'A':case'B':case'C':case'D':case'E':case'F':
			d=str[i]-55;
			break;
			}
		hex=hex+(d*pow(16,l));
		l--;
		i++;
		}
	return hex;
	}
int check(char op[]){
	int i;
	for(i=0;op[i]!='\0';i++){
		if(op[i]==','){
			op[i]='\0';
			return 1;
			}
		}
	return 0;
	}

int main(){
	FILE *fint,*ftab,*flen,*fsym,*fobj;
	int i,len,l,pos,flag,lim=30,c=0,chk,f=0,sym;
	char add[5],symadd[5],op[5],start[10];
	char label[20],mne[10],operand[10],symtab[10],opmne[10];
	clrscr();
	fint=fopen("intermed.txt","r");
	flen=fopen("length.txt","r");
	ftab=fopen("optab.txt","r");
	fsym=fopen("symtab.txt","r");
	fobj=fopen("objcode.txt","w");
	fscanf(fint,"%s%s%s%s",add,label,mne,operand);
	if(strcmp(mne,"START")==0){
		strcpy(start,operand);
		fscanf(flen,"%X",&len);
		}
	fprintf(fobj,"H^%s^%s^%X\n",label,start,len);
	l=len;
	fscanf(fint,"%s%s%s%s",add,label,mne,operand);
	fprintf(fobj,"T^00%s^",add);
	pos=ftell(fobj);
	fprintf(fobj,"--");
	while(strcmp(mne,"END")!=0){
		fscanf(ftab,"%s%s",opmne,op);
		while(!feof(ftab)){
			if(strcmp(mne,opmne)==0){
				f=0;
				fclose(ftab);
				fscanf(fsym,"%s%s",symadd,symtab);
				chk=check(operand);
				while(!feof(fsym)){
					if(strcmp(operand,symtab)==0){
						f=1;
						sym=convhex(symadd);
						if(lim<3){
							pos=newrec(fobj,&lim,l,pos,c,add);
							c=0;
							}
						lim-=3;
						l-=3;
						fprintf(fobj,"^%s%04X",op,(sym|(chk*32768)));
						c=c+3;
						break;
						}
					else
					fscanf(fsym,"%s%s",symadd,symtab);
					}
				if(f==0){
					if(lim<3){
						pos=newrec(fobj,&lim,l,pos,c,add);
						c=0;
					}
					lim-=3;
					l-=3;
					c+=3;
					fprintf(fobj,"^%s0000",op);
				}
				break;
			}
			else
			fscanf(ftab,"%s%s",opmne,op);
		}
		if((strcmp(mne,"BYTE")==0)||(strcmp(mne,"WORD")==0)){
			if(strcmp(mne,"WORD")==0){
				int b;
				b=atoi(operand);
				if(lim<3){
					pos=newrec(fobj,&lim,l,pos,c,add);
					c=0;
				}
				lim-=3;
				l-=3;
				c+=3;
				fprintf(fobj,"^%06X",b);
			}
			else{
				int j=0,k=0;
				char str[4];
				len=strlen(operand);
				if((operand[j]=='X')){
					j=2;
					while(j<len-1){
						str[k++]=operand[j];
						j++;
					}
					str[k]='\0';
					if(lim<1){
						pos=newrec(fobj,&lim,l,pos,c,add);
						c=0;
					}
					lim-=1;
					l-=1;
					c+=1;
					fprintf(fobj,"^%s",str);
				}
				else{
					if(lim<3){
						pos=newrec(fobj,&lim,l,pos,c,add);
						c=0;
					}
					lim-=3;
					l-=3;
					c+=3;
					fprintf(fobj,"^");
					for(i=2;i<len-1;i++){
						fprintf(fobj,"%X",operand[i]);
					}
				}
			}
			fscanf(fint,"%s%s%s%s",add,label,mne,operand);
		}
		else if(strcmp(mne,"RESW")==0||strcmp(mne,"RESB")==0){
			while(strcmp(mne,"RESW")==0||strcmp(mne,"RESB")==0){
				if(strcmp(mne,"RESW")==0){
					l=l-(3*atoi(operand));
				}
				else
				l=l-(atoi(operand));
				fscanf(fint,"%s%s%s%s",add,label,mne,operand);
			}
			flag=0;
			if(strcmp(mne,"END")==0){
				flag=1;
			}
			if(flag==0){
				pos=newrec(fobj,&lim,l,pos,c,add);
				c=0;
			}
		}
		else{
			fscanf(fint,"%s%s%s%s",add,label,mne,operand);
		}
		ftab=fopen("optab.txt","r");
		fseek(ftab,SEEK_SET,0);
		fseek(fsym,SEEK_SET,0);
	}
	fseek(fobj,pos,SEEK_SET);
	fprintf(fobj,"%02X",c);
	fseek(fobj,0,SEEK_END);
	fprintf(fobj,"\nE^00%s",start);
	fcloseall();
	getch();
	return 0;
}