int diz80_pointers() { char bstr[MAX_LINE_LEN]; if(t[1]==-1) { return diz80_bytedata(); } ckrange(0, bstr); FP(fx, "\tdefw %s", bstr); if(pass == 1 && a_labels) { symbol_newref(t[0]+256*t[1], pc, cstdfw); } return 2; }
int main(int argc, char **argv) { int c, n; long lvalue, uvalue, intval; char *ptr = 0; (void) setlocale(LC_ALL, ""); #if !defined(TEXT_DOMAIN) #define TEXT_DOMAIN "SYS_TEST" #endif (void) textdomain(TEXT_DOMAIN); prog = prog_name(argv[0]); while ((c = getopt(argc, argv, "l:u:b:d:p:e:h:k:s:QW:?")) != EOF) { /* check for invalid option */ if ((*prog == 'v') && !strchr(vusage, c)) usage(); if ((*prog == 'e') && !strchr(eusage, c)) usage(); if ((*prog == 'h') && !strchr(husage, c)) usage(); switch (c) { case 'Q': ckquit = 0; break; case 'W': ckwidth = atoi(optarg); if (ckwidth < 0) { (void) fprintf(stderr, gettext("%s: ERROR: negative display width specified\n"), prog); exit(1); } break; case 'b': base = atoi(optarg); if ((base < 2) || (base > 36)) { (void) fprintf(stderr, gettext("%s: ERROR: base must be between 2 and 36\n"), prog); exit(1); } break; case 'u': upper = optarg; break; case 'l': lower = optarg; break; case 'd': deflt = optarg; break; case 'p': prompt = optarg; break; case 'e': error = optarg; break; case 'h': help = optarg; break; case 'k': kpid = atoi(optarg); break; case 's': signo = atoi(optarg); break; default: usage(); } } if (signo) { if (kpid == BADPID) usage(); } else signo = SIGTERM; if (upper) { uvalue = strtol(upper, &ptr, base); if (ptr == upper) { (void) fprintf(stderr, gettext("%s: ERROR: invalid upper value specification\n"), prog); exit(1); } } else uvalue = LONG_MAX; if (lower) { lvalue = strtol(lower, &ptr, base); if (ptr == lower) { (void) fprintf(stderr, gettext("%s: ERROR: invalid lower value specification\n"), prog); exit(1); } } else lvalue = LONG_MIN; if (uvalue < lvalue) { (void) fprintf(stderr, gettext("%s: ERROR: upper value is less than lower value\n"), prog); exit(1); } if (*prog == 'v') { if (argc != (optind+1)) usage(); exit(ckrange_val(lvalue, uvalue, base, argv[optind])); } if (optind != argc) usage(); if (*prog == 'e') { ckindent = 0; ckrange_err(lvalue, uvalue, base, error); exit(0); } else if (*prog == 'h') { ckindent = 0; ckrange_hlp(lvalue, uvalue, base, help); exit(0); } n = ckrange(&intval, lvalue, uvalue, (short)base, deflt, error, help, prompt); /* libadm interface */ if (n == 3) { if (kpid > -2) (void) kill(kpid, signo); (void) puts("q"); } else if (n == 0) (void) printf("%ld", intval); return (n); }
/* Returns number of bytes used */ int diz80() { char stri[80]; char stro[80]; int a,r,i; char bstr[MAX_LINE_LEN]; char rstr[MAX_LINE_LEN]; /* indent all instructions*/ FP(fx,"\t"); if(t[0] == 0xcb) { a=t[1]; if(a==-1) { FP(fx,"defb 0%02xh", t[0]); return(1); } if(a < 8) FP(fx,"rlc "); else if((a >= 0x08) && (a < 0x10)) FP(fx,"rrc "); else if((a >= 0x10) && (a < 0x18)) FP(fx,"rl "); else if((a >= 0x18) && (a < 0x20)) FP(fx,"rr "); else if((a >= 0x20) && (a < 0x28)) FP(fx,"sla "); else if((a >= 0x28) && (a < 0x30)) FP(fx,"sra "); /* undocumented instruction SLI (shift left with 1 insertion) */ else if((a >= 0x30) && (a < 0x38)) FP(fx,"sli "); else if((a >= 0x38) && (a < 0x40)) FP(fx,"srl "); else if((a >= 0x40) && (a < 0x80)) FP(fx,"bit %d,",(a-0x40)/8); else if((a >= 0x80) && (a < 0xc0)) FP(fx,"res %d,",(a-0x80)/8); else if(a >= 0xc0) FP(fx,"set %d,",(a-0xc0)/8); FP(fx,"%s",rarg[a%8]); f_z80=1; return(2); } else if(t[0] == 0xed) { a=t[1]; if(a==-1) { FP(fx,"defb 0%02xh", t[0]); return(1); } /* if((a>=0x40)&&(a<0x50)&&(ed40[a-0x40][0]!='0'))FP(fx,"%s",ed40[a-0x40]); else if((a>=0x50)&&(a<0x60)&&(ed50[a-0x50][0]!='0'))FP(fx,"%s",ed50[a-0x50]); else if((a>=0x60)&&(a<0x70)&&(ed60[a-0x60][0]!='0'))FP(fx,"%s",ed60[a-0x60]); else if((a>=0x70)&&(a<0x80)&&(ed70[a-0x70][0]!='0'))FP(fx,"%s",ed70[a-0x70]); else if((a>=0xa0)&&(a<0xb0)&&(eda0[a-0xa0][0]!='0'))FP(fx,"%s",eda0[a-0xa0]); else if((a>=0xb0)&&(a<0xc0)&&(edb0[a-0xb0][0]!='0'))FP(fx,"%s",edb0[a-0xb0]); */ if((a>=0x40)&&(a<0x50)&&(ed40[a-0x40][0]!='0')) i=0; else if((a>=0x50)&&(a<0x60)&&(ed50[a-0x50][0]!='0')) i=1; else if((a>=0x60)&&(a<0x70)&&(ed60[a-0x60][0]!='0')) i=2; else if((a>=0x70)&&(a<0x80)&&(ed70[a-0x70][0]!='0')) i=3; else if((a>=0xa0)&&(a<0xb0)&&(eda0[a-0xa0][0]!='0')) i=4; else if((a>=0xb0)&&(a<0xc0)&&(edb0[a-0xb0][0]!='0')) i=5; else { FP(fx,"defb 0edh"); FP(fx,";next byte illegal after ed"); return(1); } r=ckrange(2,bstr); if(r==-1) { FP(fx,"defb"); for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]); return(i); } f_z80=1; switch(i) { case 0: FP(fx,"%s",ed40[a-0x40]); break; case 1: FP(fx,"%s",ed50[a-0x50]); break; case 2: FP(fx,"%s",ed60[a-0x60]); break; case 3: FP(fx,"%s",ed70[a-0x70]); break; case 4: FP(fx,"%s",eda0[a-0xa0]); break; case 5: FP(fx,"%s",edb0[a-0xb0]); break; } /*if arg not in prog range it is a constant*/ if(a == 0x43) { FP(fx,"%s),bc",bstr); return(4); } else if(a == 0x53) { FP(fx,"%s),de",bstr); return(4); } else if(a == 0x73) { FP(fx,"%s),sp",bstr); return(4); } else if((a == 0x4b) || (a == 0x5b) || (a == 0x7b)) { FP(fx,"%s)",bstr); return(4); } return(2); } else if((t[0] == 0xdd) || (t[0] == 0xfd)) { if(t[0]==0xfd) { strcpy(stri,"iy"); } else { strcpy(stri,"ix"); } if(t[1]==-1) { FP(fx,"defb 0%02xh", t[0]); return(1); } r=ckrange(2,bstr); f_z80=1; switch(t[1]) { case 0x09: FP(fx,"add %s,bc",stri); return(2); break; case 0x19: FP(fx,"add %s,de",stri); return(2); break; case 0x21: if(r==-1) { FP(fx,"defb"); for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]); return(i); } FP(fx,"ld %s,%s",stri,bstr); return(4); break; case 0x22: if(r==-1) { FP(fx,"defb"); for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]); return(i); } FP(fx,"ld (%s),%s",bstr,stri); return(4); break; case 0x23: FP(fx,"inc %s",stri); return(2); break; case 0x29: FP(fx,"add %s,%s",stri,stri); return(2); break; case 0x2a: if(r==-1) { FP(fx,"defb"); for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]); return(i); } FP(fx,"ld %s,(%s)",stri,bstr); return(4); break; case 0x2b: FP(fx,"dec %s",stri); return(2); break; case 0x39: FP(fx,"add %s,sp",stri); return(2); break; case 0xe1: FP(fx,"pop %s",stri); return(2); break; case 0xe3: FP(fx,"ex (sp),%s",stri); return(2); break; case 0xe5: FP(fx,"push %s",stri); return(2); break; case 0xe9: FP(fx,"jp (%s)",stri); return(2); break; case 0xf9: FP(fx,"ld sp,%s",stri); return(2); break; } /* end switch */ /* now it must be an instruction of type (ix+dd) or (iy+dd) */ if((t[2]==-1)||(t[3]==-1)) { FP(fx,"defb"); for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]); return(i); } if(t[2] < 128) { sprintf(stro,"(%s+0%02xh)",stri,t[2]); /* stro is: (ix+dd) or (iy+dd) */ } else { sprintf(stro,"(%s-0%02xh)",stri,256 - t[2]); } if(t[1]==0xcb) { switch(t[3]) { case 0x06: FP(fx,"rlc "); break; case 0x0e: FP(fx,"rrc "); break; case 0x16: FP(fx,"rl "); break; case 0x1e: FP(fx,"rr "); break; case 0x26: FP(fx,"sla "); break; case 0x2e: FP(fx,"sra "); break; case 0x3e: FP(fx,"srl "); break; case 0x46: FP(fx,"bit 0,"); break; case 0x4e: FP(fx,"bit 1,"); break; case 0x56: FP(fx,"bit 2,"); break; case 0x5e: FP(fx,"bit 3,"); break; case 0x66: FP(fx,"bit 4,"); break; case 0x6e: FP(fx,"bit 5,"); break; case 0x76: FP(fx,"bit 6,"); break; case 0x7e: FP(fx,"bit 7,"); break; case 0x86: FP(fx,"res 0,"); break; case 0x8e: FP(fx,"res 1,"); break; case 0x96: FP(fx,"res 2,"); break; case 0x9e: FP(fx,"res 3,"); break; case 0xa6: FP(fx,"res 4,"); break; case 0xae: FP(fx,"res 5,"); break; case 0xb6: FP(fx,"res 6,"); break; case 0xbe: FP(fx,"res 7,"); break; case 0xc6: FP(fx,"set 0,"); break; case 0xce: FP(fx,"set 1,"); break; case 0xd6: FP(fx,"set 2,"); break; case 0xde: FP(fx,"set 3,"); break; case 0xe6: FP(fx,"set 4,"); break; case 0xee: FP(fx,"set 5,"); break; case 0xf6: FP(fx,"set 6,"); break; case 0xfe: FP(fx,"set 7,"); break; default: FP(fx,"defb 0%02xh,0%02xh,0%02xh,0%02xh\t;illegal sequence"\ ,t[0],t[1],t[2],t[3]); return(4); }/*end switch t[3]*/ FP(fx,"%s",stro); return(4); }/*end dd cb or fd cb*/ else switch(t[1]) { case 0x34: FP(fx,"inc %s",stro); break; case 0x35: FP(fx,"dec %s",stro); break; case 0x36: FP(fx,"ld %s,0%02xh",stro,t[3]); return(4); break; case 0x46: FP(fx,"ld b,%s",stro); break; case 0x4e: FP(fx,"ld c,%s",stro); break; case 0x56: FP(fx,"ld d,%s",stro); break; case 0x5e: FP(fx,"ld e,%s",stro); break; case 0x66: FP(fx,"ld h,%s",stro); break; case 0x6e: FP(fx,"ld l,%s",stro); break; case 0x70: FP(fx,"ld %s,b",stro); break; case 0x71: FP(fx,"ld %s,c",stro); break; case 0x72: FP(fx,"ld %s,d",stro); break; case 0x73: FP(fx,"ld %s,e",stro); break; case 0x74: FP(fx,"ld %s,h",stro); break; case 0x75: FP(fx,"ld %s,l",stro); break; case 0x77: FP(fx,"ld %s,a",stro); break; case 0x7e: FP(fx,"ld a,%s",stro); break; case 0x86: FP(fx,"add a,%s",stro); break; case 0x8e: FP(fx,"adc a,%s",stro); break; case 0x96: FP(fx,"sub %s",stro); break; case 0x9e: FP(fx,"sbc a,%s",stro); break; case 0xa6: FP(fx,"and %s",stro); break; case 0xae: FP(fx,"xor %s",stro); break; case 0xb6: FP(fx,"or %s",stro); break; case 0xbe: FP(fx,"cp %s",stro); break; default: FP(fx,"defb 0%02xh,0%02xh,0%02xh\t;illegal sequence"\ ,t[0],t[1],t[2]); return(3); }/*end switch t[1]*/ return(3); }/*end 0xdd and 0xfd group*/ r=ckrange(1,bstr); switch(comtab[t[0]].type) { case 0: FP(fx,"%s",comtab[t[0]].com1); FP(fx,"\t"); break; case 1: if(t[1]==-1) { FP(fx,"defb 0%02xh", t[0]); return(1); } FP(fx,"%s",comtab[t[0]].com1); FP(fx,"0%02xh",t[1]); break; case 2: if(r==-1) { FP(fx,"defb"); for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]); return(i); } FP(fx,"%s",comtab[t[0]].com1); FP(fx,"%s",bstr); break; case 3: if(t[1]==-1) { FP(fx,"defb 0%02xh", t[0]); return(1); } FP(fx,"%s",comtab[t[0]].com1); if(comtab[t[0]].bytes == 2) { /*jr and djnz instr. are 2 bytes type 3*/ /* don't need to check return value because we checked * t[1] above */ ckrange_rel(1,pc,rstr); FP(fx,"%s",rstr); } else { FP(fx,"0%02xh",t[1]);/*not jr*/ } break; case 11: if(t[1]==-1) { FP(fx,"defb 0%02xh", t[0]); return(1); } FP(fx,"%s",comtab[t[0]].com1); FP(fx,"0%02xh%s",t[1],comtab[t[0]].com2); break; case 12: if(r==-1) { FP(fx,"defb"); for(i=0;t[i]!=-1;i++) FP(fx,"%c0%02xh", i?',':' ', t[i]); return(i); } FP(fx,"%s",comtab[t[0]].com1); FP(fx,"%s%s",bstr,comtab[t[0]].com2); break; } a=comtab[t[0]].bytes; if(comtab[t[0]].proc==1) { f_z80=1; } return(a); }