Added the GC113 used by the real TriGem 286M, and fixed that EMS driver on GC113 onwards, closes #2567.
This commit is contained in:
@@ -38,6 +38,23 @@
|
|||||||
#include <86box/chipset.h>
|
#include <86box/chipset.h>
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
HEADLAND_GC103 = 0x00,
|
||||||
|
HEADLAND_GC113 = 0x10,
|
||||||
|
HEADLAND_HT18_A = 0x11,
|
||||||
|
HEADLAND_HT18_B = 0x12,
|
||||||
|
HEADLAND_HT18_C = 0x18,
|
||||||
|
HEADLAND_HT21_C_D = 0x31,
|
||||||
|
HEADLAND_HT21_E = 0x32,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define HEADLAND_REV_MASK 0x0F
|
||||||
|
|
||||||
|
#define HEADLAND_HAS_CRI 0x10
|
||||||
|
#define HEADLAND_HAS_SLEEP 0x20
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t valid, enabled;
|
uint8_t valid, enabled;
|
||||||
uint16_t mr;
|
uint16_t mr;
|
||||||
@@ -49,6 +66,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct headland_t {
|
typedef struct headland_t {
|
||||||
uint8_t revision;
|
uint8_t revision;
|
||||||
|
uint8_t has_cri, has_sleep;
|
||||||
|
|
||||||
uint8_t cri;
|
uint8_t cri;
|
||||||
uint8_t cr[7];
|
uint8_t cr[7];
|
||||||
@@ -330,7 +348,7 @@ hl_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x01ed:
|
case 0x01ed:
|
||||||
if (dev->revision > 0)
|
if (dev->has_cri)
|
||||||
dev->cri = val;
|
dev->cri = val;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -339,7 +357,7 @@ hl_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x01ef:
|
case 0x01ef:
|
||||||
switch(dev->cri) {
|
switch(dev->cri & 0x07) {
|
||||||
case 0:
|
case 0:
|
||||||
dev->cr[0] = (val & 0x1f) | mem_conf_cr0[(mem_size > 640 ? mem_size : mem_size - 128) >> 9];
|
dev->cr[0] = (val & 0x1f) | mem_conf_cr0[(mem_size > 640 ? mem_size : mem_size - 128) >> 9];
|
||||||
memmap_state_update(dev);
|
memmap_state_update(dev);
|
||||||
@@ -352,11 +370,18 @@ hl_write(uint16_t addr, uint8_t val, void *priv)
|
|||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
case 3:
|
case 3:
|
||||||
case 5:
|
|
||||||
dev->cr[dev->cri] = val;
|
dev->cr[dev->cri] = val;
|
||||||
memmap_state_update(dev);
|
memmap_state_update(dev);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
if (dev->has_sleep)
|
||||||
|
dev->cr[dev->cri] = val;
|
||||||
|
else
|
||||||
|
dev->cr[dev->cri] = val & 0x0f;
|
||||||
|
memmap_state_update(dev);
|
||||||
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
dev->cr[4] = (dev->cr[4] & 0xf0) | (val & 0x0f);
|
dev->cr[4] = (dev->cr[4] & 0xf0) | (val & 0x0f);
|
||||||
memmap_state_update(dev);
|
memmap_state_update(dev);
|
||||||
@@ -421,7 +446,7 @@ hl_read(uint16_t addr, void *priv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x01ed:
|
case 0x01ed:
|
||||||
if (dev->revision > 0)
|
if (dev->has_cri)
|
||||||
ret = dev->cri;
|
ret = dev->cri;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -430,7 +455,7 @@ hl_read(uint16_t addr, void *priv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x01ef:
|
case 0x01ef:
|
||||||
switch(dev->cri) {
|
switch(dev->cri & 0x07) {
|
||||||
case 0:
|
case 0:
|
||||||
ret = (dev->cr[0] & 0x1f) | mem_conf_cr0[(mem_size > 640 ? mem_size : mem_size - 128) >> 9];
|
ret = (dev->cr[0] & 0x1f) | mem_conf_cr0[(mem_size > 640 ? mem_size : mem_size - 128) >> 9];
|
||||||
break;
|
break;
|
||||||
@@ -593,11 +618,14 @@ headland_init(const device_t *info)
|
|||||||
dev = (headland_t *) malloc(sizeof(headland_t));
|
dev = (headland_t *) malloc(sizeof(headland_t));
|
||||||
memset(dev, 0x00, sizeof(headland_t));
|
memset(dev, 0x00, sizeof(headland_t));
|
||||||
|
|
||||||
dev->revision = info->local;
|
dev->has_cri = (info->local & HEADLAND_HAS_CRI);
|
||||||
|
dev->has_sleep = (info->local & HEADLAND_HAS_SLEEP);
|
||||||
|
dev->revision = info->local & HEADLAND_REV_MASK;
|
||||||
|
|
||||||
if (dev->revision > 0)
|
if (dev->revision > 0)
|
||||||
ht386 = 1;
|
ht386 = 1;
|
||||||
|
|
||||||
|
dev->cr[0] = 0x04;
|
||||||
dev->cr[4] = dev->revision << 4;
|
dev->cr[4] = dev->revision << 4;
|
||||||
|
|
||||||
if (ht386)
|
if (ht386)
|
||||||
@@ -627,7 +655,7 @@ headland_init(const device_t *info)
|
|||||||
ram, MEM_MAPPING_INTERNAL, &dev->null_mr);
|
ram, MEM_MAPPING_INTERNAL, &dev->null_mr);
|
||||||
|
|
||||||
if (mem_size > 640) {
|
if (mem_size > 640) {
|
||||||
mem_mapping_add(&dev->mid_mapping, 0xa0000, 0x40000,
|
mem_mapping_add(&dev->mid_mapping, 0xa0000, 0x60000,
|
||||||
mem_read_b, mem_read_w, mem_read_l,
|
mem_read_b, mem_read_w, mem_read_l,
|
||||||
mem_write_b, mem_write_w, mem_write_l,
|
mem_write_b, mem_write_w, mem_write_l,
|
||||||
ram + 0xa0000, MEM_MAPPING_INTERNAL, &dev->null_mr);
|
ram + 0xa0000, MEM_MAPPING_INTERNAL, &dev->null_mr);
|
||||||
@@ -684,11 +712,26 @@ headland_init(const device_t *info)
|
|||||||
return(dev);
|
return(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const device_t headland_gc10x_device = {
|
const device_t headland_gc10x_device = {
|
||||||
.name = "Headland GC101/102/103",
|
.name = "Headland GC101/102/103",
|
||||||
.internal_name = "headland_gc10x",
|
.internal_name = "headland_gc10x",
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.local = 0,
|
.local = HEADLAND_GC103,
|
||||||
|
.init = headland_init,
|
||||||
|
.close = headland_close,
|
||||||
|
.reset = NULL,
|
||||||
|
{ .available = NULL },
|
||||||
|
.speed_changed = NULL,
|
||||||
|
.force_redraw = NULL,
|
||||||
|
.config = NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
const device_t headland_gc113_device = {
|
||||||
|
.name = "Headland GC101/102/113",
|
||||||
|
.internal_name = "headland_gc113",
|
||||||
|
.flags = 0,
|
||||||
|
.local = HEADLAND_GC113,
|
||||||
.init = headland_init,
|
.init = headland_init,
|
||||||
.close = headland_close,
|
.close = headland_close,
|
||||||
.reset = NULL,
|
.reset = NULL,
|
||||||
@@ -702,7 +745,7 @@ const device_t headland_ht18a_device = {
|
|||||||
.name = "Headland HT18 Rev. A",
|
.name = "Headland HT18 Rev. A",
|
||||||
.internal_name = "headland_ht18a",
|
.internal_name = "headland_ht18a",
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.local = 1,
|
.local = HEADLAND_HT18_A,
|
||||||
.init = headland_init,
|
.init = headland_init,
|
||||||
.close = headland_close,
|
.close = headland_close,
|
||||||
.reset = NULL,
|
.reset = NULL,
|
||||||
@@ -716,7 +759,7 @@ const device_t headland_ht18b_device = {
|
|||||||
.name = "Headland HT18 Rev. B",
|
.name = "Headland HT18 Rev. B",
|
||||||
.internal_name = "headland_ht18b",
|
.internal_name = "headland_ht18b",
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.local = 2,
|
.local = HEADLAND_HT18_B,
|
||||||
.init = headland_init,
|
.init = headland_init,
|
||||||
.close = headland_close,
|
.close = headland_close,
|
||||||
.reset = NULL,
|
.reset = NULL,
|
||||||
@@ -730,7 +773,35 @@ const device_t headland_ht18c_device = {
|
|||||||
.name = "Headland HT18 Rev. C",
|
.name = "Headland HT18 Rev. C",
|
||||||
.internal_name = "headland_ht18c",
|
.internal_name = "headland_ht18c",
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.local = 8,
|
.local = HEADLAND_HT18_C,
|
||||||
|
.init = headland_init,
|
||||||
|
.close = headland_close,
|
||||||
|
.reset = NULL,
|
||||||
|
{ .available = NULL },
|
||||||
|
.speed_changed = NULL,
|
||||||
|
.force_redraw = NULL,
|
||||||
|
.config = NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
const device_t headland_ht21c_d_device = {
|
||||||
|
.name = "Headland HT21 Rev. C/D",
|
||||||
|
.internal_name = "headland_ht21cd",
|
||||||
|
.flags = 0,
|
||||||
|
.local = HEADLAND_HT21_C_D,
|
||||||
|
.init = headland_init,
|
||||||
|
.close = headland_close,
|
||||||
|
.reset = NULL,
|
||||||
|
{ .available = NULL },
|
||||||
|
.speed_changed = NULL,
|
||||||
|
.force_redraw = NULL,
|
||||||
|
.config = NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
const device_t headland_ht21e_device = {
|
||||||
|
.name = "Headland HT21 Rev. E",
|
||||||
|
.internal_name = "headland_ht21",
|
||||||
|
.flags = 0,
|
||||||
|
.local = HEADLAND_HT21_E,
|
||||||
.init = headland_init,
|
.init = headland_init,
|
||||||
.close = headland_close,
|
.close = headland_close,
|
||||||
.reset = NULL,
|
.reset = NULL,
|
||||||
|
@@ -55,9 +55,12 @@ extern const device_t gc100a_device;
|
|||||||
|
|
||||||
/* Headland */
|
/* Headland */
|
||||||
extern const device_t headland_gc10x_device;
|
extern const device_t headland_gc10x_device;
|
||||||
|
extern const device_t headland_gc113_device;
|
||||||
extern const device_t headland_ht18a_device;
|
extern const device_t headland_ht18a_device;
|
||||||
extern const device_t headland_ht18b_device;
|
extern const device_t headland_ht18b_device;
|
||||||
extern const device_t headland_ht18c_device;
|
extern const device_t headland_ht18c_device;
|
||||||
|
extern const device_t headland_ht21c_d_device;
|
||||||
|
extern const device_t headland_ht21e_device;
|
||||||
|
|
||||||
/* IMS */
|
/* IMS */
|
||||||
extern const device_t ims8848_device;
|
extern const device_t ims8848_device;
|
||||||
|
4
src/io.c
4
src/io.c
@@ -323,8 +323,8 @@ inb(uint16_t port)
|
|||||||
cycles -= io_delay;
|
cycles -= io_delay;
|
||||||
|
|
||||||
/* TriGem 486-BIOS MHz output. */
|
/* TriGem 486-BIOS MHz output. */
|
||||||
if (port == 0x1ed)
|
/* if (port == 0x1ed)
|
||||||
ret = 0xfe;
|
ret = 0xfe; */
|
||||||
|
|
||||||
io_log("[%04X:%08X] (%i, %i, %04i) in b(%04X) = %02X\n", CS, cpu_state.pc, in_smm, found, qfound, port, ret);
|
io_log("[%04X:%08X] (%i, %i, %04i) in b(%04X) = %02X\n", CS, cpu_state.pc, in_smm, found, qfound, port, ret);
|
||||||
|
|
||||||
|
@@ -67,15 +67,17 @@ machine_at_mr286_init(const machine_t *model)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
machine_at_headland_common_init(int ht386)
|
machine_at_headland_common_init(int type)
|
||||||
{
|
{
|
||||||
device_add(&keyboard_at_ami_device);
|
device_add(&keyboard_at_ami_device);
|
||||||
|
|
||||||
if (fdc_type == FDC_INTERNAL)
|
if (fdc_type == FDC_INTERNAL)
|
||||||
device_add(&fdc_at_device);
|
device_add(&fdc_at_device);
|
||||||
|
|
||||||
if (ht386)
|
if (type == 2)
|
||||||
device_add(&headland_ht18b_device);
|
device_add(&headland_ht18b_device);
|
||||||
|
else if (type == 1)
|
||||||
|
device_add(&headland_gc113_device);
|
||||||
else
|
else
|
||||||
device_add(&headland_gc10x_device);
|
device_add(&headland_gc10x_device);
|
||||||
}
|
}
|
||||||
@@ -93,7 +95,7 @@ machine_at_tg286m_init(const machine_t *model)
|
|||||||
|
|
||||||
machine_at_common_ide_init(model);
|
machine_at_common_ide_init(model);
|
||||||
|
|
||||||
machine_at_headland_common_init(0);
|
machine_at_headland_common_init(1);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -114,7 +116,7 @@ machine_at_ama932j_init(const machine_t *model)
|
|||||||
if (gfxcard == VID_INTERNAL)
|
if (gfxcard == VID_INTERNAL)
|
||||||
device_add(&oti067_ama932j_device);
|
device_add(&oti067_ama932j_device);
|
||||||
|
|
||||||
machine_at_headland_common_init(1);
|
machine_at_headland_common_init(2);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user