Annotation of cci/usr/src/ucb/vmstat.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)vmstat.c    4.11 (Berkeley) 9/25/83";
                      3: #endif
                      4: 
                      5: #include <curses.h>
                      6: #include <signal.h>
                      7: #include <stdio.h>
                      8: #include <sys/param.h>
                      9: #include <sys/vm.h>
                     10: #include <sys/dk.h>
                     11: #include <nlist.h>
                     12: #include <sys/buf.h>
                     13: #include <vba/vbavar.h>
                     14: #include <vba/vddc.h>
                     15: 
                     16: struct nlist nli[] = {
                     17: #define        X_CPTIME        0
                     18:        { "_cp_time" },
                     19: #define        X_RATE          1
                     20:        { "_rate" },
                     21: #define X_TOTAL                2
                     22:        { "_total" },
                     23: #define        X_DEFICIT       3
                     24:        { "_deficit" },
                     25: #define        X_FORKSTAT      4
                     26:        { "_forkstat" },
                     27: #define X_SUM          5
                     28:        { "_sum" },
                     29: #define        X_FIRSTFREE     6
                     30:        { "_firstfree" },
                     31: #define        X_MAXFREE       7
                     32:        { "_maxfree" },
                     33: #define        X_BOOTTIME      8
                     34:        { "_boottime" },
                     35: #define        X_DKXFER        9
                     36:        { "_dk_xfer" },
                     37: #define X_VBDINIT      10
                     38:        { "_vbdinit" },
                     39: #define X_REC          11
                     40:        { "_rectime" },
                     41: #define X_PGIN         12
                     42:        { "_pgintime" },
                     43: #define X_HZ           13
                     44:        { "_hz" },
                     45: #define X_NVDDRV       14
                     46:        { "_nvddrv" },
                     47: #define X_VDST         15
                     48:        { "_vdst" },
                     49:        { "" },
                     50: };
                     51: 
                     52: #define        UNIX    "/vmunix"
                     53: char dr_name[DK_NDRIVE][10];
                     54: double stat1();
                     55: int    firstfree, maxfree;
                     56: int    hz;
                     57: int    nodktyp;
                     58: struct
                     59: {
                     60:        int     busy;
                     61:        long    time[CPUSTATES];
                     62:        long    xfer[DK_NDRIVE];
                     63:        struct  vmmeter Rate;
                     64:        struct  vmtotal Total;
                     65:        struct  vmmeter Sum;
                     66:        struct  forkstat Forkstat;
                     67:        unsigned rectime;
                     68:        unsigned pgintime;
                     69: } s, s1, z;
                     70: #define        rate            s.Rate
                     71: #define        total           s.Total
                     72: #define        sum             s.Sum
                     73: #define        forkstat        s.Forkstat
                     74: #define        MAXRPT  10
                     75: #define        NCOLS   80
                     76: #define        NLINES  24
                     77: 
                     78: struct vmmeter osum;
                     79: int    zero;
                     80: int    deficit;
                     81: double etime;
                     82: int    mf;
                     83: int    swflag;
                     84: float  f; 
                     85: int    iter,count,repcnt;
                     86: 
                     87: fs_tab *vdinfo, *vdinfo_save;
                     88: long   name;
                     89: 
                     90: struct
                     91: {
                     92: int    r;
                     93: int    b;
                     94: int    w;
                     95: int    avm;
                     96: int    fre;
                     97: int    pgre;
                     98: int    pgat;
                     99: int    pi;
                    100: int    po;
                    101: int    fr;
                    102: int    de;
                    103: int    sr;
                    104: float  dk[DK_NDRIVE];
                    105: int    in;
                    106: int    sy;
                    107: int    cs;
                    108: float  syste[(CPUSTATES-1)];
                    109: /*
                    110: int    us;
                    111: int    sy;
                    112: int    id;
                    113: */
                    114: } rec[MAXRPT];
                    115: 
                    116: extern char *malloc();
                    117: 
                    118: main(argc, argv)
                    119:        int argc;
                    120:        char **argv;
                    121: {
                    122:        extern char *ctime();
                    123:        register i,j;
                    124:        int nintv;
                    125:        int totrep;
                    126:        time_t boottime;
                    127:        double f1, f2;
                    128:        long t;
                    129:        extern char _sobuf[];
                    130:        int die();
                    131:        int ptoutput();
                    132:        int shiftarray();
                    133:        int dietty();
                    134:        int     TERM;
                    135:        time_t now;
                    136: 
                    137:        TERM = isatty(1);
                    138:        setbuf(stdout, _sobuf);
                    139:        nlist(UNIX, nli);
                    140:        if(nli[0].n_value == 0) {
                    141:                printf("no %s namelist\n",UNIX);
                    142:                exit(1);
                    143:        }
                    144:        mf = open("/dev/kmem", 0);
                    145:        if(mf < 0) {
                    146:                printf("cannot open /dev/kmem\n");
                    147:                exit(1);
                    148:        }
                    149:        iter = 0;
                    150:        argc--, argv++;
                    151:        while (argc>0 && argv[0][0]=='-') {
                    152:                char *cp = *argv++;
                    153:                argc--;
                    154:                while (*++cp) switch (*cp) {
                    155: 
                    156:                case 'S':
                    157:                        swflag = 1 - swflag;
                    158:                        break;
                    159: 
                    160: 
                    161:                case 't':
                    162:                        dotimes();
                    163:                        exit(0);
                    164: 
                    165:                case 'z':
                    166:                        close(mf);
                    167:                        mf = open("/dev/kmem", 2);
                    168:                        lseek(mf, (long)nli[X_SUM].n_value, 0);
                    169:                        write(mf, &z.Sum, sizeof z.Sum);
                    170:                        exit(0);
                    171: 
                    172:                case 'f':
                    173:                        doforkst();
                    174:                        exit(0);
                    175:                
                    176:                case 's':
                    177:                        dosum();
                    178:                        exit(0);
                    179: 
                    180:                default:
                    181:                        fprintf(stderr, "usage: vmstat [ -fs ] [ interval ] [ count]\n");
                    182:                        exit(1);
                    183:                }
                    184:        }
                    185:        totrep = 1;
                    186:        if(argc > 1)
                    187:                totrep = atoi(argv[1]);
                    188:        if(argc ==1)
                    189:                totrep = -1;
                    190:        iter = 0;
                    191:        if ((totrep <0 ) || (totrep > MAXRPT))
                    192:                repcnt = MAXRPT;
                    193:        else
                    194:                repcnt = totrep;
                    195:        lseek(mf, (long)nli[X_FIRSTFREE].n_value, 0);
                    196:        read(mf, &firstfree, sizeof firstfree);
                    197:        lseek(mf, (long)nli[X_MAXFREE].n_value, 0);
                    198:        read(mf, &maxfree, sizeof maxfree);
                    199:        lseek(mf, (long)nli[X_BOOTTIME].n_value, 0);
                    200:        read(mf, &boottime, sizeof boottime);
                    201:        lseek(mf, (long)nli[X_HZ].n_value, 0);
                    202:        read(mf, &hz, sizeof hz);
                    203:        lseek(mf, (long)nli[X_NVDDRV].n_value, 0);
                    204:        read(mf, &nodktyp, sizeof nodktyp);
                    205:        vdinfo = (fs_tab *)malloc(nodktyp*sizeof(fs_tab));
                    206:        lseek(mf, (long)nli[X_VDST].n_value, 0);
                    207:        read(mf, (char *)vdinfo, nodktyp*sizeof(fs_tab));
                    208:        vdinfo_save = vdinfo;
                    209:        for (i = 0; i < nodktyp; vdinfo++, i++) {
                    210:                name = (long)vdinfo->type_name;
                    211:                vdinfo->type_name = malloc(3);
                    212:                lseek(mf, (long)name, 0);
                    213:                read(mf, vdinfo->type_name, 3);
                    214:        }
                    215:        vdinfo = vdinfo_save;
                    216:        for (i = 0; i < DK_NDRIVE; i++) 
                    217:                sprintf(dr_name[i],"??%x",i);
                    218:        read_names();
                    219:        time(&now);
                    220:        nintv = now - boottime;
                    221:        if (nintv <= 0 || nintv > 60*60*24*365*10) {
                    222:                printf("Time makes no sense... namelist must be wrong.\n");
                    223:                exit(1);
                    224:        }
                    225:        if (TERM){
                    226:                initscr();
                    227:                signal(SIGINT,dietty);
                    228:                nonl();
                    229:                crmode();
                    230:                noecho();
                    231:                leaveok(stdscr,TRUE);
                    232:                scrollok(stdscr,FALSE);
                    233:        }
                    234:        else
                    235:                signal(SIGINT,die);
                    236: reprint:
                    237: loop:
                    238:        lseek(mf, (long)nli[X_CPTIME].n_value, 0);
                    239:        read(mf, s.time, sizeof s.time);
                    240:        lseek(mf, (long)nli[X_DKXFER].n_value, 0);
                    241:        read(mf, s.xfer, sizeof s.xfer);
                    242:        if (nintv != 1) {
                    243:                lseek(mf, (long)nli[X_SUM].n_value, 0);
                    244:                read(mf, &rate, sizeof rate);
                    245:        } else {
                    246:                lseek(mf, (long)nli[X_RATE].n_value, 0);
                    247:                read(mf, &rate, sizeof rate);
                    248:        }
                    249:        lseek(mf, (long)nli[X_TOTAL].n_value, 0);
                    250:        read(mf, &total, sizeof total);
                    251:        osum = sum;
                    252:        lseek(mf, (long)nli[X_SUM].n_value, 0);
                    253:        read(mf, &sum, sizeof sum);
                    254:        lseek(mf, (long)nli[X_DEFICIT].n_value, 0);
                    255:        read(mf, &deficit, sizeof deficit);
                    256:        etime = 0;
                    257:        for (i=0; i < DK_NDRIVE; i++) {
                    258:                t = s.xfer[i];
                    259:                s.xfer[i] -= s1.xfer[i];
                    260:                s1.xfer[i] = t;
                    261:        }
                    262:        for (i=0; i < CPUSTATES; i++) {
                    263:                t = s.time[i];
                    264:                s.time[i] -= s1.time[i];
                    265:                s1.time[i] = t;
                    266:                etime += s.time[i];
                    267:        }
                    268:        if(etime == 0.)
                    269:                etime = 1.;
                    270:        rec[iter].r = total.t_rq;
                    271:        rec[iter].b = total.t_dw+total.t_pw;
                    272:        rec[iter].w = total.t_sw;
                    273:        rec[iter].avm= total.t_avm;
                    274:        rec[iter].fre = total.t_free;
                    275:        if(swflag){
                    276:                rec[iter].pgre= sum.v_swpin-osum.v_swpin ;
                    277:                rec[iter].pgat = sum.v_swpout-osum.v_swpout ;
                    278:        }
                    279:        else {
                    280: 
                    281:                rec[iter].pgre = (rate.v_pgrec - (rate.v_xsfrec+rate.v_xifrec))/nintv;
                    282:                rec[iter].pgat = (rate.v_xsfrec+rate.v_xifrec)/nintv;
                    283:        }
                    284:        rec[iter].pi = rate.v_pgpgin/nintv;
                    285:        rec[iter].po= rate.v_pgpgout/nintv;
                    286:        rec[iter].fr= rate.v_dfree/nintv;
                    287:        rec[iter].de = deficit;
                    288:        rec[iter].sr = rate.v_scan/nintv;
                    289:        etime /= (float) hz;
                    290:        for(i=0; i < DK_NDRIVE; i++){
                    291:                rec[iter].dk[i] =  s.xfer[i]/etime;
                    292:        }
                    293:        rec[iter].in= (rate.v_intr/nintv) - hz; 
                    294:        rec[iter].sy = rate.v_syscall/nintv;
                    295:        rec[iter].cs = rate.v_swtch/nintv;
                    296:        for(i=0; i<CPUSTATES; i++) {
                    297:                f = stat1(i);
                    298:                if (i == 0) {           /* US+NI */
                    299:                        i++;
                    300:                        f += stat1(i);
                    301:                }
                    302:                rec[iter].syste[i-1] = f;
                    303:        }
                    304:        nintv = 1;
                    305:        count++;
                    306:        if (count >= MAXRPT)
                    307:                if ( (count % MAXRPT) ==  0)
                    308:                        if(TERM == 0)
                    309:                                ptoutput(iter+1);
                    310:        if(TERM)
                    311:        {
                    312:          printw("mem[avm  fre] pag[%5s  pi  po  fr  de  sr] fault[in  sy  cs] cpu[us sy id]\n", swflag ? "si so" : "re at");
                    313:        for(i=0; i < (iter+1); i++){
                    314:             printw("%7d%7d  %4d%3d%4d%4d%4d%4d%4d     %5d%4d%4d     ",
                    315:                  rec[i].avm,rec[i].fre, rec[i].pgre,rec[i].pgat,
                    316:                  rec[i].pi,rec[i].po,rec[i].fr, rec[i].de,rec[i].sr,
                    317:                  rec[i].in,rec[i].sy,rec[i].cs);
                    318:           for(j=0; j<( CPUSTATES -1); j++)
                    319:                          printw("%3.0f",rec[i].syste[j]);
                    320:                  printw("\n");
                    321:        }
                    322:        for(i=(iter+1); i<repcnt; i++)
                    323:                  printw("\n");
                    324:          printw("proc[r b w]Dsk["); 
                    325:        for (i=0; i < DK_NDRIVE; i++)
                    326:                if(dr_name[i][0] !='?')
                    327:                          printw("%3.3s ",dr_name[i]);
                    328:          printw("]\n");
                    329:        for(i=0; i < (iter+1); i++){
                    330:                  printw("    %2d%2d%2d    ",rec[i].r,rec[i].b,rec[i].w);
                    331:                for(j=0; j<DK_NDRIVE; j++)
                    332:                        if(dr_name[j][0] !='?')
                    333:                                  printw("%3.0f ",rec[i].dk[j]);
                    334:          printw("\n");
                    335:        }
                    336:        for (i=(iter+1); i< repcnt; i++)
                    337:                  printw("\n");
                    338:          refresh();
                    339:          move(0,0);
                    340:        }
                    341:        if (totrep > 0)
                    342:                totrep--;
                    343:        iter++;
                    344:        if (count >=  MAXRPT ){
                    345:                for(i=0; i < (MAXRPT -1); i++){
                    346:                        shiftarray(i,1);
                    347:                }
                    348:                iter = MAXRPT-1;
                    349:        }
                    350: 
                    351:        if (totrep != 0){
                    352:                if(argc > 0) {
                    353:                        sleep(atoi(argv[0]));
                    354:                        goto loop;
                    355:                }
                    356:        }
                    357:        if(TERM)
                    358:                dietty();
                    359:        else {
                    360:                die();
                    361:        }
                    362: }
                    363: 
                    364: dotimes()
                    365: {
                    366: 
                    367:        lseek(mf, (long)nli[X_REC].n_value, 0);
                    368:        read(mf, &s.rectime, sizeof s.rectime);
                    369:        lseek(mf, (long)nli[X_PGIN].n_value, 0);
                    370:        read(mf, &s.pgintime, sizeof s.pgintime);
                    371:        lseek(mf, (long)nli[X_SUM].n_value, 0);
                    372:        read(mf, &sum, sizeof sum);
                    373:        printf("%d reclaims, %d total time (usec)\n", sum.v_pgrec, s.rectime);
                    374:        printf("average: %d usec / reclaim\n", s.rectime/sum.v_pgrec);
                    375:        printf("\n");
                    376:        printf("%d page ins, %d total time (msec)\n",sum.v_pgin, s.pgintime/10);
                    377:        printf("average: %8.1f msec / page in\n", s.pgintime/(sum.v_pgin*10.0));
                    378: }
                    379: 
                    380: dosum()
                    381: {
                    382: 
                    383:        lseek(mf, (long)nli[X_SUM].n_value, 0);
                    384:        read(mf, &sum, sizeof sum);
                    385:        printf("%9d swap ins\n", sum.v_swpin);
                    386:        printf("%9d swap outs\n", sum.v_swpout);
                    387:        printf("%9d pages swapped in\n", sum.v_pswpin / CLSIZE);
                    388:        printf("%9d pages swapped out\n", sum.v_pswpout / CLSIZE);
                    389:        printf("%9d total address trans. faults taken\n", sum.v_faults);
                    390:        printf("%9d page ins\n", sum.v_pgin);
                    391:        printf("%9d page outs\n", sum.v_pgout);
                    392:        printf("%9d pages paged in\n", sum.v_pgpgin);
                    393:        printf("%9d pages paged out\n", sum.v_pgpgout);
                    394:        printf("%9d sequential process pages freed\n", sum.v_seqfree);
                    395:        printf("%9d total reclaims (%d%% fast)\n", sum.v_pgrec,
                    396:            (sum.v_fastpgrec * 100) / (sum.v_pgrec == 0 ? 1 : sum.v_pgrec));
                    397:        printf("%9d reclaims from free list\n", sum.v_pgfrec);
                    398:        printf("%9d intransit blocking page faults\n", sum.v_intrans);
                    399:        printf("%9d zero fill pages created\n", sum.v_nzfod / CLSIZE);
                    400:        printf("%9d zero fill page faults\n", sum.v_zfod / CLSIZE);
                    401:        printf("%9d executable fill pages created\n", sum.v_nexfod / CLSIZE);
                    402:        printf("%9d executable fill page faults\n", sum.v_exfod / CLSIZE);
                    403:        printf("%9d swap text pages found in free list\n", sum.v_xsfrec);
                    404:        printf("%9d inode text pages found in free list\n", sum.v_xifrec);
                    405:        printf("%9d file fill pages created\n", sum.v_nvrfod / CLSIZE);
                    406:        printf("%9d file fill page faults\n", sum.v_vrfod / CLSIZE);
                    407:        printf("%9d pages examined by the clock daemon\n", sum.v_scan);
                    408:        printf("%9d revolutions of the clock hand\n", sum.v_rev);
                    409:        printf("%9d pages freed by the clock daemon\n", sum.v_dfree / CLSIZE);
                    410:        printf("%9d cpu context switches\n", sum.v_swtch);
                    411:        printf("%9d device interrupts\n", sum.v_intr);
                    412:        printf("%9d pseduo-dma dz interrupts\n", sum.v_pdma);
                    413:        printf("%9d traps\n", sum.v_trap);
                    414:        printf("%9d system calls\n", sum.v_syscall);
                    415: }
                    416: 
                    417: doforkst()
                    418: {
                    419: 
                    420:        lseek(mf, (long)nli[X_FORKSTAT].n_value, 0);
                    421:        read(mf, &forkstat, sizeof forkstat);
                    422:        printf("%d forks, %d pages, average=%.2f\n",
                    423:                forkstat.cntfork, forkstat.sizfork,
                    424:                (float) forkstat.sizfork / forkstat.cntfork);
                    425:        printf("%d vforks, %d pages, average=%.2f\n",
                    426:                forkstat.cntvfork, forkstat.sizvfork,
                    427:                (float)forkstat.sizvfork / forkstat.cntvfork);
                    428: }
                    429: 
                    430: stats(dn)
                    431: {
                    432: 
                    433:        if (dn >= DK_NDRIVE) {
                    434:                printf("  0");
                    435:                return;
                    436:        }
                    437:        printf("%3.0f", s.xfer[dn]/etime);
                    438: }
                    439: 
                    440: double
                    441: stat1(row)
                    442: {
                    443:        double t;
                    444:        register i;
                    445: 
                    446:        t = 0;
                    447:        for(i=0; i<CPUSTATES; i++)
                    448:                t += s.time[i];
                    449:        if(t == 0.)
                    450:                t = 1.;
                    451:        return(s.time[row]*100./t);
                    452: }
                    453: 
                    454: pct(top, bot)
                    455: {
                    456: 
                    457:        if (bot == 0)
                    458:                return (0);
                    459:        return ((top * 100) / bot);
                    460: }
                    461: 
                    462: #define steal(where, var) lseek(mf, where, 0); read(mf, &var, sizeof var);
                    463: 
                    464: read_names()
                    465: {
                    466:        struct vba_device udev, *up;
                    467:        struct vba_driver udrv;
                    468:        int     unit, i;
                    469: 
                    470:        up = (struct vba_device *) nli[X_VBDINIT].n_value;
                    471:        if (up == 0)
                    472:        {
                    473:                fprintf(stderr, "vmstat: Disk init info not in namelist\n");
                    474:                exit(1);
                    475:        }
                    476:        vdinfo_save = vdinfo;
                    477:        for (;;) {
                    478:                steal(up++, udev);
                    479:                unit = (udev.ui_ctlr * 4) + udev.ui_slave;
                    480:                 if (udev.ui_driver == 0)
                    481:                        break;
                    482:                if (udev.ui_dk <= 0 || udev.ui_alive == 0)
                    483:                        continue;
                    484:                if(udev.ui_type >= nodktyp){
                    485:                        fprintf(stderr,"vmstat : disk type in unit %d not supported \n",unit);
                    486:                        exit(1);
                    487:                }
                    488:                vdinfo = vdinfo_save;
                    489:                for(i=0; i < udev.ui_type; i++)
                    490:                        vdinfo++;
                    491:                dr_name[unit][0] = vdinfo->type_name[0];
                    492:                dr_name[unit][1] = vdinfo->type_name[1];
                    493:        }
                    494: }
                    495: die()
                    496: {
                    497:        int     i,j,k;
                    498:        iter--;
                    499:        signal(SIGINT,SIG_IGN);
                    500:        i = count % MAXRPT;
                    501:        if (count >= MAXRPT){
                    502:                k = MAXRPT - i;
                    503:                for (j=0; j <i; j++)
                    504:                        shiftarray(0,k);
                    505:        }
                    506:        ptoutput(i);
                    507:        exit(0);
                    508: }
                    509: dietty()
                    510: {
                    511:        signal(SIGINT,SIG_IGN);
                    512:        mvcur(0,COLS-1, LINES-1,0);
                    513:        endwin();
                    514:        exit(0);
                    515: }
                    516: ptoutput(reptot)
                    517:        int     reptot;
                    518: {
                    519: register       i,j;
                    520:          printf("mem[avm  fre] pag[%5s  pi  po  fr  de  sr] fault[in  sy  cs] cpu[us sy id]\n", swflag ? "si so" : "re at");
                    521:        for(i=0; i < (reptot); i++){
                    522:             printf(" %6d%5d    %4d%3d%4d%4d%4d%4d%4d      %4d%4d%4d     ",
                    523:                  rec[i].avm,rec[i].fre, rec[i].pgre,rec[i].pgat,
                    524:                  rec[i].pi,rec[i].po,rec[i].fr, rec[i].de,rec[i].sr,
                    525:                  rec[i].in,rec[i].sy,rec[i].cs);
                    526:           for(j=0; j<( CPUSTATES -1); j++)
                    527:                          printf("%3.0f",rec[i].syste[j]);
                    528:                  printf("\n");
                    529:        }
                    530:        for(i=(reptot); i<repcnt; i++)
                    531:                  printf("\n");
                    532: 
                    533:        printf("proc[r b w]Dsk["); 
                    534: 
                    535:        for (i=0; i < DK_NDRIVE; i++)
                    536:                if(dr_name[i][0] !='?')
                    537:                          printf("%3.3s ",dr_name[i]);
                    538:          printf("]\n");
                    539:        for(i=0; i < (reptot); i++){
                    540:                  printf("    %2d%2d%2d    ",rec[i].r,rec[i].b,rec[i].w);
                    541:                for(j=0; j<DK_NDRIVE; j++)
                    542:                        if(dr_name[j][0] !='?')
                    543:                                  printf("%3.0f ",rec[i].dk[j]);
                    544:          printf("\n");
                    545:        }
                    546:        for (i=(reptot); i< repcnt; i++)
                    547:                  printf("\n");
                    548: }
                    549: shiftarray(srtary,offset)
                    550:        int     srtary; /* starting array to be shifted */
                    551:        int     offset; /* offset to be skip in shifting array  */ 
                    552: {
                    553: register       j;
                    554:        rec[srtary].r = rec[srtary+offset].r;
                    555:        rec[srtary].b = rec[srtary+offset].b;
                    556:        rec[srtary].w = rec[srtary+offset].w;
                    557:        rec[srtary].avm = rec[srtary+offset].avm;
                    558:        rec[srtary].fre = rec[srtary+offset].fre;
                    559:        rec[srtary].pgre = rec[srtary+offset].pgre;
                    560:        rec[srtary].pgat = rec[srtary+offset].pgat;
                    561:        rec[srtary].pi = rec[srtary+offset].pi;
                    562:        rec[srtary].po = rec[srtary+offset].po;
                    563:        rec[srtary].fr = rec[srtary+offset].fr;
                    564:        rec[srtary].de = rec[srtary+offset].de;
                    565:        rec[srtary].sr = rec[srtary+offset].sr;
                    566:        for(j=0; j < DK_NDRIVE; j++)
                    567:                rec[srtary].dk[j] = rec[srtary+offset].dk[j];
                    568:        rec[srtary].in = rec[srtary+offset].in;
                    569:        rec[srtary].sy = rec[srtary+offset].sy;
                    570:        rec[srtary].cs = rec[srtary+offset].cs;
                    571:        for(j=0; j < (CPUSTATES-1); j++)
                    572:                rec[srtary].syste[j] = rec[srtary+offset].syste[j];
                    573: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.