/* ======================================================================== */\r
/*\r
* MUSASHI\r
- * Version 3.3\r
+ * Version 3.31\r
*\r
* A portable Motorola M680x0 processor emulation engine.\r
- * Copyright 1998-2001 Karl Stenerud. All rights reserved.\r
+ * Copyright 1998-2007 Karl Stenerud. All rights reserved.\r
*\r
* This code may be freely used for non-commercial purposes as long as this\r
* copyright notice remains unaltered in the source code and any binary files\r
M68KMAKE_OPCODE_HANDLER_HEADER\r
\r
#include "m68kcpu.h"\r
+extern void m68040_fpu_op0(void);\r
+extern void m68040_fpu_op1(void);\r
\r
/* ======================================================================== */\r
/* ========================= INSTRUCTION HANDLERS ========================= */\r
M68KMAKE_TABLE_START\r
1010 0 . . 1010............ .......... U U U U 4 4 4 4\r
1111 0 . . 1111............ .......... U U U U 4 4 4 4\r
+040fpu0 32 . . 11110010........ .......... . . . U . . . 0\r
+040fpu1 32 . . 11110011........ .......... . . . U . . . 0\r
abcd 8 rr . 1100...100000... .......... U U U U 6 6 4 4\r
abcd 8 mm ax7 1100111100001... .......... U U U U 18 18 16 16\r
abcd 8 mm ay7 1100...100001111 .......... U U U U 18 18 16 16\r
chk2cmp2 32 . pcix 0000010011111011 .......... . . U U . . 23 23\r
chk2cmp2 32 . . 0000010011...... A..DXWL... . . U U . . 18 18\r
clr 8 . d 0100001000000... .......... U U U U 4 4 2 2\r
-clr 8 . . 0100001000...... A+-DXWL... U U U U 6 4 4 4 notaz hack: changed 000 cycles 8 -> 6 like in starscream for Fatal Rewind\r
+clr 8 . . 0100001000...... A+-DXWL... U U U U 8 4 4 4\r
clr 16 . d 0100001001000... .......... U U U U 4 4 2 2\r
-clr 16 . . 0100001001...... A+-DXWL... U U U U 6 4 4 4 ditto\r
+clr 16 . . 0100001001...... A+-DXWL... U U U U 8 4 4 4\r
clr 32 . d 0100001010000... .......... U U U U 6 6 2 2\r
clr 32 . . 0100001010...... A+-DXWL... U U U U 12 6 4 4\r
cmp 8 . d 1011...000000... .......... U U U U 4 4 2 2\r
}\r
\r
\r
+M68KMAKE_OP(040fpu0, 32, ., .)\r
+{\r
+ if(CPU_TYPE_IS_040_PLUS(CPU_TYPE))\r
+ {\r
+ m68040_fpu_op0();\r
+ return;\r
+ }\r
+ m68ki_exception_1111();\r
+}\r
+\r
+\r
+M68KMAKE_OP(040fpu1, 32, ., .)\r
+{\r
+ if(CPU_TYPE_IS_040_PLUS(CPU_TYPE))\r
+ {\r
+ m68040_fpu_op1();\r
+ return;\r
+ }\r
+ m68ki_exception_1111();\r
+}\r
+\r
+\r
+\r
M68KMAKE_OP(abcd, 8, rr, .)\r
{\r
uint* r_dst = &DX;\r
M68KMAKE_OP(adda, 16, ., .)\r
{\r
uint* r_dst = &AX;\r
+ uint src = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);\r
\r
- *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(M68KMAKE_GET_OPER_AY_16));\r
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + src);\r
}\r
\r
\r
M68KMAKE_OP(adda, 32, ., .)\r
{\r
uint* r_dst = &AX;\r
+ uint src = M68KMAKE_GET_OPER_AY_32; // notaz\r
\r
- *r_dst = MASK_OUT_ABOVE_32(*r_dst + M68KMAKE_GET_OPER_AY_32);\r
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + src);\r
}\r
\r
\r
{\r
m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */\r
m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));\r
-// if(REG_PC == REG_PPC)\r
-// USE_ALL_CYCLES();\r
+ if(REG_PC == REG_PPC)\r
+ USE_ALL_CYCLES();\r
}\r
\r
\r
REG_PC -= 2;\r
m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */\r
m68ki_branch_16(offset);\r
-// if(REG_PC == REG_PPC)\r
-// USE_ALL_CYCLES();\r
+ if(REG_PC == REG_PPC)\r
+ USE_ALL_CYCLES();\r
}\r
\r
\r
{\r
m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */\r
m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));\r
-// if(REG_PC == REG_PPC)\r
-// USE_ALL_CYCLES();\r
+ if(REG_PC == REG_PPC)\r
+ USE_ALL_CYCLES();\r
}\r
}\r
\r
{\r
uint ea = M68KMAKE_GET_EA_AY_32;\r
m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */\r
- m68ki_push_32(MAKE_INT_24(REG_PC)); // notaz: Cyclone can't handle 32bit PC and I neet to debug it\r
+ m68ki_push_32(REG_PC);\r
m68ki_jump(ea);\r
}\r
\r
uint res = DY;\r
uint ea = EA_AX_PD_32();\r
\r
- m68ki_write_32(ea, res);\r
+ m68ki_write_16(ea+2, res & 0xFFFF );\r
+ m68ki_write_16(ea, (res >> 16) & 0xFFFF );\r
\r
FLAG_N = NFLAG_32(res);\r
FLAG_Z = res;\r
uint res = AY;\r
uint ea = EA_AX_PD_32();\r
\r
- m68ki_write_32(ea, res);\r
+ m68ki_write_16(ea+2, res & 0xFFFF );\r
+ m68ki_write_16(ea, (res >> 16) & 0xFFFF );\r
\r
FLAG_N = NFLAG_32(res);\r
FLAG_Z = res;\r
uint res = M68KMAKE_GET_OPER_AY_32;\r
uint ea = EA_AX_PD_32();\r
\r
- m68ki_write_32(ea, res);\r
+ m68ki_write_16(ea+2, res & 0xFFFF );\r
+ m68ki_write_16(ea, (res >> 16) & 0xFFFF );\r
\r
FLAG_N = NFLAG_32(res);\r
FLAG_Z = res;\r
case 0x002: /* CACR */\r
if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
{\r
- REG_CACR = REG_DA[(word2 >> 12) & 15];\r
+ if (CPU_TYPE_IS_040_PLUS(CPU_TYPE))\r
+ {\r
+ REG_CACR = REG_DA[(word2 >> 12) & 15];\r
+ }\r
+ else\r
+ {\r
+ /* non 68040 can only set the lower 4 bits (C,CE,F,E) */\r
+ REG_CACR = REG_DA[(word2 >> 12) & 15] & 0x0f;\r
+ }\r
return;\r
}\r
m68ki_exception_illegal();\r
if(register_list & (1 << i))\r
{\r
ea -= 4;\r
- m68ki_write_32(ea, REG_DA[15-i]);\r
+#if 0\r
+ m68ki_write_32(ea, REG_DA[15-i] ); // notaz Cyclone hack\r
+#else\r
+ m68ki_write_16(ea+2, REG_DA[15-i] & 0xFFFF );\r
+ m68ki_write_16(ea, (REG_DA[15-i] >> 16) & 0xFFFF );\r
+#endif\r
count++;\r
}\r
AY = ea;\r
\r
*r_dst = res;\r
\r
- FLAG_C = (src >> (32 - shift)) << 8;\r
+ FLAG_C = (src >> ((32 - shift) & 0x1f)) << 8;\r
FLAG_N = NFLAG_32(res);\r
FLAG_Z = res;\r
FLAG_V = VFLAG_CLEAR;\r
M68KMAKE_OP(suba, 16, ., .)\r
{\r
uint* r_dst = &AX;\r
+ uint src = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);\r
\r
- *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(M68KMAKE_GET_OPER_AY_16));\r
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - src);\r
}\r
\r
\r
M68KMAKE_OP(suba, 32, ., .)\r
{\r
uint* r_dst = &AX;\r
+ uint src = M68KMAKE_GET_OPER_AY_32; // notaz\r
\r
- *r_dst = MASK_OUT_ABOVE_32(*r_dst - M68KMAKE_GET_OPER_AY_32);\r
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - src);\r
}\r
\r
\r
{\r
uint ea = M68KMAKE_GET_EA_AY_8;\r
uint dst = m68ki_read_8(ea);\r
+ uint allow_writeback;\r
\r
FLAG_Z = dst;\r
FLAG_N = NFLAG_8(dst);\r
FLAG_V = VFLAG_CLEAR;\r
FLAG_C = CFLAG_CLEAR;\r
-// m68ki_write_8(ea, dst | 0x80); // notaz: genesis, but only to mem\r
+\r
+ /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback\r
+ disabled in order to function properly. Some Amiga software may also rely\r
+ on this, but only when accessing specific addresses so additional functionality\r
+ will be needed. */\r
+ allow_writeback = m68ki_tas_callback();\r
+\r
+ if (allow_writeback==1) m68ki_write_8(ea, dst | 0x80);\r
}\r
\r
\r