CGA and Tandy 1000 HX/SX: Properly implement the light pen strobe. Jungle Hunt's palette changed area still moves, that's a PIT bug, I'm going to look into that again in 5.0 when I go back to porting 808x etc. from MartyPC.

This commit is contained in:
OBattler
2024-09-25 14:13:00 +02:00
parent 32ed6a30d4
commit d6a01a102b
3 changed files with 72 additions and 32 deletions

View File

@@ -84,6 +84,7 @@ typedef struct t1kvid_t {
uint32_t b8000_mask;
uint32_t b8000_limit;
uint8_t planar_ctrl;
uint8_t lp_strobe;
int linepos;
int displine;
@@ -770,6 +771,15 @@ recalc_address_sl(tandy_t *dev)
}
}
static void
vid_update_latch(t1kvid_t *vid)
{
uint32_t lp_latch = vid->displine * vid->crtc[1];
vid->crtc[0x10] = (lp_latch >> 8) & 0x3f;
vid->crtc[0x11] = lp_latch & 0xff;
}
static void
vid_out(uint16_t addr, uint8_t val, void *priv)
{
@@ -816,6 +826,18 @@ vid_out(uint16_t addr, uint8_t val, void *priv)
vid->array_index = val & 0x1f;
break;
case 0x3db:
if (dev->is_sl2 && (vid->lp_strobe == 1))
vid->lp_strobe = 0;
break;
case 0x3dc:
if (dev->is_sl2 && (vid->lp_strobe == 0)) {
vid->lp_strobe = 1;
vid_update_latch(vid);
}
break;
case 0x03de:
if (vid->array_index & 16)
val &= 0xf;
@@ -852,7 +874,7 @@ static uint8_t
vid_in(uint16_t addr, void *priv)
{
const tandy_t *dev = (tandy_t *) priv;
const t1kvid_t *vid = dev->vid;
t1kvid_t *vid = dev->vid;
uint8_t ret = 0xff;
if ((addr >= 0x3d0) && (addr <= 0x3d7))
@@ -864,29 +886,25 @@ vid_in(uint16_t addr, void *priv)
break;
case 0x03d5:
switch (vid->crtcreg) {
default:
ret = vid->crtc[vid->crtcreg];
break;
case 0x10:
if (dev->is_sl2)
ret = vid->crtc[vid->crtcreg];
else
ret = 0x0f;
break;
case 0x11:
if (dev->is_sl2)
ret = vid->crtc[vid->crtcreg];
else
ret = 0x78;
break;
}
ret = vid->crtc[vid->crtcreg];
break;
case 0x03da:
ret = vid->stat;
break;
case 0x3db:
if (dev->is_sl2 && (vid->lp_strobe == 1))
vid->lp_strobe = 0;
break;
case 0x3dc:
if (dev->is_sl2 && (vid->lp_strobe == 0)) {
vid->lp_strobe = 1;
vid_update_latch(vid);
}
break;
default:
break;
}