⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 writecode.c

📁 gdb-6.0 linux 下的调试工具
💻 C
📖 第 1 页 / 共 3 页
字号:
      normal_flags (p, "op_src +=  COND(context,7);tmp = op_dst - op_src ;",1);      break;    case OPC_nop:      break;    case OPC_com:    case OPC_comb:      test_normal_flags (p, "tmp = ~ op_dst", 1);      break;    case OPC_and:    case OPC_andb:      test_normal_flags (p, "tmp = op_dst & op_src", 1);      break;    case OPC_xor:    case OPC_xorb:      test_normal_flags (p, "tmp = op_dst ^ op_src", 1);      break;    case OPC_or:    case OPC_orb:      test_normal_flags (p, "tmp = op_dst | op_src", 1);      break;    case OPC_sla:    case OPC_slab:    case OPC_slal:    case OPC_sda:    case OPC_sdab:    case OPC_sdal:      shift (p, 1);      break;    case OPC_sll:    case OPC_sllb:    case OPC_slll:    case OPC_sdl:    case OPC_sdlb:    case OPC_sdll:      shift (p, 0);      break;    case OPC_rl:      rotate (p, 0, 16, 1);      break;    case OPC_rlb:      rotate (p, 0, 8, 1);      break;    case OPC_rr:      rotate (p, 0, 16, 0);      break;    case OPC_rrb:      rotate (p, 0, 8, 0);      break;    case OPC_rrc:      rotate (p, 1, 16, 0);      break;    case OPC_rrcb:      rotate (p, 1, 8, 0);      break;    case OPC_rlc:      rotate (p, 1, 16, 1);      break;    case OPC_rlcb:      rotate (p, 1, 8, 1);      break;    case OPC_extsb:    case OPC_exts:    case OPC_extsl:      exts (p);      break;    case OPC_add:    case OPC_addb:    case OPC_addl:    case OPC_inc:    case OPC_incb:      optimize_normal_flags (p, "tmp = op_dst + op_src",0);      break;    case OPC_testb:    case OPC_test:    case OPC_testl:      test_normal_flags (p, "tmp = op_dst", 0);      break;    case OPC_cp:    case OPC_cpb:    case OPC_cpl:      normal_flags (p, "tmp = op_dst - op_src",1);      break;    case OPC_negb:    case OPC_neg:      emit ("{\n");      emit ("int op_src = -op_dst;\n");      emit ("op_dst = 0;\n");      optimize_normal_flags (p, "tmp = op_dst + op_src;\n",1);      emit ("}");      break;    case OPC_sub:    case OPC_subb:    case OPC_subl:    case OPC_dec:    case OPC_decb:      optimize_normal_flags (p, "tmp = op_dst - op_src",1);      break;    case OPC_bpt:      bpt ();      break;    case OPC_jr:      jr (p);      break;    case OPC_sc:      sc ();      break;    case OPC_jp:      jp (p);      break;    case OPC_ret:      ret (p);      break;    case OPC_call:      call (p);      break;    case OPC_tcc:    case OPC_tccb:      emit ("if(op_cc == 8 || COND(context,op_cc)) put_word_reg(context,reg_dst, 1);\n");      break;    case OPC_lda:      emit ("tmp = oplval_src; \n");      /*(((oplval_src) & 0xff0000) << 8) | (oplval_src & 0xffff); \n");*/      break;    case OPC_ldk:    case OPC_ld:    case OPC_ldb:    case OPC_ldl:      ld (p);      break;    case OPC_ldib:      ldi (p, 8, 1);      break;    case OPC_ldi:      ldi (p, 16, 1);      break;    case OPC_lddb:      ldi (p, 8, -1);      break;    case OPC_ldd:      ldi (p, 16, -1);      break;    case OPC_push:    case OPC_pushl:      push (p);      break;    case OPC_div:    case OPC_divl:      adiv (p);      break;    case OPC_mult:    case OPC_multl:      mult (p);      break;    case OPC_pop:    case OPC_popl:      pop (p);      break;    case OPC_set:      doset (p,1);      break;    case OPC_res:      doset (p,0);      break;    case OPC_bit:      dobit(p);      break;    case OPC_resflg:      doflag(0);      break;    case OPC_setflg:      doflag(1);      break;    default:      emit ("tmp = fail(context,%d);\n", p->opcode);      break;    }}/* emit code to store result in calculated lvalue */voidinfo_store (p)     opcode_entry_type *p;{  unsigned int *i = p->arg_info;  while (*i)    {      current_name = reg_n (*i);      current_size = size_name (p->type);      if (IS_DST (*i))	{	  switch (*i & CLASS_MASK)	    {	    case CLASS_PR:	      emit ("put_<ptr_mode>_reg(context,reg_<name>, tmp);\n");	      break;	    case CLASS_REG_LONG:	    case CLASS_REG_WORD:	    case CLASS_REG_BYTE:	      emit ("put_<size>_reg(context,reg_<name>,tmp);\n");	      break;	    case CLASS_X:	    case CLASS_IR:	    case CLASS_DA:	    case CLASS_BX:	    case CLASS_BA:	      emit ("put_<size>_<mem>_da(context,oplval_<name>, tmp);\n");	      break;	    case CLASS_IMM:	      break;	    default:	      emit ("abort(); ");	      break;	    }	}      i++;    }}staticvoidmangle (p, shortcut, value)     opcode_entry_type *p;     int shortcut;     int value;{  int nostore = 0;  int extra;  int getdst = 1;  int before = 0;  int nosrc = 0;  emit ("/\052 %s \052/\n", p->nicename);  if (shortcut)    {      emit ("int <fop>_%04x(context,pc)\n", value);    }  else    {      emit ("int <fop>_%d(context,pc,iwords0)\n", p->idx);      emit ("int iwords0;\n");    }  emit ("sim_state_type *context;\n");  emit ("int pc;\n");  emit ("{\n");  emit ("register unsigned int tmp;\n");  if (shortcut)    {      emit ("register unsigned int iwords0 = 0x%x;\n", value);    }  /* work out how much bigger this opcode could be because it's large     model */  if (BIG)    {      int i;      extra = 0;      for (i = 0; i < 4; i++)	{	  if ((p->arg_info[i] & CLASS_MASK) == CLASS_DA	      || (p->arg_info[i] & CLASS_MASK) == CLASS_X)	    extra += 2;	}    }  else    {      extra = 0;    }  printf ("			/* Length %d */ \n", p->length + extra);  switch (p->length + extra)    {    case 2:      emit ("pc += 2\n;");      break;    case 4:      emit ("register unsigned int iwords1 = get_word_mem_da(context,pc+2);\n");      emit ("pc += 4;\n");      break;    case 6:      emit ("register unsigned int iwords1 = get_word_mem_da(context,pc+2);\n");      emit ("register unsigned int iwords2 = get_word_mem_da(context,pc+4);\n");      emit ("pc += 6;\n");      break;    case 8:      emit ("register unsigned int iwords1 = get_word_mem_da(context,pc+2);\n");      emit ("register unsigned int iwords2 = get_word_mem_da(context,pc+4);\n");      emit ("register unsigned int iwords3 = get_word_mem_da(context,pc+6);\n");      emit ("pc += 8;\n");      break;    default:      break;    }  emit ("context->cycles += %d;\n", p->cycles);  emit ("{\n");  info_args (p);  info_special (p, &getdst, &nostore, &before, &nosrc);  info_lvals (p);  if (!nosrc)    {      info_fetch (p, getdst);    }  if (before)    {      info_docode (p);    }  else    {      info_docode (p);    }  if (!nostore)    info_store (p);  emit ("}\n");  emit ("return pc;\n");  emit ("}\n");}voidstaticone_instruction (i)     int i;{  /* find the table entry */  opcode_entry_type *p = z8k_table + i;  if (!p)    return;  mangle (p, 0, 0);}voidadd_to_list (ptr, value)     struct opcode_value **ptr;     int value;{  struct opcode_value *prev;  prev = *ptr;  *ptr = (struct opcode_value *) malloc (sizeof (struct opcode_value));  (*ptr)->n = value;  (*ptr)->next = prev;}voidbuild_list (i)     int i;{  opcode_entry_type *p = lookup_inst (i);  if (!p)    return;  add_to_list (&list[p->idx], i);}intmain (ac, av)     int ac;     char **av;{  int i;  int needcomma = 0;  for (i = 1; i < ac; i++)    {      if (strcmp (av[i], "-1") == 0)	file = 1;      if (strcmp (av[i], "-2") == 0)	file = 2;      if (strcmp (av[i], "-3") == 0)	file = 3;      if (strcmp (av[i], "-b3") == 0)	{	  file = 3;	  BIG = 1;	}    }  /* First work out which opcodes use which bit patterns,     build a list of all matching bit pattens */  for (i = 0; i < 1 << 16; i++)    {      build_list (i);    }#if DUMP_LIST  for (i = 0; i < NOPS; i++)    {      struct opcode_value *p;      printf ("%d,", i);      p = list[i];      while (p)	{	  printf (" %04x,", p->n);	  p = p->next;	}      printf ("-1\n");    }#endif  if (file == 1)    {      extern int quick[];      /* Do the shortcuts */      printf ("			/* SHORTCUTS */\n");      for (i = 0; quick[i]; i++)	{	  int t = quick[i];	  mangle (lookup_inst (t), 1, t);	}    }  if (file == 3)    {      printf ("			/* NOT -SHORTCUTS */\n");      for (i = 0; i < NOPS; i++)	{	  if (list[i])	    {	      one_instruction (i);	    }	  else	    {	      emit ("int <fop>_%d(context,pc)\n", i);	      printf ("sim_state_type *context;\n");	      printf ("int pc;\n");	      emit ("{ <fop>_bad1();return pc; }\n");	    }	}      emit ("int <fop>_bad() ;\n");      /* Write the jump table */      emit ("int (*(<fop>_table[]))() = {");      needcomma = 0;      for (i = 0; i < NOPS; i++)	{	  if (needcomma)	    printf (",");	  emit ("<fop>_%d\n", i);	  needcomma = 1;	}      emit ("};\n");    }  if (file == 2)    {      extern int quick[];      /* Static - since it's too be to be automatic on the apollo */      static int big[64 * 1024];      for (i = 0; i < 64 * 1024; i++)	big[i] = 0;      for (i = 0; quick[i]; i++)	{#if 0	  printf ("extern int <fop>_%04x();\n", quick[i]);#endif	  big[quick[i]] = 1;	}      for (i = 0; i < NOPS; i++)	{#if 0	  printf ("extern int fop_%d();\n", i);#endif	}#if 0      printf ("extern int fop_bad();\n");#endif      printf ("struct op_info op_info_table[] = {\n");      for (i = 0; i < 1 << 16; i++)	{	  opcode_entry_type *p = lookup_inst (i);	  if (needcomma)	    printf (",");#if 0	  if (big[i])	    {	      printf ("<fop>_%04x", i);	    }	  else#endif	  if (p != NULL)	    {	      printf ("%d", p->idx);	    }	  else	    printf ("400");	  if (p != NULL)	    {	      printf ("		/* %04x %s */\n", i, p->nicename);	    }	  else	    {	      printf ("\n");	    }	  needcomma = 1;	}      printf ("};\n");    }  return 0;}char *insn_ptr (n)     int n;{  if (BIG)    {      abort ();    }  switch (n)    {    case 4:      return "iwords_1";    default:      return "fail(context,123)";    }}/* work out if the opcode only wants lvalues */intlvalue (p)     opcode_entry_type *p;{  switch (p->opcode)    {    case OPC_lda:      return 1;    case OPC_call:    case OPC_jp:      return 1;    default:      return 0;    }}intinfo_len_in_words (o)     opcode_entry_type *o;{  unsigned  int *p = o->byte_info;  int nibs = 0;  while (*p)    {      switch (*p & CLASS_MASK)	{	case CLASS_IGNORE:	case CLASS_BIT:	case CLASS_REGN0:	case CLASS_REG:	case CLASS_01II:	case CLASS_00II:	  nibs++;	  break;	case CLASS_ADDRESS:	  nibs += SIZE_ADDRESS;	  break;	case CLASS_IMM:	  switch (*p & ~CLASS_MASK)	    {	    case ARG_IMM16:	      nibs += 4;	      break;	    case ARG_IMM32:	      nibs += 8;	      break;	    case ARG_IMM2:	    case ARG_IMM4:	    case ARG_NIM4:	    case ARG_IMM4M1:	    case ARG_IMM_1:	    case ARG_IMM_2:	    case ARG_IMMNMINUS1:	      nibs++;	      break;	    case ARG_NIM8:	    case ARG_IMM8:	      nibs += 2;	      break;	    default:	      abort ();	    }	  break;	case CLASS_DISP:	  switch (*p & ~CLASS_MASK)	    {	    case ARG_DISP16:	      nibs += 4;	      break;	    case ARG_DISP12:	      nibs += 3;	      break;	    case ARG_DISP8:	      nibs += 2;	      break;	    default:	      abort ();	    }	  break;	case CLASS_0DISP7:	case CLASS_1DISP7:	case CLASS_DISP8:	  nibs += 2;	  break;	case CLASS_BIT_1OR2:	case CLASS_0CCC:	case CLASS_1CCC:	case CLASS_CC:	  nibs++;	  break;	default:	  emit ("don't know %x\n", *p);	}      p++;    }  return nibs / 4;		/* return umber of words */}

⌨️ 快捷键说明

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