public SMPCoreOpResult op_nop(SMPCoreOpArgument args) { op_io(); return null; }
public SMPCoreOpResult op_subw(SMPCoreOpArgument args) { ushort r; regs.p.c = Convert.ToBoolean(1); r = op_sbc(new SMPCoreOpArgument() { x_byte = (byte)args.x_ushort, y_byte = (byte)args.y_ushort }).result_byte; r |= (ushort)(op_sbc(new SMPCoreOpArgument() { x_byte = (byte)(args.x_ushort >> 8), y_byte = (byte)(args.y_ushort >> 8) }).result_byte << 8); regs.p.z = r == 0; return new SMPCoreOpResult() { result_ushort = r }; }
public SMPCoreOpResult op_wait(SMPCoreOpArgument args) { while (true) { op_io(); op_io(); } }
public SMPCoreOpResult op_sbc(SMPCoreOpArgument args) { int r = args.x_byte - args.y_byte - Convert.ToInt32(!regs.p.c); regs.p.n = Convert.ToBoolean(r & 0x80); regs.p.v = Convert.ToBoolean((args.x_byte ^ args.y_byte) & (args.x_byte ^ r) & 0x80); regs.p.h = !Convert.ToBoolean(((args.x_byte ^ args.y_byte ^ r) & 0x10)); regs.p.z = (byte)r == 0; regs.p.c = r >= 0; return new SMPCoreOpResult() { result_byte = (byte)r }; }
public SMPCoreOpResult op_setbit_dp(SMPCoreOpArgument args) { dp = op_readpc(); rd = op_readdp((byte)dp); rd = (ushort)(Convert.ToBoolean(args.op) ? rd | args.value : rd & ~args.value); op_writedp((byte)dp, (byte)rd); return null; }
public SMPCoreOpResult op_read_ya_dp(SMPCoreOpArgument args) { dp = op_readpc(); rd = (ushort)(op_readdp((byte)(dp + 0)) << 0); op_io(); rd |= (ushort)(op_readdp((byte)(dp + 1)) << 8); regs.ya.Assign(args.op_func.Invoke(new SMPCoreOpArgument() { x_ushort = (ushort)regs.ya, y_ushort = rd }).result_ushort); return null; }
public SMPCoreOpResult op_rol(SMPCoreOpArgument args) { uint carry = Convert.ToUInt32(regs.p.c); regs.p.c = Convert.ToBoolean(args.x_byte & 0x80); args.x_byte = (byte)((uint)(args.x_byte << 1) | carry); regs.p.n = Convert.ToBoolean(args.x_byte & 0x80); regs.p.z = args.x_byte == 0; return new SMPCoreOpResult() { result_byte = args.x_byte }; }
public SMPCoreOpResult op_pop_p(SMPCoreOpArgument args) { op_io(); op_io(); regs.p.Assign(op_readstack()); return null; }
public SMPCoreOpResult op_pop_reg(SMPCoreOpArgument args) { op_io(); op_io(); regs.r[args.n] = op_readstack(); return null; }
public SMPCoreOpResult op_or1_bit(SMPCoreOpArgument args) { dp = (ushort)(op_readpc() << 0); dp |= (ushort)(op_readpc() << 8); bit = (ushort)(dp >> 13); dp &= 0x1fff; rd = op_readaddr(dp); op_io(); regs.p.c = Convert.ToBoolean(Convert.ToInt32(regs.p.c) | (Convert.ToInt32(Convert.ToBoolean(rd & (1 << bit))) ^ args.op)); return null; }
public SMPCoreOpResult op_pcall(SMPCoreOpArgument args) { rd = op_readpc(); op_io(); op_io(); op_writestack((byte)(regs.pc >> 8)); op_writestack((byte)(regs.pc >> 0)); regs.pc = (ushort)(0xff00 | rd); return null; }
public SMPCoreOpResult op_or(SMPCoreOpArgument args) { args.x_byte |= args.y_byte; regs.p.n = Convert.ToBoolean(args.x_byte & 0x80); regs.p.z = args.x_byte == 0; return new SMPCoreOpResult() { result_byte = args.x_byte }; }
public SMPCoreOpResult op_notc(SMPCoreOpArgument args) { op_io(); op_io(); regs.p.c = !regs.p.c; return null; }
public SMPCoreOpResult op_not1_bit(SMPCoreOpArgument args) { dp = (ushort)(op_readpc() << 0); dp |= (ushort)(op_readpc() << 8); bit = (ushort)(dp >> 13); dp &= 0x1fff; rd = op_readaddr(dp); rd ^= (ushort)(1 << bit); op_writeaddr(dp, (byte)rd); return null; }
public SMPCoreOpResult op_read_reg_addr(SMPCoreOpArgument args) { dp = (ushort)(op_readpc() << 0); dp |= (ushort)(op_readpc() << 8); rd = op_readaddr(dp); regs.r[args.n] = args.op_func.Invoke(new SMPCoreOpArgument() { x_byte = regs.r[args.n], y_byte = (byte)rd }).result_byte; return null; }
public SMPCoreOpResult op_push_p(SMPCoreOpArgument args) { op_io(); op_io(); op_writestack((byte)regs.p); return null; }
public SMPCoreOpResult op_read_reg_dp(SMPCoreOpArgument args) { dp = op_readpc(); rd = op_readdp((byte)dp); regs.r[args.n] = args.op_func.Invoke(new SMPCoreOpArgument() { x_byte = regs.r[args.n], y_byte = (byte)rd }).result_byte; return null; }
public SMPCoreOpResult op_push_reg(SMPCoreOpArgument args) { op_io(); op_io(); op_writestack(regs.r[args.n]); return null; }
public SMPCoreOpResult op_reti(SMPCoreOpArgument args) { regs.p.Assign(op_readstack()); rd = (ushort)(op_readstack() << 0); rd |= (ushort)(op_readstack() << 8); op_io(); op_io(); regs.pc = rd; return null; }
public SMPCoreOpResult op_read_a_addrr(SMPCoreOpArgument args) { dp = (ushort)(op_readpc() << 0); dp |= (ushort)(op_readpc() << 8); op_io(); rd = op_readaddr((ushort)(dp + regs.r[args.i])); regs.a.Array[regs.a.Offset] = args.op_func.Invoke(new SMPCoreOpArgument() { x_byte = regs.a.Array[regs.a.Offset], y_byte = (byte)rd }).result_byte; return null; }
public SMPCoreOpResult op_ror(SMPCoreOpArgument args) { uint carry = Convert.ToUInt32(regs.p.c) << 7; regs.p.c = Convert.ToBoolean(args.x_byte & 0x01); args.x_byte = (byte)(carry | (uint)(args.x_byte >> 1)); regs.p.n = Convert.ToBoolean(args.x_byte & 0x80); regs.p.z = args.x_byte == 0; return new SMPCoreOpResult() { result_byte = args.x_byte }; }
public SMPCoreOpResult op_read_a_idpy(SMPCoreOpArgument args) { dp = op_readpc(); op_io(); sp = (ushort)(op_readdp((byte)(dp + 0)) << 0); sp |= (ushort)(op_readdp((byte)(dp + 1)) << 8); rd = op_readaddr((ushort)(sp + regs.y.Array[regs.y.Offset])); regs.a.Array[regs.a.Offset] = args.op_func.Invoke(new SMPCoreOpArgument() { x_byte = regs.a.Array[regs.a.Offset], y_byte = (byte)rd }).result_byte; return null; }
public SMPCoreOpResult op_setbit(SMPCoreOpArgument args) { op_io(); regs.p.Assign((byte)(((uint)regs.p & ~args.mask) | (uint)args.value)); return null; }
public SMPCoreOpResult op_read_a_ix(SMPCoreOpArgument args) { op_io(); rd = op_readdp(regs.x.Array[regs.x.Offset]); regs.a.Array[regs.a.Offset] = args.op_func.Invoke(new SMPCoreOpArgument() { x_byte = regs.a.Array[regs.a.Offset], y_byte = (byte)rd }).result_byte; return null; }
public SMPCoreOpResult op_seti(SMPCoreOpArgument args) { op_io(); op_io(); regs.p.i = Convert.ToBoolean(args.value); return null; }
public SMPCoreOpResult op_read_dp_dp(SMPCoreOpArgument args) { sp = op_readpc(); rd = op_readdp((byte)sp); dp = op_readpc(); wr = op_readdp((byte)dp); wr = args.op_func.Invoke(new SMPCoreOpArgument() { x_byte = (byte)wr, y_byte = (byte)rd }).result_byte; SMPCoreOp cmp = op_cmp; if (args.op_func != cmp) { op_writedp((byte)dp, (byte)wr); } else { op_io(); } return null; }
public SMPCoreOpResult op_tcall(SMPCoreOpArgument args) { dp = (ushort)(0xffde - (args.n << 1)); rd = (ushort)(op_readaddr((ushort)(dp + 0)) << 0); rd |= (ushort)(op_readaddr((ushort)(dp + 1)) << 8); op_io(); op_io(); op_io(); op_writestack((byte)(regs.pc >> 8)); op_writestack((byte)(regs.pc >> 0)); regs.pc = rd; return null; }
public SMPCoreOpResult op_read_ix_iy(SMPCoreOpArgument args) { op_io(); rd = op_readdp(regs.y.Array[regs.y.Offset]); wr = op_readdp(regs.x.Array[regs.x.Offset]); wr = args.op_func.Invoke(new SMPCoreOpArgument() { x_byte = (byte)wr, y_byte = (byte)rd }).result_byte; SMPCoreOp cmp = op_cmp; if (args.op_func != cmp) { op_writedp(regs.x.Array[regs.x.Offset], (byte)wr); } else { op_io(); } return null; }
public SMPCoreOpResult op_xcn(SMPCoreOpArgument args) { op_io(); op_io(); op_io(); op_io(); regs.a.Array[regs.a.Offset] = (byte)((regs.a.Array[regs.a.Offset] >> 4) | (regs.a.Array[regs.a.Offset] << 4)); regs.p.n = Convert.ToBoolean(regs.a.Array[regs.a.Offset] & 0x80); regs.p.z = (regs.a.Array[regs.a.Offset] == 0); return null; }
public SMPCoreOpResult op_mul_ya(SMPCoreOpArgument args) { op_io(); op_io(); op_io(); op_io(); op_io(); op_io(); op_io(); op_io(); ya = (ushort)(regs.y.Array[regs.y.Offset] * regs.a.Array[regs.a.Offset]); regs.a.Array[regs.a.Offset] = (byte)ya; regs.y.Array[regs.y.Offset] = (byte)(ya >> 8); //result is set based on y (high-byte) only regs.p.n = Convert.ToBoolean(Convert.ToInt32(Convert.ToBoolean(regs.y.Array[regs.y.Offset] & 0x80))); regs.p.z = (regs.y.Array[regs.y.Offset] == 0); return null; }