// 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