disasm.c

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 738 行 · 第 1/2 页

C
738
字号
   {0},
   {HEX_0, HEX_0, HEX_1, HEX_B}},
  {"STC",
   {A_SR, A_REG_N},
   {HEX_0, REG_N, HEX_0, HEX_2}},
  {"STC",
   {A_GBR, A_REG_N},
   {HEX_0, REG_N, HEX_1, HEX_2}},
  {"STC",
   {A_VBR, A_REG_N},
   {HEX_0, REG_N, HEX_2, HEX_2}},
  {"STC",
   {A_SSR, A_REG_N},
   {HEX_0, REG_N, HEX_3, HEX_2}},
  {"STC",
   {A_SPC, A_REG_N},
   {HEX_0, REG_N, HEX_4, HEX_2}},
  {"STC",
   {A_REG_B, A_REG_N},
   {HEX_0, REG_N, REG_B, HEX_2}},
  {"STC.L",
   {A_SR, A_DEC_N},
   {HEX_4, REG_N, HEX_0, HEX_3}},
  {"STC.L",
   {A_GBR, A_DEC_N},
   {HEX_4, REG_N, HEX_1, HEX_3}},
  {"STC.L",
   {A_VBR, A_DEC_N},
   {HEX_4, REG_N, HEX_2, HEX_3}},
  {"STC.L",
   {A_SSR, A_DEC_N},
   {HEX_4, REG_N, HEX_3, HEX_3}},
  {"STC.L",
   {A_SPC, A_DEC_N},
   {HEX_4, REG_N, HEX_4, HEX_3}},
  {"STC.L",
   {A_REG_B, A_DEC_N},
   {HEX_4, REG_N, REG_B, HEX_3}},
  {"STS",
   {A_MACH, A_REG_N},
   {HEX_0, REG_N, HEX_0, HEX_A}},
  {"STS",
   {A_MACL, A_REG_N},
   {HEX_0, REG_N, HEX_1, HEX_A}},
  {"STS",
   {A_PR, A_REG_N},
   {HEX_0, REG_N, HEX_2, HEX_A}},
  {"STS.L",
   {A_MACH, A_DEC_N},
   {HEX_4, REG_N, HEX_0, HEX_2}},
  {"STS.L",
   {A_MACL, A_DEC_N},
   {HEX_4, REG_N, HEX_1, HEX_2}},
  {"STS.L",
   {A_PR, A_DEC_N},
   {HEX_4, REG_N, HEX_2, HEX_2}},
  {"SUB",
   {A_REG_M, A_REG_N},
   {HEX_3, REG_N, REG_M, HEX_8}},
  {"SUBC",
   {A_REG_M, A_REG_N},
   {HEX_3, REG_N, REG_M, HEX_A}},
  {"SUBV",
   {A_REG_M, A_REG_N},
   {HEX_3, REG_N, REG_M, HEX_B}},
  {"SWAP.B",
   {A_REG_M, A_REG_N},
   {HEX_6, REG_N, REG_M, HEX_8}},
  {"SWAP.W",
   {A_REG_M, A_REG_N},
   {HEX_6, REG_N, REG_M, HEX_9}},
  {"TAS.B",
   {A_IND_N},
   {HEX_4, REG_N, HEX_1, HEX_B}},
  {"TRAPA",
   {A_IMM},
   {HEX_C, HEX_3, IMM_8}},
  {"TST",
   {A_IMM, A_R0},
   {HEX_C, HEX_8, IMM_8}},
  {"TST",
   {A_REG_M, A_REG_N},
   {HEX_2, REG_N, REG_M, HEX_8}},
  {"TST.B",
   {A_IMM, A_R0_GBR},
   {HEX_C, HEX_C, IMM_8}},
  {"XOR",
   {A_IMM, A_R0},
   {HEX_C, HEX_A, IMM_8}},
  {"XOR",
   {A_REG_M, A_REG_N},
   {HEX_2, REG_N, REG_M, HEX_A}},
  {"XOR.B",
   {A_IMM, A_R0_GBR},
   {HEX_C, HEX_E, IMM_8}},
  {"XTRCT",
   {A_REG_M, A_REG_N},
   {HEX_2, REG_N, REG_M, HEX_D}},
  {"MUL.L",
   {A_REG_M, A_REG_N},
   {HEX_0, REG_N, REG_M, HEX_7}},
  {"DT",
   {A_REG_N},
   {HEX_4, REG_N, HEX_1, HEX_0}},
  {"DMULS.L",
   {A_REG_M, A_REG_N},
   {HEX_3, REG_N, REG_M, HEX_D}},
  {"DMULU.L",
   {A_REG_M, A_REG_N},
   {HEX_3, REG_N, REG_M, HEX_5}},
  {"MAC.L",
   {A_INC_M, A_INC_N},
   {HEX_0, REG_N, REG_M, HEX_F}},
  {"BRAF",
   {A_REG_N},
   {HEX_0, REG_N, HEX_2, HEX_3}},
  {"BSRF",
   {A_REG_N},
   {HEX_0, REG_N, HEX_0, HEX_3}},

  {0}};









ADDR
Disasm (ADDR address, unsigned char *data, int pad)
{
  ADDR fetch_addr = 0;
  int fetch_size = 0;
  unsigned char nibs[4];

  int dword = *(short *) (data);
  int relmask = ~0;
  sh_opcode_info const *op;

#if 0
#if SH!=3
  int low = 1;
  int high = 0;
#else
  int low = 0;
  int high = 1;
#endif
#endif

	int low = 0;
	int high = 1;

  nibs[0] = (dword >> 12) & 0xf;
  nibs[1] = (dword >> 8) & 0xf;
  nibs[2] = (dword >> 4) & 0xf;
  nibs[3] = (dword >> 0) & 0xf;

  if (pad)
    printf ("%x " F_B F_B "  ", address, data[high], data[low]);

  for (op = sh_table; op->name; op++)
    {
      int n;
      int imm = 0;
      int rn = 0;
      int rm = 0;
      int rb = 0;
      for (n = 0; n < 4; n++)
	{
	  int i = op->nibbles[n];
	  if (i < 16)
	    {
	      if (nibs[n] == i)
		continue;
	      goto fail;
	    }
	  switch (i)
	    {
	    case BRANCH_8:
	      imm = (nibs[2] << 4) | (nibs[3]);
	      if (imm & 0x80)
		imm |= ~0xff;
	      imm = ((char) imm) * 2 + 4;
	      goto ok;

	    case BRANCH_12:
	      imm = ((nibs[1]) << 8) | (nibs[2] << 4) | (nibs[3]);
	      if (imm & 0x800)
		imm |= ~0xfff;
	      imm = imm * 2 + 4;
	      goto ok;
	    case IMM_4:
	      imm = nibs[3];
	      goto ok;
	    case IMM_4BY2:
	      imm = nibs[3] << 1;
	      goto ok;
	    case IMM_4BY4:
	      imm = nibs[3] << 2;
	      goto ok;
	    case IMM_8:
	      imm = (nibs[2] << 4) | nibs[3];
	      goto ok;
	    case PCRELIMM_8BY2:
	      imm = ((nibs[2] << 4) | nibs[3]) << 1;
	      fetch_size = 2;
	      relmask = ~1;
	      goto ok;
	    case PCRELIMM_8BY4:
	      imm = ((nibs[2] << 4) | nibs[3]) << 2;
	      fetch_size = 4;
	      relmask = ~3;
	      goto ok;

	    case IMM_8BY2:
	      imm = ((nibs[2] << 4) | nibs[3]) << 1;
	      goto ok;
	    case IMM_8BY4:
	      imm = ((nibs[2] << 4) | nibs[3]) << 2;
	      goto ok;
	    case DISP_8:
	      imm = (nibs[2] << 4) | (nibs[3]);
	      goto ok;
	    case DISP_4:
	      imm = nibs[3];
	      goto ok;
	    case REG_N:
	      rn = nibs[n];
	      break;
	    case REG_M:
	      rm = nibs[n];
	      break;
	    case REG_B:
	      rb = nibs[n] & 0x7;
	      break;
	    default:
	      ;
	    }

	}
    ok:
      printf ("\t%s\t", op->name);
      for (n = 0; n < 2 && op->arg[n] != A_END; n++)
	{
	  if (n && op->arg[1] != A_END)
	    printf (",");
	  switch (op->arg[n])
	    {
	    case A_IMM:
	      printf ("#%x", (char) (imm));
	      break;
	    case A_R0:
	      printf ("R0");
	      break;
	    case A_REG_N:
	      printf ("R%d", rn);
	      break;
	    case A_INC_N:
	      printf ("@R%d+", rn);
	      break;
	    case A_DEC_N:
	      printf ("@-R%d", rn);
	      break;
	    case A_IND_N:
	      printf ("@R%d", rn);
	      break;
	    case A_DISP_REG_N:
	      printf ("@(%x,R%d)", imm, rn);
	      break;
	    case A_REG_M:
	      printf ("R%d", rm);
	      break;
	    case A_INC_M:
	      printf ("@R%d+", rm);
	      break;
	    case A_REG_B:
	      printf ("R%d_BANK", rb & 0x7);
	      break;
	    case A_DEC_M:
	      printf ("@-R%d", rm);
	      break;
	    case A_IND_M:
	      printf ("@R%d", rm);
	      break;
	    case A_DISP_REG_M:
	      printf ("@(%d,R%d)", imm, rm);
	      break;
	    case A_DISP_PC:
	      printf ("@(%X,PC)", imm);
	      fetch_addr = (ADDR) (((SIZE_T) address & relmask) + imm + 4);
	      break;
	    case A_IND_R0_REG_N:
	      printf ("@(R0,R%d)", rn);
	      break;
	    case A_IND_R0_REG_M:
	      printf ("@(R0,R%d)", rm);
	      break;
	    case A_DISP_GBR:
	      printf ("@(%d,GBR)", imm);
	      break;
	    case A_R0_GBR:
	      printf ("@(R0,GBR)");
	      break;
	    case A_BDISP12:
	    case A_BDISP8:
	      printf ("%x", imm + address);
	      break;
	    case A_SR:
	      printf ("SR");
	      break;
	    case A_SPC:
	      printf ("SPC");
	      break;
	    case A_SSR:
	      printf ("SSR");
	      break;
	    case A_GBR:
	      printf ("GBR");
	      break;
	    case A_VBR:
	      printf ("VBR");
	      break;
	    case A_MACH:
	      printf ("MACH");
	      break;
	    case A_MACL:
	      printf ("MACL");
	      break;
	    case A_PR:
	      printf ("PR");
	      break;
	    default:
	      ;
	    }

	}

      if (fetch_size == 2)
	{
	  short int val;
	  memcpy (&val, fetch_addr, 2);
	  printf ("\t!%x:%H", fetch_addr, val);
	}
      if (fetch_size == 4)
	{
	  unsigned long val;
	  memcpy (&val, fetch_addr, 4);
	  printf ("\t!%x:%X", fetch_addr, val);
	}
      printf ("\n");
      return address + 2;
    fail:
      ;

    }
  printf ("\t.WORD " F_B F_B "\n", data[high], data[low]);
  return address + 2;
}

void
disatpc ()
{
  Disasm (get_pc (), (char *) get_pc (), 1);
}

int get_pc(void) {}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?