|
|
1.1 ! root 1: /* @(#)kas1.c 1.2 */ ! 2: #undef vax ! 3: #define pdp11 1 ! 4: #include <stdio.h> ! 5: #include "a.out.h" ! 6: #include <sys/kmc.h> ! 7: #include "kas.h" ! 8: ! 9: FILE *txtfil; ! 10: int hshused; ! 11: int lineno = 1; ! 12: struct symtab *nextsym = {symtab}; ! 13: #ifdef vax ! 14: struct filehdr hdr; ! 15: struct aouthdr aout; ! 16: struct scnhdr scn; ! 17: struct syment sym; ! 18: #endif ! 19: #ifdef pdp11 ! 20: struct exec hdr; ! 21: #endif ! 22: extern char yytext[]; ! 23: ! 24: main(argc, argv) ! 25: char **argv; ! 26: { ! 27: register struct symtab *sp, *ip; ! 28: int c; ! 29: register struct symtab **hp; ! 30: int infound = 0; ! 31: ! 32: outfile = "a.out"; ! 33: while (argc > 1) { ! 34: if (argv[1][0]=='-' && argv[1][1]=='o') { ! 35: if (argc <3) { ! 36: fprintf(stderr, "missing -o file\n"); ! 37: exit(1); ! 38: } ! 39: outfile = argv[2]; ! 40: argc -= 2; ! 41: argv += 2; ! 42: continue; ! 43: } ! 44: if (argv[1][0]=='-' && argv[1][1]=='d') { ! 45: if (argc <3) { ! 46: fprintf(stderr, "missing -d file"); ! 47: exit(1); ! 48: } ! 49: dbfile = argv[2]; ! 50: dbmode++; ! 51: if ((dbfd = open(dbfile, 2))<0) { ! 52: fprintf(stderr, "can not open %s\n", dbfile); ! 53: exit(2); ! 54: } ! 55: signal(2,1); ! 56: argc -= 2; ! 57: argv += 2; ! 58: continue; ! 59: } ! 60: if (infound) { ! 61: fprintf(stderr, "too many arguments\n"); ! 62: exit(1); ! 63: } ! 64: infound++; ! 65: infile = argv[1]; ! 66: if (freopen(infile, "r", stdin) == NULL) { ! 67: fprintf(stderr, "can not open %s\n", infile); ! 68: exit(2); ! 69: } ! 70: argc--; ! 71: argv++; ! 72: } ! 73: for (ip=instab; ip->name[0]!=0; ip++) { ! 74: register char *p1, *p2; ! 75: for (p1=ip->name,p2=yytext; p2<yytext+NCPS;) ! 76: *p2++ = *p1++; ! 77: *p2++ = 0; ! 78: hp = lookup(0); ! 79: if (*hp==NULL) { ! 80: *hp = ip; ! 81: } ! 82: } ! 83: yytext[0] = '.'; yytext[1] = '\0'; ! 84: dot = *lookup(1); ! 85: yyparse(); ! 86: if (dbmode) ! 87: exit(0); ! 88: txtfil = fopen(outfile, "w"); ! 89: if (txtfil==NULL) { ! 90: fprintf(stderr, "can not create %s\n", outfile); ! 91: exit(1); ! 92: } ! 93: #ifdef vax ! 94: hdr.f_magic = VAXROMAGIC; ! 95: hdr.f_nscns = 2; ! 96: aout.magic = 0410; ! 97: aout.tsize = tsize*2; ! 98: aout.dsize = (dsize+1)&~1; ! 99: aout.bsize = 0; ! 100: hdr.f_timdat = time(NULL); ! 101: hdr.f_symptr = sizeof(struct filehdr) ! 102: + (2 * sizeof(struct scnhdr)) ! 103: + sizeof(struct aouthdr) ! 104: + aout.tsize ! 105: + aout.dsize ; ! 106: hdr.f_nsyms = nextsym-symtab; ! 107: hdr.f_opthdr = sizeof(struct aouthdr); ! 108: hdr.f_flags = F_AR32WR|F_LNNO|F_RELFLG; ! 109: fwrite(&hdr, sizeof hdr, 1, txtfil); ! 110: fwrite(&aout, sizeof aout, 1, txtfil); ! 111: strncpy(scn.s_name,_TEXT,sizeof(scn.s_name)); ! 112: scn.s_size = aout.tsize; ! 113: scn.s_scnptr = sizeof(struct filehdr) + sizeof(struct aouthdr) + ! 114: (2 * sizeof(struct scnhdr)); ! 115: fwrite(&scn, sizeof scn, 1, txtfil); ! 116: strncpy(scn.s_name,_DATA,sizeof(scn.s_name)); ! 117: scn.s_size = aout.dsize; ! 118: scn.s_scnptr += aout.tsize; ! 119: fwrite(&scn, sizeof scn, 1, txtfil); ! 120: fwrite(ispace, aout.tsize, 1, txtfil); ! 121: fwrite(dspace, aout.dsize, 1, txtfil); ! 122: #endif ! 123: #ifdef pdp11 ! 124: hdr.a_magic = 0410; ! 125: hdr.a_text = tsize*2; ! 126: hdr.a_data = (dsize+1)&~1; ! 127: hdr.a_syms = (int)nextsym-(int)symtab; ! 128: hdr.a_flag = 1; ! 129: fwrite(&hdr, sizeof hdr, 1, txtfil); ! 130: fwrite(ispace, hdr.a_text, 1, txtfil); ! 131: fwrite(dspace, hdr.a_data, 1, txtfil); ! 132: #endif ! 133: for (sp=symtab; sp<nextsym; sp++) { ! 134: #ifdef pdp11 ! 135: sp->type >>= 12; ! 136: #endif ! 137: #ifdef vax ! 138: strncpy(sym.n_name, sp->name, SYMNMLEN); ! 139: sym.n_value = sp->value; ! 140: if (sp->type == XTEXT) ! 141: sym.n_scnum = 1; ! 142: else ! 143: sym.n_scnum = 2; ! 144: sym.n_sclass = C_EXT; ! 145: fwrite(&sym, 1, SYMESZ, txtfil); ! 146: #endif ! 147: if (sp->type == XUNDEF) ! 148: fprintf(stderr, "%.8s undefined\n", sp->name); ! 149: } ! 150: #ifdef pdp11 ! 151: fwrite(symtab, sizeof(symtab[0]), nextsym-symtab, txtfil); ! 152: #endif ! 153: exit(anyerrs!=0); ! 154: } ! 155: ! 156: struct symtab ** ! 157: lookup(instflg) ! 158: { ! 159: int ihash; ! 160: register struct symtab **hp; ! 161: register char *p1, *p2; ! 162: ! 163: ihash = 0; ! 164: p1 = yytext; ! 165: while (*p1) { ! 166: ihash <<= 1; ! 167: ihash += *p1++; ! 168: } ! 169: ihash &= 077777; ! 170: while (p1<yytext+NCPS) ! 171: *p1++ = 0; ! 172: hp = &hshtab[ihash%NHASH]; ! 173: while (*hp) { ! 174: p2 = (*hp)->name; ! 175: for (p1=yytext; p1<yytext+NCPS;) ! 176: if (*p1++ != *p2++) ! 177: goto no; ! 178: return(hp); ! 179: no: ! 180: if (++hp >= &hshtab[NHASH]) ! 181: hp = hshtab; ! 182: } ! 183: if(++hshused >= NHASH) { ! 184: yyerror("Symbol table overflow"); ! 185: exit(2); ! 186: } ! 187: if (instflg) { ! 188: for (p1=yytext,p2=nextsym->name; p1<yytext+NCPS;) ! 189: *p2++ = *p1++; ! 190: *hp = nextsym++; ! 191: } ! 192: return(hp); ! 193: } ! 194: ! 195: cksrc(s, d) ! 196: { ! 197: switch(d&(7<<8)) { ! 198: case DSTREGH: ! 199: case DSTREGL: ! 200: case DSTREG: ! 201: case DSTBREG: ! 202: if ((s&017) != (d&017)) { ! 203: yyerror("illegal source"); ! 204: return(d); ! 205: } ! 206: } ! 207: return(s|d); ! 208: } ! 209: ! 210: ckreg(s, d) ! 211: { ! 212: switch(d&(7<<8)) { ! 213: case DSTREGH: ! 214: case DSTREGL: ! 215: if ((s&017) != 0) { ! 216: yyerror("illegal source"); ! 217: return(d); ! 218: } ! 219: break; ! 220: case DSTREG: ! 221: case DSTBREG: ! 222: if ((s&017) != (d&017)) { ! 223: yyerror("illegal source"); ! 224: return(d); ! 225: } ! 226: } ! 227: return(s|d); ! 228: } ! 229: ! 230: ckdst(a, b) ! 231: { ! 232: if ((a&DSTMARI) && (b&DSTMARI)) { ! 233: yyerror("illegal destination"); ! 234: return(a); ! 235: } ! 236: if ((a&DSTBREG) && (b&DSTBREG)) { ! 237: if ((((a&DSTBREG)!=DSTBRG) || ((b&DSTBREG)!=DSTREG)) ! 238: && (((b&DSTBREG)!=DSTBRG) || ((a&DSTBREG)!=DSTREG))) { ! 239: yyerror("illegal destination"); ! 240: return(a); ! 241: } ! 242: } ! 243: return(a|b); ! 244: } ! 245: ! 246: putins(ins) ! 247: { ! 248: char csr[8]; ! 249: register p; ! 250: ! 251: p = dot->value++; ! 252: if (dot->value==NKMCI) { ! 253: dot->value = 0; ! 254: } ! 255: if ((p&01777)==01777) { ! 256: yyerror("warning: text 1k boundary crossing"); ! 257: } ! 258: if (dbmode) { ! 259: if (reloc[p]&RLCBR) { ! 260: yyerror("undefined trace instruction"); ! 261: reloc[p] = 0; ! 262: return; ! 263: } ! 264: if (ksty(KMS, csr, ins)==0) ! 265: fprintf(stdout, "%4o%4o%4o%4o%7o\n", ! 266: csr[2]&0377,csr[3]&0377,csr[4]&0377,csr[5]&0377,ins); ! 267: return; ! 268: } ! 269: if (reloc[p]&RLUSE) { ! 270: yyerror("text location redefined"); ! 271: return; ! 272: } ! 273: ispace[p] = ins; ! 274: reloc[p] |= RLUSE; ! 275: if (++p>tsize) ! 276: tsize = p; ! 277: } ! 278: ! 279: putdat(ins) ! 280: { ! 281: register p; ! 282: ! 283: p = dot->value++; ! 284: if (dot->value==NKMCD) ! 285: dot->value = 0; ! 286: if (dbmode) { ! 287: lseek(dbfd, (long)(p+NKMCI*2), 0); ! 288: write(dbfd, &ins, 1); ! 289: return; ! 290: } ! 291: if (dspace[p]) { ! 292: yyerror("data location redefined"); ! 293: return; ! 294: } ! 295: dspace[p] = ins; ! 296: if (++p>dsize) ! 297: dsize = p; ! 298: } ! 299: ! 300: backup(sp, val) ! 301: register struct symtab *sp; ! 302: { ! 303: register backp, next; ! 304: ! 305: for (backp = sp->value; backp; backp = (reloc[next]&RLBUP)) { ! 306: next = backp&RLNEXT; ! 307: switch(backp&RLCMASK) { ! 308: case RLCBR: ! 309: if ((next&~01777) != (val&~01777)) ! 310: yyerror("forward branch error"); ! 311: ispace[next] |= (val&01400)<<3; ! 312: case RLCMV: ! 313: ispace[next] |= val&0377; ! 314: break; ! 315: case RLCPOP: ! 316: ispace[next] |= (val>>8)&0377; ! 317: break; ! 318: case RLCPG: ! 319: ispace[next] |= (val&01400)<<3; ! 320: break; ! 321: } ! 322: } ! 323: sp->value = val; ! 324: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.