diff options
| author | vin <git@vineetk.net> | 2024-06-09 13:11:05 +0530 |
|---|---|---|
| committer | vin <git@vineetk.net> | 2024-06-09 13:11:05 +0530 |
| commit | 76b9059b2e299dca5a96cf94f21038002f4dad3a (patch) | |
| tree | 13057c696da6140f2bf8569578a9ef4e2494a2b6 /cpu.c | |
| parent | 207c6903f57f2364770c466dbe9807581ef96dc5 (diff) | |
add blank todo opcode functions based on opcode json
Diffstat (limited to 'cpu.c')
| -rw-r--r-- | cpu.c | 425 |
1 files changed, 406 insertions, 19 deletions
| @@ -110,7 +110,7 @@ opcode_arg(enum addressing_mode mode) | |||
| 110 | return val; | 110 | return val; |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | void | 113 | static void |
| 114 | adc(uint8_t arg) | 114 | adc(uint8_t arg) |
| 115 | { | 115 | { |
| 116 | uint16_t sum; // 16-bit sum makes it easier to determine carry flag | 116 | uint16_t sum; // 16-bit sum makes it easier to determine carry flag |
| @@ -125,43 +125,198 @@ adc(uint8_t arg) | |||
| 125 | STATUS_UPDATE_NEGATIVE(regs.a); | 125 | STATUS_UPDATE_NEGATIVE(regs.a); |
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | void | 128 | static void |
| 129 | sbc(uint8_t arg) | 129 | and(uint8_t arg) |
| 130 | { | 130 | { |
| 131 | /* SBC is described online as ADC with argument as two's complement */ | 131 | /* TODO: complete this */ |
| 132 | adc(~arg + 1); | ||
| 133 | } | 132 | } |
| 134 | 133 | ||
| 135 | void | 134 | static void |
| 136 | brk(void) | 135 | asl(uint8_t arg) |
| 136 | { | ||
| 137 | /* TODO: complete this */ | ||
| 138 | } | ||
| 139 | |||
| 140 | static void | ||
| 141 | bbr(uint8_t arg) | ||
| 142 | { | ||
| 143 | /* TODO: complete this */ | ||
| 144 | } | ||
| 145 | |||
| 146 | static void | ||
| 147 | bbs(uint8_t arg) | ||
| 148 | { | ||
| 149 | /* TODO: complete this */ | ||
| 150 | } | ||
| 151 | |||
| 152 | static void | ||
| 153 | bcc(uint8_t arg) | ||
| 154 | { | ||
| 155 | /* TODO: complete this */ | ||
| 156 | } | ||
| 157 | |||
| 158 | static void | ||
| 159 | bcs(uint8_t arg) | ||
| 160 | { | ||
| 161 | /* TODO: complete this */ | ||
| 162 | } | ||
| 163 | |||
| 164 | static void | ||
| 165 | beq(uint8_t arg) | ||
| 166 | { | ||
| 167 | /* TODO: complete this */ | ||
| 168 | } | ||
| 169 | |||
| 170 | static void | ||
| 171 | bit(uint8_t arg) | ||
| 172 | { | ||
| 173 | /* TODO: complete this */ | ||
| 174 | } | ||
| 175 | |||
| 176 | static void | ||
| 177 | bmi(uint8_t arg) | ||
| 178 | { | ||
| 179 | /* TODO: complete this */ | ||
| 180 | } | ||
| 181 | |||
| 182 | static void | ||
| 183 | bne(uint8_t arg) | ||
| 184 | { | ||
| 185 | /* TODO: complete this */ | ||
| 186 | } | ||
| 187 | |||
| 188 | static void | ||
| 189 | bpl(uint8_t arg) | ||
| 190 | { | ||
| 191 | /* TODO: complete this */ | ||
| 192 | } | ||
| 193 | |||
| 194 | static void | ||
| 195 | bra(uint8_t arg) | ||
| 196 | { | ||
| 197 | /* TODO: complete this */ | ||
| 198 | } | ||
| 199 | |||
| 200 | static void | ||
| 201 | brk() | ||
| 137 | { | 202 | { |
| 138 | /* $00 */ | ||
| 139 | /* TODO: push regs.pc and regs.status to stack and load IRQ vector */ | 203 | /* TODO: push regs.pc and regs.status to stack and load IRQ vector */ |
| 140 | regs.status.brk = 1; | 204 | regs.status.brk = 1; |
| 141 | return; | 205 | exit(0); |
| 142 | } | 206 | } |
| 143 | 207 | ||
| 144 | void | 208 | static void |
| 145 | tax(void) | 209 | bvc(uint8_t arg) |
| 146 | { | 210 | { |
| 147 | /* $AA */ | 211 | /* TODO: complete this */ |
| 148 | regs.x = regs.a; | 212 | } |
| 149 | 213 | ||
| 150 | STATUS_UPDATE_ZERO(regs.x); | 214 | static void |
| 151 | STATUS_UPDATE_NEGATIVE(regs.x); | 215 | bvs(uint8_t arg) |
| 216 | { | ||
| 217 | /* TODO: complete this */ | ||
| 152 | } | 218 | } |
| 153 | 219 | ||
| 154 | void | 220 | static void |
| 155 | inx(void) | 221 | clc(uint8_t arg) |
| 222 | { | ||
| 223 | /* TODO: complete this */ | ||
| 224 | } | ||
| 225 | |||
| 226 | static void | ||
| 227 | cld(uint8_t arg) | ||
| 228 | { | ||
| 229 | /* TODO: complete this */ | ||
| 230 | } | ||
| 231 | |||
| 232 | static void | ||
| 233 | cli(uint8_t arg) | ||
| 234 | { | ||
| 235 | /* TODO: complete this */ | ||
| 236 | } | ||
| 237 | |||
| 238 | static void | ||
| 239 | clv(uint8_t arg) | ||
| 240 | { | ||
| 241 | /* TODO: complete this */ | ||
| 242 | } | ||
| 243 | |||
| 244 | static void | ||
| 245 | cmp(uint8_t arg) | ||
| 246 | { | ||
| 247 | /* TODO: complete this */ | ||
| 248 | } | ||
| 249 | |||
| 250 | static void | ||
| 251 | cpx(uint8_t arg) | ||
| 252 | { | ||
| 253 | /* TODO: complete this */ | ||
| 254 | } | ||
| 255 | |||
| 256 | static void | ||
| 257 | cpy(uint8_t arg) | ||
| 258 | { | ||
| 259 | /* TODO: complete this */ | ||
| 260 | } | ||
| 261 | |||
| 262 | static void | ||
| 263 | dec(uint8_t arg) | ||
| 264 | { | ||
| 265 | /* TODO: complete this */ | ||
| 266 | } | ||
| 267 | |||
| 268 | static void | ||
| 269 | dex(uint8_t arg) | ||
| 270 | { | ||
| 271 | /* TODO: complete this */ | ||
| 272 | } | ||
| 273 | |||
| 274 | static void | ||
| 275 | dey(uint8_t arg) | ||
| 276 | { | ||
| 277 | /* TODO: complete this */ | ||
| 278 | } | ||
| 279 | |||
| 280 | static void | ||
| 281 | eor(uint8_t arg) | ||
| 282 | { | ||
| 283 | /* TODO: complete this */ | ||
| 284 | } | ||
| 285 | |||
| 286 | static void | ||
| 287 | inc(uint8_t arg) | ||
| 288 | { | ||
| 289 | /* TODO: complete this */ | ||
| 290 | } | ||
| 291 | |||
| 292 | static void | ||
| 293 | inx() | ||
| 156 | { | 294 | { |
| 157 | /* $E8 */ | ||
| 158 | regs.x++; | 295 | regs.x++; |
| 159 | 296 | ||
| 160 | STATUS_UPDATE_ZERO(regs.x); | 297 | STATUS_UPDATE_ZERO(regs.x); |
| 161 | STATUS_UPDATE_NEGATIVE(regs.x); | 298 | STATUS_UPDATE_NEGATIVE(regs.x); |
| 162 | } | 299 | } |
| 163 | 300 | ||
| 164 | void | 301 | static void |
| 302 | iny(uint8_t arg) | ||
| 303 | { | ||
| 304 | /* TODO: complete this */ | ||
| 305 | } | ||
| 306 | |||
| 307 | static void | ||
| 308 | jmp(uint8_t arg) | ||
| 309 | { | ||
| 310 | /* TODO: complete this */ | ||
| 311 | } | ||
| 312 | |||
| 313 | static void | ||
| 314 | jsr(uint8_t arg) | ||
| 315 | { | ||
| 316 | /* TODO: complete this */ | ||
| 317 | } | ||
| 318 | |||
| 319 | static void | ||
| 165 | lda(uint8_t arg) | 320 | lda(uint8_t arg) |
| 166 | { | 321 | { |
| 167 | printf("arg1 $%02X\n", arg); | 322 | printf("arg1 $%02X\n", arg); |
| @@ -171,6 +326,238 @@ lda(uint8_t arg) | |||
| 171 | STATUS_UPDATE_NEGATIVE(regs.a); | 326 | STATUS_UPDATE_NEGATIVE(regs.a); |
| 172 | } | 327 | } |
| 173 | 328 | ||
| 329 | static void | ||
| 330 | ldx(uint8_t arg) | ||
| 331 | { | ||
| 332 | /* TODO: complete this */ | ||
| 333 | } | ||
| 334 | |||
| 335 | static void | ||
| 336 | ldy(uint8_t arg) | ||
| 337 | { | ||
| 338 | /* TODO: complete this */ | ||
| 339 | } | ||
| 340 | |||
| 341 | static void | ||
| 342 | lsr(uint8_t arg) | ||
| 343 | { | ||
| 344 | /* TODO: complete this */ | ||
| 345 | } | ||
| 346 | |||
| 347 | static void | ||
| 348 | nop(uint8_t arg) | ||
| 349 | { | ||
| 350 | /* TODO: complete this */ | ||
| 351 | } | ||
| 352 | |||
| 353 | static void | ||
| 354 | ora(uint8_t arg) | ||
| 355 | { | ||
| 356 | /* TODO: complete this */ | ||
| 357 | } | ||
| 358 | |||
| 359 | static void | ||
| 360 | pha(uint8_t arg) | ||
| 361 | { | ||
| 362 | /* TODO: complete this */ | ||
| 363 | } | ||
| 364 | |||
| 365 | static void | ||
| 366 | php(uint8_t arg) | ||
| 367 | { | ||
| 368 | /* TODO: complete this */ | ||
| 369 | } | ||
| 370 | |||
| 371 | static void | ||
| 372 | phx(uint8_t arg) | ||
| 373 | { | ||
| 374 | /* TODO: complete this */ | ||
| 375 | } | ||
| 376 | |||
| 377 | static void | ||
| 378 | phy(uint8_t arg) | ||
| 379 | { | ||
| 380 | /* TODO: complete this */ | ||
| 381 | } | ||
| 382 | |||
| 383 | static void | ||
| 384 | pla(uint8_t arg) | ||
| 385 | { | ||
| 386 | /* TODO: complete this */ | ||
| 387 | } | ||
| 388 | |||
| 389 | static void | ||
| 390 | plp(uint8_t arg) | ||
| 391 | { | ||
| 392 | /* TODO: complete this */ | ||
| 393 | } | ||
| 394 | |||
| 395 | static void | ||
| 396 | plx(uint8_t arg) | ||
| 397 | { | ||
| 398 | /* TODO: complete this */ | ||
| 399 | } | ||
| 400 | |||
| 401 | static void | ||
| 402 | ply(uint8_t arg) | ||
| 403 | { | ||
| 404 | /* TODO: complete this */ | ||
| 405 | } | ||
| 406 | |||
| 407 | static void | ||
| 408 | rmb(uint8_t arg) | ||
| 409 | { | ||
| 410 | /* TODO: complete this */ | ||
| 411 | } | ||
| 412 | |||
| 413 | static void | ||
| 414 | rol(uint8_t arg) | ||
| 415 | { | ||
| 416 | /* TODO: complete this */ | ||
| 417 | } | ||
| 418 | |||
| 419 | static void | ||
| 420 | ror(uint8_t arg) | ||
| 421 | { | ||
| 422 | /* TODO: complete this */ | ||
| 423 | } | ||
| 424 | |||
| 425 | static void | ||
| 426 | rti(uint8_t arg) | ||
| 427 | { | ||
| 428 | /* TODO: complete this */ | ||
| 429 | } | ||
| 430 | |||
| 431 | static void | ||
| 432 | rts(uint8_t arg) | ||
| 433 | { | ||
| 434 | /* TODO: complete this */ | ||
| 435 | } | ||
| 436 | |||
| 437 | static void | ||
| 438 | sbc(uint8_t arg) | ||
| 439 | { | ||
| 440 | /* SBC is described online as ADC with argument as two's complement */ | ||
| 441 | adc(~arg + 1); | ||
| 442 | } | ||
| 443 | |||
| 444 | static void | ||
| 445 | sec(uint8_t arg) | ||
| 446 | { | ||
| 447 | /* TODO: complete this */ | ||
| 448 | } | ||
| 449 | |||
| 450 | static void | ||
| 451 | sed(uint8_t arg) | ||
| 452 | { | ||
| 453 | /* TODO: complete this */ | ||
| 454 | } | ||
| 455 | |||
| 456 | static void | ||
| 457 | sei(uint8_t arg) | ||
| 458 | { | ||
| 459 | /* TODO: complete this */ | ||
| 460 | } | ||
| 461 | |||
| 462 | static void | ||
| 463 | smb(uint8_t arg) | ||
| 464 | { | ||
| 465 | /* TODO: complete this */ | ||
| 466 | } | ||
| 467 | |||
| 468 | static void | ||
| 469 | sta(uint8_t arg) | ||
| 470 | { | ||
| 471 | /* TODO: complete this */ | ||
| 472 | } | ||
| 473 | |||
| 474 | static void | ||
| 475 | stp(uint8_t arg) | ||
| 476 | { | ||
| 477 | /* TODO: complete this */ | ||
| 478 | } | ||
| 479 | |||
| 480 | static void | ||
| 481 | stx(uint8_t arg) | ||
| 482 | { | ||
| 483 | /* TODO: complete this */ | ||
| 484 | } | ||
| 485 | |||
| 486 | static void | ||
| 487 | sty(uint8_t arg) | ||
| 488 | { | ||
| 489 | /* TODO: complete this */ | ||
| 490 | } | ||
| 491 | |||
| 492 | static void | ||
| 493 | stz(uint8_t arg) | ||
| 494 | { | ||
| 495 | /* TODO: complete this */ | ||
| 496 | } | ||
| 497 | |||
| 498 | static void | ||
| 499 | tax() | ||
| 500 | { | ||
| 501 | regs.x = regs.a; | ||
| 502 | |||
| 503 | STATUS_UPDATE_ZERO(regs.x); | ||
| 504 | STATUS_UPDATE_NEGATIVE(regs.x); | ||
| 505 | } | ||
| 506 | |||
| 507 | static void | ||
| 508 | tay(uint8_t arg) | ||
| 509 | { | ||
| 510 | /* TODO: complete this */ | ||
| 511 | } | ||
| 512 | |||
| 513 | static void | ||
| 514 | trb(uint8_t arg) | ||
| 515 | { | ||
| 516 | /* TODO: complete this */ | ||
| 517 | } | ||
| 518 | |||
| 519 | static void | ||
| 520 | tsb(uint8_t arg) | ||
| 521 | { | ||
| 522 | /* TODO: complete this */ | ||
| 523 | } | ||
| 524 | |||
| 525 | static void | ||
| 526 | tsx(uint8_t arg) | ||
| 527 | { | ||
| 528 | /* TODO: complete this */ | ||
| 529 | } | ||
| 530 | |||
| 531 | static void | ||
| 532 | txa(uint8_t arg) | ||
| 533 | { | ||
| 534 | /* TODO: complete this */ | ||
| 535 | } | ||
| 536 | |||
| 537 | static void | ||
| 538 | txs(uint8_t arg) | ||
| 539 | { | ||
| 540 | /* TODO: complete this */ | ||
| 541 | } | ||
| 542 | |||
| 543 | static void | ||
| 544 | tya(uint8_t arg) | ||
| 545 | { | ||
| 546 | /* TODO: complete this */ | ||
| 547 | } | ||
| 548 | |||
| 549 | static void | ||
| 550 | wai(uint8_t arg) | ||
| 551 | { | ||
| 552 | /* TODO: complete this */ | ||
| 553 | } | ||
| 554 | |||
| 555 | static void | ||
| 556 | unp(uint8_t arg) | ||
| 557 | { | ||
| 558 | /* TODO: complete this */ | ||
| 559 | } | ||
| 560 | |||
| 174 | void | 561 | void |
| 175 | interpret(void) | 562 | interpret(void) |
| 176 | { | 563 | { |
