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