@macro op_adjust(name, r, op) void {class}::op_{name}_imm_b() { {lc}op_io_irq(); regs.{r}.l {op}; regs.p.n = (regs.{r}.l & 0x80); regs.p.z = (regs.{r}.l == 0); } void {class}::op_{name}_imm_w() { {lc}op_io_irq(); regs.{r}.w {op}; regs.p.n = (regs.{r}.w & 0x8000); regs.p.z = (regs.{r}.w == 0); } @endmacro @macro op_asl() void {class}::op_asl_imm_b() { {lc}op_io_irq(); regs.p.c = (regs.a.l & 0x80); regs.a.l <<= 1; regs.p.n = (regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } void {class}::op_asl_imm_w() { {lc}op_io_irq(); regs.p.c = (regs.a.w & 0x8000); regs.a.w <<= 1; regs.p.n = (regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } @endmacro @macro op_lsr() void {class}::op_lsr_imm_b() { {lc}op_io_irq(); regs.p.c = (regs.a.l & 0x01); regs.a.l >>= 1; regs.p.n = (regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } void {class}::op_lsr_imm_w() { {lc}op_io_irq(); regs.p.c = (regs.a.w & 0x0001); regs.a.w >>= 1; regs.p.n = (regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } @endmacro @macro op_rol() void {class}::op_rol_imm_b() { {lc}op_io_irq(); bool carry = regs.p.c; regs.p.c = (regs.a.l & 0x80); regs.a.l = (regs.a.l << 1) | carry; regs.p.n = (regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } void {class}::op_rol_imm_w() { {lc}op_io_irq(); bool carry = regs.p.c; regs.p.c = (regs.a.w & 0x8000); regs.a.w = (regs.a.w << 1) | carry; regs.p.n = (regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } @endmacro @macro op_ror() void {class}::op_ror_imm_b() { {lc}op_io_irq(); bool carry = regs.p.c; regs.p.c = (regs.a.l & 0x01); regs.a.l = (carry << 7) | (regs.a.l >> 1); regs.p.n = (regs.a.l & 0x80); regs.p.z = (regs.a.l == 0); } void {class}::op_ror_imm_w() { {lc}op_io_irq(); bool carry = regs.p.c; regs.p.c = (regs.a.w & 0x0001); regs.a.w = (carry << 15) | (regs.a.w >> 1); regs.p.n = (regs.a.w & 0x8000); regs.p.z = (regs.a.w == 0); } @endmacro @macro op_adjust_addr(name) void {class}::op_{name}_addr_b() { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w); op_io(); op_{name}_b(); {lc}op_writedbr(aa.w, rd.l); } void {class}::op_{name}_addr_w() { aa.l = op_readpc(); aa.h = op_readpc(); rd.l = op_readdbr(aa.w + 0); rd.h = op_readdbr(aa.w + 1); op_io(); op_{name}_w(); op_writedbr(aa.w + 1, rd.h); {lc}op_writedbr(aa.w + 0, rd.l); } @endmacro @macro op_adjust_addrx(name) void {class}::op_{name}_addrx_b() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); rd.l = op_readdbr(aa.w + regs.x.w); op_io(); op_{name}_b(); {lc}op_writedbr(aa.w + regs.x.w, rd.l); } void {class}::op_{name}_addrx_w() { aa.l = op_readpc(); aa.h = op_readpc(); op_io(); rd.l = op_readdbr(aa.w + regs.x.w + 0); rd.h = op_readdbr(aa.w + regs.x.w + 1); op_io(); op_{name}_w(); op_writedbr(aa.w + regs.x.w + 1, rd.h); {lc}op_writedbr(aa.w + regs.x.w + 0, rd.l); } @endmacro @macro op_adjust_dp(name) void {class}::op_{name}_dp_b() { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp); op_io(); op_{name}_b(); {lc}op_writedp(dp, rd.l); } void {class}::op_{name}_dp_w() { dp = op_readpc(); op_io_cond2(); rd.l = op_readdp(dp + 0); rd.h = op_readdp(dp + 1); op_io(); op_{name}_w(); op_writedp(dp + 1, rd.h); {lc}op_writedp(dp + 0, rd.l); } @endmacro @macro op_adjust_dpx(name) void {class}::op_{name}_dpx_b() { dp = op_readpc(); op_io_cond2(); op_io(); rd.l = op_readdp(dp + regs.x.w); op_io(); op_{name}_b(); {lc}op_writedp(dp + regs.x.w, rd.l); } void {class}::op_{name}_dpx_w() { dp = op_readpc(); op_io_cond2(); op_io(); rd.l = op_readdp(dp + regs.x.w + 0); rd.h = op_readdp(dp + regs.x.w + 1); op_io(); op_{name}_w(); op_writedp(dp + regs.x.w + 1, rd.h); {lc}op_writedp(dp + regs.x.w + 0, rd.l); } @endmacro