avoid using mrs
[cyclone68000.git] / Ea.cpp
diff --git a/Ea.cpp b/Ea.cpp
index 234d469..a67f675 100644 (file)
--- a/Ea.cpp
+++ b/Ea.cpp
@@ -305,11 +305,15 @@ int EaCalc(int a,int mask,int ea,int size,int top,int sign_extend)
 // If top is 0 and sign_extend is not, then ARM register v is sign extended,\r
 // e.g. 0xc000 -> 0xffffc000 (else it may or may not be sign extended)\r
 \r
-int EaRead(int a,int v,int ea,int size,int mask,int top,int sign_extend)\r
+int EaRead(int a,int v,int ea,int size,int mask,int top,int sign_extend,int set_nz)\r
 {\r
   char text[32]="";\r
+  const char *s="";\r
+  int flags_set=0;\r
   int shift=0;\r
 \r
+  if (set_nz) s="s";\r
+\r
   shift=32-(8<<size);\r
 \r
   DisaPc=2; DisaGetEa(text,ea,size); // Get text version of the effective address\r
@@ -331,7 +335,8 @@ int EaRead(int a,int v,int ea,int size,int mask,int top,int sign_extend)
     else if (lsl<0) ot("  ldr%s r%d,[r7,r%d,lsr #%i]\n",Narm[nsarm],v,a,-lsl);\r
     else            ot("  ldr%s r%d,[r7,r%d]\n",Sarm[nsarm],v,a);\r
 \r
-    if (top&&shift) ot("  mov r%d,r%d,asl #%d\n",v,v,shift);\r
+    if (top&&shift) ot("  mov%s r%d,r%d,asl #%d\n",s,v,v,shift);\r
+    else if(set_nz) ot("  tst r%d,r%d\n",v,v);\r
 \r
     ot("\n"); return 0;\r
   }\r
@@ -344,8 +349,9 @@ int EaRead(int a,int v,int ea,int size,int mask,int top,int sign_extend)
 \r
     if (top) asl=shift;\r
 \r
-    if (asl) ot("  mov r%d,r%d,asl #%d\n",v,a,asl);\r
-    else if (v!=a) ot("  mov r%d,r%d\n",v,a);\r
+    if (asl)         ot("  mov%s r%d,r%d,asl #%d\n",s,v,a,asl);\r
+    else if (v!=a)   ot("  mov%s r%d,r%d\n",s,v,a);\r
+    else if (set_nz) ot("  tst r%d,r%d\n",v,v);\r
     ot("\n"); return 0;\r
   }\r
 \r
@@ -359,24 +365,35 @@ int EaRead(int a,int v,int ea,int size,int mask,int top,int sign_extend)
   {\r
     int d_reg=0;\r
     if (shift) {\r
-      ot("  mov r%d,r%d,asl #%d\n",v,d_reg,shift);\r
+      ot("  mov%s r%d,r%d,asl #%d\n",s,v,d_reg,shift);\r
       d_reg=v;\r
+      flags_set=1;\r
     }\r
     if (!top && shift) {\r
-      ot("  mov r%d,r%d,asr #%d\n",v,d_reg,shift);\r
+      ot("  mov%s r%d,r%d,asr #%d\n",s,v,d_reg,shift);\r
       d_reg=v;\r
+      flags_set=1;\r
+    }\r
+    if (d_reg != v) {\r
+      ot("  mov%s r%d,r%d\n",s,v,d_reg);\r
+      flags_set=1;\r
     }\r
-    if (d_reg != v)\r
-      ot("  mov r%d,r%d\n",v,d_reg);\r
   }\r
   else\r
   {\r
-    if (top && shift)\r
-      ot("  mov r%d,r0,asl #%d\n",v,shift);\r
-    else if (v!=0)\r
-      ot("  mov r%d,r0\n",v);\r
+    if (top && shift) {\r
+      ot("  mov%s r%d,r0,asl #%d\n",s,v,shift);\r
+      flags_set=1;\r
+    }\r
+    else if (v!=0) {\r
+      ot("  mov%s r%d,r0\n",s,v);\r
+      flags_set=1;\r
+    }\r
   }\r
 \r
+  if (set_nz&&!flags_set)\r
+    ot("  tst r%d,r%d\n",v,v);\r
+\r
   ot("\n"); return 0;\r
 }\r
 \r
@@ -387,7 +404,7 @@ int EaRead(int a,int v,int ea,int size,int mask,int top,int sign_extend)
 // size values 0, 1, 2 ~ byte, word, long\r
 // r_ea is reg to store ea in (-1 means ea is not needed), r is dst reg\r
 // if sign_extend is 0, non-32bit values will have MS bits undefined\r
-int EaCalcRead(int r_ea,int r,int ea,int size,int mask,int sign_extend)\r
+int EaCalcRead(int r_ea,int r,int ea,int size,int mask,int sign_extend,int set_nz)\r
 {\r
   if (ea<0x10)\r
   {\r
@@ -407,7 +424,7 @@ int EaCalcRead(int r_ea,int r,int ea,int size,int mask,int sign_extend)
   }\r
 \r
   EaCalc (r_ea,mask,ea,size,0,sign_extend);\r
-  EaRead (r_ea,   r,ea,size,mask,0,sign_extend);\r
+  EaRead (r_ea,   r,ea,size,mask,0,sign_extend,set_nz);\r
 \r
   return 0;\r
 }\r