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
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
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
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
// 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
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
\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
{\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
// 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
}\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