DRAWS
* /--- FILE TYPE = E
* /--- BLOCK DRAWS 00 000 77/07/19 19.16
IDENT PLAT18$
LCC OVERLAY(PLATO,1,0)
END
IDENT DRAWS
TITLE DRAWS OVERLAYS FOR COMMAND EXECUTION
*
*
CST
*
*
DRAWS$ OVFILE
*
*
EXT PROC,PROCO
EXT ERROROF
EXT ILOC,VARCNT,VARADD
EXT GETCODX
EXT XDATA,YDATA,SCALXY
EXT WINDBUF
EXT XSLICE,SIMPLOT
*
*
* /--- BLOCK DRAWOV 00 000 79/10/04 04.05
TITLE DRAWOV -DRAW- -RDRAW- -GDRAW-
*** DRAWOV -- OVERLAY FOR SLOW DRAW COMMANDS
* ORIGINALLY WRITTEN BY B SHERWOOD
* MODIFIED 6/74 FOR GDRAW/RDRAW D. SHIRER
* REWRITTEN 10/10/75 L.A.WHITE
*
* IF -DRAW- COMMAND IS WINDOWED, WILL COME HERE.
* -RDRAW- AND -GDRAW- BOTH COME HERE.
*
* ON ENTRY---
* THERE IS AT LEAST 70 WORDS LEFT IN MOUT BUFFER.
* OVARG1= -1 RDRAW
* 0 DRAW
* 1 GDRAW
*
* X5 = COMMAND WORD
* BIT 59=CONTINUED DRAW FLAG
* BIT 58=PACKED UP DRAW FLAG
* (IGNORED BY THIS ROUTINE)
* BITS 40-57=COUNT OF GETVAR CODES
* BITS 20-39=FIRST GETVAR CODE
* BITS 0-19=XSTOR OFFSET + COMMAND NUMBER
*
* THE TOP TWO BITS OF EACH GETVAR CODE ARE
* USED AS FOLLOWS---
* 00 = COARSE GRID GETVAR CODE
* 01 = X-COORD FINE GRID GETVAR CODE
* (FOLLOWING GETVAR CODE IS Y-COORD)
* 10 = PACKED UP FINE GRID, 9BITS X, 9BITS Y
* 11 = SKIP INDICATOR
*
* ROUTINE PROCEDURE---
* GETVAR CODES PLACED IN VARBUF
* CODES EVALUATED ONE AT A TIME,
* PLACING RESULTS IN TEMPORARY BUFFER
* RDRAW MAY THEN SCAN THE TEMPORARY BUFFER,
* RELOCATING POINTS
* THEN POINTS ARE OUTPUT INTO *MOUT* BUFFER,
* WINDOWED IF NECESSARY.
*
* TEMPORARY BUFFER --
DRWBUF EQU INFO MAY USE 64*2+EPSILON WORDS
*
* /--- BLOCK DRAW 00 000 78/05/05 01.16
EJECT
NDRAWOV OVRLAY
BX6 X5
AX6 60-XCODEL GET NO. OF VARS TO DECODE
SX6 X6+1 ADD 1 TO INCLUDE COUNT ITSELF
RJ GETCODX GETVAR CODES IN VARBUF
MX6 -1 MARK *INFO* BUFFER USED
SA6 JJSTORE
SX6 DRWBUF BUFFER FOR X,Y
SA6 ILOC ILOC->CURRENT BUFFER LOCATION
SX6 VARBUF+1 X6 -> FIRST VARIABLE
SA2 VARCNT
SX7 X2-1 X7 = COUNT OF POINTS REMAINING
*
* GET NEXT GETVAR CODE ---
* X7= COUNT OF POINTS LEFT
* A2=ADDRESS OF VARCNT
* X6->NEXT GETVAR CODE
DRAWX5 ZR X7,DRAWEM IF DONE
SA7 A2 UPDATE VARCNT
SA2 X6 X2 = THIS GETVAR CODE
SA6 VARADD UPDATE ->GETVAR CODES
MX0 2
BX5 -X0*X2 GETVAR CODE IN TOP OF X5
BX2 X0*X2 TYPE OF CODE BITS IN X2
LX2 2
SB2 X2 00=COARSE, 01=FINE,
JP *+1+B2 10=PACKED FINE, 11=SKIP
+ EQ CGDRAW COARSE GRID VERTEX
+ EQ FGDRAW FINE GRID VERTEX
+ EQ PKDRAW PACKED FINE GRID
+ MX6 2 -SKIP- TAG INDICATORS
MX7 2
DRAWX6 SX3 1 SINGLE GETVAR CODE USED
EQ DRAWX8
*
DRAWX7 SX3 2 TWO GETVAR CODES USED
* X6=X-COORD, X7=Y-COORD
* X3=NUMBER OF GETVAR CODES USED
DRAWX8 SA1 ILOC CURRENT -DRWBUF- POINTER
SA6 X1 STORE -X-
SA7 X1+1 STORE -Y-
SX7 X1+2 UPDATE -DRWBUF- POINTER
SA7 A1
SA1 VARADD
IX6 X1+X3 X6 -> NEXT GETVAR CODE
SA2 VARCNT
IX7 X2-X3 X7 = NEW COUNT OF TAGS LEFT
EQ DRAWX5 AND GET NEXT GETVAR CODE
* /--- BLOCK DRAW 00 000 76/08/21 22.23
*
* COARSE GRID VERTEX --- DRAW AND RDRAW ONLY
CGDRAW NGETVAR ROW-COLUMN ARGUMENT IN X1
CALL RCTOXY (X,Y) IN X6,X7
SA2 OVARG1
ZR X2,DRAWX6 JUMP IF DRAW
SX1 8 CORRECT X FOR RDRAW
IX6 X6+X1
LX7 51 KEEP ONLY 9 BITS OF Y
AX7 51
EQ DRAWX6
*
* FINE GRID VERTEX ---
FGDRAW SA2 OVARG1
ZR X2,FGDRAWA IF -DRAW-
NG X2,FGDRAWA IF -RDRAW-
* FINE GRID -GDRAW-
FGETVAR X OR R VALUE FOR -GDRAW-
BX7 X1
SA7 XDATA READY TO CONVERT SCALED X
SA1 VARADD X1 = CURRENT VARBUF ADDRESS
SA1 X1+1 X1 = NEXT -GETVAR- CODE
BX5 X1
FGETVAR -Y- OR -ANGLE- VALUE FOR GDRAW
BX7 X1
SA7 YDATA READY TO CONVERT Y
CALL SCALXY CONVERT TO DOTS
EQ DRAWX7
*
* FINE GRID -DRAW-
* FINE GRID -RDRAW-
FGDRAWA NGETVAR GET X VALUE FOR DRAW OR RDRAW
BX6 X1
SA6 ILOC+1 SAVE X VALUE
SA1 VARADD X1 = CURRENT *VARBUF* ADDRESS
SA1 X1+1 X1 = NEXT -GETVAR- CODE
BX5 X1
NGETVAR GET Y VALUE
BX7 X1
SA1 ILOC+1
BX6 X1
EQ DRAWX7
*
* PACKED DRAW COORDINATES, CAN ONLY BE -DRAW- COMMAND
PKDRAW MX0 -9
LX5 XCODEL POSITION LOWER
BX7 -X0*X5 Y-COORDINATE
LX5 -9
BX6 -X0*X5 X-COORDINATE
EQ DRAWX6
* /--- BLOCK DRAWEM 00 000 75/12/09 21.30
*
* -GETVAR- CODES HAVE BEEN EVALUATED AND ARE ALL IN
* FINE GRID NOW. -GDRAW- TAGS HAVE BEEN RELOCATED,
* BUT -RDRAW- TAGS HAVE NOT BEEN YET. FIRST RELOCATE
* -RDRAW- TAGS, AND THEN OUTPUT THE POINTS INTO THE
* MOUT BUFFER. IF WINDOWING IS OFF, OUTPUTING THE
* POINTS IS FAST AND EASY. IF NOT, OUTPUTING USES
* THE -WINDOW- ROUTINE WHICH OUTPUTS THE POINTS
* IN A VERY SLOW WAY.
*
*
DRAWEM SA1 ILOC CALC NUMBER OF ARGS
SX6 DRWBUF
IX7 X1-X6
SA7 VARCNT VARCNT = NO. OF ARGUMENTS
SA6 A1 ILOC -> START OF BUFFER
SA1 OVARG1
PL X1,DRAWEM1 IF -GDRAW- OR -DRAW-
*
* * * DO -RDRAW- SIZING, ROTATING, RELOCATING
* *
* * X1 = X*SIZEX*COS - Y*SIZEY*SIN + X-ORIGIN
* * Y1 = Y*SIZEY*COS + X*SIZEX*SIN + Y-ORIGIN
*
SA1 RORG RELOCATION ORIGIN
SB2 X1 B2 = Y-ORIGIN
AX1 18
SB1 X1 B1 = X-ORIGIN
*
SA1 RSIZE LOAD SIZE FACTORS (*256)
NZ X1,RDRAW1 IF SPECIFIED
SX1 256 IF NOT SPECIFIED, USE SIZE 1
SX2 256
EQ RDRAW2
RDRAW1 SX2 X1 SIGN EXTENSION ON SIZEY*256
AX1 18 POSITION SIZEX
SX1 X1 SIGN EXTENSION ON SIZEX*256
RDRAW2 SA4 ROTATE LOAD SIN AND COS
ZR X4,RDRAW3 IF NO ROTATION
SX5 X4 SIGN EXTENSION ON COSINE*256
AX4 18 POSITION SINE
SX4 X4 SIGN EXTENSION ON SINE*256
IX0 X1*X5 SIZEX*COS (*256*256)
IX3 X2*X4 SIZEY*SIN (*256*256)
IX5 X2*X5 SIZEY*COS (*256*256)
IX4 X1*X4 SIZEX*SIN (*256*256)
SB3 B0 INDICATE ROTATION
EQ RDRAW4
*
RDRAW3 BX0 X1 SIZEX* COS=1
LX0 8
* MX3 0 SIZEY* SIN=0
* MX4 0 SIZEX* SIN=0
BX5 X2 SIZEY* COS=1
LX5 8
SB3 1 DONT HAVE TO MPY BY X3 OR X4
* /--- BLOCK DRAWEM 00 000 78/01/07 19.32
*
RDRAW4 SA1 VARCNT NUMBER OF X AND Y COORDINATES
SB4 X1 WILL RESET B4 LATER
SA1 DRWBUF-2 ADDRESS OF COORDINATES
*
RDRAW5 SB4 B4-2 END TEST
NG B4,RDRAW9 DONE WITH RELOCATION
SA1 A1+2 X1 = X-COORDINATE
PL X1,RDRAW6
MX6 2 CHECK FOR -SKIP- OPTION
BX6 X1-X6
ZR X6,RDRAW5 GO TO NEXT COORD IF -SKIP-
*
* * X1 = X*SIZEX*COS - Y*SIZEY*SIN + X-ORIGIN
* X1 * (X0) - X2 * (X3) + B1
*
* * Y1 = Y*SIZEY*COS + X*SIZEX*SIN + Y-ORIGIN
* X2 * (X5) + X1 * (X4) + B2
*
RDRAW6 SA2 A1+1 X2 = Y-COORDINATE
IX6 X1*X0 X * (SIZEX*COS)
IX7 X2*X5 Y * (SIZEY*COS)
NZ B3,RDRAW7 IF SINES ARE ZERO
IX2 X2*X3 Y * (SIZEY*SIN)
IX1 X1*X4 X * (SIZEX*SIN)
IX6 X6-X2 X1 = X*SIZEX*COS - Y*SIZEY*SIN
IX7 X7+X1 Y1 = Y*SIZEY*COS + X*SIZEX*SIN
* ROUNDING ISN'7T NECESSARY FOR MOST APPLICATIONS,
* BUT IS DONE HERE FOR THOSE FEW THAT IT IMPROVES.
RDRAW7 MX1 1 ROUND POINTS
LX1 16 CREATE POSITIVE .5*256*256
BX2 X6 ROUND X WITH +.5 OR -.5
AX2 60
BX2 X2-X1
IX6 X6+X2
BX2 X7 SIMILARLY, ROUND Y
AX2 60
BX2 X2-X1
IX7 X7+X2
AX6 16 REMOVE 256*256 BIAS
AX7 16
SX6 X6+B1 ADD X-ORIGIN
SX7 X7+B2 ADD Y-ORIGIN
SA6 A1 SAVE RELOCATED X
SA7 A2 SAVE RELOCATED Y
EQ RDRAW5
*
*
*
RDRAW9 EQ DRAWEM1 DONE WITH -RDRAW- RELOCATION
*
* /--- BLOCK DRAWEM 00 000 76/06/13 19.59
EJECT
*
* *ILOC* -> DRWBUF
* THE POINTS ARE NOW IN *DRWBUF*, TWO WORDS PER
* POINT WITH (X,Y). -SKIP- IS INDICATED BY THE
* TOP TWO BITS OF EACH (X,Y) BEING SET, REST OF
* WORD 0. THE TOP BIT OF THE COMMAND WORD IS
* SET IF IT IS A CONTINUED DRAW. *VARCNT* HOLDS
* THE NUMBER OF WORDS OF *DRWBUF* THAT ARE USED.
*
* NOW PLACE THE POINTS IN THE *MOUT* BUFFER.
*
DRAWEM1 SA1 TBWNDOW CAN USE FAST OUTPUT CODE
ZR X1,DRAWEM2 IF NOT WINDOWED
SA5 A5 CHECK FOR NEEDED -AT-
SA1 ILOC X1 -> BUFFER
SA2 VARCNT X2 = NO. WORDS IN BUFFER
RJ WINDBUF OUTPUT WINDOWED LINES
EQ PROCO DONE WITH COMMAND
*
* DRAW POINTS IN *DRWBUF*
* NOT WINDOWED
* USE FAST OUTPUT -DRWCODE-
*
DRAWEM2 SA1 VARCNT
SB1 1 B1 = CONSTANT 1
SB2 B1+B1 B2 = CONSTANT 2
AX1 1 NUMBER OF (X,Y) PAIRS
SB3 X1 B3 = NUMBER OF (X,Y) PAIRS
SA2 MOUTLOC CURRENT OUTPUT POINTER
SX3 X1+B1 NO. WORDS TO BE PUT IN MOUT
IX6 X2+X3
SX7 X6-MOUTLTH CHECK FOR OVERFLOW
PL X7,ERROROF OUTPUT BUFFER OVERFLOW
SA6 A2 UPDATE MOUT POINTER
SX6 SKPCODE ASSUME NOT CONTINUED DRAW
SA5 A5 CHECK CONTINUED FLAG
+ PL X5,*+1
SX6 CDWCODE MARK CONTINUED DRAW
+ LX3 12
LX1 24
BX6 X6+X3 WITH COUNT OF WORDS
BX6 X6+X1 AND COUNT OF POINTS
SA6 MOUT+X2 OUTPUT HEADER
SA1 DRWBUF-2 PREPARE FOR LOOP
MX3 2 SKIP INDICATOR
MX0 -9 ON SCREEN MASK
*
* NOW OUTPUT THE POINTS INTO MOUT BUFFER
DRWLOOP SB3 B3-B1 LOOP COUNTER
NG B3,DRWEND END TEST
SA1 A1+B2 GET NEXT X-COORDINATE
BX4 X1-X3 CHECK FOR SKIP
ZR X4,DRWLOOP1 IF SKIP
SA2 A1+B1 GET Y-COORDINATE
BX6 -X0*X1 MASK (X,Y) ON SCREEN
BX7 -X0*X2
LX6 9 FORM (X,Y) FOR OUTPUT
BX6 X6+X7
SA6 A6+B1 OUTPUT COMPLETED (X,Y)
EQ DRWLOOP
*
* -SKIP- COORDINATE
DRWLOOP1 MX6 2 OUTPUT SKIP INDICATOR
LX6 20
SA6 A6+B1
EQ DRWLOOP
*
* END OF OUTPUT LOOP -- UPDATE (NX,NY) FROM LAST POINT
DRWEND BX6 X1
BX7 X2
SA6 NX
SA7 NY
EQ PROCO DONE WITH COMMAND
*
ENDOV
* /--- BLOCK RORIGIN 00 000 77/10/20 18.41
TITLE -RORIGIN-
*** RORIGIN - SPECIFY ORIGIN FOR RELOCATABLE COMMANDS
* WRITTEN 11/15/75 L.A.WHITE
* MADE RORIGIN DO IMPLICIT -RAT- 0,0 7/22/76 DLS
*
* -RORIGIN-
* ZERO TAGS - ORIGIN AT CURRENT WHEREX,WHEREY
* ONE TAG - COARSE GRID ORIGIN
* TWO TAGS - FINE GRID ORIGIN
* EXECUTION CONSISTS OF STORING ORIGIN
* SPECIFICATION IN *RORG* IN THE STUDENT BANK.
*
* OVARG1 /0 RORIGIN, /1 RAT, /2 RATNM, 3/ RDOT
*
RORGOV OVRLAY
SA1 OVARG1 SEE IF -RORIGIN-
NZ X1,RATOV IF -RAT- OR -RATNM- (1,2)
*
* EXECUTE -RORIGIN-
NG X5,RORG0 IF NO TAGS
NGETVAR RETURN X1 = FIRST TAG
SA5 A5 RETREIVE COMMAND WORD
LX5 XCODEL
NG X5,RORG1 IF ONLY ONE TAG
BX6 X1 SAVE X-ORIGIN
SA6 ILOC
NGETVAR RETURN X1 = Y-ORIGIN
BX7 X1 Y-ORIGIN
SA1 ILOC
BX6 X1 X-ORIGIN
EQ RORG2
*
RORG0 SA1 NX SET ORIGIN TO WHEREX,WHEREY
SA2 NY
MX0 -18
BX6 -X0*X1 MASK X-ORIGIN
BX7 -X0*X2 MASK Y-ORIGIN
LX6 18
BX6 X6+X7
SA6 RORG 24/0, 18/XORG, 18/YORG
EQ PROC NO NEED TO RESET NX,NY
*
RORG1 CALL RCTOXY
RORG2 MX0 -18
BX6 -X0*X6 MASK X-ORIGIN
BX7 -X0*X7 MASK Y-ORIGIN
SA6 NX
SA7 NY UPDATE SCREEN -WHERE-
LX6 18
BX6 X6+X7
SA6 RORG 24/0, 18/XORG, 18/YORG
SA1 NX GET BACK NX
MX0 -9
BX6 -X0*X1 MASK TO 9 BIT SCREEN VALUE
BX7 -X0*X7
LX6 9
BX1 X6+X7
EQ RAT9 SET MARGINS
*
* /--- BLOCK RAT RDOT 00 000 77/10/20 18.42
TITLE -RAT- -RATNM- -RDOT-
*** RAT - RELOCATABLE -AT-
*** RATNM - RELOCATABLE -AT- WITHOUT SETTING MARGINS
*** RDOT - RELOCATABLE -DOT-
* WRITTEN 11/15/75 L.A.WHITE
* MODIFIED 06/28/76 L.A.WHITE
*
* -RAT- OVARG1 = 1
* -RATNM- = 2
* -RDOT- = 3
* ZERO TAGS - TO CURRENT RORIGIN
* ONE TAG - COARSE GRID LOCATION
* TWO TAGS - FINE GRID LOCATION
* EXECUTION CONSISTS OF DOING AN -AT- OR -DOT- TO
* THE GIVEN POSITION AFTER RELOCATING FROM *RORG*
*
RATOV NG X5,RAT0 IF BLANK TAG
NGETVAR RETURN X1 = FIRST TAG
SA5 A5 RETRIEVE COMMAND WORD
LX5 XCODEL
NG X5,RAT1 IF ONLY ONE TAG
BX6 X1 SAVE X-COORDINATE
SA6 ILOC
NGETVAR RETURN X1 = Y-COORDINATE
BX7 X1 Y-COORDINATE
SA1 ILOC
BX6 X1 X-COORDINATE
EQ RAT2
*
RAT0 MX6 0 BLANK TAG HAS
MX7 0 ZERO OFFSET
EQ RAT7 FROM ORIGIN
*
RAT1 CALL RCTOXY
SX1 8 FIX UP X
IX6 X6+X1
LX7 51 KEEP ONLY 9 BITS OF Y
AX7 51
*
* SIZE THE OFFSETS
RAT2 SA1 RSIZE
NZ X1,RAT3 IF SIZE NON ZERO
LX6 8 IF ZERO, MAKE SIZE ONE
LX7 8 DITTO
EQ RAT4
RAT3 SX2 X1 SIGN EXTENSION ON SIZEY*256
AX1 18 POSITION SIZEX
SX1 X1 SIGN EXTENSION ON SIZEX*256
IX6 X6*X1 SIZE X-OFFSET
IX7 X7*X2 SIZE Y-OFFSET
* /--- BLOCK RAT 00 000 77/10/20 18.42
*
* ROTATE THE OFFSETS
RAT4 SA1 ROTATE
NZ X1,RAT5 IF ROTATE SPECIFIED
LX6 8 IF NOT, LEAVE ALONE
LX7 8
EQ RAT6
RAT5 SX2 X1 SIGN EXTENSION ON COSINE*256
AX1 18 POSITION SINE
SX1 X1 SIGN EXTENSION ON SINE*256
IX3 X6*X1 X*SIN
IX4 X7*X1 Y*SIN
IX6 X6*X2 X*COS
IX7 X7*X2 Y*COS
IX6 X6-X4 X1 = X*COS - Y*SIN
IX7 X7+X3 Y1 = Y*COS + X*SIN
RAT6 MX1 1 ROUND THE POINTS
LX1 8+8 .5 (*256*256)
BX2 X6 NEED +-.5 ACCORDING TO SIGN
AX2 60
BX2 X2-X1 + OR - .5
IX6 X6+X2 ROUNDED X OFFSET (*256*256)
BX3 X7
AX3 60
BX3 X3-X1
IX7 X7+X3 ROUNDED Y OFFSET (*256*256)
AX6 8+8 CORRECT FOR FACTOR OF 256*256
AX7 8+8 DITTO
*
* RELOCATE THE OFFSETS (X6,X7 = OFFSETS)
RAT7 SA1 RORG GET ORIGIN LOCATION
SX2 X1 SIGN EXTENSION ON Y-ORIGIN
AX1 18 POSITION X-ORIGIN
SX1 X1 SIGN EXTENSION ON X-ORIGIN
IX6 X1+X6 X-POSITION
IX7 X2+X7 Y-POSITION
*
MX0 -18 CUT DOWN TO 18 BITS,
BX6 -X0*X6 LIKE -ATNM- COMMAND.
BX7 -X0*X7 'I DON'7T KNOW WHY.
*
SA6 NX UPDATE X-POSITION
SA7 NY UPDATE Y-POSITION
MX0 -9 POSITION SO ON-SCREEN
BX6 -X0*X6
BX7 -X0*X7
LX6 9 PREPARE FOR -AT-
BX1 X6+X7 -AT- LOCATION
SA2 OVARG1
SX2 X2-2
ZR X2,RATED IF -RATNM-, DONT SET MARGINS
PL X2,RDOTED IF -RDOT-
*
RAT9 AX6 9
SA6 TBMARG SET X-MARGIN
BX4 X1
LX4 7+3 POSITION X/Y MARGIN FOR SIZE
MX0 -18
LX0 7+3 POSITION MASK
SA2 TBWRITE
BX2 X0*X2 CLEAR OUT OLD X/Y MARGIN
BX4 -X0*X4 LIMIT TO 18 BITS -- BIF 8/27/76
BX6 X2+X4
SA6 A2 SET NEW X/Y MARGIN
*
OUTCODE WFMCODE FINE WHERE THAT SETS MARGIN
EQ PROCO
*
RATED OUTCODE WFCODE FINE WHERE WITHOUT MARGINS
EQ PROCO
*
RDOTED OUTCODE DFCODE -DOT-
EQ PROCO
*
ENDOV
*
* /--- BLOCK CIRCLE 00 000 76/05/08 02.49
TITLE CIRCLE ROUTINE
*** CIRCLE - GENERATE CIRCLES BY DRAWING LINES
* WRITTEN BY B.A.SHERWOOD
*
* MODIFIED 02/15/72 P.J.TENCZAR
* PUT OUTPUT IN-LINE AND USE REGISTERS
* (GAVE SPEED-UP BY A FACTOR OF ABOUT 2)
* (A CIRCLE WITH RADIUS OF 64 TAKES ABOUT
* 2 MILLISECONDS AND HAS 28 CHORDS)
* THE WINDOWING COULD BE IMPROVED IF DESIRED.
*
* MODIFIED 11/15/75 L.A.WHITE
* USES CURRENT *WHERE* POSITION FOR CENTER OF
* CIRCLE. ADDED -RCIRCLE- COMMAND (SIZED,
* RELOCATABLE, ROTATED ARCS). ADDED -GCIRCLE-
* COMMAND (SCALED, RELOCATABLE). BOTH NEW
* COMMANDS CAN DO ELLIPSES IF THE SCALES SO
* SPECIFY.
*
*
* -CIRCLE-
* CIRCLE R OR
* CIRCLE R,THETA1,THETA2
* CIRCLEB R OR
* CIRCLEB R,THETA1,THETA2
* RCIRCLE R OR
* RCIRCLE R,THETA1,THETA2
* GCIRCLE R OR
* GCIRCLE R,THETA1,THETA2
*
* DRAW A FULL OR PARTIAL CIRCLE, MAYBE DASHED.
* R IS RADIUS, *WHEREX,WHEREY* IS THE CENTER,
* THETA1 AND THETA2 THE INITIAL AND FINAL
* ANGLES, MEASURED CCW FROM THE X-AXIS.
*
* ON ENTRY *OVARG1* IS
* -1 CIRCLEB
* 0 CIRCLE
* 1 RCIRCLE
* 2 GCIRCLE
*
* /--- BLOCK CIRCOV 00 000 76/08/16 16.29
EJECT
NCIRCOV OVRLAY
MX6 -1 MARK *INFO* BUFFER USED
SA6 JJSTORE
*
* GET RADIUS
FGETVAR RETURN X1 = RADIUS
BX7 X1 SAVE RADIUS
*** KLUDGE FOR THE WEEK OF 7/18/76 TILL FIXED RIGHT LAW
SA1 OVARG1
SX1 X1-1
PL X1,KDKD2 IF GCIRCLE/RCIRCLE, NO ROUNDING
SA1 CHALF
BX2 X7 .5 OF SAME SIGN AS RADIUS
AX2 60
BX1 X1-X2
FX7 X7+X1 ADD .5 TO RADIUS
NX7 X7
KDKD2 BSS 0
*** END KLUDGE
SA7 INITX FULL CIRCLE INITX = RADIUS
BX6 X7 STORE ABS(RADIUS)
AX6 60
BX6 X6-X7
SA6 RADIUS
MX7 0
SA7 INITY FULL CIRCLE INITY = 0
SA7 PCIRCLE NOT PARTIAL CIRCLE
SA1 TWOPI
BX7 X1
SA7 ARC FULL CIRCLE ARC = 2*PI
*
* CHECK FULL CIRCLE ASSUMPTION
SA5 A5 RETRIEVE COMMAND WORD
LX5 XCODEL TOP BIT OF 2ND GETVAR CODE
NG X5,CIRCOV1 IF FULL CIRCLE
*
* IS PARTIAL CIRCLE -- GET ANGLES
SX7 1 INDICATE PARTIAL CIRCLE
SA7 PCIRCLE
FGETVAR RETURN X1 = INITIAL ANGLE
SA2 RADDEG RADIANS PER DEGREE
RX6 X1*X2 CONVERT TO RADIANS
SA6 ARC SAVE INITIAL ANGLE TEMPORARILY
CALL SINCOS GET SIN AND COS OF X6
SA1 INITX COMPUTE INITIAL (X,Y)
RX6 X6*X1 Y = SIN*RADIUS
RX7 X7*X1 X = COS*RADIUS
SA6 INITY
SA7 A1
*
SA5 A5 RETREIVE COMMAND WORD
AX5 XCMNDL
MX0 2*XCODEL+XCMNDL
BX5 -X0*X5
SA1 X5+B5 GET EXTRA ARGUMENT WORD
BX5 X1 GETVAR CODE TO TOP
FGETVAR RETURN X1 = FINAL ANGLE
SA2 RADDEG RADIANS PER DEGREE
SA3 ARC STARTING ANGLE
RX7 X1*X2 CONVERT TO RADIANS
RX7 X7-X3 FINAL ANGLE - INITIAL ANGLE
NX7 X7
SA2 TWOPI MAXIMUM OF TWO PI
BX6 X7 ABS(ARC) FOR TWOPI TEST
AX6 60
BX1 X7-X6 ABS(ARC)
RX1 X2-X1 POSITIVE IF TWOPI>ABS(ARC)
+ PL X1,*+1 COMPARE ABS(ARC) WITH TWOPI
BX7 X6-X2 USE TWOPI WITH SIGN OF ARC
+ SA7 ARC STORE LENGTH OF ARC TO DRAW
*
* /--- BLOCK CIRCOV1 00 000 77/10/20 18.25
EJECT
*
* PROCESS ACCORDING TO COMMAND
CIRCOV1 SA1 OVARG1
SB1 X1
JP *+1+B1
+ EQ CIRCL 0 = CIRCLE
+ EQ RCIRCL 1 = RCIRCLE
+ EQ GCIRCL 2 = GCIRCLE
+ EQ CIRCLB 3 = CIRCLEB
SPACE 4
*
* * * CIRCLE B
*
CIRCLB SX6 CIRBCK ADDRESS OF PROCESSING ROUTINE
SA6 ROUTINE
SA1 RADIUS AVERAGE RADIUS
EQ CIRCOV2
*
* * * CIRCLE
*
CIRCL SX6 CIRLP ADDRESS OF PROCESSING ROUTINE
SA6 ROUTINE
SA1 RADIUS AVERAGE RADIUS
EQ CIRCOV2
*
* * * GCIRCLE
*
GCIRCL SA1 GDATA GET AXES INFO
BX0 X1 SAVE IT FOR NEXT FEW LINES
LX1 60-2*PFIELD
AX1 60-PFIELD EXTEND SIGN OF (X+)
NZ X1,GCIRCL1 USUALLY X+ IS NONZERO
BX1 X0 IF NOT, USE X-
LX1 60-4*PFIELD
AX1 60-PFIELD
GCIRCL1 PX1 X1
NX1 X1 FLOAT (X+)
SA2 GXMAX
SA3 XOFFSET
RX2 X2-X3 XMAX-XOFFSET
NX2 X2
RX3 X1/X2 (X+)/(XMAX-XOFFSET) (',SIZEX',)
*
BX1 X0 GET (Y+)
LX1 60-PFIELD
AX1 60-PFIELD EXTEND SIGN
NZ X1,GCIRCL2 USUALLY Y+ IS NONZERO
BX1 X0 IF NOT, USE Y-
LX1 60-3*PFIELD
AX1 60-PFIELD
GCIRCL2 PX1 X1
NX1 X1 FLOAT (Y+)
SA2 GYMAX
SA4 YOFFSET
FX2 X2-X4 YMAX-YOFFSET
NX2 X2
RX6 X1/X2 (Y+)/(YMAX-YOFFSET) (',SIZEY',)
*
SA4 C256 X4 = 256. NEEDED BY RCIRCL
*** SAME CODE AS AT RCIRCL1 ***
SB1 1 ASSUME SIZES EQUAL
IX7 X3-X6 TEST SIZES EQUAL
ZR X7,RCIRCL6 IF EQUAL
SB1 -B1 INDICATE SIZES UNEQUAL
*
* IF SIZE=0, B1=0
* SIZEX=SIZEY B1=1
* SIZEX^=SIZEY B1=-1
* X3 = FLOATING SIZE X
* X6 = FLOATING SIZE Y
*
*
EQ RCIRCL6 CONTINUE AS RCIRCLE
* /--- BLOCK RCIRCL 00 000 76/09/05 14.31
*
* * * RCIRCLE
*
RCIRCL SA4 C256 X4 = 256.
SA2 RSIZE --- SET UP SIZE ---
SA3 C1 SET TO SIZE 1.
BX6 X3
SB1 B0 INDICATE SIZE ZERO
ZR X2,RCIRCL2 IF SIZE=0, USE SIZE 1
SX6 X2 256*SIZEY
AX2 18
SX3 X2 256*SIZEX
PX3 X3
NX3 X3
PX6 X6
NX6 X6
RX3 X3/X4 X3 = FLOATING SIZE X
RX6 X6/X4 X6 = FLOATING SIZE Y
RCIRCL1 SB1 1 ASSUME SIZES EQUAL
IX7 X3-X6 TEST SIZES EQUAL
ZR X7,RCIRCL2 IF EQUAL
SB1 -B1 INDICATE SIZES UNEQUAL
*
* IF SIZE=0, B1=0
* SIZEX=SIZEY B1=1
* SIZEX^=SIZEY B1=-1
* X3 = FLOATING SIZE X
* X6 = FLOATING SIZE Y
*
*
RCIRCL2 SA2 ROTATE --- SET UP ROTATE ---
ZR X2,RCIRCL6 IF ROTATE=0
SX5 X2 256*COSINE OF ROTATION
AX2 18
SX0 X2 256*SINE OF ROTATION
PX0 X0
NX0 X0
PX5 X5
NX5 X5
RX0 X0/X4 X0 = SIN
RX5 X5/X4 X5 = COS
GE B1,B0,RCIRCL4 IF SIZEX=SIZEY
* SIZEX^=SIZEY, ROTATE^=0
SX7 RCIRLP ADDRESS OF PROCESSSING ROUTINE
SA7 ROUTINE
RX7 X3*X0 SIZEX*SINE
SA7 XSIN
RX7 X3*X5 SIZEX*COSINE
SA7 XCOS
RX7 X6*X0 SIZEY*SINE
SA7 YSIN
RX7 X6*X5 SIZEY*COSINE
SA7 YCOS
RCIRCL3 BX2 X3
BX4 X6
AX2 60
AX4 60
BX2 X2-X3 ABS(SIZEX)
BX4 X4-X6 ABS(SIZEY)
RX4 X2+X4
NX4 X4
SA2 C2 =2.
RX4 X4/X2 AVERAGE SIZE
SA1 RADIUS
RX1 X1*X4 AVERAGE RADIUS
EQ CIRCOV2
* /--- BLOCK RCIRCL4 00 000 76/01/24 13.29
*
* SIZEX=SIZEY, ROTATE^=0
* PERFORM INITIAL ROTATION, SIZE THE RADIUS,
* THEN IS A SIMPLE CIRCLE
RCIRCL4 SA1 INITX
SA2 INITY
RX1 X1*X3 SIZE STARTING POINTS
RX2 X2*X3
RX6 X1*X5 X*COS
RX7 X2*X0 Y*SIN
RX6 X6-X7
NX6 X6
SA6 A1 NEW X = X*COS - Y*SIN
RX6 X2*X5 Y*COS
RX7 X1*X0 X*SIN
RX6 X6+X7
NX6 X6
SA6 A2 NEW Y = Y*COS + X*SIN
RCIRCL5 SA1 RADIUS
BX2 X3
AX2 60
BX2 X2-X3 ABS(SIZE)
RX6 X1*X2 RADIUS*ABS(SIZE)
SA6 A1 NEW RADIUS
EQ CIRCL NOW, IS A SIMPLE CIRCLE
*
* ROTATE=0
RCIRCL6 ZR B1,CIRCL IF SIZE=0 IS SIMPLE CIRCLE
NG B1,RCIRCL7 IF SIZEX^=SIZEY
* ROTATE=0, SIZEX=SIZEY
SA1 INITX SIZE INITIAL POINTS
SA2 INITY
RX6 X1*X3
RX7 X2*X3
SA6 A1
SA7 A2
EQ RCIRCL5
*
* ROTATE=0, SIZEX^=SIZEY
RCIRCL7 SX7 GCIRLP ADDRESS OF PROCESSING ROUTINE
SA7 ROUTINE
SA6 YCOS SAVE SIZEY
BX7 X3
SA7 XCOS SAVE SIZEX
EQ RCIRCL3
*
* /--- BLOCK CIRCOV2 00 000 77/10/20 18.31
*
* COMPUTE NUMBER OF CHORDS WANTED
* ENTRY X1 = AVERAGE RADIUS
*
* IF THE NUMBER OF CHORDS WOULD OVERFLOW THE
* OUTPUT BUFFER (OR TAKE TOO LONG TO COMPUTE),
* IT IS REDUCED TO WHAT WILL FIT IN THE OUTPUT BUFFER.
* THE ONLY DRAWBACK IS A SLIGHT REDUCTION IN
* THE ',FINENESS', OF LARGE CIRCLES THAT ARE
* ONLY PARTLY (OR NOT AT ALL) ON THE SCREEN.
*
CIRCOV2 SA2 C40 CHORDS/RADIAN = (3+RADIUS/40)
RX7 X1/X2 (EMPIRICAL CRITERION)
SA2 C3 =3.
RX7 X2+X7
SA4 ARC X4 = TOTAL ANGLE TO DRAW
RX7 X4*X7 RADIANS * CHORDS PER RADIAN
UX7 X7,B1 X7 = NUMBER OF CHORDS
LX7 X7,B1
BX0 X7 SET X7=ABS(X7)
AX0 60
BX7 X7-X0 X7 = POSITIVE NUMBER OF CHORDS
SA3 OVARG1 X3 = TYPE OF CIRCLE FLAG
SX1 X3-3 CHECK FOR BROKEN CIRCLE TYPE
NZ X1,CIRTYPE 0,1,2 MEANS NORMAL CIRCLES
MX3 -1 -1 MEANS BROKEN CIRCLES
CIRTYPE BSS 0
**
SA1 MOUTLOC COMPUTE MAXIMUM CHORDS TO FIT
SX2 MOUTLTH-10 LITTLE EXTRA ROOM
IX2 X2-X1 X2 = ROOM LEFT
NG X2,ERROROF .WOWWIE. ALREADY OVERFLOW
IX6 X2-X7
+ PL X6,*+1 JUMP IF CIRCLE WILL FIT
BX7 X2 USE ROOM LEFT IF WONT FIT
+ SA1 TBWNDOW IF WINDOWED, MAKE SURE
ZR X1,CIRCOV3 ..INFO BUFFER WILL HOLD
SX2 INFOLTH/2-10 ..ALL INTERMEDIATE POINTS
+ PL X3,*+1 IF NORMAL CIRCLES
SX2 INFOLTH/3-10 ..CIRCLEB NEEDS MORE ROOM
+ IX6 X2-X7
PL X6,*+1 JUMP IF CIRCLE WILL FIT
BX7 X2 USE ROOM LEFT IF WONT FIT
**
CIRCOV3 PL X3,CIRCOV4 IF NOT CIRCLEB
SA1 PCIRCLE REPLACE ODD/EVEN BIT
MX6 59
BX7 X6*X7
BX7 X7+X1 WITH PARTIAL CIRCLE FLAG
CIRCOV4 NZ X7,*+1 AT LEAST ONE ARC
SX7 1
+ SA7 CHORDS STORE NUMBER OF CHORDS
PX7 X7 DURN, BACK TO FLOATING AGAIN
NX7 X7
RX6 X4/X7 RADIANS PER CHORD
CALL SINCOS TAKE SIN AND COS OF X6
BX0 X6 X0 = SINE OF CHORD ANGLE
BX5 X7 X5 = COSINE OF CHORD ANGLE
*
SA3 INITX X3 = INITIAL X OFFSET
SA4 INITY X4 = INITIAL Y OFFSET
*
SX7 B5 SAVE B5
SA7 SAVB5
SX7 B7 SAVE B7
SA7 SAVB7
*
* /--- BLOCK CIRCOV3 00 000 76/07/30 22.48
*** IT SHOULD BE IMPOSSIBLE TO GET AN OUTPUT
*** BUFFER OVERFLOW NOW... CHECKS LEFT IN
*** HERE JUST TO MAKE SURE. LAW 7/30/76
*
SA2 CHORDS
SB2 X2 B2 = NUMBER OF CHORDS TO OUTPUT
SA1 MOUTLOC
SX6 X1+B2
SX6 X6+3-MOUTLTH
PL X6,ERROROF
*
SA2 TBWNDOW
NZ X2,CIRCOV5 IF WINDOWED
MX6 0 CLEAR HEADER WORD FOR NOW
SA6 MOUT+X1 A6 = MOUT LOCATION
SB1 1 INDICATE NOT WINDOWED
EQ CIRCOV6
*
CIRCOV5 SX6 B2+3-2*INFOLTH/3
PL X6,ERROROF
SB1 -1 INDICATE WINDOWED
SA6 INFO START AT INFO+1
*
CIRCOV6 SA1 NX CENTER OF CIRCLE
SA2 NY
SB3 X1 B3 = X-CENTER
SB4 X2 B4 = Y-CENTER
*
SA0 B3 LAST X POS
SB7 B4 LAST Y POS
*
* GO TO THE CORRECT ROUTINE
SA2 ROUTINE
SB5 X2 TYPE OF CIRCLE TO DO
JP B5 GO TO CORRECT ROUTINE
*
* /--- BLOCK CIRLP 00 000 76/09/11 17.01
*
* THE FOLLOWING ROUTINES PERFORM THE CALCULATIONS
* FOR COMPUTING EACH END-CHORD POSITION AROUND THE
* CIRCLE. ALL REGISTERS ARE USED.
*
* A B X
*
* 0 FINAL X - SIN OF CHORD ANGLE
* 1 SCRATCH MULTI FLAG SCRATCH
* 2 SCRATCH LOOP COUNT SCRATCH
* 3 - X-CENTER CURRENT X
* 4 - Y-CENTER CURRENT Y
* 5 - ROUTINE ADR COS OF CHORD ANGLE
* 6 OUTPUT LOC SCRATCH SCRATCH
* 7 SCRATCH FINAL Y SCRATCH
*
* CIRCLES
CIRLP BX6 X3 PLAIN CIRCLE
BX7 X4
CIRLP1 UX6 X6,B6 INTEGER X,Y
LX6 X6,B6
UX7 X7,B6
LX7 X7,B6
SX6 X6+B3 OFFSET X,Y FROM CENTER
SX7 X7+B4
NG B1,CIRLP4 IF WINDOWED
BX1 X6+X7 SEE IF ON SCREEN
AX1 9
NZ X1,CIRLP3 IF OFF SCREEN
NG X1,CIRLP3 IF OFF SCREEN
SA0 X6 LAST X,Y
SB7 X7
LX6 9
BX6 X6+X7 COMBINE (X,Y)
SB1 1 INDICATE NO SKIPS IN PROGRESS
SA6 A6+B1 OUTPUT POINT
CIRLP2 SB2 B2-1
LT B2,CIRDONE EXIT CONDITION
RJ INCXY GET NEXT (X,Y) IN (X3,X4)
JP B5 DO STUFF WITH (X,Y)
*
CIRLP3 ZR B1,CIRLP2 IF ALREADY SKIPPING
MX6 2 OUTPUT SKIP
LX6 20
SA6 A6+B1
SB1 B0 INDICATE SKIPPING
EQ CIRLP2
*
* WINDOWED CHORDS
CIRLP4 SA0 X6 LAST X,Y
SB7 X7
SA6 A6-B1 OUTPUT X,Y INTO TEMP BUFFER
BX6 X7
SA6 A6-B1
EQ CIRLP2
*
* DO RCIRCLE TYPE OPERATIONS
* ROTATED AND SIZEX^=SIZEY
RCIRLP SA1 XCOS SIZEX*COS
SA2 YSIN SIZEY*SIN
RX6 X3*X1 X*SIZEX*COS
RX7 X4*X2 Y*SIZEY*XIN
RX6 X6-X7 SIZED, ROTATED X
SA1 YCOS SIZEY*COS
SA2 XSIN SIZEX*SIN
RX7 X4*X1 Y*SIZEY*COS
RX2 X3*X2 X*SIZEX*SIN
RX7 X7+X2 SIZED, ROTATED Y
EQ CIRLP1
*
* DO GCIRCLE TYPE OPERATION
* NO ROTATION, SIZEX^=SIZEY
GCIRLP SA1 XCOS SIZEX*COS (COS=1)
SA2 YCOS SIZEY*COS
RX6 X3*X1 SIZED X
RX7 X4*X2 SIZED Y
EQ CIRLP1
* /--- BLOCK INCXY 00 000 76/01/13 00.21
*
* X1,X2,X6,X7 SCRATCH FOR COMPUTATION
* X3,X4 = CURRENT (X,Y) FLOATING POINT
* X0,X5 = (SIN,COS) OF CHORD ANGLE
*
* GET NEXT POINT FOR CIRCLE ROUTINES
INCXY EQ *
RX6 X3*X5 X*COS
RX7 X4*X0 Y*SIN
RX1 X4*X5 Y*COS
RX2 X3*X0 X*SIN
RX3 X6-X7 NEW X = X*COS-Y*SIN
NX3 X3
RX4 X1+X2 NEW Y = Y*COS+X*SIN
NX4 X4
EQ INCXY
* /--- BLOCK CIRBLP 00 000 76/05/13 20.35
*
*
CIRBCK NG B1,WCIRBLP IF WINDOWED
*
* NON-WINDOWED CIRCLEB
* OUTPUT THE POINTS
CIRBLP UX7 X3,B6 START (X,Y) IN (X3,X4)
LX7 X7,B6 INTEGER X
SX7 X7+B3 OFFSET X
SA7 INITX SAVE FIRST X
UX7 X4,B6
LX7 X7,B6 INTEGER Y
SX7 X7+B4 OFFSET Y
SA7 INITY SAVE FIRST Y
RJ INCXY GET NEXT (X,Y)
UX6 X3,B6
LX6 X6,B6 INTEGER X
SX6 X6+B3 OFFSET X
UX7 X4,B6
LX7 X7,B6 INTEGER Y
SX7 X7+B4 OFFSET Y
SA1 INITX RETRIEVE FIRST X
SA2 INITY RETRIEVE FIRST Y
BX1 X1+X2 SEE IF OFF SCREEN
BX1 X1+X6
BX1 X1+X7
AX1 9
NZ X1,CIRBLP1 IF OFF SCREEN
NG X1,CIRBLP1 IF OFF SCREEN
SA0 X6 LAST X
SB7 X7 LAST Y
LX6 9 NOT OFF SCREEN, COMBINE
BX6 X6+X7
LX2 20
BX6 X6+X2
SA1 A1 RETRIEVE FIRST X
LX1 20+9
BX6 X6+X1
MX7 2 INDICATE SKIP;X,Y;X,Y
BX6 X6+X7 ALL IN ONE WORD
SA6 A6+1 OUTPUT POINTS
CIRBLP1 SB2 B2-2
LE B2,CIRDONE EXIT CONDITION
RJ INCXY GET NEXT (X,Y) IN (X3,X4)
EQ CIRBLP
*
*
* WINDOWED CIRCLEB
* GENERATE THE POINTS IN AN INTERMEDIATE BUFFER
* IN THE FORM SKIP;X,Y;X,Y
WCIRBLP SB1 1
WCIRB1 UX6 X3,B6
LX6 X6,B6 INTEGER FIRST X
SX6 X6+B3 OFFSET X
SA6 A6+B1
UX6 X4,B6
LX6 X6,B6 INTEGER FIRST Y
SX6 X6+B4 OFFSET Y
SA6 A6+B1
RJ INCXY GET NEXT (X,Y) IN (X3,X4)
UX6 X3,B6
LX6 X6,B6 INTEGER SECOND X
SX6 X6+B3 OFFSET X
SA6 A6+B1
UX6 X4,B6
LX6 X6,B6 INTEGER SECOND Y
SX6 X6+B4 OFFSET Y
SA6 A6+B1
SB2 B2-2
LE B2,CIRDONE END TEST
RJ INCXY GET NEXT (X,Y) IN (X3,X4)
MX6 2 OUTPUT SKIP
SA6 A6+B1
SA6 A6+B1 TAKES TWO WORDS
EQ WCIRB1 CONTINUE LOOPING
*
* /--- BLOCK CIRDONE 00 000 78/01/07 19.32
*
* DONE WITH CIRCLE GENERATION
CIRDONE SA1 NX SAVE END SCREEN LOCATION
SA2 NY
SA3 PCIRCLE
ZR X3,CIRDONE1 IF SHOULD BE CENTER POSITION
SX1 A0 SHOULD BE LAST POINT DRAWN
SX2 B7
CIRDONE1 MX0 -18
BX7 -X0*X1
SA7 SAVNX SAVE POSITIONS
BX7 -X0*X2
SA7 SAVNY
*
SA1 SAVB5 RESTORE REGISTERS
SB5 X1 RESTORE B5
SA1 SAVB7
SB7 X1 RESTORE B7
SA1 TBWNDOW
NZ X1,WCIRDONE IF WINDOWED
*
* CREATE MOUT HEADER
SA2 MOUTLOC
SX5 MOUT+X2 -> FIRST WORD FOLLOWING HEADER
SX0 A6 -> LAST WORD OF OUTPUT
IX0 X0-X5 NUMBER OF POINTS OUTPUT
BX6 X0
LX6 24 SHIFT TO POSITION
SX0 X0+1 NUMBER OF WORDS IN GROUP
BX1 X0
LX1 12
BX6 X6+X1
SX1 SKPCODE
BX6 X6+X1 COMPLETED HEADER WORD
SA6 MOUT+X2 OUTPUT IT
IX6 X2+X0 UPDATE MOUT POINTER
SA6 A2
*
* OUTPUT -ATNM- TO FINAL LOCATION
CIRDONE2 SA1 SAVNX X-FINAL
SA2 SAVNY Y-FINAL
BX6 X1
BX7 X2
SA6 NX
SA7 NY
MX0 -9
BX1 -X0*X1 ON SCREEN
BX2 -X0*X2
LX1 9
BX1 X1+X2
OUTCODE WFCODE
EQ PROCO
*
* WINDOWED CIRCLE DONE
WCIRDONE SB3 INFO
SX2 A6-B3 NUMBER OF WORDS IN INFO BUFFER
SX1 INFO+1 -> BUFFER
MX5 0 NOT CONTINUED DRAW
RJ WINDBUF OUTPUT THE LINES
EQ CIRDONE2
*
* /--- BLOCK VARIABLES 00 000 76/07/18 21.08
*
CHALF DATA .5
C1 DATA 1.
C2 DATA 2.
C3 DATA 3.
C40 DATA 40.
C256 DATA 256.
TWOPI DATA 6.28318 2*PI
RADDEG DATA 0.0174533 RADIANS PER DEGREE (PI/180)
*
* THE FOLLOWING VARIABLES ARE NOT KEPT IN THE OVERLAY
* WHEN ECS RESIDENT, BUT FOLLOW THE OVERLAY IN CM.
* THE -ENDOV- MACRO SHOULD BE CHANGED TO ACCEPT A PARAMETER,
* INDICATING THE LAST WORD IN CM THAT WOULD BE REFERENCED
* BY THE OVERLAY, SO IT CAN DO ITS RANGE CHECK CORRECTLY.
* IN THIS TIME, THE FOLLOWING VARIABLES WILL FIT IN THE
* CM BUFFER, SO IT ISN'7T WORTH IT TO PUT THE CHECK IN.
*
RADIUS BSS 0 RADIUS OF CIRCLE
ARC EQU RADIUS+1 ARC OF CIRCLE
CHORDS EQU ARC+1 NUMBER OF CHORDS IN THIS CIRCLE
PCIRCLE EQU CHORDS+1 1 IF PARTIAL CIRCLE, 0 IF FULL
XSIN EQU PCIRCLE+1 SIZEX*SINE(ROTATE)
YSIN EQU XSIN+1 SIZEY*SINE(ROTATE)
XCOS EQU YSIN+1 SIZEX*COSINE(ROTATE)
YCOS EQU XCOS+1 SIZEY*COSINE(ROTATE)
INITX EQU YCOS+1 INITIAL X-COORDINATE
INITY EQU INITX+1 INITIAL Y-COORDINATE
ROUTINE EQU INITY+1 PROCESSING ROUTINE ADDRESS
SAVB5 EQU ROUTINE+1 LOCATION TO SAVE B5
SAVB7 EQU SAVB5+1 LOCATION TO SAVE B7
SAVNX EQU SAVB7+1
SAVNY EQU SAVNX+1
*
ENDOV
* /--- BLOCK END 00 000 76/07/30 19.45
*
*
OVTABLE
*
*
END DRAWS$