|
|
1.1 ! root 1: head 1.3; ! 2: access ; ! 3: symbols ; ! 4: locks bin:1.3; ! 5: comment @ * @; ! 6: ! 7: ! 8: 1.3 ! 9: date 91.02.06.21.08.02; author bin; state Exp; ! 10: branches ; ! 11: next 1.2; ! 12: ! 13: 1.2 ! 14: date 91.02.06.20.43.59; author bin; state Exp; ! 15: branches ; ! 16: next 1.1; ! 17: ! 18: 1.1 ! 19: date 91.02.06.20.43.51; author bin; state Exp; ! 20: branches ; ! 21: next ; ! 22: ! 23: ! 24: desc ! 25: @steve 2/6/91 ! 26: Initial MWC RCS revision. ! 27: @ ! 28: ! 29: ! 30: 1.3 ! 31: log ! 32: @steve 2/6/91 ! 33: Changed bogus condition in if command (lines 239ff.) ! 34: so that the -x flag strips local symbols from object as advertised. ! 35: @ ! 36: text ! 37: @/* ! 38: * Output routines. ! 39: * Intel iAPX-86. ! 40: * Small model. ! 41: */ ! 42: #include <canon.h> ! 43: #include "asm.h" ! 44: ! 45: #define NTXT 128 ! 46: #define NREL 128 ! 47: ! 48: #define outlst(b) { if (cp < &cb[NCODE]) *cp++ = (b); } ! 49: ! 50: address txtla; ! 51: long crbase; ! 52: long crseek; ! 53: struct ldheader ldh; ! 54: struct loc *txtlp; ! 55: char txt[NTXT]; ! 56: char rel[NREL]; ! 57: char *txtp = { txt }; ! 58: char *relp = { rel }; ! 59: ! 60: outab(b) ! 61: { ! 62: if (pass == 2) { ! 63: if (inbss) ! 64: serr(); ! 65: else { ! 66: outlst(b); ! 67: outchk(1, 0); ! 68: *txtp++ = fbyte(b); ! 69: } ! 70: } ! 71: ++dot->s_addr; ! 72: } ! 73: ! 74: outaw(w) ! 75: { ! 76: if (pass == 2) { ! 77: if (inbss) ! 78: serr(); ! 79: else { ! 80: outlst(fbyte(w)); ! 81: outlst(sbyte(w)); ! 82: outchk(2, 0); ! 83: *txtp++ = fbyte(w); ! 84: *txtp++ = sbyte(w); ! 85: } ! 86: } ! 87: dot->s_addr += 2; ! 88: } ! 89: ! 90: outrb(esp, pcrf) ! 91: register struct expr *esp; ! 92: { ! 93: register address a; ! 94: register n; ! 95: int t; ! 96: ! 97: if (pass == 2) { ! 98: if (inbss) ! 99: serr(); ! 100: else { ! 101: t = esp->e_type; ! 102: if (t==E_AREG || t==E_ASEG) ! 103: t = E_ACON; ! 104: a = esp->e_addr; ! 105: if (pcrf) ! 106: a -= dot->s_addr+1; ! 107: outlst(fbyte(a)); ! 108: if (t == E_ACON) { ! 109: n = 0; ! 110: if (pcrf) ! 111: n = 3; ! 112: outchk(1, n); ! 113: *txtp++ = fbyte(a); ! 114: if (pcrf) { ! 115: *relp++ = LR_BYTE|LR_PCR|L_ABS; ! 116: *relp++ = fbyte(dot->s_addr); ! 117: *relp++ = sbyte(dot->s_addr); ! 118: } ! 119: } else { ! 120: n = 3; ! 121: if (t == E_SYM) ! 122: n = 5; ! 123: outchk(1, n); ! 124: *txtp++ = fbyte(a); ! 125: n = LR_BYTE; ! 126: if (pcrf) ! 127: n |= LR_PCR; ! 128: if (t == E_SYM) ! 129: n |= L_SYM; ! 130: else ! 131: n |= esp->e_base.e_lp->l_seg; ! 132: *relp++ = n; ! 133: *relp++ = fbyte(dot->s_addr); ! 134: *relp++ = sbyte(dot->s_addr); ! 135: if (t == E_SYM) { ! 136: n = esp->e_base.e_sp->s_ref; ! 137: *relp++ = fbyte(n); ! 138: *relp++ = sbyte(n); ! 139: } ! 140: } ! 141: } ! 142: } ! 143: ++dot->s_addr; ! 144: } ! 145: ! 146: outrw(esp, pcrf) ! 147: register struct expr *esp; ! 148: { ! 149: register address a; ! 150: register n; ! 151: int t; ! 152: ! 153: if (pass == 2) { ! 154: if (inbss) ! 155: serr(); ! 156: else { ! 157: t = esp->e_type; ! 158: if (t==E_AREG || t==E_ASEG) ! 159: t = E_ACON; ! 160: a = esp->e_addr; ! 161: if (pcrf) ! 162: a -= dot->s_addr+2; ! 163: outlst(fbyte(a)); ! 164: outlst(sbyte(a)); ! 165: if (t == E_ACON) { ! 166: n = 0; ! 167: if (pcrf) ! 168: n = 3; ! 169: outchk(2, n); ! 170: *txtp++ = fbyte(a); ! 171: *txtp++ = sbyte(a); ! 172: if (pcrf) { ! 173: *relp++ = LR_WORD|LR_PCR|L_ABS; ! 174: *relp++ = fbyte(dot->s_addr); ! 175: *relp++ = sbyte(dot->s_addr); ! 176: } ! 177: } else { ! 178: n = 3; ! 179: if (t == E_SYM) ! 180: n = 5; ! 181: outchk(2, n); ! 182: *txtp++ = fbyte(a); ! 183: *txtp++ = sbyte(a); ! 184: n = LR_WORD; ! 185: if (pcrf) ! 186: n |= LR_PCR; ! 187: if (t == E_SYM) ! 188: n |= L_SYM; ! 189: else ! 190: n |= esp->e_base.e_lp->l_seg; ! 191: *relp++ = n; ! 192: *relp++ = fbyte(dot->s_addr); ! 193: *relp++ = sbyte(dot->s_addr); ! 194: if (t == E_SYM) { ! 195: n = esp->e_base.e_sp->s_ref; ! 196: *relp++ = fbyte(n); ! 197: *relp++ = sbyte(n); ! 198: } ! 199: } ! 200: } ! 201: } ! 202: dot->s_addr += 2; ! 203: } ! 204: ! 205: /* ! 206: * Make sure there is room in ! 207: * the buffers for `nt' bytes worth ! 208: * text and `nr' bytes of rel. ! 209: * If not, write the buffers out ! 210: * to the file. ! 211: */ ! 212: outchk(nt, nr) ! 213: { ! 214: register unsigned n; ! 215: register tn; ! 216: long ts; ! 217: ! 218: if (txtp+nt>&txt[NTXT] || relp+nr>&rel[NREL]) { ! 219: if ((n = txtp-txt) != 0) { ! 220: ts = txtla + sizeof(ldh); ! 221: tn = txtlp->l_seg; ! 222: if (tn > L_BSSI) { ! 223: ts -= ldh.l_ssize[L_BSSI]; ! 224: if (tn > L_BSSD) ! 225: ts -= ldh.l_ssize[L_BSSD]; ! 226: } ! 227: fseek(ofp, ts, 0); ! 228: xwrite(txt, sizeof(char), n); ! 229: if ((n = relp-rel) != 0) { ! 230: fseek(ofp, crseek, 0); ! 231: xwrite(rel, sizeof(char), n); ! 232: crseek += n; ! 233: relp = rel; ! 234: } ! 235: } ! 236: txtp = txt; ! 237: } ! 238: if (txtp == txt) { ! 239: txtla = dot->s_addr; ! 240: txtlp = dot->s_base.s_lp; ! 241: } ! 242: } ! 243: ! 244: outinit() ! 245: { ! 246: register struct loc *lp; ! 247: register struct sym *sp; ! 248: register i; ! 249: struct ldsym lds; ! 250: int rn; ! 251: long sb, ss; ! 252: ! 253: ldh.l_magic = L_MAGIC; ! 254: ldh.l_flag = 0; ! 255: ldh.l_machine = M_8086; ! 256: ldh.l_entry = 0; ! 257: sb = sizeof(ldh); ! 258: for (i=0; i<nloc; ++i) { ! 259: ss = 0; ! 260: lp = loc[i]; ! 261: while (lp != NULL) { ! 262: ss += locrup(lp->l_break); ! 263: lp = lp->l_lp; ! 264: } ! 265: ldh.l_ssize[i] = ss; ! 266: if (i!=L_BSSI && i!=L_BSSD) ! 267: sb += ss; ! 268: } ! 269: fseek(ofp, sb, 0); ! 270: ss = 0; ! 271: rn = 0; ! 272: for (i=0; i<NHASH; ++i) { ! 273: sp = symhash[i]; ! 274: while (sp != NULL) { ! 275: if (((sp->s_flag&S_SYMT) != 0) ! 276: && ((xflag == 0) || ((sp->s_flag&S_GBL) != 0))) { ! 277: sp->s_ref = rn++; ! 278: symcopy(lds.ls_id, sp->s_id); ! 279: if (sp->s_kind == S_NEW) ! 280: lds.ls_type = L_REF; ! 281: else if (sp->s_type != E_DIR) ! 282: lds.ls_type = L_ABS; ! 283: else ! 284: lds.ls_type = sp->s_base.s_lp->l_seg; ! 285: if ((sp->s_flag&S_GBL) != 0) ! 286: lds.ls_type |= L_GLOBAL; ! 287: lds.ls_addr = sp->s_addr; ! 288: xwrite(&lds, sizeof(lds), 1); ! 289: ss += sizeof(lds); ! 290: } ! 291: sp = sp->s_sp; ! 292: } ! 293: } ! 294: ldh.l_ssize[L_SYM] = ss; ! 295: crseek = sb+ss; ! 296: crbase = crseek; ! 297: } ! 298: ! 299: /* ! 300: * Finish up l.out ! 301: */ ! 302: outfinish() ! 303: { ! 304: register int i; ! 305: ! 306: ldh.l_ssize[L_REL] = crseek-crbase; ! 307: canint(ldh.l_magic); ! 308: canint(ldh.l_flag); ! 309: canint(ldh.l_machine); ! 310: canvaddr(ldh.l_entry); ! 311: for (i=0; i<NLSEG; i++) ! 312: cansize(ldh.l_ssize[i]); ! 313: fseek(ofp, (long)0, 0); ! 314: xwrite(&ldh, sizeof(ldh), 1); ! 315: fclose(ofp); ! 316: } ! 317: ! 318: /* ! 319: * Write code file. ! 320: * Check for any errors. ! 321: */ ! 322: xwrite(p, s, n) ! 323: char *p; ! 324: { ! 325: if (fwrite(p, s, n, ofp) != n) { ! 326: fprintf(stderr, "%s: I/O error.\n", ofn); ! 327: exit(1); ! 328: } ! 329: } ! 330: @ ! 331: ! 332: ! 333: 1.2 ! 334: log ! 335: @steve 2/6/91 ! 336: Descriptive error messages. ! 337: @ ! 338: text ! 339: @d239 2 ! 340: a240 4 ! 341: if ((sp->s_flag&S_SYMT) != 0 ! 342: && (xflag == 0 ! 343: || (sp->s_flag&S_GBL) != 0 ! 344: || sp->s_id[0] != 'L')) { ! 345: @ ! 346: ! 347: ! 348: 1.1 ! 349: log ! 350: @Initial revision ! 351: @ ! 352: text ! 353: @d28 1 ! 354: a28 1 ! 355: err('s'); ! 356: d42 1 ! 357: a42 1 ! 358: err('s'); ! 359: d63 1 ! 360: a63 1 ! 361: err('s'); ! 362: d119 1 ! 363: a119 1 ! 364: err('s'); ! 365: @
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.