diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c
index 6708f1766..80fe04641 100644
--- a/src/cpu/cpu.c
+++ b/src/cpu/cpu.c
@@ -8,7 +8,7 @@
*
* CPU type handler.
*
- * Version: @(#)cpu.c 1.0.13 2018/03/02
+ * Version: @(#)cpu.c 1.0.14 2018/03/11
*
* Authors: Sarah Walker,
* leilei,
@@ -113,7 +113,7 @@ int cpuspeed;
uint64_t cpu_CR4_mask;
int cpu_cycles_read, cpu_cycles_read_l, cpu_cycles_write, cpu_cycles_write_l;
-int cpu_prefetch_cycles, cpu_prefetch_width;
+int cpu_prefetch_cycles, cpu_prefetch_width, cpu_mem_prefetch_cycles, cpu_rom_prefetch_cycles;
int cpu_waitstates;
int cpu_cache_int_enabled, cpu_cache_ext_enabled;
int cpu_pci_speed;
@@ -246,6 +246,8 @@ void cpu_set()
isa_cycles = cpu_s->atclk_div;
+ cpu_rom_prefetch_cycles = cpu_s->rspeed / 1000000;
+
if (cpu_s->pci_speed)
{
pci_nonburst_time = 4*cpu_s->rspeed / cpu_s->pci_speed;
@@ -2217,7 +2219,10 @@ void cpu_update_waitstates()
{
cpu_s = &machines[machine].cpu[cpu_manufacturer].cpus[cpu_effective];
- cpu_prefetch_width = cpu_16bitbus ? 2 : 4;
+ if (is486)
+ cpu_prefetch_width = 16;
+ else
+ cpu_prefetch_width = cpu_16bitbus ? 2 : 4;
if (cpu_cache_int_enabled)
{
@@ -2251,4 +2256,7 @@ void cpu_update_waitstates()
cpu_cycles_write = cpu_s->mem_write_cycles;
cpu_cycles_write_l = (cpu_16bitbus ? 2 : 1) * cpu_s->mem_write_cycles;
}
+ if (is486)
+ cpu_prefetch_cycles *= 4;
+ cpu_mem_prefetch_cycles = cpu_prefetch_cycles;
}
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
index 38f18242c..f01b49438 100644
--- a/src/cpu/cpu.h
+++ b/src/cpu/cpu.h
@@ -8,7 +8,7 @@
*
* CPU type handler.
*
- * Version: @(#)cpu.h 1.0.9 2018/03/02
+ * Version: @(#)cpu.h 1.0.10 2018/03/11
*
* Authors: Sarah Walker,
* leilei,
@@ -387,7 +387,7 @@ extern x86seg _oldds;
#define ISA_CYCLES(x) ((x * isa_cycles) >> ISA_CYCLES_SHIFT)
extern int cpu_cycles_read, cpu_cycles_read_l, cpu_cycles_write, cpu_cycles_write_l;
-extern int cpu_prefetch_cycles, cpu_prefetch_width;
+extern int cpu_prefetch_cycles, cpu_prefetch_width, cpu_mem_prefetch_cycles, cpu_rom_prefetch_cycles;
extern int cpu_waitstates;
extern int cpu_cache_int_enabled, cpu_cache_ext_enabled;
extern int cpu_pci_speed;
diff --git a/src/dma.c b/src/dma.c
index e5ebd8bff..89fcb9c8a 100644
--- a/src/dma.c
+++ b/src/dma.c
@@ -8,7 +8,7 @@
*
* Implementation of the Intel DMA controllers.
*
- * Version: @(#)dma.c 1.0.7 2017/12/15
+ * Version: @(#)dma.c 1.0.8 2018/03/11
*
* Authors: Sarah Walker,
* Miran Grca,
@@ -24,6 +24,7 @@
#include "cpu/cpu.h"
#include "cpu/x86.h"
#include "machine/machine.h"
+#include "mca.h"
#include "mem.h"
#include "io.h"
#include "dma.h"
@@ -33,67 +34,74 @@ static uint8_t dmaregs[16];
static uint8_t dma16regs[16];
static uint8_t dmapages[16];
-DMA dma, dma16;
+dma_t dma[8];
+static int dma_wp, dma16_wp;
+static uint8_t dma_m;
+static uint8_t dma_stat;
+static uint8_t dma_stat_rq;
+static uint8_t dma_command, dma16_command;
+
+static struct
+{
+ int xfr_command, xfr_channel;
+ int byte_ptr;
+
+ int is_ps2;
+} dma_ps2;
+
+#define DMA_PS2_IOA (1 << 0)
+#define DMA_PS2_XFER_MEM_TO_IO (1 << 2)
+#define DMA_PS2_XFER_IO_TO_MEM (3 << 2)
+#define DMA_PS2_XFER_MASK (3 << 2)
+#define DMA_PS2_DEC2 (1 << 4)
+#define DMA_PS2_SIZE16 (1 << 6)
+
+static void dma_ps2_run(int channel);
void dma_reset(void)
{
-#if 1
- int c;
- dma.wp = 0;
- for (c = 0; c < 16; c++)
- dmaregs[c] = 0;
- for (c = 0; c < 4; c++)
- {
- dma.mode[c] = 0;
- dma.ac[c] = 0;
- dma.cc[c] = 0;
- dma.ab[c] = 0;
- dma.cb[c] = 0;
- }
- dma.m = 0;
-
- dma16.wp = 0;
- for (c = 0; c < 16; c++)
- dma16regs[c] = 0;
- for (c = 0; c < 4; c++)
- {
- dma16.mode[c] = 0;
- dma16.ac[c] = 0;
- dma16.cc[c] = 0;
- dma16.ab[c] = 0;
- dma16.cb[c] = 0;
- }
- dma16.m = 0;
-#else
- memset(dmaregs, 0, 16);
- memset(dma16regs, 0, 16);
- memset(dmapages, 0, 16);
- memset(&dma, 0, sizeof(DMA));
- memset(&dma16, 0, sizeof(DMA));
-#endif
+ int c;
+
+ dma_wp = dma16_wp = 0;
+ dma_m = 0;
+
+ for (c = 0; c < 16; c++)
+ dmaregs[c] = 0;
+ for (c = 0; c < 8; c++)
+ {
+ dma[c].mode = 0;
+ dma[c].ac = 0;
+ dma[c].cc = 0;
+ dma[c].ab = 0;
+ dma[c].cb = 0;
+ dma[c].size = (c & 4) ? 1 : 0;
+ }
}
uint8_t dma_read(uint16_t addr, void *priv)
{
+ int channel = (addr >> 1) & 3;
uint8_t temp;
switch (addr & 0xf)
{
case 0: case 2: case 4: case 6: /*Address registers*/
- dma.wp ^= 1;
- if (dma.wp)
- return dma.ac[(addr >> 1) & 3] & 0xff;
- return (dma.ac[(addr >> 1) & 3] >> 8) & 0xff;
+ dma_wp ^= 1;
+ if (dma_wp)
+ return dma[channel].ac & 0xff;
+ return (dma[channel].ac >> 8) & 0xff;
case 1: case 3: case 5: case 7: /*Count registers*/
- dma.wp ^= 1;
- if (dma.wp) temp = dma.cc[(addr >> 1) & 3] & 0xff;
- else temp = dma.cc[(addr >> 1) & 3] >> 8;
+ dma_wp ^= 1;
+ if (dma_wp)
+ temp = dma[channel].cc & 0xff;
+ else
+ temp = dma[channel].cc >> 8;
return temp;
case 8: /*Status register*/
- temp = dma.stat;
- dma.stat = 0;
+ temp = dma_stat & 0xf;
+ dma_stat &= ~0xf;
return temp;
case 0xd:
@@ -104,120 +112,129 @@ uint8_t dma_read(uint16_t addr, void *priv)
void dma_write(uint16_t addr, uint8_t val, void *priv)
{
+ int channel = (addr >> 1) & 3;
dmaregs[addr & 0xf] = val;
switch (addr & 0xf)
{
case 0: case 2: case 4: case 6: /*Address registers*/
- dma.wp ^= 1;
- if (dma.wp) dma.ab[(addr >> 1) & 3] = (dma.ab[(addr >> 1) & 3] & 0xffff00) | val;
- else dma.ab[(addr >> 1) & 3] = (dma.ab[(addr >> 1) & 3] & 0xff00ff) | (val << 8);
- dma.ac[(addr >> 1) & 3] = dma.ab[(addr >> 1) & 3];
+ dma_wp ^= 1;
+ if (dma_wp)
+ dma[channel].ab = (dma[channel].ab & 0xffff00) | val;
+ else
+ dma[channel].ab = (dma[channel].ab & 0xff00ff) | (val << 8);
+ dma[channel].ac = dma[channel].ab;
return;
case 1: case 3: case 5: case 7: /*Count registers*/
- dma.wp ^= 1;
- if (dma.wp) dma.cb[(addr >> 1) & 3] = (dma.cb[(addr >> 1) & 3] & 0xff00) | val;
- else dma.cb[(addr >> 1) & 3] = (dma.cb[(addr >> 1) & 3] & 0x00ff) | (val << 8);
- dma.cc[(addr >> 1) & 3] = dma.cb[(addr >> 1) & 3];
+ dma_wp ^= 1;
+ if (dma_wp)
+ dma[channel].cb = (dma[channel].cb & 0xff00) | val;
+ else
+ dma[channel].cb = (dma[channel].cb & 0x00ff) | (val << 8);
+ dma[channel].cc = dma[channel].cb;
return;
case 8: /*Control register*/
- dma.command = val;
+ dma_command = val;
return;
case 0xa: /*Mask*/
- if (val & 4) dma.m |= (1 << (val & 3));
- else dma.m &= ~(1 << (val & 3));
+ if (val & 4)
+ dma_m |= (1 << (val & 3));
+ else
+ dma_m &= ~(1 << (val & 3));
return;
case 0xb: /*Mode*/
- dma.mode[val & 3] = val;
- if (dma.is_ps2)
+ channel = (val & 3);
+ dma[channel].mode = val;
+ if (dma_ps2.is_ps2)
{
- dma.ps2_mode[val & 3] &= ~0x1c;
+ dma[channel].ps2_mode &= ~0x1c;
if (val & 0x20)
- dma.ps2_mode[val & 3] |= 0x10;
+ dma[channel].ps2_mode |= 0x10;
if ((val & 0xc) == 8)
- dma.ps2_mode[val & 3] |= 4;
+ dma[channel].ps2_mode |= 4;
else if ((val & 0xc) == 4)
- dma.ps2_mode[val & 3] |= 0xc;
+ dma[channel].ps2_mode |= 0xc;
}
return;
case 0xc: /*Clear FF*/
- dma.wp = 0;
+ dma_wp = 0;
return;
case 0xd: /*Master clear*/
- dma.wp = 0;
- dma.m = 0xf;
+ dma_wp = 0;
+ dma_m |= 0xf;
return;
case 0xf: /*Mask write*/
- dma.m = val & 0xf;
+ dma_m = (dma_m & 0xf0) | (val & 0xf);
return;
}
}
static uint8_t dma_ps2_read(uint16_t addr, void *priv)
{
+ dma_t *dma_c = &dma[dma_ps2.xfr_channel];
uint8_t temp = 0xff;
switch (addr)
{
case 0x1a:
- switch (dma.xfr_command)
+ switch (dma_ps2.xfr_command)
{
case 2: /*Address*/
case 3:
- switch (dma.byte_ptr)
+ switch (dma_ps2.byte_ptr)
{
case 0:
- temp = (dma.xfr_channel & 4) ? (dma16.ac[dma.xfr_channel & 3] & 0xff) : (dma.ac[dma.xfr_channel] & 0xff);
- dma.byte_ptr = 1;
+ temp = dma_c->ac & 0xff;
+ dma_ps2.byte_ptr = 1;
break;
case 1:
- temp = (dma.xfr_channel & 4) ? (dma16.ac[dma.xfr_channel & 3] >> 8) : (dma.ac[dma.xfr_channel] >> 8);
- dma.byte_ptr = 2;
+ temp = (dma_c->ac >> 8) & 0xff;
+ dma_ps2.byte_ptr = 2;
break;
case 2:
- temp = (dma.xfr_channel & 4) ? (dma16.ac[dma.xfr_channel & 3] >> 16) : (dma.ac[dma.xfr_channel] >> 16);
- dma.byte_ptr = 0;
+ temp = (dma_c->ac >> 16) & 0xff;
+ dma_ps2.byte_ptr = 0;
break;
}
break;
case 4: /*Count*/
case 5:
- if (dma.byte_ptr)
- temp = (dma.xfr_channel & 4) ? (dma16.cc[dma.xfr_channel & 3] >> 8) : (dma.cc[dma.xfr_channel] >> 8);
+ if (dma_ps2.byte_ptr)
+ temp = dma_c->cc >> 8;
else
- temp = (dma.xfr_channel & 4) ? (dma16.cc[dma.xfr_channel & 3] & 0xff) : (dma.cc[dma.xfr_channel] & 0xff);
- dma.byte_ptr = (dma.byte_ptr + 1) & 1;
+ temp = dma_c->cc & 0xff;
+ dma_ps2.byte_ptr = (dma_ps2.byte_ptr + 1) & 1;
break;
case 6: /*Read DMA status*/
- if (dma.byte_ptr)
+ if (dma_ps2.byte_ptr)
{
- temp = dma16.stat_rq | (dma16.stat << 4);
- dma16.stat = 0;
- dma16.stat_rq = 0;
+ temp = ((dma_stat_rq & 0xf0) >> 4) | (dma_stat & 0xf0);
+ dma_stat &= ~0xf0;
+ dma_stat_rq &= ~0xf0;
}
else
{
- temp = dma.stat_rq | (dma.stat << 4);
- dma.stat = 0;
- dma.stat_rq = 0;
+ temp = (dma_stat_rq & 0xf) | ((dma_stat & 0xf) << 4);
+ dma_stat &= ~0xf;
+ dma_stat_rq &= ~0xf;
}
- dma.byte_ptr = (dma.byte_ptr + 1) & 1;
+ dma_ps2.byte_ptr = (dma_ps2.byte_ptr + 1) & 1;
break;
case 7: /*Mode*/
- temp = (dma.xfr_channel & 4) ? dma16.ps2_mode[dma.xfr_channel & 3] : dma.ps2_mode[dma.xfr_channel];
+ temp = dma_c->ps2_mode;
break;
case 8: /*Arbitration Level*/
- temp = (dma.xfr_channel & 4) ? dma16.arb_level[dma.xfr_channel & 3] : dma.arb_level[dma.xfr_channel];
+ temp = dma_c->arb_level;
break;
default:
- fatal("Bad XFR Read command %i channel %i\n", dma.xfr_command, dma.xfr_channel);
+ fatal("Bad XFR Read command %i channel %i\n", dma_ps2.xfr_command, dma_ps2.xfr_channel);
}
break;
}
@@ -227,119 +244,87 @@ static uint8_t dma_ps2_read(uint16_t addr, void *priv)
static void dma_ps2_write(uint16_t addr, uint8_t val, void *priv)
{
+ dma_t *dma_c = &dma[dma_ps2.xfr_channel];
uint8_t mode;
switch (addr)
{
case 0x18:
- dma.xfr_channel = val & 0x7;
- dma.xfr_command = val >> 4;
- dma.byte_ptr = 0;
- switch (dma.xfr_command)
+ dma_ps2.xfr_channel = val & 0x7;
+ dma_ps2.xfr_command = val >> 4;
+ dma_ps2.byte_ptr = 0;
+ switch (dma_ps2.xfr_command)
{
case 9: /*Set DMA mask*/
- if (dma.xfr_channel & 4)
- dma16.m |= (1 << (dma.xfr_channel & 3));
- else
- dma.m |= (1 << dma.xfr_channel);
+ dma_m |= (1 << dma_ps2.xfr_channel);
break;
case 0xa: /*Reset DMA mask*/
- if (dma.xfr_channel & 4)
- dma16.m &= ~(1 << (dma.xfr_channel & 3));
- else
- dma.m &= ~(1 << dma.xfr_channel);
+ dma_m &= ~(1 << dma_ps2.xfr_channel);
+ break;
+ case 0xb:
+ if (!(dma_m & (1 << dma_ps2.xfr_channel)))
+ dma_ps2_run(dma_ps2.xfr_channel);
break;
}
break;
case 0x1a:
- switch (dma.xfr_command)
+ switch (dma_ps2.xfr_command)
{
+ case 0: /*I/O address*/
+ if (dma_ps2.byte_ptr)
+ dma_c->io_addr = (dma_c->io_addr & 0x00ff) | (val << 8);
+ else
+ dma_c->io_addr = (dma_c->io_addr & 0xff00) | val;
+ dma_ps2.byte_ptr = (dma_ps2.byte_ptr + 1) & 1;
+ break;
+
case 2: /*Address*/
- switch (dma.byte_ptr)
+ switch (dma_ps2.byte_ptr)
{
case 0:
- if (dma.xfr_channel & 4)
- dma16.ac[dma.xfr_channel & 3] = (dma16.ac[dma.xfr_channel & 3] & 0xffff00) | val;
- else
- dma.ac[dma.xfr_channel] = (dma.ac[dma.xfr_channel] & 0xffff00) | val;
- dma.byte_ptr = 1;
+ dma_c->ac = (dma_c->ac & 0xffff00) | val;
+ dma_ps2.byte_ptr = 1;
break;
case 1:
- if (dma.xfr_channel & 4)
- dma16.ac[dma.xfr_channel & 3] = (dma16.ac[dma.xfr_channel & 3] & 0xff00ff) | (val << 8);
- else
- dma.ac[dma.xfr_channel] = (dma.ac[dma.xfr_channel] & 0xff00ff) | (val << 8);
- dma.byte_ptr = 2;
+ dma_c->ac = (dma_c->ac & 0xff00ff) | (val << 8);
+ dma_ps2.byte_ptr = 2;
break;
case 2:
- if (dma.xfr_channel & 4)
- dma16.ac[dma.xfr_channel & 3] = (dma16.ac[dma.xfr_channel & 3] & 0x00ffff) | (val << 16);
- else
- dma.ac[dma.xfr_channel] = (dma.ac[dma.xfr_channel] & 0x00ffff) | (val << 16);
- dma.byte_ptr = 0;
+ dma_c->ac = (dma_c->ac & 0x00ffff) | (val << 16);
+ dma_ps2.byte_ptr = 0;
break;
}
- if (dma.xfr_channel & 4)
- dma16.ab[dma.xfr_channel & 3] = dma16.ac[dma.xfr_channel & 3];
- else
- dma.ab[dma.xfr_channel] = dma.ac[dma.xfr_channel];
+ dma_c->ab = dma_c->ac;
break;
case 4: /*Count*/
- if (dma.byte_ptr)
- {
- if (dma.xfr_channel & 4)
- dma16.cc[dma.xfr_channel & 3] = (dma16.cc[dma.xfr_channel & 3] & 0xff) | (val << 8);
- else
- dma.cc[dma.xfr_channel] = (dma.cc[dma.xfr_channel] & 0xff) | (val << 8);
- }
+ if (dma_ps2.byte_ptr)
+ dma_c->cc = (dma_c->cc & 0xff) | (val << 8);
else
- {
- if (dma.xfr_channel & 4)
- dma16.cc[dma.xfr_channel & 3] = (dma16.cc[dma.xfr_channel & 3] & 0xff00) | val;
- else
- dma.cc[dma.xfr_channel] = (dma.cc[dma.xfr_channel] & 0xff00) | val;
- }
- dma.byte_ptr = (dma.byte_ptr + 1) & 1;
- if (dma.xfr_channel & 4)
- dma16.cb[dma.xfr_channel & 3] = dma16.cc[dma.xfr_channel & 3];
- else
- dma.cb[dma.xfr_channel] = dma.cc[dma.xfr_channel];
+ dma_c->cc = (dma_c->cc & 0xff00) | val;
+ dma_ps2.byte_ptr = (dma_ps2.byte_ptr + 1) & 1;
+ dma_c->cb = dma_c->cc;
break;
case 7: /*Mode register*/
mode = 0;
- if (val & 0x10)
+ if (val & DMA_PS2_DEC2)
mode |= 0x20;
- if ((val & 0xc) == 4)
+ if ((val & DMA_PS2_XFER_MASK) == DMA_PS2_XFER_MEM_TO_IO)
mode |= 8;
- else if ((val & 0xc) == 0xc)
+ else if ((val & DMA_PS2_XFER_MASK) == DMA_PS2_XFER_IO_TO_MEM)
mode |= 4;
- if ((val & 0x40) && !(dma.xfr_channel & 4))
- fatal("16-bit DMA on 8-bit channel\n");
- if (!(val & 0x40) && (dma.xfr_channel & 4))
- fatal("8-bit DMA on 16-bit channel\n");
- if (dma.xfr_channel & 4)
- {
- dma16.mode[dma.xfr_channel & 3] = (dma16.mode[dma.xfr_channel & 3] & ~0x2c) | mode;
- dma16.ps2_mode[dma.xfr_channel & 3] = val;
- }
- else
- {
- dma.mode[dma.xfr_channel] = (dma.mode[dma.xfr_channel] & ~0x2c) | mode;
- dma.ps2_mode[dma.xfr_channel] = val;
- }
+ dma_c->mode = (dma_c->mode & ~0x2c) | mode;
+ dma_c->ps2_mode = val;
+ dma_c->size = val & DMA_PS2_SIZE16;
break;
case 8: /*Arbitration Level*/
- if (dma.xfr_channel & 4)
- dma16.arb_level[dma.xfr_channel & 3] = val;
- else
- dma.arb_level[dma.xfr_channel] = val;
+ dma_c->arb_level = val;
break;
default:
- fatal("Bad XFR command %i channel %i val %02x\n", dma.xfr_command, dma.xfr_channel, val);
+ fatal("Bad XFR command %i channel %i val %02x\n", dma_ps2.xfr_command, dma_ps2.xfr_channel, val);
}
break;
}
@@ -347,31 +332,34 @@ static void dma_ps2_write(uint16_t addr, uint8_t val, void *priv)
uint8_t dma16_read(uint16_t addr, void *priv)
{
+ int channel = ((addr >> 2) & 3) + 4;
uint8_t temp;
addr >>= 1;
switch (addr & 0xf)
{
case 0: case 2: case 4: case 6: /*Address registers*/
- dma16.wp ^= 1;
- if (dma.is_ps2)
+ dma16_wp ^= 1;
+ if (dma_ps2.is_ps2)
{
- if (dma16.wp)
- return dma16.ac[(addr >> 1) & 3] & 0xff;
- return (dma16.ac[(addr >> 1) & 3] >> 8) & 0xff;
+ if (dma16_wp)
+ return dma[channel].ac;
+ return (dma[channel].ac >> 8) & 0xff;
}
- if (dma16.wp)
- return (dma16.ac[(addr >> 1) & 3] >> 1) & 0xff;
- return (dma16.ac[(addr >> 1) & 3] >> 9) & 0xff;
+ if (dma16_wp)
+ return (dma[channel].ac >> 1) & 0xff;
+ return (dma[channel].ac >> 9) & 0xff;
case 1: case 3: case 5: case 7: /*Count registers*/
- dma16.wp ^= 1;
- if (dma16.wp) temp = dma16.cc[(addr >> 1) & 3] & 0xff;
- else temp = dma16.cc[(addr >> 1) & 3] >> 8;
+ dma16_wp ^= 1;
+ if (dma16_wp)
+ temp = dma[channel].cc & 0xff;
+ else
+ temp = dma[channel].cc >> 8;
return temp;
case 8: /*Status register*/
- temp = dma16.stat;
- dma16.stat = 0;
+ temp = dma_stat >> 4;
+ dma_stat &= ~0xf0;
return temp;
}
return dma16regs[addr & 0xf];
@@ -379,65 +367,75 @@ uint8_t dma16_read(uint16_t addr, void *priv)
void dma16_write(uint16_t addr, uint8_t val, void *priv)
{
+ int channel = ((addr >> 2) & 3) + 4;
addr >>= 1;
dma16regs[addr & 0xf] = val;
switch (addr & 0xf)
{
case 0: case 2: case 4: case 6: /*Address registers*/
- dma16.wp ^= 1;
- if (dma.is_ps2)
+ dma16_wp ^= 1;
+ if (dma_ps2.is_ps2)
{
- if (dma16.wp) dma16.ab[(addr >> 1) & 3] = (dma16.ab[(addr >> 1) & 3] & 0xffff00) | val;
- else dma16.ab[(addr >> 1) & 3] = (dma16.ab[(addr >> 1) & 3] & 0xff00ff) | (val << 8);
+ if (dma16_wp)
+ dma[channel].ab = (dma[channel].ab & 0xffff00) | val;
+ else
+ dma[channel].ab = (dma[channel].ab & 0xff00ff) | (val << 8);
}
else
{
- if (dma16.wp) dma16.ab[(addr >> 1) & 3] = (dma16.ab[(addr >> 1) & 3] & 0xfffe00) | (val << 1);
- else dma16.ab[(addr >> 1) & 3] = (dma16.ab[(addr >> 1) & 3] & 0xfe01ff) | (val << 9);
+ if (dma16_wp)
+ dma[channel].ab = (dma[channel].ab & 0xfffe00) | (val << 1);
+ else
+ dma[channel].ab = (dma[channel].ab & 0xfe01ff) | (val << 9);
}
- dma16.ac[(addr >> 1) & 3] = dma16.ab[(addr >> 1) & 3];
+ dma[channel].ac = dma[channel].ab;
return;
case 1: case 3: case 5: case 7: /*Count registers*/
- dma16.wp ^= 1;
- if (dma16.wp) dma16.cb[(addr >> 1) & 3] = (dma16.cb[(addr >> 1) & 3] & 0xff00) | val;
- else dma16.cb[(addr >> 1) & 3] = (dma16.cb[(addr >> 1) & 3] & 0x00ff) | (val << 8);
- dma16.cc[(addr >> 1) & 3] = dma16.cb[(addr >> 1) & 3];
+ dma16_wp ^= 1;
+ if (dma16_wp)
+ dma[channel].cb = (dma[channel].cb & 0xff00) | val;
+ else
+ dma[channel].cb = (dma[channel].cb & 0x00ff) | (val << 8);
+ dma[channel].cc = dma[channel].cb;
return;
case 8: /*Control register*/
return;
case 0xa: /*Mask*/
- if (val & 4) dma16.m |= (1 << (val & 3));
- else dma16.m &= ~(1 << (val & 3));
+ if (val & 4)
+ dma_m |= (0x10 << (val & 3));
+ else
+ dma_m &= ~(0x10 << (val & 3));
return;
case 0xb: /*Mode*/
- dma16.mode[val & 3] = val;
- if (dma.is_ps2)
+ channel = (val & 3) + 4;
+ dma[channel].mode = val;
+ if (dma_ps2.is_ps2)
{
- dma16.ps2_mode[val & 3] &= ~0x1c;
+ dma[channel].ps2_mode &= ~0x1c;
if (val & 0x20)
- dma16.ps2_mode[val & 3] |= 0x10;
+ dma[channel].ps2_mode |= 0x10;
if ((val & 0xc) == 8)
- dma16.ps2_mode[val & 3] |= 4;
+ dma[channel].ps2_mode |= 4;
else if ((val & 0xc) == 4)
- dma16.ps2_mode[val & 3] |= 0xc;
+ dma[channel].ps2_mode |= 0xc;
}
return;
case 0xc: /*Clear FF*/
- dma16.wp = 0;
+ dma16_wp = 0;
return;
case 0xd: /*Master clear*/
- dma16.wp = 0;
- dma16.m = 0xf;
+ dma16_wp = 0;
+ dma_m |= 0xf0;
return;
case 0xf: /*Mask write*/
- dma16.m = val&0xf;
+ dma_m = (dma_m & 0x0f) | ((val & 0xf) << 4);
return;
}
}
@@ -449,44 +447,44 @@ void dma_page_write(uint16_t addr, uint8_t val, void *priv)
switch (addr & 0xf)
{
case 1:
- dma.page[2] = (AT) ? val : val & 0xf;
- dma.ab[2] = (dma.ab[2] & 0xffff) | (dma.page[2] << 16);
- dma.ac[2] = (dma.ac[2] & 0xffff) | (dma.page[2] << 16);
+ dma[2].page = (AT) ? val : val & 0xf;
+ dma[2].ab = (dma[2].ab & 0xffff) | (dma[2].page << 16);
+ dma[2].ac = (dma[2].ac & 0xffff) | (dma[2].page << 16);
break;
case 2:
- dma.page[3] = (AT) ? val : val & 0xf;
- dma.ab[3] = (dma.ab[3] & 0xffff) | (dma.page[3] << 16);
- dma.ac[3] = (dma.ac[3] & 0xffff) | (dma.page[3] << 16);
+ dma[3].page = (AT) ? val : val & 0xf;
+ dma[3].ab = (dma[3].ab & 0xffff) | (dma[3].page << 16);
+ dma[3].ac = (dma[3].ac & 0xffff) | (dma[3].page << 16);
break;
case 3:
- dma.page[1] = (AT) ? val : val & 0xf;
- dma.ab[1] = (dma.ab[1] & 0xffff) | (dma.page[1] << 16);
- dma.ac[1] = (dma.ac[1] & 0xffff) | (dma.page[1] << 16);
+ dma[1].page = (AT) ? val : val & 0xf;
+ dma[1].ab = (dma[1].ab & 0xffff) | (dma[1].page << 16);
+ dma[1].ac = (dma[1].ac & 0xffff) | (dma[1].page << 16);
break;
case 7:
- dma.page[0] = (AT) ? val : val & 0xf;
- dma.ab[0] = (dma.ab[0] & 0xffff) | (dma.page[0] << 16);
- dma.ac[0] = (dma.ac[0] & 0xffff) | (dma.page[0] << 16);
+ dma[0].page = (AT) ? val : val & 0xf;
+ dma[0].ab = (dma[0].ab & 0xffff) | (dma[0].page << 16);
+ dma[0].ac = (dma[0].ac & 0xffff) | (dma[0].page << 16);
break;
case 0x9:
- dma16.page[2] = val & 0xfe;
- dma16.ab[2] = (dma16.ab[2] & 0x1ffff) | (dma16.page[2] << 16);
- dma16.ac[2] = (dma16.ac[2] & 0x1ffff) | (dma16.page[2] << 16);
+ dma[6].page = val & 0xfe;
+ dma[6].ab = (dma[6].ab & 0x1ffff) | (dma[6].page << 16);
+ dma[6].ac = (dma[6].ac & 0x1ffff) | (dma[6].page << 16);
break;
case 0xa:
- dma16.page[3] = val & 0xfe;
- dma16.ab[3] = (dma16.ab[3] & 0x1ffff) | (dma16.page[3] << 16);
- dma16.ac[3] = (dma16.ac[3] & 0x1ffff) | (dma16.page[3] << 16);
+ dma[7].page = val & 0xfe;
+ dma[7].ab = (dma[7].ab & 0x1ffff) | (dma[7].page << 16);
+ dma[7].ac = (dma[7].ac & 0x1ffff) | (dma[7].page << 16);
break;
case 0xb:
- dma16.page[1] = val & 0xfe;
- dma16.ab[1] = (dma16.ab[1] & 0x1ffff) | (dma16.page[1] << 16);
- dma16.ac[1] = (dma16.ac[1] & 0x1ffff) | (dma16.page[1] << 16);
+ dma[5].page = val & 0xfe;
+ dma[5].ab = (dma[5].ab & 0x1ffff) | (dma[5].page << 16);
+ dma[5].ac = (dma[5].ac & 0x1ffff) | (dma[5].page << 16);
break;
case 0xf:
- dma16.page[0] = val & 0xfe;
- dma16.ab[0] = (dma16.ab[0] & 0x1ffff) | (dma16.page[0] << 16);
- dma16.ac[0] = (dma16.ac[0] & 0x1ffff) | (dma16.page[0] << 16);
+ dma[4].page = val & 0xfe;
+ dma[4].ab = (dma[4].ab & 0x1ffff) | (dma[4].page << 16);
+ dma[4].ac = (dma[4].ac & 0x1ffff) | (dma[4].page << 16);
break;
}
}
@@ -500,7 +498,7 @@ void dma_init(void)
{
io_sethandler(0x0000, 0x0010, dma_read, NULL, NULL, dma_write, NULL, NULL, NULL);
io_sethandler(0x0080, 0x0008, dma_page_read, NULL, NULL, dma_page_write, NULL, NULL, NULL);
- dma.is_ps2 = 0;
+ dma_ps2.is_ps2 = 0;
}
void dma16_init(void)
@@ -531,7 +529,7 @@ void ps2_dma_init(void)
{
io_sethandler(0x0018, 0x0001, dma_ps2_read, NULL, NULL, dma_ps2_write, NULL, NULL, NULL);
io_sethandler(0x001a, 0x0001, dma_ps2_read, NULL, NULL, dma_ps2_write, NULL, NULL, NULL);
- dma.is_ps2 = 1;
+ dma_ps2.is_ps2 = 1;
}
@@ -549,208 +547,280 @@ void _dma_write(uint32_t addr, uint8_t val)
int dma_channel_read(int channel)
{
+ dma_t *dma_c = &dma[channel];
uint16_t temp;
int tc = 0;
- if (dma.command & 0x04)
- return DMA_NODATA;
-
- if (!AT)
- refreshread();
-
if (channel < 4)
{
- if (dma.m & (1 << channel))
- return DMA_NODATA;
- if ((dma.mode[channel] & 0xC) != 8)
- return DMA_NODATA;
-
- temp = _dma_read(dma.ac[channel]);
- dma.stat_rq |= (1 << channel);
-
- if (dma.mode[channel] & 0x20)
- {
- if (dma.is_ps2)
- dma.ac[channel]--;
- else
- dma.ac[channel] = (dma.ac[channel] & 0xff0000) | ((dma.ac[channel] - 1) & 0xffff);
- }
- else
- {
- if (dma.is_ps2)
- dma.ac[channel]++;
- else
- dma.ac[channel] = (dma.ac[channel] & 0xff0000) | ((dma.ac[channel] + 1) & 0xffff);
- }
- dma.cc[channel]--;
- if (dma.cc[channel] < 0)
- {
- tc = 1;
- if (dma.mode[channel] & 0x10) /*Auto-init*/
- {
- dma.cc[channel] = dma.cb[channel];
- dma.ac[channel] = dma.ab[channel];
- }
- else
- dma.m |= (1 << channel);
- dma.stat |= (1 << channel);
- }
-
- if (tc)
- return temp | DMA_OVER;
- return temp;
+ if (dma_command & 0x04)
+ return DMA_NODATA;
}
else
{
- channel &= 3;
- if (dma16.m & (1 << channel))
- return DMA_NODATA;
- if ((dma16.mode[channel] & 0xC) != 8)
- return DMA_NODATA;
+ if (dma16_command & 0x04)
+ return DMA_NODATA;
+ }
+
+ if (!AT)
+ refreshread();
- temp = _dma_read(dma16.ac[channel]) |
- (_dma_read(dma16.ac[channel] + 1) << 8);
- dma16.stat_rq |= (1 << channel);
+ if (dma_m & (1 << channel))
+ return DMA_NODATA;
+ if ((dma_c->mode & 0xC) != 8)
+ return DMA_NODATA;
+
+ if (!dma_c->size)
+ {
+ temp = _dma_read(dma_c->ac);
- if (dma16.mode[channel] & 0x20)
+ if (dma_c->mode & 0x20)
{
- if (dma.is_ps2)
- dma16.ac[channel] -= 2;
+ if (dma_ps2.is_ps2)
+ dma_c->ac--;
else
- dma16.ac[channel] = (dma16.ac[channel] & 0xfe0000) | ((dma16.ac[channel] - 2) & 0x1ffff);
+ dma_c->ac = (dma_c->ac & 0xff0000) | ((dma_c->ac - 1) & 0xffff);
}
else
{
- if (dma.is_ps2)
- dma16.ac[channel] += 2;
+ if (dma_ps2.is_ps2)
+ dma_c->ac++;
else
- dma16.ac[channel] = (dma16.ac[channel] & 0xfe0000) | ((dma16.ac[channel] + 2) & 0x1ffff);
+ dma_c->ac = (dma_c->ac & 0xff0000) | ((dma_c->ac + 1) & 0xffff);
}
-
- dma16.cc[channel]--;
- if (dma16.cc[channel] < 0)
- {
- tc = 1;
- if (dma16.mode[channel] & 0x10) /*Auto-init*/
- {
- dma16.cc[channel] = dma16.cb[channel];
- dma16.ac[channel] = dma16.ab[channel];
- }
- else
- dma16.m |= (1 << channel);
- dma16.stat |= (1 << channel);
- }
-
- if (tc)
- return temp | DMA_OVER;
- return temp;
}
+ else
+ {
+ temp = _dma_read(dma_c->ac) |
+ (_dma_read(dma_c->ac + 1) << 8);
+
+ if (dma_c->mode & 0x20)
+ {
+ if (dma_ps2.is_ps2)
+ dma_c->ac -= 2;
+ else
+ dma_c->ac = (dma_c->ac & 0xfe0000) | ((dma_c->ac - 2) & 0x1ffff);
+ }
+ else
+ {
+ if (dma_ps2.is_ps2)
+ dma_c->ac += 2;
+ else
+ dma_c->ac = (dma_c->ac & 0xfe0000) | ((dma_c->ac + 2) & 0x1ffff);
+ }
+ }
+
+ dma_stat_rq |= (1 << channel);
+
+ dma_c->cc--;
+ if (dma_c->cc < 0)
+ {
+ tc = 1;
+ if (dma_c->mode & 0x10) /*Auto-init*/
+ {
+ dma_c->cc = dma_c->cb;
+ dma_c->ac = dma_c->ab;
+ }
+ else
+ dma_m |= (1 << channel);
+ dma_stat |= (1 << channel);
+ }
+
+ if (tc)
+ return temp | DMA_OVER;
+ return temp;
}
int dma_channel_write(int channel, uint16_t val)
{
- if (dma.command & 0x04)
- return DMA_NODATA;
+ dma_t *dma_c = &dma[channel];
+
+ if (channel < 4)
+ {
+ if (dma_command & 0x04)
+ return DMA_NODATA;
+ }
+ else
+ {
+ if (dma16_command & 0x04)
+ return DMA_NODATA;
+ }
if (!AT)
refreshread();
- if (channel < 4)
+ if (dma_m & (1 << channel))
+ return DMA_NODATA;
+ if ((dma_c->mode & 0xC) != 4)
+ return DMA_NODATA;
+
+ if (!dma_c->size)
{
- if (dma.m & (1 << channel))
- return DMA_NODATA;
- if ((dma.mode[channel] & 0xC) != 4)
- return DMA_NODATA;
-
- _dma_write(dma.ac[channel], val);
- dma.stat_rq |= (1 << channel);
-
- if (dma.mode[channel] & 0x20)
+ _dma_write(dma_c->ac, val);
+
+ if (dma_c->mode & 0x20)
{
- if (dma.is_ps2)
- dma.ac[channel]--;
+ if (dma_ps2.is_ps2)
+ dma_c->ac--;
else
- dma.ac[channel] = (dma.ac[channel] & 0xff0000) | ((dma.ac[channel] - 1) & 0xffff);
+ dma_c->ac = (dma_c->ac & 0xff0000) | ((dma_c->ac - 1) & 0xffff);
}
else
{
- if (dma.is_ps2)
- dma.ac[channel]++;
+ if (dma_ps2.is_ps2)
+ dma_c->ac++;
else
- dma.ac[channel] = (dma.ac[channel] & 0xff0000) | ((dma.ac[channel] + 1) & 0xffff);
+ dma_c->ac = (dma_c->ac & 0xff0000) | ((dma_c->ac + 1) & 0xffff);
}
-
- dma.cc[channel]--;
- if (dma.cc[channel] < 0)
- {
- if (dma.mode[channel] & 0x10) /*Auto-init*/
- {
- dma.cc[channel] = dma.cb[channel];
- dma.ac[channel] = dma.ab[channel];
- }
- else
- dma.m |= (1 << channel);
- dma.stat |= (1 << channel);
- }
-
- if (dma.m & (1 << channel))
- return DMA_OVER;
}
else
{
- channel &= 3;
- if (dma16.m & (1 << channel))
- return DMA_NODATA;
- if ((dma16.mode[channel] & 0xC) != 4)
- return DMA_NODATA;
+ _dma_write(dma_c->ac, val);
+ _dma_write(dma_c->ac + 1, val >> 8);
- _dma_write(dma16.ac[channel], val);
- _dma_write(dma16.ac[channel] + 1, val >> 8);
- dma16.stat_rq |= (1 << channel);
-
- if (dma16.mode[channel] & 0x20)
+ if (dma_c->mode & 0x20)
{
- if (dma.is_ps2)
- dma16.ac[channel] -= 2;
+ if (dma_ps2.is_ps2)
+ dma_c->ac -= 2;
else
- dma16.ac[channel] = (dma16.ac[channel] & 0xfe0000) | ((dma16.ac[channel] - 2) & 0x1ffff);
+ dma_c->ac = (dma_c->ac & 0xfe0000) | ((dma_c->ac - 2) & 0x1ffff);
}
else
{
- if (dma.is_ps2)
- dma16.ac[channel] += 2;
+ if (dma_ps2.is_ps2)
+ dma_c->ac += 2;
else
- dma16.ac[channel] = (dma16.ac[channel] & 0xfe0000) | ((dma16.ac[channel] + 2) & 0x1ffff);
+ dma_c->ac = (dma_c->ac & 0xfe0000) | ((dma_c->ac + 2) & 0x1ffff);
}
-
- dma16.cc[channel]--;
- if (dma16.cc[channel] < 0)
- {
- if (dma16.mode[channel] & 0x10) /*Auto-init*/
- {
- dma16.cc[channel] = dma16.cb[channel];
- dma16.ac[channel] = dma16.ab[channel];
- }
- else
- dma16.m |= (1 << channel);
- dma16.stat |= (1 << channel);
- }
-
- if (dma16.m & (1 << channel))
- return DMA_OVER;
}
+
+ dma_stat_rq |= (1 << channel);
+
+ dma_c->cc--;
+ if (dma_c->cc < 0)
+ {
+ if (dma_c->mode & 0x10) /*Auto-init*/
+ {
+ dma_c->cc = dma_c->cb;
+ dma_c->ac = dma_c->ab;
+ }
+ else
+ dma_m |= (1 << channel);
+ dma_stat |= (1 << channel);
+ }
+
+ if (dma_m & (1 << channel))
+ return DMA_OVER;
+
return 0;
}
+static void dma_ps2_run(int channel)
+{
+ dma_t *dma_c = &dma[channel];
+
+ switch (dma_c->ps2_mode & DMA_PS2_XFER_MASK)
+ {
+ case DMA_PS2_XFER_MEM_TO_IO:
+ do
+ {
+ if (!dma_c->size)
+ {
+ uint8_t temp = _dma_read(dma_c->ac);
+ outb(dma_c->io_addr, temp);
+
+ if (dma_c->ps2_mode & DMA_PS2_DEC2)
+ dma_c->ac--;
+ else
+ dma_c->ac++;
+ }
+ else
+ {
+ uint16_t temp = _dma_read(dma_c->ac) | (_dma_read(dma_c->ac + 1) << 8);
+ outw(dma_c->io_addr, temp);
+
+ if (dma_c->ps2_mode & DMA_PS2_DEC2)
+ dma_c->ac -= 2;
+ else
+ dma_c->ac += 2;
+ }
+
+ dma_stat_rq |= (1 << channel);
+ dma_c->cc--;
+ } while (dma_c->cc > 0);
+
+ dma_stat |= (1 << channel);
+ break;
+
+ case DMA_PS2_XFER_IO_TO_MEM:
+ do
+ {
+ if (!dma_c->size)
+ {
+ uint8_t temp = inb(dma_c->io_addr);
+ _dma_write(dma_c->ac, temp);
+
+ if (dma_c->ps2_mode & DMA_PS2_DEC2)
+ dma_c->ac--;
+ else
+ dma_c->ac++;
+ }
+ else
+ {
+ uint16_t temp = inw(dma_c->io_addr);
+ _dma_write(dma_c->ac, temp & 0xff);
+ _dma_write(dma_c->ac + 1, temp >> 8);
+
+ if (dma_c->ps2_mode & DMA_PS2_DEC2)
+ dma_c->ac -= 2;
+ else
+ dma_c->ac += 2;
+ }
+
+ dma_stat_rq |= (1 << channel);
+ dma_c->cc--;
+ } while (dma_c->cc > 0);
+
+ ps2_cache_clean();
+ dma_stat |= (1 << channel);
+ break;
+
+ default: /*Memory verify*/
+ do
+ {
+ if (!dma_c->size)
+ {
+ if (dma_c->ps2_mode & DMA_PS2_DEC2)
+ dma_c->ac--;
+ else
+ dma_c->ac++;
+ }
+ else
+ {
+ if (dma_c->ps2_mode & DMA_PS2_DEC2)
+ dma_c->ac -= 2;
+ else
+ dma_c->ac += 2;
+ }
+
+ dma_stat_rq |= (1 << channel);
+ dma->cc--;
+ } while (dma->cc > 0);
+
+ dma_stat |= (1 << channel);
+ break;
+ }
+}
+
int dma_mode(int channel)
{
if (channel < 4)
{
- return dma.mode[channel];
+ return dma[channel].mode;
}
else
{
- return dma16.mode[channel & 3];
+ return dma[channel & 3].mode;
}
}
diff --git a/src/dma.h b/src/dma.h
index f13102e83..223994a17 100644
--- a/src/dma.h
+++ b/src/dma.h
@@ -8,7 +8,7 @@
*
* Implementation of the Intel DMA controllers.
*
- * Version: @(#)dma.h 1.0.4 2017/12/15
+ * Version: @(#)dma.h 1.0.5 2018/03/11
*
* Authors: Sarah Walker,
* Miran Grca,
@@ -25,32 +25,25 @@
#define DMA_VERIFY 0x20000
-typedef struct DMA {
- uint32_t ab[4],
- ac[4];
- uint16_t cb[4];
- int cc[4];
- int wp;
- uint8_t m,
- mode[4];
- uint8_t page[4];
- uint8_t stat,
- stat_rq;
- uint8_t command;
- uint8_t request;
-
- int xfr_command,
- xfr_channel;
- int byte_ptr;
-
- int is_ps2;
- uint8_t arb_level[4];
- uint8_t ps2_mode[4];
-} DMA;
-
-
-extern DMA dma, dma16;
+/*DMA*/
+typedef struct dma_t
+{
+ uint32_t ab, ac;
+ uint16_t cb;
+ int cc;
+ int wp;
+ uint8_t m, mode;
+ uint8_t page;
+ uint8_t stat, stat_rq;
+ uint8_t command;
+ int size;
+
+ uint8_t ps2_mode;
+ uint8_t arb_level;
+ uint16_t io_addr;
+} dma_t;
+extern dma_t dma[8];
extern void dma_init(void);
extern void dma16_init(void);
diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c
index 98c28180a..e9c74935a 100644
--- a/src/machine/m_ps2_mca.c
+++ b/src/machine/m_ps2_mca.c
@@ -41,6 +41,7 @@ static struct
mem_mapping_t shadow_mapping;
mem_mapping_t expansion_mapping;
+ mem_mapping_t cache_mapping;
uint8_t (*planar_read)(uint16_t port);
void (*planar_write)(uint16_t port, uint8_t val);
@@ -51,8 +52,95 @@ static struct
uint8_t mem_pos_regs[8];
uint8_t mem_2mb_pos_regs[8];
+
+ int pending_cache_miss;
} ps2;
+/*The model 70 type 3/4 BIOS performs cache testing. Since 86Box doesn't have any
+ proper cache emulation, it's faked a bit here.
+
+ Port E2 is used for cache diagnostics. Bit 7 seems to be set on a cache miss,
+ toggling bit 2 seems to clear this. The BIOS performs at least the following
+ tests :
+
+ - Disable RAM, access low 64kb (386) / 8kb (486), execute code from cache to
+ access low memory and verify that there are no cache misses.
+ - Write to low memory using DMA, read low memory and verify that all accesses
+ cause cache misses.
+ - Read low memory, verify that first access is cache miss. Read again and
+ verify that second access is cache hit.
+
+ These tests are also performed on the 486 model 70, despite there being no
+ external cache on this system. Port E2 seems to control the internal cache on
+ these systems. Presumably this port is connected to KEN#/FLUSH# on the 486.
+ This behaviour is required to pass the timer interrupt test on the 486 version
+ - the BIOS uses a fixed length loop that will terminate too early on a 486/25
+ if it executes from internal cache.
+
+ To handle this, 86Box uses some basic heuristics :
+ - If cache is enabled but RAM is disabled, accesses to low memory go directly
+ to cache memory.
+ - Reads to cache addresses not 'valid' will set the cache miss flag, and mark
+ that line as valid.
+ - Cache flushes will clear the valid array.
+ - DMA via the undocumented PS/2 command 0xb will clear the valid array.
+ - Disabling the cache will clear the valid array.
+ - Disabling the cache will also mark shadowed ROM areas as using ROM timings.
+ This works around the timing loop mentioned above.
+*/
+
+static uint8_t ps2_cache[65536];
+static int ps2_cache_valid[65536/8];
+
+static uint8_t ps2_read_cache_ram(uint32_t addr, void *priv)
+{
+// pclog("ps2_read_cache_ram: addr=%08x %i %04x:%04x\n", addr, ps2_cache_valid[addr >> 3], CS,cpu_state.pc);
+ if (!ps2_cache_valid[addr >> 3])
+ {
+ ps2_cache_valid[addr >> 3] = 1;
+ ps2.mem_regs[2] |= 0x80;
+ }
+ else
+ ps2.pending_cache_miss = 0;
+
+ return ps2_cache[addr];
+}
+static uint16_t ps2_read_cache_ramw(uint32_t addr, void *priv)
+{
+// pclog("ps2_read_cache_ramw: addr=%08x %i %04x:%04x\n", addr, ps2_cache_valid[addr >> 3], CS,cpu_state.pc);
+ if (!ps2_cache_valid[addr >> 3])
+ {
+ ps2_cache_valid[addr >> 3] = 1;
+ ps2.mem_regs[2] |= 0x80;
+ }
+ else
+ ps2.pending_cache_miss = 0;
+
+ return *(uint16_t *)&ps2_cache[addr];
+}
+static uint32_t ps2_read_cache_raml(uint32_t addr, void *priv)
+{
+// pclog("ps2_read_cache_raml: addr=%08x %i %04x:%04x\n", addr, ps2_cache_valid[addr >> 3], CS,cpu_state.pc);
+ if (!ps2_cache_valid[addr >> 3])
+ {
+ ps2_cache_valid[addr >> 3] = 1;
+ ps2.mem_regs[2] |= 0x80;
+ }
+ else
+ ps2.pending_cache_miss = 0;
+
+ return *(uint32_t *)&ps2_cache[addr];
+}
+static void ps2_write_cache_ram(uint32_t addr, uint8_t val, void *priv)
+{
+// pclog("ps2_write_cache_ram: addr=%08x val=%02x %04x:%04x %i\n", addr, val, CS,cpu_state.pc, ins);
+ ps2_cache[addr] = val;
+}
+
+void ps2_cache_clean(void)
+{
+ memset(ps2_cache_valid, 0, sizeof(ps2_cache_valid));
+}
static uint8_t ps2_read_shadow_ram(uint32_t addr, void *priv)
{
@@ -139,6 +227,30 @@ static uint8_t model_55sx_read(uint16_t port)
return 0xff;
}
+static uint8_t model_70_type3_read(uint16_t port)
+{
+ switch (port)
+ {
+ case 0x100:
+ return 0xff;
+ case 0x101:
+ return 0xf9;
+ case 0x102:
+ return ps2.option[0];
+ case 0x103:
+ return ps2.option[1];
+ case 0x104:
+ return ps2.option[2];
+ case 0x105:
+ return ps2.option[3];
+ case 0x106:
+ return ps2.subaddr_lo;
+ case 0x107:
+ return ps2.subaddr_hi;
+ }
+ return 0xff;
+}
+
static uint8_t model_80_read(uint16_t port)
{
switch (port)
@@ -296,6 +408,56 @@ static void model_55sx_write(uint16_t port, uint8_t val)
}
}
+static void model_70_type3_write(uint16_t port, uint8_t val)
+{
+ switch (port)
+ {
+ case 0x100:
+ break;
+ case 0x101:
+ break;
+ case 0x102:
+ lpt1_remove();
+ serial_remove(1);
+ if (val & 0x04)
+ {
+ if (val & 0x08)
+ serial_setup(1, SERIAL1_ADDR, SERIAL1_IRQ);
+ else
+ serial_setup(1, SERIAL2_ADDR, SERIAL2_IRQ);
+ }
+ else
+ serial_remove(1);
+ if (val & 0x10)
+ {
+ switch ((val >> 5) & 3)
+ {
+ case 0:
+ lpt1_init(0x3bc);
+ break;
+ case 1:
+ lpt1_init(0x378);
+ break;
+ case 2:
+ lpt1_init(0x278);
+ break;
+ }
+ }
+ ps2.option[0] = val;
+ break;
+ case 0x105:
+ ps2.option[3] = val;
+ break;
+ case 0x106:
+ ps2.subaddr_lo = val;
+ break;
+ case 0x107:
+ ps2.subaddr_hi = val;
+ break;
+ }
+}
+
+
static void model_80_write(uint16_t port, uint8_t val)
{
switch (port)
@@ -737,6 +899,169 @@ static void mem_encoding_write(uint16_t addr, uint8_t val, void *p)
mem_encoding_update();
}
+static uint8_t mem_encoding_read_cached(uint16_t addr, void *p)
+{
+ switch (addr)
+ {
+ case 0xe0:
+ return ps2.mem_regs[0];
+ case 0xe1:
+ return ps2.mem_regs[1];
+ case 0xe2:
+ return ps2.mem_regs[2];
+ }
+ return 0xff;
+}
+
+static void mem_encoding_write_cached(uint16_t addr, uint8_t val, void *p)
+{
+ uint8_t old;
+
+ switch (addr)
+ {
+ case 0xe0:
+ ps2.mem_regs[0] = val;
+ break;
+ case 0xe1:
+ ps2.mem_regs[1] = val;
+ break;
+ case 0xe2:
+ old = ps2.mem_regs[2];
+ ps2.mem_regs[2] = (ps2.mem_regs[2] & 0x80) | (val & ~0x88);
+ if (val & 2)
+ {
+// pclog("Clear latch - %i\n", ps2.pending_cache_miss);
+ if (ps2.pending_cache_miss)
+ ps2.mem_regs[2] |= 0x80;
+ else
+ ps2.mem_regs[2] &= ~0x80;
+ ps2.pending_cache_miss = 0;
+ }
+
+ if ((val & 0x21) == 0x20 && (old & 0x21) != 0x20)
+ ps2.pending_cache_miss = 1;
+ if ((val & 0x21) == 0x01 && (old & 0x21) != 0x01)
+ ps2_cache_clean();
+ if (val & 0x01)
+ ram_mid_mapping.flags |= MEM_MAPPING_ROM;
+ else
+ ram_mid_mapping.flags &= ~MEM_MAPPING_ROM;
+ break;
+ }
+// pclog("mem_encoding_write: addr=%02x val=%02x %04x:%04x %02x %02x\n", addr, val, CS,cpu_state.pc, ps2.mem_regs[1],ps2.mem_regs[2]);
+ mem_encoding_update();
+ if ((ps2.mem_regs[1] & 0x10) && (ps2.mem_regs[2] & 0x21) == 0x20)
+ {
+ mem_mapping_disable(&ram_low_mapping);
+ mem_mapping_enable(&ps2.cache_mapping);
+ flushmmucache();
+ }
+ else
+ {
+ mem_mapping_disable(&ps2.cache_mapping);
+ mem_mapping_enable(&ram_low_mapping);
+ flushmmucache();
+ }
+}
+
+static void ps2_mca_board_model_70_type34_init(int is_type4)
+{
+ ps2_mca_board_common_init();
+
+ mem_remap_top_256k();
+ ps2.split_addr = mem_size * 1024;
+ mca_init(4);
+
+ ps2.planar_read = model_70_type3_read;
+ ps2.planar_write = model_70_type3_write;
+
+ device_add(&ps2_nvr_device);
+
+ io_sethandler(0x00e0, 0x0003, mem_encoding_read_cached, NULL, NULL, mem_encoding_write_cached, NULL, NULL, NULL);
+
+ ps2.mem_regs[1] = 2;
+
+ switch (mem_size/1024)
+ {
+ case 2:
+ ps2.option[1] = 0xa6;
+ ps2.option[2] = 0x01;
+ break;
+ case 4:
+ ps2.option[1] = 0xaa;
+ ps2.option[2] = 0x01;
+ break;
+ case 6:
+ ps2.option[1] = 0xca;
+ ps2.option[2] = 0x01;
+ break;
+ case 8:
+ default:
+ ps2.option[1] = 0xca;
+ ps2.option[2] = 0x02;
+ break;
+ }
+
+ if (is_type4)
+ ps2.option[2] |= 0x04; /*486 CPU*/
+
+ mem_mapping_add(&ps2.cache_mapping,
+ 0,
+ is_type4 ? (8 * 1024) : (64 * 1024),
+ ps2_read_cache_ram,
+ ps2_read_cache_ramw,
+ ps2_read_cache_raml,
+ ps2_write_cache_ram,
+ NULL,
+ NULL,
+ ps2_cache,
+ MEM_MAPPING_INTERNAL,
+ NULL);
+ mem_mapping_disable(&ps2.cache_mapping);
+
+ if (mem_size > 8192)
+ {
+ /* Only 8 MB supported on planar, create a memory expansion card for the rest */
+ mem_mapping_set_addr(&ram_high_mapping, 0x100000, 0x700000);
+
+ ps2.mem_pos_regs[0] = 0xff;
+ ps2.mem_pos_regs[1] = 0xfc;
+
+ switch (mem_size/1024)
+ {
+ case 10:
+ ps2.mem_pos_regs[4] = 0xfe;
+ break;
+ case 12:
+ ps2.mem_pos_regs[4] = 0xfa;
+ break;
+ case 14:
+ ps2.mem_pos_regs[4] = 0xea;
+ break;
+ case 16:
+ ps2.mem_pos_regs[4] = 0xaa;
+ break;
+ }
+
+ mca_add(ps2_mem_expansion_read, ps2_mem_expansion_write, NULL);
+ mem_mapping_add(&ps2.expansion_mapping,
+ 0x800000,
+ (mem_size - 8192)*1024,
+ mem_read_ram,
+ mem_read_ramw,
+ mem_read_raml,
+ mem_write_ram,
+ mem_write_ramw,
+ mem_write_raml,
+ &ram[0x800000],
+ MEM_MAPPING_INTERNAL,
+ NULL);
+ mem_mapping_disable(&ps2.expansion_mapping);
+ }
+
+ device_add(&ps1vga_device);
+}
+
static void ps2_mca_board_model_80_type2_init(int is486)
{
ps2_mca_board_common_init();
@@ -876,6 +1201,21 @@ machine_ps2_model_55sx_init(machine_t *model)
ps2_mca_board_model_55sx_init();
}
+void
+machine_ps2_model_70_type3_init(machine_t *model)
+{
+ machine_ps2_common_init(model);
+
+ ps2_mca_board_model_70_type34_init(0);
+}
+
+void
+machine_ps2_model_70_type4_init(machine_t *model)
+{
+ machine_ps2_common_init(model);
+
+ ps2_mca_board_model_70_type34_init(1);
+}
void
machine_ps2_model_80_init(machine_t *model)
diff --git a/src/machine/machine.h b/src/machine/machine.h
index d7fcbcce8..2cd9880f4 100644
--- a/src/machine/machine.h
+++ b/src/machine/machine.h
@@ -162,6 +162,8 @@ extern void machine_ps1_m2133_init(machine_t *);
extern void machine_ps2_m30_286_init(machine_t *);
extern void machine_ps2_model_50_init(machine_t *);
extern void machine_ps2_model_55sx_init(machine_t *);
+extern void machine_ps2_model_70_type3_init(machine_t *);
+extern void machine_ps2_model_70_type4_init(machine_t *);
extern void machine_ps2_model_80_init(machine_t *);
#ifdef WALTJE
extern void machine_ps2_model_80_486_init(machine_t *);
diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c
index bdbcea0d8..aa53e86d6 100644
--- a/src/machine/machine_table.c
+++ b/src/machine/machine_table.c
@@ -11,7 +11,7 @@
* NOTES: OpenAT wip for 286-class machine with open BIOS.
* PS2_M80-486 wip, pending receipt of TRM's for machine.
*
- * Version: @(#)machine_table.c 1.0.24 2018/03/06
+ * Version: @(#)machine_table.c 1.0.24 2018/03/11
*
* Authors: Sarah Walker,
* Miran Grca,
@@ -47,11 +47,11 @@ machine_t machines[] = {
{ "[8088] Schneider EuroPC", ROM_EUROPC, "europc", {{"Siemens",cpus_europc}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_HDC | MACHINE_VIDEO | MACHINE_MOUSE, 512, 640, 128, 0, machine_europc_init, NULL, NULL },
{ "[8088] Tandy 1000", ROM_TANDY, "tandy", {{"", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA, 128, 640, 128, 0, machine_tandy1k_init, tandy1k_get_device, NULL },
{ "[8088] Tandy 1000 HX", ROM_TANDY1000HX, "tandy1000hx", {{"", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA, 256, 640, 128, 0, machine_tandy1k_init, tandy1k_hx_get_device, NULL },
- { "[8088] Toshiba 1000", ROM_T1000, "t1000", {{"", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO, 512, 1280, 768, 0, machine_xt_t1000_init, t1000_get_device, NULL },
+ { "[8088] Toshiba 1000", ROM_T1000, "t1000", {{"", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO, 512, 1280, 768, 0, machine_xt_t1000_init, NULL, NULL },
#if defined(DEV_BRANCH) && defined(USE_LASERXT)
{ "[8088] VTech Laser Turbo XT", ROM_LTXT, "ltxt", {{"", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA, 512, 512, 256, 0, machine_xt_laserxt_init, NULL, NULL },
#endif
- { "[8088] Xi8088", ROM_XI8088, "xi8088", {{"", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_PS2, 64, 1024, 128, 127, machine_xt_xi8088_init, xi8088_get_device, nvr_at_close },
+ { "[8088] Xi8088", ROM_XI8088, "xi8088", {{"", cpus_8088}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_AT | MACHINE_PS2, 64, 1024, 128, 127, machine_xt_xi8088_init, NULL, nvr_at_close },
{ "[8086] Amstrad PC1512", ROM_PC1512, "pc1512", {{"", cpus_pc1512}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 512, 640, 128, 63, machine_amstrad_init, NULL, nvr_at_close },
{ "[8086] Amstrad PC1640", ROM_PC1640, "pc1640", {{"", cpus_8086}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 640, 640, 0, 63, machine_amstrad_init, NULL, nvr_at_close },
@@ -60,7 +60,7 @@ machine_t machines[] = {
{ "[8086] Amstrad PC20(0)", ROM_PC200, "pc200", {{"", cpus_8086}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 512, 640, 128, 63, machine_amstrad_init, NULL, nvr_at_close },
{ "[8086] Olivetti M24", ROM_OLIM24, "olivetti_m24", {{"", cpus_8086}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO | MACHINE_MOUSE, 128, 640, 128, 0, machine_olim24_init, NULL, NULL },
{ "[8086] Tandy 1000 SL/2", ROM_TANDY1000SL2, "tandy1000sl2", {{"", cpus_8086}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA, 512, 768, 128, 0, machine_tandy1k_init, NULL, NULL },
- { "[8086] Toshiba 1200", ROM_T1200, "t1200", {{"", cpus_8086}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO, 1024, 2048,1024, 0, machine_xt_t1200_init, t1200_get_device, NULL },
+ { "[8086] Toshiba 1200", ROM_T1200, "t1200", {{"", cpus_8086}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_VIDEO, 1024, 2048,1024, 0, machine_xt_t1200_init, NULL, NULL },
#if defined(DEV_BRANCH) && defined(USE_LASERXT)
{ "[8086] VTech Laser XT3", ROM_LXT3, "lxt3", {{"", cpus_8086}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA, 256, 512, 256, 0, machine_xt_laserxt_init, NULL, NULL },
#endif
@@ -104,6 +104,7 @@ machine_t machines[] = {
#if defined(DEV_BRANCH) && defined(USE_PORTABLE3)
{ "[386DX ISA] Compaq Portable III (386)", ROM_PORTABLEIII386, "portableiii386", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 1, MACHINE_ISA | MACHINE_AT | MACHINE_HDC | MACHINE_VIDEO, 1, 14, 1, 127, machine_at_compaq_init, NULL, nvr_at_close },
#endif
+ { "[386DX MCA] IBM PS/2 model 70 (type 3)", ROM_IBMPS2_M70_TYPE3, "ibmps2_m70_type3", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 1, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2, 2, 16, 2, 63, machine_ps2_model_70_type3_init, NULL, nvr_at_close },
{ "[386DX MCA] IBM PS/2 model 80", ROM_IBMPS2_M80, "ibmps2_m80", {{"Intel", cpus_i386DX}, {"AMD", cpus_Am386DX}, {"Cyrix", cpus_486DLC}, {"", NULL}, {"", NULL}}, 1, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2, 1, 12, 1, 63, machine_ps2_model_80_init, NULL, nvr_at_close },
@@ -113,6 +114,8 @@ machine_t machines[] = {
{ "[486 ISA] DTK PKM-0038S E-2", ROM_DTK486, "dtk486", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 1, 128, 1, 127, machine_at_dtk486_init, NULL, nvr_at_close },
{ "[486 ISA] IBM PS/1 model 2133", ROM_IBMPS1_2133, "ibmps1_2133", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 0, MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 1, 64, 1, 127, machine_ps1_m2133_init, NULL, nvr_at_close },
+ { "[486 MCA] IBM PS/2 model 70 (type 4)", ROM_IBMPS2_M70_TYPE4, "ibmps2_m70_type4", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 1, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2, 2, 64, 2, 63, machine_ps2_model_70_type4_init, NULL, nvr_at_close },
+
#ifdef WALTJE
{ "[486 MCA] IBM PS/2 model 80-486", ROM_IBMPS2_M80_486, "ibmps2_m80-486", {{"Intel", cpus_i486}, {"AMD", cpus_Am486}, {"Cyrix", cpus_Cx486}, {"", NULL}, {"", NULL}}, 1, MACHINE_MCA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC_PS2, 1, 32, 1, 63, machine_ps2_model_80_486_init, NULL, nvr_at_close },
#endif
@@ -135,9 +138,7 @@ machine_t machines[] = {
{ "[Socket 5 FX] President Award 430FX PCI",ROM_PRESIDENT, "president", {{ "Intel", cpus_PentiumS5}, {"IDT", cpus_WinChip}, {"AMD", cpus_K5}, {"", NULL}, {"", NULL}}, 0, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 127, machine_at_president_init, NULL, nvr_at_close },
{ "[Socket 7 FX] Intel Advanced/ATX", ROM_THOR, "thor", {{"Intel", cpus_Pentium}, {"IDT", cpus_WinChip}, {"AMD", cpus_K56}, {"Cyrix", cpus_6x86},{"", NULL}}, 0, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_thor_init, NULL, nvr_at_close },
-#if defined(DEV_BRANCH) && defined(USE_MRTHOR)
{ "[Socket 7 FX] MR Intel Advanced/ATX", ROM_MRTHOR, "mrthor", {{"Intel", cpus_Pentium}, {"IDT", cpus_WinChip}, {"AMD", cpus_K56}, {"Cyrix", cpus_6x86},{"", NULL}}, 0, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_thor_init, NULL, nvr_at_close },
-#endif
{ "[Socket 7 HX] Acer M3a", ROM_ACERM3A, "acerm3a", {{"Intel", cpus_Pentium}, {"IDT", cpus_WinChip}, {"AMD", cpus_K56}, {"Cyrix", cpus_6x86},{"", NULL}}, 0, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_acerm3a_init, NULL, nvr_at_close },
{ "[Socket 7 HX] Acer V35n", ROM_ACERV35N, "acerv35n", {{"Intel", cpus_Pentium}, {"IDT", cpus_WinChip}, {"AMD", cpus_K56}, {"Cyrix", cpus_6x86},{"", NULL}}, 0, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_acerv35n_init, NULL, nvr_at_close },
@@ -158,9 +159,7 @@ machine_t machines[] = {
{ "[Socket 5 FX] President Award 430FX PCI",ROM_PRESIDENT, "president", {{ "Intel", cpus_PentiumS5}, {"IDT", cpus_WinChip}, {"", NULL}, {"", NULL}, {"", NULL}}, 0, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_HDC, 8, 128, 8, 127, machine_at_president_init, NULL, nvr_at_close },
{ "[Socket 7 FX] Intel Advanced/ATX", ROM_THOR, "thor", {{"Intel", cpus_Pentium}, {"IDT", cpus_WinChip}, {"Cyrix", cpus_6x86}, {"", NULL}, {"", NULL}}, 0, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_thor_init, NULL, nvr_at_close },
-#if defined(DEV_BRANCH) && defined(USE_MRTHOR)
{ "[Socket 7 FX] MR Intel Advanced/ATX", ROM_MRTHOR, "mrthor", {{"Intel", cpus_Pentium}, {"IDT", cpus_WinChip}, {"Cyrix", cpus_6x86}, {"", NULL}, {"", NULL}}, 0, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_thor_init, NULL, nvr_at_close },
-#endif
{ "[Socket 7 HX] Acer M3a", ROM_ACERM3A, "acerm3a", {{"Intel", cpus_Pentium}, {"IDT", cpus_WinChip}, {"Cyrix", cpus_6x86}, {"", NULL}, {"", NULL}}, 0, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_acerm3a_init, NULL, nvr_at_close },
{ "[Socket 7 HX] Acer V35n", ROM_ACERV35N, "acerv35n", {{"Intel", cpus_Pentium}, {"IDT", cpus_WinChip}, {"Cyrix", cpus_6x86}, {"", NULL}, {"", NULL}}, 0, MACHINE_PCI | MACHINE_ISA | MACHINE_VLB | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_acerv35n_init, NULL, nvr_at_close },
diff --git a/src/mca.h b/src/mca.h
index 26e29e7c5..dd88c1f98 100644
--- a/src/mca.h
+++ b/src/mca.h
@@ -3,3 +3,5 @@ extern void mca_add(uint8_t (*read)(int addr, void *priv), void (*write)(int add
extern void mca_set_index(int index);
extern uint8_t mca_read(uint16_t port);
extern void mca_write(uint16_t port, uint8_t val);
+
+extern void ps2_cache_clean(void);
\ No newline at end of file
diff --git a/src/mem.c b/src/mem.c
index 291a47deb..93ae0ec47 100644
--- a/src/mem.c
+++ b/src/mem.c
@@ -389,15 +389,14 @@ uint8_t *getpccache(uint32_t a)
}
a&=rammask;
- if (isram[a>>16])
- {
- if ((a >> 16) != 0xF || shadowbios)
- addreadlookup(a2, a);
- return &ram[(uintptr_t)(a & 0xFFFFF000) - (uintptr_t)(a2 & ~0xFFF)];
- }
-
if (_mem_exec[a >> 14])
{
+ if (_mem_mapping_r[a >> 14]->flags & MEM_MAPPING_ROM)
+ cpu_prefetch_cycles = cpu_rom_prefetch_cycles;
+ else
+ cpu_prefetch_cycles = cpu_mem_prefetch_cycles;
+
+
return &_mem_exec[a >> 14][(uintptr_t)(a & 0x3000) - (uintptr_t)(a2 & ~0xFFF)];
}
@@ -1282,24 +1281,24 @@ void mem_add_bios()
{
if (AT || (romset == ROM_XI8088 && xi8088_bios_128kb()))
{
- mem_mapping_add(&bios_mapping[0], 0xe0000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom, MEM_MAPPING_EXTERNAL, 0);
- mem_mapping_add(&bios_mapping[1], 0xe4000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x4000 & biosmask), MEM_MAPPING_EXTERNAL, 0);
- mem_mapping_add(&bios_mapping[2], 0xe8000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x8000 & biosmask), MEM_MAPPING_EXTERNAL, 0);
- mem_mapping_add(&bios_mapping[3], 0xec000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0xc000 & biosmask), MEM_MAPPING_EXTERNAL, 0);
+ mem_mapping_add(&bios_mapping[0], 0xe0000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom, MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_mapping[1], 0xe4000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x4000 & biosmask), MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_mapping[2], 0xe8000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x8000 & biosmask), MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_mapping[3], 0xec000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0xc000 & biosmask), MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, 0);
}
- mem_mapping_add(&bios_mapping[4], 0xf0000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x10000 & biosmask), MEM_MAPPING_EXTERNAL, 0);
- mem_mapping_add(&bios_mapping[5], 0xf4000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x14000 & biosmask), MEM_MAPPING_EXTERNAL, 0);
- mem_mapping_add(&bios_mapping[6], 0xf8000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x18000 & biosmask), MEM_MAPPING_EXTERNAL, 0);
- mem_mapping_add(&bios_mapping[7], 0xfc000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x1c000 & biosmask), MEM_MAPPING_EXTERNAL, 0);
+ mem_mapping_add(&bios_mapping[4], 0xf0000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x10000 & biosmask), MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_mapping[5], 0xf4000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x14000 & biosmask), MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_mapping[6], 0xf8000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x18000 & biosmask), MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_mapping[7], 0xfc000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x1c000 & biosmask), MEM_MAPPING_EXTERNAL|MEM_MAPPING_ROM, 0);
- mem_mapping_add(&bios_high_mapping[0], (AT && cpu_16bitbus) ? 0xfe0000 : 0xfffe0000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom, 0, 0);
- mem_mapping_add(&bios_high_mapping[1], (AT && cpu_16bitbus) ? 0xfe4000 : 0xfffe4000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x4000 & biosmask), 0, 0);
- mem_mapping_add(&bios_high_mapping[2], (AT && cpu_16bitbus) ? 0xfe8000 : 0xfffe8000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x8000 & biosmask), 0, 0);
- mem_mapping_add(&bios_high_mapping[3], (AT && cpu_16bitbus) ? 0xfec000 : 0xfffec000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0xc000 & biosmask), 0, 0);
- mem_mapping_add(&bios_high_mapping[4], (AT && cpu_16bitbus) ? 0xff0000 : 0xffff0000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x10000 & biosmask), 0, 0);
- mem_mapping_add(&bios_high_mapping[5], (AT && cpu_16bitbus) ? 0xff4000 : 0xffff4000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x14000 & biosmask), 0, 0);
- mem_mapping_add(&bios_high_mapping[6], (AT && cpu_16bitbus) ? 0xff8000 : 0xffff8000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x18000 & biosmask), 0, 0);
- mem_mapping_add(&bios_high_mapping[7], (AT && cpu_16bitbus) ? 0xffc000 : 0xffffc000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x1c000 & biosmask), 0, 0);
+ mem_mapping_add(&bios_high_mapping[0], (AT && cpu_16bitbus) ? 0xfe0000 : 0xfffe0000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom, MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_high_mapping[1], (AT && cpu_16bitbus) ? 0xfe4000 : 0xfffe4000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x4000 & biosmask), MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_high_mapping[2], (AT && cpu_16bitbus) ? 0xfe8000 : 0xfffe8000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x8000 & biosmask), MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_high_mapping[3], (AT && cpu_16bitbus) ? 0xfec000 : 0xfffec000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0xc000 & biosmask), MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_high_mapping[4], (AT && cpu_16bitbus) ? 0xff0000 : 0xffff0000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x10000 & biosmask), MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_high_mapping[5], (AT && cpu_16bitbus) ? 0xff4000 : 0xffff4000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x14000 & biosmask), MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_high_mapping[6], (AT && cpu_16bitbus) ? 0xff8000 : 0xffff8000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x18000 & biosmask), MEM_MAPPING_ROM, 0);
+ mem_mapping_add(&bios_high_mapping[7], (AT && cpu_16bitbus) ? 0xffc000 : 0xffffc000, 0x04000, mem_read_bios, mem_read_biosw, mem_read_biosl, mem_write_null, mem_write_nullw, mem_write_nulll, rom + (0x1c000 & biosmask), MEM_MAPPING_ROM, 0);
}
int mem_a20_key = 0, mem_a20_alt = 0;
diff --git a/src/mem.h b/src/mem.h
index 2366a2ab6..9a5583d36 100644
--- a/src/mem.h
+++ b/src/mem.h
@@ -68,6 +68,8 @@ typedef struct mem_mapping_t
#define MEM_MAPPING_EXTERNAL 1
/*Only present on internal bus (RAM)*/
#define MEM_MAPPING_INTERNAL 2
+/*Executing from ROM may involve additional wait states*/
+#define MEM_MAPPING_ROM 4
extern uint8_t *ram,*rom;
extern uint8_t romext[32768];
diff --git a/src/nvr_ps2.c b/src/nvr_ps2.c
index a9a0ab979..2fcd89d72 100644
--- a/src/nvr_ps2.c
+++ b/src/nvr_ps2.c
@@ -67,6 +67,8 @@ static void *ps2_nvr_init(device_t *info)
switch (romset)
{
+ case ROM_IBMPS2_M70_TYPE3: f = nvr_fopen(L"ibmps2_m70_type3_sec.nvr", L"rb"); break;
+ case ROM_IBMPS2_M70_TYPE4: f = nvr_fopen(L"ibmps2_m70_type4_sec.nvr", L"rb"); break;
case ROM_IBMPS2_M80: f = nvr_fopen(L"ibmps2_m80_sec.nvr", L"rb"); break;
#ifdef WALTJE
case ROM_IBMPS2_M80_486: f = nvr_fopen(L"ibmps2_m80-486_sec.nvr", L"rb"); break;
@@ -90,6 +92,8 @@ void ps2_nvr_close(void *p)
switch (romset)
{
+ case ROM_IBMPS2_M70_TYPE3: f = nvr_fopen(L"ibmps2_m70_type3_sec.nvr", L"wb"); break;
+ case ROM_IBMPS2_M70_TYPE4: f = nvr_fopen(L"ibmps2_m70_type4_sec.nvr", L"wb"); break;
case ROM_IBMPS2_M80: f = nvr_fopen(L"ibmps2_m80_sec.nvr", L"wb"); break;
#ifdef WALTJE
case ROM_IBMPS2_M80_486: f = nvr_fopen(L"ibmps2_m80-486_sec.nvr", L"wb"); break;
diff --git a/src/rom.c b/src/rom.c
index 20295155f..c36600291 100644
--- a/src/rom.c
+++ b/src/rom.c
@@ -13,7 +13,7 @@
* - c386sx16 BIOS fails checksum
* - the loadfont() calls should be done elsewhere
*
- * Version: @(#)rom.c 1.0.35 2018/03/06
+ * Version: @(#)rom.c 1.0.34 2018/03/11
*
* Authors: Sarah Walker,
* Miran Grca,
@@ -256,7 +256,7 @@ rom_init(rom_t *rom, wchar_t *fn, uint32_t addr, int sz, int mask, int off, uint
addr, sz,
rom_read, rom_readw, rom_readl,
mem_write_null, mem_write_nullw, mem_write_nulll,
- rom->rom, flags, rom);
+ rom->rom, flags | MEM_MAPPING_ROM, rom);
return(0);
}
@@ -283,7 +283,7 @@ rom_init_interleaved(rom_t *rom, wchar_t *fnl, wchar_t *fnh, uint32_t addr, int
addr, sz,
rom_read, rom_readw, rom_readl,
mem_write_null, mem_write_nullw, mem_write_nulll,
- rom->rom, flags, rom);
+ rom->rom, flags | MEM_MAPPING_ROM, rom);
return(0);
}
@@ -674,14 +674,11 @@ rom_load_bios(int rom_id)
break;
case ROM_SPC4216P:
- if (rom_load_linear(
- L"roms/machines/spc4216p/phoenix.bin",
- 0x000000, 65536, 0, rom)) return(1);
- if (rom_load_interleaved(
+ if (! rom_load_interleaved(
L"roms/machines/spc4216p/7101.u8",
L"roms/machines/spc4216p/ac64.u10",
- 0x000000, 65536, 0, rom)) return(1);
- break;
+ 0x000000, 65536, 0, rom)) break;
+ return(1);
case ROM_KMXC02:
if (rom_load_linear(
@@ -720,6 +717,22 @@ rom_load_bios(int rom_id)
biosmask = 0x1ffff;
return(1);
+ case ROM_IBMPS2_M70_TYPE3:
+ if (! rom_load_interleaved(
+ L"roms/machines/ibmps2_m70_type3/70-a_even.bin",
+ L"roms/machines/ibmps2_m70_type3/70-a_odd.bin",
+ 0x000000, 65536, 0, rom)) break;
+ biosmask = 0x1ffff;
+ return(1);
+
+ case ROM_IBMPS2_M70_TYPE4:
+ if (! rom_load_interleaved(
+ L"roms/machines/ibmps2_m70_type4/70-b_even.bin",
+ L"roms/machines/ibmps2_m70_type4/70-b_odd.bin",
+ 0x000000, 65536, 0, rom)) break;
+ biosmask = 0x1ffff;
+ return(1);
+
case ROM_DTK486:
if (rom_load_linear(
L"roms/machines/dtk486/4siw005.bin",
@@ -848,14 +861,12 @@ rom_load_bios(int rom_id)
biosmask = 0x1ffff;
return(1);
-#if defined(DEV_BRANCH) && defined(USE_MRTHOR)
case ROM_MRTHOR:
if (! rom_load_linear(
L"roms/machines/mrthor/mr_atx.bio",
0x000000, 131072, 0, rom)) break;
biosmask = 0x1ffff;
return(1);
-#endif
case ROM_ZAPPA:
if (! rom_load_linear(
@@ -911,7 +922,6 @@ rom_load_bios(int rom_id)
if (!rom_load_linear(
L"roms/machines/t1000/t1000.rom",
0x000000, 32768, 0, rom)) break;
- memcpy(rom + 0x8000, rom, 0x8000);
biosmask = 0x7fff;
return(1);
@@ -920,7 +930,6 @@ rom_load_bios(int rom_id)
if (!rom_load_linear(
L"roms/machines/t1200/t1200_019e.ic15.bin",
0x000000, 32768, 0, rom)) break;
- memcpy(rom + 0x8000, rom, 0x8000);
biosmask = 0x7fff;
return(1);
diff --git a/src/rom.h b/src/rom.h
index 477a4788f..ce6e3b2c1 100644
--- a/src/rom.h
+++ b/src/rom.h
@@ -8,7 +8,7 @@
*
* Definitions for the ROM image handler.
*
- * Version: @(#)rom.h 1.0.17 2018/03/06
+ * Version: @(#)rom.h 1.0.16 2018/03/02
*
* Author: Fred N. van Kempen,
* Copyright 2018 Fred N. van Kempen.
@@ -127,6 +127,9 @@ enum {
#endif
ROM_IBMPS1_2133,
+ ROM_IBMPS2_M70_TYPE3,
+ ROM_IBMPS2_M70_TYPE4,
+
#ifdef WALTJE
ROM_IBMPS2_M80_486,
#endif
@@ -147,9 +150,7 @@ enum {
ROM_PRESIDENT, /* President Award 430FX PCI/430FX/Award/Unknown SIO */
ROM_THOR, /* Intel Advanced_ATX/430FX/AMI/NS PC87306 */
-#if defined(DEV_BRANCH) && defined(USE_MRTHOR)
ROM_MRTHOR, /* Intel Advanced_ATX/430FX/MR.BIOS/NS PC87306 */
-#endif
ROM_ACERM3A, /* Acer M3A/430HX/Acer/SMC FDC37C932FR */
ROM_ACERV35N, /* Acer V35N/430HX/Acer/SMC FDC37C932FR */
diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c
index 6bd9ea9d4..695644c5e 100644
--- a/src/video/vid_svga.c
+++ b/src/video/vid_svga.c
@@ -11,7 +11,7 @@
* This is intended to be used by another SVGA driver,
* and not as a card in it's own right.
*
- * Version: @(#)vid_svga.c 1.0.24 2018/03/05
+ * Version: @(#)vid_svga.c 1.0.24 2018/03/11
*
* Authors: Sarah Walker,
* Miran Grca,
@@ -109,14 +109,9 @@ void svga_out(uint16_t addr, uint8_t val, void *p)
case 0x3C2:
svga->miscout = val;
svga->vidclock = val & 4;
- if (val & 1)
- {
- io_removehandler(0x03a0, 0x0020, svga->video_in, NULL, NULL, svga->video_out, NULL, NULL, svga->p);
- }
- else
- {
+ io_removehandler(0x03a0, 0x0020, svga->video_in, NULL, NULL, svga->video_out, NULL, NULL, svga->p);
+ if (!(val & 1))
io_sethandler(0x03a0, 0x0020, svga->video_in, NULL, NULL, svga->video_out, NULL, NULL, svga->p);
- }
svga_recalctimings(svga);
break;
case 0x3C4:
diff --git a/src/video/vid_table.c b/src/video/vid_table.c
index 49594dcf5..cde1ebd0f 100644
--- a/src/video/vid_table.c
+++ b/src/video/vid_table.c
@@ -8,7 +8,7 @@
*
* Define all known video cards.
*
- * Version: @(#)vid_table.c 1.0.24 2018/03/03
+ * Version: @(#)vid_table.c 1.0.23 2018/03/11
*
* Authors: Miran Grca,
* Fred N. van Kempen,
@@ -85,93 +85,91 @@ typedef struct {
static VIDEO_CARD
video_cards[] = {
- {"None", "none", NULL, GFX_NONE },
- {"Internal", "internal", NULL, GFX_INTERNAL, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx_isa", &mach64gx_isa_device, GFX_MACH64GX_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
- {"[ISA] ATI Korean VGA (ATI-28800-5)", "ati28800k", &ati28800k_device, GFX_ATIKOREANVGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
- {"[ISA] ATI VGA-88 (ATI-18800-1)", "ati18800v", &ati18800_vga88_device, GFX_VGA88, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] ATI VGA Charger (ATI-28800-5)", "ati28800", &ati28800_device, GFX_VGACHARGER, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
- {"[ISA] ATI VGA Edge-16 (ATI-18800-5)", "ati18800", &ati18800_device, GFX_VGAEDGE16, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] ATI VGA Wonder (ATI-18800)", "ati18800w", &ati18800_wonder_device, GFX_VGAWONDER, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
-#if defined(DEV_BRANCH) && defined(USE_XL24)
- {"[ISA] ATI VGA Wonder XL24 (ATI-28800-6)", "ati28800w", &ati28800_wonderxl24_device, GFX_VGAWONDERXL24, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
-#endif
- {"[ISA] CGA", "cga", &cga_device, GFX_CGA, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] Chips & Technologies SuperEGA", "superega", &sega_device, GFX_SUPER_EGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] Cirrus Logic CL-GD 5428", "cl_gd5428_isa", &gd5428_isa_device, GFX_CL_GD5428_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}},
- {"[ISA] Cirrus Logic CL-GD 5429", "cl_gd5429_isa", &gd5429_isa_device, GFX_CL_GD5429_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}},
- {"[ISA] Cirrus Logic CL-GD 5434", "cl_gd5434_isa", &gd5434_isa_device, GFX_CL_GD5434_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}},
- {"[ISA] Compaq ATI VGA Wonder XL (ATI-28800-5)", "compaq_ati28800", &compaq_ati28800_device, GFX_VGAWONDERXL, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
- {"[ISA] Compaq CGA", "compaq_cga", &compaq_cga_device, GFX_COMPAQ_CGA, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] Compaq CGA 2", "compaq_cga_2", &compaq_cga_2_device, GFX_COMPAQ_CGA_2, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] Compaq EGA", "compaq_ega", &cpqega_device, GFX_COMPAQ_EGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] EGA", "ega", &ega_device, GFX_EGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] Hercules", "hercules", &hercules_device, GFX_HERCULES, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] Hercules Plus", "hercules_plus", &herculesplus_device, GFX_HERCULESPLUS, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] Hercules InColor", "incolor", &incolor_device, GFX_INCOLOR, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] MDA", "mda", &mda_device, GFX_MDA, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] MDSI Genius", "genius", &genius_device, GFX_GENIUS, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] OAK OTI-037C", "oti037c", &oti037c_device, GFX_OTI037C, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
- {"[ISA] OAK OTI-067", "oti067", &oti067_device, GFX_OTI067, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
- {"[ISA] OAK OTI-077", "oti077", &oti077_device, GFX_OTI077, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
- {"[ISA] Paradise PVGA1A", "pvga1a", ¶dise_pvga1a_device, GFX_PVGA1A, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] Paradise WD90C11-LR", "wd90c11", ¶dise_wd90c11_device, GFX_WD90C11, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] Paradise WD90C30-LR", "wd90c30", ¶dise_wd90c30_device, GFX_WD90C30, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
- {"[ISA] Plantronics ColorPlus", "plantronics", &colorplus_device, GFX_COLORPLUS, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "None", "none", NULL, GFX_NONE },
+ { "Internal", "internal", NULL, GFX_INTERNAL, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx_isa", &mach64gx_isa_device, GFX_MACH64GX_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
+ {"[ISA] ATI Korean VGA (ATI-28800-5)", "ati28800k", &ati28800k_device, GFX_ATIKOREANVGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
+ { "[ISA] ATI VGA-88 (ATI-18800-1)", "ati18800v", &ati18800_vga88_device, GFX_VGA88, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] ATI VGA Charger (ATI-28800-5)", "ati28800", &ati28800_device, GFX_VGACHARGER, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
+ { "[ISA] ATI VGA Edge-16 (ATI-18800-5)", "ati18800", &ati18800_device, GFX_VGAEDGE16, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] ATI VGA Wonder (ATI-18800)", "ati18800w", &ati18800_wonder_device, GFX_VGAWONDER, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] ATI VGA Wonder XL24 (ATI-28800-6)", "ati28800w", &ati28800_wonderxl24_device,GFX_VGAWONDERXL24, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
+ { "[ISA] CGA", "cga", &cga_device, GFX_CGA, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] Chips & Technologies SuperEGA", "superega", &sega_device, GFX_SUPER_EGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] Cirrus Logic CL-GD 5428", "cl_gd5428_isa", &gd5428_isa_device, GFX_CL_GD5428_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}},
+ { "[ISA] Cirrus Logic CL-GD 5429", "cl_gd5429_isa", &gd5429_isa_device, GFX_CL_GD5429_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}},
+ { "[ISA] Cirrus Logic CL-GD 5434", "cl_gd5434_isa", &gd5434_isa_device, GFX_CL_GD5434_ISA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}},
+ { "[ISA] Compaq ATI VGA Wonder XL (ATI-28800-5)","compaq_ati28800", &compaq_ati28800_device, GFX_VGAWONDERXL, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
+ { "[ISA] Compaq CGA", "compaq_cga", &compaq_cga_device, GFX_COMPAQ_CGA, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] Compaq CGA 2", "compaq_cga_2", &compaq_cga_2_device, GFX_COMPAQ_CGA_2, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] Compaq EGA", "compaq_ega", &cpqega_device, GFX_COMPAQ_EGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] EGA", "ega", &ega_device, GFX_EGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] Hercules", "hercules", &hercules_device, GFX_HERCULES, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] Hercules Plus", "hercules_plus", &herculesplus_device, GFX_HERCULESPLUS, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] Hercules InColor", "incolor", &incolor_device, GFX_INCOLOR, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] MDA", "mda", &mda_device, GFX_MDA, VIDEO_FLAG_TYPE_MDA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ { "[ISA] MDSI Genius", "genius", &genius_device, GFX_GENIUS, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ {"[ISA] OAK OTI-037C", "oti037c", &oti037c_device, GFX_OTI037C, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
+ {"[ISA] OAK OTI-067", "oti067", &oti067_device, GFX_OTI067, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
+ {"[ISA] OAK OTI-077", "oti077", &oti077_device, GFX_OTI077, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
+ {"[ISA] Paradise PVGA1A", "pvga1a", ¶dise_pvga1a_device, GFX_PVGA1A, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ {"[ISA] Paradise WD90C11-LR", "wd90c11", ¶dise_wd90c11_device, GFX_WD90C11, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ {"[ISA] Paradise WD90C30-LR", "wd90c30", ¶dise_wd90c30_device, GFX_WD90C30, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 6, 8, 16, 6, 8, 16}},
+ {"[ISA] Plantronics ColorPlus", "plantronics", &colorplus_device, GFX_COLORPLUS, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
#if defined(DEV_BRANCH) && defined(USE_TI)
- {"[ISA] TI CF62011 SVGA", "ti_cf62011", &ti_cf62011_device, GFX_TICF62011, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ {"[ISA] TI CF62011 SVGA", "ti_cf62011", &ti_cf62011_device, GFX_TICF62011, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
#endif
- {"[ISA] Trident TVGA8900D", "tvga8900d", &tvga8900d_device, GFX_TVGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}},
- {"[ISA] Tseng ET4000AX", "et4000ax", &et4000_device, GFX_ET4000, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
- {"[ISA] VGA", "vga", &vga_device, GFX_VGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[ISA] Wyse 700", "wy700", &wy700_device, GFX_WY700, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
- {"[PCI] ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx_pci", &mach64gx_pci_device, GFX_MACH64GX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}},
- {"[PCI] ATI Video Xpression (Mach64 VT2)", "mach64vt2", &mach64vt2_device, GFX_MACH64VT2, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}},
- {"[PCI] Cardex Tseng ET4000/w32p", "et4000w32p_pci", &et4000w32p_cardex_pci_device, GFX_ET4000W32_CARDEX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}},
- {"[PCI] Cirrus Logic CL-GD 5430", "cl_gd5430_pci", &gd5430_pci_device, GFX_CL_GD5430_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
- {"[PCI] Cirrus Logic CL-GD 5434", "cl_gd5434_pci", &gd5434_pci_device, GFX_CL_GD5434_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
- {"[PCI] Cirrus Logic CL-GD 5436", "cl_gd5436_pci", &gd5436_pci_device, GFX_CL_GD5436_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
+ {"[ISA] Trident TVGA8900D", "tvga8900d", &tvga8900d_device, GFX_TVGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 8, 8, 12}},
+ {"[ISA] Tseng ET4000AX", "et4000ax", &et4000_device, GFX_ET4000, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 3, 3, 6, 5, 5, 10}},
+ {"[ISA] VGA", "vga", &vga_device, GFX_VGA, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ {"[ISA] Wyse 700", "wy700", &wy700_device, GFX_WY700, VIDEO_FLAG_TYPE_CGA, {VIDEO_ISA, 8, 16, 32, 8, 16, 32}},
+ {"[PCI] ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx_pci", &mach64gx_pci_device, GFX_MACH64GX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}},
+ {"[PCI] ATI Video Xpression (Mach64 VT2)", "mach64vt2", &mach64vt2_device, GFX_MACH64VT2, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}},
+ {"[PCI] Cardex Tseng ET4000/w32p", "et4000w32p_pci", &et4000w32p_cardex_pci_device,GFX_ET4000W32_CARDEX_PCI,VIDEO_FLAG_TYPE_SPECIAL,{VIDEO_BUS, 4, 4, 4, 10, 10, 10}},
+ {"[PCI] Cirrus Logic CL-GD 5430", "cl_gd5430_pci", &gd5430_pci_device, GFX_CL_GD5430_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
+ {"[PCI] Cirrus Logic CL-GD 5434", "cl_gd5434_pci", &gd5434_pci_device, GFX_CL_GD5434_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
+ {"[PCI] Cirrus Logic CL-GD 5436", "cl_gd5436_pci", &gd5436_pci_device, GFX_CL_GD5436_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
#if defined(DEV_BRANCH) && defined(USE_STEALTH32)
- {"[PCI] Diamond Stealth 32 (Tseng ET4000/w32p)","stealth32_pci", &et4000w32p_pci_device, GFX_ET4000W32_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}},
+ {"[PCI] Diamond Stealth 32 (Tseng ET4000/w32p)","stealth32_pci", &et4000w32p_pci_device, GFX_ET4000W32_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}},
#endif
- {"[PCI] Diamond Stealth 3D 2000 (S3 ViRGE)", "stealth3d_2000_pci",&s3_virge_pci_device, GFX_VIRGE_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
- {"[PCI] Diamond Stealth 3D 3000 (S3 ViRGE/VX)", "stealth3d_3000_pci",&s3_virge_988_pci_device, GFX_VIRGEVX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 4, 26, 26, 42}},
- {"[PCI] Diamond Stealth 64 DRAM (S3 Trio64)", "stealth64d_pci", &s3_diamond_stealth64_pci_device, GFX_STEALTH64_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 4, 26, 26, 42}},
+ {"[PCI] Diamond Stealth 3D 2000 (S3 ViRGE)", "stealth3d_2000_pci",&s3_virge_pci_device, GFX_VIRGE_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
+ {"[PCI] Diamond Stealth 3D 3000 (S3 ViRGE/VX)", "stealth3d_3000_pci",&s3_virge_988_pci_device, GFX_VIRGEVX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 4, 26, 26, 42}},
+ {"[PCI] Diamond Stealth 64 DRAM (S3 Trio64)", "stealth64d_pci", &s3_diamond_stealth64_pci_device,GFX_STEALTH64_PCI,VIDEO_FLAG_TYPE_SPECIAL,{VIDEO_BUS, 2, 2, 4, 26, 26, 42}},
#if defined(DEV_BRANCH) && defined(USE_RIVA)
- {"[PCI] nVidia RIVA 128", "riva128", &riva128_device, GFX_RIVA128, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 24, 24, 36}},
- {"[PCI] nVidia RIVA TNT", "rivatnt", &rivatnt_device, GFX_RIVATNT, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 24, 24, 36}},
- {"[PCI] nVidia RIVA TNT2", "rivatnt2", &rivatnt2_device, GFX_RIVATNT2, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 24, 24, 36}},
+ {"[PCI] nVidia RIVA 128", "riva128", &riva128_device, GFX_RIVA128, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 24, 24, 36}},
+ {"[PCI] nVidia RIVA TNT", "rivatnt", &rivatnt_device, GFX_RIVATNT, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 24, 24, 36}},
+ {"[PCI] nVidia RIVA TNT2", "rivatnt2", &rivatnt2_device, GFX_RIVATNT2, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 24, 24, 36}},
#endif
- {"[PCI] Number Nine 9FX (S3 Trio64)", "n9_9fx_pci", &s3_9fx_pci_device, GFX_N9_9FX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
- {"[PCI] Paradise Bahamas 64 (S3 Vision864)", "bahamas64_pci", &s3_bahamas64_pci_device, GFX_BAHAMAS64_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 5, 20, 20, 35}},
- {"[PCI] Phoenix S3 Vision864", "px_vision864_pci", &s3_phoenix_vision864_pci_device, GFX_PHOENIX_VISION864_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 5, 20, 20, 35}},
- {"[PCI] Phoenix S3 Trio32", "px_trio32_pci", &s3_phoenix_trio32_pci_device, GFX_PHOENIX_TRIO32_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
- {"[PCI] Phoenix S3 Trio64", "px_trio64_pci", &s3_phoenix_trio64_pci_device, GFX_PHOENIX_TRIO64_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
- {"[PCI] S3 ViRGE/DX", "virge375_pci", &s3_virge_375_pci_device, GFX_VIRGEDX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
- {"[PCI] S3 ViRGE/DX (VBE 2.0)", "virge375_vbe20_pci",&s3_virge_375_4_pci_device, GFX_VIRGEDX4_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
- {"[PCI] Trident TGUI9440", "tgui9440_pci", &tgui9440_pci_device, GFX_TGUI9440_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 8, 16, 4, 8, 16}},
- {"[VLB] ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx_vlb", &mach64gx_vlb_device, GFX_MACH64GX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}},
- {"[VLB] Cardex Tseng ET4000/w32p", "et4000w32p_vlb", &et4000w32p_cardex_vlb_device, GFX_ET4000W32_CARDEX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}},
- {"[VLB] Cirrus Logic CL-GD 5429", "cl_gd5429_vlb", &gd5429_vlb_device, GFX_CL_GD5429_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
- {"[VLB] Cirrus Logic CL-GD 5434", "cl_gd5434_vlb", &gd5434_vlb_device, GFX_CL_GD5434_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
+ {"[PCI] Number Nine 9FX (S3 Trio64)", "n9_9fx_pci", &s3_9fx_pci_device, GFX_N9_9FX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
+ {"[PCI] Paradise Bahamas 64 (S3 Vision864)", "bahamas64_pci", &s3_bahamas64_pci_device, GFX_BAHAMAS64_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 5, 20, 20, 35}},
+ {"[PCI] Phoenix S3 Vision864", "px_vision864_pci", &s3_phoenix_vision864_pci_device,GFX_PHOENIX_VISION864_PCI,VIDEO_FLAG_TYPE_SPECIAL,{VIDEO_BUS, 4, 4, 5, 20, 20, 35}},
+ {"[PCI] Phoenix S3 Trio32", "px_trio32_pci", &s3_phoenix_trio32_pci_device,GFX_PHOENIX_TRIO32_PCI,VIDEO_FLAG_TYPE_SPECIAL,{VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
+ {"[PCI] Phoenix S3 Trio64", "px_trio64_pci", &s3_phoenix_trio64_pci_device,GFX_PHOENIX_TRIO64_PCI,VIDEO_FLAG_TYPE_SPECIAL,{VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
+ {"[PCI] S3 ViRGE/DX", "virge375_pci", &s3_virge_375_pci_device, GFX_VIRGEDX_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
+ {"[PCI] S3 ViRGE/DX (VBE 2.0)", "virge375_vbe20_pci",&s3_virge_375_4_pci_device,GFX_VIRGEDX4_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
+ {"[PCI] Trident TGUI9440", "tgui9440_pci", &tgui9440_pci_device, GFX_TGUI9440_PCI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 8, 16, 4, 8, 16}},
+ {"[VLB] ATI Graphics Pro Turbo (Mach64 GX)", "mach64gx_vlb", &mach64gx_vlb_device, GFX_MACH64GX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 1, 20, 20, 21}},
+ {"[VLB] Cardex Tseng ET4000/w32p", "et4000w32p_vlb", &et4000w32p_cardex_vlb_device,GFX_ET4000W32_CARDEX_VLB,VIDEO_FLAG_TYPE_SPECIAL,{VIDEO_BUS, 4, 4, 4, 10, 10, 10}},
+ {"[VLB] Cirrus Logic CL-GD 5428", "cl_gd5428_vlb", &gd5428_vlb_device, GFX_CL_GD5428_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
+ {"[VLB] Cirrus Logic CL-GD 5429", "cl_gd5429_vlb", &gd5429_vlb_device, GFX_CL_GD5429_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
+ {"[VLB] Cirrus Logic CL-GD 5434", "cl_gd5434_vlb", &gd5434_vlb_device, GFX_CL_GD5434_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
#if defined(DEV_BRANCH) && defined(USE_STEALTH32)
- {"[VLB] Diamond Stealth 32 (Tseng ET4000/w32p)","stealth32_vlb", &et4000w32p_vlb_device, GFX_ET4000W32_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}},
+ {"[VLB] Diamond Stealth 32 (Tseng ET4000/w32p)","stealth32_vlb", &et4000w32p_vlb_device, GFX_ET4000W32_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 4, 10, 10, 10}},
#endif
- {"[VLB] Diamond SpeedStar PRO (CL-GD5428)", "cl_gd5428_vlb", &gd5428_vlb_device, GFX_CL_GD5428_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
- {"[VLB] Diamond SpeedStar PRO SE (CL-GD5430)", "cl_gd5430_vlb", &gd5430_vlb_device, GFX_CL_GD5430_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
- {"[VLB] Diamond Stealth 3D 2000 (S3 ViRGE)", "stealth3d_2000_vlb",&s3_virge_vlb_device, GFX_VIRGE_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
- {"[VLB] Diamond Stealth 3D 3000 (S3 ViRGE/VX)", "stealth3d_3000_vlb",&s3_virge_988_vlb_device, GFX_VIRGEVX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 4, 26, 26, 42}},
- {"[VLB] Diamond Stealth 64 DRAM (S3 Trio64)", "stealth64d_vlb", &s3_diamond_stealth64_vlb_device, GFX_STEALTH64_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 4, 26, 26, 42}},
- {"[VLB] Number Nine 9FX (S3 Trio64)", "n9_9fx_vlb", &s3_9fx_vlb_device, GFX_N9_9FX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
- {"[VLB] Paradise Bahamas 64 (S3 Vision864)", "bahamas64_vlb", &s3_bahamas64_vlb_device, GFX_BAHAMAS64_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 5, 20, 20, 35}},
- {"[VLB] Phoenix S3 Vision864", "px_vision864_vlb", &s3_phoenix_vision864_vlb_device, GFX_PHOENIX_VISION864_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 5, 20, 20, 35}},
- {"[VLB] Phoenix S3 Trio32", "px_trio32_vlb", &s3_phoenix_trio32_vlb_device, GFX_PHOENIX_TRIO32_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
- {"[VLB] Phoenix S3 Trio64", "px_trio64_vlb", &s3_phoenix_trio64_vlb_device, GFX_PHOENIX_TRIO64_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
- {"[VLB] S3 ViRGE/DX", "virge375_vlb", &s3_virge_375_vlb_device, GFX_VIRGEDX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
- {"[VLB] S3 ViRGE/DX (VBE 2.0)", "virge375_vbe20_vlb",&s3_virge_375_4_vlb_device, GFX_VIRGEDX4_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
- {"[VLB] Trident TGUI9400CXi", "tgui9400cxi_vlb", &tgui9400cxi_device, GFX_TGUI9400CXI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 8, 16, 4, 8, 16}},
- {"[VLB] Trident TGUI9440", "tgui9440_vlb", &tgui9440_vlb_device, GFX_TGUI9440_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 8, 16, 4, 8, 16}},
- {"", "", NULL, -1 }
+ {"[VLB] Diamond SpeedStar PRO SE (CL-GD5430)", "cl_gd5430_vlb", &gd5430_vlb_device, GFX_CL_GD5430_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 8, 10, 10, 20}},
+ {"[VLB] Diamond Stealth 3D 2000 (S3 ViRGE)", "stealth3d_2000_vlb",&s3_virge_vlb_device, GFX_VIRGE_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
+ {"[VLB] Diamond Stealth 3D 3000 (S3 ViRGE/VX)", "stealth3d_3000_vlb",&s3_virge_988_vlb_device, GFX_VIRGEVX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 4, 26, 26, 42}},
+ {"[VLB] Diamond Stealth 64 DRAM (S3 Trio64)", "stealth64d_vlb", &s3_diamond_stealth64_vlb_device,GFX_STEALTH64_VLB,VIDEO_FLAG_TYPE_SPECIAL,{VIDEO_BUS, 2, 2, 4, 26, 26, 42}},
+ {"[VLB] Number Nine 9FX (S3 Trio64)", "n9_9fx_vlb", &s3_9fx_vlb_device, GFX_N9_9FX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
+ {"[VLB] Paradise Bahamas 64 (S3 Vision864)", "bahamas64_vlb", &s3_bahamas64_vlb_device, GFX_BAHAMAS64_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 4, 5, 20, 20, 35}},
+ {"[VLB] Phoenix S3 Vision864", "px_vision864_vlb", &s3_phoenix_vision864_vlb_device,GFX_PHOENIX_VISION864_VLB,VIDEO_FLAG_TYPE_SPECIAL,{VIDEO_BUS, 4, 4, 5, 20, 20, 35}},
+ {"[VLB] Phoenix S3 Trio32", "px_trio32_vlb", &s3_phoenix_trio32_vlb_device,GFX_PHOENIX_TRIO32_VLB,VIDEO_FLAG_TYPE_SPECIAL,{VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
+ {"[VLB] Phoenix S3 Trio64", "px_trio64_vlb", &s3_phoenix_trio64_vlb_device,GFX_PHOENIX_TRIO64_VLB,VIDEO_FLAG_TYPE_SPECIAL,{VIDEO_BUS, 3, 2, 4, 25, 25, 40}},
+ {"[VLB] S3 ViRGE/DX", "virge375_vlb", &s3_virge_375_vlb_device, GFX_VIRGEDX_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
+ {"[VLB] S3 ViRGE/DX (VBE 2.0)", "virge375_vbe20_vlb",&s3_virge_375_4_vlb_device,GFX_VIRGEDX4_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 2, 2, 3, 28, 28, 45}},
+ {"[VLB] Trident TGUI9400CXi", "tgui9400cxi_vlb", &tgui9400cxi_device, GFX_TGUI9400CXI, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 8, 16, 4, 8, 16}},
+ {"[VLB] Trident TGUI9440", "tgui9440_vlb", &tgui9440_vlb_device, GFX_TGUI9440_VLB, VIDEO_FLAG_TYPE_SPECIAL, {VIDEO_BUS, 4, 8, 16, 4, 8, 16}},
+ {"", "", NULL, -1 }
};
@@ -317,6 +315,8 @@ int video_is_mda(void)
case ROM_IBMPS2_M30_286:
case ROM_IBMPS2_M50:
case ROM_IBMPS2_M55SX:
+ case ROM_IBMPS2_M70_TYPE3:
+ case ROM_IBMPS2_M70_TYPE4:
case ROM_IBMPS2_M80:
case ROM_IBMPS1_2121:
case ROM_T3100E:
@@ -348,6 +348,8 @@ int video_is_cga(void)
case ROM_IBMPS2_M30_286:
case ROM_IBMPS2_M50:
case ROM_IBMPS2_M55SX:
+ case ROM_IBMPS2_M70_TYPE3:
+ case ROM_IBMPS2_M70_TYPE4:
case ROM_IBMPS2_M80:
case ROM_IBMPS1_2121:
return 0;
@@ -378,6 +380,8 @@ int video_is_ega_vga(void)
case ROM_IBMPS2_M30_286:
case ROM_IBMPS2_M50:
case ROM_IBMPS2_M55SX:
+ case ROM_IBMPS2_M70_TYPE3:
+ case ROM_IBMPS2_M70_TYPE4:
case ROM_IBMPS2_M80:
case ROM_IBMPS1_2121:
return 1;