Some fixes to mem.c;
Correctly implemented the 256k wrap around on the ET4000AX, fixes DOS/V.
This commit is contained in:
86
src/mem.c
86
src/mem.c
@@ -12,7 +12,7 @@
|
|||||||
* the DYNAMIC_TABLES=1 enables this. Will eventually go
|
* the DYNAMIC_TABLES=1 enables this. Will eventually go
|
||||||
* away, either way...
|
* 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>
|
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Miran Grca, <mgrca8@gmail.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]);
|
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
|
uint8_t
|
||||||
mem_read_bios(uint32_t addr, void *priv)
|
mem_read_bios(uint32_t addr, void *priv)
|
||||||
@@ -1605,7 +1668,7 @@ mem_reset(void)
|
|||||||
*/
|
*/
|
||||||
if (mem_size < 16384)
|
if (mem_size < 16384)
|
||||||
m = 1024UL * 16384;
|
m = 1024UL * 16384;
|
||||||
else
|
else
|
||||||
m = 1024UL * mem_size;
|
m = 1024UL * mem_size;
|
||||||
if (ram != NULL) {
|
if (ram != NULL) {
|
||||||
free(ram);
|
free(ram);
|
||||||
@@ -1675,13 +1738,22 @@ mem_log("MEM: reset: new pages=%08lx, pages_sz=%i\n", pages, pages_sz);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
memset(pages, 0x00, pages_sz*sizeof(page_t));
|
memset(pages, 0x00, pages_sz*sizeof(page_t));
|
||||||
|
|
||||||
|
|
||||||
for (c = 0; c < pages_sz; c++) {
|
for (c = 0; c < pages_sz; c++) {
|
||||||
pages[c].mem = &ram[c << 12];
|
pages[c].mem = &ram[c << 12];
|
||||||
pages[c].write_b = mem_write_ramb_page;
|
pages[c].write_b = mem_write_ramb_page;
|
||||||
pages[c].write_w = mem_write_ramw_page;
|
pages[c].write_w = mem_write_ramw_page;
|
||||||
pages[c].write_l = mem_write_raml_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. */
|
/* 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)
|
if (romset == ROM_IBMPS1_2011)
|
||||||
mem_mapping_add(&romext_mapping, 0xc8000, 0x08000,
|
mem_mapping_add(&romext_mapping, 0xc8000, 0x08000,
|
||||||
mem_read_romext,mem_read_romextw,mem_read_romextl,
|
mem_read_romext,mem_read_romextw,mem_read_romextl,
|
||||||
NULL,NULL, NULL, romext, 0, NULL);
|
NULL,NULL, NULL, romext, 0, NULL);
|
||||||
|
|
||||||
mem_mapping_add(&ram_remapped_mapping, mem_size * 1024, 384 * 1024,
|
mem_mapping_add(&ram_remapped_mapping, mem_size * 1024, 256 * 1024,
|
||||||
mem_read_ram,mem_read_ramw,mem_read_raml,
|
mem_read_remapped, mem_read_remappedw, mem_read_remappedl,
|
||||||
mem_write_remapped, mem_write_remappedw, mem_write_remappedl,
|
mem_write_remapped, mem_write_remappedw, mem_write_remappedl,
|
||||||
ram + 0xA0000, MEM_MAPPING_INTERNAL, NULL);
|
ram + 0xA0000, MEM_MAPPING_INTERNAL, NULL);
|
||||||
mem_mapping_disable(&ram_remapped_mapping);
|
mem_mapping_disable(&ram_remapped_mapping);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Emulation of the Tseng Labs ET4000.
|
* 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, <http://pcem-emulator.co.uk/>
|
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -57,6 +57,7 @@ typedef struct et4000_t
|
|||||||
int get_korean_font_enabled;
|
int get_korean_font_enabled;
|
||||||
int get_korean_font_index;
|
int get_korean_font_index;
|
||||||
uint16_t get_korean_font_base;
|
uint16_t get_korean_font_base;
|
||||||
|
uint32_t vram_mask;
|
||||||
} et4000_t;
|
} et4000_t;
|
||||||
|
|
||||||
static uint8_t crtc_mask[0x40] =
|
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];
|
old = svga->crtc[svga->crtcreg];
|
||||||
val &= crtc_mask[svga->crtcreg];
|
val &= crtc_mask[svga->crtcreg];
|
||||||
svga->crtc[svga->crtcreg] = val;
|
svga->crtc[svga->crtcreg] = val;
|
||||||
|
|
||||||
|
if (svga->crtcreg == 0x36)
|
||||||
|
svga->vram_display_mask = (val & 0x20) ? et4000->vram_mask : 0x3ffff;
|
||||||
|
|
||||||
if (old != val)
|
if (old != val)
|
||||||
{
|
{
|
||||||
if (svga->crtcreg < 0xE || svga->crtcreg > 0x10)
|
if (svga->crtcreg < 0xE || svga->crtcreg > 0x10)
|
||||||
@@ -113,7 +118,7 @@ void et4000_out(uint16_t addr, uint8_t val, void *p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*Note - Silly hack to determine video memory size automatically by ET4000 BIOS.*/
|
/*Note - Silly hack to determine video memory size automatically by ET4000 BIOS.*/
|
||||||
if(svga->crtcreg == 0x37 && !et4000->is_mca)
|
if (svga->crtcreg == 0x37 && !et4000->is_mca)
|
||||||
{
|
{
|
||||||
switch(val & 0x0B)
|
switch(val & 0x0B)
|
||||||
{
|
{
|
||||||
@@ -133,19 +138,19 @@ void et4000_out(uint16_t addr, uint8_t val, void *p)
|
|||||||
case 0x03:
|
case 0x03:
|
||||||
case 0x08:
|
case 0x08:
|
||||||
case 0x09:
|
case 0x09:
|
||||||
if(svga->vram_max == 256 * 1024)
|
if (svga->vram_max == 256 * 1024)
|
||||||
mem_mapping_enable(&svga->mapping);
|
mem_mapping_enable(&svga->mapping);
|
||||||
else
|
else
|
||||||
mem_mapping_disable(&svga->mapping);
|
mem_mapping_disable(&svga->mapping);
|
||||||
break;
|
break;
|
||||||
case 0x0A:
|
case 0x0A:
|
||||||
if(svga->vram_max == 512 * 1024)
|
if (svga->vram_max == 512 * 1024)
|
||||||
mem_mapping_enable(&svga->mapping);
|
mem_mapping_enable(&svga->mapping);
|
||||||
else
|
else
|
||||||
mem_mapping_disable(&svga->mapping);
|
mem_mapping_disable(&svga->mapping);
|
||||||
break;
|
break;
|
||||||
case 0x0B:
|
case 0x0B:
|
||||||
if(svga->vram_max == 1024 * 1024)
|
if (svga->vram_max == 1024 * 1024)
|
||||||
mem_mapping_enable(&svga->mapping);
|
mem_mapping_enable(&svga->mapping);
|
||||||
else
|
else
|
||||||
mem_mapping_disable(&svga->mapping);
|
mem_mapping_disable(&svga->mapping);
|
||||||
@@ -377,6 +382,7 @@ void *et4000_isa_init(const device_t *info)
|
|||||||
et4000_in, et4000_out,
|
et4000_in, et4000_out,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
|
et4000->vram_mask = (device_get_config_int("memory") << 10) - 1;
|
||||||
|
|
||||||
return et4000;
|
return et4000;
|
||||||
}
|
}
|
||||||
@@ -402,6 +408,7 @@ void *et4000k_isa_init(const device_t *info)
|
|||||||
et4000k_in, et4000k_out,
|
et4000k_in, et4000k_out,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
|
et4000->vram_mask = (device_get_config_int("memory") << 10) - 1;
|
||||||
|
|
||||||
et4000->svga.ksc5601_sbyte_mask = 0x80;
|
et4000->svga.ksc5601_sbyte_mask = 0x80;
|
||||||
|
|
||||||
@@ -447,6 +454,7 @@ void *et4000_mca_init(const device_t *info)
|
|||||||
et4000_in, et4000_out,
|
et4000_in, et4000_out,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
|
et4000->vram_mask = (1 << 20) - 1;
|
||||||
|
|
||||||
io_sethandler(0x03c0, 0x0020, et4000_in, NULL, NULL, et4000_out, NULL, NULL, et4000);
|
io_sethandler(0x03c0, 0x0020, et4000_in, NULL, NULL, et4000_out, NULL, NULL, et4000);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user