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