Some fixes to mem.c;

Correctly implemented the 256k wrap around on the ET4000AX, fixes DOS/V.
This commit is contained in:
OBattler
2018-08-22 18:08:31 +02:00
parent 02a2224939
commit b786b16bd1
2 changed files with 111 additions and 31 deletions

View File

@@ -12,7 +12,7 @@
* the DYNAMIC_TABLES=1 enables this. Will eventually go
* away, either way...
*
* Version: @(#)mem.c 1.0.10 2018/04/29
* Version: @(#)mem.c 1.0.11 2018/08/20
*
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com>
@@ -1174,6 +1174,69 @@ mem_write_raml(uint32_t addr, uint32_t val, void *priv)
mem_write_raml_page(addr, val, &pages[addr >> 12]);
}
static uint8_t
mem_read_remapped(uint32_t addr, void *priv)
{
if(addr >= (mem_size * 1024) && addr < ((mem_size + 384) * 1024))
addr = 0xA0000 + (addr - (mem_size * 1024));
addreadlookup(mem_logical_addr, addr);
return ram[addr];
}
static uint16_t
mem_read_remappedw(uint32_t addr, void *priv)
{
if(addr >= mem_size * 1024 && addr < ((mem_size + 384) * 1024))
addr = 0xA0000 + (addr - (mem_size * 1024));
addreadlookup(mem_logical_addr, addr);
return *(uint16_t *)&ram[addr];
}
static uint32_t
mem_read_remappedl(uint32_t addr, void *priv)
{
if(addr >= mem_size * 1024 && addr < ((mem_size + 384) * 1024))
addr = 0xA0000 + (addr - (mem_size * 1024));
addreadlookup(mem_logical_addr, addr);
return *(uint32_t *)&ram[addr];
}
static void
mem_write_remapped(uint32_t addr, uint8_t val, void *priv)
{
uint32_t oldaddr = addr;
if(addr >= mem_size * 1024 && addr < ((mem_size + 384) * 1024))
addr = 0xA0000 + (addr - (mem_size * 1024));
addwritelookup(mem_logical_addr, addr);
mem_write_ramb_page(addr, val, &pages[oldaddr >> 12]);
}
static void
mem_write_remappedw(uint32_t addr, uint16_t val, void *priv)
{
uint32_t oldaddr = addr;
if(addr >= mem_size * 1024 && addr < ((mem_size + 384) * 1024))
addr = 0xA0000 + (addr - (mem_size * 1024));
addwritelookup(mem_logical_addr, addr);
mem_write_ramw_page(addr, val, &pages[oldaddr >> 12]);
}
static void
mem_write_remappedl(uint32_t addr, uint32_t val, void *priv)
{
uint32_t oldaddr = addr;
if(addr >= mem_size * 1024 && addr < ((mem_size + 384) * 1024))
addr = 0xA0000 + (addr - (mem_size * 1024));
addwritelookup(mem_logical_addr, addr);
mem_write_raml_page(addr, val, &pages[oldaddr >> 12]);
}
uint8_t
mem_read_bios(uint32_t addr, void *priv)
@@ -1604,8 +1667,8 @@ mem_reset(void)
* split mapping.
*/
if (mem_size < 16384)
m = 1024UL * 16384;
else
m = 1024UL * 16384;
else
m = 1024UL * mem_size;
if (ram != NULL) {
free(ram);
@@ -1675,13 +1738,22 @@ mem_log("MEM: reset: new pages=%08lx, pages_sz=%i\n", pages, pages_sz);
#endif
memset(pages, 0x00, pages_sz*sizeof(page_t));
for (c = 0; c < pages_sz; c++) {
pages[c].mem = &ram[c << 12];
pages[c].write_b = mem_write_ramb_page;
pages[c].write_w = mem_write_ramw_page;
pages[c].write_l = mem_write_raml_page;
}
if (pages_sz > 256) {
for (c = ((mem_size * 1024) >> 12); c < (((mem_size + 256) * 1024) >> 12); c++) {
pages[c].mem = &ram[0xA0000 + ((c - ((mem_size * 1024) >> 12)) << 12)];
pages[c].write_b = mem_write_ramb_page;
pages[c].write_w = mem_write_ramw_page;
pages[c].write_l = mem_write_raml_page;
}
}
/* Initialize the tables. */
@@ -1745,10 +1817,10 @@ mem_log("MEM: reset: new pages=%08lx, pages_sz=%i\n", pages, pages_sz);
if (romset == ROM_IBMPS1_2011)
mem_mapping_add(&romext_mapping, 0xc8000, 0x08000,
mem_read_romext,mem_read_romextw,mem_read_romextl,
NULL,NULL, NULL, romext, 0, NULL);
mem_mapping_add(&ram_remapped_mapping, mem_size * 1024, 384 * 1024,
mem_read_ram,mem_read_ramw,mem_read_raml,
NULL,NULL, NULL, romext, 0, NULL);
mem_mapping_add(&ram_remapped_mapping, mem_size * 1024, 256 * 1024,
mem_read_remapped, mem_read_remappedw, mem_read_remappedl,
mem_write_remapped, mem_write_remappedw, mem_write_remappedl,
ram + 0xA0000, MEM_MAPPING_INTERNAL, NULL);
mem_mapping_disable(&ram_remapped_mapping);