📄 dis_68k.c
字号:
strcat(mneu,"-"); } strcat(mneu,conv_temp);} /* bcc_bsr_bra() */voidmoveq(){ /* if (BIT8(cur2bytes)) confused(); */ strcpy(mneu,"movq.l &"); if (BIT7(cur2bytes)) strcat(mneu,"-"); convert(BIT7(cur2bytes) ? -(short) (LOW8(cur2bytes) | 0xff00) : LOW8(cur2bytes), conv_temp,LEAD); strcat(mneu,conv_temp); sprintf(conv_temp,",%%d%d",BITS11_9(cur2bytes)); strcat(mneu,conv_temp);} /* moveq() */voidor_div_sbcd(){ if (BITS7_6(cur2bytes) == 3) { /* divide */ strcat(mneu,"div_.w "); if (BIT8(cur2bytes)) mneu[3] = 's'; else mneu[3] = 'u'; sprintf(mneu,"%s%s,%%d%d",mneu, eff_add(BITS5_3(cur2bytes),BITS2_0(cur2bytes),WORD, BIT8(cur2bytes) ? SIGNED : UNSIGNED), BITS11_9(curinstr)); } else if (BITS8_6(cur2bytes) == 4 && BITS5_4(cur2bytes) == 0) { /* sbcd */ if (BIT3(cur2bytes)) sprintf(mneu,"sbcd.b -(%s),-(%s)", addregs[BITS2_0(cur2bytes)], addregs[BITS11_9(cur2bytes)]); else sprintf(mneu,"sbcd.b %%d%d,%%d%d", BITS2_0(cur2bytes),BITS11_9(cur2bytes)); } else { /* or */ unsigned short inst = cur2bytes; /* remember inst. */ char operand[32]; strcat(mneu,"or._ "); mneu[3] = size[BITS7_6(inst)]; operand[0] = '\0'; strcat(operand, eff_add(BITS5_3(inst),BITS2_0(inst), BITS7_6(inst)+1,UNSIGNED)); if (!BIT8(inst)) sprintf(mneu, "%s%s,",mneu,operand); sprintf(mneu,"%s%%d%d",mneu,BITS11_9(inst)); if (BIT8(inst)) sprintf(mneu, "%s,%s",mneu,operand); }}voidsub_subx(){ if (BITS7_6(cur2bytes) == 3) { /* suba */ strcat(mneu,"suba._ "); mneu[5] = BIT8(cur2bytes) ? 'l' : 'w'; sprintf(mneu,"%s%s,%s",mneu, eff_add(BITS5_3(cur2bytes),BITS2_0(cur2bytes), BIT8(cur2bytes) ? LONG : WORD,NOTSIGNED), addregs[BITS11_9(curinstr)]); } else if (BIT8(cur2bytes) && !BITS5_4(cur2bytes)) { /* subx */ strcat(mneu,"subx._ "); mneu[5] = size[BITS7_6(cur2bytes)]; if (BIT3(cur2bytes)) sprintf (mneu,"%s-(%s),-(%s)",mneu, addregs[BITS2_0(cur2bytes)], addregs[BITS11_9(cur2bytes)]); else sprintf(mneu,"%s%%d%d,%%d%d",mneu,BITS2_0(cur2bytes), BITS11_9(cur2bytes)); } else { /* sub */ strcat(mneu,"sub._ "); mneu[4] = size[BITS7_6(cur2bytes)]; if (BIT8(cur2bytes)) sprintf(mneu,"%s%%d%d,%s",mneu,BITS11_9(curinstr), eff_add(BITS5_3(cur2bytes),BITS2_0(cur2bytes), NULL,NULL)); else sprintf(mneu,"%s%s,%%d%d",mneu, eff_add(BITS5_3(cur2bytes),BITS2_0(cur2bytes), BITS7_6(cur2bytes) + 1,UNSIGNED), BITS11_9(curinstr)); }}voidcmp_eor(){ if (BITS7_6(cur2bytes) == 3) { /* cmpa */ strcat(mneu,"cmpa._ "); mneu[5] = BIT8(cur2bytes) ? 'l' : 'w'; sprintf(mneu,"%s%s,%s",mneu,addregs[BITS11_9(curinstr)], eff_add(BITS5_3(cur2bytes),BITS2_0(cur2bytes), BIT8(cur2bytes) ? LONG : WORD,NOTSIGNED)); } else if (BIT8(cur2bytes) && (BITS5_3(cur2bytes) == 1)) { /* cmpm */ strcat(mneu,"cmpm._ "); mneu[5] = size[BITS7_6(cur2bytes)]; sprintf(mneu,"%s(%s)+,(%s)+",mneu, addregs[BITS11_9(cur2bytes)], addregs[BITS2_0(cur2bytes)]); } else { /* cmp or eor */ if (BIT8(cur2bytes)) strcat(mneu,"eor._ "); else strcat(mneu,"cmp._ "); mneu[4] = size[BITS7_6(cur2bytes)]; sprintf(mneu,"%s%%d%d,%s",mneu,BITS11_9(curinstr), eff_add(BITS5_3(cur2bytes),BITS2_0(cur2bytes), BITS7_6(cur2bytes) +1,BIT8(cur2bytes) ? UNSIGNED : SIGNED)); }}voidand_mul_abcd_exg(){ if(BITS7_6(cur2bytes) == 3) { /* mul */ if (BIT8(cur2bytes)) strcat(mneu,"muls.w "); else strcat(mneu,"mulu.w "); sprintf(mneu,"%s%s,%%d%d",mneu,eff_add(BITS5_3(cur2bytes), BITS2_0(cur2bytes),WORD, BIT8(cur2bytes) ? SIGNED : UNSIGNED), BITS11_9(curinstr)); } else if(BIT8(cur2bytes) && !BITS5_4(cur2bytes)) { /* abcd or exg */ if (BITS8_6(cur2bytes) == 4) { /* abcd */ strcat(mneu,"abcd.b "); if (BIT3(cur2bytes)) sprintf(mneu,"%s-(%s),-(%s)",mneu, addregs[BITS2_0(cur2bytes)], addregs[BITS11_9(cur2bytes)]); else sprintf(mneu,"%s%%d%d,%%d%d",mneu, BITS2_0(cur2bytes),BITS11_9(cur2bytes)); } else if (BITS8_3(cur2bytes) == 050) sprintf(mneu,"exgd %%d%d,%%d%d",BITS11_9(cur2bytes), BITS2_0(cur2bytes)); else if (BITS8_3(cur2bytes) == 051) sprintf(mneu,"exga %s,%s", addregs[BITS11_9(cur2bytes)], addregs[BITS2_0(cur2bytes)]); else if (BITS8_3(cur2bytes) == 061) sprintf(mneu,"exgm %%d%d,%s",BITS11_9(cur2bytes), addregs[BITS2_0(cur2bytes)]); else confused(); } else { /* and */ strcat(mneu,"and._ "); mneu[4] = size[BITS7_6(cur2bytes)]; if (BIT8(cur2bytes)) sprintf(mneu,"%s%%d%d,%s",mneu,BITS11_9(curinstr), eff_add(BITS5_3(cur2bytes),BITS2_0(cur2bytes), NULL,NULL)); else sprintf(mneu,"%s%s,%%d%d",mneu, eff_add(BITS5_3(cur2bytes),BITS2_0(cur2bytes), BITS7_6(cur2bytes) + 1,UNSIGNED), BITS11_9(curinstr)); }}voidadd_addx(){ if (BITS7_6(cur2bytes) == 3) { /* adda */ strcat(mneu,"adda._ "); mneu[5] = BIT8(cur2bytes) ? 'l' : 'w'; sprintf(mneu,"%s%s,%s",mneu, eff_add(BITS5_3(cur2bytes),BITS2_0(cur2bytes), BIT8(cur2bytes) ? LONG : WORD,UNSIGNED), addregs[BITS11_9(curinstr)]); } else if (BIT8(cur2bytes) && !BITS5_4(cur2bytes)) { /* addx */ strcat(mneu,"addx._ "); mneu[5] = size[BITS7_6(cur2bytes)]; if (BIT3(cur2bytes)) sprintf (mneu,"%s-(%s),-(%s)",mneu, addregs[BITS2_0(cur2bytes)], addregs[BITS11_9(cur2bytes)]); else sprintf(mneu,"%s%%d%d,%%d%d",mneu,BITS2_0(cur2bytes), BITS11_9(cur2bytes)); } else { /* add */ strcat(mneu,"add._ "); mneu[4] = size[BITS7_6(cur2bytes)]; if (BIT8(cur2bytes)) sprintf(mneu,"%s%%d%d,%s",mneu,BITS11_9(curinstr), eff_add(BITS5_3(cur2bytes),BITS2_0(cur2bytes), NULL,NULL)); else sprintf(mneu,"%s%s,%%d%d",mneu, eff_add(BITS5_3(cur2bytes),BITS2_0(cur2bytes), BITS7_6(cur2bytes) + 1,UNSIGNED), BITS11_9(curinstr)); }}voidshft_rot(){ char direction; /* l -- left, r -- right */ direction = BIT8(cur2bytes) ? 'l' : 'r'; if (BITS7_6(cur2bytes) == 3) /* Memory rotate. */ { if (BIT11(cur2bytes) != 0) confused(); switch (BITS10_9(cur2bytes)) { case 0: strcat(mneu,"as_.w &1,"); mneu[2] = direction; break; case 1: strcat(mneu,"ls_.w &1,"); mneu[2] = direction; break; case 2: strcat(mneu,"rox_.w &1,"); mneu[3] = direction; break; case 3: strcat(mneu,"ro_.w &1,"); mneu[2] = direction; break; } strcat(mneu,eff_add(BITS5_3(cur2bytes),BITS2_0(cur2bytes), NULL,NULL)); } else /* Register rotate. */ { switch (BITS4_3(cur2bytes)) { case 0: strcat(mneu,"as_._ "); mneu[2] = direction; mneu[4] = size[BITS7_6(cur2bytes)]; break; case 1: strcat(mneu,"ls_._ "); mneu[2] = direction; mneu[4] = size[BITS7_6(cur2bytes)]; break; case 2: strcat(mneu,"rox_._ "); mneu[3] = direction; mneu[5] = size[BITS7_6(cur2bytes)]; break; case 3: strcat(mneu,"ro_._ "); mneu[2] = direction; mneu[4] = size[BITS7_6(cur2bytes)]; break; } if (BIT5(cur2bytes)) { sprintf(conv_temp,"%%d%d,%%d%d", BITS11_9(cur2bytes),BITS2_0(cur2bytes)); strcat(mneu,conv_temp); } else { strcat(mneu,"&"); convert(BITS11_9(cur2bytes) ? BITS11_9(cur2bytes) : 8, conv_temp, LEAD); sprintf(conv_temp,"%s,%%d%d", conv_temp, BITS2_0(cur2bytes)); strcat(mneu,conv_temp); } }} /* shft_rot() */voidunassigned(){ printf("\tUunassigned op code around 0x%lx\n",loc); monrestart(MISC);}char *eff_add(mode,reg,Size,sign)int mode,reg,Size; /* size will be NULL, BYTE, WORD, or LONG */short sign;{ unsigned long fourbytes; static char address_fld[32]; address_fld[0] = '\0'; switch(mode) { case 0: /* data register direct */ sprintf(address_fld, "%%d%d", reg); break; case 1: /* address register direct */ sprintf(address_fld, "%s", addregs[reg]); break; case 2: /* address register indirect */ sprintf(address_fld, "(%s)", addregs[reg]); break; case 3: /* address register indirect with post incr */ sprintf(address_fld, "(%s)+", addregs[reg]); break; case 4: /* address register indirect with pre decr */ sprintf(address_fld, "-(%s)", addregs[reg]); break; case 5: /* address register indirect with displ */ get2bytes(); if (BIT15(cur2bytes)) strcat(address_fld, "-"); convert(BIT15(cur2bytes) ? -(short) cur2bytes : cur2bytes, conv_temp,LEAD); sprintf(address_fld,"%s%s(%s)", address_fld, conv_temp, addregs[reg]); break; case 6: /* address register indirect with index */ get2bytes(); if (BITS10_8(cur2bytes)) confused(); if (BIT7(cur2bytes)) strcat(address_fld, "-"); convert(BIT7(cur2bytes) ? -(short) (LOW8(cur2bytes) | 0xff00) : LOW8(cur2bytes), conv_temp,LEAD); sprintf(address_fld,"%s%s(%s,%%%c%d.%c)", address_fld, conv_temp, addregs[reg], BIT15(cur2bytes) ? 'a' : 'd' , BITS14_12(cur2bytes), BIT11(cur2bytes) ? 'l' : 'w' ); break; case 7: /* absolute, pc, and immediate */ switch(reg) /* reg is not really a register here */ { case 0: /* absolute short */ get2bytes(); convert((short) cur2bytes,address_fld,LEAD); strcat(address_fld,".W"); break; case 1: /* absolute long */ get2bytes(); fourbytes = cur2bytes << 16; get2bytes(); fourbytes |= cur2bytes; convert(fourbytes,address_fld,LEAD); strcat(address_fld,".L"); break; case 2: /* pc with displ */ get2bytes(); if (BIT15(cur2bytes)) strcat(address_fld, "-"); convert(BIT15(cur2bytes) ? -(short) cur2bytes : cur2bytes, conv_temp, LEAD); sprintf(address_fld, "%s%s(%%pc)", address_fld, conv_temp); compoff((BIT15(cur2bytes) ? ((long) (short) cur2bytes) : (long) cur2bytes) -2, comp_temp); /* the -2 above is needed because loc has been updated when getting the displacement, but for Motorola the pc is the address of the extension word */ break; case 3: /* pc with index */ get2bytes(); if (BITS10_8(cur2bytes)) confused(); if (BIT7(cur2bytes)) strcat(address_fld, "-"); convert(BIT7(cur2bytes) ? -(short) (LOW8(cur2bytes) | 0xff00) : LOW8(cur2bytes), conv_temp,LEAD); sprintf(address_fld,"%s%s(%%pc,%%%c%d.%c)", address_fld, conv_temp, BIT15(cur2bytes) ? 'a' : 'd' , BITS14_12(cur2bytes), BIT11(cur2bytes) ? 'l' : 'w' ); compoff((BIT7(cur2bytes) ? ((long)(short) (LOW8(cur2bytes) | 0xff00)) : (long) LOW8(cur2bytes)) - 2, comp_temp); /* the -2 above is needed because loc has been updated when getting the index word, but for Motorola the pc is the address of this word */ sprintf(comp_temp,"%s+%%%c%d",comp_temp, BIT15(cur2bytes) ? 'a' : 'd' , BITS14_12(cur2bytes)); break; case 4: /* immediate */ switch(Size) { case NULL: confused(); break; case BYTE: get2bytes(); if (BITS15_8(cur2bytes)) confused(); strcat(address_fld, "&"); if ((sign == SIGNED) && BIT7(cur2bytes)) strcat(address_fld, "-"); convert(((sign == SIGNED) && BIT7(cur2bytes)) ? -(short) (LOW8(cur2bytes) | 0xff00) : LOW8(cur2bytes), conv_temp,LEAD); strcat(address_fld, conv_temp); break; case WORD: get2bytes(); strcat(address_fld, "&"); if ((sign == SIGNED) && BIT15(cur2bytes)) strcat(address_fld, "-"); convert(((sign == SIGNED) && BIT15(cur2bytes)) ? -(short) cur2bytes : cur2bytes , conv_temp,LEAD); strcat(address_fld, conv_temp); break; case LONG: get2bytes(); strcat(address_fld, "&"); fourbytes = cur2bytes << 16; get2bytes(); fourbytes |= cur2bytes; if ((sign == SIGNED) && HIOF32(fourbytes)) strcat(address_fld, "-"); convert(((sign == SIGNED) && HIOF32(fourbytes))? -(long) fourbytes : fourbytes, conv_temp, LEAD); strcat(address_fld, conv_temp); break; } /* end of size switch */ break; default: confused(); } /* end reg switch */ break; } /* end mode switch */ return(address_fld);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -