diff --git a/src/mem.c b/src/mem.c index b8c001e..7b9fde3 100644 --- a/src/mem.c +++ b/src/mem.c @@ -8,7 +8,11 @@ * * Memory handling and MMU. * - * Version: @(#)mem.c 1.0.7 2018/03/17 + * NOTE: Experimenting with dynamically allocated lookup tables; + * the DYNAMIC_TABLES=1 enables this. Will eventually go + * away, either way... + * + * Version: @(#)mem.c 1.0.8 2018/03/18 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -61,6 +65,9 @@ #endif +#define DYNAMIC_TABLES 0 /* experimental */ + + mem_mapping_t ram_low_mapping; mem_mapping_t ram_high_mapping; mem_mapping_t ram_mid_mapping; @@ -135,7 +142,7 @@ static mem_mapping_t base_mapping; static mem_mapping_t ram_remapped_mapping; static mem_mapping_t ram_split_mapping; -#if 0 +#if FIXME static uint8_t ff_array[0x1000]; #else static uint8_t ff_pccache[4] = { 0xff, 0xff, 0xff, 0xff }; @@ -150,20 +157,34 @@ resetreadlookup(void) int c; /* This is NULL after app startup, when mem_init() has not yet run. */ - if (page_lookup == NULL) return; +#if DYNAMIC_TABLES +pclog("MEM: reset_lookup: pages=%08lx, lookup=%08lx, pages_sz=%i\n", pages, page_lookup, pages_sz); +#endif - memset(page_lookup, 0x00, pages_sz * sizeof(page_t *)); + /* Initialize the page lookup table. */ +#if DYNAMIC_TABLES + memset(page_lookup, 0x00, pages_sz*sizeof(page_t *)); +#else + memset(page_lookup, 0x00, (1<<20)*sizeof(page_t *)); +#endif - for (c = 0; c < 256; c++) + /* Initialize the tables for lower (<= 1024K) RAM. */ + for (c = 0; c < 256; c++) { readlookup[c] = 0xffffffff; - memset(readlookup2, 0xff, pages_sz*sizeof(uintptr_t)); - readlnext = 0; - - for (c = 0; c < 256; c++) writelookup[c] = 0xffffffff; - memset(writelookup2, 0xff, pages_sz*sizeof(uintptr_t)); - writelnext = 0; + } + /* Initialize the tables for high (> 1024K) RAM. */ +#if DYNAMIC_TABLES + memset(readlookup2, 0xff, pages_sz*sizeof(uintptr_t)); + memset(writelookup2, 0xff, pages_sz*sizeof(uintptr_t)); +#else + memset(readlookup2, 0xff, (1<<20)*sizeof(uintptr_t)); + memset(writelookup2, 0xff, (1<<20)*sizeof(uintptr_t)); +#endif + + readlnext = 0; + writelnext = 0; pccache = 0xffffffff; } @@ -1544,15 +1565,11 @@ mem_reset(void) split_mapping_enabled = 0; - /* Free existing memory and tables. */ - if (ram != NULL) free(ram); - if (rom != NULL) free(rom); - if (pages != NULL) free(pages); - if (page_lookup != NULL) free(page_lookup); - if (readlookup2 != NULL) free(readlookup2); - if (writelookup2 != NULL) free(writelookup2); - - /* Reset the ROM size mask. */ + /* Free the ROM memory and reset size mask. */ + if (rom != NULL) { + free(rom); + rom = NULL; + } biosmask = 0xffff; /* @@ -1564,7 +1581,8 @@ mem_reset(void) m = 1024UL * 16384; else m = 1024UL * (mem_size + 384); /* 386 extra kB for top remapping */ - ram = malloc(m); /* allocate and clear the RAM block */ + if (ram != NULL) free(ram); + ram = (uint8_t *)malloc(m); /* allocate and clear the RAM block */ memset(ram, 0x00, m); /* @@ -1589,23 +1607,43 @@ mem_reset(void) m = 256; } - pages_sz = m; - pages = (page_t *)malloc(m * sizeof(page_t)); - memset(pages, 0x00, m * sizeof(page_t)); - for (c=0; c * Miran Grca, @@ -308,7 +308,7 @@ pc_version(const char *platform) strcat(emu_version, temp); #endif #ifdef COMMIT - sprintf(temp, " [Commit #%x])", COMMIT); + sprintf(temp, " [Commit #%x]", COMMIT); strcat(emu_version, temp); #endif #ifdef BUILD