Web pdp-10.trailing-edge.com

Trailing-Edge - PDP-10 Archives - decuslib10-12 - 43,50547/pltlib/cplot1/circle.mac
There is 1 other file named circle.mac in the archive. Click here to see a list.
```	TITLE CIRCLE - ROUTINE TO PLOT CIRCLES, HAS OPTIONAL ARGUMENTS
SUBTTL BY JOE SMITH, 16 AUG 76

COMMENT	&
THIS IS A FORTRAN-10 CALLABLE ROUTINE TO PLOT CIRCLES.  3 ARGUMENTS ARE
REQUIRED, UP TO 9 MAY BE SPECIFIED.

EXAMPLES

X0 AND Y0 ARE THE COORDINATES OF THE CENTER (IN INCHES), RAD IS THE RADIUS

CALL CIRCLE (X0, Y0, RAD, ANG)
ANG AND GOING COUNTERCLOCKWISE 180 DEGREES.  ANG IS THE ANGLE IN DEGREES
MEASURED COUNTERCLOCKWISE FROM THE X-AXIS.

CALL CIRCLE (X0, Y0, RAD, ANG1, ANG2)
DRAWS A CIRCULAR ARC FROM ANGLE ANG1 TO ANGLE ANG2.

TO THE "CENTER" (X0,Y0).  IF ANG1=ANG2, A STRAIGHT LINE WILL BE DRAWN
FROM RAD1 TO RAD2 ALONG THE SPECIFIED ANGLE AND RELATIVE TO (X0,Y0).

DRAWS A DASHED CIRCLE (OR SPIRAL).  DASH IS THE DISTANCE (IN INCHES)
FOR THE PEN TO BE UP OR DOWN.

DRAWS A DASHED CIRCLE (OR SPIRAL).  DOWN AND UP ARE IN INCHES.
DOWN IS THE DISTANCE THAT THE PEN WILL BE DOWN AND UP IS THE DISTANCE
FOR THE PEN TO BE UP.

STEP IS THE SIZE OF THE STEPS USED IN APPROXIMATING THE CIRCLE.
THE DEFAULT SIZE IS 5.0 DEGREES (72 STEPS).  THE MAGNITUDE OF STEP
IS USED, 0 MEANS USE THE DEFAULT SIZE (5.0 DEGREES)

IF X0 OR Y0 ARE 999.0, THE CURRENT PEN POSITION WILL BE USED FOR
THE RESPECTIVE	COORDINATE.

CALL CIRCLE (X0, Y0, 0.0, ANGLE, ANGLE, 1.0)
CALL CIRCLE (999.0, 999.0, 0.1, ANGLE+90.0, ANGLE+90.0, 0.0)
WILL PLOT A ONE INCH LINE AT THE SPECIFIED ANGLE AND A TENTH
INCH LINE PERPENDICULAR TO THE END

THIS SUBROUTINE CALLS DASH2 (XSTART, YSTART, XEND, YEND, DOWN, UP)

***********		Original FORTRAN subroutine		*************

SUBROUTINE CIRCLE (X0, Y0, START, STOP, STEP, R1, R2, DOWN, UP)
IF (X0 .GT. 999.0)  X0=X
IF (Y0 .GT. 999.0)  Y0=Y
IF (STEP .EQ. 0.0  .OR.  DOWN .LE. 0.0)  RETURN
XSTART=COSD (START) * R1 + X0
YSTART=SIND (START) * R1 + Y0
IF (START .EQ. STOP)  GOTO 20
CALL DASH2 (XSTART, YSTART, XSTART, YSTART, 0.0, UP)
DIFF=(R2-R1) / (STOP-START)
DO 10 DEGREE=START+STEP, STOP+STEP/2.0, STEP
X=COSD (DEGREE) * RADIUS + X0
Y=SIND (DEGREE) * RADIUS + Y0
10	CALL DASH2 (1000.0, 1000.0, X, Y, DOWN, UP)
RETURN
20	X=COSD (STOP) * R2 + X0
Y=SIND (STOP) * R2 + Y0
CALL DASH2 (XSTART, YSTART, X, Y, DOWN, UP)
RETURN
END

&	;End of COMMENT
```
```	SUBTTL	FIRST 3 ARGS

AC0=0
TEMP=AC0+1
DEG=TEMP+1
COS=SIN+1
P=17				;FORTRAN PUSH DOWN LIST
SIZE=5.0	;DEFAULT STEP SIZE, MUST BE POSITIVE FLOATING POINT

ENTRY CIRCLE
EXTERN COSD., SIND., DASH2, WHERE

SIXBIT	/CIRCLE/		;FOR SUBROUTINE TRACE
CIRCLE:	MOVEM	L,.CIR16		;SAVE ORIGINAL LINK
MOVEI	L,WHER			;FIND OUT WHERE WE ARE
PUSHJ	P,WHERE			;ANSWERS IN XEND, YEND

MOVE	L,.CIR16		;GET BACK THE LINK
MOVE	TEMP,@0(L)		;GET X ORGIN
CAMN	TEMP,NINE99		;IS IT EQUAL TO 999.0
MOVE	TEMP,XEND		;YES, USE OLD VALUE
MOVEM	TEMP,XORIG		;STORE X ORIGIN

MOVE	TEMP,@1(L)		;GET Y ORGIN
CAMN	TEMP,NINE99		;IS IT EQUAL TO 999.0
MOVE	TEMP,YEND		;YES, USE OLD VALUE
MOVEM	TEMP,YORIG		;STORE Y ORIGIN

MOVSI	TEMP,(SIZE)		;GET THE DEFAULT SIZE
MOVEM	TEMP,STEP		;STORE STEP SIZE
SETZB	DEG,UP			;START AT 0 DEGREES, PEN NOT UP
MOVSI	SIN,(360.0)		;360.0 DEGREES
MOVEM	SIN,ANG2		;TO GO FULL CIRCLE

HLRZ	TEMP,-1(L)		;GET NUMBER OF ARGUMENTS
CAIL	TEMP,-^D9		;MAX OF 9 ARGS
JRST	@NUMARG(TEMP)		;DEPENDING ON NUMBER OF ARGS
JRST	ARG9
ARG9
ARG8
ARG7
ARG6
ARG5
ARG4
ARG3
RETURN				;ONLY 2 ARGS
RETURN				;ONLY 1 ARG
NUMARG:	RETURN				;REFUSE TO DO ANYTHING
```
```	SUBTTL	PICK UP OPTIONAL ARGUMENTS

ARG9:	MOVM	TEMP,@8(L)		;GET MAGNITUDE OF STEP SIZE
SKIPE	TEMP			;USE DEFAULT IF ZERO
MOVEM	TEMP,STEP		;NONZERO, USE IT

ARG8:	MOVE	TEMP,@7(L)		;GET DISTANCE FOR PEN UP
MOVEM	TEMP,UP			;AND STORE IT
MOVE	TEMP,@6(L)		;GET DISTANGE FOR PEN DOWN
MOVEM	TEMP,DOWN		;AND STORE IT
JRST	ARG6

ARG7:	MOVE	TEMP,@6(L)		;GET DISTANCE FOR PEN DOWN
MOVEM	TEMP,DOWN		;AND STORE IT
MOVEM	TEMP,UP			;AS UP DISTANCE ALSO

ARG5:	MOVE	TEMP,@4(L)		;GET ENDING ANGLE
MOVEM	TEMP,ANG2		;AND STORE IT
MOVE	DEG,@3(L)		;GET STARTING ANGLE
JRST	ARG3

ARG4:	MOVE	DEG,@3(L)		;GET STARTING ANGLE
FSC	SIN,-1			;DIVIDE 360 BY 2
MOVEM	SIN,ANG2		;STORE AS ENDING ANGLE

;ALL ARGUMENTS HAVE BEEN DEFINED

ARG3:	MOVEM	DEG,DEGREE		;SET TO STARTING ANGLE
PUSHJ	P,COSD.			;FIND COSINE OF ANGLE
MOVEM	AC0,COS			;SAVE THE COSINE
MOVEM	AC0,XSTART		;SAVE IN XSTART

PUSHJ	P,SIND.			;SINE, SAME ANGLE
MOVEM	AC0,SIN			;SAVE THE SINE
MOVEM	AC0,YSTART		;SAVE IN YSTART
FSBR	DEG,ANG2		;FIND THE DIFFERENCE BETWEEN ANGLES
JUMPE	DEG,LINE		;THE SAME, DRAW STRAIGHT LINE
```
```	SUBTTL	DRAW CIRCLE

SKIPL	DEG			;SEE IF WE GO CLOCKWISE
MOVNS	STEP			;YES, NEGATE STEP SIZE
JRST	LOOP0			;START CIRCLE

;SUBROUTINES DESTROY THE AC'S, SO ALL PERTAINANT VALUES ARE STORED IN MEMORY
LOOP:	MOVE	TEMP,NINE99		;TELL DASH2 TO USE OLD POSITION
MOVEM	TEMP,XSTART		;STORE AS OLD POSITION
MOVEM	TEMP,YSTART

LOOP0:	MOVE	DEG,STEP		;GET STEP SIZE
FSBR	DEG,ANG2		;HOW MUCH MORE TO DO ?
FADR	DEG,STEP		;IN CASE WE ARE WITHIN ONE STEP
XOR	DEG,STEP		;EXCLUSIVE OR THE SIGN BITS
JUMPGE	DEG,LAST		;IF STEP AND DEG HAD SAME SIGN
FMPR	RAD,RATIO		;MULTIPLY BY THE RATIO

MOVEI	L,TRIG			;LINK TO THE DEGREES AGRUMENT
PUSHJ	P,COSD.			;FIND THE COSINE
MOVEM	AC0,XEND		;SAVE RESULT FOR DASH2

PUSHJ	P,SIND.			;FIND SINE OF SAME ANGLE
MOVEM	AC0,YEND		;AND SAVE

MOVEI	L,DASARG		;LINK TO DASH2 ARGUEMENTS
PUSHJ	P,DASH2			;PLOT THIS LINE SEGMENT
JRST	LOOP			;GO BACK FOR MORE
```
```	SUBTTL	LAST MOVE

LAST:	MOVE	DEG,ANG2		;GET THE FINAL ANGLE
MOVEM	DEG,DEGREE		;STORE IT
MOVEI	L,TRIG			;LINK TO TRIG FUNCTIONS
PUSHJ	P,COSD.			;FIND THE COSINE
MOVEM	AC0,COS			;KEEP IT
PUSHJ	P,SIND.			;SINE, SAME ANGLE
MOVEM	AC0,SIN			;KEEP IT
;FALL INTO LINE

;LINE - FOR PLOTTING A STRAIGHT LINE AT SPECIFIED ANGLE

MOVEM	COS,XEND		;SO DASH2 CAN FIND IT
MOVEM	SIN,YEND		;SAVE IT
MOVEI	L,DASARG		;LINK TO ARG LIST FOR DASH2
PUSHJ	P,DASH2			;PLOT LINE
;FALL INTO RETURN

RETURN:	MOVE	L,.CIR16		;RESTORE OLD LINK
POPJ	P,			;AND RETURN
;ALL ARGUMENTS ARE RETURNED UNCHANGED
```
```	SUBTTL	WORK STORAGE AREA

;ARGUMENT BLOCKS:

-3,,0
WHER:	200,,XEND		;FOR WHERE
200,,YEND
200,,UP			;VALUE IS NOT USED

-1,,0
TRIG:	200,,DEGREE			;FOR COSD. AND SIND.

-6,,0
DASARG:	200,,XSTART			;FOR DASH2
200,,YSTART
200,,XEND
200,,YEND
200,,DOWN
200,,UP

NINE99:	999.0				;OLD VALUE

;VARIABLES

INTEGER .CIR16, XEND, XORIG, YEND, YORIG, RADIUS
INTEGER STEP, UP, DOWN, ANG2, DEGREE, RATIO, XSTART, YSTART

END
```