Ejemplo n.º 1
0
 public SMPCoreOpResult op_nop(SMPCoreOpArgument args)
 {
     op_io();
     return null;
 }
Ejemplo n.º 2
0
 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 };
 }
Ejemplo n.º 3
0
 public SMPCoreOpResult op_wait(SMPCoreOpArgument args)
 {
     while (true)
     {
         op_io();
         op_io();
     }
 }
Ejemplo n.º 4
0
 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 };
 }
Ejemplo n.º 5
0
 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;
 }
Ejemplo n.º 6
0
 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;
 }
Ejemplo n.º 7
0
 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 };
 }
Ejemplo n.º 8
0
 public SMPCoreOpResult op_pop_p(SMPCoreOpArgument args)
 {
     op_io();
     op_io();
     regs.p.Assign(op_readstack());
     return null;
 }
Ejemplo n.º 9
0
 public SMPCoreOpResult op_pop_reg(SMPCoreOpArgument args)
 {
     op_io();
     op_io();
     regs.r[args.n] = op_readstack();
     return null;
 }
Ejemplo n.º 10
0
 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;
 }
Ejemplo n.º 11
0
 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;
 }
Ejemplo n.º 12
0
 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 };
 }
Ejemplo n.º 13
0
 public SMPCoreOpResult op_notc(SMPCoreOpArgument args)
 {
     op_io();
     op_io();
     regs.p.c = !regs.p.c;
     return null;
 }
Ejemplo n.º 14
0
 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;
 }
Ejemplo n.º 15
0
 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;
 }
Ejemplo n.º 16
0
 public SMPCoreOpResult op_push_p(SMPCoreOpArgument args)
 {
     op_io();
     op_io();
     op_writestack((byte)regs.p);
     return null;
 }
Ejemplo n.º 17
0
 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;
 }
Ejemplo n.º 18
0
 public SMPCoreOpResult op_push_reg(SMPCoreOpArgument args)
 {
     op_io();
     op_io();
     op_writestack(regs.r[args.n]);
     return null;
 }
Ejemplo n.º 19
0
 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;
 }
Ejemplo n.º 20
0
 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;
 }
Ejemplo n.º 21
0
 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 };
 }
Ejemplo n.º 22
0
 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;
 }
Ejemplo n.º 23
0
 public SMPCoreOpResult op_setbit(SMPCoreOpArgument args)
 {
     op_io();
     regs.p.Assign((byte)(((uint)regs.p & ~args.mask) | (uint)args.value));
     return null;
 }
Ejemplo n.º 24
0
 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;
 }
Ejemplo n.º 25
0
 public SMPCoreOpResult op_seti(SMPCoreOpArgument args)
 {
     op_io();
     op_io();
     regs.p.i = Convert.ToBoolean(args.value);
     return null;
 }
Ejemplo n.º 26
0
 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;
 }
Ejemplo n.º 27
0
 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;
 }
Ejemplo n.º 28
0
 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;
 }
Ejemplo n.º 29
0
 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;
 }
Ejemplo n.º 30
0
 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;
 }