diff options
Diffstat (limited to 'cpu.c')
| -rw-r--r-- | cpu.c | 23 |
1 files changed, 16 insertions, 7 deletions
| @@ -407,15 +407,23 @@ iny(uint8_t arg) | |||
| 407 | } | 407 | } |
| 408 | 408 | ||
| 409 | static void | 409 | static void |
| 410 | jmp(uint8_t arg) | 410 | jmp(uint16_t arg) |
| 411 | { | 411 | { |
| 412 | regs.pc = arg; | 412 | regs.pc = arg; |
| 413 | } | 413 | } |
| 414 | 414 | ||
| 415 | static void | 415 | static void |
| 416 | jsr(uint8_t arg) | 416 | jsr(uint16_t arg) |
| 417 | { | 417 | { |
| 418 | /* TODO: complete this */ | 418 | uint16_t tmp = regs.pc + 2; |
| 419 | |||
| 420 | /* | ||
| 421 | * first push high-byte of return address then low-byte | ||
| 422 | * https://www.masswerk.at/6502/6502_instruction_set.html | ||
| 423 | */ | ||
| 424 | PUSH((tmp & 0xFF00) >> 8); | ||
| 425 | PUSH(tmp & 0xFF); | ||
| 426 | regs.pc = arg; | ||
| 419 | } | 427 | } |
| 420 | 428 | ||
| 421 | static void | 429 | static void |
| @@ -547,13 +555,14 @@ ror(uint8_t arg) | |||
| 547 | static void | 555 | static void |
| 548 | rti(uint8_t arg) | 556 | rti(uint8_t arg) |
| 549 | { | 557 | { |
| 550 | /* TODO: complete this */ | 558 | plp(); |
| 559 | regs.pc = PULL(); | ||
| 551 | } | 560 | } |
| 552 | 561 | ||
| 553 | static void | 562 | static void |
| 554 | rts(uint8_t arg) | 563 | rts(void) |
| 555 | { | 564 | { |
| 556 | /* TODO: complete this */ | 565 | regs.pc = PULL() + 1; |
| 557 | } | 566 | } |
| 558 | 567 | ||
| 559 | static void | 568 | static void |
| @@ -1186,7 +1195,7 @@ interpret(void) | |||
| 1186 | cycles += 6; | 1195 | cycles += 6; |
| 1187 | break; | 1196 | break; |
| 1188 | case 0x60: | 1197 | case 0x60: |
| 1189 | rts(opcode_arg(AM_ACC)); | 1198 | rts(); |
| 1190 | cycles += 6; | 1199 | cycles += 6; |
| 1191 | break; | 1200 | break; |
| 1192 | case 0xe9: | 1201 | case 0xe9: |
