Fixed IBM RGB28 RAMDAC hardware cursor position calculation.
This commit is contained in:
@@ -60,7 +60,7 @@ typedef struct
|
|||||||
uint8_t cursor64_data[1024];
|
uint8_t cursor64_data[1024];
|
||||||
uint8_t palettes[3][256];
|
uint8_t palettes[3][256];
|
||||||
ibm_rgb528_pixel32_t extra_pal[4];
|
ibm_rgb528_pixel32_t extra_pal[4];
|
||||||
int hwc_y, hwc_x;
|
int16_t hwc_y, hwc_x;
|
||||||
uint16_t index, smlc_part;
|
uint16_t index, smlc_part;
|
||||||
uint8_t cmd_r0;
|
uint8_t cmd_r0;
|
||||||
uint8_t cmd_r1;
|
uint8_t cmd_r1;
|
||||||
@@ -68,7 +68,8 @@ typedef struct
|
|||||||
uint8_t cmd_r3;
|
uint8_t cmd_r3;
|
||||||
uint8_t cmd_r4;
|
uint8_t cmd_r4;
|
||||||
uint8_t status, indx_cntl;
|
uint8_t status, indx_cntl;
|
||||||
uint8_t cursor_array;
|
uint8_t cursor_array,
|
||||||
|
cursor_hotspot_x, cursor_hotspot_y;
|
||||||
} ibm_rgb528_ramdac_t;
|
} 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:
|
case 0x031:
|
||||||
if (!updt_cntl)
|
if (!updt_cntl)
|
||||||
break;
|
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;
|
break;
|
||||||
case 0x032:
|
case 0x032:
|
||||||
/* Sign-extend the sign bit (7) to the remaining bits (6-4). */
|
/* 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;
|
ramdac->indexed_data[ramdac->index] = val;
|
||||||
if (!updt_cntl)
|
if (!updt_cntl)
|
||||||
break;
|
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;
|
break;
|
||||||
case 0x033:
|
case 0x033:
|
||||||
if (!updt_cntl)
|
if (!updt_cntl)
|
||||||
break;
|
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;
|
break;
|
||||||
case 0x034:
|
case 0x034:
|
||||||
/* Sign-extend the sign bit (7) to the remaining bits (6-4). */
|
/* 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)
|
if (val & 0x80)
|
||||||
val |= 0x70;
|
val |= 0x70;
|
||||||
ramdac->indexed_data[ramdac->index] = val;
|
ramdac->indexed_data[ramdac->index] = val;
|
||||||
if (updt_cntl)
|
if (updt_cntl) {
|
||||||
svga->dac_hwcursor.y = (svga->dac_hwcursor.y & 0x00ff) | (val << 8);
|
ramdac->hwc_y = (ramdac->hwc_y & 0x00ff) | (val << 8);
|
||||||
else {
|
svga->dac_hwcursor.y = ((int) ramdac->hwc_y) - ramdac->cursor_hotspot_y;
|
||||||
svga->dac_hwcursor.x = ramdac->indexed_data[0x031];
|
} else {
|
||||||
svga->dac_hwcursor.x |= (ramdac->indexed_data[0x032] << 8);
|
ramdac->hwc_x = ramdac->indexed_data[0x031];
|
||||||
svga->dac_hwcursor.y = ramdac->indexed_data[0x033];
|
ramdac->hwc_x |= (ramdac->indexed_data[0x032] << 8);
|
||||||
svga->dac_hwcursor.y |= (val << 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;
|
break;
|
||||||
case 0x035:
|
case 0x035:
|
||||||
if (svga->dac_hwcursor.xsize == 64)
|
if (svga->dac_hwcursor.xsize == 64)
|
||||||
svga->dac_hwcursor.xoff = (val & 0x1f);
|
ramdac->cursor_hotspot_x = (val & 0x3f);
|
||||||
else
|
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;
|
break;
|
||||||
case 0x036:
|
case 0x036:
|
||||||
if (svga->dac_hwcursor.xsize == 64)
|
if (svga->dac_hwcursor.xsize == 64)
|
||||||
svga->dac_hwcursor.yoff = (val & 0x1f);
|
ramdac->cursor_hotspot_y = (val & 0x3f);
|
||||||
else
|
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;
|
break;
|
||||||
case 0x040: case 0x043: case 0x046:
|
case 0x040: case 0x043: case 0x046:
|
||||||
ramdac->extra_pal[(ramdac->index - 0x40) / 3].r = val;
|
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;
|
break;
|
||||||
case 0x0031:
|
case 0x0031:
|
||||||
if (loc_read)
|
if (loc_read)
|
||||||
temp = svga->dac_hwcursor.x & 0xff;
|
temp = ramdac->hwc_x & 0xff;
|
||||||
break;
|
break;
|
||||||
case 0x0032:
|
case 0x0032:
|
||||||
if (loc_read)
|
if (loc_read)
|
||||||
temp = svga->dac_hwcursor.x >> 8;
|
temp = ramdac->hwc_x >> 8;
|
||||||
break;
|
break;
|
||||||
case 0x0033:
|
case 0x0033:
|
||||||
if (loc_read)
|
if (loc_read)
|
||||||
temp = svga->dac_hwcursor.y & 0xff;
|
temp = ramdac->hwc_y & 0xff;
|
||||||
break;
|
break;
|
||||||
case 0x0034:
|
case 0x0034:
|
||||||
if (loc_read)
|
if (loc_read)
|
||||||
temp = svga->dac_hwcursor.y >> 8;
|
temp = ramdac->hwc_y >> 8;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
temp = ramdac->indexed_data[ramdac->index];
|
temp = ramdac->indexed_data[ramdac->index];
|
||||||
|
Reference in New Issue
Block a user