From 61828a89fc2ef1472c28c5537541a7dc02f6caa9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 4 Aug 2022 04:39:37 +0200 Subject: [PATCH] Added the GC113 used by the real TriGem 286M, and fixed that EMS driver on GC113 onwards, closes #2567. --- src/chipset/headland.c | 93 +++++++++++++++++++++++++++++++----- src/include/86box/chipset.h | 3 ++ src/io.c | 4 +- src/machine/m_at_286_386sx.c | 10 ++-- 4 files changed, 93 insertions(+), 17 deletions(-) diff --git a/src/chipset/headland.c b/src/chipset/headland.c index ed2e318fc..91f1658d8 100644 --- a/src/chipset/headland.c +++ b/src/chipset/headland.c @@ -38,6 +38,23 @@ #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 { uint8_t valid, enabled; uint16_t mr; @@ -49,6 +66,7 @@ typedef struct { typedef struct headland_t { uint8_t revision; + uint8_t has_cri, has_sleep; uint8_t cri; uint8_t cr[7]; @@ -330,7 +348,7 @@ hl_write(uint16_t addr, uint8_t val, void *priv) break; case 0x01ed: - if (dev->revision > 0) + if (dev->has_cri) dev->cri = val; break; @@ -339,7 +357,7 @@ hl_write(uint16_t addr, uint8_t val, void *priv) break; case 0x01ef: - switch(dev->cri) { + switch(dev->cri & 0x07) { case 0: dev->cr[0] = (val & 0x1f) | mem_conf_cr0[(mem_size > 640 ? mem_size : mem_size - 128) >> 9]; memmap_state_update(dev); @@ -352,11 +370,18 @@ hl_write(uint16_t addr, uint8_t val, void *priv) case 2: case 3: - case 5: dev->cr[dev->cri] = val; memmap_state_update(dev); 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: dev->cr[4] = (dev->cr[4] & 0xf0) | (val & 0x0f); memmap_state_update(dev); @@ -421,7 +446,7 @@ hl_read(uint16_t addr, void *priv) break; case 0x01ed: - if (dev->revision > 0) + if (dev->has_cri) ret = dev->cri; break; @@ -430,7 +455,7 @@ hl_read(uint16_t addr, void *priv) break; case 0x01ef: - switch(dev->cri) { + switch(dev->cri & 0x07) { case 0: ret = (dev->cr[0] & 0x1f) | mem_conf_cr0[(mem_size > 640 ? mem_size : mem_size - 128) >> 9]; break; @@ -593,11 +618,14 @@ headland_init(const device_t *info) dev = (headland_t *) malloc(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) ht386 = 1; + dev->cr[0] = 0x04; dev->cr[4] = dev->revision << 4; if (ht386) @@ -627,7 +655,7 @@ headland_init(const device_t *info) ram, MEM_MAPPING_INTERNAL, &dev->null_mr); 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_write_b, mem_write_w, mem_write_l, ram + 0xa0000, MEM_MAPPING_INTERNAL, &dev->null_mr); @@ -684,11 +712,26 @@ headland_init(const device_t *info) return(dev); } + const device_t headland_gc10x_device = { .name = "Headland GC101/102/103", .internal_name = "headland_gc10x", .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, .close = headland_close, .reset = NULL, @@ -702,7 +745,7 @@ const device_t headland_ht18a_device = { .name = "Headland HT18 Rev. A", .internal_name = "headland_ht18a", .flags = 0, - .local = 1, + .local = HEADLAND_HT18_A, .init = headland_init, .close = headland_close, .reset = NULL, @@ -716,7 +759,7 @@ const device_t headland_ht18b_device = { .name = "Headland HT18 Rev. B", .internal_name = "headland_ht18b", .flags = 0, - .local = 2, + .local = HEADLAND_HT18_B, .init = headland_init, .close = headland_close, .reset = NULL, @@ -730,7 +773,35 @@ const device_t headland_ht18c_device = { .name = "Headland HT18 Rev. C", .internal_name = "headland_ht18c", .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, .close = headland_close, .reset = NULL, diff --git a/src/include/86box/chipset.h b/src/include/86box/chipset.h index eddb37bff..cc36578fa 100644 --- a/src/include/86box/chipset.h +++ b/src/include/86box/chipset.h @@ -55,9 +55,12 @@ extern const device_t gc100a_device; /* Headland */ 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_ht18b_device; extern const device_t headland_ht18c_device; +extern const device_t headland_ht21c_d_device; +extern const device_t headland_ht21e_device; /* IMS */ extern const device_t ims8848_device; diff --git a/src/io.c b/src/io.c index 268305e1a..08e61f7ba 100644 --- a/src/io.c +++ b/src/io.c @@ -323,8 +323,8 @@ inb(uint16_t port) cycles -= io_delay; /* TriGem 486-BIOS MHz output. */ - if (port == 0x1ed) - ret = 0xfe; + /* if (port == 0x1ed) + ret = 0xfe; */ io_log("[%04X:%08X] (%i, %i, %04i) in b(%04X) = %02X\n", CS, cpu_state.pc, in_smm, found, qfound, port, ret); diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index fb4186c4e..e30272063 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -67,15 +67,17 @@ machine_at_mr286_init(const machine_t *model) } static void -machine_at_headland_common_init(int ht386) +machine_at_headland_common_init(int type) { device_add(&keyboard_at_ami_device); if (fdc_type == FDC_INTERNAL) device_add(&fdc_at_device); - if (ht386) + if (type == 2) device_add(&headland_ht18b_device); + else if (type == 1) + device_add(&headland_gc113_device); else 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_headland_common_init(0); + machine_at_headland_common_init(1); return ret; } @@ -114,7 +116,7 @@ machine_at_ama932j_init(const machine_t *model) if (gfxcard == VID_INTERNAL) device_add(&oti067_ama932j_device); - machine_at_headland_common_init(1); + machine_at_headland_common_init(2); return ret; }