|
|
1.1 ! root 1: /* a6 -- pdp-11 assembler pass 1 */ ! 2: #include "as1.h" ! 3: ! 4: opline(op) ! 5: OP op; ! 6: { ! 7: struct expr x; ! 8: register int t,len; ! 9: ! 10: if (ISCHAR(op)) { ! 11: if (op.v=='<') goto opl17; ! 12: xpr: ! 13: expres(op); *dot+=2; return; ! 14: } ! 15: t=op.xp->typ; ! 16: if (t==T_REG || t<T_FLOPD || t>T_JXX) goto xpr; ! 17: op=readop(); ! 18: switch (t) { ! 19: case T_REG: ! 20: case T_ESTTXT: ! 21: case T_ESTDAT: ! 22: goto xpr; ! 23: ! 24: case T_JBR: len=4; goto jxx; ! 25: case T_JXX: len=6; ! 26: jxx: ! 27: x=expres(op); ! 28: if (*dotrel==x.typ && ((t=x.val - *dot)<0 && t>=-0376)) len=2; ! 29: *dot+=len; ! 30: return; ! 31: ! 32: case T_MUL: ! 33: case T_MOVF: ! 34: case T_DOUBLE: ! 35: case T_FLOPD: ! 36: case T_FLOPF: ! 37: case T_JSR: ! 38: addres(); if (!LAST(',')) {errora(); return;} ! 39: op=readop(); ! 40: ! 41: case T_SINGLE: ! 42: addres(); *dot+=2; return; ! 43: ! 44: case T_SOB: ! 45: expres(op); if (!LAST(',')) errora(); ! 46: op=readop(); ! 47: ! 48: case T_BRANCH: ! 49: case T_RTS: ! 50: case T_SYS: ! 51: expres(op); *dot+=2; return; ! 52: ! 53: case T_BYTE: ! 54: for (;;) { ! 55: expres(op); (*dot)++; if (!LAST(',')) break; ! 56: op=readop(); ! 57: } ! 58: return; ! 59: ! 60: case T_STRING: ! 61: opl17: ! 62: *dot+=numval; readop(); return; ! 63: ! 64: case T_EVEN: ! 65: (*dot)++; *dot&=~1; return; ! 66: ! 67: case T_IF: ! 68: x=expres(op); if (x.typ!=T_ABS) error('U'); ! 69: if (x.val==0) ifflg++; ! 70: case T_ENDIF: ! 71: return; ! 72: ! 73: case T_GLOBL: ! 74: for (;;) { ! 75: if (ISCHAR(op)) break; ! 76: op.xp->typ |= T_EXTERN; ! 77: op=readop(); if (!LAST(',')) break; ! 78: op=readop(); ! 79: } ! 80: return; ! 81: ! 82: case T__TEXT: ! 83: case T__DATA: ! 84: case T__BSS: ! 85: savdot[*dotrel-T_TEXT] = *dot; ! 86: *dot = savdot[t-T__TEXT]; ! 87: *dotrel = t-T__TEXT+T_TEXT; ! 88: return; ! 89: ! 90: case T_COMM: ! 91: if (ISCHAR(op)) {error('x'); return;} ! 92: op.xp->typ |= T_EXTERN; ! 93: op=readop(); ! 94: if (!LAST(',')) {error('x'); return;} ! 95: expres(readop()); ! 96: return; ! 97: } ! 98: } ! 99: ! 100: addres() ! 101: { ! 102: register int t; ! 103: struct expr x; ! 104: ! 105: if (LAST('(')) { ! 106: x=expres(readop()); chkreg(&x); chkrp(); ! 107: if (!LAST('+')) return(2); ! 108: readop(); ! 109: return(0); ! 110: } else if (LAST('-')) { ! 111: readop(); ! 112: if (!LAST('(')) { ! 113: savop=lastop; lastop.v='-'; /* fall through to end of else-if */ ! 114: } else { ! 115: x=expres(readop()); chkreg(&x); chkrp(); ! 116: return(0); ! 117: } ! 118: } else if (LAST('$')) { ! 119: expres(readop()); *dot+=2; return(0); ! 120: } else if (LAST('*')) { ! 121: readop(); if (LAST('*')) error('*'); ! 122: *dot+=(t=addres()); ! 123: return(t); ! 124: } ! 125: x=expres(lastop); ! 126: if (LAST('(')) { ! 127: x=expres(readop()); chkreg(&x); chkrp(); ! 128: *dot+=2; return(0); ! 129: } ! 130: if (x.typ==T_REG) { ! 131: chkreg(&x); return(0); ! 132: } ! 133: *dot+=2; ! 134: return(0); ! 135: } ! 136: ! 137: errora() ! 138: { ! 139: error('a'); ! 140: } ! 141: ! 142: chkreg(p) ! 143: register struct expr *p; ! 144: { ! 145: if (((unsigned)p->val)>7 || (p->typ!=T_ABS && ((unsigned)p->typ)<=T_BSS)) ! 146: errora(); ! 147: } ! 148: ! 149: errore() ! 150: { ! 151: error('e'); ! 152: } ! 153: ! 154: chkrp() ! 155: { ! 156: if (!LAST(')')) {error(')'); return;} ! 157: readop(); ! 158: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.