Annotation of xinu/sys/dlcoin.c, revision 1.1

1.1     ! root        1: /* dlcoin.c - dlcoin */
        !             2: 
        !             3: #include <conf.h>
        !             4: #include <kernel.h>
        !             5: #include <slu11.h>
        !             6: #include <proc.h>
        !             7: #include <sleep.h>
        !             8: #include <dlc.h>
        !             9: 
        !            10: /*------------------------------------------------------------------------
        !            11:  *  dlcoin  --  dlc output interrupt handler
        !            12:  *------------------------------------------------------------------------
        !            13:  */
        !            14: INTPROC        dlcoin(dptr)
        !            15: register struct        dlblk   *dptr;
        !            16: {
        !            17:        struct  csr     *cptr;
        !            18:        char    ch;
        !            19: 
        !            20:        cptr = dptr->dioaddr;
        !            21: 
        !            22:        switch (dptr->dostate) {
        !            23: 
        !            24:        case DLOINIT:                           /* non-blockmode output */
        !            25:                        if (dptr->dovalid) {
        !            26:                                cptr->ctbuf = dptr->dochar;
        !            27:                                dptr->dovalid = FALSE;
        !            28:                        } else
        !            29:                                cptr->ctstat = SLUDISABLE;
        !            30:                        return;
        !            31: 
        !            32:        case DLOREADY:                          /* ready to write block */
        !            33:                        cptr->ctbuf = DLSTART;
        !            34:                        dptr->dostate = DLOSTALL;
        !            35:                        dptr->dostall = DLNSTALL;
        !            36:                        dptr->doesc = FALSE;
        !            37:                        return;
        !            38: 
        !            39:        case DLOSTALL:                          /* stalling a while     */
        !            40:                        cptr->ctstat = SLUDISABLE;
        !            41:                        cptr->ctstat = SLUENABLE;
        !            42:                        if (dptr->dostall-- > 0)
        !            43:                                return;
        !            44:                        dptr->dostate = DLOWRITE;
        !            45:                        return;
        !            46: 
        !            47:        case DLOWRITE:                          /* writing a block      */
        !            48:                        if (dptr->docount-- <= 0) {
        !            49:                                dptr->dostate = DLODONE;
        !            50:                                cptr->ctbuf = DLEOB;
        !            51:                                return;
        !            52:                        }
        !            53:                        if (((ch= *dptr->donext++)&DLESCMASK)==DLESCPED){
        !            54:                                if (dptr->doesc) {
        !            55:                                        dptr->doesc = FALSE;
        !            56:                                        cptr->ctbuf = ch & DLEBMASK;
        !            57:                                } else {
        !            58:                                        dptr->donext--;
        !            59:                                        dptr->docount++;
        !            60:                                        dptr->doesc = TRUE;
        !            61:                                        cptr->ctbuf = DLESC;
        !            62:                                }
        !            63:                                return;
        !            64:                        }
        !            65:                        cptr->ctbuf = ch;
        !            66:                        return;
        !            67: 
        !            68:        case DLODONE:                           /* finished writing     */
        !            69:                        if (dptr->docount < 0) {
        !            70:                                ready(dptr->doproc, RESCHYES);
        !            71:                                dptr->docount = 0;
        !            72:                        }
        !            73:                        cptr->ctstat = SLUDISABLE;
        !            74:                        return;
        !            75: 
        !            76:        case DLORESTART:                        /* restart transmission */
        !            77:                        dptr->dostate = DLOREADY;
        !            78:                        dptr->donext = dptr->dostart;
        !            79:                        dptr->docount = dptr->dotot;
        !            80:                        cptr->ctstat = SLUDISABLE;
        !            81:                        cptr->ctstat = SLUENABLE;
        !            82:                        return;
        !            83: 
        !            84:        default:
        !            85:                        panic("impossible dlc output state");
        !            86:        }
        !            87: }

unix.superglobalmegacorp.com

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