# HG changeset patch # User Michael Pavone # Date 1472708417 25200 # Node ID bce01001a8c1d7b5a69da1180cad28b0be172e46 # Parent 03177ff78094230315d26fb8b3a31f64ff1ab2af Fix some bugs in memory access related to the changes for teh 23-bit address space diff -r 03177ff78094 -r bce01001a8c1 src/cpu.c --- a/src/cpu.c Wed Aug 31 20:49:35 2016 -0700 +++ b/src/cpu.c Wed Aug 31 22:40:17 2016 -0700 @@ -47,7 +47,7 @@ for (memory_region *end = cur + context->num_mem_regions; cur < end; cur++) { if (address >= cur->start && address <= cur->end && (cur->flags & MEM_READ)) { - return cur->base[address - cur->start] << 8 | cur->base[address - cur->start + 1]; + return cur->base[(address - cur->start) & cur->mask] << 8 | cur->base[(address - cur->start + 1) & cur->mask]; } } return 0xFFFF; @@ -60,7 +60,7 @@ for (memory_region *end = cur + context->num_mem_regions; cur < end; cur++) { if (address >= cur->start && address <= cur->end && (cur->flags & MEM_READ)) { - return cur->base[address - cur->start]; + return cur->base[(address - cur->start) & cur->mask]; } } return 0xFF; @@ -78,8 +78,8 @@ for (memory_region *end = cur + context->num_mem_regions; cur < end; cur++) { if (address >= cur->start && address <= cur->end && (cur->flags & MEM_WRITE)) { - cur->base[address - cur->start] = value >> 8; - cur->base[address - cur->start + 1] = value; + cur->base[(address - cur->start) & cur->mask] = value >> 8; + cur->base[(address - cur->start + 1) & cur->mask] = value; break; } } @@ -92,7 +92,7 @@ for (memory_region *end = cur + context->num_mem_regions; cur < end; cur++) { if (address >= cur->start && address <= cur->end && (cur->flags & MEM_WRITE)) { - cur->base[address - cur->start] = value; + cur->base[(address - cur->start) & cur->mask] = value; break; } } @@ -395,7 +395,7 @@ uint32_t get_data_address(cpu *context, uint8_t a, uint8_t b) { - uint32_t address = context->regs[a] + context->regs[b]; + uint32_t address = (context->regs[a] + context->regs[b]) & 0xFFFF; if (a == REG_PC || b == REG_PC) { address |= context->pc_msb; } else if (a == REG_SP || b == REG_SP) {