unsigned Dasm32010(char *str, unsigned pc) { int a, b, d, k, m, n, p, r, s, w; /* these can all be filled in by parsing an instruction */ int i; int op; int cnt = 1; int code; int bit; char *strtmp; char *cp; /* character pointer in OpFormats */ if (!OpInizialized) InitDasm32010(); op = -1; /* no matching opcode */ code = READOP16(2*pc); for ( i = 0; i < MAX_OPS; i++) { if ((code & Op[i].mask) == Op[i].bits) { if (op != -1) { printf("Error: opcode %04Xh matches %d (%s) and %d (%s)\n", code,i,Op[i].fmt,op,Op[op].fmt); } op = i; } } if (op == -1) { sprintf(str,"???? dw %04Xh",code); return cnt; } strtmp = str; if (Op[op].extcode) { bit = 31; code <<= 16; code |= READARG16(2*(pc+cnt)); cnt++; } else { bit = 15; } /* shift out operands */ cp = Op[op].parse; a = b = d = k = m = n = p = r = s = w = 0; while (bit >= 0) { /* printf("{%c/%d}",*cp,bit); */ switch(*cp) { case 'a': a <<=1; a |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'b': b <<=1; b |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'd': d <<=1; d |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'k': k <<=1; k |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'm': m <<=1; m |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'n': n <<=1; n |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'p': p <<=1; p |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'r': r <<=1; r |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 's': s <<=1; s |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'w': w <<=1; w |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case ' ': break; case '1': case '0': bit--; break; case '\0': printf("premature end of parse string, opcode %x, bit = %d\n",code,bit); exit(1); } cp++; } /* now traverse format string */ cp = Op[op].fmt; while (*cp) { if (*cp == '%') { char num[15], *q; cp++; switch (*cp++) { case 'A': sprintf(num,"$%02X",a); break; case 'B': sprintf(num,"$%04X",b); break; case 'D': sprintf(num,"%02Xh",d); break; case 'K': sprintf(num,"%d",k); break; case 'N': sprintf(num,"%s",nextar[n]); break; case 'M': sprintf(num,"%s",arith[m]); break; case 'P': sprintf(num,"PA%d",p); break; case 'R': sprintf(num,"AR%d",r); break; case 'S': sprintf(num,",%d",s); break; case 'W': sprintf(num,"%04Xh",w); break; default: printf("illegal escape character in format '%s'\n",Op[op].fmt); exit(1); } q = num; while (*q) *str++ = *q++; *str = '\0'; } else { *str++ = *cp++; *str = '\0'; } } return cnt; }
static offs_t internal_disasm_tms32010(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options) { uint32_t flags = 0; int a, b, d, k, m, n, p, r, s, w; /* these can all be filled in by parsing an instruction */ int i; int op; int cnt = 1; int code; int bit; //char *buffertmp; const char *cp; /* character pointer in OpFormats */ if (!OpInizialized) InitDasm32010(); op = -1; /* no matching opcode */ code = (oprom[0] << 8) | oprom[1]; for ( i = 0; i < MAX_OPS; i++) { if ((code & Op[i].mask) == Op[i].bits) { if (op != -1) { osd_printf_debug("Error: opcode %04Xh matches %d (%s) and %d (%s)\n", code,i,Op[i].fmt,op,Op[op].fmt); } op = i; } } if (op == -1) { util::stream_format(stream, "dw %04Xh *(invalid op)", code); return cnt | DASMFLAG_SUPPORTED; } //buffertmp = buffer; if (Op[op].extcode) { bit = 31; code <<= 16; code |= (opram[2] << 8) | opram[3]; cnt++; } else { bit = 15; } /* shift out operands */ cp = Op[op].parse; a = b = d = k = m = n = p = r = s = w = 0; while (bit >= 0) { /* osd_printf_debug("{%c/%d}",*cp,bit); */ switch(*cp) { case 'a': a <<=1; a |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'b': b <<=1; b |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'd': d <<=1; d |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'k': k <<=1; k |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'm': m <<=1; m |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'n': n <<=1; n |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'p': p <<=1; p |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'r': r <<=1; r |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 's': s <<=1; s |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case 'w': w <<=1; w |= ((code & (1<<bit)) ? 1 : 0); bit--; break; case ' ': break; case '1': case '0': bit--; break; case '\0': fatalerror("premature end of parse string, opcode %x, bit = %d\n",code,bit); } cp++; } /* now traverse format string */ cp = Op[op].fmt; if (!strncmp(cp, "cal", 3)) flags = DASMFLAG_STEP_OVER; else if (!strncmp(cp, "ret", 3)) flags = DASMFLAG_STEP_OUT; while (*cp) { if (*cp == '%') { char num[20]; cp++; switch (*cp++) { case 'A': sprintf(num,"%02Xh",a); break; // was $%02X case 'B': sprintf(num,"%04Xh",b); break; // was $%04X case 'D': sprintf(num,"%02Xh",d); break; case 'K': sprintf(num,"%d",k); break; case 'N': sprintf(num,"%s",nextar[n]); break; case 'M': sprintf(num,"%s",arith[m]); break; case 'P': sprintf(num,"PA%d",p); break; case 'R': sprintf(num,"AR%d",r); break; case 'S': sprintf(num,",%d",s); break; case 'W': sprintf(num,"%04Xh",w); break; default: fatalerror("illegal escape character in format '%s'\n",Op[op].fmt); } stream << num; } else { stream << *cp++; } } return cnt | flags | DASMFLAG_SUPPORTED; }