Annotation of researchv10no/sys/io/kmc.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * KMC11 microprocessor driver
        !             3:  * quasi-general-purpose:
        !             4:  * the code here is for downloading and controlling the kmc
        !             5:  * dealing with particular downloaded code
        !             6:  * will usually mean writing another driver
        !             7:  * which, alas, must generally have magic knowledge of
        !             8:  * struct kmc and the device registers
        !             9:  *
        !            10:  * the caller is expected to fill in
        !            11:  * k_rint, k_xint, k_reset if it cares
        !            12:  */
        !            13: 
        !            14: #define lobyte(X) (((unsigned char *)&X)[0])
        !            15: #define hibyte(X) (((unsigned char *)&X)[1])
        !            16: 
        !            17: #include "sys/param.h"
        !            18: #include "sys/kmc.h"
        !            19: #include "sys/ubaddr.h"
        !            20: #include "sys/conf.h"
        !            21: #include "sys/user.h"
        !            22: 
        !            23: extern struct kmc kmc[];
        !            24: extern struct ubaddr kmcaddr[];
        !            25: extern int kmccnt;
        !            26: 
        !            27: #define        KMC11A  1
        !            28: #define        KMC11B  2
        !            29: #define        KASIZE  1024
        !            30: #define        KBSIZE  4096
        !            31: 
        !            32: #define        RUN     (1<<7)
        !            33: #define        MCLR    (1<<6)
        !            34: #define        CWRT    (1<<5)
        !            35: #define        LUB     (1<<4)
        !            36: #define        LUA     (1<<3)
        !            37: #define        ROMO    (1<<2)
        !            38: #define        ROMI    (1<<1)
        !            39: #define        STEP    (1<<0)
        !            40: 
        !            41: #define RDYO   0200
        !            42: #define RDYI   020
        !            43: #define RQI    0200
        !            44: #define IEI    01
        !            45: #define IEO    020
        !            46: 
        !            47: #define        STYPE   017
        !            48: #define SRUN   020
        !            49: #define SRINT  040
        !            50: #define        SOPEN   0100
        !            51: 
        !            52: struct device {
        !            53:        union {
        !            54:                char    b[8];
        !            55:                u_short w[4];
        !            56:        } un;
        !            57: };
        !            58: 
        !            59: #define        bsel0   un.b[0]
        !            60: #define        bsel1   un.b[1]
        !            61: #define        bsel2   un.b[2]
        !            62: #define        bsel3   un.b[3]
        !            63: #define        bsel4   un.b[4]
        !            64: #define        bsel5   un.b[5]
        !            65: #define        bsel6   un.b[6]
        !            66: #define        bsel7   un.b[7]
        !            67: #define        sel0    un.w[0]
        !            68: #define        sel2    un.w[1]
        !            69: #define        sel4    un.w[2]
        !            70: #define        sel6    un.w[3]
        !            71: 
        !            72: int kmcopen(), kmcclose(), kmcread(), kmcwrite(), kmcioctl();
        !            73: struct cdevsw kmccdev = cdinit(kmcopen, kmcclose, kmcread, kmcwrite, kmcioctl);
        !            74: 
        !            75: kmcopen(dev, flag)
        !            76: dev_t dev;
        !            77: {      register struct device *kp;
        !            78:        register struct kmc *tp;
        !            79:        register sav;
        !            80: 
        !            81:        dev = minor(dev);
        !            82:        if (dev>=kmccnt || (tp = &kmc[dev])->k_stat&SOPEN) {
        !            83:                u.u_error = ENXIO;
        !            84:                return;
        !            85:        }
        !            86:        if ((kp = (struct device *)ubaddr(&kmcaddr[dev])) == 0
        !            87:        ||  ubbadaddr(kmcaddr[dev].ubno, kp, sizeof(short))) {
        !            88:                printf("kmc%d absent\n", dev);
        !            89:                u.u_error = ENXIO;
        !            90:                return;
        !            91:        }
        !            92:        tp->k_addr = kp;
        !            93:        tp->k_written = 0;
        !            94:        tp->k_stat |= SOPEN;
        !            95:        if (tp->k_type==0) {
        !            96:                kp->bsel1 = ROMO;
        !            97:                kp->sel4 = 0;
        !            98:                sav = kp->sel6;
        !            99:                kp->sel6 = ~sav;
        !           100:                if (kp->sel6 != sav) {
        !           101:                        tp->k_type = KMC11B;
        !           102:                        kp->sel6 = sav;
        !           103:                } else
        !           104:                        tp->k_type = KMC11A;
        !           105:                kp->bsel1 = 0;
        !           106:        }
        !           107: }
        !           108: 
        !           109: kmcclose(dev)
        !           110: dev_t dev;
        !           111: {
        !           112:        register struct kmc *tp;
        !           113: 
        !           114:        tp = &kmc[minor(dev)];
        !           115:        tp->k_stat &= ~SOPEN;
        !           116:        if (tp->k_written && tp->k_reset)
        !           117:                (*tp->k_reset)(minor(dev));
        !           118: }
        !           119: 
        !           120: kmcread(dev)
        !           121: register dev_t dev;
        !           122: {      register struct device *kp;
        !           123:        register ad;
        !           124:        int     dsize;
        !           125:        u_short sav;
        !           126: 
        !           127:        dev = minor(dev);
        !           128:        if (kmc[dev].k_stat&SRUN)
        !           129:                return;
        !           130:        dsize = (kmc[dev].k_type==KMC11A)?KASIZE:KBSIZE;
        !           131:        kp = kmc[dev].k_addr;
        !           132:        kp->bsel1 = 0;
        !           133:        do {
        !           134:                ad = Ltol(u.u_offset);
        !           135:                if (ad<dsize*2) {
        !           136:                        if (ad&1) {
        !           137:                                u.u_error = ENXIO;
        !           138:                                break;
        !           139:                        }
        !           140:                        ad >>= 1;
        !           141:                        kp->bsel1 = ROMO;
        !           142:                        kp->sel4 = ad;
        !           143:                        passc(kp->bsel6);
        !           144:                        passc(kp->bsel7);
        !           145:                        kp->bsel1 = 0;
        !           146:                } else if (ad -= dsize*2, ad<dsize) {
        !           147:                        kp->bsel1 = ROMO;
        !           148:                        kp->sel4 = 0;
        !           149:                        sav = kp->sel6;
        !           150:                        kp->bsel1 = ROMI;
        !           151:                        kp->sel6 = 010000|(ad&0377);    /* mov ad,mar */
        !           152:                        kp->bsel1 = ROMI|STEP;
        !           153:                        kp->bsel1 = ROMI;
        !           154:                        kp->sel6 = 04000|((ad>>8)&0377);        /* mov %ad,%mar */
        !           155:                        kp->bsel1 = ROMI|STEP;
        !           156:                        kp->bsel1 = ROMI;
        !           157:                        kp->sel6 = 055222;      /* mov mem,csr2|mar++ */
        !           158:                        kp->bsel1 = ROMI|STEP;
        !           159:                        passc(kp->bsel2);
        !           160:                        kp->bsel1 = ROMI;
        !           161:                        kp->sel6 = sav;
        !           162:                        kp->bsel1 = 0;
        !           163:                } else
        !           164:                        break;
        !           165:        } while (u.u_error==0 && u.u_count);
        !           166: }
        !           167: 
        !           168: kmcwrite(dev)
        !           169: register dev_t dev;
        !           170: {      register struct device *kp;
        !           171:        register ad;
        !           172:        int     dsize;
        !           173:        short   ins;
        !           174:        u_short sav;
        !           175: 
        !           176:        dev = minor(dev);
        !           177:        if (kmc[dev].k_stat&SRUN)
        !           178:                return;
        !           179:        dsize = (kmc[dev].k_type==KMC11A)?KASIZE:KBSIZE;
        !           180:        kp = kmc[dev].k_addr;
        !           181:        kp->bsel1 = 0;
        !           182:        kmc[dev].k_written = 1;
        !           183:        while (u.u_error==0 && u.u_count) {
        !           184:                ad = Ltol(u.u_offset);
        !           185:                if (ad<dsize*2) {
        !           186:                        if (ad&1) {
        !           187:                                u.u_error = ENXIO;
        !           188:                                break;
        !           189:                        }
        !           190:                        kp->bsel1 = ROMO;
        !           191:                        kp->sel4 = ad>>1;
        !           192:                        lobyte(ins) = cpass();
        !           193:                        hibyte(ins) = cpass();
        !           194:                        kp->sel6 = ins;
        !           195:                        kp->bsel1 |= CWRT;
        !           196:                        kp->bsel1 = 0;
        !           197:                } else if (ad -= dsize*2, ad<dsize) {
        !           198:                        kp->bsel1 = ROMO;
        !           199:                        kp->sel4 = 0;
        !           200:                        sav = kp->sel6;
        !           201:                        kp->bsel1 = ROMI;
        !           202:                        kp->sel6 = 010000|(ad&0377);    /* mov ad,mar */
        !           203:                        kp->bsel1 = ROMI|STEP;
        !           204:                        kp->bsel1 = ROMI;
        !           205:                        kp->sel6 = 04000|((ad>>8)&0377);        /* mov %ad,%mar */
        !           206:                        kp->bsel1 = ROMI|STEP;
        !           207:                        kp->bsel1 = ROMI;
        !           208:                        kp->bsel2 = cpass();
        !           209:                        kp->sel6 = 0136440;     /* mov csr2,mem|mar++ */
        !           210:                        kp->bsel1 = ROMI|STEP;
        !           211:                        kp->bsel1 = ROMI;
        !           212:                        kp->sel6 = sav;
        !           213:                        kp->bsel1 = 0;
        !           214:                } else
        !           215:                        break;
        !           216:        }
        !           217: }
        !           218: 
        !           219: kmcioctl(dev, cmd, arg, mode)
        !           220: caddr_t arg;
        !           221: register dev_t dev;
        !           222: {      register struct device *kp;
        !           223:        register struct kmc *tp;
        !           224:        struct kmcntl kk;
        !           225:        short   csr[4];
        !           226:        u_short sav;
        !           227: 
        !           228:        dev = minor(dev);
        !           229:        if (cmd != KCSETA) {
        !           230:                u.u_error = EINVAL;
        !           231:                return;
        !           232:        }
        !           233:        if (copyin(arg, &kk, sizeof(kk))) {
        !           234:                u.u_error = EFAULT;
        !           235:                return;
        !           236:        }
        !           237:        tp = &kmc[dev];
        !           238:        kp = tp->k_addr;
        !           239:        switch (kk.kmd) {
        !           240:        case KMCLR:
        !           241:        case KRESET:
        !           242:                spl7();
        !           243:                kp->bsel1 = MCLR;
        !           244:                spl0();
        !           245:        case KSTOP:
        !           246:                tp->k_stat &= ~SRUN;
        !           247:                kp->bsel1 = 0;
        !           248:                if (kk.kmd == KRESET) {
        !           249:                        tp->k_stat = 0;
        !           250:                        /* flush here */
        !           251:                }
        !           252:                return;
        !           253:        case KMS:
        !           254:                if (tp->k_stat&SRUN)
        !           255:                        break;
        !           256:                kp->bsel1 = ROMI|ROMO;
        !           257:                sav = kp->sel6;
        !           258:                kp->bsel1 = ROMI;
        !           259:                kp->sel6 = kk.kval;
        !           260:                kp->bsel1 = ROMI|STEP;
        !           261:                kp->bsel1 = ROMI;
        !           262:                kp->sel6 = sav;
        !           263:                kp->bsel1 = 0;
        !           264:                goto lcsr;
        !           265:        case KSTEP:
        !           266:                if (tp->k_stat&SRUN)
        !           267:                        break;
        !           268:                kp->bsel1 |= STEP;
        !           269:                kp->bsel1 = 0;
        !           270:        case KCSR:
        !           271:        lcsr:
        !           272:                csr[0] = kp->sel0;
        !           273:                csr[1] = kp->sel2;
        !           274:                csr[2] = kp->sel4;
        !           275:                csr[3] = kp->sel6;
        !           276:                if (copyout(csr, kk.kcsr, sizeof csr))
        !           277:                        u.u_error = EFAULT;
        !           278:                return;
        !           279:        case KWRCR:
        !           280:                if (tp->k_stat&SRINT)
        !           281:                        break;
        !           282:                kp->sel6 = kk.kval;
        !           283:                return;
        !           284:        case KRUN:
        !           285:                if (tp->k_stat&SRUN)
        !           286:                        break;
        !           287:                tp->k_stat &= ~STYPE;
        !           288:                tp->k_stat |= (kk.kval&STYPE)|SRUN;
        !           289:                kp->bsel1 |= RUN;
        !           290:                if (tp->k_stat&SRINT) {
        !           291:                        spl5();
        !           292:                        kmc0int(dev);
        !           293:                        spl0();
        !           294:                }
        !           295:                return;
        !           296:        case KLU:
        !           297:                kp->bsel1 = kk.kval&(LUA|LUB);
        !           298:                return;
        !           299:        }
        !           300:        u.u_error = EIO;
        !           301: }
        !           302: 
        !           303: kmc0int(dev)
        !           304: {
        !           305:        register int (*p)();
        !           306: 
        !           307:        if ((p = kmc[dev].k_rint) != 0)
        !           308:                (*p)(dev);
        !           309: }
        !           310: 
        !           311: kmc1int(dev)
        !           312: {
        !           313:        register int (*p)();
        !           314: 
        !           315:        if ((p = kmc[dev].k_xint) != 0)
        !           316:                (*p)(dev);
        !           317: }

unix.superglobalmegacorp.com

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