1769Speter /* Copyright (c) 1979 Regents of the University of California */ 2769Speter 3*3173Smckusic static char sccsid[] = "@(#)put.c 1.11 03/10/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; 48769Speter if (cgenflg < 0) 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: 107*3173Smckusic 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' ) ) 1513077Smckusic 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')) 228769Speter 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')) 255769Speter printf(")#%5d\tCASE2\t%d\n" 2563077Smckusic , lc - HEADER_BYTES , p[1]); 257769Speter #endif 2583077Smckusic word(p[1]); 259769Speter return (oldlc); 2601199Speter case O_FCALL: 2613077Smckusic lp = (long *)&p[1]; 2623077Smckusic if (*lp == 0) 2631199Speter goto longgen; 2641199Speter /* and fall through */ 265769Speter case O_PUSH: 2663077Smckusic lp = (long *)&p[1]; 2673077Smckusic if (*lp == 0) 268769Speter return (oldlc); 2693077Smckusic if (*lp < 128 && *lp >= -128) { 2703077Smckusic suboppr = subop = *lp; 271769Speter p++; 272769Speter n--; 273769Speter break; 274769Speter } 275769Speter goto longgen; 2762184Smckusic case O_FOR4U: 2772184Smckusic case O_FOR4D: 2782184Smckusic /* relative addressing */ 2793077Smckusic p[1 + 2 * (sizeof(long) / sizeof(int))] -= 2803077Smckusic (unsigned)lc + (sizeof(short) + 2 * sizeof(long)); 2812184Smckusic goto longgen; 282769Speter case O_TRA4: 283769Speter case O_CALL: 2841199Speter case O_FSAV: 285769Speter case O_GOTO: 286769Speter case O_NAM: 287769Speter case O_READE: 288769Speter /* absolute long addressing */ 2893077Smckusic lp = (long *)&p[1]; 2903077Smckusic *lp -= HEADER_BYTES; 291769Speter goto longgen; 292769Speter case O_RV1: 293769Speter case O_RV14: 294769Speter case O_RV2: 295769Speter case O_RV24: 296769Speter case O_RV4: 297769Speter case O_RV8: 298769Speter case O_RV: 299769Speter case O_LV: 3002105Smckusic /* 3012105Smckusic * positive offsets represent arguments 3022105Smckusic * and must use "ap" display entry rather 3032105Smckusic * than the "fp" entry 3042105Smckusic */ 3052105Smckusic if (p[1] >= 0) { 3062105Smckusic subop++; 3072105Smckusic suboppr++; 3082105Smckusic } 3093077Smckusic # ifdef PDP11 3103077Smckusic break; 3113077Smckusic # else 3123077Smckusic /* 3133077Smckusic * offsets out of range of word addressing 3143077Smckusic * must use long offset opcodes 3153077Smckusic */ 3163077Smckusic if (p[1] < SHORTADDR && p[1] >= -SHORTADDR) 3173077Smckusic break; 3183077Smckusic else { 319769Speter op += O_LRV - O_RV; 3203077Smckusic # ifdef DEBUG 3213077Smckusic cp = otext[op]; 3223077Smckusic # endif DEBUG 3233077Smckusic } 3243077Smckusic /* and fall through */ 3253077Smckusic # endif PDP11 326769Speter case O_BEG: 327769Speter case O_NODUMP: 328769Speter case O_CON4: 329769Speter case O_CASE4: 330769Speter case O_RANG4: 331769Speter case O_RANG24: 332769Speter case O_RSNG4: 333769Speter case O_RSNG24: 3342105Smckusic case O_SUCC4: 3352105Smckusic case O_PRED4: 336769Speter longgen: 337769Speter n = (n << 1) - 1; 3382184Smckusic if ( op == O_LRV || op == O_FOR4U || op == O_FOR4D) 339769Speter n--; 340769Speter #ifdef DEBUG 3413077Smckusic if (opt('k')) { 3423077Smckusic printf(")#%5d\t%s", lc - HEADER_BYTES, cp+1); 343769Speter if (suboppr) 3443077Smckusic printf(":%d", suboppr); 3453077Smckusic for ( i = 2, lp = (long *)&p[1]; i < n 346769Speter ; i += sizeof ( long )/sizeof ( short ) ) 347769Speter printf( "\t%D " , *lp ++ ); 3483077Smckusic if (i == n) 3493077Smckusic printf( "\t%d ", p[i - 1] ); 350769Speter pchr ( '\n' ); 3513077Smckusic } 352769Speter #endif 353769Speter if ( op != O_CASE4 ) 3543077Smckusic # ifdef DEC11 3553077Smckusic word((op & 0377) | subop << 8); 3563077Smckusic # else 3573077Smckusic word(op << 8 | (subop & 0377)); 3583077Smckusic # endif DEC11 3593077Smckusic for ( i = 1, sp = (short *)&p[1]; i < n; i++) 3603077Smckusic word ( *sp ++ ); 361769Speter return ( oldlc ); 362769Speter } 363769Speter #ifdef DEBUG 364769Speter if (opt('k')) { 365769Speter printf(")#%5d\t%s", lc - HEADER_BYTES, cp+1); 366769Speter if (suboppr) 367769Speter printf(":%d", suboppr); 368769Speter if (string) 369769Speter printf("\t%s",string); 370769Speter if (n > 1) 371769Speter pchr('\t'); 372769Speter for (i=1; i<n; i++) 3733077Smckusic printf("%d ", p[i]); 374769Speter pchr('\n'); 375769Speter } 376769Speter #endif 377769Speter if (op != NIL) 3783077Smckusic # ifdef DEC11 3793077Smckusic word((op & 0377) | subop << 8); 3803077Smckusic # else 3813077Smckusic word(op << 8 | (subop & 0377)); 3823077Smckusic # endif DEC11 383769Speter for (i=1; i<n; i++) 384769Speter word(p[i]); 385769Speter return (oldlc); 386769Speter } 387769Speter #endif OBJ 388769Speter 389769Speter /* 390769Speter * listnames outputs a list of enumerated type names which 391769Speter * can then be selected from to output a TSCAL 392769Speter * a pointer to the address in the code of the namelist 393769Speter * is kept in value[ NL_ELABEL ]. 394769Speter */ 395769Speter listnames(ap) 396769Speter 397769Speter register struct nl *ap; 398769Speter { 399769Speter struct nl *next; 400769Speter register int oldlc, len; 401769Speter register unsigned w; 402769Speter register char *strptr; 403769Speter 404769Speter if (cgenflg < 0) 405769Speter /* code is off - do nothing */ 406769Speter return(NIL); 407769Speter if (ap->class != TYPE) 408769Speter ap = ap->type; 409769Speter if (ap->value[ NL_ELABEL ] != 0) { 410769Speter /* the list already exists */ 411769Speter return( ap -> value[ NL_ELABEL ] ); 412769Speter } 413769Speter # ifdef OBJ 414769Speter oldlc = lc; 415769Speter put(2, O_TRA, lc); 416769Speter ap->value[ NL_ELABEL ] = lc; 417769Speter # endif OBJ 418769Speter # ifdef PC 419769Speter putprintf( " .data" , 0 ); 420769Speter putprintf( " .align 1" , 0 ); 421769Speter ap -> value[ NL_ELABEL ] = getlab(); 422769Speter putlab( ap -> value[ NL_ELABEL ] ); 423769Speter # endif PC 424769Speter /* number of scalars */ 425769Speter next = ap->type; 426769Speter len = next->range[1]-next->range[0]+1; 427769Speter # ifdef OBJ 428769Speter put(2, O_CASE2, len); 429769Speter # endif OBJ 430769Speter # ifdef PC 431769Speter putprintf( " .word %d" , 0 , len ); 432769Speter # endif PC 433769Speter /* offsets of each scalar name */ 434769Speter len = (len+1)*sizeof(short); 435769Speter # ifdef OBJ 436769Speter put(2, O_CASE2, len); 437769Speter # endif OBJ 438769Speter # ifdef PC 439769Speter putprintf( " .word %d" , 0 , len ); 440769Speter # endif PC 441769Speter next = ap->chain; 442769Speter do { 443769Speter for(strptr = next->symbol; *strptr++; len++) 444769Speter continue; 445769Speter len++; 446769Speter # ifdef OBJ 447769Speter put(2, O_CASE2, len); 448769Speter # endif OBJ 449769Speter # ifdef PC 450769Speter putprintf( " .word %d" , 0 , len ); 451769Speter # endif PC 452769Speter } while (next = next->chain); 453769Speter /* list of scalar names */ 454769Speter strptr = getnext(ap, &next); 455769Speter # ifdef OBJ 456769Speter do { 4573077Smckusic # ifdef DEC11 4583077Smckusic w = (unsigned) *strptr; 4593077Smckusic # else 4603077Smckusic w = *strptr << 8; 4613077Smckusic # endif DEC11 462769Speter if (!*strptr++) 463769Speter strptr = getnext(next, &next); 4643077Smckusic # ifdef DEC11 4653077Smckusic w |= *strptr << 8; 4663077Smckusic # else 4673077Smckusic w |= (unsigned) *strptr; 4683077Smckusic # endif DEC11 469769Speter if (!*strptr++) 470769Speter strptr = getnext(next, &next); 471769Speter word(w); 472769Speter } while (next); 473769Speter /* jump over the mess */ 474769Speter patch(oldlc); 475769Speter # endif OBJ 476769Speter # ifdef PC 477769Speter while ( next ) { 478769Speter while ( *strptr ) { 479769Speter putprintf( " .byte 0%o" , 1 , *strptr++ ); 480769Speter for ( w = 2 ; ( w <= 8 ) && *strptr ; w ++ ) { 481769Speter putprintf( ",0%o" , 1 , *strptr++ ); 482769Speter } 483769Speter putprintf( "" , 0 ); 484769Speter } 485769Speter putprintf( " .byte 0" , 0 ); 486769Speter strptr = getnext( next , &next ); 487769Speter } 488769Speter putprintf( " .text" , 0 ); 489769Speter # endif PC 490769Speter return( ap -> value[ NL_ELABEL ] ); 491769Speter } 492769Speter 493769Speter getnext(next, new) 494769Speter 495769Speter struct nl *next, **new; 496769Speter { 497769Speter if (next != NIL) { 498769Speter next = next->chain; 499769Speter *new = next; 500769Speter } 501769Speter if (next == NIL) 502769Speter return(""); 503769Speter #ifdef OBJ 504769Speter if (opt('k') && cgenflg >= 0) 505769Speter printf(")#%5d\t\t\"%s\"\n", lc-HEADER_BYTES, next->symbol); 5062213Speter #endif OBJ 507769Speter return(next->symbol); 508769Speter } 509769Speter 510769Speter #ifdef OBJ 511769Speter /* 512769Speter * Putspace puts out a table 513769Speter * of nothing to leave space 514769Speter * for the case branch table e.g. 515769Speter */ 516769Speter putspace(n) 517769Speter int n; 518769Speter { 519769Speter register i; 520769Speter 521769Speter if (cgenflg < 0) 522769Speter /* 523769Speter * code disabled - do nothing 524769Speter */ 525769Speter return(lc); 526769Speter #ifdef DEBUG 527769Speter if (opt('k')) 528769Speter printf(")#%5d\t.=.+%d\n", lc - HEADER_BYTES, n); 529769Speter #endif 530769Speter for (i = even(n); i > 0; i -= 2) 531769Speter word(0); 532769Speter } 533769Speter 534769Speter putstr(sptr, padding) 535769Speter 536769Speter char *sptr; 537769Speter int padding; 538769Speter { 539769Speter register unsigned short w; 540769Speter register char *strptr = sptr; 541769Speter register int pad = padding; 542769Speter 543769Speter if (cgenflg < 0) 544769Speter /* 545769Speter * code disabled - do nothing 546769Speter */ 547769Speter return(lc); 548769Speter #ifdef DEBUG 549769Speter if (opt('k')) 5503077Smckusic printf(")#%5d\t\t\"%s\"\n", lc-HEADER_BYTES, strptr); 551769Speter #endif 552769Speter if (pad == 0) { 553769Speter do { 5543077Smckusic # ifdef DEC11 5553077Smckusic w = (unsigned short) * strptr; 5563077Smckusic # else 5573077Smckusic w = (unsigned short)*strptr<<8; 5583077Smckusic # endif DEC11 559769Speter if (w) 5603077Smckusic # ifdef DEC11 5613077Smckusic w |= *++strptr << 8; 5623077Smckusic # else 5633077Smckusic w |= *++strptr; 5643077Smckusic # endif DEC11 565769Speter word(w); 566769Speter } while (*strptr++); 567769Speter } else { 5683077Smckusic # ifdef DEC11 5693077Smckusic do { 5703077Smckusic w = (unsigned short) * strptr; 5713077Smckusic if (w) { 5723077Smckusic if (*++strptr) 5733077Smckusic w |= *strptr << 8; 5743077Smckusic else { 5753077Smckusic w |= ' \0'; 5763077Smckusic pad--; 5773077Smckusic } 5783077Smckusic word(w); 5793077Smckusic } 5803077Smckusic } while (*strptr++); 5813077Smckusic # else 5823077Smckusic do { 5833077Smckusic w = (unsigned short)*strptr<<8; 5843077Smckusic if (w) { 5853077Smckusic if (*++strptr) 5863077Smckusic w |= *strptr; 5873077Smckusic else { 5883077Smckusic w |= ' '; 5893077Smckusic pad--; 5903077Smckusic } 5913077Smckusic word(w); 5923077Smckusic } 5933077Smckusic } while (*strptr++); 5943077Smckusic # endif DEC11 595769Speter while (pad > 1) { 596769Speter word(' '); 597769Speter pad -= 2; 598769Speter } 599769Speter if (pad == 1) 6003077Smckusic # ifdef DEC11 6013077Smckusic word(' '); 6023077Smckusic # else 6033077Smckusic word(' \0'); 6043077Smckusic # endif DEC11 605769Speter else 606769Speter word(0); 607769Speter } 608769Speter } 609769Speter #endif OBJ 610769Speter 611769Speter lenstr(sptr, padding) 612769Speter 613769Speter char *sptr; 614769Speter int padding; 615769Speter 616769Speter { 617769Speter register int cnt; 618769Speter register char *strptr = sptr; 619769Speter 620769Speter cnt = padding; 621769Speter do { 622769Speter cnt++; 623769Speter } while (*strptr++); 624769Speter return((++cnt) & ~1); 625769Speter } 626769Speter 627769Speter /* 628769Speter * Patch repairs the branch 629769Speter * at location loc to come 630769Speter * to the current location. 631769Speter * for PC, this puts down the label 632769Speter * and the branch just references that label. 633769Speter * lets here it for two pass assemblers. 634769Speter */ 635769Speter patch(loc) 636769Speter { 637769Speter 638769Speter # ifdef OBJ 6393077Smckusic patchfil(loc, (long)(lc-loc-2), 1); 640769Speter # endif OBJ 641769Speter # ifdef PC 642769Speter putlab( loc ); 643769Speter # endif PC 644769Speter } 645769Speter 646769Speter #ifdef OBJ 647769Speter patch4(loc) 648769Speter { 6493077Smckusic patchfil(loc, (long)(lc - HEADER_BYTES), 2); 650769Speter } 651769Speter 652769Speter /* 653769Speter * Patchfil makes loc+2 have value 654769Speter * as its contents. 655769Speter */ 656769Speter patchfil(loc, value, words) 657769Speter PTR_DCL loc; 6583077Smckusic long value; 6593077Smckusic int words; 660769Speter { 661769Speter register i; 6623077Smckusic int val; 663769Speter 664769Speter if (cgenflg < 0) 665769Speter return; 666769Speter if (loc > (unsigned) lc) 667769Speter panic("patchfil"); 668769Speter #ifdef DEBUG 669769Speter if (opt('k')) 6703077Smckusic printf(")#\tpatch %u %D\n", loc - HEADER_BYTES, value); 671769Speter #endif 6723077Smckusic val = value; 673769Speter do { 6743077Smckusic # ifndef DEC11 6753077Smckusic if (words > 1) 6763077Smckusic val = value >> 16; 6773077Smckusic else 6783077Smckusic val = value; 6793077Smckusic # endif DEC11 680769Speter i = ((unsigned) loc + 2 - ((unsigned) lc & ~01777))/2; 681769Speter if (i >= 0 && i < 1024) 6823077Smckusic obuf[i] = val; 683769Speter else { 684769Speter lseek(ofil, (long) loc+2, 0); 6853077Smckusic write(ofil, &val, 2); 686769Speter lseek(ofil, (long) 0, 2); 687769Speter } 688769Speter loc += 2; 6893077Smckusic # ifdef DEC11 6903077Smckusic val = value >> 16; 6913077Smckusic # endif DEC11 692769Speter } while (--words); 693769Speter } 694769Speter 695769Speter /* 696769Speter * Put the word o into the code 697769Speter */ 698769Speter word(o) 699769Speter int o; 700769Speter { 701769Speter 702769Speter *obufp = o; 703769Speter obufp++; 704769Speter lc += 2; 705769Speter if (obufp >= obuf+512) 706769Speter pflush(); 707769Speter } 708769Speter 709769Speter extern char *obj; 710769Speter /* 711769Speter * Flush the code buffer 712769Speter */ 713769Speter pflush() 714769Speter { 715769Speter register i; 716769Speter 717769Speter i = (obufp - ( ( short * ) obuf ) ) * 2; 718769Speter if (i != 0 && write(ofil, obuf, i) != i) 719769Speter perror(obj), pexit(DIED); 720769Speter obufp = obuf; 721769Speter } 722769Speter #endif OBJ 723769Speter 724769Speter /* 725769Speter * Getlab - returns the location counter. 726769Speter * included here for the eventual code generator. 727769Speter * for PC, thank you! 728769Speter */ 729769Speter getlab() 730769Speter { 731769Speter # ifdef OBJ 732769Speter 733769Speter return (lc); 734769Speter # endif OBJ 735769Speter # ifdef PC 736769Speter static long lastlabel; 737769Speter 738769Speter return ( ++lastlabel ); 739769Speter # endif PC 740769Speter } 741769Speter 742769Speter /* 743769Speter * Putlab - lay down a label. 744769Speter * for PC, just print the label name with a colon after it. 745769Speter */ 746769Speter putlab(l) 747769Speter int l; 748769Speter { 749769Speter 750769Speter # ifdef PC 751769Speter putprintf( PREFIXFORMAT , 1 , LABELPREFIX , l ); 752769Speter putprintf( ":" , 0 ); 753769Speter # endif PC 754769Speter return (l); 755769Speter } 756