📄 main.c
字号:
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();
pram[1].cp = spadr();
pram[2].ii = spint();
if(traceflag && (pram[0].ii==1)){ retval = pram[2].ii;
p = pram[1].cp; while(pram[2].ii){nextput(*p++);(pram[2].ii)--;}
/*winupdate();*/
}
else {if(traceflag && (pram[0].ii==2)){ retval = pram[2].ii;
p = pram[1].cp; sprintf(errbuf,"%.55s",p); erroutine();
/*winupdate();*/
}
else retval = write(pram[0].ii,pram[1].cp,pram[2].ii);}
returnax(retval); break;
case 0x05: /*open*/
pram[0].cp = spadr();
pram[1].ii = spint()|O_BINARY;
retval = open(pram[0].cp,pram[1].ii);
returnax(retval); break;
case 0x06: /*close*/
pram[0].ii = spint();
if(traceflag && (pram[0].ii)==1) {
sprintf(errbuf,"close call standard output cannot be traced");
erroutine(); retval = 1;
} else retval = close(pram[0].ii);
returnax(retval); break;
case 0x08: /*creat*/
pram[0].cp = spadr();
pram[1].ii = spint();
retval = creat(pram[0].cp,pram[1].ii);
returnax(retval); break;
case 0x09: /*link*/
pram[0].cp = spadr();
pram[1].cp = spadr();
retval = link(pram[0].cp,pram[1].cp);
returnax(retval); break;
case 0x0b: /*exec*/
pram[0].cp = spadr();
if((prog = fopen(pram[0].cp,"rb")) == NULL) {
sprintf(errbuf,"Interpreter 8088 cannot open %s",
pram[0].cp);erroutine();
returnax(-1);
} else {
if(load()) returnax(-1);
fclose(prog);
} break;
case 0x13: /*lseek*/
pram[0].ii = spint();
pram[1].ii = 0;
pram[1].ii |= spint();
pram[1].ii |= (spint()<<16);
pram[2].ii = spint();
retval = lseek(pram[0].ii,pram[1].ii,pram[2].ii);
dl=(char)((retval>>16)&0xff);
dh=(char)((retval>>24)&0xff);
returnax(retval); break;
case 0x40: pram[0].ii = spint(); pram[1].ii = spint();
pram[2].ii = spint();
bitmapopen(pram[0].ii,pram[1].ii,pram[2].ii);
break;
case 0x41: pram[0].ii = spint(); pram[1].ii = spint();
pram[2].cp = spadr();
bitmapdump(pram[0].ii,pram[1].ii,pram[2].cp);
break;
case 0x75: /*getchar*/
if(traceflag) { retval = getchbp();
} else retval = getchar();
if(eolgezien == 1 && retval==4) retval=-1;
if(retval==10) eolgezien=1; else eolgezien=0;
returnax(retval); break;
case 0x79: /*sprintf* / sprintf(buf,"%s\n",spadr());break; */
pram[0].cp = spadr();
p = pram[1].cp = spadr(); j = 2;
/*fprintf(stderr,"%x %d %d pram\n",pram[0].ii,pram[0].ii,0);*/
/*fprintf(stderr,"%x %d %d pram\n",pram[1].ii,pram[1].ii,1);*/
while(c=*p++) {
/* fprintf(stderr,"`%c ",c);*/
if(c == '%') {
i = 1;
while (i && (c = *p++)) {
switch(c) {
case ' ': case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7': case '8':
case '9': case '.': case '-': case '+': case '#': break;
case '*': pram[j++].ii = spint(); break;
case 'l': case 'L': i = 2; break;
case 'D': case 'O': case 'X': case 'U': i=2;
case 'd': case 'o': case 'x': case 'u': case 'c':
case 'i':
pram[j].ii = spint();
if (i==2) pram[j].ii |= (spint()<<16);
else if(((c=='d') || (c == 'i'))
&& (pram[j].ii & 0x8000))
pram[j].ii |= 0xffff0000;
j++; i=0; break;
case 's': pram[j].cp = spadr(); i=0;j++;break;
case 'e': case 'E': case 'f': case 'F': case 'g':
sprintf(errbuf,"Floats not implemented");erroutine();
default: i = 0; break;
}
}
/*fprintf(stderr,"%x %d %d pram\n",pram[j].ii,pram[j].ii,j);*/
}
}
if(j>8) { sprintf(errbuf,"not more than 6 conversions in printf");erroutine();}
/*sprintf(errbuf,"pram %x in sprintf\n",pram[0].cp-m); erroutine();*/
retval = (int) (sprintf(pram[0].cp,pram[1].cp,pram[2].ii,
pram[3].ii,pram[4].ii,pram[5].ii,pram[6].ii,pram[7].ii));
returnax(retval); break;
case 0x7a: /*putchar*/
pram[0].ii = spint();
if (traceflag) {nextput(pram[0].ii); retval = pram[0].ii;
/*winupdate();*/}
else {retval = putchar(pram[0].ii); fflush(stdout);}
returnax(retval); break;
case 0x7d: /*sscanf*/
for(i=0;i<9;i++) ar[i] = 0;
pram[0].cp = spadr();
p = pram[1].cp = spadr(); j = 2;
while(c=*p++) {
if(c == '%') {
i = 2;
while (i && (c = *p++)) {
switch(c) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
case '.': case '-': case '+': case '*': break;
case 'l': case 'L': i=4; break;
case 'h': case 'H': i=1; break;
case 'D': case 'O': case 'X': case 'U': case 'd':
case 'o': case 'x': case 'u': ar[j] = i; i = 0;
pram[j].cp = spadr(); j++; break;
case 'c': case 's':
pram[j].cp = spadr(); j++; i=0; break;
case '[': pram[j].cp = spadr(); j++; i=0;
while((c=*p++) != ']') if(c < ' ') break; break;
case 'e': case 'E': case 'f': case 'F': case 'g':
sprintf(errbuf,"Floats not implemented");erroutine();
default: i = 0; break;
}
/*fprintf(stderr,"%c c %d j %d i %d ar[j] %s pram\n",c,j,i,ar[j-1],pram[j-1].cp);*/
}
}
}
if(j>8) { sprintf(errbuf,"not more than 6 conversions in sscanf");erroutine();}
/*fprintf(stderr,"voor sscanf\n");*/
retval = sscanf(pram[0].cp,pram[1].cp,&s[2],&s[3],&s[4],&s[5],&s[6],&s[7]);
/*fprintf(stderr,"na sscanf \n\n\n\n\n\n");
fprintf(stderr,"na sscanf |%s| |%s| %d %s %d ||\n",pram[0].cp,pram[1].cp,s[2].ii,s[3].cp,s[4].ii);
for(i=2;i<j;i++) fprintf(stderr," %d %d %s",i,ar[i],&s[i]); putc('\n',stderr);*/
for(i=2;i<j;i++) if (ar[i]>0) { if(ar[i] == 1) *pram[i].cp = *(s[i].cp+1);
else { if(ar[i] == 2) {k = (s[i].ii & 255); *(pram[i].cp) = (char)k;
l = (s[i].ii >> 8) & 255; *(pram[i].cp+1) = (char)(l);}
else {l = (s[i].ii >> 24) & 255; *(pram[i].cp+3) = (char)l;
l = (s[i].ii >> 16) & 255; *(pram[i].cp+2) = (char)l;
l = (s[i].ii >> 8) & 255; *(pram[i].cp+1) = (char)l;
l = s[i].ii & 255; *(pram[i].cp) = (char)l;
}
}
}
else { strcpy(pram[i].cp,s[i].cp); /*fprintf(stderr,"%s %s\n",pram[i].cp,s[i].cp);*/}
returnax(retval); break;
case 0x7f: /*printf*/
p = pram[0].cp = spadr(); j = 1;
while(c=*p++) {
/* fprintf(stderr,"`%c ",c);*/
if(c == '%') {
i = 1;
while (i && (c = *p++)) {
switch(c) {
case ' ': case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7': case '8':
case '9': case '.': case '-': case '+': case '#': break;
case '*': pram[j++].ii = spint(); break;
case 'l': case 'L': i = 2; break;
case 'D': case 'O': case 'X': case 'U': i=2;
case 'd': case 'o': case 'x': case 'u': case 'c':
case 'i':
pram[j].ii = spint();
if (i==2) pram[j].ii |= (spint()<<16);
else if(((c=='d') || (c == 'i'))
&& (pram[j].ii & 0x8000))
pram[j].ii |= 0xffff0000;
j++; i=0; break;
case 's': pram[j].cp = spadr(); i=0;j++;break;
case 'e': case 'E': case 'f': case 'F': case 'g':
sprintf(errbuf,"Floats not implemented");erroutine();
default: i = 0; break;
}
}
}
}
if(j>8) { sprintf(errbuf,"not more than 7 conversions in printf");erroutine();}
/*sprintf(errbuf,"pram %x in printf\n",pram[0].cp-m); erroutine();*/
if(traceflag) {retval = j; sprintf(tringfield+200,pram[0].cp,pram[1].ii,
pram[2].ii,pram[3].ii,pram[4].ii,pram[5].ii,pram[6].ii,pram[7].ii);
p = tringfield+200; while(j = *p++) nextput(j); /*winupdate();*/}
else {retval = printf(pram[0].cp,pram[1].ii,pram[2].ii,
pram[3].ii,pram[4].ii,pram[5].ii,pram[6].ii,pram[7].ii);
fflush(stdout);}
returnax(retval); break;
default: sprintf(errbuf,"Unimplemented sys call %d",calnr);erroutine(); exit(1); break;
/* case 0x07: /*wait* / break;
case 0x0c: /*cdir* / break;
case 0x0d: /*time* / break;
case 0x0e: /*mknod* / break;
case 0x0f: /*chmod* / break;
case 0x10: /*chown* / break;
case 0x11: /*brk* / break;
case 0x12: /*stat* / break;
case 0x14: /*getpid* / break;
case 0x15: /*mount* / break;
case 0x16: /*umount* / break;
case 0x17: /*setuid* / break;
case 0x18: /*getuid* / break;
case 0x19: /*stime* / break;
case 0x1a: /*ptrace* / break;
case 0x1b: /*alarm* / break;
case 0x1c: /*fstat* / break;
case 0x1d: /*pause* / break;
case 0x1e: /*utime* / break;
case 0x1f: /*stty* / break;
case 0x20: /*gtty* / break;
case 0x21: /*access* / break;
case 0x22: /*nice* / break;
case 0x23: /*ftime* / break;
case 0x24: /*sync* / break;
case 0x25: /*kill* / break;
case 0x29: /*dup* / break;
case 0x2a: /*pipe* / break;
case 0x2b: /*times* / break;
case 0x2c: /*profil* / break;
case 0x2e: /*setgid* / break;
case 0x2f: /*getgid* / break;
case 0x30: /*signal* / break;
case 0x33: /*acct* / break;
case 0x35: /*lock* / break;
case 0x36: /*ioctl* / break;
case 0x3b: /*exece* / break;
case 0x3c: /*umask* / break;
case 0x3d: /*chroot* / break;
case 0x76: /*getc* / break;
case 0x77: /*gets* / break;
case 0x78: /*ungetc* / break;
case 0x7e: /*scanf* / break;
case 0x7b: /*putc* / break;
case 0x7c: /*puts* / break; */
}
}
dump(){
int i,j,k;
char *p;
#ifdef DEBUG
fprintf(LOG,"\npc %4o %4o %6d %4x\n",(pcx-m)&255,((pcx-m)<<8)&255,(pcx-m),(pcx-m));
p = m; for(i=0;i<256;i++) {j=(*p++ & 255); if(i%16==0) fprintf(LOG,
"\n%6o\t",i); fprintf(LOG," %03o",(m[i]&255));} fprintf(LOG,"\n"); fflush(LOG);
#endif
cnulbp();
pdmpadr();
/* for(i=prdepth;i>=0;i--) {if(i==prdepth-3) break; j=stckprdepth[i];
k = lnsymarr[j];
} */
if (errflag) sleep(1);rdcmd();
if (errflag) { sprintf(window[10]+22,"E Last message: %-37.37s",errbuf);
errflag = 0;}
else if (window[10][22] == 'M')
{sprintf(window[10]+22," %-55.55s",window[10]+37);}
p = errbuf; for(i=0;i<56;i++) *p++ = ' ';
}
procdepth(s) int s; {
if(s>0){prdepth++;stckprdepth[prdepth] = dotlnarr[(((int)(PC)) & 0Xffff) -s];
prstckpos[prdepth] = sp-2;}
if(s==-1) { checkret(); prdepth --;}
if(prdepth == bprdepth) stopvlag |= 1; else stopvlag &= 254;
}
checkret(){
if(sp != prstckpos[prdepth]) {
sprintf(errbuf,"Return on suspicious stack pointer prdepth %d",
prdepth);erroutine(); if(traceflag) dump(); exit(1);
}
}
zetbp(textdot) short textdot; {
int i;
for (i=1;i<32;i++) if(!bparr[i].pcp) break;
if(i==32) {sprintf(errbuf,"break point table full");erroutine(); return(0);}
bparr[i].pcp = textdot; bparr[i].bprt = m[cs16+textdot];
m[cs16+textdot] = 0xF0; return(0);
}
clearbp(textdot) short textdot; {
int i;
for (i=1;i<32;i++) if(bparr[i].pcp == textdot) break;
if(i==32) {sprintf(errbuf,"break point not found");erroutine(); return(0);}
bparr[i].pcp = 0; m[cs16+textdot] = bparr[i].bprt;
bparr[i].bprt = m[0]; return(0);
}
cnulbp(){
char *p;
if(bparr[0].pcp != -1){
p = m + cs16+bparr[0].pcp;
if(*p == '\360') *p = bparr[0].bprt;
bparr[0].pcp = 0Xffff;
}
}
nulbp(ln) int ln; {
char *p;
int dott;
p = m + cs16+bparr[0].pcp;
if(*p == '\360') *p = bparr[0].bprt;
dott = lndotarr[ln]; p = m+cs16+dott;
bparr[0].pcp = dott; bparr[0].bprt = *p;
*p = 0XF0;
}
hashstring(p) char *p; {
int h;
h = *p - 'A'; h &= 31;
return(h);
}
breakpt(){
int i,j;
i = ((int)(PC))&0xffff; i--;
for(j=0;j<32;j++) if(bparr[j].pcp == i) break;
if(j==32) {sprintf(errbuf,"Wrong breakpoint");erroutine(); exit(1);}
dumpt = bparr[j].bprt;
dump();
}
dmpadr(adre) int adre; {
datadm[datadp] = m + (ds<<4) + adre;
sprintf(datadarr[datadp],"%.19s",tringfield+90);
datadarr[datadp][19] = ' ';
datadarr[datadp][18] = ':';
datadp++; datadp %= 7;
}
pdmpadr(){
char *o, *p,*q,*r,c;
unsigned long ii, i,j;
for(i=0;i<7;i++){
o = q = p = datadm[i];
if(p!=NULL){
for(j=0;j<8;j++){r = datadarr[i]; r += 19+3*j;sprintf(r,"%3x",*p++ & 0xff);}
datadarr[i][43] = ' ';
for(j=0;j<12;j++){ c = *q++; if(c<32||c>126) c = '.';
datadarr[i][44+j] = c;}
for(j=0;j<4;j++){r = datadarr[i]; r += 55+6*j;
ii = *o++ & 255; if(*o&128) ii |= 0Xffff0000; ii |= (*o++ & 255)<<8;
sprintf(r,"%6d",ii);}
}
}
}
rdcmd(){
int c,d,adre;
wmv(15,0);
for(c=0;c<20;c++) putchar(' ');
wmv(15,0);
sprintf(window[15]," ");
winupdate();
symp = -1; c = getchcmd(); if(c=='/') { c=getchcmd(); d=1;} else d = 0;
stopvlag = 0;
rdcline(c);
if(d){adre=rdstrg(); if(adre==-1) {
/*sprintf(errbuf,"No match"); erroutine();*/ rdcmd(); return;}
if (symp == -1){
/*sprintf(errbuf,"No match"); erroutine();*/ rdcmd(); return;}
} else if((c>='0')&&(c<='9')){ adre=rdadr();
if(cmdchar == '!') cmdchar = (symtab[symp].symsect <3) ? 'x' : 'd';}
else { adre=dotlnarr[(PC)-1]; cmdchar = c; if(c=='\n') c = '?'; }
/* Note: (PC)-1. The next instruction initial byte is fetched before the dump*/
if(cmdchar=='\n') cmdchar = 'S';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -