diff options
| author | vin <git@vineetk.net> | 2024-05-24 11:50:08 +0530 |
|---|---|---|
| committer | vin <git@vineetk.net> | 2024-05-24 11:50:08 +0530 |
| commit | 24ca08a83d8b420d337d29c87d672b624890b5bf (patch) | |
| tree | c2d6c7700b8a47832cdc06744717f3cf480f4b82 /cpu.c | |
| parent | dd757c4324f856c8f91d79a4f741d8bb6477064a (diff) | |
add lda immediate and brk
Diffstat (limited to 'cpu.c')
| -rw-r--r-- | cpu.c | 60 |
1 files changed, 60 insertions, 0 deletions
| @@ -40,6 +40,39 @@ uint8_t addrbus[0x10000]; | |||
| 40 | /* example program taken from https://bugzmanov.github.io/nes_ebook/chapter_3_1.html */ | 40 | /* example program taken from https://bugzmanov.github.io/nes_ebook/chapter_3_1.html */ |
| 41 | uint8_t program[] = { 0xa9, 0xc0, 0xaa, 0xe8, 0x00 }; | 41 | uint8_t program[] = { 0xa9, 0xc0, 0xaa, 0xe8, 0x00 }; |
| 42 | 42 | ||
| 43 | void brk(void) | ||
| 44 | { | ||
| 45 | /* TODO: push regs.pc and regs.status to stack and load IRQ vector */ | ||
| 46 | regs.status.brk = 1; | ||
| 47 | return; | ||
| 48 | } | ||
| 49 | |||
| 50 | void lda(enum addressing_mode mode) | ||
| 51 | { | ||
| 52 | uint8_t val; | ||
| 53 | |||
| 54 | switch (mode) { | ||
| 55 | case AM_IMMEDIATE: /* $A9 */ | ||
| 56 | val = program[regs.pc++]; | ||
| 57 | regs.acc = val; | ||
| 58 | break; | ||
| 59 | case AM_ZERO_PAGE: /* $A5 */ | ||
| 60 | case AM_ZERO_PAGE_X: /* $B5 */ | ||
| 61 | case AM_ABSOLUTE: /* $AD */ | ||
| 62 | case AM_ABSOLUTE_X: /* $BD */ | ||
| 63 | case AM_ABSOLUTE_Y: /* $B9 */ | ||
| 64 | case AM_INDIRECT_X: /* $A1 */ | ||
| 65 | case AM_INDIRECT_Y: /* $B1 */ | ||
| 66 | /* TODO */ | ||
| 67 | break; | ||
| 68 | default: | ||
| 69 | return; | ||
| 70 | } | ||
| 71 | |||
| 72 | regs.status.zero = regs.acc == 0; | ||
| 73 | regs.status.negative = (regs.acc & (1 << 7)) != 0; | ||
| 74 | } | ||
| 75 | |||
| 43 | void interpret(void) | 76 | void interpret(void) |
| 44 | { | 77 | { |
| 45 | uint8_t opcode; | 78 | uint8_t opcode; |
| @@ -49,6 +82,33 @@ void interpret(void) | |||
| 49 | opcode = program[regs.pc++]; | 82 | opcode = program[regs.pc++]; |
| 50 | 83 | ||
| 51 | switch (opcode) { | 84 | switch (opcode) { |
| 85 | case 0x00: | ||
| 86 | brk(); | ||
| 87 | return; | ||
| 88 | case 0xa9: | ||
| 89 | lda(AM_IMMEDIATE); | ||
| 90 | break; | ||
| 91 | case 0xa5: | ||
| 92 | lda(AM_ZERO_PAGE); | ||
| 93 | break; | ||
| 94 | case 0xb5: | ||
| 95 | lda(AM_ZERO_PAGE_X); | ||
| 96 | break; | ||
| 97 | case 0xad: | ||
| 98 | lda(AM_ABSOLUTE); | ||
| 99 | break; | ||
| 100 | case 0xbd: | ||
| 101 | lda(AM_ABSOLUTE_X); | ||
| 102 | break; | ||
| 103 | case 0xb9: | ||
| 104 | lda(AM_ABSOLUTE_Y); | ||
| 105 | break; | ||
| 106 | case 0xa1: | ||
| 107 | lda(AM_INDIRECT_X); | ||
| 108 | break; | ||
| 109 | case 0xb1: | ||
| 110 | lda(AM_INDIRECT_Y); | ||
| 111 | break; | ||
| 52 | default: | 112 | default: |
| 53 | break; | 113 | break; |
| 54 | } | 114 | } |
