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

📄 gencpu.c

📁 树大根深三棱尽所标杆ssfsfsa fdsafs
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -