Refactoring 65C02 predicated instructions
authorNick Downing <nick@ndcode.org>
Thu, 21 Jul 2022 05:01:53 +0000 (15:01 +1000)
committerNick Downing <nick@ndcode.org>
Thu, 21 Jul 2022 05:01:53 +0000 (15:01 +1000)
cpu_65c02.c
cpu_65c02.h

index d4da27e..d7dfbea 100644 (file)
@@ -69,11 +69,11 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0x0f:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbr(self, rvalue & 1, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, !(rvalue & 1), cpu_65c02_ea_relative(self));
     }
     break;
   case 0x10:
-    cpu_65c02_bc(self, (1 << CPU_65C02_REG_P_BIT_N), cpu_65c02_ea_relative(self));
+    cpu_65c02_bra(self, !self->regs.bit.nf, cpu_65c02_ea_relative(self));
     break;
   case 0x11:
     cpu_65c02_ora(self, cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page_indirect_indexed(self, self->regs.byte.y)));
@@ -120,7 +120,7 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0x1f:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbr(self, rvalue & 2, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, !((rvalue >> 1) & 1), cpu_65c02_ea_relative(self));
     }
     break;
   case 0x20:
@@ -171,11 +171,11 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0x2f:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbr(self, rvalue & 4, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, !((rvalue >> 2) & 1), cpu_65c02_ea_relative(self));
     }
     break;
   case 0x30:
-    cpu_65c02_bs(self, (1 << CPU_65C02_REG_P_BIT_N), cpu_65c02_ea_relative(self));
+    cpu_65c02_bra(self, self->regs.bit.nf, cpu_65c02_ea_relative(self));
     break;
   case 0x31:
     cpu_65c02_and(self, cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page_indirect_indexed(self, self->regs.byte.y)));
@@ -222,7 +222,7 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0x3f:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbr(self, rvalue & 8, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, !((rvalue >> 3) & 1), cpu_65c02_ea_relative(self));
     }
     break;
   case 0x40:
@@ -273,11 +273,11 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0x4f:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbr(self, rvalue & 0x10, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, !((rvalue >> 4) & 1), cpu_65c02_ea_relative(self));
     }
     break;
   case 0x50:
-    cpu_65c02_bc(self, (1 << CPU_65C02_REG_P_BIT_V), cpu_65c02_ea_relative(self));
+    cpu_65c02_bra(self, !self->regs.bit.vf, cpu_65c02_ea_relative(self));
     break;
   case 0x51:
     cpu_65c02_eor(self, cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page_indirect_indexed(self, self->regs.byte.y)));
@@ -324,7 +324,7 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0x5f:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbr(self, rvalue & 0x20, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, !((rvalue >> 5) & 1), cpu_65c02_ea_relative(self));
     }
     break;
   case 0x60:
@@ -375,11 +375,11 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0x6f:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbr(self, rvalue & 0x40, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, !((rvalue >> 6) & 1), cpu_65c02_ea_relative(self));
     }
     break;
   case 0x70:
-    cpu_65c02_bs(self, (1 << CPU_65C02_REG_P_BIT_V), cpu_65c02_ea_relative(self));
+    cpu_65c02_bra(self, self->regs.bit.vf, cpu_65c02_ea_relative(self));
     break;
   case 0x71:
     cpu_65c02_adc(self, cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page_indirect_indexed(self, self->regs.byte.y)));
@@ -426,11 +426,11 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0x7f:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbr(self, rvalue & 0x80, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, !((rvalue >> 7) & 1), cpu_65c02_ea_relative(self));
     }
     break;
   case 0x80:
-    cpu_65c02_bc(self, 0, cpu_65c02_ea_relative(self));
+    cpu_65c02_bra(self, true, cpu_65c02_ea_relative(self));
     break;
   case 0x81:
     cpu_65c02_st(self, self->regs.byte.a, cpu_65c02_ea_zero_page_indexed_indirect(self, self->regs.byte.x));
@@ -477,11 +477,11 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0x8f:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbs(self, rvalue & 1, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, rvalue & 1, cpu_65c02_ea_relative(self));
     }
     break;
   case 0x90:
-    cpu_65c02_bc(self, (1 << CPU_65C02_REG_P_BIT_C), cpu_65c02_ea_relative(self));
+    cpu_65c02_bra(self, !self->regs.bit.cf, cpu_65c02_ea_relative(self));
     break;
   case 0x91:
     cpu_65c02_st(self, self->regs.byte.a, cpu_65c02_ea_zero_page_indirect_indexed(self, self->regs.byte.y));
@@ -528,7 +528,7 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0x9f:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbs(self, rvalue & 2, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, (rvalue >> 1) & 1, cpu_65c02_ea_relative(self));
     }
     break;
   case 0xa0:
@@ -579,11 +579,11 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0xaf:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbs(self, rvalue & 4, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, (rvalue >> 2) & 1, cpu_65c02_ea_relative(self));
     }
     break;
   case 0xb0:
-    cpu_65c02_bs(self, (1 << CPU_65C02_REG_P_BIT_C), cpu_65c02_ea_relative(self));
+    cpu_65c02_bra(self, self->regs.bit.cf, cpu_65c02_ea_relative(self));
     break;
   case 0xb1:
     cpu_65c02_ld(self, CPU_65C02_EA_A, cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page_indirect_indexed(self, self->regs.byte.y)));
@@ -630,7 +630,7 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0xbf:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbs(self, rvalue & 8, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, (rvalue >> 3) & 1, cpu_65c02_ea_relative(self));
     }
     break;
   case 0xc0:
@@ -681,11 +681,11 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0xcf:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbs(self, rvalue & 0x10, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, (rvalue >> 4) & 1, cpu_65c02_ea_relative(self));
     }
     break;
   case 0xd0:
-    cpu_65c02_bc(self, (1 << CPU_65C02_REG_P_BIT_Z), cpu_65c02_ea_relative(self));
+    cpu_65c02_bra(self, !self->regs.bit.zf, cpu_65c02_ea_relative(self));
     break;
   case 0xd1:
     cpu_65c02_cmp(self, self->regs.byte.a, cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page_indirect_indexed(self, self->regs.byte.y)));
@@ -732,7 +732,7 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0xdf:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbs(self, rvalue & 0x20, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, (rvalue >> 5) & 1, cpu_65c02_ea_relative(self));
     }
     break;
   case 0xe0:
@@ -783,11 +783,11 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0xef:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbs(self, rvalue & 0x40, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, (rvalue >> 6) & 1, cpu_65c02_ea_relative(self));
     }
     break;
   case 0xf0:
-    cpu_65c02_bs(self, (1 << CPU_65C02_REG_P_BIT_Z), cpu_65c02_ea_relative(self));
+    cpu_65c02_bra(self, self->regs.bit.zf, cpu_65c02_ea_relative(self));
     break;
   case 0xf1:
     cpu_65c02_sbc(self, cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page_indirect_indexed(self, self->regs.byte.y)));
@@ -834,7 +834,7 @@ void cpu_65c02_execute(struct cpu_65c02 *self) {
   case 0xff:
     {
       int rvalue = cpu_65c02_read_byte(self, cpu_65c02_ea_zero_page(self));
-      cpu_65c02_bbs(self, rvalue & 0x80, cpu_65c02_ea_relative(self));
+      cpu_65c02_bra(self, (rvalue >> 7) & 1, cpu_65c02_ea_relative(self));
     }
     break;
   }
index 4d5016f..fcc38e8 100644 (file)
@@ -270,34 +270,6 @@ static ALWAYS_INLINE void cpu_65c02_asl(struct cpu_65c02 *self, int lvalue) {
   self->regs.bit.nf = (result >> 7) & 1;
 }
 
-static ALWAYS_INLINE void cpu_65c02_bbr(struct cpu_65c02 *self, int rvalue, int lvalue) {
-  if (rvalue == 0) {
-    self->cycles += ((self->regs.word.pc & 0xff) + (lvalue & 0xff)) >> 8;
-    self->regs.word.pc = (self->regs.word.pc + lvalue) & 0xffff;
-  }
-}
-
-static ALWAYS_INLINE void cpu_65c02_bbs(struct cpu_65c02 *self, int rvalue, int lvalue) {
-  if (rvalue) {
-    self->cycles += ((self->regs.word.pc & 0xff) + (lvalue & 0xff)) >> 8;
-    self->regs.word.pc = (self->regs.word.pc + lvalue) & 0xffff;
-  }
-}
-
-static ALWAYS_INLINE void cpu_65c02_bc(struct cpu_65c02 *self, int flag, int lvalue) {
-  if ((self->regs.byte.p & flag) == 0) {
-    self->cycles += ((self->regs.word.pc & 0xff) + (lvalue & 0xff)) >> 8;
-    self->regs.word.pc = (self->regs.word.pc + lvalue) & 0xffff;
-  }
-}
-
-static ALWAYS_INLINE void cpu_65c02_bs(struct cpu_65c02 *self, int flag, int lvalue) {
-  if (self->regs.byte.p & flag) {
-    self->cycles += ((self->regs.word.pc & 0xff) + (lvalue & 0xff)) >> 8;
-    self->regs.word.pc = (self->regs.word.pc + lvalue) & 0xffff;
-  }
-}
-
 static ALWAYS_INLINE void cpu_65c02_bit(struct cpu_65c02 *self, int rvalue) {
   int result = self->regs.byte.a & rvalue;
   self->regs.bit.zf = result == 0;
@@ -310,6 +282,13 @@ static ALWAYS_INLINE void cpu_65c02_bit_imm(struct cpu_65c02 *self, int rvalue)
   self->regs.bit.zf = result == 0;
 }
 
+static ALWAYS_INLINE void cpu_65c02_bra(struct cpu_65c02 *self, bool pred, int lvalue) {
+  if (pred) {
+    self->cycles += ((self->regs.word.pc & 0xff) + (lvalue & 0xff)) >> 8;
+    self->regs.word.pc = (self->regs.word.pc + lvalue) & 0xffff;
+  }
+}
+
 static ALWAYS_INLINE void cpu_65c02_brk(struct cpu_65c02 *self) {
   ++self->cycles;
   cpu_65c02_push_word(self, (self->regs.word.pc + 1) & 0xffff);