Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #5
0
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);
}
Exemple #6
0
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);
}
Exemple #7
0
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);
}
Exemple #10
0
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);
}
Exemple #11
0
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);
}
Exemple #12
0
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);
}
Exemple #13
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);
}
Exemple #14
0
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();
}
Exemple #16
0
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);
}
Exemple #17
0
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);
}
Exemple #18
0
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);
}
Exemple #19
0
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);
}
Exemple #20
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);
}
Exemple #21
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);
}
Exemple #22
0
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);
}
Exemple #23
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]);
}
Exemple #24
0
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);
}
Exemple #25
0
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);
}
Exemple #26
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;
}
Exemple #27
0
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;
}
Exemple #28
0
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);
}