📄 mains.c
字号:
/*#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 + -