Skip to content

Commit 4a087b8

Browse files
committed
Fix RTL BitBlt on 16+ bpp
1 parent a0078e6 commit 4a087b8

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

src/video/vid_c&t_69000.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,8 @@ chips_69000_setup_bitblt(chips_69000_t* chips)
11281128
case 1:
11291129
chips->bitblt_running.x_dir = -1;
11301130
chips->bitblt_running.y_dir = 1;
1131+
chips->bitblt_running.bitblt.source_addr -= (chips->bitblt_running.bytes_per_pixel - 1);
1132+
chips->bitblt_running.bitblt.destination_addr -= (chips->bitblt_running.bytes_per_pixel - 1);
11311133
break;
11321134
case 2:
11331135
chips->bitblt_running.x_dir = 1;
@@ -1136,6 +1138,8 @@ chips_69000_setup_bitblt(chips_69000_t* chips)
11361138
case 3:
11371139
chips->bitblt_running.x_dir = -1;
11381140
chips->bitblt_running.y_dir = -1;
1141+
chips->bitblt_running.bitblt.source_addr -= (chips->bitblt_running.bytes_per_pixel - 1);
1142+
chips->bitblt_running.bitblt.destination_addr -= (chips->bitblt_running.bytes_per_pixel - 1);
11391143
break;
11401144
}
11411145

@@ -1517,18 +1521,26 @@ chips_69000_write_ext_reg(chips_69000_t* chips, uint8_t val)
15171521
case 0xA4:
15181522
chips->ext_regs[chips->ext_index] = val;
15191523
chips->svga.hwcursor.x = val | (chips->ext_regs[0xA5] & 7) << 8;
1524+
if (chips->ext_regs[0xA5] & 0x80)
1525+
chips->svga.hwcursor.x = -chips->svga.hwcursor.x;
15201526
break;
15211527
case 0xA5:
15221528
chips->ext_regs[chips->ext_index] = val;
15231529
chips->svga.hwcursor.x = chips->ext_regs[0xA4] | (val & 7) << 8;
1530+
if (chips->ext_regs[0xA5] & 0x80)
1531+
chips->svga.hwcursor.x = -chips->svga.hwcursor.x;
15241532
break;
15251533
case 0xA6:
15261534
chips->ext_regs[chips->ext_index] = val;
15271535
chips->svga.hwcursor.y = val | (chips->ext_regs[0xA7] & 7) << 8;
1536+
if (chips->ext_regs[0xA7] & 0x80)
1537+
chips->svga.hwcursor.y = -chips->svga.hwcursor.y;
15281538
break;
15291539
case 0xA7:
15301540
chips->ext_regs[chips->ext_index] = val;
15311541
chips->svga.hwcursor.y = chips->ext_regs[0xA6] | (val & 7) << 8;
1542+
if (chips->ext_regs[0xA7] & 0x80)
1543+
chips->svga.hwcursor.y = -chips->svga.hwcursor.y;
15321544
break;
15331545
case 0xC8:
15341546
case 0xC9:
@@ -2213,9 +2225,9 @@ chips_69000_hwcursor_draw(svga_t *svga, int displine)
22132225
case 0b101:
22142226
for (uint8_t x = 0; x < (((chips->ext_regs[0xa0] & 7) == 0b1) ? 32 : 64); x++) {
22152227
if (!(dat[1] & (1ULL << 63)))
2216-
svga->monitor->target_buffer->line[displine][offset + svga->x_add] = (dat[0] & (1ULL << 63)) ? svga_lookup_lut_ram(svga, chips->cursor_pallook[5]) : svga_lookup_lut_ram(svga, chips->cursor_pallook[4]);
2228+
svga->monitor->target_buffer->line[displine & 2047][(offset + svga->x_add) & 2047] = (dat[0] & (1ULL << 63)) ? svga_lookup_lut_ram(svga, chips->cursor_pallook[5]) : svga_lookup_lut_ram(svga, chips->cursor_pallook[4]);
22172229
else if (dat[0] & (1ULL << 63))
2218-
svga->monitor->target_buffer->line[displine][offset + svga->x_add] ^= 0xffffff;
2230+
svga->monitor->target_buffer->line[displine & 2047][(offset + svga->x_add) & 2047] ^= 0xffffff;
22192231

22202232
offset++;
22212233
dat[0] <<= 1;

0 commit comments

Comments
 (0)