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();