Redid the SCAT ROMCS handling again (required changes in mem.c/h), fixes #435.
This commit is contained in:
79
src/mem.c
79
src/mem.c
@@ -12,7 +12,7 @@
|
||||
* the DYNAMIC_TABLES=1 enables this. Will eventually go
|
||||
* away, either way...
|
||||
*
|
||||
* Version: @(#)mem.c 1.0.20 2019/03/24
|
||||
* Version: @(#)mem.c 1.0.21 2019/10/19
|
||||
*
|
||||
* Authors: Sarah Walker, <tommowalker@tommowalker.co.uk>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -861,51 +861,6 @@ mem_mapping_is_romcs(uint32_t addr, int write)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
uint8_t
|
||||
mem_readb_phys(uint32_t addr)
|
||||
{
|
||||
mem_mapping_t *map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
|
||||
if (_mem_exec[addr >> MEM_GRANULARITY_BITS])
|
||||
return _mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK];
|
||||
else if (map && map->read_b)
|
||||
return map->read_b(addr, map->p);
|
||||
else
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
|
||||
uint16_t
|
||||
mem_readw_phys(uint32_t addr)
|
||||
{
|
||||
mem_mapping_t *map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
uint16_t temp;
|
||||
|
||||
if (_mem_exec[addr >> MEM_GRANULARITY_BITS])
|
||||
return ((uint16_t *) _mem_exec[addr >> MEM_GRANULARITY_BITS])[(addr >> 1) & MEM_GRANULARITY_HMASK];
|
||||
else if (map && map->read_w)
|
||||
return map->read_w(addr, map->p);
|
||||
else {
|
||||
temp = mem_readb_phys(addr + 1) << 8;
|
||||
temp |= mem_readb_phys(addr);
|
||||
}
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mem_writeb_phys(uint32_t addr, uint8_t val)
|
||||
{
|
||||
mem_mapping_t *map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
|
||||
if (_mem_exec[addr >> MEM_GRANULARITY_BITS])
|
||||
_mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK] = val;
|
||||
else if (map && map->write_b)
|
||||
map->write_b(addr, val, map->p);
|
||||
}
|
||||
|
||||
uint8_t
|
||||
mem_readb_phys(uint32_t addr)
|
||||
@@ -944,7 +899,6 @@ mem_writeb_phys(uint32_t addr, uint8_t val)
|
||||
|
||||
if (map && map->write_b)
|
||||
map->write_b(addr, val, map->p);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1199,7 +1153,16 @@ mem_mapping_read_allowed(uint32_t flags, int state)
|
||||
|
||||
case MEM_READ_ANY:
|
||||
return 1;
|
||||
|
||||
/* On external and 0 mappings without ROMCS. */
|
||||
case MEM_READ_EXTERNAL:
|
||||
return !(flags & MEM_MAPPING_INTERNAL) && !(flags & MEM_MAPPING_ROMCS);
|
||||
|
||||
/* On external and 0 mappings with ROMCS. */
|
||||
case MEM_READ_ROMCS:
|
||||
return !(flags & MEM_MAPPING_INTERNAL) && (flags & MEM_MAPPING_ROMCS);
|
||||
|
||||
/* On any external mappings. */
|
||||
case MEM_READ_EXTANY:
|
||||
return !(flags & MEM_MAPPING_INTERNAL);
|
||||
|
||||
@@ -1219,12 +1182,25 @@ mem_mapping_write_allowed(uint32_t flags, int state)
|
||||
{
|
||||
switch (state & MEM_WRITE_MASK) {
|
||||
case MEM_WRITE_DISABLED:
|
||||
return 0;
|
||||
|
||||
case MEM_WRITE_ANY:
|
||||
return 1;
|
||||
|
||||
/* On external and 0 mappings without ROMCS. */
|
||||
case MEM_WRITE_EXTERNAL:
|
||||
return !(flags & MEM_MAPPING_INTERNAL) && !(flags & MEM_MAPPING_ROMCS);
|
||||
|
||||
/* On external and 0 mappings with ROMCS. */
|
||||
case MEM_WRITE_ROMCS:
|
||||
return !(flags & MEM_MAPPING_INTERNAL) && (flags & MEM_MAPPING_ROMCS);
|
||||
|
||||
/* On any external mappings. */
|
||||
case MEM_WRITE_EXTANY:
|
||||
return !(flags & MEM_MAPPING_INTERNAL);
|
||||
|
||||
case MEM_WRITE_INTERNAL:
|
||||
return !(flags & MEM_MAPPING_EXTERNAL);
|
||||
|
||||
default:
|
||||
fatal("mem_mapping_write_allowed : bad state %x\n", state);
|
||||
@@ -1438,11 +1414,17 @@ mem_add_bios(void)
|
||||
mem_mapping_add(&bios_mapping, 0xe0000, 0x20000,
|
||||
mem_read_bios,mem_read_biosw,mem_read_biosl,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
&rom[0x20000], MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, 0);
|
||||
|
||||
mem_set_mem_state(0x0e0000, 0x20000,
|
||||
MEM_READ_ROMCS | MEM_WRITE_ROMCS);
|
||||
} else {
|
||||
mem_mapping_add(&bios_mapping, biosaddr, biosmask + 1,
|
||||
mem_read_bios,mem_read_biosw,mem_read_biosl,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
rom, MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, 0);
|
||||
|
||||
mem_set_mem_state(biosaddr, biosmask + 1,
|
||||
MEM_READ_ROMCS | MEM_WRITE_ROMCS);
|
||||
}
|
||||
|
||||
@@ -1450,6 +1432,9 @@ mem_add_bios(void)
|
||||
mem_mapping_add(&bios_high_mapping, biosaddr | (cpu_16bitbus ? 0x00f00000 : 0xfff00000), biosmask + 1,
|
||||
mem_read_bios,mem_read_biosw,mem_read_biosl,
|
||||
mem_write_null,mem_write_nullw,mem_write_nulll,
|
||||
rom, MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM|MEM_MAPPING_ROMCS, 0);
|
||||
|
||||
mem_set_mem_state(biosaddr | (cpu_16bitbus ? 0x00f00000 : 0xfff00000), biosmask + 1,
|
||||
MEM_READ_ROMCS | MEM_WRITE_ROMCS);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user