Pseudo-halt timing fix
This commit is contained in:
parent
0c914fce1a
commit
bcd80d291b
|
@ -1860,7 +1860,7 @@ static uint32_t cpuUntil(VB *sim, uint32_t clocks) {
|
|||
|
||||
/* Pseudo-halting */
|
||||
if (sim->cpu.operation == CPU_PHALT) {
|
||||
if (sim->cpu.clocks == 0) /* Requires an interrupt */
|
||||
if (sim->cpu.clocks == 0)
|
||||
return clocks;
|
||||
}
|
||||
|
||||
|
|
|
@ -121,6 +121,7 @@ static int phMatches(VB *sim, uint32_t address, int type, int32_t value) {
|
|||
return
|
||||
sim->ph.adtre == sim->cpu.adtre &&
|
||||
sim->ph.chcw == cpuGetSystemRegister(sim, VB_CHCW) &&
|
||||
sim->ph.ecr == cpuGetSystemRegister(sim, VB_ECR) &&
|
||||
sim->ph.eipc == sim->cpu.eipc &&
|
||||
sim->ph.eipsw == sim->cpu.eipsw &&
|
||||
sim->ph.fepc == sim->cpu.fepc &&
|
||||
|
@ -229,6 +230,7 @@ static int phAssess(VB *sim, uint32_t address, int type, int32_t value) {
|
|||
sim->ph.program[x - 1] = sim->cpu.program[x];
|
||||
sim->ph.adtre = sim->cpu.adtre;
|
||||
sim->ph.chcw = cpuGetSystemRegister(sim, VB_CHCW);
|
||||
sim->ph.ecr = cpuGetSystemRegister(sim, VB_ECR);
|
||||
sim->ph.eipc = sim->cpu.eipc;
|
||||
sim->ph.eipsw = sim->cpu.eipsw;
|
||||
sim->ph.fepc = sim->cpu.fepc;
|
||||
|
|
14
core/vb.c
14
core/vb.c
|
@ -322,6 +322,7 @@ struct VB {
|
|||
/* CPU snapshot */
|
||||
uint32_t adtre;
|
||||
uint32_t chcw;
|
||||
uint32_t ecr;
|
||||
uint32_t eipc;
|
||||
uint32_t eipsw;
|
||||
uint32_t fepc;
|
||||
|
@ -381,12 +382,21 @@ static int32_t SignExtend(int32_t value, int32_t bits) {
|
|||
|
||||
/* Process a simulation for a given number of clocks */
|
||||
static int sysEmulate(VB *sim, uint32_t clocks) {
|
||||
int ret;
|
||||
ret = cpuEmulate(sim, clocks);
|
||||
int ret = 0;
|
||||
|
||||
/* CPU is in a pseudo-halt state that requires an interrupt to exit */
|
||||
int never =
|
||||
sim->cpu.operation == CPU_PHALT &&
|
||||
sim->ph.operation == PH_NEVER
|
||||
;
|
||||
|
||||
/* Process all components */
|
||||
if (!never) ret = cpuEmulate(sim, clocks);
|
||||
padEmulate(sim, clocks);
|
||||
tmrEmulate(sim, clocks);
|
||||
vsuEmulate(sim, clocks);
|
||||
ret |= vipEmulate(sim, clocks);
|
||||
if ( never) ret |= cpuEmulate(sim, clocks);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue