Exemple #1
0
void R65816::op_jmp_iaddr() {
  aa.l = op_readpc();
  aa.h = op_readpc();
  rd.l = op_readaddr(aa.w + 0);
L rd.h = op_readaddr(aa.w + 1);
  regs.pc.w = rd.w;
}
Exemple #2
0
void R65816::op_jmp_iladdr() {
  aa.l = op_readpc();
  aa.h = op_readpc();
  rd.l = op_readaddr(aa.w + 0);
  rd.h = op_readaddr(aa.w + 1);
L rd.b = op_readaddr(aa.w + 2);
  regs.pc.d = rd.d & 0xffffff;
}
Exemple #3
0
alwaysinline void SMP::op_jmp_iaddrx() {
  dp  = op_readpc() << 0;
  dp |= op_readpc() << 8;
  op_io();
  dp += regs.x;
  rd  = op_readaddr(dp + 0) << 0;
  rd |= op_readaddr(dp + 1) << 8;
  regs.pc = rd;
}
Exemple #4
0
void SMPcore::op_adjust_addr_a() {
  dp  = op_readpc() << 0;
  dp |= op_readpc() << 8;
  rd  = op_readaddr(dp);
  regs.p.n = ((regs.a - rd) & 0x80);
  regs.p.z = ((regs.a - rd) == 0);
  op_readaddr(dp);
  op_writeaddr(dp, (op ? rd | regs.a : rd & ~regs.a));
}
Exemple #5
0
template<int n> alwaysinline void SMP::op_tcall() {
  dp  = 0xffde - (n << 1);
  rd  = op_readaddr(dp + 0) << 0;
  rd |= op_readaddr(dp + 1) << 8;
  op_io();
  op_io();
  op_io();
  op_writestack(regs.pc >> 8);
  op_writestack(regs.pc >> 0);
  regs.pc = rd;
}
Exemple #6
0
alwaysinline void SMP::op_brk() {
  rd  = op_readaddr(0xffde) << 0;
  rd |= op_readaddr(0xffdf) << 8;
  op_io();
  op_io();
  op_writestack(regs.pc >> 8);
  op_writestack(regs.pc >> 0);
  op_writestack(regs.p);
  regs.pc = rd;
  regs.p.b = 1;
  regs.p.i = 0;
}
Exemple #7
0
void SMPcore::op_adjust_addr() {
  dp  = op_readpc() << 0;
  dp |= op_readpc() << 8;
  rd  = op_readaddr(dp);
  rd  = (this->*op)(rd);
  op_writeaddr(dp, rd);
}
template<int n> alwaysinline void SMP::op_mov_reg_addr() {
  sp  = op_readpc() << 0;
  sp |= op_readpc() << 8;
  regs.r[n] = op_readaddr(sp);
  regs.p.n = (regs.r[n] & 0x80);
  regs.p.z = (regs.r[n] == 0);
}
void SMP::op_read_a_addrr() {
  dp  = op_readpc() << 0;
  dp |= op_readpc() << 8;
  op_io();
  rd = op_readaddr(dp + regs.r[i]);
  regs.a = (this->*op)(regs.a, rd);
}
void SMP::op_read_a_idpy() {
  dp  = op_readpc();
  op_io();
  sp  = op_readdp(dp + 0) << 0;
  sp |= op_readdp(dp + 1) << 8;
  rd  = op_readaddr(sp + regs.y);
  regs.a = (this->*op)(regs.a, rd);
}
template<int op> void SMP::op_and1_bit() {
  dp  = op_readpc() << 0;
  dp |= op_readpc() << 8;
  bit = dp >> 13;
  dp &= 0x1fff;
  rd  = op_readaddr(dp);
  regs.p.c = regs.p.c & ((bool)(rd & (1 << bit)) ^ op);
}
Exemple #12
0
template<int i> alwaysinline void SMP::op_mov_a_addrr() {
  sp  = op_readpc() << 0;
  sp |= op_readpc() << 8;
  op_io();
  regs.a = op_readaddr(sp + regs.r[i]);
  regs.p.n = (regs.a & 0x80);
  regs.p.z = (regs.a == 0);
}
Exemple #13
0
alwaysinline void SMP::op_mov1_c_bit() {
  sp  = op_readpc() << 0;
  sp |= op_readpc() << 8;
  bit = sp >> 13;
  sp &= 0x1fff;
  rd = op_readaddr(sp);
  regs.p.c = (rd & (1 << bit));
}
Exemple #14
0
template<int i> alwaysinline void SMP::op_mov_addrr_a() {
  dp  = op_readpc() << 0;
  dp |= op_readpc() << 8;
  op_io();
  dp += regs.r[i];
  op_readaddr(dp);
  op_writeaddr(dp, regs.a);
}
Exemple #15
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);
}
void SMP::op_not1_bit() {
  dp  = op_readpc() << 0;
  dp |= op_readpc() << 8;
  bit = dp >> 13;
  dp &= 0x1fff;
  rd  = op_readaddr(dp);
  rd ^= 1 << bit;
  op_writeaddr(dp, rd);
}
void SMP::op_eor1_bit() {
  dp  = op_readpc() << 0;
  dp |= op_readpc() << 8;
  bit = dp >> 13;
  dp &= 0x1fff;
  rd  = op_readaddr(dp);
  op_io();
  regs.p.c = regs.p.c ^ (bool)(rd & (1 << bit));
}
Exemple #18
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);
}
Exemple #19
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 #20
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 #21
0
alwaysinline void SMP::op_mov1_bit_c() {
  dp  = op_readpc() << 0;
  dp |= op_readpc() << 8;
  bit = dp >> 13;
  dp &= 0x1fff;
  rd = op_readaddr(dp);
  (regs.p.c) ? rd |= (1 << bit) : rd &= ~(1 << bit);
  op_io();
  op_writeaddr(dp, rd);
}
void SMP::op_read_reg_addr() {
  dp  = op_readpc() << 0;
  dp |= op_readpc() << 8;
  rd  = op_readaddr(dp);
  regs.r[n] = (this->*op)(regs.r[n], rd);
}
Exemple #23
0
template<int n> alwaysinline void SMP::op_mov_addr_reg() {
  dp  = op_readpc() << 0;
  dp |= op_readpc() << 8;
  op_readaddr(dp);
  op_writeaddr(dp, regs.r[n]);
}