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

📄 main.c

📁 坦尼保姆
💻 C
📖 第 1 页 / 共 3 页
字号:
		          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 + -