Miscellaneous bug fixes
This commit is contained in:
parent
e9f5437c1f
commit
50903c7513
|
@ -89,7 +89,7 @@ static int32_t busReadMisc(VB *sim, uint8_t address, int type) {
|
||||||
/* Unmapped */
|
/* Unmapped */
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case VB_S8 : case VB_U8 : if (address & 3) return 0; break;
|
case VB_S8 : case VB_U8 : if (address & 3) return 0; break;
|
||||||
case VB_S16: case VB_U16: if (address & 1) return 0;
|
case VB_S16: case VB_U16: if (address & 2) return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Access by register */
|
/* Access by register */
|
||||||
|
@ -117,7 +117,7 @@ static void busWriteMisc(VB *sim, uint8_t address, int type, int32_t value) {
|
||||||
/* Unmapped */
|
/* Unmapped */
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case VB_S8 : case VB_U8 : if (address & 3) return; break;
|
case VB_S8 : case VB_U8 : if (address & 3) return; break;
|
||||||
case VB_S16: case VB_U16: if (address & 1) return;
|
case VB_S16: case VB_U16: if (address & 2) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Access by register */
|
/* Access by register */
|
||||||
|
|
|
@ -1831,7 +1831,7 @@ static uint32_t cpuUntil(VB *sim, uint32_t clocks) {
|
||||||
return
|
return
|
||||||
sim->cpu.operation == CPU_HALTING &&
|
sim->cpu.operation == CPU_HALTING &&
|
||||||
!(sim->cpu.psw.id | sim->cpu.psw.ep | sim->cpu.psw.np) &&
|
!(sim->cpu.psw.id | sim->cpu.psw.ep | sim->cpu.psw.np) &&
|
||||||
IRQ_LEVELS[sim->cpu.irq] < sim->cpu.psw.i
|
IRQ_LEVELS[sim->cpu.irq] >= sim->cpu.psw.i
|
||||||
? 0 : clocks;
|
? 0 : clocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ struct VB {
|
||||||
uint8_t soft_ck; /* Controller communication signal */
|
uint8_t soft_ck; /* Controller communication signal */
|
||||||
|
|
||||||
/* Simulation state */
|
/* Simulation state */
|
||||||
uint8_t keys; /* Next input bits */
|
uint16_t keys; /* Next input bits */
|
||||||
int step; /* Software read processing phase */
|
int step; /* Software read processing phase */
|
||||||
} pad;
|
} pad;
|
||||||
|
|
||||||
|
|
24
core/vip.c
24
core/vip.c
|
@ -606,7 +606,7 @@ static void vipDrawObjects(VB *sim, int group) {
|
||||||
start = group == 0 ? 0 : (sim->vip.spt[group - 1] + 1) & 1023;
|
start = group == 0 ? 0 : (sim->vip.spt[group - 1] + 1) & 1023;
|
||||||
stop = sim->vip.spt[group];
|
stop = sim->vip.spt[group];
|
||||||
top = (int32_t) sim->vip.xp.sbcount << 3;
|
top = (int32_t) sim->vip.xp.sbcount << 3;
|
||||||
for (o = stop;; o = (o - 1) & 1023) {
|
for (o = stop; o != -1; o = o == start ? -1 : (o - 1) & 1023) {
|
||||||
obj = &sim->vip.ram[0x3E000 | o << 3];
|
obj = &sim->vip.ram[0x3E000 | o << 3];
|
||||||
|
|
||||||
/* Validate object is enabled */
|
/* Validate object is enabled */
|
||||||
|
@ -655,15 +655,12 @@ static void vipDrawObjects(VB *sim, int group) {
|
||||||
pixel = src[sy << 1 | sx >> 2] >> ((sx & 3) << 1) & 3;
|
pixel = src[sy << 1 | sx >> 2] >> ((sx & 3) << 1) & 3;
|
||||||
if (pixel != 0)
|
if (pixel != 0)
|
||||||
dest[y] = plt[pixel]; /* TODO: Research clocks */
|
dest[y] = plt[pixel]; /* TODO: Research clocks */
|
||||||
} /* x */
|
|
||||||
|
|
||||||
} /* y */
|
} /* y */
|
||||||
|
|
||||||
|
} /* x */
|
||||||
|
|
||||||
} /* i */
|
} /* i */
|
||||||
|
|
||||||
/* All objects have been drawn */
|
|
||||||
if (o == start)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -792,13 +789,12 @@ static void vipDrawWorld(VB *sim, uint8_t *world, uint16_t attr) {
|
||||||
param += 4;
|
param += 4;
|
||||||
break;
|
break;
|
||||||
case 2: /* Affine */
|
case 2: /* Affine */
|
||||||
dx = (int32_t) (int16_t) vipParam(param | 6) << 7;
|
dx = (int32_t) (int16_t) vipParam(param|6) << 7;
|
||||||
dy = (int32_t) (int16_t) vipParam(param | 8) << 7;
|
dy = (int32_t) (int16_t) vipParam(param|8) << 7;
|
||||||
mp = (int32_t) (int16_t) vipParam(param | 2);
|
mp = (int32_t) (int16_t) vipParam(param|2);
|
||||||
mx = ((int32_t) (int16_t) vipParam(param ) << 13) +
|
mp = left - wx - ((mp < 0) ^ i ? mp : 0);
|
||||||
dx * (left - ((mp < 0) ^ i ? mp : 0));
|
mx = ((int32_t) (int16_t) vipParam(param ) << 13) + dx*mp;
|
||||||
my = ((int32_t) (int16_t) vipParam(param | 4) << 13) +
|
my = ((int32_t) (int16_t) vipParam(param|4) << 13) + dy*mp;
|
||||||
dy * (left - ((mp < 0) ^ i ? mp : 0));
|
|
||||||
param += 16;
|
param += 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -882,7 +878,7 @@ static void vipRender(VB *sim) {
|
||||||
attr = busReadBuffer(world, VB_U16);
|
attr = busReadBuffer(world, VB_U16);
|
||||||
|
|
||||||
/* Non-graphical world */
|
/* Non-graphical world */
|
||||||
if (attr & 0x0020) /* END */
|
if (attr & 0x0040) /* END */
|
||||||
break; /* Control world */
|
break; /* Control world */
|
||||||
if ((attr & 0xC000) == 0) /* LON, RON */
|
if ((attr & 0xC000) == 0) /* LON, RON */
|
||||||
continue; /* Dummy world */
|
continue; /* Dummy world */
|
||||||
|
|
Loading…
Reference in New Issue