Mercurial > repos > simple16
changeset 54:bce01001a8c1
Fix some bugs in memory access related to the changes for teh 23-bit address space
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 31 Aug 2016 22:40:17 -0700 |
parents | 03177ff78094 |
children | f9846719aa26 |
files | src/cpu.c |
diffstat | 1 files changed, 6 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- 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) {