diff --git a/project/vc2008_mfc/nasm.props b/project/vc2008_mfc/nasm.props
new file mode 100644
index 00000000..6af58d3c
--- /dev/null
+++ b/project/vc2008_mfc/nasm.props
@@ -0,0 +1,26 @@
+
+
+
+ Midl
+ CustomBuild
+
+
+ _SelectedFiles;$(NASMDependsOn)
+
+
+
+ False
+ False
+ False
+ $(IntDir)%(Filename).obj
+ 0
+ 8
+ 1
+ "$(SolutionDir)..\..\..\dependencies\nasm.exe" [AllOptions] [AdditionalOptions] -- [inputs]
+ %(ObjectFileName)
+ Assembling...
+
+
+
\ No newline at end of file
diff --git a/project/vc2008_mfc/nasm.rules b/project/vc2008_mfc/nasm.rules
index d69b059c..b4472e99 100644
--- a/project/vc2008_mfc/nasm.rules
+++ b/project/vc2008_mfc/nasm.rules
@@ -7,11 +7,10 @@
+ ExecutionDescription="Assembling..." >
> 8)&15].B.B0; \
- if (LIKELY(shift)) { \
- if (shift == 32) { \
- value = 0; \
- C_OUT = (reg[opcode & 0x0F].I & 1 ? true : false);\
- } else if (LIKELY(shift < 32)) { \
- u32 v = reg[opcode & 0x0F].I; \
- C_OUT = (v >> (32 - shift)) & 1 ? true : false;\
- value = v << shift; \
- } else { \
- value = 0; \
- C_OUT = false; \
- } \
- } else { \
- value = reg[opcode & 0x0F].I; \
+ u32 shift = reg[(opcode >> 8)&15].B.B0; \
+ u32 rm = reg[opcode & 0x0F].I; \
+ if((opcode & 0x0F) == 15) { \
+ rm += 4; \
+ } \
+ if (LIKELY(shift)) { \
+ if (shift == 32) { \
+ value = 0; \
+ C_OUT = (rm & 1 ? true : false); \
+ } else if (LIKELY(shift < 32)) { \
+ u32 v = rm; \
+ C_OUT = (v >> (32 - shift)) & 1 ? true : false; \
+ value = v << shift; \
+ } else { \
+ value = 0; \
+ C_OUT = false; \
+ } \
+ } else { \
+ value = rm; \
}
#endif
// OP Rd,Rb,Rm LSR #
#ifndef VALUE_LSR_IMM_C
#define VALUE_LSR_IMM_C \
- unsigned int shift = (opcode >> 7) & 0x1F; \
+ u32 shift = (opcode >> 7) & 0x1F; \
if (LIKELY(shift)) { \
u32 v = reg[opcode & 0x0F].I; \
C_OUT = (v >> (shift - 1)) & 1 ? true : false; \
@@ -787,12 +791,16 @@ static void count(u32 opcode, int cond_res)
#ifndef VALUE_LSR_REG_C
#define VALUE_LSR_REG_C \
unsigned int shift = reg[(opcode >> 8)&15].B.B0; \
+ u32 rm = reg[opcode & 0x0F].I; \
+ if((opcode & 0x0F) == 15) { \
+ rm += 4; \
+ } \
if (LIKELY(shift)) { \
if (shift == 32) { \
value = 0; \
- C_OUT = (reg[opcode & 0x0F].I & 0x80000000 ? true : false);\
+ C_OUT = (rm & 0x80000000 ? true : false);\
} else if (LIKELY(shift < 32)) { \
- u32 v = reg[opcode & 0x0F].I; \
+ u32 v = rm; \
C_OUT = (v >> (shift - 1)) & 1 ? true : false;\
value = v >> shift; \
} else { \
@@ -800,7 +808,7 @@ static void count(u32 opcode, int cond_res)
C_OUT = false; \
} \
} else { \
- value = reg[opcode & 0x0F].I; \
+ value = rm; \
}
#endif
// OP Rd,Rb,Rm ASR #
@@ -826,13 +834,17 @@ static void count(u32 opcode, int cond_res)
#ifndef VALUE_ASR_REG_C
#define VALUE_ASR_REG_C \
unsigned int shift = reg[(opcode >> 8)&15].B.B0; \
+ u32 rm = reg[opcode & 0x0F].I; \
+ if((opcode & 0x0F) == 15) { \
+ rm += 4; \
+ } \
if (LIKELY(shift < 32)) { \
if (LIKELY(shift)) { \
- s32 v = reg[opcode & 0x0F].I; \
+ s32 v = rm; \
C_OUT = (v >> (int)(shift - 1)) & 1 ? true : false;\
value = v >> (int)shift; \
} else { \
- value = reg[opcode & 0x0F].I; \
+ value = rm; \
} \
} else { \
if (reg[opcode & 0x0F].I & 0x80000000) { \
@@ -864,17 +876,20 @@ static void count(u32 opcode, int cond_res)
#ifndef VALUE_ROR_REG_C
#define VALUE_ROR_REG_C \
unsigned int shift = reg[(opcode >> 8)&15].B.B0; \
+ u32 rm = reg[opcode & 0x0F].I; \
+ if((opcode & 0x0F) == 15) { \
+ rm += 4; \
+ } \
if (LIKELY(shift & 0x1F)) { \
- u32 v = reg[opcode & 0x0F].I; \
+ u32 v = rm; \
C_OUT = (v >> (shift - 1)) & 1 ? true : false; \
value = ((v << (32 - shift)) | \
(v >> shift)); \
} else { \
- value = reg[opcode & 0x0F].I; \
+ value = rm; \
if (shift) \
C_OUT = (value & 0x80000000 ? true : false);\
- }
-#endif
+ }#endif
// OP Rd,Rb,# ROR #
#ifndef VALUE_IMM_C
#define VALUE_IMM_C \