switch (rf = mp->m_type) {\r
\r
case S_DOUBLE:\r
+ case S_JSR:\r
t1 = addr(&e1, 0);\r
v1 = aindx & 7; // check fpreg here\r
comma(1);\r
/*\r
* Opcode Processing\r
*/\r
- outaw(op + ((t1 + v1) << 6) + t2 + v2);\r
+ if (rf == S_JSR && t1 != S_REG) {\r
+ aerr();\r
+ }\r
+ outaw(op | ((t1 | v1) << 6) | t2 | v2);\r
\r
/*\r
* Source Processing\r
break;\r
\r
case S_SINGLE:\r
+ case S_RTS:\r
t1 = addr(&e1, 0);\r
v1 = aindx & 7; // check fpreg here\r
\r
/*\r
* Opcode Processing\r
*/\r
- outaw(op + t1 + v1);\r
+ if (rf == S_RTS && t1 != S_REG) {\r
+ aerr();\r
+ }\r
+ outaw(op | t1 | v1);\r
\r
/*\r
* Source/Destination Processing\r
}\r
break;\r
\r
-#if 0\r
- case S_PSH:\r
- t1 = addr(&e1);\r
- v1 = aindx & 0x000F;\r
-\r
- /*\r
- * Special Constant Processing\r
- */\r
- if ((t1 == S_IMM) && is_abs(&e1)) {\r
- switch (e1.e_addr) {\r
- case (a_uint) 4: t1 = S_REG; op += 0x0020; v1 = 2; break;\r
- case (a_uint) 8: t1 = S_REG; op += 0x0030; v1 = 2; break;\r
- case (a_uint) 0: t1 = S_REG; op += 0x0000; v1 = 3; break;\r
- case (a_uint) 1: t1 = S_REG; op += 0x0010; v1 = 3; break;\r
- case (a_uint) 2: t1 = S_REG; op += 0x0020; v1 = 3; break;\r
- case (a_uint) ~0: t1 = S_REG; op += 0x0030; v1 = 3; break;\r
- default: break;\r
- }\r
- }\r
-\r
- /*\r
- * Opcode Processing\r
- */\r
- /* SRC */\r
- switch(t1) {\r
- case S_REG: op += 0x0000 + v1; break; /* Rn As=0 */\r
- case S_RIDX: op += 0x0010 + v1; break; /* X(Rn) As=1 */\r
- case S_SYM: op += 0x0010; break; /* addr As=1, Sreg=PC */\r
- case S_ABS: op += 0x0210; break; /* &Addr As=1, Sreg=SR */\r
- case S_RIN: op += 0x0020 + v1; break; /* @Rn As=2 */\r
- case S_RIN2: op += 0x0030 + v1; break; /* @Rn+ As=3 */\r
- case S_IMM: op += 0x0030; break; /* #N As=3, Sreg=PC */\r
- default: aerr(); break;\r
- }\r
-\r
- outaw(op);\r
- /*\r
- * Source Processing\r
- */\r
- switch(t1) {\r
- case S_REG: break; /* Rn As=0 */\r
- case S_RIDX: outrw(&e1, 0); break; /* X(Rn) As=1 */\r
- case S_SYM: if (mchpcr(&e1)) {\r
- e1.e_addr -= dot.s_addr;\r
- outaw(e1.e_addr);\r
- } else {\r
- outrw(&e1, R_PCR0);\r
- }\r
- break; /* addr As=1, Sreg=PC */\r
- case S_ABS: outrw(&e1, 0); break; /* &Addr As=1, Sreg=SR */\r
- case S_RIN: break; /* @Rn As=2 */\r
- case S_RIN2: break; /* @Rn+ As=3 */\r
- case S_IMM: outrw(&e1, 0); break; /* #N As=3, Sreg=PC */\r
- default: aerr(); break;\r
- }\r
- break;\r
-\r
- case S_DST:\r
- t1 = addr(&e1);\r
- v1 = (aindx & 0x000F);\r
-\r
- /*\r
- * Opcode Processing\r
- */\r
- /* DSTDST */\r
- switch(t1) {\r
- case S_REG: op += 0x0000 + v1; break; /* Rn Ad=0 */\r
- case S_RIDX: op += 0x0080 + v1; break; /* X(Rn) Ad=1 */\r
- case S_SYM: op += 0x0080; break; /* addr Ad=1, Sreg=PC */\r
- case S_IMM: /* #N ==>> &Addr */\r
- case S_ABS: op += 0x0082; break; /* &Addr Ad=1, Sreg=SR */\r
- case S_RIN: op += 0x0080 + v1; break; /* @Rn Ad=1 */\r
- case S_RIN2: op += 0x0080 + v1; break; /* @Rn+ Ad=1 */\r
- default: aerr(); break;\r
- }\r
-\r
- outaw(op);\r
- /*\r
- * Destination Processing\r
- */\r
- switch(t1) {\r
- case S_REG: break; /* Rn Ad=0 */\r
- case S_RIDX: outrw(&e1, 0); break; /* X(Rn) Ad=1 */\r
- case S_SYM: if (mchpcr(&e1)) {\r
- e1.e_addr -= dot.s_addr;\r
- outaw(e1.e_addr);\r
- } else {\r
- outrw(&e1, R_PCR0);\r
- }\r
- break; /* addr Ad=1, Sreg=PC */\r
- case S_IMM: aerr(); /* #N ==>> &Addr */\r
- case S_ABS: outrw(&e1, 0); break; /* &Addr Ad=1, Sreg=SR */\r
- case S_RIN: outaw(0); break; /* @Rn Ad=1 */\r
- case S_RIN2: outaw(0); /* @Rn+ Ad=1 */\r
- if ((op & 0x0040) && (v1 != 0)) {\r
- outaw(0x5310 + v1); /* add #1,Rn */\r
- } else {\r
- outaw(0x5320 + v1); ; /* add #2,Rn */\r
- }\r
- break;\r
- default: aerr(); break;\r
- }\r
- break;\r
-\r
- case S_RLX:\r
- t1 = addr(&e1);\r
- v1 = (aindx & 0x000F) << 8;\r
-\r
- /*\r
- * Duplicate Argument\r
- */\r
- e2.e_mode = e1.e_mode;\r
- e2.e_flag = e1.e_flag;\r
- e2.e_addr = e1.e_addr;\r
- e2.e_base.e_sp = e1.e_base.e_sp;\r
- e2.e_rlcf = e1.e_rlcf;\r
-\r
- t2 = t1;\r
- v2 = (aindx & 0x000F);\r
-\r
- /*\r
- * Opcode Processing\r
- */\r
- /* DOPSRC */\r
- switch(t1) {\r
- case S_REG: op += 0x0000 + v1; break; /* Rn As=0 */\r
- case S_RIDX: op += 0x0010 + v1; break; /* X(Rn) As=1 */\r
- case S_SYM: op += 0x0010; break; /* addr As=1, Sreg=PC */\r
- case S_IMM: /* #N ==>> &Addr */\r
- case S_ABS: op += 0x0210; break; /* &Addr As=1, Sreg=SR */\r
- case S_RIN: op += 0x0020 + v1; break; /* @Rn As=2 */\r
- case S_RIN2: op += 0x0030 + v1; break; /* @Rn+ As=3 */\r
- default: aerr(); break;\r
- }\r
-\r
- /* DOPDST */\r
- switch(t2) {\r
- case S_REG: op += 0x0000 + v2; break; /* Rn Ad=0 */\r
- case S_RIDX: op += 0x0080 + v2; break; /* X(Rn) Ad=1 */\r
- case S_SYM: op += 0x0080; break; /* addr Ad=1, Sreg=PC */\r
- case S_IMM: /* #N ==>> &Addr */\r
- case S_ABS: op += 0x0082; break; /* &Addr Ad=1, Sreg=SR */\r
- case S_RIN: op += 0x0080 + v2; break; /* @Rn Ad=1 */\r
- case S_RIN2: op += 0x0080 + v2; break; /* @Rn+ Ad=1 */\r
- default: aerr(); break;\r
- }\r
-\r
- outaw(op);\r
- /*\r
- * Source Processing\r
- */\r
- switch(t1) {\r
- case S_REG: break; /* Rn As=0 */\r
- case S_RIDX: outrw(&e1, 0); break; /* X(Rn) As=1 */\r
- case S_SYM: if (mchpcr(&e1)) {\r
- e1.e_addr -= dot.s_addr;\r
- outaw(e1.e_addr);\r
- } else {\r
- outrw(&e1, R_PCR0);\r
- }\r
- break; /* addr As=1, Sreg=PC */\r
- case S_IMM: /* #N ==>> &Addr */\r
- case S_ABS: outrw(&e1, 0); break; /* &Addr As=1, Sreg=SR */\r
- case S_RIN: break; /* @Rn As=2 */\r
- case S_RIN2: break; /* @Rn+ As=3 */\r
- default: aerr(); break;\r
- }\r
- /*\r
- * Destination Processing\r
- */\r
- switch(t2) {\r
- case S_REG: break; /* Rn Ad=0 */\r
- case S_RIDX: outrw(&e2, 0); break; /* X(Rn) Ad=1 */\r
- case S_SYM: if (mchpcr(&e2)) {\r
- e2.e_addr -= dot.s_addr;\r
- outaw(e2.e_addr);\r
- } else {\r
- outrw(&e2, R_PCR0);\r
- }\r
- break; /* addr Ad=1, Sreg=PC */\r
- case S_IMM: aerr(); /* #N ==>> &Addr */\r
- case S_ABS: outrw(&e2, 0); break; /* &Addr Ad=1, Sreg=SR */\r
- case S_RIN: outaw(0); break; /* @Rn Ad=1 */\r
- case S_RIN2: /* @Rn+ Ad=1 */\r
- if (rf == S_RLX) {\r
- if (op & 0x0040) {\r
- outaw(~0); /* RLX.b @Rn+,-1(Rn) */\r
- } else {\r
- outaw(~1); /* RLX.w @Rn+,-2(Rn) */\r
- }\r
- } else {\r
- outaw(0);\r
- if ((op & 0x0040) && (v2 != 0)) {\r
- outaw(0x5310 + v2); /* add #1,Rn */\r
- } else {\r
- outaw(0x5320 + v2); /* add #2,Rn */\r
- }\r
- }\r
- break;\r
- default: aerr(); break;\r
- }\r
- break;\r
-#endif\r
-\r
case S_INH:\r
outaw(op);\r
break;\r
v1 >>= 1;\r
if ((v1 < -128) || (v1 > 127))\r
aerr();\r
- outaw(op + (v1 & 0x00FF));\r
+ outaw(op | (v1 & 0x00FF));\r
} else {\r
outrb(&e1, R_PCR);\r
outab(op >> 8);\r
rerr();\r
break;\r
\r
+ case S_SYSTRAP:\r
+ case S_SPL:\r
+ v1 = (int) absexpr();\r
+ if (v1 & (rf == S_SPL ? ~7 : ~0xff)) {\r
+ aerr();\r
+ v1 = 0;\r
+ }\r
+ outaw(op | v1);\r
+ break;\r
+\r
default:\r
opcycles = OPCY_ERR;\r
err('o');\r