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) {