diff options
| author | vin <git@vineetk.net> | 2024-06-04 17:48:34 +0530 |
|---|---|---|
| committer | vin <git@vineetk.net> | 2024-06-04 17:48:34 +0530 |
| commit | bd85b80ba7a7919a80ce6fd742b37d3e183f2e3a (patch) | |
| tree | db25ace54fe54f8ab1580131afa5f0e049dd184a /cpu.c | |
| parent | 36a8eefd000ab79a4e1226db4ce0b61fb4454807 (diff) | |
fix peek
Diffstat (limited to 'cpu.c')
| -rw-r--r-- | cpu.c | 18 |
1 files changed, 11 insertions, 7 deletions
| @@ -47,12 +47,12 @@ uint8_t memory[0x16000]; | |||
| 47 | uint8_t program[] = { 0xa9, 0xc0, 0xaa, 0xe8, 0x00 }; | 47 | uint8_t program[] = { 0xa9, 0xc0, 0xaa, 0xe8, 0x00 }; |
| 48 | 48 | ||
| 49 | uint8_t | 49 | uint8_t |
| 50 | peek(uint16_t addr) | 50 | peek(uint8_t addr) |
| 51 | { | 51 | { |
| 52 | return memory[addr]; | 52 | return memory[addr]; |
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | uint16_t | 55 | uint8_t |
| 56 | peek16(uint16_t addr) | 56 | peek16(uint16_t addr) |
| 57 | { | 57 | { |
| 58 | /* bytes are stored in little-endian (low then high) */ | 58 | /* bytes are stored in little-endian (low then high) */ |
| @@ -93,7 +93,10 @@ lda(enum addressing_mode mode) | |||
| 93 | { | 93 | { |
| 94 | uint8_t arg, val; | 94 | uint8_t arg, val; |
| 95 | 95 | ||
| 96 | arg = peek(regs.pc++); | 96 | if (mode != AM_ABS && mode != AM_ABS_X && mode != AM_ABS_Y) |
| 97 | arg = peek(regs.pc++); | ||
| 98 | else | ||
| 99 | arg = peek16(regs.pc++); | ||
| 97 | 100 | ||
| 98 | switch (mode) { | 101 | switch (mode) { |
| 99 | case AM_IMM: /* $A9 */ | 102 | case AM_IMM: /* $A9 */ |
| @@ -103,16 +106,16 @@ lda(enum addressing_mode mode) | |||
| 103 | val = peek(arg % 256); | 106 | val = peek(arg % 256); |
| 104 | break; | 107 | break; |
| 105 | case AM_ABS: /* $AD */ | 108 | case AM_ABS: /* $AD */ |
| 106 | val = peek(arg); | 109 | val = peek16(arg); |
| 107 | break; | 110 | break; |
| 108 | case AM_ZP_X: /* $B5 */ | 111 | case AM_ZP_X: /* $B5 */ |
| 109 | val = peek((arg + regs.x) % 256); | 112 | val = peek((arg + regs.x) % 256); |
| 110 | break; | 113 | break; |
| 111 | case AM_ABS_X: /* $BD */ | 114 | case AM_ABS_X: /* $BD */ |
| 112 | val = peek(arg + regs.x); | 115 | val = peek16(arg + regs.x); |
| 113 | break; | 116 | break; |
| 114 | case AM_ABS_Y: /* $B9 */ | 117 | case AM_ABS_Y: /* $B9 */ |
| 115 | val = peek(arg + regs.y); | 118 | val = peek16(arg + regs.y); |
| 116 | break; | 119 | break; |
| 117 | case AM_IND_X: /* $A1 */ | 120 | case AM_IND_X: /* $A1 */ |
| 118 | val = peek(peek((arg + regs.x) % 256) + peek((arg + regs.x + 1) % 256) * 256); | 121 | val = peek(peek((arg + regs.x) % 256) + peek((arg + regs.x + 1) % 256) * 256); |
| @@ -121,7 +124,8 @@ lda(enum addressing_mode mode) | |||
| 121 | val = peek(peek(arg) + peek((arg + 1) % 256) * 256 + regs.y); | 124 | val = peek(peek(arg) + peek((arg + 1) % 256) * 256 + regs.y); |
| 122 | break; | 125 | break; |
| 123 | default: | 126 | default: |
| 124 | regs.pc--; | 127 | fprintf(stderr, "INVALID LDA ADDRESSING MODE\n"); |
| 128 | abort(); | ||
| 125 | return; | 129 | return; |
| 126 | } | 130 | } |
| 127 | 131 | ||
