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)));
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:
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)));
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:
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)));
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:
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)));
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));
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));
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:
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)));
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:
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)));
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:
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)));
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;
}
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;
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);