ISA Memory cards: Partial rewrite of EMS to support up to two ranges on each EV-159, and make the page frame address changing actually work.

This commit is contained in:
OBattler
2024-06-07 06:25:49 +02:00
parent 8301f82c70
commit b3e72559a7

View File

@@ -124,6 +124,11 @@ typedef struct emsreg_t {
char pad; char pad;
uint8_t *addr; /* start addr in EMS RAM */ uint8_t *addr; /* start addr in EMS RAM */
mem_mapping_t mapping; /* mapping entry for page */ mem_mapping_t mapping; /* mapping entry for page */
uint8_t *ram;
uint8_t *frame_val;
uint16_t *ems_size;
uint16_t *ems_pages;
uint32_t *frame_addr;
} emsreg_t; } emsreg_t;
typedef struct ext_ram_t { typedef struct ext_ram_t {
@@ -136,20 +141,23 @@ typedef struct memdev_t {
uint8_t board : 6; /* board type */ uint8_t board : 6; /* board type */
uint8_t reserved : 2; uint8_t reserved : 2;
uint8_t flags; uint8_t flags;
#define FLAG_CONFIG 0x01 /* card is configured */ #define FLAG_CONFIG 0x01 /* card is configured */
#define FLAG_WIDE 0x10 /* card uses 16b mode */ #define FLAG_WIDE 0x10 /* card uses 16b mode */
#define FLAG_FAST 0x20 /* fast (<= 120ns) chips */ #define FLAG_FAST 0x20 /* fast (<= 120ns) chips */
#define FLAG_EMS 0x40 /* card has EMS mode enabled */ #define FLAG_EMS 0x40 /* card has EMS mode enabled */
uint16_t total_size; /* configured size in KB */ uint8_t frame_val[2];
uint32_t base_addr; /* configured I/O address */
uint32_t start_addr; /* configured memory start */
uint32_t frame_addr; /* configured frame address */
uint16_t ems_size; /* EMS size in KB */ uint16_t total_size; /* configured size in KB */
uint16_t ems_pages; /* EMS size in pages */ uint16_t base_addr[2]; /* configured I/O address */
uint32_t ems_start; /* start of EMS in RAM */
uint32_t start_addr; /* configured memory start */
uint32_t frame_addr[2]; /* configured frame address */
uint16_t ems_size[2]; /* EMS size in KB */
uint16_t ems_pages[2]; /* EMS size in pages */
uint32_t ems_start[2]; /* start of EMS in RAM */
uint8_t *ram; /* allocated RAM buffer */ uint8_t *ram; /* allocated RAM buffer */
@@ -158,7 +166,7 @@ typedef struct memdev_t {
mem_mapping_t low_mapping; /* mapping for low mem */ mem_mapping_t low_mapping; /* mapping for low mem */
mem_mapping_t high_mapping; /* mapping for high mem */ mem_mapping_t high_mapping; /* mapping for high mem */
emsreg_t ems[EMS_MAXPAGE]; /* EMS controller registers */ emsreg_t ems[EMS_MAXPAGE * 2]; /* EMS controller registers */
} memdev_t; } memdev_t;
#ifdef ENABLE_ISAMEM_LOG #ifdef ENABLE_ISAMEM_LOG
@@ -231,14 +239,14 @@ ram_writew(uint32_t addr, uint16_t val, void *priv)
static uint8_t static uint8_t
ems_readb(uint32_t addr, void *priv) ems_readb(uint32_t addr, void *priv)
{ {
memdev_t *dev = (memdev_t *) priv; emsreg_t *dev = (emsreg_t *) priv;
uint8_t ret = 0xff; uint8_t ret = 0xff;
/* Grab the data. */ /* Grab the data. */
ret = *(uint8_t *) (dev->ems[(addr & 0xffff) >> 14].addr + (addr & 0x3fff)); ret = *(uint8_t *) (dev->addr + (addr & 0x3fff));
#if ISAMEM_DEBUG #if ISAMEM_DEBUG
if ((addr % 4096) == 0) if ((addr % 4096) == 0)
isamem_log("EMS readb(%06x) = %02x\n", addr - dev & 0x3fff, ret); isamem_log("EMS readb(%06x) = %02x\n", addr & 0x3fff, ret);
#endif #endif
return ret; return ret;
@@ -248,14 +256,14 @@ ems_readb(uint32_t addr, void *priv)
static uint16_t static uint16_t
ems_readw(uint32_t addr, void *priv) ems_readw(uint32_t addr, void *priv)
{ {
memdev_t *dev = (memdev_t *) priv; emsreg_t *dev = (emsreg_t *) priv;
uint16_t ret = 0xffff; uint16_t ret = 0xffff;
/* Grab the data. */ /* Grab the data. */
ret = *(uint16_t *) (dev->ems[(addr & 0xffff) >> 14].addr + (addr & 0x3fff)); ret = *(uint16_t *) (dev->addr + (addr & 0x3fff));
#if ISAMEM_DEBUG #if ISAMEM_DEBUG
if ((addr % 4096) == 0) if ((addr % 4096) == 0)
isamem_log("EMS readw(%06x) = %04x\n", addr - dev & 0x3fff, ret); isamem_log("EMS readw(%06x) = %04x\n", addr & 0x3fff, ret);
#endif #endif
return ret; return ret;
@@ -265,46 +273,50 @@ ems_readw(uint32_t addr, void *priv)
static void static void
ems_writeb(uint32_t addr, uint8_t val, void *priv) ems_writeb(uint32_t addr, uint8_t val, void *priv)
{ {
memdev_t *dev = (memdev_t *) priv; emsreg_t *dev = (emsreg_t *) priv;
/* Write the data. */ /* Write the data. */
#if ISAMEM_DEBUG #if ISAMEM_DEBUG
if ((addr % 4096) == 0) if ((addr % 4096) == 0)
isamem_log("EMS writeb(%06x, %02x)\n", addr - dev & 0x3fff, val); isamem_log("EMS writeb(%06x, %02x)\n", addr & 0x3fff, val);
#endif #endif
*(uint8_t *) (dev->ems[(addr & 0xffff) >> 14].addr + (addr & 0x3fff)) = val; *(uint8_t *) (dev->addr + (addr & 0x3fff)) = val;
} }
/* Write one word to onboard paged RAM. */ /* Write one word to onboard paged RAM. */
static void static void
ems_writew(uint32_t addr, uint16_t val, void *priv) ems_writew(uint32_t addr, uint16_t val, void *priv)
{ {
memdev_t *dev = (memdev_t *) priv; emsreg_t *dev = (emsreg_t *) priv;
/* Write the data. */ /* Write the data. */
#if ISAMEM_DEBUG #if ISAMEM_DEBUG
if ((addr % 4096) == 0) if ((addr % 4096) == 0)
isamem_log("EMS writew(%06x, %04x)\n", addr & 0x3fff, val); isamem_log("EMS writew(%06x, %04x)\n", addr & 0x3fff, val);
#endif #endif
*(uint16_t *) (dev->ems[(addr & 0xffff) >> 14].addr + (addr & 0x3fff)) = val; *(uint16_t *) (dev->addr + (addr & 0x3fff)) = val;
} }
/* Handle a READ operation from one of our registers. */ /* Handle a READ operation from one of our registers. */
static uint8_t static uint8_t
ems_read(uint16_t port, void *priv) ems_in(uint16_t port, void *priv)
{ {
const memdev_t *dev = (memdev_t *) priv; const emsreg_t *dev = (emsreg_t *) priv;
uint8_t ret = 0xff; uint8_t ret = 0xff;
#ifdef ENABLE_ISAMEM_LOG
int vpage; int vpage;
#endif
/* Get the viewport page number. */ /* Get the viewport page number. */
#ifdef ENABLE_ISAMEM_LOG
vpage = (port / EMS_PGSIZE); vpage = (port / EMS_PGSIZE);
#endif
port &= (EMS_PGSIZE - 1); port &= (EMS_PGSIZE - 1);
switch (port - dev->base_addr) { switch (port & 0x0001) {
case 0x0000: /* page number register */ case 0x0000: /* page number register */
ret = dev->ems[vpage].page; ret = dev->page;
if (dev->ems[vpage].enabled) if (dev->enabled)
ret |= 0x80; ret |= 0x80;
break; break;
@@ -322,15 +334,14 @@ ems_read(uint16_t port, void *priv)
/* Handle a READ operation from one of our registers. */ /* Handle a READ operation from one of our registers. */
static uint8_t static uint8_t
consecutive_ems_read(uint16_t port, void *priv) consecutive_ems_in(uint16_t port, void *priv)
{ {
const memdev_t *dev = (memdev_t *) priv; const memdev_t *dev = (memdev_t *) priv;
uint8_t ret = 0xff; uint8_t ret = 0xff;
int vpage; int vpage;
/* Get the viewport page number. */ /* Get the viewport page number. */
vpage = (port - dev->base_addr); vpage = (port - dev->base_addr[0]);
ret = dev->ems[vpage].page; ret = dev->ems[vpage].page;
if (dev->ems[vpage].enabled) if (dev->ems[vpage].enabled)
@@ -343,73 +354,71 @@ consecutive_ems_read(uint16_t port, void *priv)
/* Handle a WRITE operation to one of our registers. */ /* Handle a WRITE operation to one of our registers. */
static void static void
ems_write(uint16_t port, uint8_t val, void *priv) ems_out(uint16_t port, uint8_t val, void *priv)
{ {
memdev_t *dev = (memdev_t *) priv; emsreg_t *dev = (emsreg_t *) priv;
int vpage; int vpage;
/* Get the viewport page number. */ /* Get the viewport page number. */
vpage = (port / EMS_PGSIZE); vpage = (port / EMS_PGSIZE);
port &= (EMS_PGSIZE - 1); port &= (EMS_PGSIZE - 1);
switch (port - dev->base_addr) { switch (port & 0x0001) {
case 0x0000: /* page mapping registers */ case 0x0000: /* page mapping registers */
isamem_log("ISAMEM: write(%04x, %02x) to page mapping registers! page=%d\n", port, val, vpage);
/* Set the page number. */ /* Set the page number. */
dev->ems[vpage].enabled = (val & 0x80); dev->enabled = (val & 0x80);
dev->ems[vpage].page = (val & 0x7f); dev->page = (val & 0x7f);
if (dev->ems[vpage].page < dev->ems_pages) { if (dev->enabled && (dev->page < *dev->ems_pages)) {
/* Pre-calculate the page address in EMS RAM. */ /* Pre-calculate the page address in EMS RAM. */
dev->ems[vpage].addr = dev->ram + dev->ems_start + ((val & 0x7f) * EMS_PGSIZE); dev->addr = dev->ram + ((val & 0x7f) * EMS_PGSIZE);
} else {
/* That page does not exist. */ isamem_log("ISAMEM: map port %04X, page %i, starting at %08X: %08X -> %08X\n", port,
dev->ems[vpage].enabled = 0; vpage, *dev->frame_addr,
} *dev->frame_addr + (EMS_PGSIZE * (vpage & 3)), dev->addr - dev->ram);
mem_mapping_set_addr(&dev->mapping, *dev->frame_addr + (EMS_PGSIZE * vpage), EMS_PGSIZE);
if (dev->ems[vpage].enabled) {
/* Update the EMS RAM address for this page. */ /* Update the EMS RAM address for this page. */
mem_mapping_set_exec(&dev->ems[vpage].mapping, mem_mapping_set_exec(&dev->mapping, dev->addr);
dev->ems[vpage].addr);
/* Enable this page. */ /* Enable this page. */
mem_mapping_enable(&dev->ems[vpage].mapping); mem_mapping_enable(&dev->mapping);
} else { } else {
isamem_log("ISAMEM: map port %04X, page %i, starting at %08X: %08X -> N/A\n",
port, vpage, *dev->frame_addr, *dev->frame_addr + (EMS_PGSIZE * vpage));
/* Disable this page. */ /* Disable this page. */
mem_mapping_disable(&dev->ems[vpage].mapping); mem_mapping_disable(&dev->mapping);
} }
break; break;
case 0x0001: /* page frame registers */ case 0x0001: /* page frame registers */
isamem_log("ISAMEM: write(%04x, %02x) to page frame registers! page=%d\n", port, val, vpage); /*
* The EV-159 EMM driver configures the frame address
/* * by setting bits in these registers. The information
* The EV-159 EMM driver configures the frame address * in their manual is unclear, but here is what was
* by setting bits in these registers. The information * found out by repeatedly changing EMM's config:
* in their manual is unclear, but here is what was *
* found out by repeatedly changing EMM's config: * 08 04 00 Address
* * -----------------
* 00 04 08 Address * 00 00 00 C4000
* ----------------- * 00 00 80 C8000
* 80 c0 e0 C0000 * 00 80 00 CC000
* 80 c0 e0 C4000 * 00 80 80 D0000
* 80 c0 e0 C8000 * 80 00 00 D4000
* 80 c0 e0 CC000 * 80 00 80 D8000
* 80 c0 e0 D0000 * 80 80 00 DC000
* 80 c0 e0 D4000 * 80 80 80 E0000
* 80 c0 e0 D8000 */
* 80 c0 e0 DC000 dev->frame = val;
* 80 c0 e0 E0000 *dev->frame_val = (*dev->frame_val & ~(1 << vpage)) | ((val >> 7) << vpage);
*/ *dev->frame_addr = 0x000c4000 + (*dev->frame_val << 14);
dev->ems[vpage].frame = val; isamem_log("ISAMEM: map port %04X page %i: frame_addr = %08X\n", port, vpage, *dev->frame_addr);
dev->frame_addr = 0x000c4000 + ((((dev->ems[2].frame & 0x80) >> 5) || /* Destroy the page registers. */
((dev->ems[1].frame & 0x80) >> 6) || for (uint8_t i = 0; i < 4; i ++) {
((dev->ems[0].frame & 0x80) >> 7)) << 14); isamem_log(" ");
mem_mapping_disable(&dev->ems[0].mapping); outb((port & 0x3ffe) + (i << 14), 0x00);
mem_mapping_disable(&dev->ems[1].mapping); }
mem_mapping_disable(&dev->ems[2].mapping);
mem_mapping_disable(&dev->ems[3].mapping);
break; break;
default: default:
@@ -419,13 +428,13 @@ ems_write(uint16_t port, uint8_t val, void *priv)
/* Handle a WRITE operation to one of our registers. */ /* Handle a WRITE operation to one of our registers. */
static void static void
consecutive_ems_write(uint16_t port, uint8_t val, void *priv) consecutive_ems_out(uint16_t port, uint8_t val, void *priv)
{ {
memdev_t *dev = (memdev_t *) priv; memdev_t *dev = (memdev_t *) priv;
int vpage; int vpage;
/* Get the viewport page number. */ /* Get the viewport page number. */
vpage = (port - dev->base_addr); vpage = (port - dev->base_addr[0]);
isamem_log("ISAMEM: write(%04x, %02x) to page mapping registers! (page=%d)\n", port, val, vpage); isamem_log("ISAMEM: write(%04x, %02x) to page mapping registers! (page=%d)\n", port, val, vpage);
@@ -435,9 +444,9 @@ consecutive_ems_write(uint16_t port, uint8_t val, void *priv)
/* Make sure we can do that.. */ /* Make sure we can do that.. */
if (dev->flags & FLAG_CONFIG) { if (dev->flags & FLAG_CONFIG) {
if (dev->ems[vpage].page < dev->ems_pages) { if (dev->ems[vpage].page < dev->ems_pages[0]) {
/* Pre-calculate the page address in EMS RAM. */ /* Pre-calculate the page address in EMS RAM. */
dev->ems[vpage].addr = dev->ram + dev->ems_start + (val * EMS_PGSIZE); dev->ems[vpage].addr = dev->ram + dev->ems_start[0] + (val * EMS_PGSIZE);
} else { } else {
/* That page does not exist. */ /* That page does not exist. */
dev->ems[vpage].enabled = 0; dev->ems[vpage].enabled = 0;
@@ -474,6 +483,9 @@ isamem_init(const device_t *info)
dev->name = info->name; dev->name = info->name;
dev->board = info->local; dev->board = info->local;
dev->base_addr[1] = 0x0000;
dev->frame_addr[1] = 0x00000000;
/* Do per-board initialization. */ /* Do per-board initialization. */
tot = 0; tot = 0;
switch (dev->board) { switch (dev->board) {
@@ -497,67 +509,69 @@ isamem_init(const device_t *info)
break; break;
case ISAMEM_EMS5150_CARD: /* Micro Mainframe EMS-5150(T) */ case ISAMEM_EMS5150_CARD: /* Micro Mainframe EMS-5150(T) */
dev->base_addr = device_get_config_hex16("base"); dev->base_addr[0] = device_get_config_hex16("base");
dev->total_size = device_get_config_int("size"); dev->total_size = device_get_config_int("size");
dev->start_addr = 0; dev->start_addr = 0;
dev->frame_addr = 0xD0000; dev->frame_addr[0] = 0xd0000;
dev->flags |= (FLAG_EMS | FLAG_CONFIG); dev->flags |= (FLAG_EMS | FLAG_CONFIG);
break; break;
case ISAMEM_EV159_CARD: /* Everex EV-159 RAM 3000 */ case ISAMEM_EV159_CARD: /* Everex EV-159 RAM 3000 */
dev->base_addr = device_get_config_hex16("base"); dev->base_addr[0] = device_get_config_hex16("base");
dev->total_size = device_get_config_int("size"); dev->base_addr[1] = device_get_config_hex16("base2");
dev->start_addr = device_get_config_int("start"); dev->total_size = device_get_config_int("size");
tot = device_get_config_int("length"); dev->start_addr = device_get_config_int("start");
tot = device_get_config_int("length");
if (!!device_get_config_int("width")) if (!!device_get_config_int("width"))
dev->flags |= FLAG_WIDE; dev->flags |= FLAG_WIDE;
if (!!device_get_config_int("speed")) if (!!device_get_config_int("speed"))
dev->flags |= FLAG_FAST; dev->flags |= FLAG_FAST;
if (!!device_get_config_int("ems")) if (!!device_get_config_int("ems"))
dev->flags |= FLAG_EMS; dev->flags |= FLAG_EMS;
dev->frame_addr = 0xE0000; dev->frame_addr[0] = 0xd0000;
dev->frame_addr[1] = 0xe0000;
break; break;
case ISAMEM_EV165A_CARD: /* Everex Maxi Magic EV-165A */ case ISAMEM_EV165A_CARD: /* Everex Maxi Magic EV-165A */
dev->base_addr = device_get_config_hex16("base"); dev->base_addr[0] = device_get_config_hex16("base");
dev->total_size = device_get_config_int("size"); dev->total_size = device_get_config_int("size");
dev->start_addr = device_get_config_int("start"); dev->start_addr = device_get_config_int("start");
tot = device_get_config_int("length"); tot = device_get_config_int("length");
if (!!device_get_config_int("ems")) if (!!device_get_config_int("ems"))
dev->flags |= FLAG_EMS; dev->flags |= FLAG_EMS;
dev->frame_addr = 0xE0000; dev->frame_addr[0] = 0xe0000;
break; break;
case ISAMEM_RAMPAGEXT_CARD: /* AST RAMpage/XT */ case ISAMEM_RAMPAGEXT_CARD: /* AST RAMpage/XT */
dev->base_addr = device_get_config_hex16("base"); dev->base_addr[0] = device_get_config_hex16("base");
dev->total_size = device_get_config_int("size"); dev->total_size = device_get_config_int("size");
dev->start_addr = device_get_config_int("start"); dev->start_addr = device_get_config_int("start");
tot = dev->total_size; tot = dev->total_size;
dev->flags |= FLAG_EMS; dev->flags |= FLAG_EMS;
dev->frame_addr = 0xE0000; dev->frame_addr[0] = 0xe0000;
break; break;
case ISAMEM_ABOVEBOARD_CARD: /* Intel AboveBoard */ case ISAMEM_ABOVEBOARD_CARD: /* Intel AboveBoard */
case ISAMEM_BRAT_CARD: /* BocaRAM/AT */ case ISAMEM_BRAT_CARD: /* BocaRAM/AT */
dev->base_addr = device_get_config_hex16("base"); dev->base_addr[0] = device_get_config_hex16("base");
dev->total_size = device_get_config_int("size"); dev->total_size = device_get_config_int("size");
if (!!device_get_config_int("start")) if (!!device_get_config_int("start"))
dev->start_addr = device_get_config_int("start"); dev->start_addr = device_get_config_int("start");
dev->frame_addr = device_get_config_hex20("frame"); dev->frame_addr[0] = device_get_config_hex20("frame");
dev->flags |= (FLAG_EMS); dev->flags |= (FLAG_EMS);
if (!!device_get_config_int("width")) if (!!device_get_config_int("width"))
dev->flags |= FLAG_WIDE; dev->flags |= FLAG_WIDE;
if (!!device_get_config_int("speed")) if (!!device_get_config_int("speed"))
dev->flags |= FLAG_FAST; dev->flags |= FLAG_FAST;
break; break;
case ISAMEM_BRXT_CARD: /* BocaRAM/XT */ case ISAMEM_BRXT_CARD: /* BocaRAM/XT */
case ISAMEM_LOTECH_CARD: case ISAMEM_LOTECH_CARD:
dev->base_addr = device_get_config_hex16("base"); dev->base_addr[0] = device_get_config_hex16("base");
dev->total_size = device_get_config_int("size"); dev->total_size = device_get_config_int("size");
dev->start_addr = 0; dev->start_addr = 0;
dev->frame_addr = device_get_config_hex20("frame"); dev->frame_addr[0] = device_get_config_hex20("frame");
dev->flags |= (FLAG_EMS | FLAG_CONFIG); dev->flags |= (FLAG_EMS | FLAG_CONFIG);
default: default:
break; break;
@@ -714,25 +728,48 @@ isamem_init(const device_t *info)
t = EMS_MAXSIZE; t = EMS_MAXSIZE;
/* Set up where EMS begins in local RAM, and how much we have. */ /* Set up where EMS begins in local RAM, and how much we have. */
dev->ems_start = ptr - dev->ram; dev->ems_start[0] = ptr - dev->ram;
dev->ems_size = t >> 10; if ((dev->board == ISAMEM_EV159_CARD) && (t > 2048)) {
dev->ems_pages = t / EMS_PGSIZE; dev->ems_size[0] = 2 << 10;
isamem_log("ISAMEM: EMS enabled, I/O=%04XH, %iKB (%i pages)", dev->ems_pages[0] = (2 << 20) / EMS_PGSIZE;
dev->base_addr, dev->ems_size, dev->ems_pages); } else {
if (dev->frame_addr > 0) dev->ems_size[0] = t >> 10;
isamem_log(", Frame=%05XH", dev->frame_addr); dev->ems_pages[0] = t / EMS_PGSIZE;
}
isamem_log("ISAMEM: EMS #1 enabled, I/O=%04XH, %iKB (%i pages)",
dev->base_addr[0], dev->ems_size[0], dev->ems_pages[0]);
if (dev->frame_addr[0] > 0)
isamem_log(", Frame[0]=%05XH", dev->frame_addr[0]);
isamem_log("\n"); isamem_log("\n");
if ((dev->board == ISAMEM_EV159_CARD) && (t > (2 << 20))) {
dev->ems_start[1] = dev->ems_start[0] + (2 << 20);
dev->ems_size[1] = (t - (2 << 20)) >> 10;
dev->ems_pages[1] = (t - (2 << 20)) / EMS_PGSIZE;
isamem_log("ISAMEM: EMS #2 enabled, I/O=%04XH, %iKB (%i pages)",
dev->base_addr[1], dev->ems_size[1], dev->ems_pages[1]);
if (dev->frame_addr[1] > 0)
isamem_log(", Frame[1]=%05XH", dev->frame_addr[1]);
isamem_log("\n");
}
/* /*
* For each supported page (we can have a maximum of 4), * For each supported page (we can have a maximum of 4),
* create, initialize and disable the mappings, and set * create, initialize and disable the mappings, and set
* up the I/O control handler. * up the I/O control handler.
*/ */
for (uint8_t i = 0; i < EMS_MAXPAGE; i++) { for (uint8_t i = 0; i < EMS_MAXPAGE; i++) {
dev->ems[i].ram = dev->ram + dev->ems_start[0];
dev->ems[i].frame_val = &dev->frame_val[0];
dev->ems[i].ems_size = &dev->ems_size[0];
dev->ems[i].ems_pages = &dev->ems_pages[0];
dev->ems[i].frame_addr = &dev->frame_addr[0];
/* Create and initialize a page mapping. */ /* Create and initialize a page mapping. */
mem_mapping_add(&dev->ems[i].mapping, mem_mapping_add(&dev->ems[i].mapping,
dev->frame_addr + (EMS_PGSIZE * i), EMS_PGSIZE, dev->frame_addr[0] + (EMS_PGSIZE * i), EMS_PGSIZE,
ems_readb, ems_readb,
(dev->flags & FLAG_WIDE) ? ems_readw : NULL, (dev->flags & FLAG_WIDE) ? ems_readw : NULL,
NULL, NULL,
@@ -740,20 +777,46 @@ isamem_init(const device_t *info)
(dev->flags & FLAG_WIDE) ? ems_writew : NULL, (dev->flags & FLAG_WIDE) ? ems_writew : NULL,
NULL, NULL,
ptr, MEM_MAPPING_EXTERNAL, ptr, MEM_MAPPING_EXTERNAL,
dev); &(dev->ems[i]));
/* For now, disable it. */ /* For now, disable it. */
mem_mapping_disable(&dev->ems[i].mapping); mem_mapping_disable(&dev->ems[i].mapping);
/* Set up an I/O port handler. */ /* Set up an I/O port handler. */
if (dev->board != ISAMEM_LOTECH_CARD) if (dev->board != ISAMEM_LOTECH_CARD)
io_sethandler(dev->base_addr + (EMS_PGSIZE * i), 2, io_sethandler(dev->base_addr[0] + (EMS_PGSIZE * i), 2,
ems_read, NULL, NULL, ems_write, NULL, NULL, dev); ems_in, NULL, NULL, ems_out, NULL, NULL, &(dev->ems[i]));
if ((dev->board == ISAMEM_EV159_CARD) && (t > (2 << 20))) {
dev->ems[i | 4].ram = dev->ram + dev->ems_start[1];
dev->ems[i | 4].frame_val = &dev->frame_val[1];
dev->ems[i | 4].ems_size = &dev->ems_size[1];
dev->ems[i | 4].ems_pages = &dev->ems_pages[1];
dev->ems[i | 4].frame_addr = &dev->frame_addr[1];
/* Create and initialize a page mapping. */
mem_mapping_add(&dev->ems[i | 4].mapping,
dev->frame_addr[1] + (EMS_PGSIZE * i), EMS_PGSIZE,
ems_readb,
(dev->flags & FLAG_WIDE) ? ems_readw : NULL,
NULL,
ems_writeb,
(dev->flags & FLAG_WIDE) ? ems_writew : NULL,
NULL,
ptr + (2 << 20), MEM_MAPPING_EXTERNAL,
&(dev->ems[i | 4]));
/* For now, disable it. */
mem_mapping_disable(&dev->ems[i | 4].mapping);
io_sethandler(dev->base_addr[1] + (EMS_PGSIZE * i), 2,
ems_in, NULL, NULL, ems_out, NULL, NULL, &(dev->ems[i | 4]));
}
} }
if (dev->board == ISAMEM_LOTECH_CARD) if (dev->board == ISAMEM_LOTECH_CARD)
io_sethandler(dev->base_addr, 4, io_sethandler(dev->base_addr[0], 4,
consecutive_ems_read, NULL, NULL, consecutive_ems_write, NULL, NULL, dev); consecutive_ems_in, NULL, NULL, consecutive_ems_out, NULL, NULL, dev);
} }
/* Let them know our device instance. */ /* Let them know our device instance. */
@@ -766,13 +829,6 @@ isamem_close(void *priv)
{ {
memdev_t *dev = (memdev_t *) priv; memdev_t *dev = (memdev_t *) priv;
if (dev->flags & FLAG_EMS) {
for (uint8_t i = 0; i < EMS_MAXPAGE; i++) {
io_removehandler(dev->base_addr + (EMS_PGSIZE * i), 2,
ems_read, NULL, NULL, ems_write, NULL, NULL, dev);
}
}
if (dev->ram != NULL) if (dev->ram != NULL)
free(dev->ram); free(dev->ram);
@@ -1319,6 +1375,25 @@ static const device_config_t ev159_config[] = {
{ .description = "" } { .description = "" }
}, },
}, },
{
.name = "base2",
.description = "Address for > 2 MB",
.type = CONFIG_HEX16,
.default_string = "",
.default_int = 0x0268,
.file_filter = "",
.spinner = { 0 },
.selection = {
{ .description = "208H", .value = 0x0208 },
{ .description = "218H", .value = 0x0218 },
{ .description = "258H", .value = 0x0258 },
{ .description = "268H", .value = 0x0268 },
{ .description = "2A8H", .value = 0x02A8 },
{ .description = "2B8H", .value = 0x02B8 },
{ .description = "2E8H", .value = 0x02E8 },
{ .description = "" }
},
},
{ .name = "", .description = "", .type = CONFIG_END } { .name = "", .description = "", .type = CONFIG_END }
// clang-format on // clang-format on
}; };