Annotation of 3BSD/cmd/as/ascode.c, revision 1.1

1.1     ! root        1: /* Copyright (c) 1979 Regents of the University of California */
        !             2: #include <stdio.h>
        !             3: #include "as.h"
        !             4: #include "assyms.h"
        !             5: 
        !             6: insout(op, ap, nact)
        !             7:        struct arg *ap;
        !             8: {
        !             9:        int jxxflg;
        !            10: 
        !            11:        op &= 0xFF;
        !            12:        jxxflg = nact;
        !            13:        if (nact < 0)
        !            14:                nact = -nact;
        !            15:        if (passno!=2) {
        !            16:                register struct arg     *ap2;
        !            17:                register struct instab  *ip;
        !            18:                int                     i,nexp;
        !            19:                ip = itab[op];
        !            20:                nexp = ip->nargs;
        !            21:                if (nact < nexp)
        !            22:                        yyerror("Too few arguments");
        !            23:                if (nact > nexp) {
        !            24:                        yyerror("Too many arguments");
        !            25:                        nact = nexp;
        !            26:                }
        !            27:                /*
        !            28:                 *      Check argument compatability with instruction template
        !            29:                 */
        !            30:                for (ap2 = ap+nact, i = nact; --i >= 0;)
        !            31:                        argcompat(--ap2, ip->argtype[i], i);
        !            32:        }
        !            33:        if (jxxflg < 0)
        !            34:                ijxout(op, ap, nact);
        !            35:        else putins(op, ap, nact);
        !            36: }
        !            37: 
        !            38: argcompat(act, exp, i)
        !            39:        struct arg *act;
        !            40:        int exp,i;
        !            41: {
        !            42:        register        at,atm;
        !            43: 
        !            44:        at = act->atype;
        !            45:        atm = at & AMASK;
        !            46: 
        !            47:        if ((exp & ACCA) && (atm == AREG)) {
        !            48:                yyerror("arg %d, addressing a register",i);
        !            49:                return;
        !            50:        }
        !            51:        if ((exp&ACCW) && (atm==AIMM) && !(at&ASTAR)) {
        !            52:                yyerror("arg %d, modifying a constant",i);
        !            53:                return;
        !            54:        }
        !            55:        if (at & AINDX) {
        !            56:                if (act->areg2==017) {
        !            57:                        yyerror("arg %d, PC used as index",i);
        !            58:                        return;
        !            59:                }
        !            60:                if (atm==AREG) {
        !            61:                        yyerror("arg %d, indexing the register file",i);
        !            62:                        return;
        !            63:                }
        !            64:                if (atm==AIMM) {
        !            65:                        yyerror("arg %d, indexing a constant",i);
        !            66:                        return;
        !            67:                }
        !            68:                if (((atm==ADECR) || (atm==AINCR)) && (act->areg1==act->areg2)) {
        !            69:                        yyerror("arg %d, indexing with modified register",i);
        !            70:                        return;
        !            71:                }
        !            72:        }
        !            73: }
        !            74: 
        !            75: int d124 =     {4};
        !            76: int len124[] =         {0,LEN1,LEN2,0,LEN4};
        !            77: char mod124[] = {0,0x00,0x20,0,0x40};
        !            78: 
        !            79: putins(op, ap, n)
        !            80:        /*
        !            81:         *      n had better be positive
        !            82:         */
        !            83:        register struct arg *ap;
        !            84: {
        !            85:        register struct exp     *xp;
        !            86:        register int            a;
        !            87:        int                     i,xtrab;
        !            88: 
        !            89:        if (passno!=2) {
        !            90:                dotp->xvalue += n+1;    /* 1 for the opcode, at least 1 per arg */
        !            91:                for (i=0; i<n; i++,ap++) {/* some args take more than 1 byte */
        !            92:                        a=ap->atype;
        !            93:                        if (a & AINDX)
        !            94:                                dotp->xvalue++;
        !            95:                        switch (a&~(AINDX|ASTAR)) {
        !            96:                                case AEXP: {
        !            97:                                        a = itab[op]->argtype[i];
        !            98:                                        if (a == ACCB+TYPB)
        !            99:                                                break;
        !           100:                                        if (a==ACCB+TYPW){
        !           101:                                                dotp->xvalue++;
        !           102:                                                break;
        !           103:                                        }
        !           104:                                        dotp->xvalue += ap->dispsize;
        !           105:                                        break;
        !           106:                                }
        !           107:                                case ADISP: {
        !           108:                                        xp=ap->xp;
        !           109:                                        if ((xp->xtype&XTYPE)!=XABS || xp->xtype&XFORW){
        !           110:                                                dotp->xvalue += ap->dispsize;
        !           111:                                                break;
        !           112:                                        }
        !           113:                                        if (xp->xvalue==0 && !(a&ASTAR))
        !           114:                                                break;
        !           115:                                        dotp->xvalue++;
        !           116:                                        if ((xp->xvalue<MINBYTE) || (xp->xvalue>MAXBYTE))
        !           117:                                                dotp->xvalue++;
        !           118:                                        if ((xp->xvalue<MINWORD) || (xp->xvalue>MAXWORD))
        !           119:                                                dotp->xvalue += 2;
        !           120:                                        break;
        !           121:                                }
        !           122:                                case AIMM: {
        !           123:                                        if (ap->atype&ASTAR) a=TYPL;
        !           124:                                        else {
        !           125:                                                xp = ap->xp;
        !           126:                                                if ((xp->xtype&XTYPE)==XABS && !(xp->xtype&XFORW)
        !           127:                                                        && xp->xvalue>=0 && xp->xvalue<=63) 
        !           128:                                                                break;
        !           129:                                                a = itab[op]->argtype[i];
        !           130:                                                if (a&ACCA)
        !           131:                                                        a = TYPL;
        !           132:                                                else
        !           133:                                                        a &= TYPMASK;
        !           134:                                        }
        !           135:                                        switch (a) {
        !           136:                                                case TYPD:
        !           137:                                                case TYPF:
        !           138:                                                        if (slitflt(xp))
        !           139:                                                                break;
        !           140:                                                        if (a==TYPF)
        !           141:                                                                dotp->xvalue -= 4;
        !           142:                                                case TYPQ: 
        !           143:                                                        dotp->xvalue += 4;
        !           144:                                                case TYPL:
        !           145:                                                        dotp->xvalue += 2;
        !           146:                                                case TYPW: 
        !           147:                                                        dotp->xvalue++;
        !           148:                                                case TYPB: 
        !           149:                                                        dotp->xvalue++;
        !           150:                                        }       /*end of the switch on a*/
        !           151:                                }       /*end of case AIMM*/
        !           152:                        }       /*end of the switch on the type*/
        !           153:                }       /*end of looping for all arguments*/
        !           154:                return;
        !           155:        }       /*end of it being time for pass 1*/
        !           156:        /*
        !           157:         *      PASS2 HERE
        !           158:         */
        !           159: 
        !           160:        outb(op); /* the opcode */
        !           161:        for (i=0; i<n; i++,ap++) {/* now for the arguments */
        !           162:                a=ap->atype;
        !           163:                xp=ap->xp;
        !           164:                xtrab=0;
        !           165:                if (a&AINDX) {
        !           166:                        { outb(0x40 | ap->areg2); }
        !           167:                        a &= ~AINDX;
        !           168:                }
        !           169:                if (a&ASTAR) {
        !           170:                        ap->areg1 |= 0x10;
        !           171:                        a &= ~ASTAR;
        !           172:                }
        !           173:                switch (a) {
        !           174:                        case AREG:              /* %r */
        !           175:                                ap->areg1 |= 0x50;
        !           176:                                break; 
        !           177:                        case ABASE:             /* (%r) */
        !           178:                                ap->areg1 |= 0x60;
        !           179:                                break; 
        !           180:                        case ADECR:             /* -(%r) */
        !           181:                                ap->areg1 |= 0x70;
        !           182:                                break; 
        !           183:                        case AINCR:             /* (%r) */
        !           184:                                ap->areg1 |= 0x80;
        !           185:                                break;
        !           186:                        case AEXP: {/* expr */
        !           187:                                a = itab[op]->argtype[i];
        !           188:                                if (a == ACCB+TYPB) {
        !           189:                                        ap->areg1 = a = 
        !           190:                                                xp->xvalue - (dotp->xvalue + 1);
        !           191:                                        if (a<MINBYTE || a>MAXBYTE)
        !           192:                                                yyerror("Branch too far"); break;
        !           193:                                }
        !           194:                                if (a == ACCB+TYPW) {
        !           195:                                        ap->areg1 = a = xp->xvalue
        !           196:                                                -= dotp->xvalue + 2;
        !           197:                                        xp->xtype = XABS;
        !           198:                                        if (a<MINWORD || a>MAXWORD) 
        !           199:                                                yyerror("Branch too far");
        !           200:                                        xp->xvalue = a>>8;
        !           201:                                        xtrab = LEN1;
        !           202:                                        break;
        !           203:                                }
        !           204:                                /* reduces to expr(pc) mode */
        !           205:                                ap->areg1 |= (0xAF + mod124[ap->dispsize]);
        !           206:                                xtrab = len124[ap->dispsize]+PCREL;
        !           207:                                break;
        !           208:                        }
        !           209:                        case ADISP: {/* expr(%r) */
        !           210:                                ap->areg1 |= 0xA0;
        !           211:                                if ((xp->xtype&XTYPE)!=XABS || xp->xtype&XFORW){
        !           212:                                        ap->areg1 += mod124[ap->dispsize];
        !           213:                                        xtrab=len124[ap->dispsize];
        !           214:                                        break;
        !           215:                                }
        !           216:                                if (xp->xvalue==0 && !(ap->areg1&0x10)) {
        !           217:                                        ap->areg1 ^= 0xC0;
        !           218:                                        break;
        !           219:                                }
        !           220:                                xtrab=LEN1;
        !           221:                                if ((xp->xvalue<MINBYTE) || (xp->xvalue>MAXBYTE)){
        !           222:                                        ap->areg1 += 0x20;
        !           223:                                        xtrab=LEN2;
        !           224:                                }
        !           225:                                if ((xp->xvalue<MINWORD) || (xp->xvalue>MAXWORD)){
        !           226:                                        ap->areg1 += 0x20;
        !           227:                                        xtrab=LEN4;
        !           228:                                }
        !           229:                                break;
        !           230:                        }
        !           231:                        case AIMM: { /* $expr */
        !           232:                                if (ap->atype&ASTAR)
        !           233:                                        a=TYPL;
        !           234:                                else {
        !           235:                                        if (    ( (xp->xtype&XTYPE) == XABS) 
        !           236:                                            && !(xp->xtype&XFORW)
        !           237:                                            &&  (xp->xvalue >= 0)
        !           238:                                            &&  (xp->xvalue <= 63) ) {
        !           239:                                                ap->areg1 = xp->xvalue;
        !           240:                                                break;
        !           241:                                        }
        !           242:                                        a = itab[op]->argtype[i];
        !           243:                                        if (a&ACCA)
        !           244:                                                a=TYPL;
        !           245:                                        else
        !           246:                                                a &= TYPMASK;
        !           247:                                }
        !           248:                                ap->areg1 |= 0x8F;
        !           249:                                switch (a) {
        !           250:                                        case TYPD:
        !           251:                                        case TYPF:
        !           252:                                                if (slitflt(xp)){
        !           253:                                                        ap->areg1=extlitflt(xp);
        !           254:                                                        break;
        !           255:                                                }
        !           256:                                                if (a==TYPF) { 
        !           257:                                                        xtrab = LEN4;
        !           258:                                                        break;
        !           259:                                                }
        !           260:                                        case TYPQ: xtrab = LEN8; break;
        !           261:                                        case TYPL: xtrab = LEN4; break;
        !           262:                                        case TYPW: xtrab = LEN2; break;
        !           263:                                        case TYPB: xtrab = LEN1; break;
        !           264:                                }
        !           265:                        }       /*end of the switch on AIMM*/
        !           266:                }       /*end of the switch on a*/
        !           267:                /*
        !           268:                 *      use the first byte to describe the argument
        !           269:                 */
        !           270:                outb(ap->areg1);
        !           271:                if (xtrab) 
        !           272:                        outrel(&xp->xvalue, xtrab, xp->xtype, xp->xname);
        !           273:        }       /*end of the for to pick up all arguments*/
        !           274: }

unix.superglobalmegacorp.com

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