comparison src/cpu.c @ 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 9a3b9d86dabf
children
comparison
equal deleted inserted replaced
53:03177ff78094 54:bce01001a8c1
45 } 45 }
46 memory_region *cur = context->mem_regions; 46 memory_region *cur = context->mem_regions;
47 for (memory_region *end = cur + context->num_mem_regions; cur < end; cur++) 47 for (memory_region *end = cur + context->num_mem_regions; cur < end; cur++)
48 { 48 {
49 if (address >= cur->start && address <= cur->end && (cur->flags & MEM_READ)) { 49 if (address >= cur->start && address <= cur->end && (cur->flags & MEM_READ)) {
50 return cur->base[address - cur->start] << 8 | cur->base[address - cur->start + 1]; 50 return cur->base[(address - cur->start) & cur->mask] << 8 | cur->base[(address - cur->start + 1) & cur->mask];
51 } 51 }
52 } 52 }
53 return 0xFFFF; 53 return 0xFFFF;
54 } 54 }
55 55
58 context->cycles += context->clock_inc; 58 context->cycles += context->clock_inc;
59 memory_region *cur = context->mem_regions; 59 memory_region *cur = context->mem_regions;
60 for (memory_region *end = cur + context->num_mem_regions; cur < end; cur++) 60 for (memory_region *end = cur + context->num_mem_regions; cur < end; cur++)
61 { 61 {
62 if (address >= cur->start && address <= cur->end && (cur->flags & MEM_READ)) { 62 if (address >= cur->start && address <= cur->end && (cur->flags & MEM_READ)) {
63 return cur->base[address - cur->start]; 63 return cur->base[(address - cur->start) & cur->mask];
64 } 64 }
65 } 65 }
66 return 0xFF; 66 return 0xFF;
67 } 67 }
68 68
76 } 76 }
77 memory_region *cur = context->mem_regions; 77 memory_region *cur = context->mem_regions;
78 for (memory_region *end = cur + context->num_mem_regions; cur < end; cur++) 78 for (memory_region *end = cur + context->num_mem_regions; cur < end; cur++)
79 { 79 {
80 if (address >= cur->start && address <= cur->end && (cur->flags & MEM_WRITE)) { 80 if (address >= cur->start && address <= cur->end && (cur->flags & MEM_WRITE)) {
81 cur->base[address - cur->start] = value >> 8; 81 cur->base[(address - cur->start) & cur->mask] = value >> 8;
82 cur->base[address - cur->start + 1] = value; 82 cur->base[(address - cur->start + 1) & cur->mask] = value;
83 break; 83 break;
84 } 84 }
85 } 85 }
86 } 86 }
87 87
90 context->cycles += context->clock_inc; 90 context->cycles += context->clock_inc;
91 memory_region *cur = context->mem_regions; 91 memory_region *cur = context->mem_regions;
92 for (memory_region *end = cur + context->num_mem_regions; cur < end; cur++) 92 for (memory_region *end = cur + context->num_mem_regions; cur < end; cur++)
93 { 93 {
94 if (address >= cur->start && address <= cur->end && (cur->flags & MEM_WRITE)) { 94 if (address >= cur->start && address <= cur->end && (cur->flags & MEM_WRITE)) {
95 cur->base[address - cur->start] = value; 95 cur->base[(address - cur->start) & cur->mask] = value;
96 break; 96 break;
97 } 97 }
98 } 98 }
99 } 99 }
100 100
393 } 393 }
394 } 394 }
395 395
396 uint32_t get_data_address(cpu *context, uint8_t a, uint8_t b) 396 uint32_t get_data_address(cpu *context, uint8_t a, uint8_t b)
397 { 397 {
398 uint32_t address = context->regs[a] + context->regs[b]; 398 uint32_t address = (context->regs[a] + context->regs[b]) & 0xFFFF;
399 if (a == REG_PC || b == REG_PC) { 399 if (a == REG_PC || b == REG_PC) {
400 address |= context->pc_msb; 400 address |= context->pc_msb;
401 } else if (a == REG_SP || b == REG_SP) { 401 } else if (a == REG_SP || b == REG_SP) {
402 address |= context->regs[REG_SR] << 8 & 0x7F0000; 402 address |= context->regs[REG_SR] << 8 & 0x7F0000;
403 } else if (address & 0x8000) { 403 } else if (address & 0x8000) {