void CPUcore::op_sta_idpy_b() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp + 0); aa.h = op_readdp(dp + 1); op_io(); L op_writedbr(aa.w + regs.y.w, regs.a.l); }
void SMPcore::op_movw_ya_dp() { sp = op_readpc(); regs.a = op_readdp(sp + 0); op_io(); regs.y = op_readdp(sp + 1); regs.p.n = (regs.ya & 0x8000); regs.p.z = (regs.ya == 0); }
void SMPcore::op_read_ix_iy() { op_io(); rd = op_readdp(regs.y); wr = op_readdp(regs.x); wr = (this->*op)(wr, rd); static uint8 (SMPcore::*cmp)(uint8, uint8) = &SMPcore::op_cmp; (op != cmp) ? op_writedp(regs.x, wr) : op_io(); }
void SMPcore::op_read_a_idpy() { dp = op_readpc(); op_io(); sp = op_readdp(dp + 0) << 0; sp |= op_readdp(dp + 1) << 8; rd = op_read(sp + regs.y); regs.a = (this->*op)(regs.a, rd); }
template<void (CPUcore::*op)()> void CPUcore::op_read_idp_b() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp + 0); aa.h = op_readdp(dp + 1); L rd.l = op_readdbr(aa.w); call(op); }
template<void (CPUcore::*op)(), int n> void CPUcore::op_read_dpr_w() { dp = op_readpc(); op_io_cond2(); op_io(); rd.l = op_readdp(dp + regs.r[n].w + 0); L rd.h = op_readdp(dp + regs.r[n].w + 1); call(op); }
void SMPcore::op_mov_idpy_a() { sp = op_readpc(); dp = op_readdp(sp + 0) << 0; dp |= op_readdp(sp + 1) << 8; op_io(); dp += regs.y; op_readaddr<false>(dp); op_writeaddr(dp, regs.a); }
void R65816::op_pei_e() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp + 0); aa.h = op_readdp(dp + 1); op_writestackn(aa.h); L op_writestackn(aa.l); regs.s.h = 0x01; }
template<void (R65816::*op)()> void R65816::op_read_idpy_b() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp + 0); aa.h = op_readdp(dp + 1); op_io_cond4(aa.w, aa.w + regs.y.w); L rd.l = op_readdbr(aa.w + regs.y.w); call(op); }
void CPUcore::op_sta_idpx_w() { dp = op_readpc(); op_io_cond2(); op_io(); aa.l = op_readdp(dp + regs.x.w + 0); aa.h = op_readdp(dp + regs.x.w + 1); op_writedbr(aa.w + 0, regs.a.l); L op_writedbr(aa.w + 1, regs.a.h); }
template<void (R65816::*op)()> void R65816::op_read_idp_w() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp + 0); aa.h = op_readdp(dp + 1); rd.l = op_readdbr(aa.w + 0); L rd.h = op_readdbr(aa.w + 1); call(op); }
void SMP::op_mov_a_idpx() { dp = op_readpc() + regs.x; op_io(); sp = op_readdp(dp + 0) << 0; sp |= op_readdp(dp + 1) << 8; regs.a = op_readaddr(sp); regs.p.n = (regs.a & 0x80); regs.p.z = (regs.a == 0); }
alwaysinline void SMP::op_mov_idpy_a() { sp = op_readpc(); dp = op_readdp(sp + 0) << 0; dp |= op_readdp(sp + 1) << 8; op_io(); dp += regs.y; op_readaddr(dp); op_writeaddr(dp, regs.a); }
alwaysinline void SMP::op_mov_a_idpy() { dp = op_readpc(); op_io(); sp = op_readdp(dp + 0) << 0; sp |= op_readdp(dp + 1) << 8; regs.a = op_readaddr(sp + regs.y); regs.p.n = (regs.a & 0x80); regs.p.z = (regs.a == 0); }
void SMP::op_read_dp_dp() { sp = op_readpc(); rd = op_readdp(sp); dp = op_readpc(); wr = op_readdp(dp); wr = (this->*op)(wr, rd); static uint8 (SMP::*cmp)(uint8, uint8) = &SMP::op_cmp; (op != cmp) ? op_writedp(dp, wr) : op_io(); }
template<void (R65816::*op)()> void R65816::op_read_ildpy_b() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp + 0); aa.h = op_readdp(dp + 1); aa.b = op_readdp(dp + 2); L rd.l = op_readlong(aa.d + regs.y.w); call(op); }
void SMP::op_mov_idpx_a() { sp = op_readpc(); op_io(); sp += regs.x; dp = op_readdp(sp + 0) << 0; dp |= op_readdp(sp + 1) << 8; op_readaddr(dp); op_writeaddr(dp, regs.a); }
template<void (CPUcore::*op)()> void CPUcore::op_read_idpy_w() { dp = op_readpc(); op_io_cond2(); aa.l = op_readdp(dp + 0); aa.h = op_readdp(dp + 1); op_io_cond4(aa.w, aa.w + regs.y.w); rd.l = op_readdbr(aa.w + regs.y.w + 0); L rd.h = op_readdbr(aa.w + regs.y.w + 1); call(op); }
void SMPcore::op_adjustw_dp() { dp = op_readpc(); rd = op_readdp(dp) << 0; rd += adjust; op_writedp(dp++, rd); rd += op_readdp(dp) << 8; op_writedp(dp, rd >> 8); regs.p.n = (rd & 0x8000); regs.p.z = (rd == 0); }
template<int n, int i> alwaysinline void SMP::op_mov_reg_dpr() { sp = op_readpc(); op_io(); regs.r[n] = op_readdp(sp + regs.r[i]); regs.p.n = (regs.r[n] & 0x80); regs.p.z = (regs.r[n] == 0); }
template<void (R65816::*op)(), int n> void R65816::op_read_dpr_b() { dp = op_readpc(); op_io_cond2(); op_io(); L rd.l = op_readdp(dp + regs.r[n].w); call(op); }
alwaysinline void SMP::op_mov_a_ixinc() { op_io(); regs.a = op_readdp(regs.x++); op_io(); regs.p.n = (regs.a & 0x80); regs.p.z = (regs.a == 0); }
template<int n, int i> alwaysinline void SMP::op_mov_dpr_reg() { dp = op_readpc(); op_io(); dp += regs.r[i]; op_readdp(dp); op_writedp(dp, regs.r[n]); }
void SMPcore::op_adjust_dpx() { dp = op_readpc(); op_io(); rd = op_readdp(dp + regs.x); rd = (this->*op)(rd); op_writedp(dp + regs.x, rd); }
void SMPcore::op_mov_a_ixinc() { op_io(); regs.a = op_readdp(regs.x++); op_io(); regs.p.n = (regs.a & 0x80); regs.p.z = (regs.a == 0); }
template<int mask, int value> alwaysinline void SMP::op_bitbranch() { dp = op_readpc(); sp = op_readdp(dp); rd = op_readpc(); op_io(); if((bool)(sp & mask) != value) return; op_io(); op_io(); regs.pc += (int8)rd; }
alwaysinline void SMP::op_cbne_dp() { dp = op_readpc(); sp = op_readdp(dp); rd = op_readpc(); op_io(); if(regs.a == sp) return; op_io(); op_io(); regs.pc += (int8)rd; }
alwaysinline void SMP::op_dbnz_dp() { dp = op_readpc(); wr = op_readdp(dp); op_writedp(dp, --wr); rd = op_readpc(); if(wr == 0) return; op_io(); op_io(); regs.pc += (int8)rd; }
void SMP::op_read_a_ix() { op_io(); rd = op_readdp(regs.x); regs.a = (this->*op)(regs.a, rd); }
void SMP::op_read_a_dpx() { dp = op_readpc(); op_io(); rd = op_readdp(dp + regs.x); regs.a = (this->*op)(regs.a, rd); }