📄 gencpu.c
字号:
switch (table68k[opcode].plev) { case 0: /* not priviledged */ break; case 1: /* unpriviledged only on 68000 */ if (CPU_LEVEL == 0) break; case 2: /* priviledged */ printf("if (!regs.s) { regs.pc_p--; Exception(8); } else\n"); start_brace(); break; case 3: /* priviledged if size == word */ if (table68k[opcode].size == sz_byte) break; printf("if (!regs.s) { regs.pc_p--; Exception(8); } else\n"); start_brace(); break; } switch(table68k[opcode].mnemo) { case i_OR: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); printf("\tsrc |= dst;\n"); genflags(flag_logical, table68k[opcode].size, "src", "", ""); genastore("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_AND: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); printf("\tsrc &= dst;\n"); genflags(flag_logical, table68k[opcode].size, "src", "", ""); genastore("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_EOR: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); printf("\tsrc ^= dst;\n"); genflags(flag_logical, table68k[opcode].size, "src", "", ""); genastore("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_ORSR: printf("\tMakeSR();\n"); genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); if (table68k[opcode].size == sz_byte) { printf("\tsrc &= 0xFF;\n"); } printf("\tregs.sr |= src;\n"); printf("\tMakeFromSR();\n"); break; case i_ANDSR: printf("\tMakeSR();\n"); genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); if (table68k[opcode].size == sz_byte) { printf("\tsrc |= 0xFF00;\n"); } printf("\tregs.sr &= src;\n"); printf("\tMakeFromSR();\n"); break; case i_EORSR: printf("\tMakeSR();\n"); genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); if (table68k[opcode].size == sz_byte) { printf("\tsrc &= 0xFF;\n"); } printf("\tregs.sr ^= src;\n"); printf("\tMakeFromSR();\n"); break; case i_SUB: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); start_brace (); genflags(flag_sub, table68k[opcode].size, "newv", "src", "dst"); genastore("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_SUBA: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0); start_brace (); printf("\tULONG newv = dst - src;\n"); genastore("newv", table68k[opcode].dmode, "dstreg", sz_long, "dst"); break; case i_SUBX: 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("\tULONG newv = dst - src - (regs.x ? 1 : 0);\n"); genflags(flag_subx, table68k[opcode].size, "newv", "src", "dst"); genflags(flag_zn, table68k[opcode].size, "newv", "", ""); genastore("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_SBCD: /* Let's hope this works... */ 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("\tUWORD newv_lo = (dst & 0xF) - (src & 0xF) - regs.x;\n"); printf("\tUWORD newv_hi = (dst & 0xF0) - (src & 0xF0);\n"); printf("\tUWORD newv;\n"); printf("\tif (newv_lo > 9) { newv_lo-=6; newv_hi-=0x10; }\n"); printf("\tnewv = newv_hi + (newv_lo & 0xF);"); printf("\tCFLG = regs.x = (newv_hi & 0x1F0) > 0x90;\n"); printf("\tif (CFLG) newv -= 0x60;\n"); genflags(flag_zn, table68k[opcode].size, "newv", "", ""); genflags(flag_sv, table68k[opcode].size, "newv", "src", "dst"); genastore("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_ADD: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); start_brace (); genflags(flag_add, table68k[opcode].size, "newv", "src", "dst"); genastore("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_ADDA: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0); start_brace (); printf("\tULONG newv = dst + src;\n"); genastore("newv", table68k[opcode].dmode, "dstreg", sz_long, "dst"); break; case i_ADDX: 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("\tULONG newv = dst + src + (regs.x ? 1 : 0);\n"); genflags(flag_addx, table68k[opcode].size, "newv", "src", "dst"); genflags(flag_zn, table68k[opcode].size, "newv", "", ""); genastore("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_ABCD: 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("\tUWORD newv_lo = (src & 0xF) + (dst & 0xF) + regs.x;\n"); printf("\tUWORD newv_hi = (src & 0xF0) + (dst & 0xF0);\n"); printf("\tUWORD newv;\n"); printf("\tif (newv_lo > 9) { newv_lo +=6; }\n"); printf("\tnewv = newv_hi + newv_lo;"); printf("\tCFLG = regs.x = (newv & 0x1F0) > 0x90;\n"); printf("\tif (CFLG) newv += 0x60;\n"); genflags(flag_zn, table68k[opcode].size, "newv", "", ""); genflags(flag_sv, table68k[opcode].size, "newv", "src", "dst"); genastore("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_NEG: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); start_brace (); genflags(flag_sub, table68k[opcode].size, "dst", "src", "0"); genastore("dst",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_NEGX: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); start_brace (); printf("\tsrc += regs.x;\n"); genflags(flag_sub, table68k[opcode].size, "dst", "src", "0"); genastore("dst",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_NBCD: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); start_brace (); printf("\tUWORD newv_lo = - (src & 0xF) - regs.x;\n"); printf("\tUWORD newv_hi = - (src & 0xF0);\n"); printf("\tUWORD newv;\n"); printf("\tif (newv_lo > 9) { newv_lo-=6; newv_hi-=0x10; }\n"); printf("\tnewv = newv_hi + (newv_lo & 0xF);"); printf("\tCFLG = regs.x = (newv_hi & 0x1F0) > 0x90;\n"); printf("\tif (CFLG) newv -= 0x60;\n"); printf("\tif (newv != 0) ZFLG = 0;\n"); genastore("newv", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_CLR: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); genflags(flag_logical, table68k[opcode].size, "0", "", ""); genastore("0",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_NOT: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); start_brace (); printf("\tULONG dst = ~src;\n"); genflags(flag_logical, table68k[opcode].size, "dst", "", ""); genastore("dst",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_TST: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genflags(flag_logical, table68k[opcode].size, "src", "", ""); break; case i_BTST: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); if (table68k[opcode].size == sz_byte) printf("\tsrc &= 7;\n"); else printf("\tsrc &= 31;\n"); printf("\tZFLG = !(dst & (1 << src));\n"); break; case i_BCHG: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); if (table68k[opcode].size == sz_byte) printf("\tsrc &= 7;\n"); else printf("\tsrc &= 31;\n"); printf("\tZFLG = !(dst & (1 << src));\n"); printf("\tdst ^= (1 << src);\n"); genastore("dst", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_BCLR: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); if (table68k[opcode].size == sz_byte) printf("\tsrc &= 7;\n"); else printf("\tsrc &= 31;\n"); printf("\tZFLG = !(dst & (1 << src));\n"); printf("\tdst &= ~(1 << src);\n"); genastore("dst", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_BSET: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); if (table68k[opcode].size == sz_byte) printf("\tsrc &= 7;\n"); else printf("\tsrc &= 31;\n"); printf("\tZFLG = !(dst & (1 << src));\n"); printf("\tdst |= (1 << src);\n"); genastore("dst", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_CMPM: case i_CMP: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); start_brace (); genflags(flag_cmp, table68k[opcode].size, "newv", "src", "dst"); break; case i_CMPA: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0); start_brace (); genflags(flag_cmp, sz_long, "newv", "src", "dst"); break; /* The next two are coded a little unconventional, but they are doing * weird things... */ case i_MVPRM: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); printf("\tCPTR memp = regs.a[dstreg] + nextiword();\n"); if (table68k[opcode].size == sz_word) { printf("\tput_byte(memp, src >> 8); put_byte(memp + 2, src);\n"); } else { printf("\tput_byte(memp, src >> 24); put_byte(memp + 2, src >> 16);\n"); printf("\tput_byte(memp + 4, src >> 8); put_byte(memp + 6, src);\n"); } break; case i_MVPMR: printf("\tCPTR memp = regs.a[srcreg] + nextiword();\n"); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 0, 0); if (table68k[opcode].size == sz_word) { printf("\tUWORD val = (get_byte(memp) << 8) + get_byte(memp + 2);\n"); } else { printf("\tULONG val = (get_byte(memp) << 24) + (get_byte(memp + 2) << 16)\n"); printf(" + (get_byte(memp + 4) << 8) + get_byte(memp + 6);\n"); } genastore("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_MOVE: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 0, 0); genflags(flag_logical, table68k[opcode].size, "src", "", ""); genastore("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_MOVEA: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 0, 0); genastore("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_MVSR2: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); printf("\tMakeSR();\n"); genastore("regs.sr", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_MV2SR: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); if (table68k[opcode].size == sz_byte) printf("\tMakeSR();\n\tregs.sr &= 0xFF00;\n\tregs.sr |= src & 0xFF;\n"); else { printf("\tregs.sr = src;\n"); } printf("\tMakeFromSR();\n"); break; case i_SWAP: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); start_brace (); printf("\tULONG dst = ((src >> 16)&0xFFFF) | ((src&0xFFFF)<<16);\n"); genflags(flag_logical, table68k[opcode].size, "dst", "", ""); genastore("dst",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_EXG: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0); genastore("dst",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); genastore("src",table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_EXT: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); start_brace (); switch(table68k[opcode].size) { case sz_word: printf("\tULONG dst = (LONG)(BYTE)src;\n"); break; case sz_long: printf("\tULONG dst = (LONG)(WORD)src;\n"); break; default: abort(); } genflags(flag_logical, table68k[opcode].size, "dst", "", ""); genastore("dst",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_MVMEL: genmovemel(opcode); break; case i_MVMLE: genmovemle(opcode); break; case i_TRAP: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); printf("\tException(src+32);\n"); break; case i_MVR2USP: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); printf("\tregs.usp = src;\n"); break; case i_MVUSP2R: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); genastore("regs.usp", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_RESET: printf("\tcustomreset();\n"); break; case i_NOP: break; case i_STOP: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); printf("\tregs.sr = src;\n"); printf("\tMakeFromSR();\n"); printf("\tm68k_setstopped(1);\n"); break; case i_RTE: genamode(Aipi, "7", sz_word, "sr", 1, 0); genamode(Aipi, "7", sz_long, "pc", 1, 0); if (CPU_LEVEL > 0) { genamode(Aipi, "7", sz_word, "format", 1, 0); } printf("\tregs.sr = sr; m68k_setpc(pc);\n"); if (CPU_LEVEL > 0) { printf("\tif ((format & 0xF000) == 0x8000) regs.a[7] += 50;\n"); } printf("\tMakeFromSR();\n"); break; case i_RTD: break; case i_LINK: genamode(Apdi, "7", sz_long, "old", 0, 0); genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genastore("src", Apdi, "7", sz_long, "old"); genastore("regs.a[7]", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "offs", 1, 0); printf("\tregs.a[7] += offs;\n"); break; case i_UNLK: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); printf("\tregs.a[7] = src;\n"); genamode(Aipi, "7", sz_long, "old", 1, 0); genastore("old", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_RTS: genamode(Aipi, "7", sz_long, "pc", 1, 0); printf("\tm68k_setpc(pc);\n"); break; case i_TRAPV: printf("\tif(VFLG) Exception(7);\n"); break; case i_RTR: printf("\tMakeSR();\n"); genamode(Aipi, "7", sz_word, "sr", 1, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -