1 #ifdef CPUCORE_CPP
2 
op_adjust_imm_b()3 template<int n, int adjust> void CPUcore::op_adjust_imm_b() {
4 L op_io_irq();
5   regs.r[n].l += adjust;
6   regs.p.n = (regs.r[n].l & 0x80);
7   regs.p.z = (regs.r[n].l == 0);
8 }
9 
op_adjust_imm_w()10 template<int n, int adjust> void CPUcore::op_adjust_imm_w() {
11 L op_io_irq();
12   regs.r[n].w += adjust;
13   regs.p.n = (regs.r[n].w & 0x8000);
14   regs.p.z = (regs.r[n].w == 0);
15 }
16 
op_asl_imm_b()17 void CPUcore::op_asl_imm_b() {
18 L op_io_irq();
19   regs.p.c = (regs.a.l & 0x80);
20   regs.a.l <<= 1;
21   regs.p.n = (regs.a.l & 0x80);
22   regs.p.z = (regs.a.l == 0);
23 }
24 
op_asl_imm_w()25 void CPUcore::op_asl_imm_w() {
26 L op_io_irq();
27   regs.p.c = (regs.a.w & 0x8000);
28   regs.a.w <<= 1;
29   regs.p.n = (regs.a.w & 0x8000);
30   regs.p.z = (regs.a.w == 0);
31 }
32 
op_lsr_imm_b()33 void CPUcore::op_lsr_imm_b() {
34 L op_io_irq();
35   regs.p.c = (regs.a.l & 0x01);
36   regs.a.l >>= 1;
37   regs.p.n = (regs.a.l & 0x80);
38   regs.p.z = (regs.a.l == 0);
39 }
40 
op_lsr_imm_w()41 void CPUcore::op_lsr_imm_w() {
42 L op_io_irq();
43   regs.p.c = (regs.a.w & 0x0001);
44   regs.a.w >>= 1;
45   regs.p.n = (regs.a.w & 0x8000);
46   regs.p.z = (regs.a.w == 0);
47 }
48 
op_rol_imm_b()49 void CPUcore::op_rol_imm_b() {
50 L op_io_irq();
51   bool carry = regs.p.c;
52   regs.p.c = (regs.a.l & 0x80);
53   regs.a.l = (regs.a.l << 1) | carry;
54   regs.p.n = (regs.a.l & 0x80);
55   regs.p.z = (regs.a.l == 0);
56 }
57 
op_rol_imm_w()58 void CPUcore::op_rol_imm_w() {
59 L op_io_irq();
60   bool carry = regs.p.c;
61   regs.p.c = (regs.a.w & 0x8000);
62   regs.a.w = (regs.a.w << 1) | carry;
63   regs.p.n = (regs.a.w & 0x8000);
64   regs.p.z = (regs.a.w == 0);
65 }
66 
op_ror_imm_b()67 void CPUcore::op_ror_imm_b() {
68 L op_io_irq();
69   bool carry = regs.p.c;
70   regs.p.c = (regs.a.l & 0x01);
71   regs.a.l = (carry << 7) | (regs.a.l >> 1);
72   regs.p.n = (regs.a.l & 0x80);
73   regs.p.z = (regs.a.l == 0);
74 }
75 
op_ror_imm_w()76 void CPUcore::op_ror_imm_w() {
77 L op_io_irq();
78   bool carry = regs.p.c;
79   regs.p.c = (regs.a.w & 0x0001);
80   regs.a.w = (carry << 15) | (regs.a.w >> 1);
81   regs.p.n = (regs.a.w & 0x8000);
82   regs.p.z = (regs.a.w == 0);
83 }
84 
op_adjust_addr_b()85 template<void (CPUcore::*op)()> void CPUcore::op_adjust_addr_b() {
86   aa.l = op_readpc();
87   aa.h = op_readpc();
88   rd.l = op_readdbr(aa.w);
89   op_io();
90   call(op);
91 L op_writedbr(aa.w, rd.l);
92 }
93 
op_adjust_addr_w()94 template<void (CPUcore::*op)()> void CPUcore::op_adjust_addr_w() {
95   aa.l = op_readpc();
96   aa.h = op_readpc();
97   rd.l = op_readdbr(aa.w + 0);
98   rd.h = op_readdbr(aa.w + 1);
99   op_io();
100   call(op);
101   op_writedbr(aa.w + 1, rd.h);
102 L op_writedbr(aa.w + 0, rd.l);
103 }
104 
op_adjust_addrx_b()105 template<void (CPUcore::*op)()> void CPUcore::op_adjust_addrx_b() {
106   aa.l = op_readpc();
107   aa.h = op_readpc();
108   op_io();
109   rd.l = op_readdbr(aa.w + regs.x.w);
110   op_io();
111   call(op);
112 L op_writedbr(aa.w + regs.x.w, rd.l);
113 }
114 
op_adjust_addrx_w()115 template<void (CPUcore::*op)()> void CPUcore::op_adjust_addrx_w() {
116   aa.l = op_readpc();
117   aa.h = op_readpc();
118   op_io();
119   rd.l = op_readdbr(aa.w + regs.x.w + 0);
120   rd.h = op_readdbr(aa.w + regs.x.w + 1);
121   op_io();
122   call(op);
123   op_writedbr(aa.w + regs.x.w + 1, rd.h);
124 L op_writedbr(aa.w + regs.x.w + 0, rd.l);
125 }
126 
op_adjust_dp_b()127 template<void (CPUcore::*op)()> void CPUcore::op_adjust_dp_b() {
128   dp = op_readpc();
129   op_io_cond2();
130   rd.l = op_readdp(dp);
131   op_io();
132   call(op);
133 L op_writedp(dp, rd.l);
134 }
135 
op_adjust_dp_w()136 template<void (CPUcore::*op)()> void CPUcore::op_adjust_dp_w() {
137   dp = op_readpc();
138   op_io_cond2();
139   rd.l = op_readdp(dp + 0);
140   rd.h = op_readdp(dp + 1);
141   op_io();
142   call(op);
143   op_writedp(dp + 1, rd.h);
144 L op_writedp(dp + 0, rd.l);
145 }
146 
op_adjust_dpx_b()147 template<void (CPUcore::*op)()> void CPUcore::op_adjust_dpx_b() {
148   dp = op_readpc();
149   op_io_cond2();
150   op_io();
151   rd.l = op_readdp(dp + regs.x.w);
152   op_io();
153   call(op);
154 L op_writedp(dp + regs.x.w, rd.l);
155 }
156 
op_adjust_dpx_w()157 template<void (CPUcore::*op)()> void CPUcore::op_adjust_dpx_w() {
158   dp = op_readpc();
159   op_io_cond2();
160   op_io();
161   rd.l = op_readdp(dp + regs.x.w + 0);
162   rd.h = op_readdp(dp + regs.x.w + 1);
163   op_io();
164   call(op);
165   op_writedp(dp + regs.x.w + 1, rd.h);
166 L op_writedp(dp + regs.x.w + 0, rd.l);
167 }
168 
169 #endif
170