예제 #1
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_rts(CPUCoreOpArgument args)
 {
     op_io();
     op_io();
     rd.l = op_readstack();
     rd.h = op_readstack();
     last_cycle();
     op_io();
     regs.pc.w = ++rd.w;
 }
예제 #2
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_write_dp_w(CPUCoreOpArgument args)
 {
     int n = args.x;
     dp = op_readpc();
     op_io_cond2();
     op_writedp(dp + 0U, (byte)(regs.r[n] >> 0));
     last_cycle();
     op_writedp(dp + 1U, (byte)(regs.r[n] >> 8));
 }
예제 #3
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_xba(CPUCoreOpArgument args)
 {
     op_io();
     last_cycle();
     op_io();
     regs.a.l ^= regs.a.h;
     regs.a.h ^= regs.a.l;
     regs.a.l ^= regs.a.h;
     regs.p.n = Convert.ToBoolean(regs.a.l & 0x80);
     regs.p.z = (regs.a.l == 0);
 }
예제 #4
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_write_addr_b(CPUCoreOpArgument args)
 {
     int n = args.x;
     aa.l = op_readpc();
     aa.h = op_readpc();
     last_cycle();
     op_writedbr(aa.w, (byte)regs.r[n]);
 }
예제 #5
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_write_dpr_w(CPUCoreOpArgument args)
 {
     int n = args.x;
     int i = args.y;
     dp = op_readpc();
     op_io_cond2();
     op_io();
     op_writedp(dp + (uint)regs.r[i] + 0, (byte)(regs.r[n] >> 0));
     last_cycle();
     op_writedp(dp + (uint)regs.r[i] + 1, (byte)(regs.r[n] >> 8));
 }
예제 #6
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_txs_n(CPUCoreOpArgument args)
 {
     last_cycle();
     op_io_irq();
     regs.s.w = regs.x.w;
 }
예제 #7
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_wdm(CPUCoreOpArgument args)
 {
     last_cycle();
     op_readpc();
 }
예제 #8
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_sta_ildp_w(CPUCoreOpArgument args)
 {
     dp = op_readpc();
     op_io_cond2();
     aa.l = op_readdp(dp + 0U);
     aa.h = op_readdp(dp + 1U);
     aa.b = op_readdp(dp + 2U);
     op_writelong(aa.d + 0, regs.a.l);
     last_cycle();
     op_writelong(aa.d + 1, regs.a.h);
 }
예제 #9
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_sta_isry_w(CPUCoreOpArgument args)
 {
     sp = op_readpc();
     op_io();
     aa.l = op_readsp(sp + 0U);
     aa.h = op_readsp(sp + 1U);
     op_io();
     op_writedbr((uint)(aa.w + regs.y.w + 0), regs.a.l);
     last_cycle();
     op_writedbr((uint)(aa.w + regs.y.w + 1), regs.a.h);
 }
예제 #10
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_sta_idpy_b(CPUCoreOpArgument args)
 {
     dp = op_readpc();
     op_io_cond2();
     aa.l = op_readdp(dp + 0U);
     aa.h = op_readdp(dp + 1U);
     op_io();
     last_cycle();
     op_writedbr((uint)(aa.w + regs.y.w), regs.a.l);
 }
예제 #11
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_sta_idp_w(CPUCoreOpArgument args)
 {
     dp = op_readpc();
     op_io_cond2();
     aa.l = op_readdp(dp + 0U);
     aa.h = op_readdp(dp + 1U);
     op_writedbr(aa.w + 0U, regs.a.l);
     last_cycle();
     op_writedbr(aa.w + 1U, regs.a.h);
 }
예제 #12
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_sta_idpx_b(CPUCoreOpArgument args)
 {
     dp = op_readpc();
     op_io_cond2();
     op_io();
     aa.l = op_readdp((uint)(dp + regs.x.w + 0));
     aa.h = op_readdp((uint)(dp + regs.x.w + 1));
     last_cycle();
     op_writedbr(aa.w, regs.a.l);
 }
예제 #13
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
        public void op_sbc_w(CPUCoreOpArgument args)
        {
            int result;
            rd.w ^= 0xffff;

            if (!regs.p.d)
            {
                result = regs.a.w + rd.w + Convert.ToInt32(regs.p.c);
            }
            else
            {
                result = (regs.a.w & 0x000f) + (rd.w & 0x000f) + (Convert.ToInt32(regs.p.c) << 0);
                if (result <= 0x000f)
                {
                    result -= 0x0006;
                }
                regs.p.c = result > 0x000f;
                result = (regs.a.w & 0x00f0) + (rd.w & 0x00f0) + (Convert.ToInt32(regs.p.c) << 4) + (result & 0x000f);
                if (result <= 0x00ff)
                {
                    result -= 0x0060;
                }
                regs.p.c = result > 0x00ff;
                result = (regs.a.w & 0x0f00) + (rd.w & 0x0f00) + (Convert.ToInt32(regs.p.c) << 8) + (result & 0x00ff);
                if (result <= 0x0fff)
                {
                    result -= 0x0600;
                }
                regs.p.c = result > 0x0fff;
                result = (regs.a.w & 0xf000) + (rd.w & 0xf000) + (Convert.ToInt32(regs.p.c) << 12) + (result & 0x0fff);
            }

            regs.p.v = Convert.ToBoolean(~(regs.a.w ^ rd.w) & (regs.a.w ^ result) & 0x8000);
            if (regs.p.d && result <= 0xffff)
            {
                result -= 0x6000;
            }
            regs.p.c = result > 0xffff;
            regs.p.n = Convert.ToBoolean(result & 0x8000);
            regs.p.z = (ushort)result == 0;

            regs.a.w = (ushort)result;
        }
예제 #14
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
        public void op_sbc_b(CPUCoreOpArgument args)
        {
            int result;
            rd.l ^= 0xff;

            if (!regs.p.d)
            {
                result = regs.a.l + rd.l + Convert.ToInt32(regs.p.c);
            }
            else
            {
                result = (regs.a.l & 0x0f) + (rd.l & 0x0f) + (Convert.ToInt32(regs.p.c) << 0);
                if (result <= 0x0f)
                {
                    result -= 0x06;
                }
                regs.p.c = result > 0x0f;
                result = (regs.a.l & 0xf0) + (rd.l & 0xf0) + (Convert.ToInt32(regs.p.c) << 4) + (result & 0x0f);
            }

            regs.p.v = Convert.ToBoolean(~(regs.a.l ^ rd.l) & (regs.a.l ^ result) & 0x80);
            if (regs.p.d && result <= 0xff)
            {
                result -= 0x60;
            }
            regs.p.c = result > 0xff;
            regs.p.n = Convert.ToBoolean(result & 0x80);
            regs.p.z = (byte)result == 0;

            regs.a.l = (byte)result;
        }
예제 #15
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_tsx_w(CPUCoreOpArgument args)
 {
     last_cycle();
     op_io_irq();
     regs.x.w = regs.s.w;
     regs.p.n = Convert.ToBoolean(regs.x.w & 0x8000);
     regs.p.z = (regs.x.w == 0);
 }
예제 #16
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_sta_sr_w(CPUCoreOpArgument args)
 {
     sp = op_readpc();
     op_io();
     op_writesp(sp + 0U, regs.a.l);
     last_cycle();
     op_writesp(sp + 1U, regs.a.h);
 }
예제 #17
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_txs_e(CPUCoreOpArgument args)
 {
     last_cycle();
     op_io_irq();
     regs.s.l = regs.x.l;
 }
예제 #18
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_transfer_w(CPUCoreOpArgument args)
 {
     int from = args.x;
     int to = args.y;
     last_cycle();
     op_io_irq();
     regs.r[to].w = regs.r[from].w;
     regs.p.n = Convert.ToBoolean(regs.r[to].w & 0x8000);
     regs.p.z = (regs.r[to].w == 0);
 }
예제 #19
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_wai(CPUCoreOpArgument args)
 {
     regs.wai = true;
     while (regs.wai)
     {
         last_cycle();
         op_io();
     }
     op_io();
 }
예제 #20
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_trb_b(CPUCoreOpArgument args)
 {
     regs.p.z = (rd.l & regs.a.l) == 0;
     rd.l &= (byte)(~regs.a.l);
 }
예제 #21
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_write_addrr_w(CPUCoreOpArgument args)
 {
     int n = args.x;
     int i = args.y;
     aa.l = op_readpc();
     aa.h = op_readpc();
     op_io();
     op_writedbr(aa.w + (uint)regs.r[i] + 0, (byte)(regs.r[n] >> 0));
     last_cycle();
     op_writedbr(aa.w + (uint)regs.r[i] + 1, (byte)(regs.r[n] >> 8));
 }
예제 #22
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_trb_w(CPUCoreOpArgument args)
 {
     regs.p.z = (rd.w & regs.a.w) == 0;
     rd.w &= (ushort)(~regs.a.w);
 }
예제 #23
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_write_addr_w(CPUCoreOpArgument args)
 {
     int n = args.x;
     aa.l = op_readpc();
     aa.h = op_readpc();
     op_writedbr(aa.w + 0U, (byte)(regs.r[n] >> 0));
     last_cycle();
     op_writedbr(aa.w + 1U, (byte)(regs.r[n] >> 8));
 }
예제 #24
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_tsb_b(CPUCoreOpArgument args)
 {
     regs.p.z = (rd.l & regs.a.l) == 0;
     rd.l |= regs.a.l;
 }
예제 #25
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_write_dp_b(CPUCoreOpArgument args)
 {
     int n = args.x;
     dp = op_readpc();
     op_io_cond2();
     last_cycle();
     op_writedp(dp, (byte)regs.r[n]);
 }
예제 #26
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_tsb_w(CPUCoreOpArgument args)
 {
     regs.p.z = (rd.w & regs.a.w) == 0;
     rd.w |= regs.a.w;
 }
예제 #27
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_write_longr_w(CPUCoreOpArgument args)
 {
     int i = args.x;
     aa.l = op_readpc();
     aa.h = op_readpc();
     aa.b = op_readpc();
     op_writelong(aa.d + (uint)regs.r[i] + 0, regs.a.l);
     last_cycle();
     op_writelong(aa.d + (uint)regs.r[i] + 1, regs.a.h);
 }
예제 #28
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_tsx_b(CPUCoreOpArgument args)
 {
     last_cycle();
     op_io_irq();
     regs.x.l = regs.s.l;
     regs.p.n = Convert.ToBoolean(regs.x.l & 0x80);
     regs.p.z = (regs.x.l == 0);
 }
예제 #29
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_xce(CPUCoreOpArgument args)
 {
     last_cycle();
     op_io_irq();
     bool carry = regs.p.c;
     regs.p.c = regs.e;
     regs.e = carry;
     if (regs.e)
     {
         regs.p.Assign((byte)(regs.p | 0x30));
         regs.s.h = 0x01;
     }
     if (regs.p.x)
     {
         regs.x.h = 0x00;
         regs.y.h = 0x00;
     }
     update_table();
 }
예제 #30
0
파일: CPUCore.cs 프로젝트: MiLO83/snesbox
 public void op_rtl_e(CPUCoreOpArgument args)
 {
     op_io();
     op_io();
     rd.l = op_readstackn();
     rd.h = op_readstackn();
     last_cycle();
     rd.b = op_readstackn();
     regs.pc.b = rd.b;
     regs.pc.w = ++rd.w;
     regs.s.h = 0x01;
 }