📄 writecode.c
字号:
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 + -