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

📄 gencpu.c

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