mirror of
https://github.com/simh/simh.git
synced 2026-01-13 23:35:57 +00:00
All VAX: Properly record clock tick acknowledgments
This commit is contained in:
parent
5fdc1e6d0f
commit
74a640d04a
@ -248,7 +248,7 @@ void iccs_wr (int32 data)
|
||||
{
|
||||
if ((data & CSR_IE) == 0)
|
||||
CLR_INT (CLK);
|
||||
if (data & CSR_DONE) /* Interrupt Acked? */
|
||||
if ((clk_csr & CSR_DONE) && (data & CSR_DONE)) /* Interrupt Acked? */
|
||||
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
||||
clk_csr = (clk_csr & ~CLKCSR_RW) | (data & CLKCSR_RW);
|
||||
return;
|
||||
|
||||
@ -226,7 +226,7 @@ void iccs_wr (int32 data)
|
||||
{
|
||||
if ((data & CSR_IE) == 0)
|
||||
CLR_INT (CLK);
|
||||
if (data & CSR_DONE) /* Interrupt Acked? */
|
||||
if ((clk_csr & CSR_DONE) && (data & CSR_DONE)) /* Interrupt Acked? */
|
||||
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
||||
clk_csr = (clk_csr & ~CLKCSR_RW) | (data & CLKCSR_RW);
|
||||
return;
|
||||
|
||||
@ -660,12 +660,13 @@ void iccs_wr (int32 val)
|
||||
sim_debug_bits_hdr (TMR_DB_REG, &tmr_dev, "iccs_wr()", tmr_iccs_bits, tmr_iccs, val, TRUE);
|
||||
if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */
|
||||
if (tmr_iccs & TMR_CSR_RUN) { /* run 1 -> 0? */
|
||||
tmr_icr = icr_rd (); /* update itr */
|
||||
tmr_icr = icr_rd (); /* update icr */
|
||||
sim_debug (TMR_DB_REG, &tmr_dev, "iccs_wr() - stopped clock with remaining ICR=0x%08X\n", tmr_icr);
|
||||
sim_rtcn_calb (0, TMR_CLK); /* stop timer */
|
||||
}
|
||||
sim_cancel (&tmr_unit); /* cancel timer */
|
||||
}
|
||||
if (val & CSR_DONE) /* Interrupt Acked? */
|
||||
if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE)) /* Interrupt Acked? */
|
||||
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
||||
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
||||
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
||||
@ -752,7 +753,7 @@ if (tmr_iccs & TMR_CSR_IE) { /* ie? set int req */
|
||||
}
|
||||
else
|
||||
tmr_int = 0;
|
||||
AIO_SET_INTERRUPT_LATENCY(tmr_poll*clk_tps); /* set interrrupt latency */
|
||||
AIO_SET_INTERRUPT_LATENCY(tmr_poll*clk_tps); /* set interrrupt latency */
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
@ -924,9 +925,9 @@ TOY *toy = (TOY *)clk_unit.filebuf;
|
||||
struct timespec base, now, val;
|
||||
|
||||
sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
||||
base.tv_sec = toy->toy_gmtbase;
|
||||
base.tv_sec = (time_t)toy->toy_gmtbase;
|
||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||
sim_timespec_diff (&val, &now, &base);
|
||||
sim_timespec_diff (&val, &now, &base); /* val = now - base */
|
||||
sim_debug (TMR_DB_TODR, &clk_dev, "todr_rd() - TODR=0x%X - %s\n", (int32)(val.tv_sec*100 + val.tv_nsec/10000000), todr_fmt_vms_todr ((int32)(val.tv_sec*100 + val.tv_nsec/10000000)));
|
||||
return (int32)(val.tv_sec*100 + val.tv_nsec/10000000); /* 100hz Clock Ticks */
|
||||
}
|
||||
@ -941,7 +942,7 @@ time_t tbase;
|
||||
future read operations in "battery backed-up" state */
|
||||
|
||||
sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
||||
val.tv_sec = ((uint32)data) / 100;
|
||||
val.tv_sec = (time_t)((uint32)data) / 100;
|
||||
val.tv_nsec = (((uint32)data) % 100) * 10000000;
|
||||
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
||||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||
|
||||
@ -656,12 +656,13 @@ void iccs_wr (int32 val)
|
||||
sim_debug_bits_hdr (TMR_DB_REG, &tmr_dev, "iccs_wr()", tmr_iccs_bits, tmr_iccs, val, TRUE);
|
||||
if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */
|
||||
if (tmr_iccs & TMR_CSR_RUN) { /* run 1 -> 0? */
|
||||
tmr_icr = icr_rd (); /* update itr */
|
||||
tmr_icr = icr_rd (); /* update icr */
|
||||
sim_debug (TMR_DB_REG, &tmr_dev, "iccs_wr() - stopped clock with remaining ICR=0x%08X\n", tmr_icr);
|
||||
sim_rtcn_calb (0, TMR_CLK); /* stop timer */
|
||||
}
|
||||
sim_cancel (&tmr_unit); /* cancel timer */
|
||||
}
|
||||
if (val & CSR_DONE) /* Interrupt Acked? */
|
||||
if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE)) /* Interrupt Acked? */
|
||||
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
||||
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
||||
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
||||
@ -748,7 +749,7 @@ if (tmr_iccs & TMR_CSR_IE) { /* ie? set int req */
|
||||
}
|
||||
else
|
||||
tmr_int = 0;
|
||||
AIO_SET_INTERRUPT_LATENCY(tmr_poll*clk_tps); /* set interrrupt latency */
|
||||
AIO_SET_INTERRUPT_LATENCY(tmr_poll*clk_tps); /* set interrrupt latency */
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
@ -921,9 +922,9 @@ TOY *toy = (TOY *)clk_unit.filebuf;
|
||||
struct timespec base, now, val;
|
||||
|
||||
sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
||||
base.tv_sec = toy->toy_gmtbase;
|
||||
base.tv_sec = (time_t)toy->toy_gmtbase;
|
||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||
sim_timespec_diff (&val, &now, &base);
|
||||
sim_timespec_diff (&val, &now, &base); /* val = now - base */
|
||||
sim_debug (TMR_DB_TODR, &clk_dev, "todr_rd() - TODR=0x%X - %s\n", (int32)(val.tv_sec*100 + val.tv_nsec/10000000), todr_fmt_vms_todr ((int32)(val.tv_sec*100 + val.tv_nsec/10000000)));
|
||||
return (int32)(val.tv_sec*100 + val.tv_nsec/10000000); /* 100hz Clock Ticks */
|
||||
}
|
||||
@ -938,7 +939,7 @@ time_t tbase;
|
||||
future read operations in "battery backed-up" state */
|
||||
|
||||
sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
||||
val.tv_sec = ((uint32)data) / 100;
|
||||
val.tv_sec = (time_t)((uint32)data) / 100;
|
||||
val.tv_nsec = (((uint32)data) % 100) * 10000000;
|
||||
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
||||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||
|
||||
@ -626,12 +626,13 @@ void iccs_wr (int32 val)
|
||||
sim_debug_bits_hdr (TMR_DB_REG, &tmr_dev, "iccs_wr()", tmr_iccs_bits, tmr_iccs, val, TRUE);
|
||||
if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */
|
||||
if (tmr_iccs & TMR_CSR_RUN) { /* run 1 -> 0? */
|
||||
tmr_icr = icr_rd (); /* update itr */
|
||||
tmr_icr = icr_rd (); /* update icr */
|
||||
sim_debug (TMR_DB_REG, &tmr_dev, "iccs_wr() - stopped clock with remaining ICR=0x%08X\n", tmr_icr);
|
||||
sim_rtcn_calb (0, TMR_CLK); /* stop timer */
|
||||
}
|
||||
sim_cancel (&tmr_unit); /* cancel timer */
|
||||
}
|
||||
if (val & CSR_DONE) /* Interrupt Acked? */
|
||||
if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE)) /* Interrupt Acked? */
|
||||
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
||||
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
||||
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
||||
@ -718,7 +719,7 @@ if (tmr_iccs & TMR_CSR_IE) { /* ie? set int req */
|
||||
}
|
||||
else
|
||||
tmr_int = 0;
|
||||
AIO_SET_INTERRUPT_LATENCY(tmr_poll*clk_tps); /* set interrrupt latency */
|
||||
AIO_SET_INTERRUPT_LATENCY(tmr_poll*clk_tps); /* set interrrupt latency */
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
@ -891,9 +892,9 @@ TOY *toy = (TOY *)clk_unit.filebuf;
|
||||
struct timespec base, now, val;
|
||||
|
||||
sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
||||
base.tv_sec = toy->toy_gmtbase;
|
||||
base.tv_sec = (time_t)toy->toy_gmtbase;
|
||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||
sim_timespec_diff (&val, &now, &base);
|
||||
sim_timespec_diff (&val, &now, &base); /* val = now - base */
|
||||
sim_debug (TMR_DB_TODR, &clk_dev, "todr_rd() - TODR=0x%X - %s\n", (int32)(val.tv_sec*100 + val.tv_nsec/10000000), todr_fmt_vms_todr ((int32)(val.tv_sec*100 + val.tv_nsec/10000000)));
|
||||
return (int32)(val.tv_sec*100 + val.tv_nsec/10000000); /* 100hz Clock Ticks */
|
||||
}
|
||||
@ -908,7 +909,7 @@ time_t tbase;
|
||||
future read operations in "battery backed-up" state */
|
||||
|
||||
sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
||||
val.tv_sec = ((uint32)data) / 100;
|
||||
val.tv_sec = (time_t)((uint32)data) / 100;
|
||||
val.tv_nsec = (((uint32)data) % 100) * 10000000;
|
||||
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
||||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||
|
||||
@ -762,12 +762,13 @@ void iccs_wr (int32 val)
|
||||
sim_debug_bits_hdr (TMR_DB_REG, &tmr_dev, "iccs_wr()", tmr_iccs_bits, tmr_iccs, val, TRUE);
|
||||
if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */
|
||||
if (tmr_iccs & TMR_CSR_RUN) { /* run 1 -> 0? */
|
||||
tmr_icr = icr_rd (); /* update itr */
|
||||
tmr_icr = icr_rd (); /* update icr */
|
||||
sim_debug (TMR_DB_REG, &tmr_dev, "iccs_wr() - stopping clock remaining ICR=0x%08X\n", tmr_icr);
|
||||
sim_rtcn_calb (0, TMR_CLK); /* stop timer */
|
||||
}
|
||||
sim_cancel (&tmr_unit); /* cancel timer */
|
||||
}
|
||||
if (val & CSR_DONE) /* Interrupt Acked? */
|
||||
if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE)) /* Interrupt Acked? */
|
||||
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
||||
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
||||
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
||||
@ -854,7 +855,7 @@ if (tmr_iccs & TMR_CSR_IE) { /* ie? set int req */
|
||||
}
|
||||
else
|
||||
tmr_int = 0;
|
||||
AIO_SET_INTERRUPT_LATENCY(tmr_poll*clk_tps); /* set interrrupt latency */
|
||||
AIO_SET_INTERRUPT_LATENCY(tmr_poll*clk_tps); /* set interrrupt latency */
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
||||
@ -1026,9 +1027,9 @@ TOY *toy = (TOY *)clk_unit.filebuf;
|
||||
struct timespec base, now, val;
|
||||
|
||||
sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
||||
base.tv_sec = toy->toy_gmtbase;
|
||||
base.tv_sec = (time_t)toy->toy_gmtbase;
|
||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||
sim_timespec_diff (&val, &now, &base);
|
||||
sim_timespec_diff (&val, &now, &base); /* val = now - base */
|
||||
sim_debug (TMR_DB_TODR, &clk_dev, "todr_rd() - TODR=0x%X - %s\n", (int32)(val.tv_sec*100 + val.tv_nsec/10000000), todr_fmt_vms_todr ((int32)(val.tv_sec*100 + val.tv_nsec/10000000)));
|
||||
return (int32)(val.tv_sec*100 + val.tv_nsec/10000000); /* 100hz Clock Ticks */
|
||||
}
|
||||
@ -1043,7 +1044,7 @@ time_t tbase;
|
||||
future read operations in "battery backed-up" state */
|
||||
|
||||
sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
||||
val.tv_sec = ((uint32)data) / 100;
|
||||
val.tv_sec = (time_t)((uint32)data) / 100;
|
||||
val.tv_nsec = (((uint32)data) % 100) * 10000000;
|
||||
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
||||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||
|
||||
@ -300,7 +300,7 @@ void iccs_wr (int32 data)
|
||||
{
|
||||
if ((data & CSR_IE) == 0)
|
||||
CLR_INT (CLK);
|
||||
if (data & CSR_DONE) /* Interrupt Acked? */
|
||||
if ((clk_csr & CSR_DONE) && (data & CSR_DONE)) /* Interrupt Acked? */
|
||||
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
||||
clk_csr = (clk_csr & ~CLKCSR_RW) | (data & CLKCSR_RW);
|
||||
return;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user