#define CHAR	0100000
#define LONGV	0104000
#define POINT	0114000
#define INT7	03600
#define LINE0	04
#define DJMP	0160000
#define INTX	040000
#define MAXX	01777
#define MAXY	01377
#define MINUS	020000
#define DSTOP	0173000

#define SWR	0177570
#define DPC	0172000

#define MOVE	0
#define	DRAW	1
#define TEXT	2
#define END	3

#define EVER	;;

int *pfp, *dfp, *plotfile, *odd, *even;

int a[] =
{	16384,
	8192,
	4836,
	2555,
	1297,
	651,
	326,
	163,
	81,
	41,
	20,
	10,
	5,
	3,
	1,
	1,
	0
};

cordic(p, q, theta)
int *p, *q, theta;
{	int x, y, j, *r;
	register int dx, dy, k;
	dx = *p;
	dy = *q;
	x = 0;
	y = 0;
	r = a;
	for(j = 0;; ++j)
	{	if(theta < 0)
		{	x += dy;
			y -= dx;
			theta += *r++;
		}
		else
		{	x -= dy;
			y += dx;
			theta -= *r++;
		}
		if(*r == 0)
			break;
		dx = x;
		dy = y;
		for(k = j; k; --k)
		{	dx >>= 1;
			dy >>= 1;
		}
	}
	*p = x;
	*q = y;
}

code(x, last)
int x, *last;
{	register int dx, k;
	dx = x - *last;
	*last = x;
	for(k = 6; k; --k)
		dx >>= 1;
	if(dx < 0)
		return((-dx)&MAXX|MINUS);
	else	return(dx&MAXX);
}

main()
{	int theta, phi, dtheta, dphi, x, y, z, flag;
	int start, lastx, lasty;
	int *dpc;
	register int *pfp, *dfp;
	dpc = (int *)DPC;
	theta = 0;
	phi = 0;
	flag = 0;
	for(EVER)
	{	start = dfp = flag?odd:even;
		*dfp++ = POINT|INT7|LINE0;
		lastx = *dfp++ = MAXX>>1;
		lasty = *dfp++ = MAXY>>1;
		*dfp++ = LONGV;
		for(pfp = plotfile; *pfp != END;)
		{	switch(*pfp++)
			{
			case MOVE:
				x = *pfp++;
				y = *pfp++;
				z = *pfp++;
				cordic(&x, &y, theta);
				cordic(&x, &z, phi);
				*dfp++ = code(x, &lastx);
				*dfp++ = code(y, &lasty);
				break;
			case DRAW:
				x = *pfp++;
				y = *pfp++;
				z = *pfp++;
				cordic(&x, &y, theta);
				cordic(&x, &z, phi);
				*dfp++ = code(x, &lastx)|INTX;
				*dfp++ = code(y, &lasty);
				break;
			case TEXT:
				*dfp = CHAR;
				while(*dfp++ = *pfp++);
				*dfp++ = LONGV;
				break;
			default:
				error();
			}
		}
		*dfp++ = DJMP;
		*dfp++ = start;
		*dpc = start;
	}
}
