From 4ad78598eab3ba74ad3a357f139e4e0cc7200abe Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 25 Aug 2021 13:58:01 +0200 Subject: [PATCH] Fixed IBM RGB28 RAMDAC hardware cursor position calculation. --- src/video/vid_ibm_rgb528_ramdac.c | 49 ++++++++++++++++++------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/video/vid_ibm_rgb528_ramdac.c b/src/video/vid_ibm_rgb528_ramdac.c index 555e08231..7dde9a87e 100644 --- a/src/video/vid_ibm_rgb528_ramdac.c +++ b/src/video/vid_ibm_rgb528_ramdac.c @@ -60,7 +60,7 @@ typedef struct uint8_t cursor64_data[1024]; uint8_t palettes[3][256]; ibm_rgb528_pixel32_t extra_pal[4]; - int hwc_y, hwc_x; + int16_t hwc_y, hwc_x; uint16_t index, smlc_part; uint8_t cmd_r0; uint8_t cmd_r1; @@ -68,7 +68,8 @@ typedef struct uint8_t cmd_r3; uint8_t cmd_r4; uint8_t status, indx_cntl; - uint8_t cursor_array; + uint8_t cursor_array, + cursor_hotspot_x, cursor_hotspot_y; } ibm_rgb528_ramdac_t; @@ -641,7 +642,8 @@ ibm_rgb528_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga case 0x031: if (!updt_cntl) break; - svga->dac_hwcursor.x = (svga->dac_hwcursor.x & 0xff00) | val; + ramdac->hwc_x = (ramdac->hwc_x & 0xff00) | val; + svga->dac_hwcursor.x = ((int) ramdac->hwc_x) - ramdac->cursor_hotspot_x; break; case 0x032: /* Sign-extend the sign bit (7) to the remaining bits (6-4). */ @@ -651,12 +653,14 @@ ibm_rgb528_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga ramdac->indexed_data[ramdac->index] = val; if (!updt_cntl) break; - svga->dac_hwcursor.x = (svga->dac_hwcursor.x & 0x00ff) | (val << 8); + ramdac->hwc_x = (ramdac->hwc_x & 0x00ff) | (val << 8); + svga->dac_hwcursor.x = ((int) ramdac->hwc_x) - ramdac->cursor_hotspot_x; break; case 0x033: if (!updt_cntl) break; - svga->dac_hwcursor.y = (svga->dac_hwcursor.y & 0xff00) | val; + ramdac->hwc_y = (ramdac->hwc_y & 0xff00) | val; + svga->dac_hwcursor.y = ((int) ramdac->hwc_y) - ramdac->cursor_hotspot_y; break; case 0x034: /* Sign-extend the sign bit (7) to the remaining bits (6-4). */ @@ -664,26 +668,31 @@ ibm_rgb528_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *p, svga_t *svga if (val & 0x80) val |= 0x70; ramdac->indexed_data[ramdac->index] = val; - if (updt_cntl) - svga->dac_hwcursor.y = (svga->dac_hwcursor.y & 0x00ff) | (val << 8); - else { - svga->dac_hwcursor.x = ramdac->indexed_data[0x031]; - svga->dac_hwcursor.x |= (ramdac->indexed_data[0x032] << 8); - svga->dac_hwcursor.y = ramdac->indexed_data[0x033]; - svga->dac_hwcursor.y |= (val << 8); + if (updt_cntl) { + ramdac->hwc_y = (ramdac->hwc_y & 0x00ff) | (val << 8); + svga->dac_hwcursor.y = ((int) ramdac->hwc_y) - ramdac->cursor_hotspot_y; + } else { + ramdac->hwc_x = ramdac->indexed_data[0x031]; + ramdac->hwc_x |= (ramdac->indexed_data[0x032] << 8); + ramdac->hwc_y = ramdac->indexed_data[0x033]; + ramdac->hwc_y |= (val << 8); + svga->dac_hwcursor.x = ((int) ramdac->hwc_x) - ramdac->cursor_hotspot_x; + svga->dac_hwcursor.y = ((int) ramdac->hwc_y) - ramdac->cursor_hotspot_y; } break; case 0x035: if (svga->dac_hwcursor.xsize == 64) - svga->dac_hwcursor.xoff = (val & 0x1f); + ramdac->cursor_hotspot_x = (val & 0x3f); else - svga->dac_hwcursor.xoff = (val & 0x3f); + ramdac->cursor_hotspot_x = (val & 0x1f); + svga->dac_hwcursor.x = ((int) ramdac->hwc_x) - ramdac->cursor_hotspot_x; break; case 0x036: if (svga->dac_hwcursor.xsize == 64) - svga->dac_hwcursor.yoff = (val & 0x1f); + ramdac->cursor_hotspot_y = (val & 0x3f); else - svga->dac_hwcursor.yoff = (val & 0x3f); + ramdac->cursor_hotspot_y = (val & 0x1f); + svga->dac_hwcursor.y = ((int) ramdac->hwc_y) - ramdac->cursor_hotspot_y; break; case 0x040: case 0x043: case 0x046: ramdac->extra_pal[(ramdac->index - 0x40) / 3].r = val; @@ -762,19 +771,19 @@ ibm_rgb528_ramdac_in(uint16_t addr, int rs2, void *p, svga_t *svga) break; case 0x0031: if (loc_read) - temp = svga->dac_hwcursor.x & 0xff; + temp = ramdac->hwc_x & 0xff; break; case 0x0032: if (loc_read) - temp = svga->dac_hwcursor.x >> 8; + temp = ramdac->hwc_x >> 8; break; case 0x0033: if (loc_read) - temp = svga->dac_hwcursor.y & 0xff; + temp = ramdac->hwc_y & 0xff; break; case 0x0034: if (loc_read) - temp = svga->dac_hwcursor.y >> 8; + temp = ramdac->hwc_y >> 8; break; default: temp = ramdac->indexed_data[ramdac->index];