PCem
changeset 90:e1e6f70a0f68
Marked RAM areas as 'internal only'. Fixed bugs in mem_mapping_recalc().
Should no longer cause problems when peripherals map over main memory (Trio64).
| author | TomW |
|---|---|
| date | Wed Mar 26 21:52:53 2014 +0000 |
| parents | 9c985b55cc4e |
| children | 6579fed92118 |
| files | src/mem.c |
| diffstat | 1 files changed, 17 insertions(+), 9 deletions(-) [+] |
line diff
1.1 --- a/src/mem.c Mon Mar 24 19:15:11 2014 +0000 1.2 +++ b/src/mem.c Wed Mar 26 21:52:53 2014 +0000 1.3 @@ -1239,7 +1239,9 @@ 1.4 { 1.5 uint64_t c; 1.6 mem_mapping_t *mapping = base_mapping.next; 1.7 - 1.8 + 1.9 + if (!size) 1.10 + return; 1.11 /*Clear out old mappings*/ 1.12 for (c = base; c < base + size; c += 0x4000) 1.13 { 1.14 @@ -1263,7 +1265,9 @@ 1.15 { 1.16 uint64_t start = (mapping->base < base) ? mapping->base : base; 1.17 uint64_t end = (((uint64_t)mapping->base + (uint64_t)mapping->size) < (base + size)) ? ((uint64_t)mapping->base + (uint64_t)mapping->size) : (base + size); 1.18 - 1.19 + if (start < mapping->base) 1.20 + start = mapping->base; 1.21 + 1.22 for (c = start; c < end; c += 0x4000) 1.23 { 1.24 if ((mapping->read_b || mapping->read_w || mapping->read_l) && 1.25 @@ -1454,11 +1458,13 @@ 1.26 1.27 memset(_mem_state, 0, sizeof(_mem_state)); 1.28 1.29 - mem_set_mem_state(0xc0000, 0x40000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); 1.30 + mem_set_mem_state(0x000000, 0xa0000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); 1.31 + mem_set_mem_state(0x0c0000, 0x40000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); 1.32 + mem_set_mem_state(0x100000, (mem_size - 1) * 1024 * 1024, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); 1.33 1.34 - mem_mapping_add(&ram_low_mapping, 0x00000, 0xa0000, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, ram, 0, NULL); 1.35 + mem_mapping_add(&ram_low_mapping, 0x00000, 0xa0000, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, ram, MEM_MAPPING_INTERNAL, NULL); 1.36 if (mem_size > 1) 1.37 - mem_mapping_add(&ram_high_mapping, 0x100000, (mem_size - 1) * 1024 * 1024, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, ram + 0x100000, 0, NULL); 1.38 + mem_mapping_add(&ram_high_mapping, 0x100000, (mem_size - 1) * 1024 * 1024, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, ram + 0x100000, MEM_MAPPING_INTERNAL, NULL); 1.39 mem_mapping_add(&ram_mid_mapping, 0xc0000, 0x40000, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, ram + 0xc0000, MEM_MAPPING_INTERNAL, NULL); 1.40 1.41 mem_mapping_add(&romext_mapping, 0xc8000, 0x08000, mem_read_romext, mem_read_romextw, mem_read_romextl, NULL, NULL, NULL, romext, 0, NULL); 1.42 @@ -1492,11 +1498,13 @@ 1.43 1.44 memset(_mem_state, 0, sizeof(_mem_state)); 1.45 1.46 - mem_set_mem_state(0xc0000, 0x40000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); 1.47 - 1.48 - mem_mapping_add(&ram_low_mapping, 0x00000, 0xa0000, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, ram, 0, NULL); 1.49 + mem_set_mem_state(0x000000, 0xa0000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); 1.50 + mem_set_mem_state(0x0c0000, 0x40000, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); 1.51 + mem_set_mem_state(0x100000, (mem_size - 1) * 1024 * 1024, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); 1.52 + 1.53 + mem_mapping_add(&ram_low_mapping, 0x00000, 0xa0000, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, ram, MEM_MAPPING_INTERNAL, NULL); 1.54 if (mem_size > 1) 1.55 - mem_mapping_add(&ram_high_mapping, 0x100000, (mem_size - 1) * 1024 * 1024, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, ram + 0x100000, 0, NULL); 1.56 + mem_mapping_add(&ram_high_mapping, 0x100000, (mem_size - 1) * 1024 * 1024, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, ram + 0x100000, MEM_MAPPING_INTERNAL, NULL); 1.57 mem_mapping_add(&ram_mid_mapping, 0xc0000, 0x40000, mem_read_ram, mem_read_ramw, mem_read_raml, mem_write_ram, mem_write_ramw, mem_write_raml, ram + 0xc0000, MEM_MAPPING_INTERNAL, NULL); 1.58 1.59 mem_add_bios();
