📄 dsmlib.c
字号:
case 0x009a: strcpy (ss, "x1"); break; case 0x00aa: strcpy (ss, "y0"); break; case 0x00ba: strcpy (ss, "y1"); break;#endif /* CPU==SH7700 || CPU==SH7600 */ default: strcpy (ss, "????"); } sprintf (s, "%s,r%u", ss, (insn & 0x0f00) >> 8); break; case itAtOneReg:#if (CPU==SH7750) if (iPtr->op == 0x00c3) /* MOVCA.L R0,@Rn */ sprintf (s, "r0,@r%u", (insn & 0x0f00) >> 8); else#endif /* CPU==SH7750 */ sprintf (s, "@r%u", (insn & 0x0f00) >> 8); break; case itPushCsr: switch (iPtr->op) { case 0x4003: strcpy (ss, "sr"); break; case 0x4013: strcpy (ss, "gbr"); break; case 0x4023: strcpy (ss, "vbr"); break;#if (CPU==SH7750 || CPU==SH7700) case 0x4033: strcpy (ss, "ssr"); break; case 0x4043: strcpy (ss, "spc"); break; case 0x4083: strcpy (ss, "r0_bank"); break; case 0x4093: strcpy (ss, "r1_bank"); break; case 0x40a3: strcpy (ss, "r2_bank"); break; case 0x40b3: strcpy (ss, "r3_bank"); break; case 0x40c3: strcpy (ss, "r4_bank"); break; case 0x40d3: strcpy (ss, "r5_bank"); break; case 0x40e3: strcpy (ss, "r6_bank"); break; case 0x40f3: strcpy (ss, "r7_bank"); break;#endif /* CPU==SH7750 || CPU==SH7700 */ case 0x4002: strcpy (ss, "mach"); break; case 0x4012: strcpy (ss, "macl"); break; case 0x4022: strcpy (ss, "pr"); break;#if (CPU==SH7700 || CPU==SH7600) case 0x4053: strcpy (ss, "mod"); break; case 0x4062: strcpy (ss, "dsr"); break; case 0x4063: strcpy (ss, "rs"); break; case 0x4072: strcpy (ss, "a0"); break; case 0x4073: strcpy (ss, "re"); break; case 0x4082: strcpy (ss, "x0"); break; case 0x4092: strcpy (ss, "x1"); break; case 0x40a2: strcpy (ss, "y0"); break; case 0x40b2: strcpy (ss, "y1"); break;#endif /* CPU==SH7700 || CPU==SH7600 */ default: strcpy (ss, "????"); } sprintf (s, "%s,@-r%u", ss, (insn & 0x0f00) >> 8); break; case itBraDispRm: sprintf (s, "r%u", (insn & 0x0f00) >> 8); break; case itLoadCsr: switch (iPtr->op) { case 0x400e: strcpy (ss, "sr"); break; case 0x401e: strcpy (ss, "gbr"); break; case 0x402e: strcpy (ss, "vbr"); break;#if (CPU==SH7750 || CPU==SH7700) case 0x403e: strcpy (ss, "ssr"); break; case 0x404e: strcpy (ss, "spc"); break; case 0x408e: strcpy (ss, "r0_bank"); break; case 0x409e: strcpy (ss, "r1_bank"); break; case 0x40ae: strcpy (ss, "r2_bank"); break; case 0x40be: strcpy (ss, "r3_bank"); break; case 0x40ce: strcpy (ss, "r4_bank"); break; case 0x40de: strcpy (ss, "r5_bank"); break; case 0x40ee: strcpy (ss, "r6_bank"); break; case 0x40fe: strcpy (ss, "r7_bank"); break;#endif /* CPU==SH7750 || CPU==SH7700 */ case 0x400a: strcpy (ss, "mach"); break; case 0x401a: strcpy (ss, "macl"); break; case 0x402a: strcpy (ss, "pr"); break;#if (CPU==SH7700 || CPU==SH7600) case 0x405e: strcpy (ss, "mod"); break; case 0x406a: strcpy (ss, "dsr"); break; case 0x406e: strcpy (ss, "rs"); break; case 0x407a: strcpy (ss, "a0"); break; case 0x407e: strcpy (ss, "re"); break; case 0x408a: strcpy (ss, "x0"); break; case 0x409a: strcpy (ss, "x1"); break; case 0x40aa: strcpy (ss, "y0"); break; case 0x40ba: strcpy (ss, "y1"); break;#endif /* CPU==SH7700 || CPU==SH7600 */ default: strcpy (ss, "????"); } sprintf (s, "r%u,%s", (insn & 0x0f00) >> 8, ss); break; case itPopCsr: switch (iPtr->op) { case 0x4007: strcpy (ss, "sr"); break; case 0x4017: strcpy (ss, "gbr"); break; case 0x4027: strcpy (ss, "vbr"); break;#if (CPU==SH7750 || CPU==SH7700) case 0x4037: strcpy (ss, "ssr"); break; case 0x4047: strcpy (ss, "spc"); break; case 0x4087: strcpy (ss, "r0_bank"); break; case 0x4097: strcpy (ss, "r1_bank"); break; case 0x40a7: strcpy (ss, "r2_bank"); break; case 0x40b7: strcpy (ss, "r3_bank"); break; case 0x40c7: strcpy (ss, "r4_bank"); break; case 0x40d7: strcpy (ss, "r5_bank"); break; case 0x40e7: strcpy (ss, "r6_bank"); break; case 0x40f7: strcpy (ss, "r7_bank"); break;#endif /* CPU==SH7750 || CPU==SH7700 */ case 0x4006: strcpy (ss, "mach"); break; case 0x4016: strcpy (ss, "macl"); break; case 0x4026: strcpy (ss, "pr"); break;#if (CPU==SH7700 || CPU==SH7600) case 0x4057: strcpy (ss, "mod"); break; case 0x4066: strcpy (ss, "dsr"); break; case 0x4067: strcpy (ss, "rs"); break; case 0x4076: strcpy (ss, "a0"); break; case 0x4077: strcpy (ss, "re"); break; case 0x4086: strcpy (ss, "x0"); break; case 0x4096: strcpy (ss, "x1"); break; case 0x40a6: strcpy (ss, "y0"); break; case 0x40b6: strcpy (ss, "y1"); break;#endif /* CPU==SH7700 || CPU==SH7600 */ default: strcpy (ss, "????"); } sprintf (s, "@r%u+,%s", (insn & 0x0f00) >> 8, ss); break; case itTwoReg: sprintf (s, "r%u,r%u", (insn & 0x00f0) >> 4, (insn & 0x0f00) >> 8); break; case itPutRmAtRn: sprintf (s, "r%u,@r%u", (insn & 0x00f0) >> 4, (insn & 0x0f00) >> 8); break; case itGetRnAtRm: sprintf (s, "@r%u,r%u", (insn & 0x00f0) >> 4, (insn & 0x0f00) >> 8); break; case itMac: sprintf (s, "@r%u+,@r%u+", (insn & 0x00f0) >> 4, (insn & 0x0f00) >> 8); break; case itPopReg: sprintf (s, "@r%u+,r%u", (insn & 0x00f0) >> 4, (insn & 0x0f00) >> 8); break; case itPushReg: sprintf (s, "r%u,@-r%u", (insn & 0x00f0) >> 4, (insn & 0x0f00) >> 8); break; case itPutRmAtR0Rn: sprintf (s, "r%u,@(r0,r%u)",(insn & 0x00f0) >> 4, (insn & 0x0f00) >> 8); break; case itGetRnAtR0Rm: sprintf (s, "@(r0,r%u),r%u",(insn & 0x00f0) >> 4, (insn & 0x0f00) >> 8); break; case itGetR0AtDispRm: switch (iPtr->op) { case 0x8400: sprintf (s, "@(%d,r%u),r0", insn & 0x000f, (insn & 0x00f0) >> 4); break; case 0x8500: sprintf (s, "@(%d,r%u),r0", (insn & 0x000f) << 1, (insn & 0x00f0) >> 4); break; default: strcpy (s, "????"); } break; case itPutR0AtDispRn: /* nd4 format: "opcode R0,@(disp,Rn)" */ switch (iPtr->op) { case 0x8000: sprintf (s, "r0,@(%d,r%u)", insn & 0x000f, (insn & 0x00f0) >> 4); break; case 0x8100: sprintf (s, "r0,@(%d,r%u)", (insn & 0x000f) << 1, (insn & 0x00f0) >> 4); break; default: strcpy (s, "????"); } break; case itPutRmAtDispRn: /* nmd format: "opcode Rm,@(disp,Rn)" */ sprintf (s, "r%u,@(%d,r%u)", (insn & 0x00f0) >> 4, (insn & 0x000f) << 2, (insn & 0x0f00) >> 8); break; case itGetRnAtDispRm: /* nmd format: "opcode @(disp,Rm),Rn" */ sprintf (s, "@(%d,r%u),r%u", (insn & 0x000f) << 2, (insn & 0x00f0) >> 4, (insn & 0x0f00) >> 8); break; case itPutR0AtDispGbr: /* d format: "opcode R0,@(disp,GBR)" */ switch (iPtr->op) { case 0xc000: sprintf (s, "r0,@(%#x,gbr)", insn & 0x00ff); break; case 0xc100: sprintf (s, "r0,@(%#x,gbr)", (insn & 0x00ff) << 1); break; case 0xc200: sprintf (s, "r0,@(%#x,gbr)", (insn & 0x00ff) << 2); break; default: strcpy (s, "????"); } break; case itGetR0AtDispGbr: /* d format: "opcode @(disp,GBR),R0" */ switch (iPtr->op) { case 0xc400: sprintf (s, "@(%#x,gbr),r0", insn & 0x00ff); break; case 0xc500: sprintf (s, "@(%#x,gbr),r0", (insn & 0x00ff) << 1); break; case 0xc600: sprintf (s, "@(%#x,gbr),r0", (insn & 0x00ff) << 2); break; default: strcpy (s, "????"); } break; case itMova: /* d format: "opcode @(disp,PC),R0" */ { char sym [MAX_SYS_SYM_LEN + 1]; disp = (insn & 0x00ff) << 2; addr = (UINT32)((address + 4 + disp) & 0xfffffffc); dsmFormatAdrs (addr, sym); sprintf (s, "@(%#x,pc),r0 (= %s)", (INT16)disp, sym); } break; case itBraDisp8: /* d format: "opcode disp" */ { char sym [MAX_SYS_SYM_LEN + 1]; if (insn & 0x0080) disp = (insn | 0xff00) << 1; else disp = (insn & 0x00ff) << 1; addr = (UINT32)(address + 4 + (INT16)disp); dsmFormatAdrs (addr, sym); sprintf (s, "%+d (==> %s)", (INT16)disp, sym); } break; case itBraDisp12: /* d12 format: "opcode disp" */ { char sym [MAX_SYS_SYM_LEN + 1]; if (insn & 0x0800) disp = (insn | 0xf000) << 1; else disp = (insn & 0x0fff) << 1; addr = (UINT32)(address + 4 + (INT16)disp); dsmFormatAdrs (addr, sym); sprintf (s, "%+d (==> %s)", (INT16)disp, sym); } break; case itGetRnAtDispPc: /* nd8 format: "opcode @(disp,PC),Rn" */ switch (iPtr->op) { case 0x9000: disp = (insn & 0x00ff) << 1; dPtr = (UINT32 *)((address + 4 + disp) & 0xfffffffe); sprintf (s, "@(%#x,pc),r%u (= 0x%08x)", disp, (insn & 0x0f00) >> 8, *(INT16 *)dPtr); break; case 0xd000: { char *label; /* pointer to sym tbl copy of name */ void *actVal; SYMBOL_ID symId; char demangled [MAX_SYS_SYM_LEN + 1]; char *labelToPrint; disp = (insn & 0x00ff) << 2; dPtr = (UINT32 *)((address + 4 + disp) & 0xfffffffc); addr = *dPtr; if ((symFindSymbol (sysSymTbl, NULL, (void *)addr, SYM_MASK_NONE, SYM_MASK_NONE, &symId) == OK) && (symNameGet (symId, &label) == OK) && (symValueGet (symId, &actVal) == OK) && (actVal == (void *)addr)) { labelToPrint = cplusDemangle (label, demangled, sizeof (demangled)); sprintf (s, "@(%#x,pc),r%u (= 0x%08x = %s)", disp, (insn & 0x0f00) >> 8, *dPtr, labelToPrint); } else { sprintf (s, "@(%#x,pc),r%u (= 0x%08x)", disp, (insn & 0x0f00) >> 8, *dPtr); } } break; default: strcpy (s, "????"); } break;#if (CPU==SH7700 || CPU==SH7600) case itGetDispPc: { char sym [MAX_SYS_SYM_LEN + 1]; switch (iPtr->op) { case 0x8e00: case 0x8c00: /* allows negative ofsets */ if (insn & 0x0080) disp = (insn | 0xff00) << 1; else disp = (insn & 0x00ff) << 1; break; default: disp = 0; break; } addr = (UINT32)(address + 4 + (INT16)disp); dsmFormatAdrs (addr, sym); sprintf (s, "@(%#x,pc) (==> %s)", disp, sym); } break;#endif /* CPU==SH7700 || CPU==SH7600 */ case itImmAtR0Gbr: sprintf (s, "#0x%x,@(r0,gbr)", insn & 0x00ff); break; case itImmToR0: switch (iPtr->op) { case 0x8800: sprintf (s, "#0x%x,r0", (INT8)(insn & 0x00ff)); break; default: sprintf (s, "#0x%x,r0", insn & 0x00ff ); } break; case itImm: sprintf (s, "#%d", insn & 0x00ff); break; case itImmToRn: sprintf (s, "#%d,r%u",(INT8)(insn & 0x00ff), (insn & 0x0f00) >> 8); break; default: strcpy (s, "unknown instruction type."); } }/********************************************************************************* dsmFormatAdrs - prints addresses as symbols, if an exact match can be found** NOMANUAL*/ LOCAL void dsmFormatAdrs ( int address, /* address to print */ char *s ) { char *label; /* pointer to symbol table copy of name */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -