\r
#include "app.h"\r
\r
+int earead_check_addrerr = 1, eawrite_check_addrerr = 0;\r
+\r
// some ops use non-standard cycle counts for EAs, so are listed here.\r
// all constants borrowed from the MUSASHI core by Karl Stenerud.\r
\r
for (i=mask|0x8000; (i&1)==0; i>>=1) low++; // Find out how high up the EA mask is\r
mask&=0xf<<low; // This is the max we can do\r
\r
- if (ea>=8) needor=1; // Need to OR to access A0-7\r
-\r
- if (((mask&g_op)>>low)&8) needor=0; // Ah - no we don't actually need to or, since the bit is high in r8\r
-\r
- if (forceor) needor=1; // Special case for 0x30-0x38 EAs ;)\r
+ if (ea>=8)\r
+ {\r
+ needor=1; // Need to OR to access A0-7\r
+ if ((g_op>>low)&8) { needor=0; mask|=8<<low; } // Ah - no we don't actually need to or, since the bit is high in r8\r
+ if (forceor) needor=1; // Special case for 0x30-0x38 EAs ;)\r
+ }\r
\r
ot(" and r%d,r8,#0x%.4x\n",r,mask);\r
if (needor) ot(" orr r%d,r%d,#0x%x ;@ A0-7\n",r,r,8<<low);\r
if (ea<0x28)\r
{\r
int step=1<<size, strr=a;\r
- int low=0,lsl,i;\r
+ int low=0,lsl=0,i;\r
\r
if ((ea&7)==7 && step<2) step=2; // move.b (a7)+ or -(a7) steps by 2 not 1\r
\r
ot("\n"); return 0;\r
}\r
\r
- if (ea>=0x3a && ea<=0x3b) MemHandler(2,size,a); // Fetch\r
- else MemHandler(0,size,a); // Read\r
+ if (ea>=0x3a && ea<=0x3b) MemHandler(2,size,a,earead_check_addrerr); // Fetch\r
+ else MemHandler(0,size,a,earead_check_addrerr); // Read\r
+\r
+ // defaults to 1, as most things begins with a read\r
+ earead_check_addrerr=1;\r
\r
if (sign_extend)\r
{\r
if (shift) ot(" mov r1,r%d,asr #%d\n",v,shift);\r
else if (v!=1) ot(" mov r1,r%d\n",v);\r
\r
- MemHandler(1,size,a); // Call write handler\r
+ MemHandler(1,size,a,eawrite_check_addrerr); // Call write handler\r
+\r
+ // not check by default, because most cases are rmw and\r
+ // address was already checked before reading\r
+ eawrite_check_addrerr = 0;\r
\r
ot("\n"); return 0;\r
}\r