Mercurial > repos > simple16
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) { |