VAX: Add slightly more precise TODR initialization logic with debug support
This commit is contained in:
parent
1bb42b83ef
commit
acbb92091b
5 changed files with 48 additions and 25 deletions
|
@ -305,12 +305,19 @@ REG clk_reg[] = {
|
|||
{ NULL }
|
||||
};
|
||||
|
||||
#define TMR_DB_TODR 0x10 /* TODR */
|
||||
|
||||
DEBTAB todr_deb[] = {
|
||||
{ "TODR", TMR_DB_TODR, "TODR activities"},
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
DEVICE clk_dev = {
|
||||
"TODR", &clk_unit, clk_reg, NULL,
|
||||
1, 0, 8, 4, 0, 32,
|
||||
NULL, NULL, &clk_reset,
|
||||
NULL, &clk_attach, &clk_detach,
|
||||
NULL, 0, 0, NULL, NULL, NULL, &clk_help, NULL, NULL,
|
||||
NULL, DEV_DEBUG, 0, todr_deb, NULL, NULL, &clk_help, NULL, NULL,
|
||||
&clk_description
|
||||
};
|
||||
|
||||
|
@ -330,14 +337,12 @@ REG tmr_reg[] = {
|
|||
#define TMR_DB_TICK 0x02 /* Ticks */
|
||||
#define TMR_DB_SCHED 0x04 /* Scheduling */
|
||||
#define TMR_DB_INT 0x08 /* Interrupts */
|
||||
#define TMR_DB_TODR 0x10 /* TODR */
|
||||
|
||||
DEBTAB tmr_deb[] = {
|
||||
{ "REG", TMR_DB_REG, "Register Access"},
|
||||
{ "TICK", TMR_DB_TICK, "Ticks"},
|
||||
{ "SCHED", TMR_DB_SCHED, "Scheduling"},
|
||||
{ "INT", TMR_DB_INT, "Interrupts"},
|
||||
{ "TODR", TMR_DB_TODR, "TODR activities"},
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
|
@ -922,7 +927,7 @@ sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
|||
base.tv_sec = toy->toy_gmtbase;
|
||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||
sim_timespec_diff (&val, &now, &base);
|
||||
sim_debug (TMR_DB_TODR, &tmr_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 */
|
||||
}
|
||||
|
||||
|
@ -942,7 +947,7 @@ sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
|||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||
tbase = (time_t)base.tv_sec;
|
||||
toy->toy_gmtbasemsec = base.tv_nsec/1000000;
|
||||
sim_debug (TMR_DB_TODR, &tmr_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));
|
||||
}
|
||||
|
||||
t_stat todr_resync (void)
|
||||
|
|
|
@ -298,12 +298,19 @@ REG clk_reg[] = {
|
|||
{ NULL }
|
||||
};
|
||||
|
||||
#define TMR_DB_TODR 0x10 /* TODR */
|
||||
|
||||
DEBTAB todr_deb[] = {
|
||||
{ "TODR", TMR_DB_TODR, "TODR activities"},
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
DEVICE clk_dev = {
|
||||
"TODR", &clk_unit, clk_reg, NULL,
|
||||
1, 0, 8, 4, 0, 32,
|
||||
NULL, NULL, &clk_reset,
|
||||
NULL, &clk_attach, &clk_detach,
|
||||
NULL, 0, 0, NULL, NULL, NULL, &clk_help, NULL, NULL,
|
||||
NULL, DEV_DEBUG, 0, todr_deb, NULL, NULL, &clk_help, NULL, NULL,
|
||||
&clk_description
|
||||
};
|
||||
|
||||
|
@ -323,14 +330,12 @@ REG tmr_reg[] = {
|
|||
#define TMR_DB_TICK 0x02 /* Ticks */
|
||||
#define TMR_DB_SCHED 0x04 /* Scheduling */
|
||||
#define TMR_DB_INT 0x08 /* Interrupts */
|
||||
#define TMR_DB_TODR 0x10 /* TODR */
|
||||
|
||||
DEBTAB tmr_deb[] = {
|
||||
{ "REG", TMR_DB_REG, "Register Access"},
|
||||
{ "TICK", TMR_DB_TICK, "Ticks"},
|
||||
{ "SCHED", TMR_DB_SCHED, "Scheduling"},
|
||||
{ "INT", TMR_DB_INT, "Interrupts"},
|
||||
{ "TODR", TMR_DB_TODR, "TODR activities"},
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
|
@ -919,7 +924,7 @@ sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
|||
base.tv_sec = toy->toy_gmtbase;
|
||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||
sim_timespec_diff (&val, &now, &base);
|
||||
sim_debug (TMR_DB_TODR, &tmr_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 */
|
||||
}
|
||||
|
||||
|
@ -939,7 +944,7 @@ sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
|||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||
tbase = (time_t)base.tv_sec;
|
||||
toy->toy_gmtbasemsec = base.tv_nsec/1000000;
|
||||
sim_debug (TMR_DB_TODR, &tmr_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));
|
||||
}
|
||||
|
||||
t_stat todr_resync (void)
|
||||
|
|
|
@ -345,12 +345,19 @@ REG clk_reg[] = {
|
|||
{ NULL }
|
||||
};
|
||||
|
||||
#define TMR_DB_TODR 0x10 /* TODR */
|
||||
|
||||
DEBTAB todr_deb[] = {
|
||||
{ "TODR", TMR_DB_TODR, "TODR activities"},
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
DEVICE clk_dev = {
|
||||
"TODR", &clk_unit, clk_reg, NULL,
|
||||
1, 0, 8, 4, 0, 32,
|
||||
NULL, NULL, &clk_reset,
|
||||
NULL, &clk_attach, &clk_detach,
|
||||
NULL, 0, 0, NULL, NULL, NULL, &clk_help, NULL, NULL,
|
||||
NULL, DEV_DEBUG, 0, todr_deb, NULL, NULL, &clk_help, NULL, NULL,
|
||||
&clk_description
|
||||
};
|
||||
|
||||
|
@ -370,14 +377,12 @@ REG tmr_reg[] = {
|
|||
#define TMR_DB_TICK 0x02 /* Ticks */
|
||||
#define TMR_DB_SCHED 0x04 /* Scheduling */
|
||||
#define TMR_DB_INT 0x08 /* Interrupts */
|
||||
#define TMR_DB_TODR 0x10 /* TODR */
|
||||
|
||||
DEBTAB tmr_deb[] = {
|
||||
{ "REG", TMR_DB_REG, "Register Access"},
|
||||
{ "TICK", TMR_DB_TICK, "Ticks"},
|
||||
{ "SCHED", TMR_DB_SCHED, "Scheduling"},
|
||||
{ "INT", TMR_DB_INT, "Interrupts"},
|
||||
{ "TODR", TMR_DB_TODR, "TODR activities"},
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
|
@ -889,7 +894,7 @@ sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
|||
base.tv_sec = toy->toy_gmtbase;
|
||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||
sim_timespec_diff (&val, &now, &base);
|
||||
sim_debug (TMR_DB_TODR, &tmr_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 */
|
||||
}
|
||||
|
||||
|
@ -909,7 +914,7 @@ sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
|||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||
tbase = (time_t)base.tv_sec;
|
||||
toy->toy_gmtbasemsec = base.tv_nsec/1000000;
|
||||
sim_debug (TMR_DB_TODR, &tmr_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));
|
||||
}
|
||||
|
||||
t_stat todr_resync (void)
|
||||
|
|
|
@ -370,12 +370,19 @@ REG clk_reg[] = {
|
|||
{ NULL }
|
||||
};
|
||||
|
||||
#define TMR_DB_TODR 0x10 /* TODR */
|
||||
|
||||
DEBTAB todr_deb[] = {
|
||||
{ "TODR", TMR_DB_TODR, "TODR activities"},
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
DEVICE clk_dev = {
|
||||
"TODR", &clk_unit, clk_reg, NULL,
|
||||
1, 0, 8, 4, 0, 32,
|
||||
NULL, NULL, &clk_reset,
|
||||
NULL, &clk_attach, &clk_detach,
|
||||
NULL, 0, 0, NULL, NULL, NULL, &clk_help, NULL, NULL,
|
||||
NULL, DEV_DEBUG, 0, todr_deb, NULL, NULL, &clk_help, NULL, NULL,
|
||||
&clk_description
|
||||
};
|
||||
|
||||
|
@ -395,14 +402,12 @@ REG tmr_reg[] = {
|
|||
#define TMR_DB_TICK 0x02 /* Ticks */
|
||||
#define TMR_DB_SCHED 0x04 /* Scheduling */
|
||||
#define TMR_DB_INT 0x08 /* Interrupts */
|
||||
#define TMR_DB_TODR 0x10 /* TODR */
|
||||
|
||||
DEBTAB tmr_deb[] = {
|
||||
{ "REG", TMR_DB_REG, "Register Access"},
|
||||
{ "TICK", TMR_DB_TICK, "Ticks"},
|
||||
{ "SCHED", TMR_DB_SCHED, "Scheduling"},
|
||||
{ "INT", TMR_DB_INT, "Interrupts"},
|
||||
{ "TODR", TMR_DB_TODR, "TODR activities"},
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
|
@ -1023,7 +1028,7 @@ sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
|||
base.tv_sec = toy->toy_gmtbase;
|
||||
base.tv_nsec = toy->toy_gmtbasemsec * 1000000;
|
||||
sim_timespec_diff (&val, &now, &base);
|
||||
sim_debug (TMR_DB_TODR, &tmr_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 */
|
||||
}
|
||||
|
||||
|
@ -1043,7 +1048,7 @@ sim_timespec_diff (&base, &now, &val); /* base = now - data */
|
|||
toy->toy_gmtbase = (uint32)base.tv_sec;
|
||||
tbase = (time_t)base.tv_sec;
|
||||
toy->toy_gmtbasemsec = base.tv_nsec/1000000;
|
||||
sim_debug (TMR_DB_TODR, &tmr_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));
|
||||
}
|
||||
|
||||
t_stat todr_resync (void)
|
||||
|
|
|
@ -542,18 +542,21 @@ else { /* Not-Attached means */
|
|||
uint32 base; /* behave like simh VMS default */
|
||||
time_t curr;
|
||||
struct tm *ctm;
|
||||
struct timespec now;
|
||||
|
||||
curr = time (NULL); /* get curr time */
|
||||
sim_rtcn_get_time(&now, TMR_CLK); /* get curr time */
|
||||
curr = (time_t)now.tv_sec;
|
||||
if (curr == (time_t) -1) /* error? */
|
||||
return SCPE_NOFNC;
|
||||
ctm = localtime (&curr); /* decompose */
|
||||
if (ctm == NULL) /* error? */
|
||||
return SCPE_NOFNC;
|
||||
base = (((((ctm->tm_yday * 24) + /* sec since 1-Jan */
|
||||
ctm->tm_hour) * 60) +
|
||||
ctm->tm_min) * 60) +
|
||||
ctm->tm_sec;
|
||||
todr_wr ((base * 100) + 0x10000000); /* use VMS form */
|
||||
ctm->tm_hour) * 60) +
|
||||
ctm->tm_min) * 60) +
|
||||
ctm->tm_sec;
|
||||
todr_wr ((base * 100) + 0x10000000 + /* use VMS form */
|
||||
(int32)(now.tv_nsec / 10000000));
|
||||
}
|
||||
return SCPE_OK;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue