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

📄 mains.c

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