Annotation of researchv8dc/sys/boot/stand/ut.c, revision 1.1

1.1     ! root        1: /*     ut.c    4.3     82/03/26        */
        !             2: 
        !             3: /*
        !             4:  * SI Model 9700 -- emulates TU45 on the UNIBUS
        !             5:  */
        !             6: 
        !             7: #include <sys/param.h>
        !             8: #include <sys/inode.h>
        !             9: #include <sys/pte.h>
        !            10: #include <sys/ubareg.h>
        !            11: #include "saio.h"
        !            12: #include "savax.h"
        !            13: 
        !            14: #include <sys/utreg.h>
        !            15: 
        !            16: u_short        utstd[] = { 0172440 };          /* non-standard */
        !            17: 
        !            18: utopen(io)
        !            19:        register struct iob *io;
        !            20: {
        !            21:        register skip;
        !            22: 
        !            23:        utstrategy(io, UT_REW);
        !            24:        skip = io->i_boff;
        !            25:        while (skip--) {
        !            26:                io->i_cc = 0;
        !            27:                utstrategy(io, UT_SFORW);
        !            28:        }
        !            29: }
        !            30: 
        !            31: utclose(io)
        !            32:        register struct iob *io;
        !            33: {
        !            34:        utstrategy(io, UT_REW);
        !            35: }
        !            36: 
        !            37: #define utwait(addr)   {do word=addr->utcs1; while((word&UT_RDY)==0);}
        !            38: 
        !            39: utstrategy(io, func)
        !            40:        register struct iob *io;
        !            41: {
        !            42:        register u_short word;
        !            43:        register int errcnt;
        !            44:        register struct utdevice *addr =
        !            45:            (struct utdevice *)ubamem(io->i_unit, utstd[0]);
        !            46:        int info;
        !            47:        u_short dens;
        !            48: 
        !            49:        dens = (io->i_unit&07) | PDP11FMT | UT_PE;
        !            50:        errcnt = 0;
        !            51: retry:
        !            52:        utquiet(addr);
        !            53:        addr->uttc = dens;
        !            54:        info = ubasetup(io, 1);
        !            55:        addr->utwc = -((io->i_cc+1) >> 1);
        !            56:        addr->utfc = -io->i_cc;
        !            57:        if (func == READ) {
        !            58:                addr->utba = info;
        !            59:                addr->utcs1 = UT_RCOM | ((info>>8) & 0x30) | UT_GO;
        !            60:        } else if (func == WRITE) {
        !            61:                addr->utba = info;
        !            62:                addr->utcs1 = UT_WCOM | ((info>>8) & 0x30) | UT_GO;
        !            63:        } else if (func == UT_SREV) {
        !            64:                addr->utcs1 = UT_SREV | UT_GO;
        !            65:                return (0);
        !            66:        } else
        !            67:                addr->utcs1 = func | UT_GO;
        !            68:        utwait(addr);
        !            69:        ubafree(io, info);
        !            70:        word = addr->utds;
        !            71:        if (word&(UTDS_EOT|UTDS_TM)) {
        !            72:                addr->utcs1 = UT_CLEAR | UT_GO;
        !            73:                return(0);
        !            74:        }
        !            75:        if ((word&UTDS_ERR) || (addr->utcs1&UT_TRE)) {
        !            76:                if (errcnt == 0)
        !            77:                        printf("tj error: cs1=%b er=%b cs2=%b ds=%b",
        !            78:                                addr->utcs1, UT_BITS, addr->uter, UTER_BITS,
        !            79:                                addr->utcs2, UTCS2_BITS, word, UTDS_BITS);
        !            80:                if (errcnt == 10) {
        !            81:                        printf("\n");
        !            82:                        return(-1);
        !            83:                }
        !            84:                errcnt++;
        !            85:                if (addr->utcs1&UT_TRE)
        !            86:                        addr->utcs2 |= UTCS2_CLR;
        !            87:                addr->utcs1 = UT_CLEAR | UT_GO;
        !            88:                utstrategy(io, UT_SREV);
        !            89:                utquiet(addr);
        !            90:                if (func == WRITE) {
        !            91:                        addr->utcs1 = UT_ERASE | UT_GO;
        !            92:                        utwait(addr);
        !            93:                }
        !            94:                goto retry;
        !            95:        }
        !            96:        if (errcnt)
        !            97:                printf(" recovered by retry\n");
        !            98:        return (func == READ ?
        !            99:                io->i_cc - ((-addr->utfc) & 0xffff) : -addr->utwc << 1);
        !           100: }
        !           101: 
        !           102: utquiet(addr)
        !           103:        register struct utdevice *addr;
        !           104: {
        !           105:        register u_short word;
        !           106: 
        !           107:        utwait(addr);
        !           108:        do
        !           109:                word = addr->utds;
        !           110:        while ((word&UTDS_DRY) == 0 && (word&UTDS_PIP));
        !           111: }

unix.superglobalmegacorp.com

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