📄 dsmlib.c
字号:
return (1); case 0x06: /* reg indirect w.index modes */ return (mode6And7Words (&extension [0])); case 0x07: /* memory indirect */ switch (reg) { /* With mode 7, sub-modes are determined by the register number */ case 0x0: /* abs.short */ case 0x2: /* PC + off */ return (1); case 0x3: /* PC + ind + off */ return (mode6And7Words (&extension [0])); case 0x1: /* abs.long */ return (2); case 0x4: /* imm. */ return (size); } } /* We never get here, but just for lint ... */ return (0); }/********************************************************************************* mode6And7Words - number of words of extension needed for modes 6 and 7*/LOCAL int mode6And7Words ( FAST USHORT extension [] ) { int count = 1; /* number of words in extension */ if ((extension [0] & 0x0100) == 0) /* (An) + (Xn) + d8 */ return (count); switch ((extension [0] & 0x30) >> 4) /* base displacement size */ { case 0: /* reserved or NULL displacement */ case 1: break; case 2: /* word displacement */ count += 1; break; case 3: /* long displacement */ count += 2; break; } if ((extension [0] & 0x40) == 0) /* index operand added */ { switch (extension [0] & 3) { case 0: /* reserved or NULL displacement */ case 1: break; case 2: /* word displacement */ count += 1; break; case 3: /* long displacement */ count += 2; break; } } return (count); }/********************************************************************************* prtArgs - Print the arguments for an instruction*/LOCAL void prtArgs ( USHORT binInst [], /* Pointer to the binary instruction */ FAST INST *iPtr, /* Pointer to the INST describing binInst */ int address, /* Address at which the instruction resides */ FUNCPTR prtAddress /* routine to print addresses. */ ) { int frstArg; int displacement; int sizeData; switch (iPtr->type) { case itBra: switch (binInst [0] & 0xff) { case 0: displacement = (short) binInst[1]; break; case 0xff: displacement = (((short) binInst [1] << 16) | binInst [2]); break; default: displacement = (char) (binInst [0] & 0xff); break; } (*prtAddress) (address + 2 + displacement); printf ("\n"); break; case itDivW: prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 7, &binInst [1], 2, prtAddress); printf (",D%x\n", (binInst [0] & 0x0e00) >> 9); break; case itChk: prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 7, &binInst [1], (binInst [0] & 0x80) ? 2 : 4, prtAddress); printf (",D%x\n", (binInst [0] & 0x0e00) >> 9); break; case itChk2: prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 7, &binInst [2], 0, prtAddress); printf ((binInst [1] & 0x8000) ? ",A%x\n" : ",D%x\n", (binInst [1] & 0x7000) >> 12); break; case itLea: prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, &binInst [1], 2, prtAddress); printf (",A%x\n", (binInst [0] & 0x0e00) >> 9); break; case itComplete: /* No arguments */ printf ("\n"); break; case itStatBit: case itCallm: printf ("#%#x,", binInst [1]); prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, &binInst [2], 0, prtAddress); printf ("\n"); break; case itDynBit: printf ("D%x,", (binInst [0] & 0x0e00) >> 9); prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, &binInst [1], 0, prtAddress); printf ("\n"); break; case itExg: switch ((binInst [0] & 0x00f8) >> 3) { case 0x08: printf ("D%x,D%x\n", (binInst [0] & 0x0e00) >> 9, binInst [0] & 0x0007); break; case 0x09: printf ("A%x,A%x\n", (binInst [0] & 0x0e00) >> 9, binInst [0] & 0x0007); break; case 0x11: printf ("D%x,A%x\n", (binInst [0] & 0x0e00) >> 9, binInst [0] & 0x0007); break; } break; case itImm: switch ((binInst [0] & 0x00c0) >> 6) /* size */ { case 0: /* byte */ printf ("#%#x,", binInst [1] & 0x00ff); prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, &binInst [2], 0, prtAddress); break; case 1: /* word */ printf ("#%#x,", binInst [1]); prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, &binInst [2], 0, prtAddress); break; case 2: /* long */ printf ("#%#x%04x,", binInst [1], binInst [2]); prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, &binInst [3], 0, prtAddress); break; } printf ("\n"); break; case itMoveB: prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, &binInst [1], 1, prtAddress); printf (","); frstArg = modeNwords ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, 1, &binInst [1]); prEffAddr ((binInst [0] & 0x01c0) >> 6, (binInst [0] & 0x0e00) >> 9, &binInst [1 + frstArg], 1, prtAddress); printf ("\n"); break; case itMoveW: prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, &binInst [1], 2, prtAddress); printf (","); frstArg = modeNwords ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, 1, &binInst [1]); prEffAddr ((binInst [0] & 0x01c0) >> 6, (binInst [0] & 0x0e00) >> 9, &binInst [1 + frstArg], 2, prtAddress); printf ("\n"); break; case itMoveL: prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, &binInst [1], 4, prtAddress); printf (","); frstArg = modeNwords ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, 2, &binInst [1]); prEffAddr ((binInst [0] & 0x01c0) >> 6, (binInst [0] & 0x0e00) >> 9, &binInst [1 + frstArg], 4, prtAddress); printf ("\n"); break; case itImmCCR: printf ("#%#x,CCR\n", binInst [1] & 0xff); break; case itImmTSR: printf ("#%#x,SR\n", binInst [1]); break; case itMoveCCR: prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, &binInst [1], 2, prtAddress); printf (",CCR\n"); break; case itMoveTSR: prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, &binInst [1], 2, prtAddress); printf (",SR\n"); break; case itMoveFSR: printf ("SR,"); prEffAddr ((binInst [0] & 0x38) >> 3, binInst [0] & 0x7, &binInst [1], 0, prtAddress); printf ("\n"); break; case itMoveUSP: printf (((binInst [0] & 0x8) == 0) ? "A%x,USP\n" : "USP,A%x\n", binInst [0] & 0x07); break;#if ((CPU==MC68040) || (CPU==MC68060) || (CPU==MC68LC040)) case itMove16: printf ("(A%x)+,(A%x)+\n", binInst [0] &0x07, (binInst [1] & 0x7000) >> 12); break; case itMove16L: switch ((binInst [0] & 0x0018) >> 3) /* op-mode */ { case 0: printf ("(A%x)+,0x%x%x", binInst[0] & 0x07, binInst[1], binInst[2]); break; case 1: printf ("0x%x%x,(A%x)-", binInst[1], binInst[2], binInst[0] & 0x07); break; case 2: printf ("(A%x),0x%x%x", binInst[0] & 0x07, binInst[1], binInst[2]); break; case 3: printf ("0x%x%x,(A%x)", binInst[1], binInst[2], binInst[0] & 0x07); break; } printf ("\n"); break; case itCinv: case itCpush: switch ((binInst [0] & 0x00c0) >>6) { case 1: printf ("DC,(A%x)", binInst [0] & 0x07); break; case 2: printf ("IC,(A%x)", binInst [0] & 0x07); break; case 3: printf ("BC,(A%x)", binInst [0] & 0x07); break; } printf ("\n"); break; case itCinva: case itCpusha: switch ((binInst [0] & 0x00c0) >>6) { case 1: printf ("DC"); break; case 2: printf ("IC"); break; case 3: printf ("BC"); break; } printf ("\n"); break; case itPtest: printf ("(A%x)\n", binInst [0] & 0x07); break; case itPflush: switch ((binInst [0] & 0x0018) >> 3) { case 0: printf ("(A%x)", binInst [0] & 0x07); break; case 1: printf ("(A%x)", binInst [0] & 0x07); break; case 2: case 3: break; } printf ("\n"); break;#endif /* ((CPU==MC68040) || (CPU==MC68060) || (CPU==MC68LC040)) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -