xref: /csrg-svn/usr.bin/pascal/src/put.c (revision 10791)
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