Skip to content

Commit b66fb6a

Browse files
author
Scitoshi Nakayobro
committed
Implement indirect zero-page addressing mode
1 parent c03766b commit b66fb6a

File tree

7 files changed

+319
-267
lines changed

7 files changed

+319
-267
lines changed

functions.h

+4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ static inline size_t mem_indexed_indirect(cpu *m, uint8_t addr, uint8_t off) {
2121
return mem_abs(m->mem[addr+off], m->mem[addr+off+1], 0);
2222
}
2323

24+
static inline size_t mem_indirect_zp(cpu *m, uint8_t addr) {
25+
return mem_abs(m->mem[addr], m->mem[addr + 1], 0);
26+
}
27+
2428
// set arg MUST be 16 bits, not 8, so that add results can fit into set.
2529
static inline void set_flag(cpu *m, uint8_t flag, uint16_t set) {
2630
if (set) {

opcode_handlers/arithmetic.h

+8
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ case ADC_ZPX:
3636
add(m, m->mem[ZP(NEXT_BYTE(m) + m->x)]);
3737
break;
3838

39+
case ADC_INZP:
40+
add(m, m->mem[mem_indirect_zp(m, NEXT_BYTE(m))]);
41+
break;
42+
3943
case SBC_AB:
4044
arg1 = NEXT_BYTE(m);
4145
arg2 = NEXT_BYTE(m);
@@ -73,3 +77,7 @@ case SBC_ZP:
7377
case SBC_ZPX:
7478
sub(m, m->mem[ZP(NEXT_BYTE(m) + m->x)]);
7579
break;
80+
81+
case SBC_INZP:
82+
sub(m, m->mem[mem_indirect_zp(m, NEXT_BYTE(m))]);
83+
break;

opcode_handlers/compare.h

+4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ case CMP_ZPX:
3636
cmp(m, m->mem[ZP(NEXT_BYTE(m) + m->x)], m->ac);
3737
break;
3838

39+
case CMP_INZP:
40+
cmp(m, m->mem[mem_indirect_zp(m, NEXT_BYTE(m))], m->ac);
41+
break;
42+
3943
case CPX_AB:
4044
arg1 = NEXT_BYTE(m);
4145
arg2 = NEXT_BYTE(m);

opcode_handlers/load.h

+4
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ case LDA_ZPX:
4444
set_flags(m, m->ac);
4545
break;
4646

47+
case LDA_INZP:
48+
m->ac = m->mem[mem_indirect_zp(m, NEXT_BYTE(m))];
49+
break;
50+
4751
case LDX_AB:
4852
arg1 = NEXT_BYTE(m);
4953
arg2 = NEXT_BYTE(m);

opcode_handlers/logical.h

+15
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ case AND_INY:
4444
set_flags(m, m->ac);
4545
break;
4646

47+
case AND_INZP:
48+
m->ac &= m->mem[mem_indirect_zp(m, NEXT_BYTE(m))];
49+
set_flags(m, m->ac);
50+
break;
51+
4752
case EOR_IMM:
4853
m->ac ^= NEXT_BYTE(m);
4954
set_flags(m, m->ac);
@@ -90,6 +95,11 @@ case EOR_INY:
9095
set_flags(m, m->ac);
9196
break;
9297

98+
case EOR_INZP:
99+
m->ac ^= m->mem[mem_indirect_zp(m, NEXT_BYTE(m))];
100+
set_flags(m, m->ac);
101+
break;
102+
93103
case ORA_IMM:
94104
m->ac |= NEXT_BYTE(m);
95105
set_flags(m, m->ac);
@@ -136,6 +146,11 @@ case ORA_INY:
136146
set_flags(m, m->ac);
137147
break;
138148

149+
case ORA_INZP:
150+
m->ac |= m->mem[mem_indirect_zp(m, NEXT_BYTE(m))];
151+
set_flags(m, m->ac);
152+
break;
153+
139154
case BIT_AB:
140155
arg1 = NEXT_BYTE(m);
141156
arg2 = NEXT_BYTE(m);

opcode_handlers/store.h

+6
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ case STA_ZPX:
4646
mark_dirty(m, r1);
4747
break;
4848

49+
case STA_INZP:
50+
r1 = mem_indirect_zp(m, NEXT_BYTE(m));
51+
m->mem[r1] = m->ac;
52+
mark_dirty(m, r1);
53+
break;
54+
4955
case STX_ZP:
5056
r1 = ZP(NEXT_BYTE(m));
5157
m->mem[r1] = m->x;

0 commit comments

Comments
 (0)