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

📄 mainsafe.c

📁 坦尼保姆
💻 C
📖 第 1 页 / 共 3 页
字号:
/*#define DEBUG 1*/
#include <stdio.h>
#include <string.h>
#include <unistd.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 0XFFF

char 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((argv[0][0] | 0X20) == 't') */ stopvlag = traceflag = 1;
  /* else 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); sleep(5); }
     if(stat(fnameS,astat)){ fprintf(stderr,"Warning: Does %s exist?\n",fnameL); 
	sleep(2);} t1 = astat[0].st_mtime;
     if(stat(fname88,astat)){fprintf(stderr,"Warning Does %s exist?\n",fname88);
	 sleep(5);} else t2 = astat[0].st_mtime;
     if(t2<t1){fprintf(stderr,"Warning %s is older than %s.\n",
	fname88,fnameS); 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,"rb")) == 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,"rb")) != NULL)inpfl = 1; else {inpfl = 0;INP = stdin;}
   if ((CMD=fopen(fnamet,"rb")) != 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 DEBUG
fprintf(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 DEBUG
logprint(){
  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");
}
#endif

relocate(n) int n; {
  int tp,sc,st,sa,ss,i,j,k;
  char *p,*q,*r, octs[4];
#ifdef DEBUG
for(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 &= 0Xffff; 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;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;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 DEBUG
fprintf(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]; 
		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();
    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;
  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;}

⌨️ 快捷键说明

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