0.0088 release
[picodrive.git] / cpu / Cyclone / Ea.cpp
index 35f0048..4be33e1 100644 (file)
@@ -1,6 +1,8 @@
 \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
@@ -149,7 +151,7 @@ int EaCalc(int a,int mask,int ea,int size,int top,int sign_extend)
   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
@@ -340,8 +342,11 @@ int EaRead(int a,int v,int ea,int size,int mask,int top,int sign_extend)
     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
@@ -462,7 +467,11 @@ int EaWrite(int a,int v,int ea,int size,int mask,int top,int sign_extend_ea)
   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