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

📄 gencpu.c

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