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