+#define X(fld) {t=s.fld[i]; s.fld[i]-=s1.fld[i]; if(state==TIME) s1.fld[i]=t;}
+#define Y(fld) {t = s.fld; s.fld -= s1.fld; if(state == TIME) s1.fld = t;}
+#define Z(fld) {t = s.nchstats.fld; s.nchstats.fld -= s1.nchstats.fld; \
+ if(state == TIME) s1.nchstats.fld = t;}
+#define MAXFAIL 5
+
+static char cpuchar[CPUSTATES] = { '=' , '>', '-', ' ' };
+static char cpuorder[CPUSTATES] = { CP_SYS, CP_USER, CP_NICE, CP_IDLE };
+
+showkre()
+{
+ float f1, f2;
+ int psiz, inttotal;
+ int i, l, c;
+ static int failcnt = 0;
+
+ for (i = 0; i < dk_ndrive; i++) {
+ X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time);
+ }
+ Y(tk_nin); Y(tk_nout);
+ etime = 0;
+ for(i = 0; i < CPUSTATES; i++) {
+ X(time);
+ etime += s.time[i];
+ }
+ if (etime < 5.0) { /* < 5 ticks - ignore this trash */
+ if (failcnt++ >= MAXFAIL) {
+ clear();
+ mvprintw(2, 10, "The alternate system clock has died!");
+ mvprintw(3, 10, "Reverting to ``pigs'' display.");
+ move(CMDLINE, 0);
+ refresh();
+ failcnt = 0;
+ sleep(5);
+ command("pigs");
+ }
+ return;
+ }
+ failcnt = 0;
+ etime /= hertz;
+ inttotal = 0;
+ for (i = 0; i < nintr; i++) {
+ if (s.intrcnt[i] == 0)
+ continue;
+ if (intrloc[i] == 0) {
+ if (nextintsrow == LINES)
+ continue;
+ intrloc[i] = nextintsrow++;
+ mvprintw(intrloc[i], INTSCOL + 9, "%-8.8s",
+ intrname[i]);
+ }
+ X(intrcnt);
+ l = (int)((float)s.intrcnt[i]/etime + 0.5);
+ inttotal += l;
+ putint(l, intrloc[i], INTSCOL, 8);
+ }
+ putint(inttotal, INTSROW + 1, INTSCOL, 8);
+ Z(ncs_goodhits); Z(ncs_badhits); Z(ncs_miss);
+ Z(ncs_long); Z(ncs_pass2); Z(ncs_2passes);
+ s.nchcount = nchtotal.ncs_goodhits + nchtotal.ncs_badhits +
+ nchtotal.ncs_miss + nchtotal.ncs_long;
+ if (state == TIME)
+ s1.nchcount = s.nchcount;
+
+ psiz = 0;
+ f2 = 0.0;
+ for (c = 0; c < CPUSTATES; c++) {
+ i = cpuorder[c];
+ f1 = cputime(i);
+ f2 += f1;
+ l = (int) ((f2 + 1.0) / 2.0) - psiz;
+ if (c == 0)
+ putfloat(f1, GRAPHROW, GRAPHCOL + 1, 5, 1, 0);
+ else
+ putfloat(f1, GRAPHROW, GRAPHCOL + 12 * c,
+ 5, 1, 0);
+ move(GRAPHROW + 2, psiz);
+ psiz += l;
+ while (l-- > 0)
+ addch(cpuchar[c]);
+ }
+
+ putint(ucount(), STATROW, STATCOL, 3);
+ putfloat(avenrun[0], STATROW, STATCOL + 17, 6, 2, 0);
+ putfloat(avenrun[1], STATROW, STATCOL + 23, 6, 2, 0);
+ putfloat(avenrun[2], STATROW, STATCOL + 29, 6, 2, 0);
+ mvaddstr(STATROW, STATCOL + 53, buf);
+ putint(total.t_arm/2, MEMROW + 2, MEMCOL + 4, 5);
+ putint(total.t_armtxt/2, MEMROW + 2, MEMCOL + 9, 5);
+ putint(total.t_avm/2, MEMROW + 2, MEMCOL + 14, 6);
+ putint(total.t_avmtxt/2, MEMROW + 2, MEMCOL + 20, 5);
+ putint(total.t_rm/2, MEMROW + 3, MEMCOL + 4, 5);
+ putint(total.t_rmtxt/2, MEMROW + 3, MEMCOL + 9, 5);
+ putint(total.t_vm/2, MEMROW + 3, MEMCOL + 14, 6);
+ putint(total.t_vmtxt/2, MEMROW + 3, MEMCOL + 20, 5);
+ putint(total.t_free/2, MEMROW + 2, MEMCOL + 27, 5);
+ putint(total.t_rq, PROCSROW + 1, PROCSCOL + 5, 3);
+ putint(total.t_pw, PROCSROW + 1, PROCSCOL + 8, 3);
+ putint(total.t_dw, PROCSROW + 1, PROCSCOL + 11, 3);
+ putint(total.t_sl, PROCSROW + 1, PROCSCOL + 14, 3);
+ putint(total.t_sw, PROCSROW + 1, PROCSCOL + 17, 3);
+ putrate(rate.v_swtch, oldrate.v_swtch,
+ GENSTATROW, GENSTATCOL, 7);
+ putrate(rate.v_trap, oldrate.v_trap,
+ GENSTATROW + 1, GENSTATCOL, 7);
+ putrate(rate.v_syscall, oldrate.v_syscall,
+ GENSTATROW + 2, GENSTATCOL, 7);
+ putrate(rate.v_intr, oldrate.v_intr,
+ GENSTATROW + 3, GENSTATCOL, 7);
+ putrate(rate.v_pdma, oldrate.v_pdma,
+ GENSTATROW + 4, GENSTATCOL, 7);
+ putrate(rate.v_soft, oldrate.v_soft,
+ GENSTATROW + 5, GENSTATCOL, 7);
+ putrate(rate.v_faults, oldrate.v_faults,
+ GENSTATROW + 6, GENSTATCOL, 7);
+ putrate(rate.v_scan, oldrate.v_scan,
+ GENSTATROW + 7, GENSTATCOL, 7);
+ putrate(rate.v_rev, oldrate.v_rev,
+ GENSTATROW + 8, GENSTATCOL, 7);
+ putrate(rate.v_pgin, oldrate.v_pgin, PAGEROW + 2,
+ PAGECOL + 5, 5);
+ putrate(rate.v_pgout, oldrate.v_pgout, PAGEROW + 2,
+ PAGECOL + 10, 5);
+ putrate(rate.v_swpin, oldrate.v_swpin, PAGEROW + 2,
+ PAGECOL + 15, 5);
+ putrate(rate.v_swpout, oldrate.v_swpout, PAGEROW + 2,
+ PAGECOL + 20, 5);
+ putrate(rate.v_pgpgin, oldrate.v_pgpgin, PAGEROW + 3,
+ PAGECOL + 5, 5);
+ putrate(rate.v_pgpgout, oldrate.v_pgpgout, PAGEROW + 3,
+ PAGECOL + 10, 5);
+ putrate(rate.v_pswpin, oldrate.v_pswpin, PAGEROW + 3,
+ PAGECOL + 15, 5);
+ putrate(rate.v_pswpout, oldrate.v_pswpout, PAGEROW + 3,
+ PAGECOL + 20, 5);
+ putrate(rate.v_pgrec, oldrate.v_pgrec, PAGEROW + 6, PAGECOL, 3);
+ putrate(rate.v_intrans, oldrate.v_intrans, PAGEROW + 6,
+ PAGECOL + 4, 2);
+ putrate(rate.v_xsfrec, oldrate.v_xsfrec, PAGEROW + 6,
+ PAGECOL + 7, 3);
+ putrate(rate.v_xifrec, oldrate.v_xifrec, PAGEROW + 6,
+ PAGECOL + 11, 3);
+ putrate(rate.v_pgfrec, oldrate.v_pgfrec, PAGEROW + 6,
+ PAGECOL + 15, 3);
+ putrate(rate.v_dfree, oldrate.v_dfree, PAGEROW + 6,
+ PAGECOL + 19, 3);
+ putrate(rate.v_seqfree, oldrate.v_seqfree, PAGEROW + 6,
+ PAGECOL + 23, 3);
+ putrate(rate.v_zfod, oldrate.v_zfod, PAGEROW + 8, PAGECOL, 8);
+ putrate(rate.v_nzfod, oldrate.v_nzfod, PAGEROW + 9, PAGECOL, 8);
+ putrate(rate.v_exfod, oldrate.v_exfod, PAGEROW + 8,
+ PAGECOL + 14, 8);
+ putrate(rate.v_nexfod, oldrate.v_nexfod, PAGEROW + 9,
+ PAGECOL + 14, 8);
+ putfloat (
+ rate.v_nzfod == 0 ?
+ 0.0
+ : state != RUN ?
+ ( 100.0 * rate.v_zfod / rate.v_nzfod )
+ : rate.v_nzfod == oldrate.v_nzfod ?
+ 0.0
+ :
+ ( 100.0 * (rate.v_zfod-oldrate.v_zfod)
+ / (rate.v_nzfod-oldrate.v_nzfod) )
+ , PAGEROW + 10
+ , PAGECOL
+ , 8
+ , 2
+ , 1
+ );
+ putfloat (
+ rate.v_nexfod == 0 ?
+ 0.0
+ : state != RUN ?
+ ( 100.0 * rate.v_exfod / rate.v_nexfod )
+ : rate.v_nexfod == oldrate.v_nexfod ?
+ 0.0
+ :
+ ( 100.0 * (rate.v_exfod-oldrate.v_exfod)
+ / (rate.v_nexfod-oldrate.v_nexfod) )
+ , PAGEROW + 10
+ , PAGECOL + 14
+ , 8
+ , 2
+ , 1
+ );
+ mvprintw(DISKROW,DISKCOL+5," ");
+ for (i = 0, c = 0; i < dk_ndrive && c < MAXDRIVES; i++)
+ if (dk_select[i]) {
+ mvprintw(DISKROW, DISKCOL + 5 + 5 * c,
+ " %3.3s", dr_name[i]);
+ dinfo(i, ++c);
+ }
+ putint(s.nchcount, NAMEIROW + 2, NAMEICOL, 9);
+ putint(nchtotal.ncs_goodhits, NAMEIROW + 2, NAMEICOL + 9, 9);
+#define nz(x) ((x) ? (x) : 1)
+ putfloat(nchtotal.ncs_goodhits * 100.0 / nz(s.nchcount),
+ NAMEIROW + 2, NAMEICOL + 19, 4, 0, 1);
+ putint(nchtotal.ncs_pass2, NAMEIROW + 2, NAMEICOL + 23, 9);
+ putfloat(nchtotal.ncs_pass2 * 100.0 / nz(s.nchcount),
+ NAMEIROW + 2, NAMEICOL + 34, 4, 0, 1);
+#undef nz
+}
+
+cmdkre(cmd, args)
+ char *cmd, *args;
+{
+
+ if (prefix(cmd, "run")) {
+ copyinfo(&s2, &s1);
+ state = RUN;
+ return (1);
+ }
+ if (prefix(cmd, "boot")) {
+ state = BOOT;
+ copyinfo(&z, &s1);
+ return (1);
+ }
+ if (prefix(cmd, "time")) {
+ state = TIME;
+ return (1);
+ }
+ if (prefix(cmd, "zero")) {
+ if (state == RUN)
+ getinfo(&s1, RUN);
+ return (1);
+ }
+ return (dkcmd(cmd, args));
+}
+
+/* calculate number of users on the system */
+static
+ucount()
+{
+ register int nusers = 0;
+
+ if (ut < 0)
+ return (0);
+ while (read(ut, &utmp, sizeof(utmp)))
+ if (utmp.ut_name[0] != '\0')
+ nusers++;
+
+ lseek(ut, 0L, L_SET);
+ return (nusers);
+}
+
+static float
+cputime(indx)
+ int indx;
+{
+ double t;
+ register i;
+
+ t = 0;
+ for (i = 0; i < CPUSTATES; i++)
+ t += s.time[i];
+ if (t == 0.0)
+ t = 1.0;
+ return (s.time[indx] * 100.0 / t);
+}
+
+static