Skip to content

Commit 702f40d

Browse files
committed
Instruction fixes
1 parent a7aaac7 commit 702f40d

File tree

4 files changed

+56
-31
lines changed

4 files changed

+56
-31
lines changed

codegen/hash.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#define HASH_OFFSET_BASIS 2166136261
88
#define HASH_PRIME 16777619
99
#define RECORDING_FRAME_COUNT 7987
10-
#define EXPECTED_CUMULATIVE_HASH 788985578
10+
#define EXPECTED_CUMULATIVE_HASH 1633679932
1111

1212
static NESInputRecording recording;
1313
static uint32_t frame_counter = 0;

codegen/lib/cpu.c

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -123,43 +123,63 @@ void update_nz(uint8_t value) {
123123
neg_flag = (value & 0b010000000) != 0;
124124
}
125125

126-
uint8_t zero_page(uint8_t addr) {
127-
return read_byte(addr);
126+
inline uint8_t zero_page(uint8_t addr) {
127+
return read_byte((uint16_t)addr);
128128
}
129129

130-
uint8_t zero_page_x(uint8_t addr) {
131-
return read_byte((addr + x) & 0xff); // TODO: check if wrapping is necessary
130+
inline uint8_t zero_page_x_addr(uint8_t addr) {
131+
return addr + x;
132132
}
133133

134-
uint8_t zero_page_y(uint8_t addr) {
135-
return read_byte(addr + y);
134+
inline uint8_t zero_page_x(uint8_t addr) {
135+
return read_byte((uint16_t)zero_page_x_addr(addr));
136136
}
137137

138-
uint8_t absolute(uint16_t addr) {
138+
inline uint8_t zero_page_y_addr(uint8_t addr) {
139+
return addr + y;
140+
}
141+
142+
inline uint8_t zero_page_y(uint8_t addr) {
143+
return read_byte((uint16_t)zero_page_y_addr(addr));
144+
}
145+
146+
inline uint8_t absolute(uint16_t addr) {
139147
return read_byte(addr);
140148
}
141149

142-
uint8_t absolute_x(uint16_t addr) {
143-
return read_byte(addr + x);
150+
inline uint16_t absolute_x_addr(uint16_t addr) {
151+
return addr + x;
152+
}
153+
154+
inline uint8_t absolute_x(uint16_t addr) {
155+
return read_byte(absolute_x_addr(addr));
144156
}
145157

146-
uint8_t absolute_y(uint16_t addr) {
158+
inline uint8_t absolute_y(uint16_t addr) {
147159
return read_byte(addr + y);
148160
}
149161

150-
uint16_t indirect_x_addr(uint8_t addr) {
151-
return read_word(addr + x);
162+
inline uint16_t indirect_x_addr(uint8_t addr) {
163+
uint8_t addr1 = addr + x;
164+
uint8_t addr2 = addr1 + 1; // zero page wrap around
165+
uint16_t low_byte = (uint16_t)read_byte(addr1);
166+
uint16_t high_byte = (uint16_t)(((uint16_t)read_byte(addr2)) << 8);
167+
return high_byte | low_byte;
168+
return read_word(addr1);
152169
}
153170

154-
uint16_t indirect_y_addr(uint8_t addr) {
155-
return read_word(addr) + y;
171+
inline uint16_t indirect_y_addr(uint8_t addr) {
172+
uint8_t addr2 = addr + 1; // zero page wrap around
173+
uint16_t low_byte = (uint16_t)read_byte(addr);
174+
uint16_t high_byte = (uint16_t)(((uint16_t)read_byte(addr2)) << 8);
175+
return (high_byte | low_byte) + (uint16_t)y;
156176
}
157177

158-
uint8_t indirect_x_val(uint8_t addr) {
178+
inline uint8_t indirect_x_val(uint8_t addr) {
159179
return read_byte(indirect_x_addr(addr));
160180
}
161181

162-
uint8_t indirect_y_val(uint8_t addr) {
182+
inline uint8_t indirect_y_val(uint8_t addr) {
163183
return read_byte(indirect_y_addr(addr));
164184
}
165185

codegen/lib/cpu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ uint8_t zero_page_x(uint8_t addr);
4040
uint8_t zero_page_y(uint8_t addr);
4141

4242
uint8_t absolute(uint16_t addr);
43+
uint16_t absolute_x_addr(uint16_t addr);
4344
uint8_t absolute_x(uint16_t addr);
4445
uint8_t absolute_y(uint16_t addr);
4546

codegen/lib/instructions.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ void ldy_absx(uint16_t addr) {
8484
// ADC - Add with Carry
8585

8686
void adc_imm(uint8_t value) {
87-
uint16_t sum = a + value + (carry_flag ? 1 : 0);
88-
carry_flag = sum > 0xff;
87+
uint16_t sum = (uint16_t)a + (uint16_t)value + (uint16_t)carry_flag;
88+
carry_flag = sum & 0x100;
8989
a = (uint8_t)sum;
9090
update_nz(a);
9191
}
@@ -510,28 +510,32 @@ void rol_abs(uint16_t addr) {
510510

511511
// ROR - Rotate Right
512512

513-
void ror_acc(void) {
513+
void _ror(uint16_t addr) {
514+
uint8_t val = read_byte(addr);
514515
bool old_carry = carry_flag;
515-
carry_flag = a & 1;
516-
a >>= 1;
516+
carry_flag = val & 1;
517+
val >>= 1;
517518

518519
if (old_carry) {
519-
a |= 0x80;
520+
val |= 0x80;
520521
}
521522

522-
update_nz(a);
523+
dynamic_ram_write(addr, val);
524+
update_nz(val);
523525
}
524526

525-
void ror_absx(uint16_t addr) {
526-
uint8_t val = absolute_x(addr);
527+
inline void ror_acc(void) {
527528
bool old_carry = carry_flag;
528-
carry_flag = val & 1;
529-
val >>= 1;
529+
carry_flag = a & 1;
530+
a >>= 1;
530531

531532
if (old_carry) {
532-
val |= 0x80;
533+
a |= 0x80;
533534
}
534535

535-
dynamic_ram_write(addr, val);
536-
update_nz(val);
536+
update_nz(a);
537+
}
538+
539+
inline void ror_absx(uint16_t addr) {
540+
_ror(absolute_x_addr(addr));
537541
}

0 commit comments

Comments
 (0)