summaryrefslogtreecommitdiff
path: root/cpu.c
diff options
context:
space:
mode:
authorvin <git@vineetk.net>2024-06-04 17:48:34 +0530
committervin <git@vineetk.net>2024-06-04 17:48:34 +0530
commitbd85b80ba7a7919a80ce6fd742b37d3e183f2e3a (patch)
treedb25ace54fe54f8ab1580131afa5f0e049dd184a /cpu.c
parent36a8eefd000ab79a4e1226db4ce0b61fb4454807 (diff)
fix peek
Diffstat (limited to 'cpu.c')
-rw-r--r--cpu.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/cpu.c b/cpu.c
index a8c6ceb..f018a44 100644
--- a/cpu.c
+++ b/cpu.c
@@ -47,12 +47,12 @@ uint8_t memory[0x16000];
47uint8_t program[] = { 0xa9, 0xc0, 0xaa, 0xe8, 0x00 }; 47uint8_t program[] = { 0xa9, 0xc0, 0xaa, 0xe8, 0x00 };
48 48
49uint8_t 49uint8_t
50peek(uint16_t addr) 50peek(uint8_t addr)
51{ 51{
52 return memory[addr]; 52 return memory[addr];
53} 53}
54 54
55uint16_t 55uint8_t
56peek16(uint16_t addr) 56peek16(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