add fixup for uncompressed jumptable
[cyclone68000.git] / Ea.cpp
diff --git a/Ea.cpp b/Ea.cpp
index 77c282b..a67f675 100644 (file)
--- a/Ea.cpp
+++ b/Ea.cpp
@@ -141,10 +141,8 @@ static int EaCalcReg(int r,int ea,int mask,int forceor,int shift,int noshift=0)
 int EaCalc(int a,int mask,int ea,int size,int top,int sign_extend)\r
 {\r
   char text[32]="";\r
-  int func=0;\r
 \r
   DisaPc=2; DisaGetEa(text,ea,size); // Get text version of the effective address\r
-  func=0x68+(size<<2); // Get correct read handler\r
 \r
   if (ea<0x10)\r
   {\r
@@ -257,8 +255,7 @@ int EaCalc(int a,int mask,int ea,int size,int top,int sign_extend)
     ot("  ldr r0,[r7,#0x60] ;@ Get Memory base\n");\r
     ot("  sub r0,r4,r0 ;@ Real PC\n");\r
     ot("  ldrsh r2,[r4],#2 ;@ Fetch extension\n"); pc_dirty=1;\r
-    ot("  mov r0,r0,lsl #8\n");\r
-    ot("  add r%d,r2,r0,asr #8 ;@ ($nn,PC)\n",a);\r
+    ot("  add r%d,r2,r0 ;@ ($nn,PC)\n",a);\r
     Cycles+=size<2 ? 8:12; // Extra cycles\r
     return 0;\r
   }\r
@@ -269,7 +266,6 @@ int EaCalc(int a,int mask,int ea,int size,int top,int sign_extend)
     ot("  ldrh r3,[r4] ;@ Get extension word\n");\r
     ot("  sub r0,r4,r0 ;@ r0=PC\n");\r
     ot("  add r4,r4,#2\n"); pc_dirty=1;\r
-    ot("  mov r0,r0,asl #8 ;@ use only 24bits of PC\n");\r
     ot("  mov r2,r3,lsr #10\n");\r
     ot("  tst r3,#0x0800 ;@ Is Rn Word or Long\n");\r
     ot("  and r2,r2,#0x3c ;@ r2=Index of Rn\n");\r
@@ -277,7 +273,7 @@ int EaCalc(int a,int mask,int ea,int size,int top,int sign_extend)
     ot("  ldrne   r2,[r7,r2] ;@ r2=Rn.l\n");\r
     ot("  mov r3,r3,asl #24 ;@ r3=Get 8-bit signed Disp\n");\r
     ot("  add r2,r2,r3,asr #24 ;@ r2=Disp+Rn\n");\r
-    ot("  add r%d,r2,r0,asr #8 ;@ r%d=Disp+PC+Rn\n",a,a);\r
+    ot("  add r%d,r2,r0 ;@ r%d=Disp+PC+Rn\n",a,a);\r
     Cycles+=size<2 ? 10:14; // Extra cycles\r
     return 0;\r
   }\r
@@ -309,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
@@ -335,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
@@ -348,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
@@ -363,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
@@ -391,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
@@ -411,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