Annotation of xinu/sys/dlcoin.c, revision 1.1.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.