⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mains.c

📁 坦尼保姆
💻 C
📖 第 1 页 / 共 3 页
字号:
/*#define DEBUG 1*/#include <stdio.h>#include <string.h>#include "88.h"#include "macro.h"#include "var.h"/*#include <sys/types.h>*/#include <sys/stat.h>#include <errno.h>#include <time.h> /* NIEUW15-4-2003 */#define CBUF 180#define MAGIC 0X0201#define MAXSHORT 0XFFFF#define MAXSYMTAB 0XFFFchar fnameL[CBUF], fnameS[CBUF], fname88[CBUF], fnamei[CBUF], fnamet[CBUF];char nulsymbol[]="NULLSYMBOL";time_t t1,t2;struct stat astat[2], *bf;FILE *bituit; int pfildes[2], pnr, termbitsize;char bmbuf[9000];/*file descriptor and procedure number to create a pipe for the bitmap*/char window[24][81], cmdchar, cmdline[30],outveld[4][59];unchr prdepth, bprdepth; /*prdepth altijd bijhouden; bprdepth zetten bij +-= */int stckprdepth[20], prstckpos[20], codelength, instrcount, nsymtab, maxsp;int puthp; /*horizontale en verticale putpositie*/typedef struct { short pcp; unchr bprt; } bprveld;bprveld bparr[32];  /* break point fields */typedef struct {char typ; char sct; short smb; int adrs;} relocveld;relocveld relocarr[1024]; /* relocation variables field */short lndotarr[0X2000],lnsymarr[0X2000],dotlnarr[0X6000],bssreloc;int lnfilarr[0X6000], maxln, symp;/*fileptr in source, max source, last symbol*/int lfptr,cmdfl,inpfl,errflag; /*load file pointer, command or input from file*/char *syssp;	/*pointer in stack for conversion in system calls*/typedef struct {int symvalue; char *symbol; int nextsym; int lnr; char symsect;}	tsymtab; /*symbol table stucture */tsymtab symtab[MAXSYMTAB];char tringfield[1600], stringfield[8000], errbuf[292],inbuf[2024],*inbpl,*inbpu;char  *datadm[7], datadarr[7][81], basename[CBUF];int datadp, /*pointer in datadarr */ symhash[32];  /* pointer in symbol table*/typedef struct {int startad; int lengte; int fstart; int flen; int align;}	segmenthead;segmenthead segmhead[8];typedef union {int ii; char *cp;} paramfield;typedef union {int ii; char cp[140];} sscanfield;FILE *prog, *L, *CMD, *INP, *LOG;pri(){ /* Test for endianness */#ifdef DEBUG fprintf(LOG,"eoplo %d eophi %d eop %d pc %d\n",eoplo&255,eophi&255,eop,(PC)-1);#endif}getint(f) FILE *f; {  int i,j,k;  lfptr += 4;  i = getc(f); j = getc(f);  k = 0; k |= (i&255); k |= ((j&255)<<8);  i = getc(f); j = getc(f);  k |= ((i&255)<<16); k |= ((j&255)<<24);  return(k);}getsh(f) FILE *f; {  int i,j,k;  i = getc(f);  j = getc(f); k = 0;  lfptr += 2;  k |= (i&255); k |= ((j&255)<<8);  return(k);}main(argc,argv) int argc; char **argv;{  char *p;  sp=0; ss=0; pcx=m; cs=0;#ifdef DEBUG LOG=fopen("LoGfIlE","wb"); eoplo=3;pri();eophi=1;pri();/*BIG-LITTLE-ENDIAN? */#endif  if(argc<2){fprintf(stderr, "No .88 load file? Usage s88 loadfile\n"); exit(1);}  stopvlag = traceflag = 0;  sp=0; ss=0; pcx=m; cs=0; argc--; argv++;  if(!argc){fprintf(stderr,"No load file? argc %d %s\n",argc,argv[0]); exit(1);}  if(load(argc,argv)) exit(1); fclose(prog); interp();}load(argc,argv) int argc; char **argv; {  int i,ii,j,k,sections, outrelo, loadl, strl, *pi;  char *p,*p1,*p2;  p=inbuf;  for(i=0;i<1024;i++) *p++ = '\0';  p = m; for(i=0;i<MEMBYTES;i++) if(i && i==sp) break; else *p++ = '\0';  p = argv[0]; for(i=0;i<100;i++)if ((j = *p++)=='.'||j=='\0') break; *(--p)=0;     strcpy(basename,argv[0]);     sprintf(fnameS,"%s.s",basename); sprintf(fname88,"%s.88",basename);    if((prog = fopen(fname88,"rb")) == NULL) {	fprintf(stderr,"Warning: Interpreter 8088 could not find file %s\n",		fname88); system ("sleep 5"); }     if(stat(fnameS,astat)){ fprintf(stderr,"Warning: Does %s exist?\n",fnameL); 	system("sleep 2");} t1 = astat[0].st_mtime;     if(stat(fname88,astat)){fprintf(stderr,"Warning Does %s exist?\n",fname88);	 system("sleep 5");} else t2 = astat[0].st_mtime;     if(t2<t1){fprintf(stderr,"Warning %s is older than %s.\n",	fname88,fnameS); system("sleep 5");} if(traceflag){sprintf(fnameS,"%s.$",basename);sprintf(fnameL,"%s.#",basename);   sprintf(fnamei,"%s.i",basename); sprintf(fnamet,"%s.t",basename); #ifdef DEBUG fprintf(LOG,"Before open #-file |%s|\n",fnameL);fflush(LOG);#endif  if ((L=fopen(fnameL,"r")) == NULL) {    fprintf(stderr,"Cannot open %s\n",fnameL); exit(1);}    i = 0; j = 0; while(fscanf(L,"%d %d",&loadl,&strl)>0){      while(i<=loadl)lndotarr[i++] = strl;      while(j<=strl)dotlnarr[j++] = loadl;   }   if ((INP=fopen(fnamei,"r")) != NULL)inpfl = 1; else {inpfl = 0; INP = stdin;}   if ((CMD=fopen(fnamet,"r")) != NULL)cmdfl = 1; else {cmdfl = 0; CMD = stdin;}   fclose(L); if ((L=fopen(fnameS,"rb")) == NULL) {    fprintf(stderr,"Cannot open %s\n",fnameS); exit(1);}    strl = 0; lnfilarr[1] = lnfilarr[0] = 0; stckprdepth[0] = 1;    for(i=2;i<0Xff8;i++){while((j = getc(L)) != EOF){strl++; if(j=='\n') break;}      if(j==EOF) break; lnfilarr[i] = strl; } maxln = i; rewind(L);    for(i=0;i<7;i++) datadm[i] = NULL; puthp = 0;  }  pcx = p = m; ss = ds = es = 0; CS(0);  for(i=0;i<7;i++) {for(j=0;j<80;j++) datadarr[i][j] = ' '; datadarr[i][81] = '\0';}  datadp = 0; lfptr = 0;  if((i=getsh(prog)) != MAGIC) {fprintf(stderr,"wrong magic load file\n"); return(1);}  i = getsh(prog); /*stamps unimportant */  i = getsh(prog); /*flags unimportant */  sections = getsh(prog); /*number of load sections*/  outrelo = getsh(prog);  /*number of reloactable parts*/  nsymtab = getsh(prog);   /*number of entries in symbol table*/  loadl = getint(prog);   /*length of core image in load file*/  strl = getint(prog);    /*length of string section in load file*/#ifdef DEBUG	fprintf(LOG,"sections %d outrelo %d nsymtab %d loadl %d strl %d\n",		sections,outrelo,nsymtab,loadl,strl); fflush(LOG);#endif  j = 0; for(i=0;i<sections;i++) {	segmhead[i].startad = getint(prog);	 j += ( segmhead[i].lengte = getint(prog));	if(i==0) codelength = segmhead[i].lengte;	segmhead[i].fstart = getint(prog);	segmhead[i].flen = getint(prog);	segmhead[i].align = getint(prog);#ifdef DEBUG  fprintf(LOG,"loadlengte %o %d %x na segment %d\n",j,j,j,i+2); fprintf(LOG,"%6d%5x startad | %6d%5x lengte | %6d%5x fstart | %6d%5x flen | %6d%5x align\n",  segmhead[i].startad,segmhead[i].startad,segmhead[i].lengte,segmhead[i].lengte,   segmhead[i].fstart,segmhead[i].fstart,segmhead[i].flen,segmhead[i].flen,   segmhead[i].align,segmhead[i].align); fflush (LOG);#endif  if(j>99000) {fprintf(stderr,"Insufficient amount of memory %x\n",j); exit(1);}  } ss = ((j+31)>>4); /* stack segment behind loaded text, data, bss segments */  for(i=0;i<sections;i++) {    if(lfptr > segmhead[i].fstart) {	fprintf(stderr,"misalignment in load file\n"); return(1); }    if(i<2) p = m + segmhead[i].startad+(ds<<4);    while((p-m)%segmhead[i].align) p++;    if(i>1) segmhead[i].startad = (p - (ds<<4)) - m;    for(j=0;j<segmhead[i].flen;j++) {*p++ = getc(prog); lfptr++;}    if(!i) {es = ds = (segmhead[i].lengte + 15)>>4; bp = sp = maxsp = 0x7ff8;}#ifdef DEBUG    fprintf(LOG,"i %d startad %d\n",i,segmhead[i].startad);#endif  }    for(i=0;i<outrelo;i++) { /* reads relocation information */      relocarr[i].typ = getc(prog); relocarr[i].sct = getc(prog);      relocarr[i].smb = getsh(prog); relocarr[i].adrs = getint(prog);#ifdef DEBUG    fprintf(LOG,"i %d typ %d sect %d symbol %d adres %d %x\n",i,	(int) relocarr[i].typ, (int) relocarr[i].sct, relocarr[i].smb,	relocarr[i].adrs,relocarr[i].adrs); fflush(LOG);#endif    }  if(traceflag) { for(i=0;i<32;i++) { bparr[i].pcp = 0; bparr[i].bprt = *pcx;}}/*Break point fields initialised on zero field. Next initialise symbol table*/    for(i=0;i<MAXSYMTAB;i++){symtab[i].symvalue=0;symtab[i].symbol=nulsymbol;    symtab[i].nextsym = -1; symtab[i].lnr = 0; symtab[i].symsect = 0;}    for(i=0;i<32;i++) symhash[i] = -1; for(i=0;i<nsymtab;i++) {	symtab[i].nextsym = getint(prog); j = getint(prog); j &= 255;	symtab[i].symsect = (char)(j); symtab[i].symvalue = getint(prog);	if(j==2) symtab[i].lnr = dotlnarr[symtab[i].symvalue];	else if(j > 3) symtab[i].symvalue += segmhead[(j&255)-2].startad;#ifdef DEBUGfprintf(LOG,"i %d j %d nextsym %d symval %d symsect %o\n",i,j, symtab[i].nextsym,symtab[i].symvalue,(int)(symtab[i].symsect)); fflush(LOG);#endif    }    j = ftell(prog);    for(i=0;i<strl;i++){k=getc(prog);stringfield[i]=(char)(k&255);} /*augustus*/  for(i=0;i<nsymtab;i++) {	symtab[i].nextsym -= j;	symtab[i].symbol = stringfield + symtab[i].nextsym;	symtab[i].nextsym = -1;    }    p = stringfield; i = 0;    while((i++<8190) && ((j = getc(prog)) != EOF)) *p++ = j;    for(i=0;i<nsymtab;i++) {j = hashstring(symtab[i].symbol);	pi = &symhash[j]; while (*pi>=0) pi = &(symtab[*pi].nextsym); *pi = i;    } prdepth = 0;    for(i=0;i<0X800;i++) lnsymarr[i] = nsymtab-2;    for(i=0;i<nsymtab-2;i++){	if(symtab[i].symsect == 2) symlcorr(i);    }    j = 0; for(i=0;i<=maxln;i++) {      while((j<nsymtab)) {        if((symtab[j].symsect!=2) ||		(symtab[j].lnr<i) || (symtab[j].symbol[0]=='.')){j++; continue;}	if(symtab[j].lnr == i) k = j; break;} lnsymarr[i] = k;	if(k>=0) for(ii=k+1;ii<=nsymtab;ii++) {	  if((symtab[ii].symsect==2) && (symtab[ii].lnr == i))lnsymarr[i] = ii;}    }  for(i=0;i<outrelo;i++) relocate(i);  if (traceflag) { p = window[0];for(i=0;i<1944;i++) *p++= ' '; p = inbuf;    for(i=0;i<1024;i++) *p++ = '\0'; for(i=1;i<27;i++) fprintf(stderr,"\n");    winfirst(); inbpl=inbpu=inbuf; nextput('>'); nextput(' ');} else INP=stdin;#ifdef DEBUG  logprint(); 	fprintf(LOG,"argc %d  ",argc); for(i=0; i<argc;i++) fprintf(LOG,"%s ",		argv[i]); putc('\n',LOG);  fprintf(LOG,"maxsp %d sp %d bp %d sp %x bp %x\n",maxsp,sp,bp,sp,bp); fflush (LOG);  fflush (LOG);#endif  argv++; argc--; if(argc){ii=argc+4; for(i=0;i<argc;i++) ii += strlen(argv[i]);    ii &= 0Xffe; maxsp -= ii; k = maxsp+2; p2 = m+k+(ss<<4);p1 = p2-4-(argc<<1);    bp = sp = maxsp - 2 - (argc<<1); *p1++ = argc&255; *p1++ = (argc>>8)&255;    for(i=0;i<argc;i++) {*p1++ = k&255; *p1++ = (k>>8)&255; j=strlen(argv[i])+1;      strcpy(p2,argv[i]); p2 += j; k += j;}#ifdef DEBUG  fprintf(LOG,"maxsp %d sp %d bp %d sp %x bp %x\n",maxsp,sp,bp,sp,bp); fflush (LOG);#endif  } return(0);} #ifdef DEBUGlogprint(){  int i,j;  for(i=0;i<32;i++) { j = symhash[i]; fprintf(LOG,"%2d %3d\n",i,j);    while(j>=0) {fprintf(LOG,"%4d val %8s sym %3d nxt %4d lnr %1d sect\n",	symtab[j].symvalue, symtab[j].symbol, symtab[j].nextsym, symtab[j].lnr,	symtab[j].symsect);j = symtab[j].nextsym;}  } fprintf(LOG,"EIND SYMBOL TABLE\n\n");}#endifrelocate(n) int n; {  int tp,sc,st,sa,ss,i,j,k;  char *p,*q,*r, octs[4];#ifdef DEBUGfor(i=0;i<3;i++)   fprintf(LOG,"%6d %4x startad | %6d %4x lengte | %6d %4x fstart | %6d %4x flen | %6d %4x align\n",segmhead[i].startad,segmhead[i].startad,segmhead[i].lengte,segmhead[i].lengte,segmhead[i].fstart,segmhead[i].fstart,segmhead[i].flen,segmhead[i].flen,segmhead[i].align,segmhead[i].align);  fprintf(LOG,"Erin\n"); fflush(LOG);#endif  tp = relocarr[n].typ; sc = relocarr[n].sct; tp &= 0X3f; sc &= 0Xffff;  st = relocarr[n].smb; st &= 0Xffff; sa = relocarr[n].adrs; sa &= 0Xffff;#ifdef DEBUG  fprintf(LOG,"n %d typ %d sect %d symbol %d %s adres %d <--> ",n,tp,sc,st,	symtab[st].symbol,sa); fflush(LOG);#endif  sa += segmhead[sc-2].startad; if(sc>2) sa += ds<<4; /*bodem data segment */#ifdef DEBUG fprintf(LOG,"sa %d %x symval %d \n",sa,sa,symtab[st].symvalue); fflush(LOG);#endif p=m+sa; ss = i=0; /* zoek de unsigned waarde op de positie mem+sa gaat in ss*/ for(k=0;k<(tp&3);k++) {j= *p++; j &= 255; octs[k] = j; j <<= i; i += 8; ss += j;}#ifdef DEBUG fprintf(LOG,"ss %d %x symval %d ",ss,ss,symtab[st].symvalue); fflush(LOG);#endif ss += symtab[st].symvalue;#ifdef DEBUG fprintf(LOG,"ss %d %x symval %d \n",ss,ss,symtab[st].symvalue); fflush(LOG);#endif p=m+sa; /* De nieuwe waarde terugzetten */ for(k=0;k<(tp&3);k++) {*p++ =  octs[k+2] =  ss & 255; ss >>= 8;}#ifdef DEBUG fprintf(LOG,"octs %d %d %d %d \n",(int)octs[0],(int)octs[1],(int)octs[2],(int)octs[3]); fflush(LOG);#endif}symlcorr(i) int i;{  /* corrigeert line number bug voor symbolen uit de text. Zonder correctie   wordt niet het line number, maar de eerste code doorgegeven */  int ln,cd,j,c;  char *p;  ln = symtab[i].lnr;  cd = symtab[i].symvalue;  while(ln>0 && lndotarr[ln] == cd) {     fseek(L,(int)lnfilarr[ln],0);    j = fread(inbuf,1,lnfilarr[ln+1]-lnfilarr[ln],L);    inbuf[j] = '\0';    if(!lcs(inbuf,i)) {symtab[i].lnr = ln; return;}    ln--;  }}lcs(p,s) char *p; int s;{  char c, *q;  int j,k,add;#ifdef DEBUGfprintf(LOG, "lcs symbool %d buffer %.15s\n",s,p); fflush(LOG);#endif  while ((*p <= ' ') || (*p == ':')) if(*p==0) return(-1); else p++;  j = 0; q = p; while(c = *p++) {j++;	if(c=='\n' || c == '!'|| c < '\t' || c > 126) return(-1);	if(c<= ' ') return(lcs(q+j,s));	if(c==':') {k=j; p -= 2;		add = hashstring(q); 		k = symhash[add]; 		if(k<0) return(-1);		while (k>=0) { if(k==s) break;			if(symtab[k].nextsym<0) break;					k = symtab[k].nextsym;}#ifdef DEBUG  	fprintf(LOG,"lcs symbool %d kop %d zoek %d %s buffer %.15s  j %d %d\n",		s,add,k,symtab[k].symbol,q,j,strlen(symtab[k].symbol)); fflush(LOG);#endif		if((k==s)&&(!strncmp(q,symtab[k].symbol,j-1))			 && (strlen(symtab[k].symbol)==j-1)) return(0);		if (*q<='\n') return(-1); return(lcs(q+j,s));	}  } return(-1);}char *spadr() {  int i;  i = 0;  i |= (*syssp++) & 0xff;  i |= ((*syssp++)<<8) & 0xffff; /* sprintf(errbuf,"i %4x i+ds %4x m %8x samen %8x\n",i,	i+(ds<<4), m, m+i+(ds<<4)); erroutine();    system("sleep 5");*/  return(m+i+(ds<<4));}spint() {  int i;  i = 0;  i |= (*syssp++) & 255;  i |= (*syssp++)<<8;  return(i & 0xffff);}returnax(retval) int retval; {  al=(char)(retval&0xff);  ah=(char)((retval>>8)&0xff);}syscal(){  char calnr, *q, *p, c;  int retval,i,j,ar[9],k,l,kk,ll,fwidth[9];  paramfield pram[8];  sscanfield s[9];  /*adrfield adrf;*/  syssp = (sp&0xffff) + (ss<<4) + m;  calnr = *syssp;  syssp += 2;/*sprintf(errbuf,"system call %3d, %x",calnr,calnr); meldroutine(); winupdate();*/  switch (calnr) {   	case 0x01: /*exit*/		if(traceflag) {winupdate(); wmv(24,0); winupdate(); wmv(24,0);		fprintf(stderr,"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");}		exit(spint());		break;   	case 0x02: /*fork*/		retval = fork();		returnax(retval); break;   	case 0x03: /*read*/		pram[0].ii = spint();		pram[1].cp = spadr(); 		pram[2].ii = spint();		if (traceflag && (pram[0].ii == 0)) {retval = 0; p = pram[1].cp;			while((j=getchbp())>0) {*p++ = j; retval++;		          if(! --(pram[2].ii)) break;}			if(retval==0) retval = j;}		else retval = read(pram[0].ii,pram[1].cp,pram[2].ii);		returnax(retval); break;   	case 0x04: /*write*/		pram[0].ii = spint(); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -