diff options
author | vin <git@vineetk.net> | 2024-06-11 15:38:58 +0530 |
---|---|---|
committer | vin <git@vineetk.net> | 2024-06-11 15:38:58 +0530 |
commit | 745496ccd1a4483cc0955ec0c34acd800991cff3 (patch) | |
tree | 02cc1b933b611e5be69480a7eb47f13392557b83 /cpu.c | |
parent | 44273e69b97b179f632db43702579b3eb66d3fec (diff) |
add memory mirroring for system and ppu memory
Diffstat (limited to 'cpu.c')
-rw-r--r-- | cpu.c | 14 |
1 files changed, 14 insertions, 0 deletions
@@ -10,6 +10,12 @@ #define STATUS_UPDATE_NEGATIVE(r) \ (regs.status.negative = ((r & (1 << 7)) > 0)) +#define MEMORY_MIRROR(addr) \ + if (addr < 0x2000) \ + addr &= 0x07FF; \ + else if (addr < 0x4000) \ + addr &= 0x2007; + #define PUSH(b) \ (memwrite(0x0100 + regs.sp--, b)) #define PULL() \ @@ -58,12 +64,16 @@ uint32_t cycles = 0; static uint8_t peek(uint16_t addr) { + MEMORY_MIRROR(addr); + return memory[addr]; } static uint16_t peek16(uint16_t addr) { + MEMORY_MIRROR(addr); + /* bytes are stored in little-endian (low then high) */ return (uint16_t)memory[addr] | ((uint16_t)memory[addr + 1] << 8); } @@ -71,12 +81,16 @@ peek16(uint16_t addr) static void memwrite(uint16_t addr, uint8_t byte) { + MEMORY_MIRROR(addr); + memory[addr] = byte; } static void memwrite16(uint16_t addr, uint16_t word) { + MEMORY_MIRROR(addr); + /* bytes are stored in little-endian (low then high) */ memory[addr] = word & 0xFF; memory[addr + 1] = (word & 0xFF00) >> 8; |