summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvin <git@vineetk.net>2024-06-11 15:38:58 +0530
committervin <git@vineetk.net>2024-06-11 15:38:58 +0530
commit745496ccd1a4483cc0955ec0c34acd800991cff3 (patch)
tree02cc1b933b611e5be69480a7eb47f13392557b83
parent44273e69b97b179f632db43702579b3eb66d3fec (diff)
add memory mirroring for system and ppu memory
-rw-r--r--cpu.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/cpu.c b/cpu.c
index 8eaeff1..0fe6cbd 100644
--- a/cpu.c
+++ b/cpu.c
@@ -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;