1769Speter /* Copyright (c) 1979 Regents of the University of California */ 2769Speter 3*10791Smckusick static char sccsid[] = "@(#)put.c 1.22 02/09/83"; 4769Speter 5769Speter #include "whoami.h" 6769Speter #include "opcode.h" 7769Speter #include "0.h" 8769Speter #include "objfmt.h" 9769Speter #ifdef PC 10769Speter # include "pc.h" 1110656Speter # include "align.h" 12769Speter #endif PC 13769Speter 14769Speter short *obufp = obuf; 15769Speter 16769Speter /* 17769Speter * If DEBUG is defined, include the table 18769Speter * of the printing opcode names. 19769Speter */ 20769Speter #ifdef DEBUG 21769Speter #include "OPnames.h" 22769Speter #endif 23769Speter 24769Speter #ifdef OBJ 25769Speter /* 26769Speter * Put is responsible for the interpreter equivalent of code 27769Speter * generation. Since the interpreter is specifically designed 28769Speter * for Pascal, little work is required here. 29769Speter */ 30769Speter put(a) 31769Speter { 32769Speter register int *p, i; 33769Speter register char *cp; 343077Smckusic register short *sp; 353077Smckusic register long *lp; 36769Speter int n, subop, suboppr, op, oldlc, w; 37769Speter char *string; 38769Speter static int casewrd; 39769Speter 40769Speter /* 41769Speter * It would be nice to do some more 42769Speter * optimizations here. The work 43769Speter * done to collapse offsets in lval 44769Speter * should be done here, the IFEQ etc 45769Speter * relational operators could be used 46769Speter * etc. 47769Speter */ 48769Speter oldlc = lc; 493317Speter if ( !CGENNING ) 50769Speter /* 51769Speter * code disabled - do nothing 52769Speter */ 53769Speter return (oldlc); 54769Speter p = &a; 55769Speter n = *p++; 563077Smckusic suboppr = subop = (*p >> 8) & 0377; 57769Speter op = *p & 0377; 58769Speter string = 0; 59769Speter #ifdef DEBUG 60769Speter if ((cp = otext[op]) == NIL) { 61769Speter printf("op= %o\n", op); 62769Speter panic("put"); 63769Speter } 64769Speter #endif 65769Speter switch (op) { 66769Speter case O_ABORT: 67769Speter cp = "*"; 68769Speter break; 692221Smckusic case O_AS: 702221Smckusic switch(p[1]) { 716594Smckusick case 0: 726594Smckusick break; 732221Smckusic case 2: 742221Smckusic op = O_AS2; 756594Smckusick n = 1; 762221Smckusic break; 772221Smckusic case 4: 782221Smckusic op = O_AS4; 796594Smckusick n = 1; 802221Smckusic break; 812221Smckusic case 8: 822221Smckusic op = O_AS8; 836594Smckusick n = 1; 842221Smckusic break; 852221Smckusic default: 862221Smckusic goto pack; 872221Smckusic } 883077Smckusic # ifdef DEBUG 893077Smckusic cp = otext[op]; 903077Smckusic # endif DEBUG 912221Smckusic break; 92*10791Smckusick case O_FOR1U: 93*10791Smckusick case O_FOR2U: 94*10791Smckusick case O_FOR4U: 95*10791Smckusick case O_FOR1D: 96*10791Smckusick case O_FOR2D: 97*10791Smckusick case O_FOR4D: 98*10791Smckusick /* relative addressing */ 99*10791Smckusick p[1] -= ( unsigned ) lc + sizeof(short); 100*10791Smckusick /* try to pack the jump */ 101*10791Smckusick if (p[1] <= 127 && p[1] >= -128) { 102*10791Smckusick suboppr = subop = p[1]; 103*10791Smckusick p++; 104*10791Smckusick n--; 105*10791Smckusick } else { 106*10791Smckusick /* have to allow for extra displacement */ 107*10791Smckusick p[1] -= sizeof(short); 108*10791Smckusick } 109*10791Smckusick break; 1103077Smckusic case O_CONG: 1113077Smckusic case O_LVCON: 1123077Smckusic case O_CON: 113769Speter case O_LINO: 114769Speter case O_NEW: 115769Speter case O_DISPOSE: 1167965Smckusick case O_DFDISP: 117769Speter case O_IND: 118769Speter case O_OFF: 119769Speter case O_INX2: 120769Speter case O_INX4: 121769Speter case O_CARD: 122769Speter case O_ADDT: 123769Speter case O_SUBT: 124769Speter case O_MULT: 125769Speter case O_IN: 126769Speter case O_CASE1OP: 127769Speter case O_CASE2OP: 128769Speter case O_CASE4OP: 1291199Speter case O_FRTN: 130769Speter case O_WRITES: 1313173Smckusic case O_WRITEC: 132769Speter case O_WRITEF: 133769Speter case O_MAX: 134769Speter case O_MIN: 135769Speter case O_ARGV: 136769Speter case O_CTTOT: 137769Speter case O_INCT: 138769Speter case O_RANG2: 139769Speter case O_RSNG2: 140769Speter case O_RANG42: 141769Speter case O_RSNG42: 1422105Smckusic case O_SUCC2: 1432105Smckusic case O_SUCC24: 1442105Smckusic case O_PRED2: 1452105Smckusic case O_PRED24: 146769Speter if (p[1] == 0) 147769Speter break; 148769Speter case O_CON2: 149769Speter case O_CON24: 1502221Smckusic pack: 151*10791Smckusick if (p[1] <= 127 && p[1] >= -128) { 152769Speter suboppr = subop = p[1]; 153769Speter p++; 154769Speter n--; 155769Speter if (op == O_CON2) { 156769Speter op = O_CON1; 1573077Smckusic # ifdef DEBUG 1583077Smckusic cp = otext[O_CON1]; 1593077Smckusic # endif DEBUG 160769Speter } 161769Speter if (op == O_CON24) { 162769Speter op = O_CON14; 1633077Smckusic # ifdef DEBUG 1643077Smckusic cp = otext[O_CON14]; 1653077Smckusic # endif DEBUG 166769Speter } 167769Speter } 168769Speter break; 169769Speter case O_CON8: 170769Speter { 171769Speter short *sp = &p[1]; 172769Speter 173769Speter #ifdef DEBUG 174769Speter if ( opt( 'k' ) ) 1753317Speter printf ( "%5d\tCON8\t%22.14e\n" , 176769Speter lc - HEADER_BYTES , 177769Speter * ( ( double * ) &p[1] ) ); 178769Speter #endif 1793077Smckusic # ifdef DEC11 1803077Smckusic word(op); 1813077Smckusic # else 1823077Smckusic word(op << 8); 1833077Smckusic # endif DEC11 184769Speter for ( i = 1 ; i <= 4 ; i ++ ) 185769Speter word ( *sp ++ ); 186769Speter return ( oldlc ); 187769Speter } 188769Speter default: 189769Speter if (op >= O_REL2 && op <= O_REL84) { 1901883Smckusic if ((i = (subop >> INDX) * 5 ) >= 30) 191769Speter i -= 30; 192769Speter else 193769Speter i += 2; 194769Speter #ifdef DEBUG 195769Speter string = &"IFEQ\0IFNE\0IFLT\0IFGT\0IFLE\0IFGE"[i]; 196769Speter #endif 197769Speter suboppr = 0; 198769Speter } 199769Speter break; 200769Speter case O_IF: 201769Speter case O_TRA: 202769Speter /***** 203769Speter codeline = 0; 204769Speter *****/ 2052184Smckusic /* relative addressing */ 2062184Smckusic p[1] -= ( unsigned ) lc + sizeof(short); 2072184Smckusic break; 208769Speter case O_CONC: 209769Speter #ifdef DEBUG 210769Speter (string = "'x'")[1] = p[1]; 211769Speter #endif 212769Speter suboppr = 0; 213769Speter op = O_CON1; 2143077Smckusic # ifdef DEBUG 2153077Smckusic cp = otext[O_CON1]; 2163077Smckusic # endif DEBUG 217769Speter subop = p[1]; 218769Speter goto around; 219769Speter case O_CONC4: 220769Speter #ifdef DEBUG 221769Speter (string = "'x'")[1] = p[1]; 222769Speter #endif 223769Speter suboppr = 0; 224769Speter op = O_CON14; 225769Speter subop = p[1]; 226769Speter goto around; 227769Speter case O_CON1: 228769Speter case O_CON14: 229769Speter suboppr = subop = p[1]; 230769Speter around: 231769Speter n--; 232769Speter break; 233769Speter case O_CASEBEG: 234769Speter casewrd = 0; 235769Speter return (oldlc); 236769Speter case O_CASEEND: 237769Speter if ((unsigned) lc & 1) { 238769Speter lc--; 239769Speter word(casewrd); 240769Speter } 241769Speter return (oldlc); 242769Speter case O_CASE1: 243769Speter #ifdef DEBUG 244769Speter if (opt('k')) 2453317Speter printf("%5d\tCASE1\t%d\n" 2463077Smckusic , lc - HEADER_BYTES, p[1]); 247769Speter #endif 248769Speter /* 249769Speter * this to build a byte size case table 250769Speter * saving bytes across calls in casewrd 251769Speter * so they can be put out by word() 252769Speter */ 253769Speter lc++; 254769Speter if ((unsigned) lc & 1) 2553077Smckusic # ifdef DEC11 2563077Smckusic casewrd = p[1] & 0377; 2573077Smckusic # else 2583077Smckusic casewrd = (p[1] & 0377) << 8; 2593077Smckusic # endif DEC11 260769Speter else { 261769Speter lc -= 2; 2623077Smckusic # ifdef DEC11 2633077Smckusic word(((p[1] & 0377) << 8) | casewrd); 2643077Smckusic # else 2653077Smckusic word((p[1] & 0377) | casewrd); 2663077Smckusic # endif DEC11 267769Speter } 268769Speter return (oldlc); 269769Speter case O_CASE2: 270769Speter #ifdef DEBUG 271769Speter if (opt('k')) 2723317Speter printf("%5d\tCASE2\t%d\n" 2733077Smckusic , lc - HEADER_BYTES , p[1]); 274769Speter #endif 2753077Smckusic word(p[1]); 276769Speter return (oldlc); 277769Speter case O_PUSH: 2783077Smckusic lp = (long *)&p[1]; 2793077Smckusic if (*lp == 0) 280769Speter return (oldlc); 2814025Smckusic /* and fall through */ 2824025Smckusic case O_RANG4: 2834025Smckusic case O_RANG24: 2844025Smckusic case O_RSNG4: 2854025Smckusic case O_RSNG24: 2864025Smckusic case O_SUCC4: 2874025Smckusic case O_PRED4: 2884025Smckusic /* sub opcode optimization */ 2894025Smckusic lp = (long *)&p[1]; 2904025Smckusic if (*lp < 128 && *lp >= -128 && *lp != 0) { 2913077Smckusic suboppr = subop = *lp; 2924025Smckusic p += (sizeof(long) / sizeof(int)); 293769Speter n--; 294769Speter } 295769Speter goto longgen; 296769Speter case O_TRA4: 297769Speter case O_CALL: 2981199Speter case O_FSAV: 299769Speter case O_GOTO: 300769Speter case O_NAM: 301769Speter case O_READE: 302769Speter /* absolute long addressing */ 3033077Smckusic lp = (long *)&p[1]; 3043077Smckusic *lp -= HEADER_BYTES; 305769Speter goto longgen; 306769Speter case O_RV1: 307769Speter case O_RV14: 308769Speter case O_RV2: 309769Speter case O_RV24: 310769Speter case O_RV4: 311769Speter case O_RV8: 312769Speter case O_RV: 313769Speter case O_LV: 3142105Smckusic /* 3152105Smckusic * positive offsets represent arguments 3162105Smckusic * and must use "ap" display entry rather 3172105Smckusic * than the "fp" entry 3182105Smckusic */ 3192105Smckusic if (p[1] >= 0) { 3202105Smckusic subop++; 3212105Smckusic suboppr++; 3222105Smckusic } 3233077Smckusic # ifdef PDP11 3243077Smckusic break; 3253077Smckusic # else 3263077Smckusic /* 3273077Smckusic * offsets out of range of word addressing 3283077Smckusic * must use long offset opcodes 3293077Smckusic */ 3303077Smckusic if (p[1] < SHORTADDR && p[1] >= -SHORTADDR) 3313077Smckusic break; 3323077Smckusic else { 333769Speter op += O_LRV - O_RV; 3343077Smckusic # ifdef DEBUG 3353077Smckusic cp = otext[op]; 3363077Smckusic # endif DEBUG 3373077Smckusic } 3383077Smckusic /* and fall through */ 3393077Smckusic # endif PDP11 340769Speter case O_BEG: 341769Speter case O_NODUMP: 342769Speter case O_CON4: 343769Speter case O_CASE4: 344769Speter longgen: 345769Speter n = (n << 1) - 1; 346*10791Smckusick if ( op == O_LRV ) { 347769Speter n--; 34810562Smckusick # if defined(ADDR32) && !defined(DEC11) 34910562Smckusick p[n / 2] <<= 16; 35010562Smckusick # endif 35110562Smckusick } 352769Speter #ifdef DEBUG 3533077Smckusic if (opt('k')) { 3543317Speter printf("%5d\t%s", lc - HEADER_BYTES, cp+1); 355769Speter if (suboppr) 3563077Smckusic printf(":%d", suboppr); 3573077Smckusic for ( i = 2, lp = (long *)&p[1]; i < n 358769Speter ; i += sizeof ( long )/sizeof ( short ) ) 359769Speter printf( "\t%D " , *lp ++ ); 3603377Speter if (i == n) { 3613377Speter sp = (short *)lp; 3623377Speter printf( "\t%d ", *sp ); 3633377Speter } 364769Speter pchr ( '\n' ); 3653077Smckusic } 366769Speter #endif 367769Speter if ( op != O_CASE4 ) 3683077Smckusic # ifdef DEC11 3693077Smckusic word((op & 0377) | subop << 8); 3703077Smckusic # else 3713077Smckusic word(op << 8 | (subop & 0377)); 3723077Smckusic # endif DEC11 3733077Smckusic for ( i = 1, sp = (short *)&p[1]; i < n; i++) 3743077Smckusic word ( *sp ++ ); 375769Speter return ( oldlc ); 376769Speter } 377769Speter #ifdef DEBUG 378769Speter if (opt('k')) { 3793317Speter printf("%5d\t%s", lc - HEADER_BYTES, cp+1); 380769Speter if (suboppr) 381769Speter printf(":%d", suboppr); 382769Speter if (string) 383769Speter printf("\t%s",string); 384769Speter if (n > 1) 385769Speter pchr('\t'); 386769Speter for (i=1; i<n; i++) 3873077Smckusic printf("%d ", p[i]); 388769Speter pchr('\n'); 389769Speter } 390769Speter #endif 391769Speter if (op != NIL) 3923077Smckusic # ifdef DEC11 3933077Smckusic word((op & 0377) | subop << 8); 3943077Smckusic # else 3953077Smckusic word(op << 8 | (subop & 0377)); 3963077Smckusic # endif DEC11 397769Speter for (i=1; i<n; i++) 398769Speter word(p[i]); 399769Speter return (oldlc); 400769Speter } 401769Speter #endif OBJ 402769Speter 403769Speter /* 404769Speter * listnames outputs a list of enumerated type names which 405769Speter * can then be selected from to output a TSCAL 406769Speter * a pointer to the address in the code of the namelist 407769Speter * is kept in value[ NL_ELABEL ]. 408769Speter */ 409769Speter listnames(ap) 410769Speter 411769Speter register struct nl *ap; 412769Speter { 413769Speter struct nl *next; 414769Speter register int oldlc, len; 415769Speter register unsigned w; 416769Speter register char *strptr; 417769Speter 4183317Speter if ( !CGENNING ) 419769Speter /* code is off - do nothing */ 420769Speter return(NIL); 421769Speter if (ap->class != TYPE) 422769Speter ap = ap->type; 423769Speter if (ap->value[ NL_ELABEL ] != 0) { 424769Speter /* the list already exists */ 425769Speter return( ap -> value[ NL_ELABEL ] ); 426769Speter } 427769Speter # ifdef OBJ 428769Speter oldlc = lc; 429769Speter put(2, O_TRA, lc); 430769Speter ap->value[ NL_ELABEL ] = lc; 431769Speter # endif OBJ 432769Speter # ifdef PC 43310656Speter putprintf(" .data", 0); 43410656Speter aligndot(A_STRUCT); 435769Speter ap -> value[ NL_ELABEL ] = getlab(); 436769Speter putlab( ap -> value[ NL_ELABEL ] ); 437769Speter # endif PC 438769Speter /* number of scalars */ 439769Speter next = ap->type; 440769Speter len = next->range[1]-next->range[0]+1; 441769Speter # ifdef OBJ 442769Speter put(2, O_CASE2, len); 443769Speter # endif OBJ 444769Speter # ifdef PC 445769Speter putprintf( " .word %d" , 0 , len ); 446769Speter # endif PC 447769Speter /* offsets of each scalar name */ 448769Speter len = (len+1)*sizeof(short); 449769Speter # ifdef OBJ 450769Speter put(2, O_CASE2, len); 451769Speter # endif OBJ 452769Speter # ifdef PC 453769Speter putprintf( " .word %d" , 0 , len ); 454769Speter # endif PC 455769Speter next = ap->chain; 456769Speter do { 457769Speter for(strptr = next->symbol; *strptr++; len++) 458769Speter continue; 459769Speter len++; 460769Speter # ifdef OBJ 461769Speter put(2, O_CASE2, len); 462769Speter # endif OBJ 463769Speter # ifdef PC 464769Speter putprintf( " .word %d" , 0 , len ); 465769Speter # endif PC 466769Speter } while (next = next->chain); 467769Speter /* list of scalar names */ 468769Speter strptr = getnext(ap, &next); 469769Speter # ifdef OBJ 470769Speter do { 4713077Smckusic # ifdef DEC11 4723077Smckusic w = (unsigned) *strptr; 4733077Smckusic # else 4743077Smckusic w = *strptr << 8; 4753077Smckusic # endif DEC11 476769Speter if (!*strptr++) 477769Speter strptr = getnext(next, &next); 4783077Smckusic # ifdef DEC11 4793077Smckusic w |= *strptr << 8; 4803077Smckusic # else 4813077Smckusic w |= (unsigned) *strptr; 4823077Smckusic # endif DEC11 483769Speter if (!*strptr++) 484769Speter strptr = getnext(next, &next); 485769Speter word(w); 486769Speter } while (next); 487769Speter /* jump over the mess */ 488769Speter patch(oldlc); 489769Speter # endif OBJ 490769Speter # ifdef PC 491769Speter while ( next ) { 492769Speter while ( *strptr ) { 493769Speter putprintf( " .byte 0%o" , 1 , *strptr++ ); 494769Speter for ( w = 2 ; ( w <= 8 ) && *strptr ; w ++ ) { 495769Speter putprintf( ",0%o" , 1 , *strptr++ ); 496769Speter } 497769Speter putprintf( "" , 0 ); 498769Speter } 499769Speter putprintf( " .byte 0" , 0 ); 500769Speter strptr = getnext( next , &next ); 501769Speter } 502769Speter putprintf( " .text" , 0 ); 503769Speter # endif PC 504769Speter return( ap -> value[ NL_ELABEL ] ); 505769Speter } 506769Speter 507769Speter getnext(next, new) 508769Speter 509769Speter struct nl *next, **new; 510769Speter { 511769Speter if (next != NIL) { 512769Speter next = next->chain; 513769Speter *new = next; 514769Speter } 515769Speter if (next == NIL) 516769Speter return(""); 517769Speter #ifdef OBJ 5183317Speter if (opt('k') && CGENNING ) 5193317Speter printf("%5d\t\t\"%s\"\n", lc-HEADER_BYTES, next->symbol); 5202213Speter #endif OBJ 521769Speter return(next->symbol); 522769Speter } 523769Speter 524769Speter #ifdef OBJ 525769Speter /* 526769Speter * Putspace puts out a table 527769Speter * of nothing to leave space 528769Speter * for the case branch table e.g. 529769Speter */ 530769Speter putspace(n) 531769Speter int n; 532769Speter { 533769Speter register i; 534769Speter 5353317Speter if ( !CGENNING ) 536769Speter /* 537769Speter * code disabled - do nothing 538769Speter */ 539769Speter return(lc); 540769Speter #ifdef DEBUG 541769Speter if (opt('k')) 5423317Speter printf("%5d\t.=.+%d\n", lc - HEADER_BYTES, n); 543769Speter #endif 544769Speter for (i = even(n); i > 0; i -= 2) 545769Speter word(0); 546769Speter } 547769Speter 548769Speter putstr(sptr, padding) 549769Speter 550769Speter char *sptr; 551769Speter int padding; 552769Speter { 553769Speter register unsigned short w; 554769Speter register char *strptr = sptr; 555769Speter register int pad = padding; 556769Speter 5573317Speter if ( !CGENNING ) 558769Speter /* 559769Speter * code disabled - do nothing 560769Speter */ 561769Speter return(lc); 562769Speter #ifdef DEBUG 563769Speter if (opt('k')) 5643317Speter printf("%5d\t\t\"%s\"\n", lc-HEADER_BYTES, strptr); 565769Speter #endif 566769Speter if (pad == 0) { 567769Speter do { 5683077Smckusic # ifdef DEC11 5693077Smckusic w = (unsigned short) * strptr; 5703077Smckusic # else 5713077Smckusic w = (unsigned short)*strptr<<8; 5723077Smckusic # endif DEC11 573769Speter if (w) 5743077Smckusic # ifdef DEC11 5753077Smckusic w |= *++strptr << 8; 5763077Smckusic # else 5773077Smckusic w |= *++strptr; 5783077Smckusic # endif DEC11 579769Speter word(w); 580769Speter } while (*strptr++); 581769Speter } else { 5823077Smckusic # ifdef DEC11 5833077Smckusic do { 5843077Smckusic w = (unsigned short) * strptr; 5853077Smckusic if (w) { 5863077Smckusic if (*++strptr) 5873077Smckusic w |= *strptr << 8; 5883077Smckusic else { 5893077Smckusic w |= ' \0'; 5903077Smckusic pad--; 5913077Smckusic } 5923077Smckusic word(w); 5933077Smckusic } 5943077Smckusic } while (*strptr++); 5953077Smckusic # else 5963077Smckusic do { 5973077Smckusic w = (unsigned short)*strptr<<8; 5983077Smckusic if (w) { 5993077Smckusic if (*++strptr) 6003077Smckusic w |= *strptr; 6013077Smckusic else { 6023077Smckusic w |= ' '; 6033077Smckusic pad--; 6043077Smckusic } 6053077Smckusic word(w); 6063077Smckusic } 6073077Smckusic } while (*strptr++); 6083077Smckusic # endif DEC11 609769Speter while (pad > 1) { 610769Speter word(' '); 611769Speter pad -= 2; 612769Speter } 613769Speter if (pad == 1) 6143077Smckusic # ifdef DEC11 6153077Smckusic word(' '); 6163077Smckusic # else 6173077Smckusic word(' \0'); 6183077Smckusic # endif DEC11 619769Speter else 620769Speter word(0); 621769Speter } 622769Speter } 623769Speter #endif OBJ 624769Speter 625769Speter lenstr(sptr, padding) 626769Speter 627769Speter char *sptr; 628769Speter int padding; 629769Speter 630769Speter { 631769Speter register int cnt; 632769Speter register char *strptr = sptr; 633769Speter 634769Speter cnt = padding; 635769Speter do { 636769Speter cnt++; 637769Speter } while (*strptr++); 638769Speter return((++cnt) & ~1); 639769Speter } 640769Speter 641769Speter /* 642769Speter * Patch repairs the branch 643769Speter * at location loc to come 644769Speter * to the current location. 645769Speter * for PC, this puts down the label 646769Speter * and the branch just references that label. 647769Speter * lets here it for two pass assemblers. 648769Speter */ 649769Speter patch(loc) 650769Speter { 651769Speter 652769Speter # ifdef OBJ 6533077Smckusic patchfil(loc, (long)(lc-loc-2), 1); 654769Speter # endif OBJ 655769Speter # ifdef PC 656769Speter putlab( loc ); 657769Speter # endif PC 658769Speter } 659769Speter 660769Speter #ifdef OBJ 661769Speter patch4(loc) 662769Speter { 6633077Smckusic patchfil(loc, (long)(lc - HEADER_BYTES), 2); 664769Speter } 665769Speter 666769Speter /* 6677921Smckusick * Patchfil makes loc+2 have jmploc 668769Speter * as its contents. 669769Speter */ 6707921Smckusick patchfil(loc, jmploc, words) 671769Speter PTR_DCL loc; 6727921Smckusick long jmploc; 6733077Smckusic int words; 674769Speter { 675769Speter register i; 67610562Smckusick short val; 677769Speter 6783317Speter if ( !CGENNING ) 679769Speter return; 680769Speter if (loc > (unsigned) lc) 681769Speter panic("patchfil"); 682769Speter #ifdef DEBUG 683769Speter if (opt('k')) 6847921Smckusick printf("\tpatch %u %D\n", loc - HEADER_BYTES, jmploc); 685769Speter #endif 6867921Smckusick val = jmploc; 687769Speter do { 6883077Smckusic # ifndef DEC11 6893077Smckusic if (words > 1) 6907921Smckusick val = jmploc >> 16; 6913077Smckusic else 6927921Smckusick val = jmploc; 6933077Smckusic # endif DEC11 694769Speter i = ((unsigned) loc + 2 - ((unsigned) lc & ~01777))/2; 69510562Smckusick if (i >= 0 && i < 1024) { 6963077Smckusic obuf[i] = val; 69710562Smckusick } else { 698769Speter lseek(ofil, (long) loc+2, 0); 6993077Smckusic write(ofil, &val, 2); 700769Speter lseek(ofil, (long) 0, 2); 701769Speter } 702769Speter loc += 2; 7033077Smckusic # ifdef DEC11 7047921Smckusick val = jmploc >> 16; 7053077Smckusic # endif DEC11 706769Speter } while (--words); 707769Speter } 708769Speter 709769Speter /* 710769Speter * Put the word o into the code 711769Speter */ 712769Speter word(o) 713769Speter int o; 714769Speter { 715769Speter 716769Speter *obufp = o; 717769Speter obufp++; 718769Speter lc += 2; 719769Speter if (obufp >= obuf+512) 720769Speter pflush(); 721769Speter } 722769Speter 723769Speter extern char *obj; 724769Speter /* 725769Speter * Flush the code buffer 726769Speter */ 727769Speter pflush() 728769Speter { 729769Speter register i; 730769Speter 731769Speter i = (obufp - ( ( short * ) obuf ) ) * 2; 732769Speter if (i != 0 && write(ofil, obuf, i) != i) 733769Speter perror(obj), pexit(DIED); 734769Speter obufp = obuf; 735769Speter } 736769Speter #endif OBJ 737769Speter 738769Speter /* 739769Speter * Getlab - returns the location counter. 740769Speter * included here for the eventual code generator. 741769Speter * for PC, thank you! 742769Speter */ 743769Speter getlab() 744769Speter { 745769Speter # ifdef OBJ 746769Speter 747769Speter return (lc); 748769Speter # endif OBJ 749769Speter # ifdef PC 750769Speter static long lastlabel; 751769Speter 752769Speter return ( ++lastlabel ); 753769Speter # endif PC 754769Speter } 755769Speter 756769Speter /* 757769Speter * Putlab - lay down a label. 758769Speter * for PC, just print the label name with a colon after it. 759769Speter */ 760769Speter putlab(l) 761769Speter int l; 762769Speter { 763769Speter 764769Speter # ifdef PC 765769Speter putprintf( PREFIXFORMAT , 1 , LABELPREFIX , l ); 766769Speter putprintf( ":" , 0 ); 767769Speter # endif PC 768769Speter return (l); 769769Speter } 770