NEAT: Mirror EMS port 2x8h on port 2x9h for reads as well, fixes EMS detection by Chips Expanded Manager version 2.2.0.
This commit is contained in:
@@ -34,8 +34,6 @@
|
|||||||
#include <86box/plat_unused.h>
|
#include <86box/plat_unused.h>
|
||||||
#include <86box/chipset.h>
|
#include <86box/chipset.h>
|
||||||
|
|
||||||
#define NEAT_DEBUG 0
|
|
||||||
|
|
||||||
#define EMS_MAXPAGE 4
|
#define EMS_MAXPAGE 4
|
||||||
#define EMS_PGSIZE 16384
|
#define EMS_PGSIZE 16384
|
||||||
#define EMS_PGMASK 16383
|
#define EMS_PGMASK 16383
|
||||||
@@ -328,7 +326,7 @@ ems_readb(uint32_t addr, void *priv)
|
|||||||
{
|
{
|
||||||
ram_page_t *dev = (ram_page_t *) priv;
|
ram_page_t *dev = (ram_page_t *) priv;
|
||||||
uint8_t ret = 0xff;
|
uint8_t ret = 0xff;
|
||||||
#ifdef ENABLE_NEAT_LOG
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 3)
|
||||||
uint32_t old = addr;
|
uint32_t old = addr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -338,7 +336,9 @@ ems_readb(uint32_t addr, void *priv)
|
|||||||
if (addr < (mem_size << 10))
|
if (addr < (mem_size << 10))
|
||||||
ret = *(uint8_t *) &(ram[addr]);
|
ret = *(uint8_t *) &(ram[addr]);
|
||||||
|
|
||||||
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 3)
|
||||||
neat_log("[R08] %08X -> %08X (%08X): ret = %02X\n", old, addr, (mem_size << 10), ret);
|
neat_log("[R08] %08X -> %08X (%08X): ret = %02X\n", old, addr, (mem_size << 10), ret);
|
||||||
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,7 +348,7 @@ ems_readw(uint32_t addr, void *priv)
|
|||||||
{
|
{
|
||||||
ram_page_t *dev = (ram_page_t *) priv;
|
ram_page_t *dev = (ram_page_t *) priv;
|
||||||
uint16_t ret = 0xffff;
|
uint16_t ret = 0xffff;
|
||||||
#ifdef ENABLE_NEAT_LOG
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 3)
|
||||||
uint32_t old = addr;
|
uint32_t old = addr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -358,7 +358,9 @@ ems_readw(uint32_t addr, void *priv)
|
|||||||
if (addr < (mem_size << 10))
|
if (addr < (mem_size << 10))
|
||||||
ret = *(uint16_t *) &(ram[addr]);
|
ret = *(uint16_t *) &(ram[addr]);
|
||||||
|
|
||||||
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 3)
|
||||||
neat_log("[R16] %08X -> %08X (%08X): ret = %04X\n", old, addr, (mem_size << 10), ret);
|
neat_log("[R16] %08X -> %08X (%08X): ret = %04X\n", old, addr, (mem_size << 10), ret);
|
||||||
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -367,13 +369,15 @@ static void
|
|||||||
ems_writeb(uint32_t addr, uint8_t val, void *priv)
|
ems_writeb(uint32_t addr, uint8_t val, void *priv)
|
||||||
{
|
{
|
||||||
ram_page_t *dev = (ram_page_t *) priv;
|
ram_page_t *dev = (ram_page_t *) priv;
|
||||||
#ifdef ENABLE_NEAT_LOG
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 3)
|
||||||
uint32_t old = addr;
|
uint32_t old = addr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Write the data. */
|
/* Write the data. */
|
||||||
addr = addr - dev->virt_base + dev->phys_base;
|
addr = addr - dev->virt_base + dev->phys_base;
|
||||||
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 3)
|
||||||
neat_log("[W08] %08X -> %08X (%08X): val = %02X\n", old, addr, (mem_size << 10), val);
|
neat_log("[W08] %08X -> %08X (%08X): val = %02X\n", old, addr, (mem_size << 10), val);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (addr < (mem_size << 10))
|
if (addr < (mem_size << 10))
|
||||||
*(uint8_t *) &(ram[addr]) = val;
|
*(uint8_t *) &(ram[addr]) = val;
|
||||||
@@ -384,13 +388,15 @@ static void
|
|||||||
ems_writew(uint32_t addr, uint16_t val, void *priv)
|
ems_writew(uint32_t addr, uint16_t val, void *priv)
|
||||||
{
|
{
|
||||||
ram_page_t *dev = (ram_page_t *) priv;
|
ram_page_t *dev = (ram_page_t *) priv;
|
||||||
#ifdef ENABLE_NEAT_LOG
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 3)
|
||||||
uint32_t old = addr;
|
uint32_t old = addr;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Write the data. */
|
/* Write the data. */
|
||||||
addr = addr - dev->virt_base + dev->phys_base;
|
addr = addr - dev->virt_base + dev->phys_base;
|
||||||
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 3)
|
||||||
neat_log("[W16] %08X -> %08X (%08X): val = %04X\n", old, addr, (mem_size << 10), val);
|
neat_log("[W16] %08X -> %08X (%08X): val = %04X\n", old, addr, (mem_size << 10), val);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (addr < (mem_size << 10))
|
if (addr < (mem_size << 10))
|
||||||
*(uint16_t *) &(ram[addr]) = val;
|
*(uint16_t *) &(ram[addr]) = val;
|
||||||
@@ -505,7 +511,7 @@ ems_recalc(neat_t *dev, ram_page_t *ems)
|
|||||||
|
|
||||||
neat_mem_update_state(dev, ems->virt_base, EMS_PGSIZE, MEM_FLAG_EMS, MEM_FMASK_EMS);
|
neat_mem_update_state(dev, ems->virt_base, EMS_PGSIZE, MEM_FLAG_EMS, MEM_FMASK_EMS);
|
||||||
|
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT EMS: page %d set to %08lx, %sabled)\n",
|
neat_log("NEAT EMS: page %d set to %08lx, %sabled)\n",
|
||||||
ems->page, ems->addr - ram, ems->enabled ? "en" : "dis");
|
ems->page, ems->addr - ram, ems->enabled ? "en" : "dis");
|
||||||
#endif
|
#endif
|
||||||
@@ -528,7 +534,7 @@ ems_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
int8_t new_enabled;
|
int8_t new_enabled;
|
||||||
uint32_t new_phys_base;
|
uint32_t new_phys_base;
|
||||||
|
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: ems_write(%04x, %02x)\n", port, val);
|
neat_log("NEAT: ems_write(%04x, %02x)\n", port, val);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -577,6 +583,7 @@ ems_read(uint16_t port, void *priv)
|
|||||||
|
|
||||||
switch (port & 0x000f) {
|
switch (port & 0x000f) {
|
||||||
case 0x0008: /* page number register */
|
case 0x0008: /* page number register */
|
||||||
|
case 0x0009:
|
||||||
ret = (dev->ems[vpage].phys_base / EMS_PGSIZE) & 0x7f;
|
ret = (dev->ems[vpage].phys_base / EMS_PGSIZE) & 0x7f;
|
||||||
if (dev->ems[vpage].enabled)
|
if (dev->ems[vpage].enabled)
|
||||||
ret |= 0x80;
|
ret |= 0x80;
|
||||||
@@ -587,7 +594,7 @@ ems_read(uint16_t port, void *priv)
|
|||||||
|
|
||||||
neat_log("Port: %04X, ret: %02X\n", port, ret);
|
neat_log("Port: %04X, ret: %02X\n", port, ret);
|
||||||
|
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: ems_read(%04x) = %02x\n", port, ret);
|
neat_log("NEAT: ems_read(%04x) = %02x\n", port, ret);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -686,7 +693,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
uint8_t *reg;
|
uint8_t *reg;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
#if NEAT_DEBUG > 2
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: write(%04x, %02x)\n", port, val);
|
neat_log("NEAT: write(%04x, %02x)\n", port, val);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -704,7 +711,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
*reg = (*reg & ~RA0_MASK) | val | (RA0_REV_ID << RA0_REV_SH);
|
*reg = (*reg & ~RA0_MASK) | val | (RA0_REV_ID << RA0_REV_SH);
|
||||||
if ((xval & 0x20) && (val & 0x20))
|
if ((xval & 0x20) && (val & 0x20))
|
||||||
outb(0x64, 0xfe);
|
outb(0x64, 0xfe);
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RA0=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RA0=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -712,7 +719,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
case REG_RA1:
|
case REG_RA1:
|
||||||
val &= RA1_MASK;
|
val &= RA1_MASK;
|
||||||
*reg = (*reg & ~RA1_MASK) | val;
|
*reg = (*reg & ~RA1_MASK) | val;
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RA1=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RA1=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -720,7 +727,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
case REG_RA2:
|
case REG_RA2:
|
||||||
val &= RA2_MASK;
|
val &= RA2_MASK;
|
||||||
*reg = (*reg & ~RA2_MASK) | val;
|
*reg = (*reg & ~RA2_MASK) | val;
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RA2=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RA2=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -728,7 +735,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
case REG_RB0:
|
case REG_RB0:
|
||||||
val &= RB0_MASK;
|
val &= RB0_MASK;
|
||||||
*reg = (*reg & ~RB0_MASK) | val | (RB0_REV_ID << RB0_REV_SH);
|
*reg = (*reg & ~RB0_MASK) | val | (RB0_REV_ID << RB0_REV_SH);
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RB0=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RB0=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -737,7 +744,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
val &= RB1_MASK;
|
val &= RB1_MASK;
|
||||||
*reg = (*reg & ~RB1_MASK) | val;
|
*reg = (*reg & ~RB1_MASK) | val;
|
||||||
shadow_recalc(dev);
|
shadow_recalc(dev);
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RB1=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RB1=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -749,7 +756,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
neat_mem_update_state(dev, 0x00080000, 0x00020000, MEM_FLAG_READ | MEM_FLAG_WRITE, MEM_FMASK_SHADOW);
|
neat_mem_update_state(dev, 0x00080000, 0x00020000, MEM_FLAG_READ | MEM_FLAG_WRITE, MEM_FMASK_SHADOW);
|
||||||
else
|
else
|
||||||
neat_mem_update_state(dev, 0x00080000, 0x00020000, 0x00, MEM_FMASK_SHADOW);
|
neat_mem_update_state(dev, 0x00080000, 0x00020000, 0x00, MEM_FMASK_SHADOW);
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RB2=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RB2=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -758,7 +765,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
val &= RB3_MASK;
|
val &= RB3_MASK;
|
||||||
*reg = (*reg & ~RB3_MASK) | val;
|
*reg = (*reg & ~RB3_MASK) | val;
|
||||||
shadow_recalc(dev);
|
shadow_recalc(dev);
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RB3=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RB3=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -767,7 +774,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
val &= RB4_MASK;
|
val &= RB4_MASK;
|
||||||
*reg = (*reg & ~RB4_MASK) | val;
|
*reg = (*reg & ~RB4_MASK) | val;
|
||||||
shadow_recalc(dev);
|
shadow_recalc(dev);
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RB4=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RB4=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -776,7 +783,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
val &= RB5_MASK;
|
val &= RB5_MASK;
|
||||||
*reg = (*reg & ~RB5_MASK) | val;
|
*reg = (*reg & ~RB5_MASK) | val;
|
||||||
shadow_recalc(dev);
|
shadow_recalc(dev);
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RB5=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RB5=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -784,7 +791,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
case REG_RB6:
|
case REG_RB6:
|
||||||
val &= RB6_MASK;
|
val &= RB6_MASK;
|
||||||
*reg = (*reg & ~RB6_MASK) | val;
|
*reg = (*reg & ~RB6_MASK) | val;
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RB6=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RB6=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -803,7 +810,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
if ((xval & RB7_EMSEN) && (val & RB7_EMSEN))
|
if ((xval & RB7_EMSEN) && (val & RB7_EMSEN))
|
||||||
ems_set_handlers(dev);
|
ems_set_handlers(dev);
|
||||||
|
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RB7=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RB7=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -811,7 +818,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
case REG_RB8:
|
case REG_RB8:
|
||||||
val &= RB8_MASK;
|
val &= RB8_MASK;
|
||||||
*reg = (*reg & ~RB8_MASK) | val;
|
*reg = (*reg & ~RB8_MASK) | val;
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RB8=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RB8=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
@@ -819,7 +826,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
case REG_RB9:
|
case REG_RB9:
|
||||||
val &= RB9_MASK;
|
val &= RB9_MASK;
|
||||||
*reg = (*reg & ~RB9_MASK) | val;
|
*reg = (*reg & ~RB9_MASK) | val;
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RB9=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RB9=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -842,7 +849,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
case REG_RB10:
|
case REG_RB10:
|
||||||
val &= RB10_MASK;
|
val &= RB10_MASK;
|
||||||
*reg = (*reg & ~RB10_MASK) | val;
|
*reg = (*reg & ~RB10_MASK) | val;
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RB10=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RB10=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -877,7 +884,7 @@ neat_write(uint16_t port, uint8_t val, void *priv)
|
|||||||
case REG_RB12:
|
case REG_RB12:
|
||||||
val &= RB12_MASK;
|
val &= RB12_MASK;
|
||||||
*reg = (*reg & ~RB12_MASK) | val;
|
*reg = (*reg & ~RB12_MASK) | val;
|
||||||
#if NEAT_DEBUG > 1
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: RB12=%02x(%02x)\n", val, *reg);
|
neat_log("NEAT: RB12=%02x(%02x)\n", val, *reg);
|
||||||
#endif
|
#endif
|
||||||
i = (val & RB12_EMSLEN) >> RB12_EMSLEN_SH;
|
i = (val & RB12_EMSLEN) >> RB12_EMSLEN_SH;
|
||||||
@@ -944,7 +951,7 @@ neat_read(uint16_t port, void *priv)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if NEAT_DEBUG > 2
|
#if defined(ENABLE_NEAT_LOG) && (ENABLE_NEAT_LOG == 2)
|
||||||
neat_log("NEAT: read(%04x) = %02x\n", port, ret);
|
neat_log("NEAT: read(%04x) = %02x\n", port, ret);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user