From 2b0a494eded5f493240c7cdccc00709dcabfc97f Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 31 Jan 2024 13:24:51 +0600 Subject: [PATCH] Report linear mapping properly --- src/video/vid_c&t_69000.c | 57 ++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/src/video/vid_c&t_69000.c b/src/video/vid_c&t_69000.c index 5e23c07104..9ce7f89b58 100644 --- a/src/video/vid_c&t_69000.c +++ b/src/video/vid_c&t_69000.c @@ -707,46 +707,65 @@ uint8_t chips_69000_read_ext_reg(chips_69000_t* chips) { uint8_t index = chips->ext_index; + uint8_t val = chips->ext_regs[index]; switch (index) { case 0x00: - return 0x2C; + val = 0x2C; + break; case 0x01: - return 0x10; + val = 0x10; + break; case 0x02: - return 0xC0; + val = 0xC0; + break; case 0x03: - return 0x00; + val = 0x00; + break; case 0x04: - return 0x62; + val = 0x62; + break; case 0x05: + val = 0x00; + break; case 0x06: - return 0x00; + val = chips->linear_mapping.base >> 24; + break; case 0x08: - return 0x02; + val = 0x02; + break; case 0x0A: - return chips->ext_regs[index] & 0x37; + val = chips->ext_regs[index] & 0x37; + break; case 0x63: { - uint8_t val = chips->ext_regs[index]; + val = chips->ext_regs[index]; if (!(chips->ext_regs[0x62] & 0x8)) val = (val & ~8) | (i2c_gpio_get_scl(chips->i2c_ddc) << 3); if (!(chips->ext_regs[0x62] & 0x4)) val = (val & ~4) | (i2c_gpio_get_sda(chips->i2c_ddc) << 2); - return val; + break; } case 0x70: - return 0x3; + val = 0x3; + break; case 0x71: - return 0x0; + val = 0x0; + break; } - return chips->ext_regs[index]; + //if (chips->ext_index != 0x4E && chips->ext_index != 0x4F + // && (chips->ext_index < 0xE0 || chips->ext_index > 0xEB)) + // pclog("C&T: Read ext reg 0x%02X, ret = 0x%02X\n", index, val); + return val; } void chips_69000_write_ext_reg(chips_69000_t* chips, uint8_t val) { + //if (chips->ext_index != 0x4E && chips->ext_index != 0x4F + //&& (chips->ext_index < 0xE0 || chips->ext_index > 0xEB)) + // pclog("C&T: Write ext reg 0x%02X, ret = 0x%02X\n", chips->ext_index, val); switch (chips->ext_index) { case 0xA: chips->ext_regs[chips->ext_index] = val & 0x37; @@ -809,6 +828,8 @@ chips_69000_write_ext_reg(chips_69000_t* chips, uint8_t val) chips->ext_regs[chips->ext_index] = val & 0x1f; svga_recalctimings(&chips->svga); break; + case 0xD2: + break; default: chips->ext_regs[chips->ext_index] = val; break; @@ -1002,11 +1023,13 @@ chips_69000_pci_read(int func, int addr, void *p) { switch (addr) { case 0x00: + return 0x2C; case 0x01: - return (0x102C >> ((addr & 1) * 8)) & 0xFF; + return 0x10; case 0x02: + return 0xC0; case 0x03: - return (0x00C0 >> ((addr & 1) * 8)) & 0xFF; + return 0x00; case 0x04: return chips->pci_conf_status; case 0x07: @@ -1074,6 +1097,10 @@ chips_69000_pci_write(int func, int addr, uint8_t val, void *p) } case 0x13: { + if (!(chips->pci_conf_status & PCI_COMMAND_MEM)) { + chips->linear_mapping.base = val << 24; + break; + } mem_mapping_set_addr(&chips->linear_mapping, val << 24, (1 << 24)); break; }