summary refs log tree commit diff
diff options
context:
space:
mode:
authorMaxwell Beck <max@rastertail.net>2024-12-28 19:07:40 -0600
committerMaxwell Beck <max@rastertail.net>2024-12-28 19:07:40 -0600
commit6ae60dd26bc8900a3fec955b846b4b3119c80dd8 (patch)
tree8233b47e77bce264b499df00de6902019c232f2f
parentdf3838ef78d4ad45f4f5c42cebf48be491c6e980 (diff)
Fix ARR instruction
-rw-r--r--src/6502.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/6502.c b/src/6502.c
index 5d38029..b33b49d 100644
--- a/src/6502.c
+++ b/src/6502.c
@@ -403,11 +403,11 @@
 	do { \
 		uint8_t c = FLAG_GET(C); \
 		r = r & a; \
-		uint16_t res = r + a + c; \
-		FLAG_SET(N, (res & 0x100) >> 8); \
-		FLAG_SET(V, ((r ^ res) & (a ^ res) & 0x80) >> 7); \
-		FLAG_SET(C, r & 1); \
-		r = (r >> 1) | (r << 7); \
+		r = (r >> 1) | (c << 7); \
+		FLAG_SET(C, (r & 0x40) >> 6); \
+		FLAG_SET(V, ((r & 0x40) ^ ((r & 0x20) << 1)) >> 6); \
+		FLAG_SET(N, (r & 0x80) >> 7); \
+		FLAG_SET(Z, (r == 0) ? 1 : 0); \
 	} while (0);
 
 #define DCP(src, dst) \
@@ -946,7 +946,6 @@ uint8_t cpu_step(cpu_t *cpu) {
 				uint8_t a;
 				R_IMM();
 				ARR();
-				FLAG_SET(Z, (r == 0) ? 1 : 0);
 				cpu->a = r;
 			} while (0);
 			break;