From dfb8c9255768925ee0d3379bb07bb86391d1d0d2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 28 Apr 2021 06:05:30 +0200 Subject: [PATCH] More Video 7/Headland fixes. --- src/video/vid_ht216.c | 173 +++++++++++++++++++++++++++++++----------- 1 file changed, 128 insertions(+), 45 deletions(-) diff --git a/src/video/vid_ht216.c b/src/video/vid_ht216.c index 03300ec03..632b18ec6 100644 --- a/src/video/vid_ht216.c +++ b/src/video/vid_ht216.c @@ -128,6 +128,37 @@ ht216_log(const char *fmt, ...) #endif +static void +ht216_recalc_bank_regs(ht216_t *ht216, int mode) +{ + if (mode) { + ht216->read_bank_reg[0] = ht216->ht_regs[0xe8]; + ht216->write_bank_reg[0] = ht216->ht_regs[0xe8]; + ht216->read_bank_reg[1] = ht216->ht_regs[0xe9]; + ht216->write_bank_reg[1] = ht216->ht_regs[0xe9]; + } else { + ht216->read_bank_reg[0] = ((ht216->ht_regs[0xf6] & 0xc) << 4); + ht216->read_bank_reg[1] = ((ht216->ht_regs[0xf6] & 0xc) << 4); + ht216->write_bank_reg[0] = ((ht216->ht_regs[0xf6] & 0x3) << 6); + ht216->write_bank_reg[1] = ((ht216->ht_regs[0xf6] & 0x3) << 6); + + if ((ht216->ht_regs[0xfc] & 0x20) || (ht216->ht_regs[0xfc] & 0x04)) { + ht216->read_bank_reg[0] |= (ht216->misc & 0x20); + ht216->read_bank_reg[1] |= (ht216->misc & 0x20); + ht216->write_bank_reg[0] |= (ht216->misc & 0x20); + ht216->write_bank_reg[1] |= (ht216->misc & 0x20); + } + + if ((ht216->ht_regs[0xfc] & 0x20) || ((ht216->ht_regs[0xfc] & 0x06) == 0x04)) { + ht216->read_bank_reg[0] |= ((ht216->ht_regs[0xf9] & 1) << 4); + ht216->read_bank_reg[1] |= ((ht216->ht_regs[0xf9] & 1) << 4); + ht216->write_bank_reg[0] |= ((ht216->ht_regs[0xf9] & 1) << 4); + ht216->write_bank_reg[1] |= ((ht216->ht_regs[0xf9] & 1) << 4); + } + } +} + + void ht216_out(uint16_t addr, uint8_t val, void *p) { @@ -146,10 +177,7 @@ ht216_out(uint16_t addr, uint8_t val, void *p) /*Bit 17 of the display memory address, only active on odd/even modes, has no effect on graphics modes.*/ ht216->misc = val; ht216_log("HT216 misc val = %02x\n", val); - ht216->read_bank_reg[0] = ((ht216->ht_regs[0xf6] & 0xc) << 4) | ((ht216->ht_regs[0xf9] & 1) << 4) | (ht216->misc & 0x20); - ht216->read_bank_reg[1] = ((ht216->ht_regs[0xf6] & 0xc) << 4) | ((ht216->ht_regs[0xf9] & 1) << 4) | (ht216->misc & 0x20); - ht216->write_bank_reg[0] = ((ht216->ht_regs[0xf6] & 0x3) << 6) | ((ht216->ht_regs[0xf9] & 1) << 4) | (ht216->misc & 0x20); - ht216->write_bank_reg[1] = ((ht216->ht_regs[0xf6] & 0x3) << 6) | ((ht216->ht_regs[0xf9] & 1) << 4) | (ht216->misc & 0x20); + ht216_recalc_bank_regs(ht216, 0); ht216_remap(ht216); svga->fullchange = changeframecount; svga_recalctimings(svga); @@ -169,6 +197,53 @@ ht216_out(uint16_t addr, uint8_t val, void *p) ht216->ext_reg_enable = 1; else if (val == 0xae) ht216->ext_reg_enable = 0; +#ifdef ENABLE_HT216_LOG + /* Functionality to output to the console a dump of all registers for debugging purposes. */ + } else if (svga->seqaddr == 0x7f) { + ht216_log(" 8 | 0 1 2 3 4 5 6 7 8 9 A B C D E F\n"); + ht216_log("----+-------------------------------------------------\n"); + ht216_log(" 8 | %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", + ht216->ht_regs[0x80], ht216->ht_regs[0x81], ht216->ht_regs[0x82], ht216->ht_regs[0x83], + ht216->ht_regs[0x84], ht216->ht_regs[0x85], ht216->ht_regs[0x86], ht216->ht_regs[0x87], + ht216->ht_regs[0x88], ht216->ht_regs[0x89], ht216->ht_regs[0x8a], ht216->ht_regs[0x8b], + ht216->ht_regs[0x8c], ht216->ht_regs[0x8d], ht216->ht_regs[0x8e], ht216->ht_regs[0x8f]); + ht216_log(" 9 | %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", + ht216->ht_regs[0x90], ht216->ht_regs[0x91], ht216->ht_regs[0x92], ht216->ht_regs[0x93], + ht216->ht_regs[0x94], ht216->ht_regs[0x95], ht216->ht_regs[0x96], ht216->ht_regs[0x97], + ht216->ht_regs[0x98], ht216->ht_regs[0x99], ht216->ht_regs[0x9a], ht216->ht_regs[0x9b], + ht216->ht_regs[0x9c], ht216->ht_regs[0x9d], ht216->ht_regs[0x9e], ht216->ht_regs[0x9f]); + ht216_log(" A | %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", + ht216->ht_regs[0xa0], ht216->ht_regs[0xa1], ht216->ht_regs[0xa2], ht216->ht_regs[0xa3], + ht216->ht_regs[0xa4], ht216->ht_regs[0xa5], ht216->ht_regs[0xa6], ht216->ht_regs[0xa7], + ht216->ht_regs[0xa8], ht216->ht_regs[0xa9], ht216->ht_regs[0xaa], ht216->ht_regs[0xab], + ht216->ht_regs[0xac], ht216->ht_regs[0xad], ht216->ht_regs[0xae], ht216->ht_regs[0xaf]); + ht216_log(" B | %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", + ht216->ht_regs[0xb0], ht216->ht_regs[0xb1], ht216->ht_regs[0xb2], ht216->ht_regs[0xb3], + ht216->ht_regs[0xb4], ht216->ht_regs[0xb5], ht216->ht_regs[0xb6], ht216->ht_regs[0xb7], + ht216->ht_regs[0xb8], ht216->ht_regs[0xb9], ht216->ht_regs[0xba], ht216->ht_regs[0xbb], + ht216->ht_regs[0xbc], ht216->ht_regs[0xbd], ht216->ht_regs[0xbe], ht216->ht_regs[0xbf]); + ht216_log(" C | %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", + ht216->ht_regs[0xc0], ht216->ht_regs[0xc1], ht216->ht_regs[0xc2], ht216->ht_regs[0xc3], + ht216->ht_regs[0xc4], ht216->ht_regs[0xc5], ht216->ht_regs[0xc6], ht216->ht_regs[0xc7], + ht216->ht_regs[0xc8], ht216->ht_regs[0xc9], ht216->ht_regs[0xca], ht216->ht_regs[0xcb], + ht216->ht_regs[0xcc], ht216->ht_regs[0xcd], ht216->ht_regs[0xce], ht216->ht_regs[0xcf]); + ht216_log(" D | %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", + ht216->ht_regs[0xd0], ht216->ht_regs[0xd1], ht216->ht_regs[0xd2], ht216->ht_regs[0xd3], + ht216->ht_regs[0xd4], ht216->ht_regs[0xd5], ht216->ht_regs[0xd6], ht216->ht_regs[0xd7], + ht216->ht_regs[0xd8], ht216->ht_regs[0xd9], ht216->ht_regs[0xda], ht216->ht_regs[0xdb], + ht216->ht_regs[0xdc], ht216->ht_regs[0xdd], ht216->ht_regs[0xde], ht216->ht_regs[0xdf]); + ht216_log(" E | %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", + ht216->ht_regs[0xe0], ht216->ht_regs[0xe1], ht216->ht_regs[0xe2], ht216->ht_regs[0xe3], + ht216->ht_regs[0xe4], ht216->ht_regs[0xe5], ht216->ht_regs[0xe6], ht216->ht_regs[0xe7], + ht216->ht_regs[0xe8], ht216->ht_regs[0xe9], ht216->ht_regs[0xea], ht216->ht_regs[0xeb], + ht216->ht_regs[0xec], ht216->ht_regs[0xed], ht216->ht_regs[0xee], ht216->ht_regs[0xef]); + ht216_log(" F | %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", + ht216->ht_regs[0xf0], ht216->ht_regs[0xf1], ht216->ht_regs[0xf2], ht216->ht_regs[0xf3], + ht216->ht_regs[0xf4], ht216->ht_regs[0xf5], ht216->ht_regs[0xf6], ht216->ht_regs[0xf7], + ht216->ht_regs[0xf8], ht216->ht_regs[0xf9], ht216->ht_regs[0xfa], ht216->ht_regs[0xfb], + ht216->ht_regs[0xfc], ht216->ht_regs[0xfd], ht216->ht_regs[0xfe], ht216->ht_regs[0xff]); + return; +#endif } else if (svga->seqaddr >= 0x80 && ht216->ext_reg_enable) { old = ht216->ht_regs[svga->seqaddr & 0xff]; ht216->ht_regs[svga->seqaddr & 0xff] = val; @@ -224,22 +299,13 @@ ht216_out(uint16_t addr, uint8_t val, void *p) break; case 0xc9: case 0xcf: + ht216_remap(ht216); + break; + case 0xe0: - ht216_remap(ht216); - break; /*Bank registers*/ - case 0xe8: - ht216->read_bank_reg[0] = ht216->ht_regs[0xe8]; - ht216->write_bank_reg[0] = ht216->ht_regs[0xe8]; - ht216->read_bank_reg[1] = ht216->ht_regs[0xe9]; - ht216->write_bank_reg[1] = ht216->ht_regs[0xe9]; - ht216_remap(ht216); - break; - case 0xe9: - ht216->read_bank_reg[0] = ht216->ht_regs[0xe8]; - ht216->write_bank_reg[0] = ht216->ht_regs[0xe8]; - ht216->read_bank_reg[1] = ht216->ht_regs[0xe9]; - ht216->write_bank_reg[1] = ht216->ht_regs[0xe9]; + case 0xe8: case 0xe9: + ht216_recalc_bank_regs(ht216, 1); ht216_remap(ht216); break; @@ -274,10 +340,7 @@ ht216_out(uint16_t addr, uint8_t val, void *p) case 0xf6: /*Bits 18 and 19 of the display memory address*/ ht216_log("HT216 reg 0xf6 write = %02x, vram mask = %08x, cr17 = %02x\n", val & 0x40, svga->vram_display_mask, svga->crtc[0x17]); - ht216->read_bank_reg[0] = ((ht216->ht_regs[0xf6] & 0xc) << 4) | ((ht216->ht_regs[0xf9] & 1) << 4) | (ht216->misc & 0x20); - ht216->read_bank_reg[1] = ((ht216->ht_regs[0xf6] & 0xc) << 4) | ((ht216->ht_regs[0xf9] & 1) << 4) | (ht216->misc & 0x20); - ht216->write_bank_reg[0] = ((ht216->ht_regs[0xf6] & 0x3) << 6) | ((ht216->ht_regs[0xf9] & 1) << 4) | (ht216->misc & 0x20); - ht216->write_bank_reg[1] = ((ht216->ht_regs[0xf6] & 0x3) << 6) | ((ht216->ht_regs[0xf9] & 1) << 4) | (ht216->misc & 0x20); + ht216_recalc_bank_regs(ht216, 0); ht216_remap(ht216); svga->fullchange = changeframecount; svga_recalctimings(svga); @@ -286,14 +349,13 @@ ht216_out(uint16_t addr, uint8_t val, void *p) case 0xf9: /*Bit 16 of the display memory address, only active when in chain4 mode and 256 color mode.*/ ht216_log("HT216 reg 0xf9 write = %02x\n", val & HT_REG_F9_XPSEL); - ht216->read_bank_reg[0] = ((ht216->ht_regs[0xf6] & 0xc) << 4) | ((ht216->ht_regs[0xf9] & 1) << 4) | (ht216->misc & 0x20); - ht216->read_bank_reg[1] = ((ht216->ht_regs[0xf6] & 0xc) << 4) | ((ht216->ht_regs[0xf9] & 1) << 4) | (ht216->misc & 0x20); - ht216->write_bank_reg[0] = ((ht216->ht_regs[0xf6] & 0x3) << 6) | ((ht216->ht_regs[0xf9] & 1) << 4) | (ht216->misc & 0x20); - ht216->write_bank_reg[1] = ((ht216->ht_regs[0xf6] & 0x3) << 6) | ((ht216->ht_regs[0xf9] & 1) << 4) | (ht216->misc & 0x20); + ht216_recalc_bank_regs(ht216, 0); ht216_remap(ht216); break; case 0xfc: + ht216_recalc_bank_regs(ht216, 0); + ht216_remap(ht216); svga->fullchange = changeframecount; svga_recalctimings(svga); break; @@ -392,35 +454,48 @@ ht216_in(uint16_t addr, void *p) return ht216->ext_reg_enable; } else if (svga->seqaddr >= 0x80) { if (ht216->ext_reg_enable) { + ret = ht216->ht_regs[svga->seqaddr & 0xff]; + switch (svga->seqaddr & 0xff) { case 0x83: if (svga->attrff) - return svga->attraddr | 0x80; - return svga->attraddr; + ret = svga->attraddr | 0x80; + else + ret = svga->attraddr; + break; - case 0x8e: return ht216->id & 0xff; - case 0x8f: return (ht216->id >> 8) & 0xff; + case 0x8e: + ret = ht216->id & 0xff; + break; + case 0x8f: + ret = (ht216->id >> 8) & 0xff; + break; case 0xa0: - return svga->latch.b[0]; + ret = svga->latch.b[0]; + break; case 0xa1: - return svga->latch.b[1]; + ret = svga->latch.b[1]; + break; case 0xa2: - return svga->latch.b[2]; + ret = svga->latch.b[2]; + break; case 0xa3: - return svga->latch.b[3]; + ret = svga->latch.b[3]; + break; case 0xf0: ret = ht216->fg_latch[ht216->fg_plane_sel]; ht216->fg_plane_sel = 0; - return ret; + break; case 0xf2: ret = svga->latch.b[ht216->bg_plane_sel]; ht216->bg_plane_sel = 0; - return ret; + break; } - return ht216->ht_regs[svga->seqaddr & 0xff]; + + return ret; } else return 0xff; } @@ -577,8 +652,8 @@ ht216_recalctimings(svga_t *svga) case 10: svga->clock = (cpuclock * (double)(1ull << 32)) / 80000000.0; break; } - if ((ht216->ht_regs[0xfc] & 8) && (ht216->id == 0x7152)) - svga->clock *= 2; + if ((ht216->ht_regs[0xfc] & 8) && (ht216->id == 0x7152)) + svga->clock *= 2; svga->ma_latch |= ((ht216->ht_regs[0xf6] & 0x30) << 12); @@ -624,6 +699,7 @@ ht216_recalctimings(svga_t *svga) svga->render = svga_render_15bpp_highres; } + svga->ma_latch |= ((ht216->ht_regs[0xf6] & 0x30) << 14); if (svga->crtc[0x17] == 0xeb) /*Looks like that 1024x768 mono mode expects 512K of video memory*/ svga->vram_display_mask = 0x7ffff; @@ -1293,6 +1369,7 @@ ht216_read(uint32_t addr, void *p) return ht216_read_common(ht216, addr); } + static uint8_t ht216_read_linear(uint32_t addr, void *p) { @@ -1307,6 +1384,7 @@ ht216_read_linear(uint32_t addr, void *p) return ht216_read_common(ht216, addr); } + static uint8_t radius_mca_read(int port, void *priv) { @@ -1346,7 +1424,7 @@ void memset(ht216, 0, sizeof(ht216_t)); svga = &ht216->svga; - if ((info->flags & DEVICE_ISA) && info->local == 0x7152) { + if ((info->flags & DEVICE_ISA) && (info->local == 0x7152)) { io_sethandler(0x0102, 0x0001, ht216_in, NULL, NULL, ht216_out, NULL, NULL, ht216); io_sethandler(0x0105, 0x0001, ht216_in, NULL, NULL, ht216_out, NULL, NULL, ht216); } @@ -1414,10 +1492,9 @@ void svga->hwcursor.ysize = 32; ht216->vram_mask = mem_size - 1; svga->decode_mask = mem_size - 1; - - if (has_rom == 4) { - svga->ramdac = device_add(&sc11483_ramdac_device); - } + + if (has_rom == 4) + svga->ramdac = device_add(&sc11483_ramdac_device); if ((info->flags & DEVICE_VLB) || (info->flags & DEVICE_MCA)) { mem_mapping_set_handler(&svga->mapping, ht216_read, NULL, NULL, ht216_write, ht216_writew, ht216_writel); @@ -1436,14 +1513,20 @@ void ht216->isabus = (info->flags & DEVICE_ISA); if (ht216->id == 0x7861) - ht216->ht_regs[0xb4] = 0x08; /*32-bit DRAM bus*/ + ht216->ht_regs[0xb4] = 0x08; /*32-bit DRAM bus*/ + /* Initialize the cursor pointer towards the end of its segment, needed for ht256sf.drv to work correctly + when Windows 3.1 is started after boot. */ + ht216->ht_regs[0x94] = 0xff; + + svga->adv_flags = 0; if (info->flags & DEVICE_MCA) { ht216->pos_regs[0] = 0xb7; ht216->pos_regs[1] = 0x80; mca_add(radius_mca_read, radius_mca_write, radius_mca_feedb, NULL, ht216); } + return ht216; }