1769Speter /* Copyright (c) 1979 Regents of the University of California */ 2769Speter 3*3077Smckusic static char sccsid[] = "@(#)put.c 1.10 03/08/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; 33*3077Smckusic register short *sp; 34*3077Smckusic 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++; 55*3077Smckusic 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; 83*3077Smckusic # ifdef DEBUG 84*3077Smckusic cp = otext[op]; 85*3077Smckusic # endif DEBUG 862221Smckusic break; 87*3077Smckusic case O_CONG: 88*3077Smckusic case O_LVCON: 89*3077Smckusic 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: 107769Speter case O_WRITEF: 108769Speter case O_MAX: 109769Speter case O_MIN: 110769Speter case O_ARGV: 111769Speter case O_CTTOT: 112769Speter case O_INCT: 113769Speter case O_RANG2: 114769Speter case O_RSNG2: 115769Speter case O_RANG42: 116769Speter case O_RSNG42: 1172105Smckusic case O_SUCC2: 1182105Smckusic case O_SUCC24: 1192105Smckusic case O_PRED2: 1202105Smckusic case O_PRED24: 121769Speter if (p[1] == 0) 122769Speter break; 123769Speter case O_CON2: 124769Speter case O_CON24: 1252221Smckusic pack: 126769Speter if (p[1] < 128 && p[1] >= -128) { 127769Speter suboppr = subop = p[1]; 128769Speter p++; 129769Speter n--; 130769Speter if (op == O_CON2) { 131769Speter op = O_CON1; 132*3077Smckusic # ifdef DEBUG 133*3077Smckusic cp = otext[O_CON1]; 134*3077Smckusic # endif DEBUG 135769Speter } 136769Speter if (op == O_CON24) { 137769Speter op = O_CON14; 138*3077Smckusic # ifdef DEBUG 139*3077Smckusic cp = otext[O_CON14]; 140*3077Smckusic # endif DEBUG 141769Speter } 142769Speter } 143769Speter break; 144769Speter case O_CON8: 145769Speter { 146769Speter short *sp = &p[1]; 147769Speter 148769Speter #ifdef DEBUG 149769Speter if ( opt( 'k' ) ) 150*3077Smckusic printf ( ")#%5d\tCON8\t%22.14e\n" , 151769Speter lc - HEADER_BYTES , 152769Speter * ( ( double * ) &p[1] ) ); 153769Speter #endif 154*3077Smckusic # ifdef DEC11 155*3077Smckusic word(op); 156*3077Smckusic # else 157*3077Smckusic word(op << 8); 158*3077Smckusic # endif DEC11 159769Speter for ( i = 1 ; i <= 4 ; i ++ ) 160769Speter word ( *sp ++ ); 161769Speter return ( oldlc ); 162769Speter } 163769Speter default: 164769Speter if (op >= O_REL2 && op <= O_REL84) { 1651883Smckusic if ((i = (subop >> INDX) * 5 ) >= 30) 166769Speter i -= 30; 167769Speter else 168769Speter i += 2; 169769Speter #ifdef DEBUG 170769Speter string = &"IFEQ\0IFNE\0IFLT\0IFGT\0IFLE\0IFGE"[i]; 171769Speter #endif 172769Speter suboppr = 0; 173769Speter } 174769Speter break; 175769Speter case O_IF: 176769Speter case O_TRA: 177769Speter /***** 178769Speter codeline = 0; 179769Speter *****/ 1802184Smckusic /* relative addressing */ 1812184Smckusic p[1] -= ( unsigned ) lc + sizeof(short); 1822184Smckusic break; 183769Speter case O_FOR1U: 184769Speter case O_FOR2U: 185769Speter case O_FOR1D: 186769Speter case O_FOR2D: 187769Speter /* relative addressing */ 1882184Smckusic p[3] -= ( unsigned ) lc + 3 * sizeof(short); 189769Speter break; 190769Speter case O_CONC: 191769Speter #ifdef DEBUG 192769Speter (string = "'x'")[1] = p[1]; 193769Speter #endif 194769Speter suboppr = 0; 195769Speter op = O_CON1; 196*3077Smckusic # ifdef DEBUG 197*3077Smckusic cp = otext[O_CON1]; 198*3077Smckusic # endif DEBUG 199769Speter subop = p[1]; 200769Speter goto around; 201769Speter case O_CONC4: 202769Speter #ifdef DEBUG 203769Speter (string = "'x'")[1] = p[1]; 204769Speter #endif 205769Speter suboppr = 0; 206769Speter op = O_CON14; 207769Speter subop = p[1]; 208769Speter goto around; 209769Speter case O_CON1: 210769Speter case O_CON14: 211769Speter suboppr = subop = p[1]; 212769Speter around: 213769Speter n--; 214769Speter break; 215769Speter case O_CASEBEG: 216769Speter casewrd = 0; 217769Speter return (oldlc); 218769Speter case O_CASEEND: 219769Speter if ((unsigned) lc & 1) { 220769Speter lc--; 221769Speter word(casewrd); 222769Speter } 223769Speter return (oldlc); 224769Speter case O_CASE1: 225769Speter #ifdef DEBUG 226769Speter if (opt('k')) 227769Speter printf(")#%5d\tCASE1\t%d\n" 228*3077Smckusic , lc - HEADER_BYTES, p[1]); 229769Speter #endif 230769Speter /* 231769Speter * this to build a byte size case table 232769Speter * saving bytes across calls in casewrd 233769Speter * so they can be put out by word() 234769Speter */ 235769Speter lc++; 236769Speter if ((unsigned) lc & 1) 237*3077Smckusic # ifdef DEC11 238*3077Smckusic casewrd = p[1] & 0377; 239*3077Smckusic # else 240*3077Smckusic casewrd = (p[1] & 0377) << 8; 241*3077Smckusic # endif DEC11 242769Speter else { 243769Speter lc -= 2; 244*3077Smckusic # ifdef DEC11 245*3077Smckusic word(((p[1] & 0377) << 8) | casewrd); 246*3077Smckusic # else 247*3077Smckusic word((p[1] & 0377) | casewrd); 248*3077Smckusic # endif DEC11 249769Speter } 250769Speter return (oldlc); 251769Speter case O_CASE2: 252769Speter #ifdef DEBUG 253769Speter if (opt('k')) 254769Speter printf(")#%5d\tCASE2\t%d\n" 255*3077Smckusic , lc - HEADER_BYTES , p[1]); 256769Speter #endif 257*3077Smckusic word(p[1]); 258769Speter return (oldlc); 2591199Speter case O_FCALL: 260*3077Smckusic lp = (long *)&p[1]; 261*3077Smckusic if (*lp == 0) 2621199Speter goto longgen; 2631199Speter /* and fall through */ 264769Speter case O_PUSH: 265*3077Smckusic lp = (long *)&p[1]; 266*3077Smckusic if (*lp == 0) 267769Speter return (oldlc); 268*3077Smckusic if (*lp < 128 && *lp >= -128) { 269*3077Smckusic suboppr = subop = *lp; 270769Speter p++; 271769Speter n--; 272769Speter break; 273769Speter } 274769Speter goto longgen; 2752184Smckusic case O_FOR4U: 2762184Smckusic case O_FOR4D: 2772184Smckusic /* relative addressing */ 278*3077Smckusic p[1 + 2 * (sizeof(long) / sizeof(int))] -= 279*3077Smckusic (unsigned)lc + (sizeof(short) + 2 * sizeof(long)); 2802184Smckusic goto longgen; 281769Speter case O_TRA4: 282769Speter case O_CALL: 2831199Speter case O_FSAV: 284769Speter case O_GOTO: 285769Speter case O_NAM: 286769Speter case O_READE: 287769Speter /* absolute long addressing */ 288*3077Smckusic lp = (long *)&p[1]; 289*3077Smckusic *lp -= HEADER_BYTES; 290769Speter goto longgen; 291769Speter case O_RV1: 292769Speter case O_RV14: 293769Speter case O_RV2: 294769Speter case O_RV24: 295769Speter case O_RV4: 296769Speter case O_RV8: 297769Speter case O_RV: 298769Speter case O_LV: 2992105Smckusic /* 3002105Smckusic * positive offsets represent arguments 3012105Smckusic * and must use "ap" display entry rather 3022105Smckusic * than the "fp" entry 3032105Smckusic */ 3042105Smckusic if (p[1] >= 0) { 3052105Smckusic subop++; 3062105Smckusic suboppr++; 3072105Smckusic } 308*3077Smckusic # ifdef PDP11 309*3077Smckusic break; 310*3077Smckusic # else 311*3077Smckusic /* 312*3077Smckusic * offsets out of range of word addressing 313*3077Smckusic * must use long offset opcodes 314*3077Smckusic */ 315*3077Smckusic if (p[1] < SHORTADDR && p[1] >= -SHORTADDR) 316*3077Smckusic break; 317*3077Smckusic else { 318769Speter op += O_LRV - O_RV; 319*3077Smckusic # ifdef DEBUG 320*3077Smckusic cp = otext[op]; 321*3077Smckusic # endif DEBUG 322*3077Smckusic } 323*3077Smckusic /* and fall through */ 324*3077Smckusic # endif PDP11 325769Speter case O_BEG: 326769Speter case O_NODUMP: 327769Speter case O_CON4: 328769Speter case O_CASE4: 329769Speter case O_RANG4: 330769Speter case O_RANG24: 331769Speter case O_RSNG4: 332769Speter case O_RSNG24: 3332105Smckusic case O_SUCC4: 3342105Smckusic case O_PRED4: 335769Speter longgen: 336769Speter n = (n << 1) - 1; 3372184Smckusic if ( op == O_LRV || op == O_FOR4U || op == O_FOR4D) 338769Speter n--; 339769Speter #ifdef DEBUG 340*3077Smckusic if (opt('k')) { 341*3077Smckusic printf(")#%5d\t%s", lc - HEADER_BYTES, cp+1); 342769Speter if (suboppr) 343*3077Smckusic printf(":%d", suboppr); 344*3077Smckusic for ( i = 2, lp = (long *)&p[1]; i < n 345769Speter ; i += sizeof ( long )/sizeof ( short ) ) 346769Speter printf( "\t%D " , *lp ++ ); 347*3077Smckusic if (i == n) 348*3077Smckusic printf( "\t%d ", p[i - 1] ); 349769Speter pchr ( '\n' ); 350*3077Smckusic } 351769Speter #endif 352769Speter if ( op != O_CASE4 ) 353*3077Smckusic # ifdef DEC11 354*3077Smckusic word((op & 0377) | subop << 8); 355*3077Smckusic # else 356*3077Smckusic word(op << 8 | (subop & 0377)); 357*3077Smckusic # endif DEC11 358*3077Smckusic for ( i = 1, sp = (short *)&p[1]; i < n; i++) 359*3077Smckusic word ( *sp ++ ); 360769Speter return ( oldlc ); 361769Speter } 362769Speter #ifdef DEBUG 363769Speter if (opt('k')) { 364769Speter printf(")#%5d\t%s", lc - HEADER_BYTES, cp+1); 365769Speter if (suboppr) 366769Speter printf(":%d", suboppr); 367769Speter if (string) 368769Speter printf("\t%s",string); 369769Speter if (n > 1) 370769Speter pchr('\t'); 371769Speter for (i=1; i<n; i++) 372*3077Smckusic printf("%d ", p[i]); 373769Speter pchr('\n'); 374769Speter } 375769Speter #endif 376769Speter if (op != NIL) 377*3077Smckusic # ifdef DEC11 378*3077Smckusic word((op & 0377) | subop << 8); 379*3077Smckusic # else 380*3077Smckusic word(op << 8 | (subop & 0377)); 381*3077Smckusic # endif DEC11 382769Speter for (i=1; i<n; i++) 383769Speter word(p[i]); 384769Speter return (oldlc); 385769Speter } 386769Speter #endif OBJ 387769Speter 388769Speter /* 389769Speter * listnames outputs a list of enumerated type names which 390769Speter * can then be selected from to output a TSCAL 391769Speter * a pointer to the address in the code of the namelist 392769Speter * is kept in value[ NL_ELABEL ]. 393769Speter */ 394769Speter listnames(ap) 395769Speter 396769Speter register struct nl *ap; 397769Speter { 398769Speter struct nl *next; 399769Speter register int oldlc, len; 400769Speter register unsigned w; 401769Speter register char *strptr; 402769Speter 403769Speter if (cgenflg < 0) 404769Speter /* code is off - do nothing */ 405769Speter return(NIL); 406769Speter if (ap->class != TYPE) 407769Speter ap = ap->type; 408769Speter if (ap->value[ NL_ELABEL ] != 0) { 409769Speter /* the list already exists */ 410769Speter return( ap -> value[ NL_ELABEL ] ); 411769Speter } 412769Speter # ifdef OBJ 413769Speter oldlc = lc; 414769Speter put(2, O_TRA, lc); 415769Speter ap->value[ NL_ELABEL ] = lc; 416769Speter # endif OBJ 417769Speter # ifdef PC 418769Speter putprintf( " .data" , 0 ); 419769Speter putprintf( " .align 1" , 0 ); 420769Speter ap -> value[ NL_ELABEL ] = getlab(); 421769Speter putlab( ap -> value[ NL_ELABEL ] ); 422769Speter # endif PC 423769Speter /* number of scalars */ 424769Speter next = ap->type; 425769Speter len = next->range[1]-next->range[0]+1; 426769Speter # ifdef OBJ 427769Speter put(2, O_CASE2, len); 428769Speter # endif OBJ 429769Speter # ifdef PC 430769Speter putprintf( " .word %d" , 0 , len ); 431769Speter # endif PC 432769Speter /* offsets of each scalar name */ 433769Speter len = (len+1)*sizeof(short); 434769Speter # ifdef OBJ 435769Speter put(2, O_CASE2, len); 436769Speter # endif OBJ 437769Speter # ifdef PC 438769Speter putprintf( " .word %d" , 0 , len ); 439769Speter # endif PC 440769Speter next = ap->chain; 441769Speter do { 442769Speter for(strptr = next->symbol; *strptr++; len++) 443769Speter continue; 444769Speter len++; 445769Speter # ifdef OBJ 446769Speter put(2, O_CASE2, len); 447769Speter # endif OBJ 448769Speter # ifdef PC 449769Speter putprintf( " .word %d" , 0 , len ); 450769Speter # endif PC 451769Speter } while (next = next->chain); 452769Speter /* list of scalar names */ 453769Speter strptr = getnext(ap, &next); 454769Speter # ifdef OBJ 455769Speter do { 456*3077Smckusic # ifdef DEC11 457*3077Smckusic w = (unsigned) *strptr; 458*3077Smckusic # else 459*3077Smckusic w = *strptr << 8; 460*3077Smckusic # endif DEC11 461769Speter if (!*strptr++) 462769Speter strptr = getnext(next, &next); 463*3077Smckusic # ifdef DEC11 464*3077Smckusic w |= *strptr << 8; 465*3077Smckusic # else 466*3077Smckusic w |= (unsigned) *strptr; 467*3077Smckusic # endif DEC11 468769Speter if (!*strptr++) 469769Speter strptr = getnext(next, &next); 470769Speter word(w); 471769Speter } while (next); 472769Speter /* jump over the mess */ 473769Speter patch(oldlc); 474769Speter # endif OBJ 475769Speter # ifdef PC 476769Speter while ( next ) { 477769Speter while ( *strptr ) { 478769Speter putprintf( " .byte 0%o" , 1 , *strptr++ ); 479769Speter for ( w = 2 ; ( w <= 8 ) && *strptr ; w ++ ) { 480769Speter putprintf( ",0%o" , 1 , *strptr++ ); 481769Speter } 482769Speter putprintf( "" , 0 ); 483769Speter } 484769Speter putprintf( " .byte 0" , 0 ); 485769Speter strptr = getnext( next , &next ); 486769Speter } 487769Speter putprintf( " .text" , 0 ); 488769Speter # endif PC 489769Speter return( ap -> value[ NL_ELABEL ] ); 490769Speter } 491769Speter 492769Speter getnext(next, new) 493769Speter 494769Speter struct nl *next, **new; 495769Speter { 496769Speter if (next != NIL) { 497769Speter next = next->chain; 498769Speter *new = next; 499769Speter } 500769Speter if (next == NIL) 501769Speter return(""); 502769Speter #ifdef OBJ 503769Speter if (opt('k') && cgenflg >= 0) 504769Speter printf(")#%5d\t\t\"%s\"\n", lc-HEADER_BYTES, next->symbol); 5052213Speter #endif OBJ 506769Speter return(next->symbol); 507769Speter } 508769Speter 509769Speter #ifdef OBJ 510769Speter /* 511769Speter * Putspace puts out a table 512769Speter * of nothing to leave space 513769Speter * for the case branch table e.g. 514769Speter */ 515769Speter putspace(n) 516769Speter int n; 517769Speter { 518769Speter register i; 519769Speter 520769Speter if (cgenflg < 0) 521769Speter /* 522769Speter * code disabled - do nothing 523769Speter */ 524769Speter return(lc); 525769Speter #ifdef DEBUG 526769Speter if (opt('k')) 527769Speter printf(")#%5d\t.=.+%d\n", lc - HEADER_BYTES, n); 528769Speter #endif 529769Speter for (i = even(n); i > 0; i -= 2) 530769Speter word(0); 531769Speter } 532769Speter 533769Speter putstr(sptr, padding) 534769Speter 535769Speter char *sptr; 536769Speter int padding; 537769Speter { 538769Speter register unsigned short w; 539769Speter register char *strptr = sptr; 540769Speter register int pad = padding; 541769Speter 542769Speter if (cgenflg < 0) 543769Speter /* 544769Speter * code disabled - do nothing 545769Speter */ 546769Speter return(lc); 547769Speter #ifdef DEBUG 548769Speter if (opt('k')) 549*3077Smckusic printf(")#%5d\t\t\"%s\"\n", lc-HEADER_BYTES, strptr); 550769Speter #endif 551769Speter if (pad == 0) { 552769Speter do { 553*3077Smckusic # ifdef DEC11 554*3077Smckusic w = (unsigned short) * strptr; 555*3077Smckusic # else 556*3077Smckusic w = (unsigned short)*strptr<<8; 557*3077Smckusic # endif DEC11 558769Speter if (w) 559*3077Smckusic # ifdef DEC11 560*3077Smckusic w |= *++strptr << 8; 561*3077Smckusic # else 562*3077Smckusic w |= *++strptr; 563*3077Smckusic # endif DEC11 564769Speter word(w); 565769Speter } while (*strptr++); 566769Speter } else { 567*3077Smckusic # ifdef DEC11 568*3077Smckusic do { 569*3077Smckusic w = (unsigned short) * strptr; 570*3077Smckusic if (w) { 571*3077Smckusic if (*++strptr) 572*3077Smckusic w |= *strptr << 8; 573*3077Smckusic else { 574*3077Smckusic w |= ' \0'; 575*3077Smckusic pad--; 576*3077Smckusic } 577*3077Smckusic word(w); 578*3077Smckusic } 579*3077Smckusic } while (*strptr++); 580*3077Smckusic # else 581*3077Smckusic do { 582*3077Smckusic w = (unsigned short)*strptr<<8; 583*3077Smckusic if (w) { 584*3077Smckusic if (*++strptr) 585*3077Smckusic w |= *strptr; 586*3077Smckusic else { 587*3077Smckusic w |= ' '; 588*3077Smckusic pad--; 589*3077Smckusic } 590*3077Smckusic word(w); 591*3077Smckusic } 592*3077Smckusic } while (*strptr++); 593*3077Smckusic # endif DEC11 594769Speter while (pad > 1) { 595769Speter word(' '); 596769Speter pad -= 2; 597769Speter } 598769Speter if (pad == 1) 599*3077Smckusic # ifdef DEC11 600*3077Smckusic word(' '); 601*3077Smckusic # else 602*3077Smckusic word(' \0'); 603*3077Smckusic # endif DEC11 604769Speter else 605769Speter word(0); 606769Speter } 607769Speter } 608769Speter #endif OBJ 609769Speter 610769Speter lenstr(sptr, padding) 611769Speter 612769Speter char *sptr; 613769Speter int padding; 614769Speter 615769Speter { 616769Speter register int cnt; 617769Speter register char *strptr = sptr; 618769Speter 619769Speter cnt = padding; 620769Speter do { 621769Speter cnt++; 622769Speter } while (*strptr++); 623769Speter return((++cnt) & ~1); 624769Speter } 625769Speter 626769Speter /* 627769Speter * Patch repairs the branch 628769Speter * at location loc to come 629769Speter * to the current location. 630769Speter * for PC, this puts down the label 631769Speter * and the branch just references that label. 632769Speter * lets here it for two pass assemblers. 633769Speter */ 634769Speter patch(loc) 635769Speter { 636769Speter 637769Speter # ifdef OBJ 638*3077Smckusic patchfil(loc, (long)(lc-loc-2), 1); 639769Speter # endif OBJ 640769Speter # ifdef PC 641769Speter putlab( loc ); 642769Speter # endif PC 643769Speter } 644769Speter 645769Speter #ifdef OBJ 646769Speter patch4(loc) 647769Speter { 648*3077Smckusic patchfil(loc, (long)(lc - HEADER_BYTES), 2); 649769Speter } 650769Speter 651769Speter /* 652769Speter * Patchfil makes loc+2 have value 653769Speter * as its contents. 654769Speter */ 655769Speter patchfil(loc, value, words) 656769Speter PTR_DCL loc; 657*3077Smckusic long value; 658*3077Smckusic int words; 659769Speter { 660769Speter register i; 661*3077Smckusic int val; 662769Speter 663769Speter if (cgenflg < 0) 664769Speter return; 665769Speter if (loc > (unsigned) lc) 666769Speter panic("patchfil"); 667769Speter #ifdef DEBUG 668769Speter if (opt('k')) 669*3077Smckusic printf(")#\tpatch %u %D\n", loc - HEADER_BYTES, value); 670769Speter #endif 671*3077Smckusic val = value; 672769Speter do { 673*3077Smckusic # ifndef DEC11 674*3077Smckusic if (words > 1) 675*3077Smckusic val = value >> 16; 676*3077Smckusic else 677*3077Smckusic val = value; 678*3077Smckusic # endif DEC11 679769Speter i = ((unsigned) loc + 2 - ((unsigned) lc & ~01777))/2; 680769Speter if (i >= 0 && i < 1024) 681*3077Smckusic obuf[i] = val; 682769Speter else { 683769Speter lseek(ofil, (long) loc+2, 0); 684*3077Smckusic write(ofil, &val, 2); 685769Speter lseek(ofil, (long) 0, 2); 686769Speter } 687769Speter loc += 2; 688*3077Smckusic # ifdef DEC11 689*3077Smckusic val = value >> 16; 690*3077Smckusic # endif DEC11 691769Speter } while (--words); 692769Speter } 693769Speter 694769Speter /* 695769Speter * Put the word o into the code 696769Speter */ 697769Speter word(o) 698769Speter int o; 699769Speter { 700769Speter 701769Speter *obufp = o; 702769Speter obufp++; 703769Speter lc += 2; 704769Speter if (obufp >= obuf+512) 705769Speter pflush(); 706769Speter } 707769Speter 708769Speter extern char *obj; 709769Speter /* 710769Speter * Flush the code buffer 711769Speter */ 712769Speter pflush() 713769Speter { 714769Speter register i; 715769Speter 716769Speter i = (obufp - ( ( short * ) obuf ) ) * 2; 717769Speter if (i != 0 && write(ofil, obuf, i) != i) 718769Speter perror(obj), pexit(DIED); 719769Speter obufp = obuf; 720769Speter } 721769Speter #endif OBJ 722769Speter 723769Speter /* 724769Speter * Getlab - returns the location counter. 725769Speter * included here for the eventual code generator. 726769Speter * for PC, thank you! 727769Speter */ 728769Speter getlab() 729769Speter { 730769Speter # ifdef OBJ 731769Speter 732769Speter return (lc); 733769Speter # endif OBJ 734769Speter # ifdef PC 735769Speter static long lastlabel; 736769Speter 737769Speter return ( ++lastlabel ); 738769Speter # endif PC 739769Speter } 740769Speter 741769Speter /* 742769Speter * Putlab - lay down a label. 743769Speter * for PC, just print the label name with a colon after it. 744769Speter */ 745769Speter putlab(l) 746769Speter int l; 747769Speter { 748769Speter 749769Speter # ifdef PC 750769Speter putprintf( PREFIXFORMAT , 1 , LABELPREFIX , l ); 751769Speter putprintf( ":" , 0 ); 752769Speter # endif PC 753769Speter return (l); 754769Speter } 755