Annotation of 42BSD/sys/vaxuba/ps.c, revision 1.1

1.1     ! root        1: /*     ps.c    6.1     83/08/13        */
        !             2: 
        !             3: /*
        !             4:  * Evans and Sutherland Picture System 2 driver
        !             5:  */
        !             6: 
        !             7: /*
        !             8:  *     Still to be done:
        !             9:  *             WAIT_HIT
        !            10:  */
        !            11: 
        !            12: #include "ps.h"
        !            13: #if NPS > 0
        !            14: 
        !            15: #define EXTERNAL_SYNC
        !            16: 
        !            17: #include "../machine/pte.h"
        !            18: 
        !            19: #include "../h/param.h"
        !            20: #include "../h/systm.h"
        !            21: #include "../h/ioctl.h"
        !            22: #include "../h/map.h"
        !            23: #include "../h/buf.h"
        !            24: #include "../h/conf.h"
        !            25: #include "../h/dir.h"
        !            26: #include "../h/user.h"
        !            27: #include "../h/uio.h"
        !            28: 
        !            29: #include "../vaxuba/ubareg.h"
        !            30: #include "../vaxuba/ubavar.h"
        !            31: #include "../vaxuba/psreg.h"
        !            32: 
        !            33: int    psprobe(), psattach(), psintr();
        !            34: struct uba_device *psdinfo[NPS];
        !            35: u_short        psstd[] = { 0 };
        !            36: struct uba_driver psdriver = 
        !            37:     { psprobe, 0, psattach, 0, psstd, "ps", psdinfo };
        !            38: 
        !            39: #define        PSUNIT(dev)     (minor(dev))
        !            40: 
        !            41: #define MAXAUTOREFRESH                 (4)
        !            42: #define MAXAUTOMAP                     (4)
        !            43: #define MAXDBSIZE                      (0177777/2)
        !            44: 
        !            45: #define PSPRI                          (PZERO+1)
        !            46: 
        !            47: #define PSWAIT() {register short int i, j; i=20000; while((i-- != 0)\
        !            48:        && (((j=psaddr->ps_iostat)&DIOREADY)==0));}
        !            49: 
        !            50: struct ps {
        !            51:        char            ps_open;
        !            52:        short int       ps_uid;
        !            53:        struct {
        !            54:                enum { SINGLE_STEP_RF, AUTO_RF, TIME_RF } state;
        !            55:                enum { RUNNING_RF, SYNCING_RF, WAITING_MAP, STOPPED_RF } mode;
        !            56:                unsigned short int sraddrs[MAXAUTOREFRESH];
        !            57:                short int nsraddrs;
        !            58:                short int srcntr;
        !            59:                char waiting;
        !            60:                char stop;
        !            61:                int icnt;
        !            62:                int timecnt;
        !            63:        } ps_refresh;
        !            64:        struct {
        !            65:                enum { ON_DB, OFF_DB } state;
        !            66:                unsigned short int dbaddrs[2];
        !            67:                unsigned short int dbsize;
        !            68:                short int rbuffer;
        !            69:        } ps_dbuffer;
        !            70:        struct {
        !            71:                enum { SINGLE_STEP_MAP, AUTO_MAP } state;
        !            72:                enum { RUNNING_MAP, WAITING_RF, WAITING_START } mode;
        !            73:                unsigned short int maddrs[MAXAUTOMAP];
        !            74:                short int nmaddrs;
        !            75:                short int mcntr;
        !            76:                short int outputstart;
        !            77:                char waiting;
        !            78:                char stop;
        !            79:                int icnt;
        !            80:        } ps_map;
        !            81:        struct {
        !            82:                short int ticked;
        !            83:                short int missed;
        !            84:                int icnt;
        !            85:        } ps_clock;
        !            86:        struct {
        !            87:                int icnt;
        !            88:        } ps_hit;
        !            89:        int ps_strayintr;
        !            90:        int last_request;
        !            91:        int strayrequest;
        !            92:        int ps_icnt;
        !            93: } ps[NPS];
        !            94: 
        !            95: psprobe(reg)
        !            96:        caddr_t reg;
        !            97: {
        !            98:        register int br, cvec;
        !            99:        register struct psdevice *psaddr = (struct psdevice *) reg;
        !           100: 
        !           101:        psaddr->ps_iostat = PSRESET;
        !           102:        DELAY(200);
        !           103:        psaddr->ps_addr = RTCIE;
        !           104:        PSWAIT();
        !           105:        psaddr->ps_data = 01;
        !           106:        psaddr->ps_iostat = PSIE;
        !           107:        psaddr->ps_addr = RTCSR;
        !           108:        PSWAIT();
        !           109:        psaddr->ps_data = (SYNC|RUN);
        !           110:        DELAY(200000);
        !           111:        psaddr->ps_addr = RTCREQ;
        !           112:        PSWAIT();
        !           113:        psaddr->ps_data = 01;
        !           114:        psaddr->ps_iostat = 0;
        !           115:        psaddr->ps_iostat = PSRESET;
        !           116:        return (sizeof (struct psdevice));
        !           117: }
        !           118: 
        !           119: /*ARGSUSED*/
        !           120: psattach(ui)
        !           121:        register struct uba_device *ui;
        !           122: {
        !           123: 
        !           124: }
        !           125: 
        !           126: psopen(dev)
        !           127:        dev_t dev;
        !           128: {
        !           129:        register struct ps *psp;
        !           130:        register struct uba_device *ui;
        !           131:        register int unit = PSUNIT(dev);
        !           132: 
        !           133:        if (unit >= NPS || (psp = &ps[minor(dev)])->ps_open ||
        !           134:            (ui = psdinfo[unit]) == 0 || ui->ui_alive == 0)
        !           135:                return (ENXIO);
        !           136:        psp->ps_open = 1;
        !           137:        psp->ps_uid = u.u_uid;
        !           138:        psp->ps_strayintr = 0;
        !           139:        psp->ps_refresh.state = SINGLE_STEP_RF;
        !           140:        psp->ps_refresh.waiting = 0;
        !           141:        psp->ps_refresh.stop = 0;
        !           142:        psp->ps_dbuffer.state = OFF_DB;
        !           143:        psp->ps_map.state = SINGLE_STEP_MAP;
        !           144:        psp->ps_map.waiting = 0;
        !           145:        psp->ps_map.stop = 0;
        !           146:        psp->ps_clock.ticked = 0;
        !           147:        psp->ps_refresh.icnt = psp->ps_map.icnt = psp->ps_clock.icnt = 0;
        !           148:        psp->ps_icnt = 0;
        !           149:        maptouser(ui->ui_addr);
        !           150:        return (0);
        !           151: }
        !           152: 
        !           153: psclose(dev)
        !           154:        dev_t dev;
        !           155: {
        !           156:        register struct psdevice *psaddr = 
        !           157:                        (struct psdevice *) psdinfo[PSUNIT(dev)]->ui_addr;
        !           158: 
        !           159:        ps[PSUNIT(dev)].ps_open = 0;
        !           160:        psaddr->ps_iostat = 0;          /* clear IENABLE */
        !           161:        PSWAIT();
        !           162:        psaddr->ps_addr = RFSR;         /* set in auto refresh mode */
        !           163:        PSWAIT();
        !           164:        psaddr->ps_data = AUTOREF;
        !           165:        unmaptouser(psaddr);
        !           166: }
        !           167: 
        !           168: /*ARGSUSED*/
        !           169: psread(dev, uio)
        !           170:        dev_t dev;
        !           171:        struct uio *uio;
        !           172: {
        !           173: }
        !           174: 
        !           175: /*ARGSUSED*/
        !           176: pswrite(dev, uio)
        !           177:        dev_t dev;
        !           178:        struct uio *uio;
        !           179: {
        !           180: }
        !           181: 
        !           182: /*ARGSUSED*/
        !           183: psioctl(dev, cmd, data, flag)
        !           184:        register caddr_t data;
        !           185: {
        !           186:        register struct uba_device *ui = psdinfo[PSUNIT(dev)];
        !           187:        register struct ps *psp = &ps[PSUNIT(dev)];
        !           188:        int *waddr = *(int **)data;
        !           189:        int n, arg, i;
        !           190: 
        !           191:        switch (cmd) {
        !           192: 
        !           193:        case PSIOGETADDR:
        !           194:                *(caddr_t *)data = ui->ui_addr;
        !           195:                break;
        !           196: 
        !           197:        case PSIOAUTOREFRESH:
        !           198:                n = fuword(waddr++);
        !           199:                if (n == -1)
        !           200:                        return (EFAULT);
        !           201:                if (n < 0 || n > MAXAUTOREFRESH)
        !           202:                        return (EINVAL);
        !           203:                for (i = 0; i < n; i++) {
        !           204:                        if ((arg = fuword(waddr++)) == -1)
        !           205:                                return (EFAULT);
        !           206:                        psp->ps_refresh.sraddrs[i] = arg;
        !           207:                }
        !           208:                psp->ps_refresh.state = AUTO_RF;
        !           209:                psp->ps_refresh.nsraddrs = n;
        !           210:                psp->ps_refresh.srcntr = 0;
        !           211:                psp->ps_refresh.mode = WAITING_MAP;
        !           212:                break;
        !           213: 
        !           214:        case PSIOAUTOMAP:
        !           215:                n = fuword(waddr++);
        !           216:                if (n == -1)
        !           217:                        return (EFAULT);
        !           218:                if (n < 0 || n > MAXAUTOMAP)
        !           219:                        return (EINVAL);
        !           220:                for (i = 0; i < n; i++) {
        !           221:                        if ((arg = fuword(waddr++)) == -1)
        !           222:                                return (EFAULT);
        !           223:                        psp->ps_map.maddrs[i] = arg;
        !           224:                }
        !           225:                if ((arg = fuword(waddr++)) == -1)
        !           226:                        return (EFAULT);
        !           227:                psp->ps_map.outputstart = arg;
        !           228:                psp->ps_map.state = AUTO_MAP;
        !           229:                psp->ps_map.nmaddrs = n;
        !           230:                psp->ps_map.mcntr = 0;
        !           231:                psp->ps_map.mode = WAITING_START;
        !           232:                break;
        !           233: 
        !           234:        case PSIOSINGLEREFRESH:
        !           235:                psp->ps_refresh.state = SINGLE_STEP_RF;
        !           236:                break;
        !           237: 
        !           238:        case PSIOSINGLEMAP:
        !           239:                psp->ps_map.state = SINGLE_STEP_MAP;
        !           240:                break;
        !           241: 
        !           242:        case PSIODOUBLEBUFFER:
        !           243:                if ((arg = fuword(waddr++)) == -1)
        !           244:                        return (EFAULT);
        !           245:                psp->ps_dbuffer.dbaddrs[0] = arg;
        !           246:                if ((arg = fuword(waddr++)) == -1)
        !           247:                        return (EFAULT);
        !           248:                if (arg <= 0 || arg > MAXDBSIZE)
        !           249:                        return (EINVAL);
        !           250:                psp->ps_dbuffer.dbsize = arg;
        !           251:                psp->ps_dbuffer.dbaddrs[1] =
        !           252:                    psp->ps_dbuffer.dbaddrs[0]+arg;
        !           253:                psp->ps_dbuffer.state = ON_DB;
        !           254:                psp->ps_dbuffer.rbuffer = 0;
        !           255:                break;
        !           256: 
        !           257:        case PSIOSINGLEBUFFER:
        !           258:                psp->ps_dbuffer.state = OFF_DB;
        !           259:                break;
        !           260: 
        !           261:        case PSIOTIMEREFRESH:
        !           262:                if (psp->ps_refresh.state != SINGLE_STEP_RF)
        !           263:                        return(EINVAL);
        !           264:                if ((arg = fuword(waddr++)) == -1)
        !           265:                        return(EFAULT);
        !           266:                psp->ps_refresh.state = TIME_RF;
        !           267:                psp->ps_refresh.timecnt = arg;
        !           268:                break;
        !           269: 
        !           270:        case PSIOWAITREFRESH:
        !           271:                if (psp->ps_refresh.mode != RUNNING_RF) /* not running */
        !           272:                        return (0);                             /* dont wait */
        !           273:                /* fall into ... */
        !           274: 
        !           275:        case PSIOSTOPREFRESH:
        !           276:                if (cmd == PSIOSTOPREFRESH) {
        !           277:                        if (psp->ps_refresh.mode == STOPPED_RF
        !           278:                                        && psp->ps_refresh.state != TIME_RF)
        !           279:                                return (0);
        !           280:                        psp->ps_refresh.stop = 1;
        !           281:                }
        !           282:                spl5();
        !           283:                psp->ps_refresh.waiting = 1;
        !           284:                while (psp->ps_refresh.waiting)
        !           285:                        sleep(&psp->ps_refresh.waiting, PSPRI);
        !           286:                spl0();
        !           287:                if (cmd == PSIOSTOPREFRESH)
        !           288:                        psp->ps_refresh.mode = STOPPED_RF;
        !           289:                if (psp->ps_refresh.state == TIME_RF)
        !           290:                        psp->ps_refresh.state = SINGLE_STEP_RF;
        !           291:                break;
        !           292: 
        !           293:        case PSIOWAITMAP:
        !           294:                if (psp->ps_map.mode != RUNNING_MAP)    /* not running */
        !           295:                        return (0);                             /* dont wait */
        !           296:                /* fall into ... */
        !           297: 
        !           298:        case PSIOSTOPMAP:
        !           299:                if (cmd == PSIOSTOPMAP)
        !           300:                        psp->ps_map.stop = 1;
        !           301:                spl5();
        !           302:                psp->ps_map.waiting = 1;
        !           303:                while (psp->ps_map.waiting)
        !           304:                        sleep(&psp->ps_map.waiting, PSPRI);
        !           305:                spl0();
        !           306:                break;
        !           307: 
        !           308:        default:
        !           309:                return (ENOTTY);
        !           310:                break;
        !           311:        }
        !           312:        return (0);
        !           313: }
        !           314: 
        !           315: #define SAVEPSADDR() {register short int i, x;x=spl6();i=psaddr->ps_addr;\
        !           316:                while(((i=psaddr->ps_iostat)&DIOREADY)==0);\
        !           317:                savepsaddr=psaddr->ps_data;splx(x);}
        !           318: #define RESTORPSADDR() {register int x,i;x=spl6();\
        !           319:                while(((i=psaddr->ps_iostat)&DIOREADY)==0);\
        !           320:                psaddr->ps_addr=savepsaddr;splx(x);}
        !           321: 
        !           322: psclockintr(dev)
        !           323:        dev_t dev;
        !           324: {
        !           325:        register struct psdevice *psaddr =
        !           326:                        (struct psdevice *) psdinfo[PSUNIT(dev)]->ui_addr;
        !           327:        register struct ps *psp = &ps[PSUNIT(dev)];
        !           328:        int savepsaddr;
        !           329: 
        !           330:        if (!psp->ps_open)
        !           331:                return;
        !           332:        psp->ps_clock.icnt++;
        !           333:        SAVEPSADDR();
        !           334: #ifndef EXTERNAL_SYNC
        !           335:        if (psp->ps_refresh.state == AUTO_RF) {
        !           336:                if (psp->ps_refresh.mode == SYNCING_RF
        !           337:                                        && psp->ps_refresh.state != TIME_RF) {
        !           338:                        psrfnext(psp, psaddr);
        !           339:                } else {
        !           340:                        psp->ps_clock.ticked++;
        !           341:                        psp->ps_clock.missed++;
        !           342:                }
        !           343:        }
        !           344: #endif
        !           345:        PSWAIT();
        !           346:        psaddr->ps_addr = RTCREQ;
        !           347:        PSWAIT();
        !           348:        psaddr->ps_data = 01;           /* clear the request bits */
        !           349:        RESTORPSADDR();
        !           350: }
        !           351: 
        !           352: /*ARGSUSED*/
        !           353: pssystemintr(dev)
        !           354:        dev_t dev;
        !           355: {
        !           356:        register struct psdevice *psaddr =
        !           357:                        (struct psdevice *) psdinfo[PSUNIT(dev)]->ui_addr;
        !           358:        register struct ps *psp = &ps[PSUNIT(dev)];
        !           359:        short int request;
        !           360:        register int savepsaddr, x;
        !           361: 
        !           362:        if (!psp->ps_open)
        !           363:                return;
        !           364:        psp->ps_icnt++;
        !           365:        SAVEPSADDR();
        !           366:        PSWAIT();
        !           367:        psaddr->ps_addr = SYSREQ;
        !           368:        PSWAIT();
        !           369:        request = psaddr->ps_data&0377;
        !           370:        psp->last_request = request;
        !           371:        PSWAIT();
        !           372:        psaddr->ps_addr = SYSREQ;
        !           373:        PSWAIT();
        !           374:        psaddr->ps_data = request&(~(HALT_REQ|MOSTOP_REQ));   /* acknowledge */
        !           375: 
        !           376:        if (request & (MOSTOP_REQ|HALT_REQ)) {  /* Map stopped */
        !           377:                psp->ps_map.icnt++;
        !           378:                psmapstop(psaddr);              /* kill it dead */
        !           379:                if (psp->ps_map.waiting) {
        !           380:                        psp->ps_map.waiting = 0;
        !           381:                        wakeup(&psp->ps_map.waiting);
        !           382:                        if (psp->ps_map.stop) {
        !           383:                                psp->ps_map.stop = 0;
        !           384:                                goto tryrf;
        !           385:                        }
        !           386:                }
        !           387:                if (psp->ps_map.state == AUTO_MAP)
        !           388:                        if (!psmapnext(psp, psaddr)) {
        !           389:                                psp->ps_map.mcntr = 0;
        !           390:                                /* prepare for next round */
        !           391:                                pssetmapbounds(psp, psaddr);
        !           392:                                if (psp->ps_refresh.mode == WAITING_MAP) {
        !           393:                                        if (psp->ps_dbuffer.state == ON_DB)
        !           394:                                                /* fill other db */
        !           395:                                                psdbswitch(psp, psaddr);
        !           396:                                        else
        !           397:                                                psp->ps_map.mode = WAITING_RF;
        !           398:                                        psrfnext(psp, psaddr);  /* start rf */
        !           399:                                } else
        !           400:                                        psp->ps_map.mode = WAITING_RF;
        !           401:                        }
        !           402:        }
        !           403: tryrf:
        !           404:        if (request & RFSTOP_REQ) {             /* Refresh stopped */
        !           405:                psp->ps_refresh.icnt++;
        !           406:                if (psp->ps_refresh.state == TIME_RF)
        !           407:                        if(--psp->ps_refresh.timecnt > 0)
        !           408:                                goto tryhit;
        !           409:                psrfstop(psaddr, psp);
        !           410:                if (psp->ps_refresh.waiting) {
        !           411:                        psp->ps_refresh.waiting = 0;
        !           412:                        wakeup(&psp->ps_refresh.waiting);
        !           413:                        if (psp->ps_refresh.stop) {
        !           414:                                psp->ps_refresh.stop = 0;
        !           415:                                goto tryhit;
        !           416:                        }
        !           417:                }
        !           418:                if (psp->ps_refresh.state == AUTO_RF)
        !           419:                        if (!psrfnext(psp, psaddr)) {   /* at end of refresh cycle */
        !           420:                                if (psp->ps_map.state == AUTO_MAP && 
        !           421:                                                psp->ps_map.mode==WAITING_RF) {
        !           422:                                        if (psp->ps_dbuffer.state == ON_DB)
        !           423:                                                psdbswitch(psp, psaddr);
        !           424:                                        else
        !           425:                                                psmapnext(psp, psaddr);
        !           426:                                }
        !           427:                                psp->ps_refresh.srcntr = 0;
        !           428: #ifdef EXTERNAL_SYNC
        !           429:                                x = spl6();
        !           430: #endif
        !           431:                                if (!psp->ps_clock.ticked ||
        !           432:                                                !psrfnext(psp, psaddr)) {
        !           433:                                        psp->ps_refresh.mode = SYNCING_RF;
        !           434:                                }
        !           435:                                psp->ps_clock.ticked = 0;
        !           436:                                psp->ps_refresh.mode = SYNCING_RF;
        !           437: #ifdef EXTERNAL_SYNC
        !           438:                                splx(x);
        !           439: #endif
        !           440:                        }
        !           441:        }
        !           442: tryhit:
        !           443:        if (request & HIT_REQ) {                /* Hit request */
        !           444:                psp->ps_hit.icnt++;
        !           445:        }
        !           446:        if (request == 0)
        !           447:                psp->ps_strayintr++;
        !           448:        RESTORPSADDR();
        !           449: }
        !           450: 
        !           451: psrfnext(psp, psaddr)
        !           452:        register struct ps *psp;
        !           453:        register struct psdevice *psaddr;
        !           454: {
        !           455: 
        !           456:        if (psp->ps_refresh.srcntr < psp->ps_refresh.nsraddrs)
        !           457:                psrfstart(psp->ps_refresh.sraddrs[psp->ps_refresh.srcntr++],
        !           458:                                                psp, psaddr);
        !           459:        else if (psp->ps_refresh.srcntr == psp->ps_refresh.nsraddrs
        !           460:                                && psp->ps_dbuffer.state == ON_DB) {
        !           461:                psrfstart(psp->ps_dbuffer.dbaddrs[psp->ps_dbuffer.rbuffer],
        !           462:                                                psp, psaddr);
        !           463:                psp->ps_refresh.srcntr++;       /* flag for after dbuffer */
        !           464:        } else
        !           465:                return(0);
        !           466:        return(1);
        !           467: }
        !           468: 
        !           469: psrfstart(dfaddr, psp, psaddr)
        !           470:        short int dfaddr;
        !           471:        register struct ps *psp;
        !           472:        register struct psdevice *psaddr;
        !           473: {
        !           474:        int dummy;
        !           475: 
        !           476:        PSWAIT();
        !           477:        psaddr->ps_addr = RFASA;
        !           478:        PSWAIT();
        !           479:        psaddr->ps_data = dfaddr;
        !           480:        PSWAIT();
        !           481:        dummy = psaddr->ps_data;        /* just access to get to status reg */
        !           482:        PSWAIT();
        !           483:        psaddr->ps_data = RFSTART;      /* may want to | this value in */
        !           484:        psp->ps_refresh.mode = RUNNING_RF;
        !           485: }
        !           486: 
        !           487: psrfstop(psaddr, psp)
        !           488:        register struct psdevice *psaddr;
        !           489:        register struct ps *psp;
        !           490: {
        !           491: 
        !           492:        PSWAIT();
        !           493:        psaddr->ps_addr = RFSR;
        !           494:        PSWAIT();
        !           495:        psaddr->ps_data = 0;
        !           496: }
        !           497: 
        !           498: psdbswitch(psp, psaddr)
        !           499:        register struct ps *psp;
        !           500:        register struct psdevice *psaddr;
        !           501: {
        !           502: 
        !           503:        psp->ps_dbuffer.rbuffer = !psp->ps_dbuffer.rbuffer;
        !           504:        pssetmapbounds(psp, psaddr);
        !           505:        psmapnext(psp, psaddr);
        !           506: }
        !           507: 
        !           508: psmapnext(psp, psaddr)
        !           509:        register struct ps *psp;
        !           510:        register struct psdevice *psaddr;
        !           511: {
        !           512: 
        !           513:        if (psp->ps_map.mcntr < psp->ps_map.nmaddrs)
        !           514:                psmapstart(psp->ps_map.maddrs[psp->ps_map.mcntr++], psp, psaddr);
        !           515:        else
        !           516:                return(0);
        !           517:        return(1);
        !           518: }
        !           519: 
        !           520: pssetmapbounds(psp, psaddr)
        !           521:        register struct ps *psp;
        !           522:        register struct psdevice *psaddr;
        !           523: {
        !           524:        unsigned short int start;
        !           525: 
        !           526:        PSWAIT();
        !           527:        psaddr->ps_addr = MAOL;
        !           528:        PSWAIT();
        !           529:        if (psp->ps_dbuffer.state == ON_DB) {
        !           530:                psaddr->ps_data = (start = psp->ps_dbuffer.dbaddrs[!psp->ps_dbuffer.rbuffer])
        !           531:                                +psp->ps_dbuffer.dbsize-2;   /* 2 for a refresh halt command */
        !           532:                PSWAIT();
        !           533:                psaddr->ps_data = start;
        !           534:        } else {
        !           535:                start = psaddr->ps_data;        /* dummy: don't update limit */
        !           536:                PSWAIT();
        !           537:                psaddr->ps_data = psp->ps_map.outputstart;
        !           538:        }
        !           539: }
        !           540: 
        !           541: psmapstart(dfaddr, psp, psaddr)
        !           542:        int dfaddr;
        !           543:        register struct ps *psp;
        !           544:        register struct psdevice *psaddr;
        !           545: {
        !           546:        int data;
        !           547: 
        !           548:        PSWAIT();
        !           549:        psaddr->ps_addr = MAIA;
        !           550:        PSWAIT();
        !           551:        psaddr->ps_data = dfaddr;
        !           552:        PSWAIT();
        !           553:        psaddr->ps_data = MAO|MAI;      /* may want more here */
        !           554:        psp->ps_map.mode = RUNNING_MAP;
        !           555: }
        !           556: 
        !           557: psmapstop(psaddr)
        !           558:        register struct psdevice *psaddr;
        !           559: {
        !           560: 
        !           561:        PSWAIT();
        !           562:        psaddr->ps_addr = MASR;
        !           563:        PSWAIT();
        !           564:        psaddr->ps_data = 0;    /* zero MAI bit */
        !           565:        PSWAIT();
        !           566:        psaddr->ps_addr = MAIA;
        !           567:        PSWAIT();
        !           568:        psaddr->ps_data = 0;    /* zero input address register */
        !           569:        PSWAIT();
        !           570:        psaddr->ps_addr = SYSREQ;
        !           571:        PSWAIT();
        !           572:        psaddr->ps_data = HALT_REQ|MOSTOP_REQ;  /* overkill?? */
        !           573: }
        !           574: 
        !           575: /*ARGSUSED*/
        !           576: psdeviceintr(dev)
        !           577:        dev_t dev;
        !           578: {
        !           579: 
        !           580:        printf("ps device intr\n");
        !           581: }
        !           582: 
        !           583: /*ARGSUSED*/
        !           584: psdmaintr(dev)
        !           585:        dev_t dev;
        !           586: {
        !           587: 
        !           588:        printf("ps dma intr\n");
        !           589: }
        !           590: 
        !           591: psreset(uban)
        !           592:        int uban;
        !           593: {
        !           594: }
        !           595: 
        !           596: psextsync(PC, PS) {
        !           597:        register int n;
        !           598:        register struct psdevice *psaddr;
        !           599:        register struct ps *psp;
        !           600:        register int savepsaddr;
        !           601: 
        !           602: #ifdef EXTERNAL_SYNC
        !           603:        for (psp = ps, n = 0; n < NPS; psp++, n++) {
        !           604:                if (!psp->ps_open)
        !           605:                        continue;
        !           606:                if(psp->ps_refresh.mode == SYNCING_RF
        !           607:                                        && psp->ps_refresh.state != TIME_RF) {
        !           608:                        psaddr = (struct psdevice *) psdinfo[n]->ui_addr;
        !           609:                        SAVEPSADDR();
        !           610:                        psrfnext(psp, psaddr);
        !           611:                        RESTORPSADDR();
        !           612:                } else {
        !           613:                        psp->ps_clock.ticked++;
        !           614:                        psp->ps_clock.missed++;
        !           615:                }
        !           616:        }
        !           617: #endif
        !           618: }
        !           619: #endif

unix.superglobalmegacorp.com

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