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

📄 readcpu.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
📖 第 1 页 / 共 2 页
字号:
		 || srcmode == Apdi))	    {		srcgather = 1; srcpos = bitpos[bitD];	    }	    if (opcstr[pos] == '[') {		pos++;		if (opcstr[pos] == '!') {		    /* exclusion */		    do {			pos++;			if (mode_from_str(opcstr+pos) == srcmode)			    goto nomatch;			pos += 4;		    } while (opcstr[pos] == ',');		    pos++;		} else {		    if (opcstr[pos+4] == '-') {			/* replacement */			if (mode_from_str(opcstr+pos) == srcmode)			    srcmode = mode_from_str(opcstr+pos+5);			else			    goto nomatch;			pos += 10;		    } else {			/* normal */			while(mode_from_str(opcstr+pos) != srcmode) {			    pos += 4;			    if (opcstr[pos] == ']')				goto nomatch;			    pos++;			}			while(opcstr[pos] != ']') pos++;			pos++;			break;		    }		}	    }	    /* Some addressing modes are invalid as destination */	    if (srcmode == imm || srcmode == PC16 || srcmode == PC8r)		goto nomatch;	    break;	 case 's':	    srcreg = bitval[bitS];	    srcmode = mode_from_mr(bitval[bits],bitval[bitS]);	    if (srcmode == am_illg) continue;	    if (CPU_EMU_SIZE < 2 &&		(srcmode == Areg || srcmode == Dreg || srcmode == Aind		 || srcmode == Ad16 || srcmode == Ad8r || srcmode == Aipi		 || srcmode == Apdi))	    {		srcgather = 1; srcpos = bitpos[bitS];	    }	    if (opcstr[pos] == '[') {		pos++;		if (opcstr[pos] == '!') {		    /* exclusion */		    do {			pos++;			if (mode_from_str(opcstr+pos) == srcmode)			    goto nomatch;			pos += 4;		    } while (opcstr[pos] == ',');		    pos++;		} else {		    if (opcstr[pos+4] == '-') {			/* replacement */			if (mode_from_str(opcstr+pos) == srcmode)			    srcmode = mode_from_str(opcstr+pos+5);			else			    goto nomatch;			pos += 10;		    } else {			/* normal */			while(mode_from_str(opcstr+pos) != srcmode) {			    pos += 4;			    if (opcstr[pos] == ']')				goto nomatch;			    pos++;			}			while(opcstr[pos] != ']') pos++;			pos++;		    }		}	    }	    break;	 default: u020_abort();	}	/* safety check - might have changed */	if (srcmode != Areg && srcmode != Dreg && srcmode != Aind	    && srcmode != Ad16 && srcmode != Ad8r && srcmode != Aipi	    && srcmode != Apdi && srcmode != immi)	{	    srcgather = 0;	}	if (srcmode == Areg && sz == sz_byte)	    goto nomatch;	if (opcstr[pos] != ',')	    goto endofline;	pos++;	/* parse the destination address */	usedst = 1;	switch(opcstr[pos++]) {	 case 'D':	    destmode = Dreg;	    switch (opcstr[pos++]) {	     case 'r': destreg = bitval[bitr]; dstgather = 1; dstpos = bitpos[bitr]; break;	     case 'R': destreg = bitval[bitR]; dstgather = 1; dstpos = bitpos[bitR]; break;	     default: u020_abort();	    }	    break;	 case 'A':	    destmode = Areg;	    switch (opcstr[pos++]) {	     case 'r': destreg = bitval[bitr]; dstgather = 1; dstpos = bitpos[bitr]; break;	     case 'R': destreg = bitval[bitR]; dstgather = 1; dstpos = bitpos[bitR]; break;	     default: u020_abort();	    }	    switch (opcstr[pos]) {	     case 'p': destmode = Apdi; pos++; break;	     case 'P': destmode = Aipi; pos++; break;	    }	    break;	 case '#':	    switch(opcstr[pos++]) {	     case 'z': destmode = imm; break;	     case '0': destmode = imm0; break;	     case '1': destmode = imm1; break;	     case '2': destmode = imm2; break;	     case 'i': destmode = immi; destreg = (uae_s32)(uae_s8)bitval[biti]; break;	     case 'j': destmode = immi; destreg = bitval[bitj]; break;	     case 'J': destmode = immi; destreg = bitval[bitJ]; break;	     case 'k': destmode = immi; destreg = bitval[bitk]; break;	     case 'K': destmode = immi; destreg = bitval[bitK]; break;	     default: u020_abort();	    }	    break;	 case 'd':	    destreg = bitval[bitD];	    destmode = mode_from_mr(bitval[bitd],bitval[bitD]);	    if(destmode == am_illg) continue;	    if (CPU_EMU_SIZE < 1 &&		(destmode == Areg || destmode == Dreg || destmode == Aind		 || destmode == Ad16 || destmode == Ad8r || destmode == Aipi		 || destmode == Apdi))	    {		dstgather = 1; dstpos = bitpos[bitD];	    }	    if (opcstr[pos] == '[') {		pos++;		if (opcstr[pos] == '!') {		    /* exclusion */		    do {			pos++;			if (mode_from_str(opcstr+pos) == destmode)			    goto nomatch;			pos += 4;		    } while (opcstr[pos] == ',');		    pos++;		} else {		    if (opcstr[pos+4] == '-') {			/* replacement */			if (mode_from_str(opcstr+pos) == destmode)			    destmode = mode_from_str(opcstr+pos+5);			else			    goto nomatch;			pos += 10;		    } else {			/* normal */			while(mode_from_str(opcstr+pos) != destmode) {			    pos += 4;			    if (opcstr[pos] == ']')				goto nomatch;			    pos++;			}			while(opcstr[pos] != ']') pos++;			pos++;			break;		    }		}	    }	    /* Some addressing modes are invalid as destination */	    if (destmode == imm || destmode == PC16 || destmode == PC8r)		goto nomatch;	    break;	 case 's':	    destreg = bitval[bitS];	    destmode = mode_from_mr(bitval[bits],bitval[bitS]);	    if (destmode == am_illg) continue;	    if (CPU_EMU_SIZE < 1 &&		(destmode == Areg || destmode == Dreg || destmode == Aind		 || destmode == Ad16 || destmode == Ad8r || destmode == Aipi		 || destmode == Apdi))	    {		dstgather = 1; dstpos = bitpos[bitS];	    }	    if (opcstr[pos] == '[') {		pos++;		if (opcstr[pos] == '!') {		    /* exclusion */		    do {			pos++;			if (mode_from_str(opcstr+pos) == destmode)			    goto nomatch;			pos += 4;		    } while (opcstr[pos] == ',');		    pos++;		} else {		    if (opcstr[pos+4] == '-') {			/* replacement */			if (mode_from_str(opcstr+pos) == destmode)			    destmode = mode_from_str(opcstr+pos+5);			else			    goto nomatch;			pos += 10;		    } else {			/* normal */			while(mode_from_str(opcstr+pos) != destmode) {			    pos += 4;			    if (opcstr[pos] == ']')				goto nomatch;			    pos++;			}			while(opcstr[pos] != ']') pos++;			pos++;		    }		}	    }	    break;	 default: u020_abort();	}	/* safety check - might have changed */	if (destmode != Areg && destmode != Dreg && destmode != Aind	    && destmode != Ad16 && destmode != Ad8r && destmode != Aipi	    && destmode != Apdi)	{	    dstgather = 0;	}	if (destmode == Areg && sz == sz_byte)	    goto nomatch;#if 0	if (sz == sz_byte && (destmode == Aipi || destmode == Apdi)) {	    dstgather = 0;	}#endif	endofline:	/* now, we have a match */#if 0	if (table68k[opc].mnemo != i_ILLG)	    fprintf(stderr, "Double match: %x: %s\n", opc, opcstr);#endif	if (find == -1) {	    for(find = 0;; find++) {		if (strcmp(mnemonic, lookuptab[find].name) == 0) {		    table68k[opc].mnemo = lookuptab[find].mnemo;		    break;		}		if (strlen(lookuptab[find].name) == 0) u020_abort();	    }	}	else {	    table68k[opc].mnemo = lookuptab[find].mnemo;	}	table68k[opc].cc = bitval[bitc];	if (table68k[opc].mnemo == i_BTST	    || table68k[opc].mnemo == i_BSET	    || table68k[opc].mnemo == i_BCLR	    || table68k[opc].mnemo == i_BCHG)	{	    sz = destmode == Dreg ? sz_long : sz_byte;	}	table68k[opc].size = sz;	table68k[opc].sreg = srcreg;	table68k[opc].dreg = destreg;	table68k[opc].smode = srcmode;	table68k[opc].dmode = destmode;	table68k[opc].spos = srcgather ? srcpos : -1;	table68k[opc].dpos = dstgather ? dstpos : -1;	table68k[opc].suse = usesrc;	table68k[opc].duse = usedst;	table68k[opc].stype = srctype;	table68k[opc].plev = id.plevel;#if 0	for (i = 0; i < 5; i++) {	    table68k[opc].flaginfo[i].flagset = id.flaginfo[i].flagset;	    table68k[opc].flaginfo[i].flaguse = id.flaginfo[i].flaguse;	}#endif	table68k[opc].flagdead = flagdead;	table68k[opc].flaglive = flaglive;	nomatch:	/* FOO! */;    }}void read_table68k(void){    int i;    for(i = 0; i < 65536; i++) {	table68k[i].mnemo = i_ILLG;	table68k[i].handler = -1;    }    for (i = 0; i < n_defs68k; i++) {	build_insn (i);    }}static int mismatch;static void handle_merges(long int opcode){    uae_u16 smsk;    uae_u16 dmsk;    int sbitdst, dstend;    int srcreg, dstreg;    if (table68k[opcode].spos == -1) {	sbitdst = 1; smsk = 0;    } else {	switch (table68k[opcode].stype) {	 case 0:	    smsk = 7; sbitdst = 8; break;	 case 1:	    smsk = 255; sbitdst = 256; break;	 case 2:	    smsk = 15; sbitdst = 16; break;	 case 3:	    smsk = 7; sbitdst = 8; break;	 case 4:	    smsk = 7; sbitdst = 8; break;	 case 5:	    smsk = 63; sbitdst = 64; break;	 default:	    smsk = 0; sbitdst = 0;	    u020_abort();	    break;	}	smsk <<= table68k[opcode].spos;    }    if (table68k[opcode].dpos == -1) {	dstend = 1; dmsk = 0;    } else {	dmsk = 7 << table68k[opcode].dpos;	dstend = 8;    }    for (srcreg=0; srcreg < sbitdst; srcreg++) {	for (dstreg=0; dstreg < dstend; dstreg++) {	    uae_u16 code = opcode;	    code = (code & ~smsk) | (srcreg << table68k[opcode].spos);	    code = (code & ~dmsk) | (dstreg << table68k[opcode].dpos);	    /* Check whether this is in fact the same instruction.	     * The instructions should never differ, except for the	     * Bcc.(BW) case. */	    if (table68k[code].mnemo != table68k[opcode].mnemo		|| table68k[code].size != table68k[opcode].size		|| table68k[code].suse != table68k[opcode].suse		|| table68k[code].duse != table68k[opcode].duse)	    {		mismatch++; continue;	    }	    if (table68k[opcode].suse		&& (table68k[opcode].spos != table68k[code].spos		    || table68k[opcode].smode != table68k[code].smode		    || table68k[opcode].stype != table68k[code].stype))	    {		mismatch++; continue;	    }	    if (table68k[opcode].duse		&& (table68k[opcode].dpos != table68k[code].dpos		    || table68k[opcode].dmode != table68k[code].dmode))	    {		mismatch++; continue;	    }	    if (code != opcode)		table68k[code].handler = opcode;	}    }}void do_merges (){    long int opcode;    int nr = 0;    mismatch = 0;    for (opcode = 0; opcode < 65536; opcode++) {	if (table68k[opcode].handler != -1 || table68k[opcode].mnemo == i_ILLG)	    continue;	nr++;	handle_merges (opcode);    }    nr_cpuop_funcs = nr;}int get_no_mismatches (){    return mismatch;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -