Redid the SCAT ROMCS handling again (required changes in mem.c/h), fixes #435.

This commit is contained in:
OBattler
2019-10-19 01:24:42 +02:00
parent 544eb0f1c9
commit 4f2cdf3b39
13 changed files with 129 additions and 130 deletions

View File

@@ -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);
}
}