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:
Mark Pizzolato 2020-10-09 05:10:34 -07:00
parent 0e72400e09
commit 4db4f90429
6 changed files with 53 additions and 23 deletions

View file

@ -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;
} }

View file

@ -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;
} }

View file

@ -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;
} }

View file

@ -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;
} }

View file

@ -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;
} }

View file

@ -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;
} }