1769Speter /* Copyright (c) 1979 Regents of the University of California */ 2769Speter 3*3377Speter static char sccsid[] = "@(#)put.c 1.14 03/26/81"; 4769Speter 5769Speter #include "whoami.h" 6769Speter #include "opcode.h" 7769Speter #include "0.h" 8769Speter #include "objfmt.h" 9769Speter #ifdef PC 10769Speter # include "pc.h" 11769Speter #endif PC 12769Speter 13769Speter short *obufp = obuf; 14769Speter 15769Speter /* 16769Speter * If DEBUG is defined, include the table 17769Speter * of the printing opcode names. 18769Speter */ 19769Speter #ifdef DEBUG 20769Speter #include "OPnames.h" 21769Speter #endif 22769Speter 23769Speter #ifdef OBJ 24769Speter /* 25769Speter * Put is responsible for the interpreter equivalent of code 26769Speter * generation. Since the interpreter is specifically designed 27769Speter * for Pascal, little work is required here. 28769Speter */ 29769Speter put(a) 30769Speter { 31769Speter register int *p, i; 32769Speter register char *cp; 333077Smckusic register short *sp; 343077Smckusic register long *lp; 35769Speter int n, subop, suboppr, op, oldlc, w; 36769Speter char *string; 37769Speter static int casewrd; 38769Speter 39769Speter /* 40769Speter * It would be nice to do some more 41769Speter * optimizations here. The work 42769Speter * done to collapse offsets in lval 43769Speter * should be done here, the IFEQ etc 44769Speter * relational operators could be used 45769Speter * etc. 46769Speter */ 47769Speter oldlc = lc; 483317Speter if ( !CGENNING ) 49769Speter /* 50769Speter * code disabled - do nothing 51769Speter */ 52769Speter return (oldlc); 53769Speter p = &a; 54769Speter n = *p++; 553077Smckusic suboppr = subop = (*p >> 8) & 0377; 56769Speter op = *p & 0377; 57769Speter string = 0; 58769Speter #ifdef DEBUG 59769Speter if ((cp = otext[op]) == NIL) { 60769Speter printf("op= %o\n", op); 61769Speter panic("put"); 62769Speter } 63769Speter #endif 64769Speter switch (op) { 65769Speter case O_ABORT: 66769Speter cp = "*"; 67769Speter break; 682221Smckusic case O_AS: 692221Smckusic switch(p[1]) { 702221Smckusic case 2: 712221Smckusic op = O_AS2; 722221Smckusic break; 732221Smckusic case 4: 742221Smckusic op = O_AS4; 752221Smckusic break; 762221Smckusic case 8: 772221Smckusic op = O_AS8; 782221Smckusic break; 792221Smckusic default: 802221Smckusic goto pack; 812221Smckusic } 822221Smckusic n = 1; 833077Smckusic # ifdef DEBUG 843077Smckusic cp = otext[op]; 853077Smckusic # endif DEBUG 862221Smckusic break; 873077Smckusic case O_CONG: 883077Smckusic case O_LVCON: 893077Smckusic case O_CON: 90769Speter case O_LINO: 91769Speter case O_NEW: 92769Speter case O_DISPOSE: 93769Speter case O_IND: 94769Speter case O_OFF: 95769Speter case O_INX2: 96769Speter case O_INX4: 97769Speter case O_CARD: 98769Speter case O_ADDT: 99769Speter case O_SUBT: 100769Speter case O_MULT: 101769Speter case O_IN: 102769Speter case O_CASE1OP: 103769Speter case O_CASE2OP: 104769Speter case O_CASE4OP: 1051199Speter case O_FRTN: 106769Speter case O_WRITES: 1073173Smckusic case O_WRITEC: 108769Speter case O_WRITEF: 109769Speter case O_MAX: 110769Speter case O_MIN: 111769Speter case O_ARGV: 112769Speter case O_CTTOT: 113769Speter case O_INCT: 114769Speter case O_RANG2: 115769Speter case O_RSNG2: 116769Speter case O_RANG42: 117769Speter case O_RSNG42: 1182105Smckusic case O_SUCC2: 1192105Smckusic case O_SUCC24: 1202105Smckusic case O_PRED2: 1212105Smckusic case O_PRED24: 122769Speter if (p[1] == 0) 123769Speter break; 124769Speter case O_CON2: 125769Speter case O_CON24: 1262221Smckusic pack: 127769Speter if (p[1] < 128 && p[1] >= -128) { 128769Speter suboppr = subop = p[1]; 129769Speter p++; 130769Speter n--; 131769Speter if (op == O_CON2) { 132769Speter op = O_CON1; 1333077Smckusic # ifdef DEBUG 1343077Smckusic cp = otext[O_CON1]; 1353077Smckusic # endif DEBUG 136769Speter } 137769Speter if (op == O_CON24) { 138769Speter op = O_CON14; 1393077Smckusic # ifdef DEBUG 1403077Smckusic cp = otext[O_CON14]; 1413077Smckusic # endif DEBUG 142769Speter } 143769Speter } 144769Speter break; 145769Speter case O_CON8: 146769Speter { 147769Speter short *sp = &p[1]; 148769Speter 149769Speter #ifdef DEBUG 150769Speter if ( opt( 'k' ) ) 1513317Speter printf ( "%5d\tCON8\t%22.14e\n" , 152769Speter lc - HEADER_BYTES , 153769Speter * ( ( double * ) &p[1] ) ); 154769Speter #endif 1553077Smckusic # ifdef DEC11 1563077Smckusic word(op); 1573077Smckusic # else 1583077Smckusic word(op << 8); 1593077Smckusic # endif DEC11 160769Speter for ( i = 1 ; i <= 4 ; i ++ ) 161769Speter word ( *sp ++ ); 162769Speter return ( oldlc ); 163769Speter } 164769Speter default: 165769Speter if (op >= O_REL2 && op <= O_REL84) { 1661883Smckusic if ((i = (subop >> INDX) * 5 ) >= 30) 167769Speter i -= 30; 168769Speter else 169769Speter i += 2; 170769Speter #ifdef DEBUG 171769Speter string = &"IFEQ\0IFNE\0IFLT\0IFGT\0IFLE\0IFGE"[i]; 172769Speter #endif 173769Speter suboppr = 0; 174769Speter } 175769Speter break; 176769Speter case O_IF: 177769Speter case O_TRA: 178769Speter /***** 179769Speter codeline = 0; 180769Speter *****/ 1812184Smckusic /* relative addressing */ 1822184Smckusic p[1] -= ( unsigned ) lc + sizeof(short); 1832184Smckusic break; 184769Speter case O_FOR1U: 185769Speter case O_FOR2U: 186769Speter case O_FOR1D: 187769Speter case O_FOR2D: 188769Speter /* relative addressing */ 1892184Smckusic p[3] -= ( unsigned ) lc + 3 * sizeof(short); 190769Speter break; 191769Speter case O_CONC: 192769Speter #ifdef DEBUG 193769Speter (string = "'x'")[1] = p[1]; 194769Speter #endif 195769Speter suboppr = 0; 196769Speter op = O_CON1; 1973077Smckusic # ifdef DEBUG 1983077Smckusic cp = otext[O_CON1]; 1993077Smckusic # endif DEBUG 200769Speter subop = p[1]; 201769Speter goto around; 202769Speter case O_CONC4: 203769Speter #ifdef DEBUG 204769Speter (string = "'x'")[1] = p[1]; 205769Speter #endif 206769Speter suboppr = 0; 207769Speter op = O_CON14; 208769Speter subop = p[1]; 209769Speter goto around; 210769Speter case O_CON1: 211769Speter case O_CON14: 212769Speter suboppr = subop = p[1]; 213769Speter around: 214769Speter n--; 215769Speter break; 216769Speter case O_CASEBEG: 217769Speter casewrd = 0; 218769Speter return (oldlc); 219769Speter case O_CASEEND: 220769Speter if ((unsigned) lc & 1) { 221769Speter lc--; 222769Speter word(casewrd); 223769Speter } 224769Speter return (oldlc); 225769Speter case O_CASE1: 226769Speter #ifdef DEBUG 227769Speter if (opt('k')) 2283317Speter printf("%5d\tCASE1\t%d\n" 2293077Smckusic , lc - HEADER_BYTES, p[1]); 230769Speter #endif 231769Speter /* 232769Speter * this to build a byte size case table 233769Speter * saving bytes across calls in casewrd 234769Speter * so they can be put out by word() 235769Speter */ 236769Speter lc++; 237769Speter if ((unsigned) lc & 1) 2383077Smckusic # ifdef DEC11 2393077Smckusic casewrd = p[1] & 0377; 2403077Smckusic # else 2413077Smckusic casewrd = (p[1] & 0377) << 8; 2423077Smckusic # endif DEC11 243769Speter else { 244769Speter lc -= 2; 2453077Smckusic # ifdef DEC11 2463077Smckusic word(((p[1] & 0377) << 8) | casewrd); 2473077Smckusic # else 2483077Smckusic word((p[1] & 0377) | casewrd); 2493077Smckusic # endif DEC11 250769Speter } 251769Speter return (oldlc); 252769Speter case O_CASE2: 253769Speter #ifdef DEBUG 254769Speter if (opt('k')) 2553317Speter printf("%5d\tCASE2\t%d\n" 2563077Smckusic , lc - HEADER_BYTES , p[1]); 257769Speter #endif 2583077Smckusic word(p[1]); 259769Speter return (oldlc); 260769Speter case O_PUSH: 2613077Smckusic lp = (long *)&p[1]; 2623077Smckusic if (*lp == 0) 263769Speter return (oldlc); 2643077Smckusic if (*lp < 128 && *lp >= -128) { 2653077Smckusic suboppr = subop = *lp; 266769Speter p++; 267769Speter n--; 268769Speter break; 269769Speter } 270769Speter goto longgen; 2712184Smckusic case O_FOR4U: 2722184Smckusic case O_FOR4D: 2732184Smckusic /* relative addressing */ 2743077Smckusic p[1 + 2 * (sizeof(long) / sizeof(int))] -= 2753077Smckusic (unsigned)lc + (sizeof(short) + 2 * sizeof(long)); 2762184Smckusic goto longgen; 277769Speter case O_TRA4: 278769Speter case O_CALL: 2791199Speter case O_FSAV: 280769Speter case O_GOTO: 281769Speter case O_NAM: 282769Speter case O_READE: 283769Speter /* absolute long addressing */ 2843077Smckusic lp = (long *)&p[1]; 2853077Smckusic *lp -= HEADER_BYTES; 286769Speter goto longgen; 287769Speter case O_RV1: 288769Speter case O_RV14: 289769Speter case O_RV2: 290769Speter case O_RV24: 291769Speter case O_RV4: 292769Speter case O_RV8: 293769Speter case O_RV: 294769Speter case O_LV: 2952105Smckusic /* 2962105Smckusic * positive offsets represent arguments 2972105Smckusic * and must use "ap" display entry rather 2982105Smckusic * than the "fp" entry 2992105Smckusic */ 3002105Smckusic if (p[1] >= 0) { 3012105Smckusic subop++; 3022105Smckusic suboppr++; 3032105Smckusic } 3043077Smckusic # ifdef PDP11 3053077Smckusic break; 3063077Smckusic # else 3073077Smckusic /* 3083077Smckusic * offsets out of range of word addressing 3093077Smckusic * must use long offset opcodes 3103077Smckusic */ 3113077Smckusic if (p[1] < SHORTADDR && p[1] >= -SHORTADDR) 3123077Smckusic break; 3133077Smckusic else { 314769Speter op += O_LRV - O_RV; 3153077Smckusic # ifdef DEBUG 3163077Smckusic cp = otext[op]; 3173077Smckusic # endif DEBUG 3183077Smckusic } 3193077Smckusic /* and fall through */ 3203077Smckusic # endif PDP11 321769Speter case O_BEG: 322769Speter case O_NODUMP: 323769Speter case O_CON4: 324769Speter case O_CASE4: 325769Speter case O_RANG4: 326769Speter case O_RANG24: 327769Speter case O_RSNG4: 328769Speter case O_RSNG24: 3292105Smckusic case O_SUCC4: 3302105Smckusic case O_PRED4: 331769Speter longgen: 332769Speter n = (n << 1) - 1; 3332184Smckusic if ( op == O_LRV || op == O_FOR4U || op == O_FOR4D) 334769Speter n--; 335769Speter #ifdef DEBUG 3363077Smckusic if (opt('k')) { 3373317Speter printf("%5d\t%s", lc - HEADER_BYTES, cp+1); 338769Speter if (suboppr) 3393077Smckusic printf(":%d", suboppr); 3403077Smckusic for ( i = 2, lp = (long *)&p[1]; i < n 341769Speter ; i += sizeof ( long )/sizeof ( short ) ) 342769Speter printf( "\t%D " , *lp ++ ); 343*3377Speter if (i == n) { 344*3377Speter sp = (short *)lp; 345*3377Speter printf( "\t%d ", *sp ); 346*3377Speter } 347769Speter pchr ( '\n' ); 3483077Smckusic } 349769Speter #endif 350769Speter if ( op != O_CASE4 ) 3513077Smckusic # ifdef DEC11 3523077Smckusic word((op & 0377) | subop << 8); 3533077Smckusic # else 3543077Smckusic word(op << 8 | (subop & 0377)); 3553077Smckusic # endif DEC11 3563077Smckusic for ( i = 1, sp = (short *)&p[1]; i < n; i++) 3573077Smckusic word ( *sp ++ ); 358769Speter return ( oldlc ); 359769Speter } 360769Speter #ifdef DEBUG 361769Speter if (opt('k')) { 3623317Speter printf("%5d\t%s", lc - HEADER_BYTES, cp+1); 363769Speter if (suboppr) 364769Speter printf(":%d", suboppr); 365769Speter if (string) 366769Speter printf("\t%s",string); 367769Speter if (n > 1) 368769Speter pchr('\t'); 369769Speter for (i=1; i<n; i++) 3703077Smckusic printf("%d ", p[i]); 371769Speter pchr('\n'); 372769Speter } 373769Speter #endif 374769Speter if (op != NIL) 3753077Smckusic # ifdef DEC11 3763077Smckusic word((op & 0377) | subop << 8); 3773077Smckusic # else 3783077Smckusic word(op << 8 | (subop & 0377)); 3793077Smckusic # endif DEC11 380769Speter for (i=1; i<n; i++) 381769Speter word(p[i]); 382769Speter return (oldlc); 383769Speter } 384769Speter #endif OBJ 385769Speter 386769Speter /* 387769Speter * listnames outputs a list of enumerated type names which 388769Speter * can then be selected from to output a TSCAL 389769Speter * a pointer to the address in the code of the namelist 390769Speter * is kept in value[ NL_ELABEL ]. 391769Speter */ 392769Speter listnames(ap) 393769Speter 394769Speter register struct nl *ap; 395769Speter { 396769Speter struct nl *next; 397769Speter register int oldlc, len; 398769Speter register unsigned w; 399769Speter register char *strptr; 400769Speter 4013317Speter if ( !CGENNING ) 402769Speter /* code is off - do nothing */ 403769Speter return(NIL); 404769Speter if (ap->class != TYPE) 405769Speter ap = ap->type; 406769Speter if (ap->value[ NL_ELABEL ] != 0) { 407769Speter /* the list already exists */ 408769Speter return( ap -> value[ NL_ELABEL ] ); 409769Speter } 410769Speter # ifdef OBJ 411769Speter oldlc = lc; 412769Speter put(2, O_TRA, lc); 413769Speter ap->value[ NL_ELABEL ] = lc; 414769Speter # endif OBJ 415769Speter # ifdef PC 416769Speter putprintf( " .data" , 0 ); 417769Speter putprintf( " .align 1" , 0 ); 418769Speter ap -> value[ NL_ELABEL ] = getlab(); 419769Speter putlab( ap -> value[ NL_ELABEL ] ); 420769Speter # endif PC 421769Speter /* number of scalars */ 422769Speter next = ap->type; 423769Speter len = next->range[1]-next->range[0]+1; 424769Speter # ifdef OBJ 425769Speter put(2, O_CASE2, len); 426769Speter # endif OBJ 427769Speter # ifdef PC 428769Speter putprintf( " .word %d" , 0 , len ); 429769Speter # endif PC 430769Speter /* offsets of each scalar name */ 431769Speter len = (len+1)*sizeof(short); 432769Speter # ifdef OBJ 433769Speter put(2, O_CASE2, len); 434769Speter # endif OBJ 435769Speter # ifdef PC 436769Speter putprintf( " .word %d" , 0 , len ); 437769Speter # endif PC 438769Speter next = ap->chain; 439769Speter do { 440769Speter for(strptr = next->symbol; *strptr++; len++) 441769Speter continue; 442769Speter len++; 443769Speter # ifdef OBJ 444769Speter put(2, O_CASE2, len); 445769Speter # endif OBJ 446769Speter # ifdef PC 447769Speter putprintf( " .word %d" , 0 , len ); 448769Speter # endif PC 449769Speter } while (next = next->chain); 450769Speter /* list of scalar names */ 451769Speter strptr = getnext(ap, &next); 452769Speter # ifdef OBJ 453769Speter do { 4543077Smckusic # ifdef DEC11 4553077Smckusic w = (unsigned) *strptr; 4563077Smckusic # else 4573077Smckusic w = *strptr << 8; 4583077Smckusic # endif DEC11 459769Speter if (!*strptr++) 460769Speter strptr = getnext(next, &next); 4613077Smckusic # ifdef DEC11 4623077Smckusic w |= *strptr << 8; 4633077Smckusic # else 4643077Smckusic w |= (unsigned) *strptr; 4653077Smckusic # endif DEC11 466769Speter if (!*strptr++) 467769Speter strptr = getnext(next, &next); 468769Speter word(w); 469769Speter } while (next); 470769Speter /* jump over the mess */ 471769Speter patch(oldlc); 472769Speter # endif OBJ 473769Speter # ifdef PC 474769Speter while ( next ) { 475769Speter while ( *strptr ) { 476769Speter putprintf( " .byte 0%o" , 1 , *strptr++ ); 477769Speter for ( w = 2 ; ( w <= 8 ) && *strptr ; w ++ ) { 478769Speter putprintf( ",0%o" , 1 , *strptr++ ); 479769Speter } 480769Speter putprintf( "" , 0 ); 481769Speter } 482769Speter putprintf( " .byte 0" , 0 ); 483769Speter strptr = getnext( next , &next ); 484769Speter } 485769Speter putprintf( " .text" , 0 ); 486769Speter # endif PC 487769Speter return( ap -> value[ NL_ELABEL ] ); 488769Speter } 489769Speter 490769Speter getnext(next, new) 491769Speter 492769Speter struct nl *next, **new; 493769Speter { 494769Speter if (next != NIL) { 495769Speter next = next->chain; 496769Speter *new = next; 497769Speter } 498769Speter if (next == NIL) 499769Speter return(""); 500769Speter #ifdef OBJ 5013317Speter if (opt('k') && CGENNING ) 5023317Speter printf("%5d\t\t\"%s\"\n", lc-HEADER_BYTES, next->symbol); 5032213Speter #endif OBJ 504769Speter return(next->symbol); 505769Speter } 506769Speter 507769Speter #ifdef OBJ 508769Speter /* 509769Speter * Putspace puts out a table 510769Speter * of nothing to leave space 511769Speter * for the case branch table e.g. 512769Speter */ 513769Speter putspace(n) 514769Speter int n; 515769Speter { 516769Speter register i; 517769Speter 5183317Speter if ( !CGENNING ) 519769Speter /* 520769Speter * code disabled - do nothing 521769Speter */ 522769Speter return(lc); 523769Speter #ifdef DEBUG 524769Speter if (opt('k')) 5253317Speter printf("%5d\t.=.+%d\n", lc - HEADER_BYTES, n); 526769Speter #endif 527769Speter for (i = even(n); i > 0; i -= 2) 528769Speter word(0); 529769Speter } 530769Speter 531769Speter putstr(sptr, padding) 532769Speter 533769Speter char *sptr; 534769Speter int padding; 535769Speter { 536769Speter register unsigned short w; 537769Speter register char *strptr = sptr; 538769Speter register int pad = padding; 539769Speter 5403317Speter if ( !CGENNING ) 541769Speter /* 542769Speter * code disabled - do nothing 543769Speter */ 544769Speter return(lc); 545769Speter #ifdef DEBUG 546769Speter if (opt('k')) 5473317Speter printf("%5d\t\t\"%s\"\n", lc-HEADER_BYTES, strptr); 548769Speter #endif 549769Speter if (pad == 0) { 550769Speter do { 5513077Smckusic # ifdef DEC11 5523077Smckusic w = (unsigned short) * strptr; 5533077Smckusic # else 5543077Smckusic w = (unsigned short)*strptr<<8; 5553077Smckusic # endif DEC11 556769Speter if (w) 5573077Smckusic # ifdef DEC11 5583077Smckusic w |= *++strptr << 8; 5593077Smckusic # else 5603077Smckusic w |= *++strptr; 5613077Smckusic # endif DEC11 562769Speter word(w); 563769Speter } while (*strptr++); 564769Speter } else { 5653077Smckusic # ifdef DEC11 5663077Smckusic do { 5673077Smckusic w = (unsigned short) * strptr; 5683077Smckusic if (w) { 5693077Smckusic if (*++strptr) 5703077Smckusic w |= *strptr << 8; 5713077Smckusic else { 5723077Smckusic w |= ' \0'; 5733077Smckusic pad--; 5743077Smckusic } 5753077Smckusic word(w); 5763077Smckusic } 5773077Smckusic } while (*strptr++); 5783077Smckusic # else 5793077Smckusic do { 5803077Smckusic w = (unsigned short)*strptr<<8; 5813077Smckusic if (w) { 5823077Smckusic if (*++strptr) 5833077Smckusic w |= *strptr; 5843077Smckusic else { 5853077Smckusic w |= ' '; 5863077Smckusic pad--; 5873077Smckusic } 5883077Smckusic word(w); 5893077Smckusic } 5903077Smckusic } while (*strptr++); 5913077Smckusic # endif DEC11 592769Speter while (pad > 1) { 593769Speter word(' '); 594769Speter pad -= 2; 595769Speter } 596769Speter if (pad == 1) 5973077Smckusic # ifdef DEC11 5983077Smckusic word(' '); 5993077Smckusic # else 6003077Smckusic word(' \0'); 6013077Smckusic # endif DEC11 602769Speter else 603769Speter word(0); 604769Speter } 605769Speter } 606769Speter #endif OBJ 607769Speter 608769Speter lenstr(sptr, padding) 609769Speter 610769Speter char *sptr; 611769Speter int padding; 612769Speter 613769Speter { 614769Speter register int cnt; 615769Speter register char *strptr = sptr; 616769Speter 617769Speter cnt = padding; 618769Speter do { 619769Speter cnt++; 620769Speter } while (*strptr++); 621769Speter return((++cnt) & ~1); 622769Speter } 623769Speter 624769Speter /* 625769Speter * Patch repairs the branch 626769Speter * at location loc to come 627769Speter * to the current location. 628769Speter * for PC, this puts down the label 629769Speter * and the branch just references that label. 630769Speter * lets here it for two pass assemblers. 631769Speter */ 632769Speter patch(loc) 633769Speter { 634769Speter 635769Speter # ifdef OBJ 6363077Smckusic patchfil(loc, (long)(lc-loc-2), 1); 637769Speter # endif OBJ 638769Speter # ifdef PC 639769Speter putlab( loc ); 640769Speter # endif PC 641769Speter } 642769Speter 643769Speter #ifdef OBJ 644769Speter patch4(loc) 645769Speter { 6463077Smckusic patchfil(loc, (long)(lc - HEADER_BYTES), 2); 647769Speter } 648769Speter 649769Speter /* 650769Speter * Patchfil makes loc+2 have value 651769Speter * as its contents. 652769Speter */ 653769Speter patchfil(loc, value, words) 654769Speter PTR_DCL loc; 6553077Smckusic long value; 6563077Smckusic int words; 657769Speter { 658769Speter register i; 6593077Smckusic int val; 660769Speter 6613317Speter if ( !CGENNING ) 662769Speter return; 663769Speter if (loc > (unsigned) lc) 664769Speter panic("patchfil"); 665769Speter #ifdef DEBUG 666769Speter if (opt('k')) 6673317Speter printf("\tpatch %u %D\n", loc - HEADER_BYTES, value); 668769Speter #endif 6693077Smckusic val = value; 670769Speter do { 6713077Smckusic # ifndef DEC11 6723077Smckusic if (words > 1) 6733077Smckusic val = value >> 16; 6743077Smckusic else 6753077Smckusic val = value; 6763077Smckusic # endif DEC11 677769Speter i = ((unsigned) loc + 2 - ((unsigned) lc & ~01777))/2; 678769Speter if (i >= 0 && i < 1024) 6793077Smckusic obuf[i] = val; 680769Speter else { 681769Speter lseek(ofil, (long) loc+2, 0); 6823077Smckusic write(ofil, &val, 2); 683769Speter lseek(ofil, (long) 0, 2); 684769Speter } 685769Speter loc += 2; 6863077Smckusic # ifdef DEC11 6873077Smckusic val = value >> 16; 6883077Smckusic # endif DEC11 689769Speter } while (--words); 690769Speter } 691769Speter 692769Speter /* 693769Speter * Put the word o into the code 694769Speter */ 695769Speter word(o) 696769Speter int o; 697769Speter { 698769Speter 699769Speter *obufp = o; 700769Speter obufp++; 701769Speter lc += 2; 702769Speter if (obufp >= obuf+512) 703769Speter pflush(); 704769Speter } 705769Speter 706769Speter extern char *obj; 707769Speter /* 708769Speter * Flush the code buffer 709769Speter */ 710769Speter pflush() 711769Speter { 712769Speter register i; 713769Speter 714769Speter i = (obufp - ( ( short * ) obuf ) ) * 2; 715769Speter if (i != 0 && write(ofil, obuf, i) != i) 716769Speter perror(obj), pexit(DIED); 717769Speter obufp = obuf; 718769Speter } 719769Speter #endif OBJ 720769Speter 721769Speter /* 722769Speter * Getlab - returns the location counter. 723769Speter * included here for the eventual code generator. 724769Speter * for PC, thank you! 725769Speter */ 726769Speter getlab() 727769Speter { 728769Speter # ifdef OBJ 729769Speter 730769Speter return (lc); 731769Speter # endif OBJ 732769Speter # ifdef PC 733769Speter static long lastlabel; 734769Speter 735769Speter return ( ++lastlabel ); 736769Speter # endif PC 737769Speter } 738769Speter 739769Speter /* 740769Speter * Putlab - lay down a label. 741769Speter * for PC, just print the label name with a colon after it. 742769Speter */ 743769Speter putlab(l) 744769Speter int l; 745769Speter { 746769Speter 747769Speter # ifdef PC 748769Speter putprintf( PREFIXFORMAT , 1 , LABELPREFIX , l ); 749769Speter putprintf( ":" , 0 ); 750769Speter # endif PC 751769Speter return (l); 752769Speter } 753