📄 gencpu.c
字号:
printf("CFLG = regs.x = carry!=0;\n"); genastore("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data"); break; case i_LSLW: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); start_brace (); switch(table68k[opcode].size) { case sz_byte: printf("\tUBYTE val = data;\n"); break; case sz_word: printf("\tUWORD val = data;\n"); break; case sz_long: printf("\tULONG val = data;\n"); break; default: abort(); } switch(table68k[opcode].size) { case sz_byte: printf("\tULONG cmask = 0x80;\n"); break; case sz_word: printf("\tULONG cmask = 0x8000;\n"); break; case sz_long: printf("\tULONG cmask = 0x80000000;\n"); break; default: abort(); } printf("\tint carry = val&cmask;\n"); printf("\tval <<= 1;\n"); genflags(flag_logical, table68k[opcode].size, "val", "", ""); printf("CFLG = regs.x = carry!=0;\n"); genastore("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data"); break; case i_ROLW: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); start_brace (); switch(table68k[opcode].size) { case sz_byte: printf("\tUBYTE val = data;\n"); break; case sz_word: printf("\tUWORD val = data;\n"); break; case sz_long: printf("\tULONG val = data;\n"); break; default: abort(); } switch(table68k[opcode].size) { case sz_byte: printf("\tULONG cmask = 0x80;\n"); break; case sz_word: printf("\tULONG cmask = 0x8000;\n"); break; case sz_long: printf("\tULONG cmask = 0x80000000;\n"); break; default: abort(); } printf("\tint carry = val&cmask;\n"); printf("\tval <<= 1;\n"); printf("\tif(carry) val |= 1;\n"); genflags(flag_logical, table68k[opcode].size, "val", "", ""); printf("CFLG = carry!=0;\n"); genastore("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data"); break; case i_RORW: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); start_brace (); switch(table68k[opcode].size) { case sz_byte: printf("\tUBYTE val = data;\n"); break; case sz_word: printf("\tUWORD val = data;\n"); break; case sz_long: printf("\tULONG val = data;\n"); break; default: abort(); } printf("\tint carry = val&1;\n"); switch(table68k[opcode].size) { case sz_byte: printf("\tULONG cmask = 0x80;\n"); break; case sz_word: printf("\tULONG cmask = 0x8000;\n"); break; case sz_long: printf("\tULONG cmask = 0x80000000;\n"); break; default: abort(); } printf("\tval >>= 1;\n"); printf("\tif(carry) val |= cmask;\n"); genflags(flag_logical, table68k[opcode].size, "val", "", ""); printf("CFLG = carry!=0;\n"); genastore("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data"); break; case i_ROXLW: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); start_brace (); switch(table68k[opcode].size) { case sz_byte: printf("\tUBYTE val = data;\n"); break; case sz_word: printf("\tUWORD val = data;\n"); break; case sz_long: printf("\tULONG val = data;\n"); break; default: abort(); } switch(table68k[opcode].size) { case sz_byte: printf("\tULONG cmask = 0x80;\n"); break; case sz_word: printf("\tULONG cmask = 0x8000;\n"); break; case sz_long: printf("\tULONG cmask = 0x80000000;\n"); break; default: abort(); } printf("\tint carry = val&cmask;\n"); printf("\tval <<= 1;\n"); printf("\tif(regs.x) val |= 1;\n"); printf("\tregs.x = carry != 0;\n"); genflags(flag_logical, table68k[opcode].size, "val", "", ""); printf("regs.x = CFLG = carry!=0;\n"); genastore("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data"); break; case i_ROXRW: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); start_brace (); switch(table68k[opcode].size) { case sz_byte: printf("\tUBYTE val = data;\n"); break; case sz_word: printf("\tUWORD val = data;\n"); break; case sz_long: printf("\tULONG val = data;\n"); break; default: abort(); } printf("\tint carry = val&1;\n"); switch(table68k[opcode].size) { case sz_byte: printf("\tULONG cmask = 0x80;\n"); break; case sz_word: printf("\tULONG cmask = 0x8000;\n"); break; case sz_long: printf("\tULONG cmask = 0x80000000;\n"); break; default: abort(); } printf("\tval >>= 1;\n"); printf("\tif(regs.x) val |= cmask;\n"); printf("\tregs.x = carry != 0;\n"); genflags(flag_logical, table68k[opcode].size, "val", "", ""); printf("regs.x = CFLG = carry!=0;\n"); genastore("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data"); break; case i_MOVEC2: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); start_brace(); printf("\tint regno = (src >> 12) & 7;\n"); printf("\tULONG *regp = src & 0x8000 ? regs.a + regno : regs.d + regno;\n"); printf("\tm68k_movec2(src & 0xFFF, regp);\n"); break; case i_MOVE2C: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); start_brace(); printf("\tint regno = (src >> 12) & 7;\n"); printf("\tULONG *regp = src & 0x8000 ? regs.a + regno : regs.d + regno;\n"); printf("\tm68k_move2c(src & 0xFFF, regp);\n"); break; case i_CAS: { int old_brace_level; genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); start_brace(); printf("\tint ru = (src >> 6) & 7;\n"); printf("\tint rc = src & 7;\n"); printf("\tif ((LONG)regs.d[rc] == (LONG)dst)"); old_brace_level = n_braces; start_brace (); genastore("(regs.d[ru])",table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); pop_braces (old_brace_level); printf("else"); start_brace (); printf("regs.d[rc] = dst;\n"); pop_braces (old_brace_level); } break; case i_DIVL: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); printf("\tm68k_divl(opcode, dst, extra);\n"); break; case i_MULL: genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0); genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); printf("\tm68k_mull(opcode, dst, extra);\n"); break; default: abort(); break; }; finish_braces ();}static void generate_func(long int from, long int to){ int illg = 0; long int opcode; UWORD smsk; UWORD dmsk; printf("#include \"sysdeps.h\"\n"); printf("#include \"memory.h\"\n"); printf("#include \"custom.h\"\n"); printf("#include \"newcpu.h\"\n"); printf("#include \"cputbl.h\"\n"); for(opcode=from; opcode < to; opcode++) { if (table68k[opcode].mnemo == i_ILLG) { illg++; continue; } if (isspecific(opcode)) { printf("void op_%lx_s(ULONG opcode)\n{\n", opcode); if (table68k[opcode].suse && table68k[opcode].smode != imm && table68k[opcode].smode != imm0 && table68k[opcode].smode != imm1 && table68k[opcode].smode != imm2 && table68k[opcode].smode != absw && table68k[opcode].smode != absl && table68k[opcode].smode != PC8r && table68k[opcode].smode != PC16) { printf("\tULONG srcreg = (LONG)(BYTE)%d;\n", (int)table68k[opcode].sreg); } if (table68k[opcode].duse /* Yes, the dmode can be imm, in case of LINK or DBcc */ && table68k[opcode].dmode != imm && table68k[opcode].dmode != imm0 && table68k[opcode].dmode != imm1 && table68k[opcode].dmode != imm2 && table68k[opcode].dmode != absw && table68k[opcode].dmode != absl) { printf("\tULONG dstreg = (LONG)(BYTE)%d;\n", (int)table68k[opcode].dreg); } gen_opcode(opcode); printf("}\n"); } if (table68k[opcode].handler != -1) continue; switch (table68k[opcode].stype) { case 0: smsk = 7; break; case 1: smsk = 255; break; case 2: smsk = 15; break; case 3: smsk = 7; break; default: abort(); } smsk <<= table68k[opcode].spos; dmsk = 7 << table68k[opcode].dpos; printf("void op_%lx(ULONG opcode)\n{\n", opcode); if (table68k[opcode].suse && table68k[opcode].smode != imm && table68k[opcode].smode != imm0 && table68k[opcode].smode != imm1 && table68k[opcode].smode != imm2 && table68k[opcode].smode != absw && table68k[opcode].smode != absl && table68k[opcode].smode != PC8r && table68k[opcode].smode != PC16) { if (table68k[opcode].spos == -1) { printf("\tULONG srcreg = (LONG)(BYTE)%d;\n", (int)table68k[opcode].sreg); } else { if (table68k[opcode].stype == 3) printf("\tULONG srcreg = imm8_table[(opcode & %d) >> %d];\n", smsk, (int)table68k[opcode].spos); else printf("\tULONG srcreg = (LONG)(BYTE)((opcode & %d) >> %d);\n", smsk, (int)table68k[opcode].spos); } } if (table68k[opcode].duse /* Yes, the dmode can be imm, in case of LINK or DBcc */ && table68k[opcode].dmode != imm && table68k[opcode].dmode != imm0 && table68k[opcode].dmode != imm1 && table68k[opcode].dmode != imm2 && table68k[opcode].dmode != absw && table68k[opcode].dmode != absl) { if (table68k[opcode].dpos == -1) { printf("\tULONG dstreg = (LONG)(BYTE)%d;\n", (int)table68k[opcode].dreg); } else { printf("\tULONG dstreg = (opcode & %d) >> %d;\n", dmsk, (int)table68k[opcode].dpos); } } gen_opcode(opcode); printf("}\n"); } fprintf (stderr, "%d illegals generated.\n", illg);}static void generate_table(void){ int illg = 0; long int opcode; printf("#include \"sysdeps.h\"\n"); printf("#include \"memory.h\"\n"); printf("#include \"custom.h\"\n"); printf("#include \"newcpu.h\"\n"); printf("#include \"cputbl.h\"\n"); printf("cpuop_func *cpufunctbl[65536] = {\n"); for(opcode=0; opcode < 65536; opcode++) { if (table68k[opcode].mnemo == i_ILLG) { printf("op_illg"); illg++; } else if (isspecific(opcode)) printf("op_%lx_s", opcode); else if (table68k[opcode].handler != -1) printf("op_%lx", table68k[opcode].handler); else printf("op_%lx", opcode); if (opcode < 65535) printf(","); if ((opcode & 7) == 7) printf("\n"); } printf("\n};\n"); fprintf (stderr, "%d illegals generated.\n", illg); if (get_no_mismatches()) fprintf(stderr, "%d mismatches.\n", get_no_mismatches());}static void generate_smalltable(void){ long int opcode; printf("#include \"sysdeps.h\"\n"); printf("#include \"memory.h\"\n"); printf("#include \"custom.h\"\n"); printf("#include \"newcpu.h\"\n"); printf("#include \"cputbl.h\"\n"); printf("struct cputbl smallcputbl[] = {\n"); for(opcode=0; opcode < 65536; opcode++) { if ((isspecific(opcode) || table68k[opcode].handler == -1) && table68k[opcode].mnemo != i_ILLG) { if (isspecific(opcode)) printf("{ op_%x_s, 1, %d },\n", opcode, opcode); if (table68k[opcode].handler == -1) printf("{ op_%x, 0, %d },\n", opcode, opcode); } } printf("{ 0, 0, 0 }};\n");}static void generate_header(void){ int illg = 0; long int opcode; for(opcode=0; opcode < 65536; opcode++) { if (table68k[opcode].mnemo == i_ILLG) { illg++; continue; } if (isspecific(opcode)) printf("extern cpuop_func op_%lx_s;\n", opcode); if (table68k[opcode].handler != -1) continue; printf("extern cpuop_func op_%lx;\n", opcode); } fprintf (stderr, "%d illegals generated.\n", illg); if (get_no_mismatches()) fprintf(stderr, "%d mismatches.\n", get_no_mismatches());}int main(int argc, char **argv){ long int range = -1; char mode = 'n'; int i; if (argc == 2) mode = *argv[1]; if (argc == 3) { range = atoi(argv[2]); mode = *argv[1]; } read_table68k (); read_counts(); do_merges (); switch(mode) { case 'f': generate_func(range * 0x1000, (range + 1) * 0x1000); break; case 'h': generate_header(); break; case 't': generate_table(); break; case 's': generate_smalltable(); break; default: abort(); } free(table68k); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -