PDP11: Fix PCLK device to properly behave with a 0 value interval (65536)

Also migrate to usecs remaining API to simplify producing the remaining
interval value.
This commit is contained in:
Mark Pizzolato 2016-12-30 14:43:12 -08:00
parent d456bac8fc
commit dbed84c370

View file

@ -274,6 +274,8 @@ else {
uint32 delay = DMASK & ((pclk_csr & CSR_UPDN) ? (DMASK + 1 - val) : val); uint32 delay = DMASK & ((pclk_csr & CSR_UPDN) ? (DMASK + 1 - val) : val);
int32 rv; int32 rv;
if (delay == 0)
delay = DMASK + 1;
rv = CSR_GETRATE (pclk_csr); /* get rate */ rv = CSR_GETRATE (pclk_csr); /* get rate */
sim_activate_after (&pclk_unit, xtim[rv] * delay); /* schedule interrupt */ sim_activate_after (&pclk_unit, xtim[rv] * delay); /* schedule interrupt */
} }
@ -288,7 +290,7 @@ if (!sim_is_active (&pclk_unit))
return pclk_ctr; return pclk_ctr;
rv = CSR_GETRATE (pclk_csr); /* get rate */ rv = CSR_GETRATE (pclk_csr); /* get rate */
val = (uint32)((sim_activate_time (&pclk_unit) / sim_timer_inst_per_sec ()) * (1000000 / xtim[rv])); val = (uint32)((sim_activate_time_usecs (&pclk_unit) / xtim[rv]));
val &= DMASK; val &= DMASK;
if (pclk_csr & CSR_UPDN) if (pclk_csr & CSR_UPDN)
val = DMASK + 1 - val; val = DMASK + 1 - val;