VAX, Unibus VAX: Record explicit TODR set immediately to backing store
- Only if backing store is used (i.e. OS Agnostic mode) - Previously this was only done on a clean simulator exit. That could result in inconsistent timing information in operating system images vs the saved TODR baseline data - Always return TODR values rounded to the TODR granularity (10ms).
This commit is contained in:
parent
0e72400e09
commit
4db4f90429
6 changed files with 53 additions and 23 deletions
|
@ -665,7 +665,7 @@ if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */
|
||||||
sim_cancel (&tmr_unit); /* cancel timer */
|
sim_cancel (&tmr_unit); /* cancel timer */
|
||||||
}
|
}
|
||||||
if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE) && /* Interrupt Acked? */
|
if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE) && /* Interrupt Acked? */
|
||||||
(10000 == (tmr_nicr) ? (~tmr_nicr + 1) : 0xFFFFFFFF))/* of 10ms tick */
|
(10000 == (tmr_nicr ? (~tmr_nicr + 1) : 0xFFFFFFFF)))/* of 10ms tick */
|
||||||
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
||||||
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
||||||
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
||||||
|
@ -934,7 +934,7 @@ base.tv_sec = (time_t)toy->toy_gmtbase;
|
||||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||||
sim_timespec_diff (&val, &now, &base); /* 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)));
|
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 */
|
return (int32)(val.tv_sec*100 + (val.tv_nsec + 5000000)/10000000); /* 100hz Clock rounded Ticks */
|
||||||
}
|
}
|
||||||
|
|
||||||
void todr_wr (int32 data)
|
void todr_wr (int32 data)
|
||||||
|
@ -952,7 +952,12 @@ val.tv_nsec = (((uint32)data) % 100) * 10000000;
|
||||||
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
||||||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||||
tbase = (time_t)base.tv_sec;
|
tbase = (time_t)base.tv_sec;
|
||||||
toy->toy_gmtbasemsec = base.tv_nsec/1000000;
|
toy->toy_gmtbasemsec = (base.tv_nsec + 500000)/1000000;
|
||||||
|
if (clk_unit.flags & UNIT_ATT) { /* OS Agnostic mode? */
|
||||||
|
rewind (clk_unit.fileref);
|
||||||
|
fwrite (toy, sizeof (*toy), 1, clk_unit.fileref); /* Save sync time info */
|
||||||
|
fflush (clk_unit.fileref);
|
||||||
|
}
|
||||||
sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000));
|
sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -982,7 +987,7 @@ else { /* Not-Attached means */
|
||||||
ctm->tm_min) * 60) +
|
ctm->tm_min) * 60) +
|
||||||
ctm->tm_sec;
|
ctm->tm_sec;
|
||||||
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
||||||
(int32)(now.tv_nsec / 10000000));
|
(int32)((now.tv_nsec + 5000000)/ 10000000));
|
||||||
}
|
}
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -661,7 +661,7 @@ if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */
|
||||||
sim_cancel (&tmr_unit); /* cancel timer */
|
sim_cancel (&tmr_unit); /* cancel timer */
|
||||||
}
|
}
|
||||||
if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE) && /* Interrupt Acked? */
|
if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE) && /* Interrupt Acked? */
|
||||||
(10000 == (tmr_nicr) ? (~tmr_nicr + 1) : 0xFFFFFFFF))/* of 10ms tick */
|
(10000 == (tmr_nicr ? (~tmr_nicr + 1) : 0xFFFFFFFF)))/* of 10ms tick */
|
||||||
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
||||||
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
||||||
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
||||||
|
@ -931,7 +931,7 @@ base.tv_sec = (time_t)toy->toy_gmtbase;
|
||||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||||
sim_timespec_diff (&val, &now, &base); /* 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)));
|
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 */
|
return (int32)(val.tv_sec*100 + (val.tv_nsec + 5000000)/10000000); /* 100hz Clock rounded Ticks */
|
||||||
}
|
}
|
||||||
|
|
||||||
void todr_wr (int32 data)
|
void todr_wr (int32 data)
|
||||||
|
@ -949,7 +949,12 @@ val.tv_nsec = (((uint32)data) % 100) * 10000000;
|
||||||
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
||||||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||||
tbase = (time_t)base.tv_sec;
|
tbase = (time_t)base.tv_sec;
|
||||||
toy->toy_gmtbasemsec = base.tv_nsec/1000000;
|
toy->toy_gmtbasemsec = (base.tv_nsec + 500000)/1000000;
|
||||||
|
if (clk_unit.flags & UNIT_ATT) { /* OS Agnostic mode? */
|
||||||
|
rewind (clk_unit.fileref);
|
||||||
|
fwrite (toy, sizeof (*toy), 1, clk_unit.fileref); /* Save sync time info */
|
||||||
|
fflush (clk_unit.fileref);
|
||||||
|
}
|
||||||
sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000));
|
sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -979,7 +984,7 @@ else { /* Not-Attached means */
|
||||||
ctm->tm_min) * 60) +
|
ctm->tm_min) * 60) +
|
||||||
ctm->tm_sec;
|
ctm->tm_sec;
|
||||||
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
||||||
(int32)(now.tv_nsec / 10000000));
|
(int32)((now.tv_nsec + 5000000)/ 10000000));
|
||||||
}
|
}
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -633,7 +633,7 @@ if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */
|
||||||
sim_cancel (&tmr_unit); /* cancel timer */
|
sim_cancel (&tmr_unit); /* cancel timer */
|
||||||
}
|
}
|
||||||
if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE) && /* Interrupt Acked? */
|
if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE) && /* Interrupt Acked? */
|
||||||
(10000 == (tmr_nicr) ? (~tmr_nicr + 1) : 0xFFFFFFFF))/* of 10ms tick */
|
(10000 == (tmr_nicr ? (~tmr_nicr + 1) : 0xFFFFFFFF)))/* of 10ms tick */
|
||||||
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
||||||
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
||||||
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
||||||
|
@ -903,7 +903,7 @@ base.tv_sec = (time_t)toy->toy_gmtbase;
|
||||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||||
sim_timespec_diff (&val, &now, &base); /* 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)));
|
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 */
|
return (int32)(val.tv_sec*100 + (val.tv_nsec + 5000000)/10000000); /* 100hz Clock rounded Ticks */
|
||||||
}
|
}
|
||||||
|
|
||||||
void todr_wr (int32 data)
|
void todr_wr (int32 data)
|
||||||
|
@ -921,7 +921,12 @@ val.tv_nsec = (((uint32)data) % 100) * 10000000;
|
||||||
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
||||||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||||
tbase = (time_t)base.tv_sec;
|
tbase = (time_t)base.tv_sec;
|
||||||
toy->toy_gmtbasemsec = base.tv_nsec/1000000;
|
toy->toy_gmtbasemsec = (base.tv_nsec + 500000)/1000000;
|
||||||
|
if (clk_unit.flags & UNIT_ATT) { /* OS Agnostic mode? */
|
||||||
|
rewind (clk_unit.fileref);
|
||||||
|
fwrite (toy, sizeof (*toy), 1, clk_unit.fileref); /* Save sync time info */
|
||||||
|
fflush (clk_unit.fileref);
|
||||||
|
}
|
||||||
sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000));
|
sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -951,7 +956,7 @@ else { /* Not-Attached means */
|
||||||
ctm->tm_min) * 60) +
|
ctm->tm_min) * 60) +
|
||||||
ctm->tm_sec;
|
ctm->tm_sec;
|
||||||
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
||||||
(int32)(now.tv_nsec / 10000000));
|
(int32)((now.tv_nsec + 5000000)/ 10000000));
|
||||||
}
|
}
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -662,7 +662,7 @@ if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */
|
||||||
sim_cancel (&tmr_unit); /* cancel timer */
|
sim_cancel (&tmr_unit); /* cancel timer */
|
||||||
}
|
}
|
||||||
if ((val & CSR_DONE) && /* Interrupt Acked? */
|
if ((val & CSR_DONE) && /* Interrupt Acked? */
|
||||||
(10000 == (tmr_nicr) ? (~tmr_nicr + 1) : 0xFFFFFFFF))/* of 10ms tick */
|
(10000 == (tmr_nicr ? (~tmr_nicr + 1) : 0xFFFFFFFF)))/* of 10ms tick */
|
||||||
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
||||||
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
||||||
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
||||||
|
@ -938,7 +938,7 @@ base.tv_sec = toy->toy_gmtbase;
|
||||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||||
sim_timespec_diff (&val, &now, &base);
|
sim_timespec_diff (&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)));
|
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 */
|
return (int32)(val.tv_sec*100 + (val.tv_nsec + 5000000)/10000000); /* 100hz Clock rounded Ticks */
|
||||||
}
|
}
|
||||||
|
|
||||||
void todr_wr (int32 data)
|
void todr_wr (int32 data)
|
||||||
|
@ -956,7 +956,12 @@ val.tv_nsec = (((uint32)data) % 100) * 10000000;
|
||||||
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
||||||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||||
tbase = (time_t)base.tv_sec;
|
tbase = (time_t)base.tv_sec;
|
||||||
toy->toy_gmtbasemsec = base.tv_nsec/1000000;
|
toy->toy_gmtbasemsec = (base.tv_nsec + 500000)/1000000;
|
||||||
|
if (clk_unit.flags & UNIT_ATT) { /* OS Agnostic mode? */
|
||||||
|
rewind (clk_unit.fileref);
|
||||||
|
fwrite (toy, sizeof (*toy), 1, clk_unit.fileref); /* Save sync time info */
|
||||||
|
fflush (clk_unit.fileref);
|
||||||
|
}
|
||||||
sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000));
|
sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -986,7 +991,7 @@ else { /* Not-Attached means */
|
||||||
ctm->tm_min) * 60) +
|
ctm->tm_min) * 60) +
|
||||||
ctm->tm_sec;
|
ctm->tm_sec;
|
||||||
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
||||||
(int32)(now.tv_nsec / 10000000));
|
(int32)((now.tv_nsec + 5000000)/ 10000000));
|
||||||
}
|
}
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -769,7 +769,7 @@ if ((val & TMR_CSR_RUN) == 0) { /* clearing run? */
|
||||||
sim_cancel (&tmr_unit); /* cancel timer */
|
sim_cancel (&tmr_unit); /* cancel timer */
|
||||||
}
|
}
|
||||||
if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE) && /* Interrupt Acked? */
|
if ((tmr_iccs & CSR_DONE) && (val & CSR_DONE) && /* Interrupt Acked? */
|
||||||
(10000 == (tmr_nicr) ? (~tmr_nicr + 1) : 0xFFFFFFFF))/* of 10ms tick */
|
(10000 == (tmr_nicr ? (~tmr_nicr + 1) : 0xFFFFFFFF)))/* of 10ms tick */
|
||||||
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
sim_rtcn_tick_ack (20, TMR_CLK); /* Let timers know */
|
||||||
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
tmr_iccs = tmr_iccs & ~(val & TMR_CSR_W1C); /* W1C csr */
|
||||||
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
tmr_iccs = (tmr_iccs & ~TMR_CSR_WR) | /* new r/w */
|
||||||
|
@ -1038,7 +1038,7 @@ base.tv_sec = (time_t)toy->toy_gmtbase;
|
||||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||||
sim_timespec_diff (&val, &now, &base); /* 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)));
|
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 */
|
return (int32)(val.tv_sec*100 + (val.tv_nsec + 5000000)/10000000); /* 100hz Clock rounded Ticks */
|
||||||
}
|
}
|
||||||
|
|
||||||
void todr_wr (int32 data)
|
void todr_wr (int32 data)
|
||||||
|
@ -1056,7 +1056,12 @@ val.tv_nsec = (((uint32)data) % 100) * 10000000;
|
||||||
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
||||||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||||
tbase = (time_t)base.tv_sec;
|
tbase = (time_t)base.tv_sec;
|
||||||
toy->toy_gmtbasemsec = base.tv_nsec/1000000;
|
toy->toy_gmtbasemsec = (base.tv_nsec + 500000)/1000000;
|
||||||
|
if (clk_unit.flags & UNIT_ATT) { /* OS Agnostic mode? */
|
||||||
|
rewind (clk_unit.fileref);
|
||||||
|
fwrite (toy, sizeof (*toy), 1, clk_unit.fileref); /* Save sync time info */
|
||||||
|
fflush (clk_unit.fileref);
|
||||||
|
}
|
||||||
sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000));
|
sim_debug (TMR_DB_TODR, &clk_dev, "todr_wr(0x%X) - %s - GMTBASE=%8.8s.%03d\n", data, todr_fmt_vms_todr (data), 11+ctime(&tbase), (int)(base.tv_nsec/1000000));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1086,7 +1091,7 @@ else { /* Not-Attached means */
|
||||||
ctm->tm_min) * 60) +
|
ctm->tm_min) * 60) +
|
||||||
ctm->tm_sec;
|
ctm->tm_sec;
|
||||||
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
||||||
(int32)(now.tv_nsec / 10000000));
|
(int32)((now.tv_nsec + 5000000)/ 10000000));
|
||||||
}
|
}
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -499,7 +499,7 @@ if (val.tv_sec >= TOY_MAX_SECS) { /* todr overflowed? */
|
||||||
}
|
}
|
||||||
|
|
||||||
sim_debug (DBG_REG, &clk_dev, "todr_rd() - TODR=0x%X\n", (int32)(val.tv_sec*100 + val.tv_nsec/10000000));
|
sim_debug (DBG_REG, &clk_dev, "todr_rd() - TODR=0x%X\n", (int32)(val.tv_sec*100 + val.tv_nsec/10000000));
|
||||||
return (int32)(val.tv_sec*100 + val.tv_nsec/10000000); /* 100hz Clock Ticks */
|
return (int32)(val.tv_sec*100 + (val.tv_nsec + 5000000)/10000000); /* 100hz Clock rounded Ticks */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -518,12 +518,17 @@ if (data) {
|
||||||
val.tv_nsec = (((uint32)data) % 100) * 10000000;
|
val.tv_nsec = (((uint32)data) % 100) * 10000000;
|
||||||
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
||||||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||||
toy->toy_gmtbasemsec = base.tv_nsec/1000000;
|
toy->toy_gmtbasemsec = (base.tv_nsec + 500000)/1000000;
|
||||||
}
|
}
|
||||||
else { /* stop the clock */
|
else { /* stop the clock */
|
||||||
toy->toy_gmtbase = 0;
|
toy->toy_gmtbase = 0;
|
||||||
toy->toy_gmtbasemsec = 0;
|
toy->toy_gmtbasemsec = 0;
|
||||||
}
|
}
|
||||||
|
if (clk_unit.flags & UNIT_ATT) { /* OS Agnostic mode? */
|
||||||
|
rewind (clk_unit.fileref);
|
||||||
|
fwrite (toy, sizeof (*toy), 1, clk_unit.fileref); /* Save sync time info */
|
||||||
|
fflush (clk_unit.fileref);
|
||||||
|
}
|
||||||
todr_reg = data;
|
todr_reg = data;
|
||||||
sim_debug (DBG_REG, &clk_dev, "todr_wr(0x%X) - TODR=0x%X blow=%d\n", data, todr_reg, todr_blow);
|
sim_debug (DBG_REG, &clk_dev, "todr_wr(0x%X) - TODR=0x%X blow=%d\n", data, todr_reg, todr_blow);
|
||||||
}
|
}
|
||||||
|
@ -556,7 +561,7 @@ else { /* Not-Attached means */
|
||||||
ctm->tm_min) * 60) +
|
ctm->tm_min) * 60) +
|
||||||
ctm->tm_sec;
|
ctm->tm_sec;
|
||||||
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
||||||
(int32)(now.tv_nsec / 10000000));
|
(int32)((now.tv_nsec + 5000000)/ 10000000));
|
||||||
}
|
}
|
||||||
return SCPE_OK;
|
return SCPE_OK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue