summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvin <git@vineetk.net>2024-06-09 16:02:04 +0530
committervin <git@vineetk.net>2024-06-09 16:02:04 +0530
commit4db0a8163e6641923466da99ff84d34dfdca44fa (patch)
tree8c00e52c2347f6be56971dd0aba1effc1c3bb02e
parent858cbfba48145ff9303a4127cb73911fc8904462 (diff)
implement some more instructions and branching?
-rw-r--r--cpu.c89
1 files changed, 64 insertions, 25 deletions
diff --git a/cpu.c b/cpu.c
index 3bbfc42..c5b35f6 100644
--- a/cpu.c
+++ b/cpu.c
@@ -76,6 +76,7 @@ opcode_arg(enum addressing_mode mode)
76 76
77 switch (mode) { 77 switch (mode) {
78 case AM_IMM: 78 case AM_IMM:
79 case AM_REL:
79 val = arg; 80 val = arg;
80 break; 81 break;
81 case AM_ZP: 82 case AM_ZP:
@@ -128,13 +129,23 @@ adc(uint8_t arg)
128static void 129static void
129and(uint8_t arg) 130and(uint8_t arg)
130{ 131{
131/* TODO: complete this */ 132 regs.a &= arg;
133
134 STATUS_UPDATE_ZERO(regs.a);
135 STATUS_UPDATE_NEGATIVE(regs.a);
132} 136}
133 137
134static void 138static void
135asl(uint8_t arg) 139asl(uint8_t arg)
136{ 140{
137/* TODO: complete this */ 141 uint16_t tmp;
142
143 tmp = regs.a << 1;
144 regs.a = tmp & 0xFF;
145
146 regs.status.carry = tmp > 0xFF;
147 STATUS_UPDATE_ZERO(regs.a);
148 STATUS_UPDATE_NEGATIVE(regs.a);
138} 149}
139 150
140static void 151static void
@@ -152,43 +163,51 @@ bbs(uint8_t arg)
152static void 163static void
153bcc(uint8_t arg) 164bcc(uint8_t arg)
154{ 165{
155/* TODO: complete this */ 166 if (regs.status.carry == 0)
167 regs.pc += arg;
156} 168}
157 169
158static void 170static void
159bcs(uint8_t arg) 171bcs(uint8_t arg)
160{ 172{
161/* TODO: complete this */ 173 if (regs.status.carry == 1)
174 regs.pc += arg;
162} 175}
163 176
164static void 177static void
165beq(uint8_t arg) 178beq(uint8_t arg)
166{ 179{
167/* TODO: complete this */ 180 if (regs.status.zero == 1)
181 regs.pc += arg;
168} 182}
169 183
170static void 184static void
171bit(uint8_t arg) 185bit(uint8_t arg)
172{ 186{
173/* TODO: complete this */ 187 regs.status.zero = (regs.a & arg) == 0;
188 regs.status.overflow = (arg & (1 << 6)) > 0;
189 regs.status.negative = (arg & (1 << 7)) > 0;
174} 190}
175 191
176static void 192static void
177bmi(uint8_t arg) 193bmi(uint8_t arg)
178{ 194{
179/* TODO: complete this */ 195 if (regs.status.negative == 1)
196 regs.pc += arg;
180} 197}
181 198
182static void 199static void
183bne(uint8_t arg) 200bne(uint8_t arg)
184{ 201{
185/* TODO: complete this */ 202 if (regs.status.zero == 0)
203 regs.pc += arg;
186} 204}
187 205
188static void 206static void
189bpl(uint8_t arg) 207bpl(uint8_t arg)
190{ 208{
191/* TODO: complete this */ 209 if (regs.status.negative == 0)
210 regs.pc += arg;
192} 211}
193 212
194static void 213static void
@@ -198,7 +217,7 @@ bra(uint8_t arg)
198} 217}
199 218
200static void 219static void
201brk() 220brk(void)
202{ 221{
203 /* TODO: push regs.pc and regs.status to stack and load IRQ vector */ 222 /* TODO: push regs.pc and regs.status to stack and load IRQ vector */
204 regs.status.brk = 1; 223 regs.status.brk = 1;
@@ -208,55 +227,75 @@ brk()
208static void 227static void
209bvc(uint8_t arg) 228bvc(uint8_t arg)
210{ 229{
211/* TODO: complete this */ 230 if (regs.status.overflow == 0)
231 regs.pc += arg;
212} 232}
213 233
214static void 234static void
215bvs(uint8_t arg) 235bvs(uint8_t arg)
216{ 236{
217/* TODO: complete this */ 237 if (regs.status.overflow == 1)
238 regs.pc += arg;
218} 239}
219 240
220static void 241static void
221clc(uint8_t arg) 242clc(void)
222{ 243{
223/* TODO: complete this */ 244 regs.status.carry = 0;
224} 245}
225 246
226static void 247static void
227cld(uint8_t arg) 248cld(void)
228{ 249{
229/* TODO: complete this */ 250 regs.status.decimal_mode = 0;
230} 251}
231 252
232static void 253static void
233cli(uint8_t arg) 254cli(void)
234{ 255{
235/* TODO: complete this */ 256 regs.status.interrupt_disable = 0;
236} 257}
237 258
238static void 259static void
239clv(uint8_t arg) 260clv(void)
240{ 261{
241/* TODO: complete this */ 262 regs.status.overflow = 0;
242} 263}
243 264
244static void 265static void
245cmp(uint8_t arg) 266cmp(uint8_t arg)
246{ 267{
247/* TODO: complete this */ 268 uint8_t tmp;
269
270 tmp = regs.a - arg;
271
272 regs.status.carry = regs.a >= arg;
273 regs.status.zero = regs.a == arg;
274 regs.status.negative = (tmp & (1 << 7)) > 0;
248} 275}
249 276
250static void 277static void
251cpx(uint8_t arg) 278cpx(uint8_t arg)
252{ 279{
253/* TODO: complete this */ 280 uint8_t tmp;
281
282 tmp = regs.x - arg;
283
284 regs.status.carry = regs.x >= arg;
285 regs.status.zero = regs.x == arg;
286 regs.status.negative = (tmp & (1 << 7)) > 0;
254} 287}
255 288
256static void 289static void
257cpy(uint8_t arg) 290cpy(uint8_t arg)
258{ 291{
259/* TODO: complete this */ 292 uint8_t tmp;
293
294 tmp = regs.y - arg;
295
296 regs.status.carry = regs.y >= arg;
297 regs.status.zero = regs.y == arg;
298 regs.status.negative = (tmp & (1 << 7)) > 0;
260} 299}
261 300
262static void 301static void
@@ -290,7 +329,7 @@ inc(uint8_t arg)
290} 329}
291 330
292static void 331static void
293inx() 332inx(void)
294{ 333{
295 regs.x++; 334 regs.x++;
296 335
@@ -496,7 +535,7 @@ stz(uint8_t arg)
496} 535}
497 536
498static void 537static void
499tax() 538tax(void)
500{ 539{
501 regs.x = regs.a; 540 regs.x = regs.a;
502 541