1769Speter /* Copyright (c) 1979 Regents of the University of California */ 2769Speter 3*4025Smckusic static char sccsid[] = "@(#)put.c 1.15 07/22/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: 188*4025Smckusic /* sub opcode optimization */ 189*4025Smckusic if (p[1] < 128 && p[1] >= -128 && p[1] != 0) { 190*4025Smckusic suboppr = subop = p[1]; 191*4025Smckusic p++; 192*4025Smckusic n--; 193*4025Smckusic } 194769Speter /* relative addressing */ 195*4025Smckusic p[n - 1] -= ( unsigned ) lc + (n - 1) * sizeof(short); 196769Speter break; 197769Speter case O_CONC: 198769Speter #ifdef DEBUG 199769Speter (string = "'x'")[1] = p[1]; 200769Speter #endif 201769Speter suboppr = 0; 202769Speter op = O_CON1; 2033077Smckusic # ifdef DEBUG 2043077Smckusic cp = otext[O_CON1]; 2053077Smckusic # endif DEBUG 206769Speter subop = p[1]; 207769Speter goto around; 208769Speter case O_CONC4: 209769Speter #ifdef DEBUG 210769Speter (string = "'x'")[1] = p[1]; 211769Speter #endif 212769Speter suboppr = 0; 213769Speter op = O_CON14; 214769Speter subop = p[1]; 215769Speter goto around; 216769Speter case O_CON1: 217769Speter case O_CON14: 218769Speter suboppr = subop = p[1]; 219769Speter around: 220769Speter n--; 221769Speter break; 222769Speter case O_CASEBEG: 223769Speter casewrd = 0; 224769Speter return (oldlc); 225769Speter case O_CASEEND: 226769Speter if ((unsigned) lc & 1) { 227769Speter lc--; 228769Speter word(casewrd); 229769Speter } 230769Speter return (oldlc); 231769Speter case O_CASE1: 232769Speter #ifdef DEBUG 233769Speter if (opt('k')) 2343317Speter printf("%5d\tCASE1\t%d\n" 2353077Smckusic , lc - HEADER_BYTES, p[1]); 236769Speter #endif 237769Speter /* 238769Speter * this to build a byte size case table 239769Speter * saving bytes across calls in casewrd 240769Speter * so they can be put out by word() 241769Speter */ 242769Speter lc++; 243769Speter if ((unsigned) lc & 1) 2443077Smckusic # ifdef DEC11 2453077Smckusic casewrd = p[1] & 0377; 2463077Smckusic # else 2473077Smckusic casewrd = (p[1] & 0377) << 8; 2483077Smckusic # endif DEC11 249769Speter else { 250769Speter lc -= 2; 2513077Smckusic # ifdef DEC11 2523077Smckusic word(((p[1] & 0377) << 8) | casewrd); 2533077Smckusic # else 2543077Smckusic word((p[1] & 0377) | casewrd); 2553077Smckusic # endif DEC11 256769Speter } 257769Speter return (oldlc); 258769Speter case O_CASE2: 259769Speter #ifdef DEBUG 260769Speter if (opt('k')) 2613317Speter printf("%5d\tCASE2\t%d\n" 2623077Smckusic , lc - HEADER_BYTES , p[1]); 263769Speter #endif 2643077Smckusic word(p[1]); 265769Speter return (oldlc); 266*4025Smckusic case O_FOR4U: 267*4025Smckusic case O_FOR4D: 268*4025Smckusic /* sub opcode optimization */ 269*4025Smckusic lp = (long *)&p[1]; 270*4025Smckusic if (*lp < 128 && *lp >= -128 && *lp != 0) { 271*4025Smckusic suboppr = subop = *lp; 272*4025Smckusic p += (sizeof(long) / sizeof(int)); 273*4025Smckusic n--; 274*4025Smckusic } 275*4025Smckusic /* relative addressing */ 276*4025Smckusic p[1 + (n - 2) * (sizeof(long) / sizeof(int))] -= 277*4025Smckusic (unsigned)lc + (sizeof(short) + 278*4025Smckusic (n - 2) * sizeof(long)); 279*4025Smckusic goto longgen; 280769Speter case O_PUSH: 2813077Smckusic lp = (long *)&p[1]; 2823077Smckusic if (*lp == 0) 283769Speter return (oldlc); 284*4025Smckusic /* and fall through */ 285*4025Smckusic case O_RANG4: 286*4025Smckusic case O_RANG24: 287*4025Smckusic case O_RSNG4: 288*4025Smckusic case O_RSNG24: 289*4025Smckusic case O_SUCC4: 290*4025Smckusic case O_PRED4: 291*4025Smckusic /* sub opcode optimization */ 292*4025Smckusic lp = (long *)&p[1]; 293*4025Smckusic if (*lp < 128 && *lp >= -128 && *lp != 0) { 2943077Smckusic suboppr = subop = *lp; 295*4025Smckusic p += (sizeof(long) / sizeof(int)); 296769Speter n--; 297769Speter } 298769Speter goto longgen; 299769Speter case O_TRA4: 300769Speter case O_CALL: 3011199Speter case O_FSAV: 302769Speter case O_GOTO: 303769Speter case O_NAM: 304769Speter case O_READE: 305769Speter /* absolute long addressing */ 3063077Smckusic lp = (long *)&p[1]; 3073077Smckusic *lp -= HEADER_BYTES; 308769Speter goto longgen; 309769Speter case O_RV1: 310769Speter case O_RV14: 311769Speter case O_RV2: 312769Speter case O_RV24: 313769Speter case O_RV4: 314769Speter case O_RV8: 315769Speter case O_RV: 316769Speter case O_LV: 3172105Smckusic /* 3182105Smckusic * positive offsets represent arguments 3192105Smckusic * and must use "ap" display entry rather 3202105Smckusic * than the "fp" entry 3212105Smckusic */ 3222105Smckusic if (p[1] >= 0) { 3232105Smckusic subop++; 3242105Smckusic suboppr++; 3252105Smckusic } 3263077Smckusic # ifdef PDP11 3273077Smckusic break; 3283077Smckusic # else 3293077Smckusic /* 3303077Smckusic * offsets out of range of word addressing 3313077Smckusic * must use long offset opcodes 3323077Smckusic */ 3333077Smckusic if (p[1] < SHORTADDR && p[1] >= -SHORTADDR) 3343077Smckusic break; 3353077Smckusic else { 336769Speter op += O_LRV - O_RV; 3373077Smckusic # ifdef DEBUG 3383077Smckusic cp = otext[op]; 3393077Smckusic # endif DEBUG 3403077Smckusic } 3413077Smckusic /* and fall through */ 3423077Smckusic # endif PDP11 343769Speter case O_BEG: 344769Speter case O_NODUMP: 345769Speter case O_CON4: 346769Speter case O_CASE4: 347769Speter longgen: 348769Speter n = (n << 1) - 1; 3492184Smckusic if ( op == O_LRV || op == O_FOR4U || op == O_FOR4D) 350769Speter n--; 351769Speter #ifdef DEBUG 3523077Smckusic if (opt('k')) { 3533317Speter printf("%5d\t%s", lc - HEADER_BYTES, cp+1); 354769Speter if (suboppr) 3553077Smckusic printf(":%d", suboppr); 3563077Smckusic for ( i = 2, lp = (long *)&p[1]; i < n 357769Speter ; i += sizeof ( long )/sizeof ( short ) ) 358769Speter printf( "\t%D " , *lp ++ ); 3593377Speter if (i == n) { 3603377Speter sp = (short *)lp; 3613377Speter printf( "\t%d ", *sp ); 3623377Speter } 363769Speter pchr ( '\n' ); 3643077Smckusic } 365769Speter #endif 366769Speter if ( op != O_CASE4 ) 3673077Smckusic # ifdef DEC11 3683077Smckusic word((op & 0377) | subop << 8); 3693077Smckusic # else 3703077Smckusic word(op << 8 | (subop & 0377)); 3713077Smckusic # endif DEC11 3723077Smckusic for ( i = 1, sp = (short *)&p[1]; i < n; i++) 3733077Smckusic word ( *sp ++ ); 374769Speter return ( oldlc ); 375769Speter } 376769Speter #ifdef DEBUG 377769Speter if (opt('k')) { 3783317Speter printf("%5d\t%s", lc - HEADER_BYTES, cp+1); 379769Speter if (suboppr) 380769Speter printf(":%d", suboppr); 381769Speter if (string) 382769Speter printf("\t%s",string); 383769Speter if (n > 1) 384769Speter pchr('\t'); 385769Speter for (i=1; i<n; i++) 3863077Smckusic printf("%d ", p[i]); 387769Speter pchr('\n'); 388769Speter } 389769Speter #endif 390769Speter if (op != NIL) 3913077Smckusic # ifdef DEC11 3923077Smckusic word((op & 0377) | subop << 8); 3933077Smckusic # else 3943077Smckusic word(op << 8 | (subop & 0377)); 3953077Smckusic # endif DEC11 396769Speter for (i=1; i<n; i++) 397769Speter word(p[i]); 398769Speter return (oldlc); 399769Speter } 400769Speter #endif OBJ 401769Speter 402769Speter /* 403769Speter * listnames outputs a list of enumerated type names which 404769Speter * can then be selected from to output a TSCAL 405769Speter * a pointer to the address in the code of the namelist 406769Speter * is kept in value[ NL_ELABEL ]. 407769Speter */ 408769Speter listnames(ap) 409769Speter 410769Speter register struct nl *ap; 411769Speter { 412769Speter struct nl *next; 413769Speter register int oldlc, len; 414769Speter register unsigned w; 415769Speter register char *strptr; 416769Speter 4173317Speter if ( !CGENNING ) 418769Speter /* code is off - do nothing */ 419769Speter return(NIL); 420769Speter if (ap->class != TYPE) 421769Speter ap = ap->type; 422769Speter if (ap->value[ NL_ELABEL ] != 0) { 423769Speter /* the list already exists */ 424769Speter return( ap -> value[ NL_ELABEL ] ); 425769Speter } 426769Speter # ifdef OBJ 427769Speter oldlc = lc; 428769Speter put(2, O_TRA, lc); 429769Speter ap->value[ NL_ELABEL ] = lc; 430769Speter # endif OBJ 431769Speter # ifdef PC 432769Speter putprintf( " .data" , 0 ); 433769Speter putprintf( " .align 1" , 0 ); 434769Speter ap -> value[ NL_ELABEL ] = getlab(); 435769Speter putlab( ap -> value[ NL_ELABEL ] ); 436769Speter # endif PC 437769Speter /* number of scalars */ 438769Speter next = ap->type; 439769Speter len = next->range[1]-next->range[0]+1; 440769Speter # ifdef OBJ 441769Speter put(2, O_CASE2, len); 442769Speter # endif OBJ 443769Speter # ifdef PC 444769Speter putprintf( " .word %d" , 0 , len ); 445769Speter # endif PC 446769Speter /* offsets of each scalar name */ 447769Speter len = (len+1)*sizeof(short); 448769Speter # ifdef OBJ 449769Speter put(2, O_CASE2, len); 450769Speter # endif OBJ 451769Speter # ifdef PC 452769Speter putprintf( " .word %d" , 0 , len ); 453769Speter # endif PC 454769Speter next = ap->chain; 455769Speter do { 456769Speter for(strptr = next->symbol; *strptr++; len++) 457769Speter continue; 458769Speter len++; 459769Speter # ifdef OBJ 460769Speter put(2, O_CASE2, len); 461769Speter # endif OBJ 462769Speter # ifdef PC 463769Speter putprintf( " .word %d" , 0 , len ); 464769Speter # endif PC 465769Speter } while (next = next->chain); 466769Speter /* list of scalar names */ 467769Speter strptr = getnext(ap, &next); 468769Speter # ifdef OBJ 469769Speter do { 4703077Smckusic # ifdef DEC11 4713077Smckusic w = (unsigned) *strptr; 4723077Smckusic # else 4733077Smckusic w = *strptr << 8; 4743077Smckusic # endif DEC11 475769Speter if (!*strptr++) 476769Speter strptr = getnext(next, &next); 4773077Smckusic # ifdef DEC11 4783077Smckusic w |= *strptr << 8; 4793077Smckusic # else 4803077Smckusic w |= (unsigned) *strptr; 4813077Smckusic # endif DEC11 482769Speter if (!*strptr++) 483769Speter strptr = getnext(next, &next); 484769Speter word(w); 485769Speter } while (next); 486769Speter /* jump over the mess */ 487769Speter patch(oldlc); 488769Speter # endif OBJ 489769Speter # ifdef PC 490769Speter while ( next ) { 491769Speter while ( *strptr ) { 492769Speter putprintf( " .byte 0%o" , 1 , *strptr++ ); 493769Speter for ( w = 2 ; ( w <= 8 ) && *strptr ; w ++ ) { 494769Speter putprintf( ",0%o" , 1 , *strptr++ ); 495769Speter } 496769Speter putprintf( "" , 0 ); 497769Speter } 498769Speter putprintf( " .byte 0" , 0 ); 499769Speter strptr = getnext( next , &next ); 500769Speter } 501769Speter putprintf( " .text" , 0 ); 502769Speter # endif PC 503769Speter return( ap -> value[ NL_ELABEL ] ); 504769Speter } 505769Speter 506769Speter getnext(next, new) 507769Speter 508769Speter struct nl *next, **new; 509769Speter { 510769Speter if (next != NIL) { 511769Speter next = next->chain; 512769Speter *new = next; 513769Speter } 514769Speter if (next == NIL) 515769Speter return(""); 516769Speter #ifdef OBJ 5173317Speter if (opt('k') && CGENNING ) 5183317Speter printf("%5d\t\t\"%s\"\n", lc-HEADER_BYTES, next->symbol); 5192213Speter #endif OBJ 520769Speter return(next->symbol); 521769Speter } 522769Speter 523769Speter #ifdef OBJ 524769Speter /* 525769Speter * Putspace puts out a table 526769Speter * of nothing to leave space 527769Speter * for the case branch table e.g. 528769Speter */ 529769Speter putspace(n) 530769Speter int n; 531769Speter { 532769Speter register i; 533769Speter 5343317Speter if ( !CGENNING ) 535769Speter /* 536769Speter * code disabled - do nothing 537769Speter */ 538769Speter return(lc); 539769Speter #ifdef DEBUG 540769Speter if (opt('k')) 5413317Speter printf("%5d\t.=.+%d\n", lc - HEADER_BYTES, n); 542769Speter #endif 543769Speter for (i = even(n); i > 0; i -= 2) 544769Speter word(0); 545769Speter } 546769Speter 547769Speter putstr(sptr, padding) 548769Speter 549769Speter char *sptr; 550769Speter int padding; 551769Speter { 552769Speter register unsigned short w; 553769Speter register char *strptr = sptr; 554769Speter register int pad = padding; 555769Speter 5563317Speter if ( !CGENNING ) 557769Speter /* 558769Speter * code disabled - do nothing 559769Speter */ 560769Speter return(lc); 561769Speter #ifdef DEBUG 562769Speter if (opt('k')) 5633317Speter printf("%5d\t\t\"%s\"\n", lc-HEADER_BYTES, strptr); 564769Speter #endif 565769Speter if (pad == 0) { 566769Speter do { 5673077Smckusic # ifdef DEC11 5683077Smckusic w = (unsigned short) * strptr; 5693077Smckusic # else 5703077Smckusic w = (unsigned short)*strptr<<8; 5713077Smckusic # endif DEC11 572769Speter if (w) 5733077Smckusic # ifdef DEC11 5743077Smckusic w |= *++strptr << 8; 5753077Smckusic # else 5763077Smckusic w |= *++strptr; 5773077Smckusic # endif DEC11 578769Speter word(w); 579769Speter } while (*strptr++); 580769Speter } else { 5813077Smckusic # ifdef DEC11 5823077Smckusic do { 5833077Smckusic w = (unsigned short) * strptr; 5843077Smckusic if (w) { 5853077Smckusic if (*++strptr) 5863077Smckusic w |= *strptr << 8; 5873077Smckusic else { 5883077Smckusic w |= ' \0'; 5893077Smckusic pad--; 5903077Smckusic } 5913077Smckusic word(w); 5923077Smckusic } 5933077Smckusic } while (*strptr++); 5943077Smckusic # else 5953077Smckusic do { 5963077Smckusic w = (unsigned short)*strptr<<8; 5973077Smckusic if (w) { 5983077Smckusic if (*++strptr) 5993077Smckusic w |= *strptr; 6003077Smckusic else { 6013077Smckusic w |= ' '; 6023077Smckusic pad--; 6033077Smckusic } 6043077Smckusic word(w); 6053077Smckusic } 6063077Smckusic } while (*strptr++); 6073077Smckusic # endif DEC11 608769Speter while (pad > 1) { 609769Speter word(' '); 610769Speter pad -= 2; 611769Speter } 612769Speter if (pad == 1) 6133077Smckusic # ifdef DEC11 6143077Smckusic word(' '); 6153077Smckusic # else 6163077Smckusic word(' \0'); 6173077Smckusic # endif DEC11 618769Speter else 619769Speter word(0); 620769Speter } 621769Speter } 622769Speter #endif OBJ 623769Speter 624769Speter lenstr(sptr, padding) 625769Speter 626769Speter char *sptr; 627769Speter int padding; 628769Speter 629769Speter { 630769Speter register int cnt; 631769Speter register char *strptr = sptr; 632769Speter 633769Speter cnt = padding; 634769Speter do { 635769Speter cnt++; 636769Speter } while (*strptr++); 637769Speter return((++cnt) & ~1); 638769Speter } 639769Speter 640769Speter /* 641769Speter * Patch repairs the branch 642769Speter * at location loc to come 643769Speter * to the current location. 644769Speter * for PC, this puts down the label 645769Speter * and the branch just references that label. 646769Speter * lets here it for two pass assemblers. 647769Speter */ 648769Speter patch(loc) 649769Speter { 650769Speter 651769Speter # ifdef OBJ 6523077Smckusic patchfil(loc, (long)(lc-loc-2), 1); 653769Speter # endif OBJ 654769Speter # ifdef PC 655769Speter putlab( loc ); 656769Speter # endif PC 657769Speter } 658769Speter 659769Speter #ifdef OBJ 660769Speter patch4(loc) 661769Speter { 6623077Smckusic patchfil(loc, (long)(lc - HEADER_BYTES), 2); 663769Speter } 664769Speter 665769Speter /* 666769Speter * Patchfil makes loc+2 have value 667769Speter * as its contents. 668769Speter */ 669769Speter patchfil(loc, value, words) 670769Speter PTR_DCL loc; 6713077Smckusic long value; 6723077Smckusic int words; 673769Speter { 674769Speter register i; 6753077Smckusic int val; 676769Speter 6773317Speter if ( !CGENNING ) 678769Speter return; 679769Speter if (loc > (unsigned) lc) 680769Speter panic("patchfil"); 681769Speter #ifdef DEBUG 682769Speter if (opt('k')) 6833317Speter printf("\tpatch %u %D\n", loc - HEADER_BYTES, value); 684769Speter #endif 6853077Smckusic val = value; 686769Speter do { 6873077Smckusic # ifndef DEC11 6883077Smckusic if (words > 1) 6893077Smckusic val = value >> 16; 6903077Smckusic else 6913077Smckusic val = value; 6923077Smckusic # endif DEC11 693769Speter i = ((unsigned) loc + 2 - ((unsigned) lc & ~01777))/2; 694769Speter if (i >= 0 && i < 1024) 6953077Smckusic obuf[i] = val; 696769Speter else { 697769Speter lseek(ofil, (long) loc+2, 0); 6983077Smckusic write(ofil, &val, 2); 699769Speter lseek(ofil, (long) 0, 2); 700769Speter } 701769Speter loc += 2; 7023077Smckusic # ifdef DEC11 7033077Smckusic val = value >> 16; 7043077Smckusic # endif DEC11 705769Speter } while (--words); 706769Speter } 707769Speter 708769Speter /* 709769Speter * Put the word o into the code 710769Speter */ 711769Speter word(o) 712769Speter int o; 713769Speter { 714769Speter 715769Speter *obufp = o; 716769Speter obufp++; 717769Speter lc += 2; 718769Speter if (obufp >= obuf+512) 719769Speter pflush(); 720769Speter } 721769Speter 722769Speter extern char *obj; 723769Speter /* 724769Speter * Flush the code buffer 725769Speter */ 726769Speter pflush() 727769Speter { 728769Speter register i; 729769Speter 730769Speter i = (obufp - ( ( short * ) obuf ) ) * 2; 731769Speter if (i != 0 && write(ofil, obuf, i) != i) 732769Speter perror(obj), pexit(DIED); 733769Speter obufp = obuf; 734769Speter } 735769Speter #endif OBJ 736769Speter 737769Speter /* 738769Speter * Getlab - returns the location counter. 739769Speter * included here for the eventual code generator. 740769Speter * for PC, thank you! 741769Speter */ 742769Speter getlab() 743769Speter { 744769Speter # ifdef OBJ 745769Speter 746769Speter return (lc); 747769Speter # endif OBJ 748769Speter # ifdef PC 749769Speter static long lastlabel; 750769Speter 751769Speter return ( ++lastlabel ); 752769Speter # endif PC 753769Speter } 754769Speter 755769Speter /* 756769Speter * Putlab - lay down a label. 757769Speter * for PC, just print the label name with a colon after it. 758769Speter */ 759769Speter putlab(l) 760769Speter int l; 761769Speter { 762769Speter 763769Speter # ifdef PC 764769Speter putprintf( PREFIXFORMAT , 1 , LABELPREFIX , l ); 765769Speter putprintf( ":" , 0 ); 766769Speter # endif PC 767769Speter return (l); 768769Speter } 769