Implement additional pseudo-halt addresses

This commit is contained in:
2024-10-23 20:35:40 -05:00
parent 226da7a5b3
commit 0c914fce1a
4 changed files with 134 additions and 36 deletions
+35 -23
View File
@@ -420,7 +420,7 @@ static void vipTransferColumn(VB *sim, int32_t eye) {
[sim->vip.dp.buffer][eye][sim->vip.dp.column];
/* Output is disabled */
if ((sim->vip.dp.disp & sim->vip.dp.synce) == 0) {
if (!sim->vip.dp.enabled) {
for (y = 0; y < 224; y += 16)
for (z = 0; z < 16; z++, dest += 384)
*dest = 0;
@@ -465,10 +465,11 @@ static int vipEmulateDisplay(VB *sim, uint32_t clocks) {
switch (sim->vip.dp.step) {
case 0: /* 0ms - FCLK rising edge */
sim->vip.dp.clocks = vipClocksMs(3);
sim->vip.dp.fclk = 1;
sim->vip.dp.step = 1;
sim->vip.dp.until = vipClocksMs(8);
sim->vip.dp.clocks = vipClocksMs(3);
sim->vip.dp.enabled = sim->vip.dp.disp & sim->vip.dp.synce;
sim->vip.dp.fclk = 1;
sim->vip.dp.step = 1;
sim->vip.dp.until = vipClocksMs(8);
vipThrow(sim, 0x0010); /* FRAMESTART */
/* Game frame */
@@ -479,6 +480,7 @@ static int vipEmulateDisplay(VB *sim, uint32_t clocks) {
/* Initiate drawing procedure */
if (sim->vip.xp.step == 0) {
sim->vip.dp.buffer ^= 1;
sim->vip.xp.enabled = 1;
sim->vip.xp.overtime = 0;
sim->vip.xp.step = 1;
vipThrow(sim, 0x0008); /* GAMESTART */
@@ -498,9 +500,11 @@ static int vipEmulateDisplay(VB *sim, uint32_t clocks) {
/* 0ms-3ms - Idle */
case 1: /* 3ms - L*BSY rising edge */
if (sim->vip.dp.buffer == 0)
sim->vip.dp.l0bsy = 1;
else sim->vip.dp.l1bsy = 1;
if (sim->vip.dp.enabled) {
if (sim->vip.dp.buffer == 0)
sim->vip.dp.l0bsy = 1;
else sim->vip.dp.l1bsy = 1;
}
sim->vip.dp.column = 0;
sim->vip.dp.cta = 0x3DC00 | (uint32_t)sim->vip.cta.cta_l<<1;
sim->vip.dp.step = 2;
@@ -521,13 +525,15 @@ static int vipEmulateDisplay(VB *sim, uint32_t clocks) {
break;
case 3: /* 8ms - L*BSY falling edge */
if (sim->vip.dp.buffer == 0)
sim->vip.dp.l0bsy = 0;
else sim->vip.dp.l1bsy = 0;
if (sim->vip.dp.enabled) {
if (sim->vip.dp.buffer == 0)
sim->vip.dp.l0bsy = 0;
else sim->vip.dp.l1bsy = 0;
vipThrow(sim, 0x0002); /* LFBEND */
}
sim->vip.dp.clocks = vipClocksMs(2);
sim->vip.dp.step = 4;
sim->vip.dp.until = vipClocksMs(10);
vipThrow(sim, 0x0002); /* LFBEND */
break;
/* 8ms-10ms - Idle */
@@ -541,9 +547,11 @@ static int vipEmulateDisplay(VB *sim, uint32_t clocks) {
/* 10ms-13ms - Idle */
case 5: /* 13ms - R*BSY rising edge */
if (sim->vip.dp.buffer == 0)
sim->vip.dp.r0bsy = 1;
else sim->vip.dp.r1bsy = 1;
if (sim->vip.dp.enabled) {
if (sim->vip.dp.buffer == 0)
sim->vip.dp.r0bsy = 1;
else sim->vip.dp.r1bsy = 1;
}
sim->vip.dp.column = 0;
sim->vip.dp.cta = 0x3DE00 | (uint32_t)sim->vip.cta.cta_r<<1;
sim->vip.dp.step = 6;
@@ -563,13 +571,16 @@ static int vipEmulateDisplay(VB *sim, uint32_t clocks) {
break;
case 7: /* 18ms - R*BSY falling edge */
if (sim->vip.dp.buffer == 0)
sim->vip.dp.r0bsy = 0;
else sim->vip.dp.r1bsy = 0;
sim->vip.dp.clocks = vipClocksMs(2);
sim->vip.dp.step = 0;
sim->vip.dp.until = vipClocksMs(2);
vipThrow(sim, 0x0004); /* RFBEND */
if (sim->vip.dp.enabled) {
if (sim->vip.dp.buffer == 0)
sim->vip.dp.r0bsy = 0;
else sim->vip.dp.r1bsy = 0;
vipThrow(sim, 0x0004); /* RFBEND */
}
sim->vip.dp.clocks = vipClocksMs(2);
sim->vip.dp.enabled = 0;
sim->vip.dp.step = 0;
sim->vip.dp.until = vipClocksMs(2);
if (vipOnFrame(sim))
return 1;
break;
@@ -1009,7 +1020,8 @@ static void vipEmulateDrawing(VB *sim, uint32_t clocks) {
break;
case 4: /* Drawing complete */
sim->vip.xp.step = 0;
sim->vip.xp.enabled = 0;
sim->vip.xp.step = 0;
if (sim->vip.dp.buffer == 0)
sim->vip.xp.f1bsy = 0;
else sim->vip.xp.f0bsy = 0;