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