diff --git a/src/mem.c b/src/mem.c index cad04677b..632484a21 100644 --- a/src/mem.c +++ b/src/mem.c @@ -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, * Miran Grca, @@ -1174,6 +1174,69 @@ mem_write_raml(uint32_t addr, uint32_t val, void *priv) } +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) */ if (mem_size < 16384) m = 1024UL * 16384; - else - m = 1024UL * (mem_size + 384); /* 386 extra kB for top remapping */ + else + m = 1024UL * mem_size; if (ram != NULL) { free(ram); ram = NULL; @@ -1675,13 +1738,22 @@ mem_log("MEM: reset: new pages=%08lx, pages_sz=%i\n", pages, pages_sz); memset(pages, 0x00, pages_sz*sizeof(page_t)); - for (c=0; c 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. */ memset(isram, 0x00, sizeof(isram)); for (c = 0; c < (mem_size / 64); c++) { @@ -1745,10 +1817,10 @@ mem_log("MEM: reset: new pages=%08lx, pages_sz=%i\n", pages, pages_sz); 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, - mem_write_ram,mem_write_ramw,mem_write_raml, - ram + (1 << 20), MEM_MAPPING_INTERNAL, 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); mem_a20_init(); diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index 5f984c0fd..a3146ef6e 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -8,7 +8,7 @@ * * Emulation of the Tseng Labs ET4000. * - * Version: @(#)vid_et4000.c 1.0.9 2018/08/16 + * Version: @(#)vid_et4000.c 1.0.10 2018/08/22 * * Authors: Sarah Walker, * Miran Grca, @@ -57,6 +57,7 @@ typedef struct et4000_t int get_korean_font_enabled; int get_korean_font_index; uint16_t get_korean_font_base; + uint32_t vram_mask; } et4000_t; static uint8_t crtc_mask[0x40] = @@ -103,6 +104,10 @@ void et4000_out(uint16_t addr, uint8_t val, void *p) old = svga->crtc[svga->crtcreg]; val &= crtc_mask[svga->crtcreg]; svga->crtc[svga->crtcreg] = val; + + if (svga->crtcreg == 0x36) + svga->vram_display_mask = (val & 0x20) ? et4000->vram_mask : 0x3ffff; + if (old != val) { if (svga->crtcreg < 0xE || svga->crtcreg > 0x10) @@ -112,8 +117,8 @@ void et4000_out(uint16_t addr, uint8_t val, void *p) } } - /*Note - Silly hack to determine video memory size automatically by ET4000 BIOS.*/ - if(svga->crtcreg == 0x37 && !et4000->is_mca) + /*Note - Silly hack to determine video memory size automatically by ET4000 BIOS.*/ + if (svga->crtcreg == 0x37 && !et4000->is_mca) { switch(val & 0x0B) { @@ -133,25 +138,25 @@ void et4000_out(uint16_t addr, uint8_t val, void *p) case 0x03: case 0x08: case 0x09: - if(svga->vram_max == 256 * 1024) - mem_mapping_enable(&svga->mapping); + if (svga->vram_max == 256 * 1024) + mem_mapping_enable(&svga->mapping); else - mem_mapping_disable(&svga->mapping); + mem_mapping_disable(&svga->mapping); break; case 0x0A: - if(svga->vram_max == 512 * 1024) - mem_mapping_enable(&svga->mapping); + if (svga->vram_max == 512 * 1024) + mem_mapping_enable(&svga->mapping); else - mem_mapping_disable(&svga->mapping); + mem_mapping_disable(&svga->mapping); break; case 0x0B: - if(svga->vram_max == 1024 * 1024) - mem_mapping_enable(&svga->mapping); + if (svga->vram_max == 1024 * 1024) + mem_mapping_enable(&svga->mapping); else - mem_mapping_disable(&svga->mapping); + mem_mapping_disable(&svga->mapping); break; default: - mem_mapping_enable(&svga->mapping); + mem_mapping_enable(&svga->mapping); break; } } @@ -170,15 +175,15 @@ uint8_t et4000_in(uint16_t addr, void *p) switch (addr) { - case 0x3c2: - if (et4000->is_mca) - { - if ((svga->vgapal[0].r + svga->vgapal[0].g + svga->vgapal[0].b) >= 0x4e) - return 0; - else - return 0x10; - } - break; + case 0x3c2: + if (et4000->is_mca) + { + if ((svga->vgapal[0].r + svga->vgapal[0].g + svga->vgapal[0].b) >= 0x4e) + return 0; + else + return 0x10; + } + break; case 0x3C5: if ((svga->seqaddr & 0xf) == 7) return svga->seqregs[svga->seqaddr & 0xf] | 4; @@ -212,7 +217,7 @@ void et4000k_out(uint16_t addr, uint8_t val, void *p) et4000->get_korean_font_index = 0; break; case 0x22CF: - switch(et4000->get_korean_font_enabled) + switch(et4000->get_korean_font_enabled) { case 1: et4000->get_korean_font_base = ((val & 0x7F) << 7) | (et4000->get_korean_font_base & 0x7F); @@ -377,6 +382,7 @@ void *et4000_isa_init(const device_t *info) et4000_in, et4000_out, NULL, NULL); + et4000->vram_mask = (device_get_config_int("memory") << 10) - 1; return et4000; } @@ -402,6 +408,7 @@ void *et4000k_isa_init(const device_t *info) et4000k_in, et4000k_out, NULL, NULL); + et4000->vram_mask = (device_get_config_int("memory") << 10) - 1; et4000->svga.ksc5601_sbyte_mask = 0x80; @@ -447,6 +454,7 @@ void *et4000_mca_init(const device_t *info) et4000_in, et4000_out, NULL, NULL); + et4000->vram_mask = (1 << 20) - 1; io_sethandler(0x03c0, 0x0020, et4000_in, NULL, NULL, et4000_out, NULL, NULL, et4000);