📄 mains.c
字号:
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(); 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(); 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; fwidth[i] = 1;} for(i=0;i<9;i++) for(j=0;j<140;j++) s[i].cp[j] = '\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': p--; sscanf(p,"%d",&fwidth[j]); while ((c>= '0') && (c<='9')) c=*p++ ; p--;continue; 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': ar[j] = 3; pram[j].cp = spadr(); j++; i=0; break; 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; }#ifdef DEBUGfprintf(LOG,"%c c %d j %d i %d ar[j] %s pram %d string: %s\n", c,j,i,ar[j-1],pram[j-1].cp,pram[j-1].ii,p-1);#endif } } } if(j>8) { sprintf(errbuf,"not more than 6 conversions in sscanf");erroutine();}#ifdef DEBUGfprintf(LOG,"voor sscanf\n");#endif retval = sscanf(pram[0].cp,pram[1].cp,&s[2],&s[3],&s[4],&s[5],&s[6],&s[7]);#ifdef DEBUGfprintf(LOG,"\n\nna sscanf |%s|%s| %d %d %d %d %d %d fwidth[4] %d\n", pram[0].cp, pram[1].cp,s[2].ii,s[3].cp,s[4].ii,s[5].ii,s[6].ii,s[7].ii,fwidth[4]);fprintf(LOG,"\nna sscanf |%s|%s| %d %d %d %d %d %d pram\n", pram[0].cp,pram[1].cp, pram[2].ii,pram[3].cp,pram[4].ii,pram[5].ii,pram[6].ii,pram[7].ii); for(i=2;i<j;i++) fprintf(LOG," | %d %d %d %d %d",i,ar[i], s[i].cp[0],s[i].cp[1],s[i].cp[2]); putc('\n',LOG);#endif for(i=2;i<j;i++) { if(ar[i] == 0) {strcpy(pram[i].cp,s[i].cp); continue;} if(ar[i] == 1) {*pram[i].cp = *(s[i].cp); continue;} 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); continue;} if(ar[i] == 3) { q = pram[i].cp; for(k=0;k<fwidth[i];k++) *q++ = s[i].cp[k]; continue;} if(ar[i] == 4) {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; continue;} } 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 DEBUGfprintf(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) system("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();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -