📄 mains.c
字号:
instrcount = 0X7fffffff; bprdepth = -1;
if(cmdchar == '!') cmdchar = (symtab[symp].symsect <3) ? 'x' : 'd';
if((cmdchar < 5) || (cmdchar > 126)) cmdchar = 'q' ;
switch(cmdchar) {
case 'q' : fprintf(stderr,"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); exit(0); break;
case 'r' : instrcount = 0X7fffffff; break;
case '-' : bprdepth = prdepth-1; break;
case '+' : bprdepth = prdepth+1; break;
case '=' : bprdepth = prdepth; stopvlag = 1; break;
case '!' : nulbp(adre); break;
case 'g' : /*sprintf(errbuf,"g %d",adre); erroutine();*/nulbp(adre); break;
case 0xc :
case 'R' : refresh(); rdcmd();break;
case 'd' : if(symtab[symp].symsect > 2) dmpadr(adre);
else {sprintf(errbuf,"Cannot dump this label");
erroutine();} dump(); break;
case 'b' : zetbp(lndotarr[adre]); rdcmd() ; break;
case 'c' : clearbp(lndotarr[adre]); rdcmd(); break;
case 'n' : nulbp(dotlnarr[lndotarr[dotlnarr[(PC-1)]+1]]); break;
case 'x' : case 'X': case '*': instrcount = adre; break;
default : stopvlag = 255;
}
}
rdstrg(){
int i,j,stradr,k,syk;
char *p,*q,c,cc;
i=0; p = cmdline; q = tringfield+90;
while(c = *p++) if (c=='!' || c == '/' || c == '+') break;
else {i++; *q++ = c;}
if((c=='/') && (*p != '+')) *(--p) = '0';
*q = '\0';
#ifdef DEBUG
logprint();
fprintf(LOG,"gelezen: string |%s|\n",tringfield+90);
#endif
stradr = hashstring(tringfield+90); symp = symhash[stradr];
if(i>8) i=8; syk = -1;
while(symp != -1) {
#ifdef DEBUG
fprintf(LOG,"Vergeleken: string |%s| symtab |%s| symp %2d i %2d\n",tringfield+900,symtab[symp].symbol,symp,i);
#endif
/*if(!strncmp(tringfield+90, symtab[symp].symbol,i)) { syk = symp; break;}
else {symp = symtab[symp].nextsym;}*/
if(!strncmp(tringfield+90, symtab[symp].symbol,i)) { syk = symp;
if(i==strlen(symtab[symp].symbol)) break; }
symp = symtab[symp].nextsym;
}
symp = syk; /*april*/
if(symp < 0) {sprintf(errbuf,"No Match"); erroutine(); return(-1);}
for(k=0;k<18;k++) tringfield[k+90] = ' '; tringfield[98] = '+';
for(k=0;k<8;k++) if((cc = symtab[symp].symbol[k])>32) tringfield[k+90] = cc;
else break;
#ifdef DEBUG
fprintf(LOG,"tringfield: |%s|\n",tringfield+90); logprint();
#endif
if(symtab[symp].symsect > 2) stradr = symtab[symp].symvalue;
else if(symtab[symp].symsect == 2) stradr = symtab[symp].lnr;
j = -1; if(c == '\0' || c=='!') {cmdchar = '!'; j=0; }
if(j) {
while(*p =='+' || *p == '\t' || *p == ' ') p++;
if(*p == '\0' || *p=='!') {cmdchar = '!'; j=0;}
}
if(j){
if(*p<'0'||*p>'9'){sprintf(errbuf,"cmd constant expected.");erroutine();
sleep(1);sprintf("%-55.55s"," ");return(-1);}
sscanf(p,"%d%1s",&j,&cmdchar);
}
if(symtab[symp].symsect == 2){if(cmdchar == '!') cmdchar = 'g'; sprintf(tringfield+99,"%2d",j);}
else {if(cmdchar == '!')cmdchar = 'd'; sprintf(tringfield+99,"%-4d=%04x:",j,(stradr+j));}
return(stradr+j);
}
rdadr(){
int i;
sscanf(cmdline,"%d%1s",&i,&cmdchar);
if((cmdchar == '!') && (symtab[symp].symsect == 2)) cmdchar = 'g';
return(i);
}
rdcline(c){
char *p;
p = cmdline;
while(c != '\n') {if (c==EOF) break; *p++ = c; c = getchcmd();}
*p++ = '\0'; *p = '\0';
sprintf(window[14],"%-18.18s",cmdline);
p--; *p = '!';
}
winupdate(){
int i,j,k,l; char *p,*q;
sprintf(window[0]+4,"%02x",cs&0Xffff);
sprintf(window[0]+18,"%03x",ds&0Xffff);
sprintf(window[1]+3,"%02x",ah);
sprintf(window[1]+9,"%02x",al);
sprintf(window[1]+15,"%6d",ax);
sprintf(window[2]+3,"%02x",bh);
sprintf(window[2]+9,"%02x",bl);
sprintf(window[2]+15,"%6d",bx);
sprintf(window[3]+3,"%02x",ch);
sprintf(window[3]+9,"%02x",cl);
sprintf(window[3]+15,"%6d",cx);
sprintf(window[4]+3,"%02x",dh);
sprintf(window[4]+9,"%02x",dl);
sprintf(window[4]+15,"%6d",dx);
sprintf(window[5]+4,"%04x",sp&0Xffff);
sprintf(window[6]+4,"%04x",bp&0Xffff);
sprintf(window[7]+4,"%04x",si&0Xffff);
sprintf(window[8]+4,"%04x",di&0Xffff);
sprintf(window[7]+13,"%04x:PC",(PC)-1);
/* Note: (PC)-1. The next instruction initial byte is fetched before the dump*/
sprintf(window[8]+10," ");
#ifdef DEBUG
/*fprintf(stderr,"Tot hier dotlinarr %d PC %d\n",dotlnarr[(PC)-1],(PC)-1);*/
fprintf(LOG,"Tot hier dotlinarr %d PC %d\n",dotlnarr[(PC)-1],(PC)-1);
#endif
i = dotlnarr[(PC)-1]; j = lnsymarr[i];
if(j>nsymtab-3) {
fprintf(stderr,"\nNo BSS or no head label?\n",j,nsymtab-3,i);
#ifdef DEBUG
fprintf(LOG,"Warning lnsymarr %d nsymtab %d entry %d\nNo BSS or no head label?\n",j,nsymtab-3,i);
#endif
sleep(2); refresh(); /*exit(1);*/
}
sprintf(window[8]+10,"%s+%1d",symtab[j].symbol,i-symtab[j].lnr);
window[6][12] = (ovf) ? 'v' : '-';
window[6][14] = (dirf) ? '<' : '>';
window[6][16] = (signf) ? 'n' : 'p';
window[6][18] = (zerof) ? 'z' : '-';
window[6][20] = (cf) ? 'c' : '-';
for(j=0;j<9;j++){
fseek(L,(int)lnfilarr[i+j-6],0); p=window[j]+32;gtabstr(48,p,L);}
for(i=0;i<4;i++) for(j=0;j<58;j++) window[15-i][j+22] = outveld[i][j];
for(i=0;i<7;i++) sprintf(window[17+i],"%s",datadarr[i]);
l = prdepth; j= (maxsp-sp > 18) ? sp : maxsp-18; j &= 0xffff; p = m+j+(ss<<4);
#ifdef DEBUG
fprintf(LOG,"maxsp %d sp %d bp %d sp %x bp %x j %d\n",maxsp,sp,bp,sp,bp,j);fflush (LOG);
#endif
for(i=0;i<9;i++) { if(j < sp) {p += 2; sprintf(window[i]+23," ");}
else {k = *p++ & 255; k |= ((*p++ & 255) << 8);
if(j==sp) sprintf(window[i]+23,"=>%04x",k);
else sprintf(window[i]+23," %04x",k);
if(j==prstckpos[l]) {window[i][23] = (char)(l+48); l--;}}
j+= 2;}
l = (prdepth>2)? prdepth-2 : 1;
for(i=12;i>9;i--) {
if(l>(int)prdepth) sprintf(window[i]," ");
else { j = stckprdepth[l]; k = lnsymarr[j];
sprintf(window[i],"%1d <= %-8s + %3d",l,symtab[k].symbol,
j - symtab[k].lnr);
} l++;
}
p = inbuf; q = window[11]+22; *q++ = 'I'; *q++ = ' ';
while (p<inbpu-85) p += 55;
while((j = (int)(*p)) != '\n'){ if(*p =='\0') break;
if((q >= window[11]+75) && (q<window[12])) {*q++ = ' '; *q++ = ' ';
*q++ = ' '; q = window[12]+24; window[12][22] = 'I';}
if(p == inbpu) { *q++ = '-'; *q++ = '>';}
if(j==0 || q>window[12]+75) break; if(j<' ') {*q++ = '^'; j += 64;} *q++ = j;
p++;
}
if(p == inbpu && *p == '\n' ) { *q++ = '-'; *q++ = '>';}
if((inbpu != inbpl) && (*p == '\n')) {*q++ = '\\'; *q++ = 'n';}
if(*(inbpu-1)== '\n') {*q++ = '\\'; *q++ = 'n'; *q++ = '-'; *q++ = '>';}
while(q<window[12]-1) *q++ = ' ';
if(q>window[12]) while(q<window[13]-1) *q++ = ' ';
p = window[0]-1; for(i=0;i<1944;i++) if(!(*(++p))) *p = ' ';
immain(); wmv(15,0);
}
gtabstr(i,a,f) int i; char *a; FILE *f;{
int j,c;
j = 0; while(j<i){c = getc(f); if(c==EOF || c == '\r' || c == '\n') break;
if(c=='\t') { if (j%8 != 7) ungetc(c,f); c=' ';}
j++; *a++=c;
} while(j++ <i) *a++ = ' ';
}
newgpfield(){
int i,j;
for(i=3;i>0;i--) for(j=0;j<58;j++) outveld[i][j] = outveld[i-1][j];
for(j=0;j<58;j++) outveld[0][j] = ' ';
}
nextput(c) int c;{
if(c=='\n') {nextput('\\'); nextput('n'); puthp = -1; return;}
if(puthp>57) puthp = -1;
if(puthp < 0) { newgpfield(); puthp = 0;
nextput('>'); nextput(' ');}
if(c<' ') {outveld[0][puthp++] = '^'; c += 64;}
if(c!='\n') outveld[0][puthp++] = c;
}
getchcmd(){
int i;
if((i= getc(CMD)) !=EOF) {if(i!='\r') return(i); else return(getchcmd());}
if(cmdfl) {fclose(CMD);
CMD = stdin; cmdfl = 0; i = getchcmd();}
if(i!='\r') return(i); else return(getchcmd());
}
getchbp(){
int i;
char *p;
if(inbpl==inbpu) {wmv(11,24);inbpl = inbpu = inbuf;
if(traceflag && !(inpfl)){sprintf(errbuf,"Input expected"); erroutine();
p = inbuf; *p++ = '\n'; *p++ = '\0';
winupdate();wmv(11,24);}
while((i= getc(INP)) !=EOF) { if(i=='\r') continue;
*inbpl++ =i; if(i=='\n') break;}
if(i==EOF) {
if(inpfl>0) {fclose(INP); inpfl = 0; INP=stdin; return(getchbp());}
else if(inpfl) {sprintf(errbuf,"Second time end of input so exit");
erroutine(); exit(0);}
else {fclose(stdin); fopen("/dev/tty","rb"); inpfl--; return(i);}
}
}
return((int)*inbpu++);
}
meldroutine(){
char *p;
int i,aa;
if(traceflag){
errbuf[11] = ' '; errbuf[12] = ' '; errbuf[13] = ' ';
wmv(10,24); printf("%s",errbuf); sleep(1);
wmv(10,78);printf("\n");fprintf(stderr,"\n");
sprintf(window[10]+22,"M %-55.55s",errbuf); winupdate();}
else fprintf(stderr,"%s\n",errbuf);
}
erroutine(){
char *p;
int i,aa;
if(traceflag){
p = errbuf;aa = 0;for(i=0;i<55;i++) if (*p++ <= '\n'){p--;*p++ = ' ';}
else if(*p == '\0' || *p == '\n') aa++;
else if (aa) *p++ = ' ';
*p = '\0';
if (errflag) sleep(1);
wmv(10,24);viscursor(); printf("%s",errbuf);inviscur();
wmv(10,78);printf("\n");fprintf(stderr,"");
sprintf(window[10]+22,"E %-55.55s",errbuf); winupdate();errflag = 1;}
else fprintf(stderr,"%s\n",errbuf);
}
spare(t) word t; {
sprintf(errbuf,"8086 undefined instruction %0X",t & 0xff); erroutine();}
notim(t) word t; {
sprintf(errbuf,"Instruction %0X not implemented",t & 0xff); erroutine();}
interrupt(t) int t; {
sprintf(errbuf,"Interrupt %0X. Bad division?",t & 0xff); erroutine();}
panic(s) char *s; {
sprintf(errbuf,"%s",s); erroutine(); sleep(5); exit(1);}
bitmapdump(b,h,buff) int b,h; char *buff;{
if(termbitsize == 2) { if ((bituit=fopen("tERMbITMAP","wb")) == NULL) {
fprintf(stderr,"Kan tERMbITMAP niet openen\n"); exit(1);}
} else { if ((bituit=fopen("tERMbITmAP","wb")) == NULL) {
fprintf(stderr,"Kan tERMbITmAP niet openen\n"); exit(1);}
}
schrijfmap(b,h,termbitsize,buff,bituit);
fclose(bituit);
if(termbitsize == 2) sprintf(bmbuf,".c configure -bitmap @lEEGbITMAP\n");
else sprintf(bmbuf,".c configure -bitmap @lEEGbITmAP\n");
schrijf(); sleep(1);
if(termbitsize == 2) sprintf(bmbuf,".c configure -bitmap @tERMbITMAP\n");
else sprintf(bmbuf,".c configure -bitmap @tERMbITmAP\n");
schrijf(); sleep(1);
}
bitmapopen(b,h,s) int b,h,s; {
/*FAKE SYSTEM CALL TO OPEN A BITMAP FOR OPGAVE 1 */
int i;
if(pipe(pfildes)< 0) {fprintf(stderr,"Kan geen pipe creeren\n"); exit(1);}
if((pnr = fork()) < 0) {fprintf(stderr,"Kan niet vorken\n"); exit(1);}
if(pnr == 0){dup2(pfildes[0],0); system("exec /usr/local/bin/wish"); exit(0);}
termbitsize = 1; if(s==2) termbitsize = 2;
if(termbitsize == 2) {
if ((bituit=fopen("lEEGbITMAP","wb")) == NULL) {
fprintf(stderr,"Kan lEEGbITMAP niet openen\n"); exit(1);}
} else {
if ((bituit=fopen("lEEGbITmAP","wb")) == NULL) {
fprintf(stderr,"Kan lEEGbITmAP niet openen\n"); exit(1);}
}
schrijfmap(b,h,termbitsize,bmbuf+800,bituit);
fclose(bituit);
sprintf(bmbuf,"#!/usr/local/bin/wish -f\n. configure -background gray\n");
schrijf();
if (termbitsize == 2) {
sprintf(bmbuf,". configure -width 591\n. configure -height 509\n"); schrijf();
sprintf(bmbuf,"button .b -text %cexit window %c",'"','"'); schrijf();
sprintf(bmbuf," -font *-helvetica-bold-r-normal--*-180-* "); schrijf();
sprintf(bmbuf," -command %cdestroy .%c\n",'"','"'); schrijf();
sprintf(bmbuf,"place .b -x 4 -y 4 -relwidth 0.32 -height 1.1c\n"); schrijf();
sprintf(bmbuf,"label .c -bitmap @lEEGbITMAP\nplace .c -x 4 -y 1.4c\n");schrijf();
sprintf(bmbuf,"button .d -text %cdisplay new%c ",'"','"'); schrijf();
sprintf(bmbuf,"-font *-helvetica-bold-r-normal--*-180-* -command"); schrijf();
sprintf(bmbuf," %c.c configure -bitmap @tERMbITMAP%c\n",'"','"'); schrijf();
sprintf(bmbuf,"place .d -x 200 -y 4 -relwidth 0.32 -height 1.1c\n"); schrijf();
sprintf(bmbuf,"button .e -text %cclear window %c ",'"','"'); schrijf();
sprintf(bmbuf,"-font *-helvetica-bold-r-normal--*-180-* -command"); schrijf();
sprintf(bmbuf," %c.c configure -bitmap @lEEGbITMAP%c\n",'"','"'); schrijf();
sprintf(bmbuf,"place .e -x 396 -y 4 -relwidth 0.32 -height 1.1c\n"); schrijf();
} else {
sprintf(bmbuf,". configure -width 302\n. configure -height 266\n"); schrijf();
sprintf(bmbuf,"button .b -text %cexit window %c",'"','"'); schrijf();
sprintf(bmbuf," -font *-helvetica-bold-r-normal--*-120-* "); schrijf();
sprintf(bmbuf," -command %cdestroy .%c\n",'"','"'); schrijf();
sprintf(bmbuf,"place .b -x 2 -y 3 -relwidth 0.32 -height 0.7c\n"); schrijf();
sprintf(bmbuf,"label .c -bitmap @lEEGbITmAP\nplace .c -x 3 -y 0.9c\n");schrijf();
sprintf(bmbuf,"button .d -text %cdisplay new%c ",'"','"'); schrijf();
sprintf(bmbuf,"-font *-helvetica-bold-r-normal--*-120-* -command"); schrijf();
sprintf(bmbuf," %c.c configure -bitmap @tERMbITmAP%c\n",'"','"'); schrijf();
sprintf(bmbuf,"place .d -x 101 -y 3 -relwidth 0.32 -height 0.7c\n"); schrijf();
sprintf(bmbuf,"button .e -text %cclear window %c ",'"','"'); schrijf();
sprintf(bmbuf,"-font *-helvetica-bold-r-normal--*-120-* -command"); schrijf();
sprintf(bmbuf," %c.c configure -bitmap @lEEGbITmAP%c\n",'"','"'); schrijf();
sprintf(bmbuf,"place .e -x 200 -y 3 -relwidth 0.32 -height 0.7c\n"); schrijf();
}
sprintf(bmbuf,".c configure -background black -foreground white\n"); schrijf();
sprintf(bmbuf,".b configure -background black -foreground white\n"); schrijf();
sprintf(bmbuf,".d configure -background black -foreground white\n"); schrijf();
sprintf(bmbuf,".e configure -background black -foreground white\n"); schrijf();
/* sleep(1);*/
}
schrijf(){
int j;
char *p;
p = bmbuf;
j = 0;
while(*p++ > '\0') j++;
write(pfildes[1],bmbuf,j);
}
spiegel(m,n) int m,n;{
int i,j,k,l;
if(m == 0) {
i = 1; j = 128; l = 0;
for(k=0;k<8;k++) {if((i&n)>0) l |= j; i <<= 1; j >>= 1;}
} else if (m == 1) {
i = 16; j = 128; l = 0; for(k=0;k<4;k++) {
if((i&n)>0) l |= j;j >>= 1; if((i&n)>0) l |= j;j >>= 1; i <<= 1;}
} else {
i = 1; j = 128; l = 0; for(k=0;k<4;k++) {
if((i&n)>0) l |= j;j >>= 1; if((i&n)>0) l |= j;j >>= 1; i <<= 1;}
}
/* if(l>0) fprintf(stderr,"l %x n %x l %d n %d m %d\n",l,n,l,n,m);*/
return(l);
}
schrijfmap(b,h,s,buf,uitf) int b,h,s; char *buf; FILE *uitf; {
int i,j,k,l,m,c;
char *p,*q;
if(b%8!=0){
fprintf(stderr,"Bitmap breedte hoort een heel aantal bytes te zijn\n");
exit(1);}
fprintf(uitf,"#define noname_width %d\n",b*s);
fprintf(uitf,"#define noname_height %d\n",h*s);
fprintf(uitf,"static char noname_bits[] = {\n ");
p = buf; b >>= 3; k = b*h*s*s-1; m = 1;
for(i=0;i<h;i++) { q = bmbuf; for(j=0;j<b;j++)
if(termbitsize == 2){ c = *p++; *q++ = spiegel(1,c); *q++ = spiegel(2,c);
} else { c = *p++; *q++ = (255 & spiegel(0,c));
}
for(l=0;l<s;l++) {
q = bmbuf; for(j=0;j<b*s;j++) {
fprintf(uitf,"0x%02x",(255 & *q++)); if(k==0) fprintf(uitf,"};\n");
else {putc(',',uitf); if((m % 15) == 0) fprintf(uitf,"\n "); k--; m++;}
}
}
}
}
extern void prut(u,v) char u,v; {
fprintf(stderr,"ah en al %d %d %x %x %o %o\n",
(int)u,(int)v,(int)u,(int)v,(int)u,(int)v);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -