+ if (eor) EaWrite(11, 1,ea,size,0x003f,1);\r
+\r
+ OpEnd(ea);\r
+ return 0;\r
+}\r
+\r
+// Emit a Cmpm opcode, 1011ddd1 xx001sss (rrr=Adst, xx=size extension, sss=Asrc)\r
+int OpCmpm(int op)\r
+{\r
+ int size=0,sea=0,dea=0,use=0;\r
+ const char *asl="";\r
+\r
+ // get size, get EAs\r
+ size=(op>>6)&3; if (size>=3) return 1;\r
+ sea=(op&7)|0x18;\r
+ dea=(op>>9)&0x3f;\r
+\r
+ use=op&~0x0e07; // Use 1 handler for all registers..\r
+ if (size==0&&sea==0x1f) use|=0x0007; // ..except (a7)+\r
+ if (size==0&&dea==0x1f) use|=0x0e00;\r
+ if (op!=use) { OpUse(op,use); return 0; } // Use existing handler\r
+\r
+ OpStart(op,sea); Cycles=4;\r
+\r
+ ot(";@ Get src operand into r11:\n");\r
+ EaCalc (0,0x0007, sea,size,1);\r
+ EaRead (0, 11, sea,size,0x0007,1);\r
+\r
+ ot(";@ Get dst operand into r0:\n");\r
+ EaCalcReadNoSE(-1,0,dea,size,0x0e00);\r
+\r
+ if (size<2) asl=(char *)(size?",asl #16":",asl #24");\r
+\r
+ ot(" rsbs r0,r11,r0%s\n",asl);\r
+ OpGetFlags(1,0); // Cmp like subtract\r
+ ot("\n");\r
+\r
+ OpEnd(sea);\r
+ return 0;\r
+}\r
+\r
+\r
+// Emit a Chk opcode, 0100ddd1 x0eeeeee (rrr=Dn, x=size extension, eeeeee=ea)\r
+int OpChk(int op)\r
+{\r
+ int rea=0;\r
+ int size=0,ea=0,use=0;\r
+\r
+ // Get EA and register EA\r
+ rea=(op>>9)&7;\r
+ if((op>>7)&1)\r
+ size=1; // word operation\r
+ else size=2; // long\r
+ ea=op&0x3f;\r
+\r
+ if (EaAn(ea)) return 1; // not a valid mode\r
+ if (size!=1) return 1; // 000 variant only supports word\r
+\r
+ // See if we can do this opcode:\r
+ if (EaCanRead(ea,size)==0) return 1;\r
+\r
+ use=OpBase(op,size);\r
+ use&=~0x0e00; // Use 1 handler for register d0-7\r
+ if (op!=use) { OpUse(op,use); return 0; } // Use existing handler\r
+\r
+ OpStart(op,ea); Cycles=10;\r
+\r
+ ot(";@ Get value into r0:\n");\r
+ EaCalcReadNoSE(-1,0,ea,size,0x003f);\r
+\r
+ ot(";@ Get register operand into r1:\n");\r
+ EaCalcReadNoSE(-1,1,rea,size,0x0e00);\r
+\r
+ if (size<2) ot(" mov r0,r0,asl #%d\n",size?16:24);\r
+ if (size<2) ot(" mov r1,r1,asl #%d\n\n",size?16:24);\r
+\r
+ ot(";@ get flags, including undocumented ones\n");\r
+ ot(" and r3,r10,#0x80000000\n");\r
+ ot(" adds r1,r1,#0 ;@ Defines NZ, clears CV\n");\r
+ OpGetFlags(0,0);\r
+\r
+ ot(";@ is reg negative?\n");\r
+ ot(" bmi chktrap%.4x\n",op);\r
+\r
+ ot(";@ Do arithmetic:\n");\r
+ ot(" bic r10,r10,#0x80000000 ;@ N\n");\r
+ ot(" cmp r1,r0\n");\r
+ ot(" bgt chktrap%.4x\n",op);\r
+\r
+ ot(";@ old N remains\n");\r
+ ot(" orr r10,r10,r3\n");\r
+ OpEnd(ea);\r