📄 gencpu.c
字号:
genamode(Aipi, "7", sz_long, "pc", 1, 0); printf("\tregs.sr &= 0xFF00; sr &= 0xFF;\n"); printf("\tregs.sr |= sr; m68k_setpc(pc);\n"); printf("\tMakeFromSR();\n"); break; case i_JSR: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); genamode(Apdi, "7", sz_long, "sp", 0, 0); genastore("m68k_getpc()", Apdi, "7", sz_long, "sp"); printf("\tm68k_setpc(srca);\n"); break; case i_JMP: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); printf("\tm68k_setpc(srca);\n"); break; case i_BSR: printf("\tchar *oldpcp = (char *)regs.pc_p;\n"); genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(Apdi, "7", sz_long, "sp", 0, 0); genastore("m68k_getpc()", Apdi, "7", sz_long, "sp"); printf("\tregs.pc_p = (UWORD *)(oldpcp + (LONG)src);\n"); break; case i_Bcc: printf("\tchar *oldpcp = (char *)regs.pc_p;\n"); genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); printf("\tif (cctrue(%d)) regs.pc_p = (UWORD *)(oldpcp + (LONG)src);\n", table68k[opcode].cc); break; case i_LEA: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 0, 0); genastore("srca", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst"); break; case i_PEA: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); genamode(Apdi, "7", sz_long, "dst", 0, 0); genastore("srca", Apdi, "7", sz_long, "dst"); break; case i_DBcc: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", table68k[opcode].size, "offs", 1, 0); printf("\tif (!cctrue(%d)) {\n", table68k[opcode].cc); printf("\tif (src--) regs.pc_p = (UWORD *)((char *)regs.pc_p + (LONG)offs - 2);\n"); genastore("src", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); printf("\t}\n"); break; case i_Scc: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0); start_brace (); printf("\tint val = cctrue(%d) ? 0xff : 0;\n", table68k[opcode].cc); genastore("val",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src"); break; case i_DIVU: genamode(table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0); printf("\tif(src != 0){\n"); printf("\tULONG newv = (ULONG)dst / (UWORD)src;\n"); printf("\tULONG rem = (ULONG)dst %% (UWORD)src;\n"); /* The N flag appears to be set each time there is an overflow. * Weird. */ printf("\tif (newv > 0xffff) { VFLG = NFLG = 1; } else\n\t{\n"); genflags(flag_logical, sz_word, "newv", "", ""); printf("\tnewv = (newv & 0xffff) | ((ULONG)rem << 16);\n"); genastore("newv",table68k[opcode].dmode, "dstreg", sz_long, "dst"); printf("\t}\n"); printf("\t}\n"); break; case i_DIVS: genamode(table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0); printf("\tif(src != 0){\n"); printf("\tLONG newv = (LONG)dst / (WORD)src;\n"); printf("\tUWORD rem = (LONG)dst %% (WORD)src;\n"); printf("\tif ((newv & 0xffff0000) && (newv & 0xffff0000) != 0xffff0000) { VFLG = NFLG = 1; } else\n\t{\n"); printf("\tif (((WORD)rem < 0) != ((LONG)dst < 0)) rem = -rem;\n"); genflags(flag_logical, sz_word, "newv", "", ""); printf("\tnewv = (newv & 0xffff) | ((ULONG)rem << 16);\n"); genastore("newv",table68k[opcode].dmode, "dstreg", sz_long, "dst"); printf("\t}\n"); printf("\t}\n"); break; case i_MULU: genamode(table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", sz_word, "dst", 1, 0); start_brace (); printf("\tULONG newv = (ULONG)(UWORD)dst * (ULONG)(UWORD)src;\n"); genflags(flag_logical, sz_long, "newv", "", ""); genastore("newv",table68k[opcode].dmode, "dstreg", sz_long, "dst");#ifdef WANT_SLOW_MULTIPLY printf("\tspecialflags |= SPCFLAG_EXTRA_CYCLES;\n");#endif break; case i_MULS: genamode(table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", sz_word, "dst", 1, 0); start_brace (); printf("\tULONG newv = (LONG)(WORD)dst * (LONG)(WORD)src;\n"); genflags(flag_logical, sz_long, "newv", "", ""); genastore("newv",table68k[opcode].dmode, "dstreg", sz_long, "dst");#ifdef WANT_SLOW_MULTIPLY printf("\tspecialflags |= SPCFLAG_EXTRA_CYCLES;\n");#endif break; case i_CHK: genamode(table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0); genamode(table68k[opcode].dmode, "dstreg", sz_word, "dst", 1, 0); printf("\tif ((WORD)dst < 0) { NFLG=1; Exception(6); }\n"); printf("\telse if ((WORD)dst > (WORD)src) { NFLG=0; Exception(6); }\n"); break; case i_ASR: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode(table68k[opcode].dmode, "dstreg", 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("\tULONG sign = cmask & val;\n"); printf("\tcnt &= 63;\n"); printf("\tVFLG = 0;\n"); printf("\tif (!cnt) { CFLG = 0; } else {"); printf("\tfor(;cnt;--cnt){\n"); printf("\tCFLG=regs.x=val&1; val = ((ULONG)val >> 1) | sign;\n"); printf("\t}}\n\tNFLG = sign != 0;\n"); printf("\tZFLG = val == 0;\n"); genastore("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data"); break; case i_ASL: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode(table68k[opcode].dmode, "dstreg", 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("\tULONG sign = cmask & val;\n"); printf("\tcnt &= 63;\n"); printf("\tVFLG = 0;\n"); printf("\tif (!cnt) { CFLG = 0; } else { "); printf("\tfor(;cnt;--cnt){\n"); printf("\tCFLG=regs.x=(val&cmask)!=0; val <<= 1;\n"); printf("\tif ((val&cmask)!=sign)VFLG=1;\n"); printf("\t}}\n\tNFLG = (val&cmask) != 0;\n"); printf("\tZFLG = val == 0;\n"); genastore("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data"); break; case i_LSR: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode(table68k[opcode].dmode, "dstreg", 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("\tcnt &= 63;\n"); printf("\tif (!cnt) { CFLG = 0; } else {"); printf("\tint carry = 0;\n"); printf("\tfor(;cnt;--cnt){\n"); printf("\tcarry=val&1; val >>= 1;\n"); printf("\t}\n"); printf("\tCFLG = regs.x = carry!=0;\n}\n"); printf("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n"); genastore("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data"); break; case i_LSL: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode(table68k[opcode].dmode, "dstreg", 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 = 0;\n"); printf("\tcnt &= 63;\n"); printf("\tif (!cnt) { CFLG = 0; } else {"); printf("\tfor(;cnt;--cnt){\n"); printf("\tcarry=val&cmask; val <<= 1;\n"); printf("\t}\n"); printf("\tCFLG = regs.x = carry!=0;\n}\n"); printf("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n"); genastore("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data"); break; case i_ROL: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode(table68k[opcode].dmode, "dstreg", 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 = 0;\n"); printf("\tcnt &= 63;\n"); printf("\tif (!cnt) { CFLG = 0; } else {"); printf("\tfor(;cnt;--cnt){\n"); printf("\tcarry=val&cmask; val <<= 1;\n"); printf("\tif(carry) val |= 1;\n"); printf("\t}\n"); printf("\tCFLG = carry!=0;\n}\n"); printf("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n"); genastore("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data"); break; case i_ROR: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode(table68k[opcode].dmode, "dstreg", 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 = 0;\n"); printf("\tcnt &= 63;\n"); printf("\tif (!cnt) { CFLG = 0; } else {"); printf("\tfor(;cnt;--cnt){\n"); printf("\tcarry=val&1; val = (ULONG)val >> 1;\n"); printf("\tif(carry) val |= cmask;\n"); printf("\t}\n"); printf("\tCFLG = carry!=0;\n}\n"); printf("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n"); genastore("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data"); break; case i_ROXL: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode(table68k[opcode].dmode, "dstreg", 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 = 0;\n"); printf("\tcnt &= 63;\n"); printf("\tfor(;cnt;--cnt){\n"); printf("\tcarry=val&cmask; val <<= 1;\n"); printf("\tif(regs.x) val |= 1;\n"); printf("\tregs.x = carry != 0;\n"); printf("\t}\n"); printf("\tCFLG = regs.x;\n"); printf("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n"); genastore("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data"); break; case i_ROXR: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0); genamode(table68k[opcode].dmode, "dstreg", 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 = 0;\n"); printf("\tcnt &= 63;\n"); printf("\tfor(;cnt;--cnt){\n"); printf("\tcarry=val&1; val >>= 1;\n"); printf("\tif(regs.x) val |= cmask;\n"); printf("\tregs.x = carry != 0;\n"); printf("\t}\n"); printf("\tCFLG = regs.x;\n"); printf("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n"); genastore("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data"); break; case i_ASRW: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); printf("\tVFLG = 0;\n"); 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("\tULONG sign = cmask & val;\n"); printf("\tCFLG=regs.x=val&1; val = (val >> 1) | sign;\n"); printf("\tNFLG = sign != 0;\n"); printf("\tZFLG = val == 0;\n"); genastore("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data"); break; case i_ASLW: genamode(table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0); printf("\tVFLG = 0;\n"); 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("\tULONG sign = cmask & val;\n"); printf("\tCFLG=regs.x=(val&cmask)!=0; val <<= 1;\n"); printf("\tif ((val&cmask)!=sign) VFLG=1;\n"); printf("\tNFLG = (val&cmask) != 0;\n"); printf("\tZFLG = val == 0;\n"); genastore("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data"); break; case i_LSRW: 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"); printf("\tcarry=val&1; val >>= 1;\n"); genflags(flag_logical, table68k[opcode].size, "val", "", "");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -