/

/COPYRIGHT (C) 1975

/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

/

/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY

/ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH

/THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS

/SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO-

/VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON

/EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO

/THESE LICENSE TERMS.  TITLE TO AND OWNERSHIP OF THE

/SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.

/

/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE

/WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM-

/MITMENT BY DIGITAL EQUIPMENT CORPORATION.

/

/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY

/OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.

	.EJECT

/

/FORTRAN CALLABLE LIGHT PEN TRACK ROUTINE

/FOR  VT-15 DISPLAY SYSTEM

/

/CHARLES F. DAVIS         SEPT.  1970

/COPYRIGHT 1970, DIGITAL EQUIPMENT CORP.

/MAYNARD, MASS.

/

/ EDIT #001  12/19/72  S. ROOT

/ EDIT #002	10/24/73 S. ROOT UPDATE FOR F4 044

/ EDIT #003	8/3/74	SCR	DRAW OPTION NEEDS ADDT'NL ARG. UNDER F4 044

/				SINCE NO ARRAY DESCRIPTOR BLOCK WITH ARRAY SIZE

/ EDIT #004	8/5/74	SCR	F4 044 CAN'T TELL A PROVIDED ZERO FROM A PROVIDED

/				ARRAY WITH FIRST LOC ZERO. USE PRESENCE OF 5TH

/				ARG. TO TELL DRAWING FROM TRACKING!

/ EDIT #005	8/1/75	SCR	CHECK MF.102=0; TRACK SYMBOL CENTERED

/ EDIT #006	8/20/75	SCR	ERROR .INIT CAL;DRAW FILE HEADR

/ EDIT #007	9/2/75	SCR	COPYRIGHT

/

	.IODEV	10,-3

/

/   REMOVE REFERENCE TO VTIOB IN VTA. HANDLER. CALL TO TRACK

/  WITH OUTSTANDING LTORPB WILL LOOP ON CAL UNTIL LTORPB DONE.

/  VTIOB NO LONGER IN .GLOBL; DZM* VTIOB PRIOR TO LABEL TCK1

/  REMOVED. NO OTHER CHANGES MADE FOR EDIT #001.   S. ROOT.

/

	.GLOBL	TRACK, MF.102, .DA

/

/SYMBOL DEFINITIONS

/

PX=144000		/X-PARAMETER

PY=140000		/Y-PARAMETER

INT=020000		/INTENSIFICATION

/

VI0=420000		/INTENSIFIED VECTORS IN THE DIRECTIONS INDICATED (0-7)

VI1=422000

VI2=424000

VI3=426000

VI4=430000

VI5=432000

VI6=434000

VI7=436000

/

V0=400000		/NON-INTENSIFIED VECTORS IN THE DIRECTIONS INDICATED (0-7)

V1=402000

V2=404000

V3=406000

V4=410000

V5=412000

V6=414000

V7=416000

/

OSETF=210002		/OFFSET OFF

ROTOF=210040		/ROTATE OFF

BKOF=211000		/BLINK OFF

INCROF=200020		/INCREMENT OFF

/

LDNM=234400		/LOAD NAME REGISTER

LPON=210014		/LIGHT PEN ON

LPOF=210010		/LIGHT PEN OFF

/

DNOP=200000		/DISPLAY NOP

DJMP=600000		/DISPLAY JUMP

DJMPI=620000		/DISPLAY JUMP INDIRECT

DJMS=640000		/DISPLAY JMS

DJMSI=660000		/DISPLAY JMS INDIRECT

DSKP=235000		/DISPLAY SKIP

INT7=203600		/INTENSITY LEVEL 7

INT3=202600		/INTENSITY LEVEL 3

	.EJECT

/

/LIGHT PEN TRACK ROUTINE

/VT-15 DISPLAY SYSTEM

/

TRACK	0

	JMS*	.DA		/GETS CALL ARGUMENTS

	JMP	.+6		/JUMP PAST ARGUMENT STORAGE

TX	.DSA	0		/X POSITION

TY	.DSA	0		/Y POSITION

TOPTA	.DSA	0		/OPTION DESIRED

TARRA	.DSA	0		/ARRAY POINTER

TSIZE	.DSA	0		/SIZE OF DRAW ARRAY (EDIT #003)

/OPTIONS	 0-NO CONSTRAINTS

/		 1-MOVEMENT RESTRICTED IN +Y AND -Y DIRECTIONS

/		 2-MOVEMENT RESTRICTED IN +X AND -X DIRECTIONS

/		 3-MOVEMENT RESTRICTED IN -X DIRECTION

/		 4-MOVEMENT RESTRICTED IN -Y DIRECTION

/		 5-MOVEMENT RESTRICTED IN +X DIRECTION

/		 6-MOVEMENT RESTRICTED IN +Y DIRECTION

/

TCK1	LAW	-5

	TAD*	TRACK

	XOR	TRACK

	AND	(7777

	SNA

	DZM	TARRA		/EDIT #004, TELL TRACK FROM DRAW

/

	LAC	(PX		/SET INITIAL POSITION TO BEGIN TRACK

	DAC	TNAM2		/INITIALIZE TNAM2 TO VALUE OTHER THAN  0-7

	TAD*	TX		/GET INITIAL X VALUE

	DAC	TRCK1		/DEPOSIT POINT X IN THE DISPLAY FILE

	LAC	(PY!INT		/GET INTENSIFIED POINT Y INSTRUCTION

	TAD*	TY		/GET INITIAL Y VALUE

	DAC	TRCK1+1		/DEPOSIT POINT Y IN THE DISPLAY FILE

TCK2	LAC*	MF.102		/GET POINTER TO BOTTOM OF MAIN FILE

	SNA			/SKIP IF MAIN FILE RUNNING  ##005##

	JMP*	TRACK		/NO, SO JUST EXIT           ##005##

	DAC	TTEMP1		/STORE POINTER TO MAIN FILE BOTTOM

	DAC	TTEMP2

	DAC	TTEMP3

	ISZ	TTEMP1		/MOVE POINTER TTEMP1 TO BOTTOM +1

	ISZ	TTEMP3		/MOVE POINTER TTEMP3 TO BOTTOM +2

	ISZ	TTEMP3

	LAC*	TTEMP2		/MOVE DJMP* TOP+1 DOWN ONE LOCATION

	DAC*	TTEMP1

	LAC	TRCKA		/GET ADDRESS OF TRACK DISPLAY FILE

	DAC*	TTEMP3

	LAC	TTEMP3

	AND	(17777		/MASK 13 BITS TO GET ADDRESS

	TAD	(DJMSI		/CREATE DJMS* TO TRACK DISPLAY FILE

	DAC*	TTEMP2		/PUT THE DJMS* IN THE MAIN FILE

TCK3	LAC*	TOPTA		/USES OPTION ARGUMENT AS AN INDEX VALUE

	TAD	(TDISP		/GET BASE ADDRESS OF DISPATCH TABLE

	DAC	TTEMP3		/STORES INDEXED DISPATCHED TABLE ADDRESS

	LAC	TSIDEX		/GET LOAD NAME REGISTER INSTRUCTION (167)

	JMP*	TTEMP3		/JUMPS TO DISPATCH TABLE

TTEMP1	0			/POINTER TO MAIN FILE

TTEMP2	0			/POINTER TO FOLLOWING MAIN FILE LOCATION

TTEMP3	0

	.EJECT

/

/DISPATCH TABLE TO JUMP TO USER SPECIFIED OPTION

/THE OPTIONS SET UP THE VECTOR TABLE TO RESTRICT MOVEMENT

/

TDISP	JMP	TARSET		/OPTION DISPATCH TABLE, OPTION 0

TOPT1	JMP	THORZ		/OPTION 1

	JMP	TVERT		/OPTION 2

	JMP	TDIR0		/OPTION 3

	JMP	TDIR2		/OPTION 4

	JMP	TDIR4		/OPTION 5

	JMP	TDIR6		/OPTION 6

TARSET	LAC	TARRA		/IS TRACKING OR DRAWING (EDIT #004)

	SNA			/NON-ZERO IF DRAW PRESENT

	JMP	TREAD		/JUMP TO FIRST READ IF ARRAY NOT PRESENT

	DAC	TARPT0		/SETS POINTER TO ARRAY TOP

	TAD	(+2		/POINT TO SETPOINT POSITION IN FILE

	DAC	TARPT1		/SETS POINTER TO WORD 3 OF ARRAY

	LAC	(4		/(EDIT #006)INIT FILE TOP POINTER

	DAC*	TARPT0		/(EDIT #006)

TCK4	LAC	TRCK1		/SET ORIGIN OF THE TRACKING POINT IN THE USERS ARRAY

	DAC*	TARPT1		/SET X POSITION

	ISZ	TARPT1

	LAC	TRCK1+1

	DAC*	TARPT1		/SET Y POSITION

	LAC	TARPT1

	DAC	TARPT2

	ISZ	TARPT1

TCK5	LAC	(+1

	TAD	TARPT0		/GET ADDRESS OF ARRAY LOCATION 1, FIRST ARRAY ELEMENT

	DAC	TRCK3

	AND	(17777)

	TAD	(DJMPI		/COMBINE ADDRESS WITH DJMPI INSTRUCTION

	DAC*	TARPT1		/DEPOSIT DJMPI INTO ARRAY WORD 3

	LAC	TRCK3A		/GET DJMSI  TRCK3 INSTRUCTION

	DAC	TRCK2		/DEPOSIT JMSI TO ARRAY+1 IN TRCK DISPLAY FILE

/				/EDIT (#003) REMOVE 3 LINES

	LAW	-6		/COMPUTE CONTROL COUNT FROM ARRAY SIZE

	TAD*	TSIZE		/USER SUPPLIED SIZE (EDIT #003)

	AND	(17777)		/GET THE ARRAY SIZE, LAST 13 BITS

	SPA!CMA			/MAKE NEGATIVE COUNT, SKIP IF OK (EDIT #004)

	JMP	TMESS		/FLAG ILLEGAL COUNT WITH FULL MESS (EDIT #004)

	DAC	TARCNT		/COUNTER TO TEST AVAILABLE LOCATIONS

	DAC	TSTCNT		/COUNTER FOR INITIALIZATION 

	LAC	TARPT1

	DAC	TTEMP3		/SET UP INITIALIZATION POINTER

	LAC*	TARPT1

	ISZ	TTEMP3

	DAC*	TTEMP3		/FILL UP USERS VECTOR ARRAY WITH DJMPI TO TOP+1

	ISZ	TSTCNT

	JMP	.-3

	JMP	TREAD		/GO TO FIRST READ

	.EJECT

/

/ROUTINES TO SET UP NAME REGISTERS IN TRACK DISPLAY FILE

/AS DETERMINED BY OPTION CALLED FOR

/SET UP PERFORMED BY INTERCHANGING NAME REGISTERS

/

TDIR0	DAC	TSIDE4		/RESTRICTS MOVEMENT IN -X DIRECTION

	LAC	TSIDE2

	DAC	TSIDE3

	LAC	TSIDE6

	DAC	TSIDE5

	JMP	TARSET

/

TDIR2	DAC	TSIDE6		/RESTRICTS MOVEMENT IN -Y DIRECTION

	LAC	TSIDE4

	DAC	TSIDE5

	LAC	TSIDE0

	DAC	TSIDE7

	JMP	TARSET

/

TDIR4	DAC	TSIDE0		/RESTRICTS MOVEMENT IN +X DIRECTION

	LAC	TSIDE2

	DAC	TSIDE1

	LAC	TSIDE6

	DAC	TSIDE7

	JMP	TARSET

/

TDIR6	DAC	TSIDE2		/RESTRICTS MOVEMENT IN +Y DIRECTION

	LAC	TSIDE0

	DAC	TSIDE1

	LAC	TSIDE4

	DAC	TSIDE3

	JMP	TARSET

/

THORZ	DAC	TSIDE2		/RESTRICTS MOVEMENT IN +Y AND -Y DIRECTIONS

	DAC	TSIDE6

	LAC	TSIDE0

	DAC	TSIDE1

	LAC	TSIDE4

	DAC	TSIDE3

	JMP	TDIR2+1

/

TVERT	DAC	TSIDE0		/RESTRICTS MOVEMENT IN +X AND -X DIRECTIONS

	DAC	TSIDE4

	LAC	TSIDE2

	DAC	TSIDE1

	LAC	TSIDE6

	DAC	TSIDE7

	JMP	TDIR0+1

	.EJECT

/

/MOVE TABLE CONTAINING THE X AND Y DISPLACEMENT

/VALUES TO MOVE THE TRACKING POINT

/(POINT IN CENTER OF OCTAGON)

/DISPLACEMENTS ARE 2 RASTOR UNITS IN + OR - DIRECTION

/16 ENTRIES, AN X AND Y FOR EACH AXIS DIRECTION

/

TMVPT1	TMOVE			/POINTER TO TOP OF MOVE TABLE

TMVPT2	0			/FLOATING MOVE TABLE POINTER

/

TMOVE	2			/X-DISPLACEMENT

	0			/Y-DISPLACEMENT

	2

	2

	0

	2

	-2

	2

	-2

	0

	-2

	-2

	0

	-2

	2

	-2

/

/VECTOR TABLE TO BUILD OPTIONAL TRACKING DISPLAY FILE

/8 ENTRIES, ONE FOR EACH AXIS DIRECTION

/

TVCPT1	TVECT			/POINTER TO TOP OF VECTOR TABLE

TVCPT2	0			/FLOATING VECTOR TABLE POINTER

/

TVECT	VI0!2			/INTENSIFIED VECTOR, 2 RASTOR UNITS IN DIRECTION 0

	VI1!2

	VI2!2

	VI3!2

	VI4!2

	VI5!2

	VI6!2

	VI7!2

	.EJECT

/

/THE FOLLOWING MACRO READS SPECIFIED REGISTERS

/AND SERVICES SPECIFIED INTERRUPTS

/SERVICES PUSHBUTTON AND LIGHT PEN INTERRUPTS, AND READS NAME REGISTER

TREAD	DZM	TBUFF			/ZERO FIRST WORD OF ARGUMENT RETURN BUFFER

	.READ	10,7,TBUFF,1

	300100

/

TCK7	LAC	TBUFF			/GET DESCRIPTOR WORD

	SNA				/SKIP WHEN READ EXECUTED, TBUFF NON ZERO

	JMP	.-2			/READ TEST LOOP

	AND	(200000)		/TEST FOR PUSHBUTTON

	SZA				/SKIP IF ZERO, NO PUSHBUTTON HIT

	JMP	TEXIT			/EXIT TRACK IF PUSHBUTTON HIT

	LAC	TBUFF+1			/GET NAME REGISTER

	TAD	(-170			/TEST FOR NON TRACK NAME REGISTER

	SPA				/SKIP IF POSITIVE, VALID NAME REGISTER

	JMP	TREAD			/GO TO NEXT READ IF INVALID NAME REG

	DAC	TNAM1			/UPDATE NAME REGISTER STORAGE

	TAD	TVCPT1			/ADD VECTOR TABLE BASE ADDRESS

	DAC	TVCPT2			/STORES INDEXED VECTOR TABLE POINTER

TCK11	LAC	TNAM1			/GET INDEX VALUE (0-7)

	CLL!RAL				/DOUBLE THE VALUE

	TAD	TMVPT1			/ADD MOVE TABLE BASE ADDRESS

	DAC	TMVPT2			/STORES INDEXED MOVE TABLE POINTER

	LAC*	TMVPT2			/GET CHANGE IN X

	TAD	TRCK1			/UPDATE X POSITION

	DAC	TRCK1			/RETURN UPDATED VALUE

	ISZ	TMVPT2			/INCREMENT MOVE TABLE POINTER TO Y VALUE

	LAC*	TMVPT2			/GET CHANGE IN Y

	TAD	TRCK1+1			/UPDATE Y POSITION

	DAC	TRCK1+1			/RETURN UPDATED VALUE

TCK12	LAC	TARRA			/(EDIT #004) TRACK OR DRAW

	SNA

	JMP	TREAD			/GO TO NEXT READ IF NO ARRAY

	LAC	TNAM1			/TEST DIRECTION OF THIS HIT

	SAD	TNAM2			/AGAINST DIRECTION OF LAST HIT

	JMP	TSAME			/HITS IN SAME DIRECTION, COMBINE

	DAC	TNAM2			/IF NOT SAME UPDATE LAST NAME REG

TCK13	LAC*	TVCPT2			/GET VECTOR FROM TABLE

	DAC*	TARPT1			/DEPOSIT IN USER VECTOR ARRAY

	ISZ*	TARPT0			/UPDATE LENGTH, ARRAY WORD ONE

	ISZ	TARCNT			/CHECK FOR ARRAY OVERFLOW

	SKP				/UNCONDITIONAL SKIP

	JMP	TMESS			/IF OVERFLOW OCCURS TYPE MESSAGE ANE EXIT

	ISZ	TARPT1			/MOVE ARRAY POINTER 1 TO NEXT LOCATION

	ISZ	TARPT2			/MOVE ARRAY POINTER 2 TO NEXT LOCATION

	JMP	TREAD			/GO TO NEXT READ

	.EJECT

/

/THIS ROUTINE COMBINES A TWO RASTOR UNIT VECTOR WITH THE LAST

/VECTOR IN THE USER ARRAY, WHEN TWO OR MORE LIGHT PEN

/HITS HAVE OCCURED IN THE SAME DIRECTION, ONE AFTER THE OTHER

/

TSAME	LAC	(+2			/SET AC=+2			

	TAD*	TARPT2			/ADD 2 TO MAGNITUDE OF LAST ARRAY VECTOR

	DAC*	TARPT2			/REDEPOSIT THE LENGTHENED VECTOR

	JMP	TREAD			/GO TO NEXT READ

/

/

/THIS ROUTINE PRINTS A MESSAGE TO THE USER WHEN HIS

/VECTOR DISPLAY ARRAY HAS FILLED--AND THEN EXITS TRACK

/

TMESS	.INIT	-3,1,0			/(EDIT #006)INITIALIZE TTY

	.WRITE	-3,2,TMB1,16

	.WAIT	-3

	JMP	TEXIT

	

TMB1	TMB2-TMB1/2*1000+2

	0

	.ASCII "ARRAY OVERFLOW"<015>

TMB2=.

	.EJECT

/

/SUBROUTINE TO RESTORE NAME REGISTERS

/WHEN EXITING FROM TRACK

/

TREST	0				/SUBROUTINE TO RESTORE NAME REGISTERS

	LAC	(-10			/SET LOOP COUNTER TO -10 OCTAL

	DAC	TNAM1

	LAC	(TSIDE0			/SET POINTER TO FIRST LOAD NAME REGISTER INSTRUCTION

	DAC	TVCPT2

	LAC	TSIDEX

	DAC*	TVCPT2

	ISZ*	TVCPT2

	LAC*	TVCPT2

	ISZ	TVCPT2

	ISZ	TVCPT2

	ISZ	TVCPT2

	ISZ	TVCPT2

	ISZ	TNAM1

	JMP	.-10

	JMP*	TREST

/

/

/

/THIS ROUTINE EXITS FROM TRACK AND

/RETURNS CONTROL TO CALLING PROGRAM

/

TEXIT	JMS	TREST			/GO TO SUBROUTINE, RESTORES NAME REGISTERS

	LAC*	TTEMP1

	DAC*	TTEMP2			/REMOVES LINK TO TRACK DISPLAY FILE

	LAC	TRCK1			/GET X-PARAMETER FROM DISPLAY FILE

	AND	(1777)

	DAC*	TX			/RETURN FINAL X POSITION

	LAC	TRCK1+1			/GET Y-PARAMETER FROM DISPLAY FILE

	AND	(1777)

	DAC*	TY			/RETURN FINAL Y POSITION

TCK15	LAC	(DNOP			/GET DNOP INSTRUCTION

	DAC	TRCK2			/REMOVE LINK FROM TRACK DISPLAY FILE TO USER ARRAY

	JMP*	TRACK			/RETURN TO CALLING PROGRAM

	.EJECT

        .LTORG

	.EBREL

TRCKA   TRCK

TRCK3A  DJMSI   TRCK3

TARCNT	0		/COUNTS AVAILABLE ARRAY LOCATIONS

TARPT0	0		/POINTER TO TOP OF USER ARRAY

TARPT1	0		/POINTER TO USER ARRAY, FOLLOWS BEHIND TARPT2

TARPT2	0		/FLOATING POINTER TO USER ARRAY

TSTCNT	0		/INITIALIZATION COUNTER

TNAM1	0		/STORES NAME REGISTER OF PRESENT LIGHT PEN HIT

TNAM2	0		/STORES NAME REGISTER OF LAST LIGHT PEN HIT

TBUFF	.BLOCK 3	/.READ BUFFER

/

/

/

/NOTES:

/THE INITIAL X,Y, POSITION LIMITS  <0...1023> DECIMAL, <0...1777> OCTAL

/THE FINAL X,Y, POSITION LIMITS  <24...999> DECIMAL, <30...1747> OCTAL

/CAUSE OF THE LIMIT DIFFERANCE:

/THE TRACKING PATTERN IS UNABLE TO BE MOVED WITHIN 24 DECIMAL RASTOR 

/UNITS OF THE SCREEN EDGE BECAUSE INTENSIFIED VECTORS DISAPPEAR WHEN 

/ANY PART OF THE VECTOR VIOLATES A SCREEN EDGE.

/

	.EJECT

/

/TRACK RESIDENT DISPLAY FILE

/PUTS TRACKING POINT AND SURROUNDING OCTAGON ON THE DISPLAY

/

TRCK	0		/STORES RETURN ADDRESS

	OSETF!ROTOF!BKOF!LPON

TRCK1	DNOP		/X-POSITION OF TRACK POINT

	DNOP		/Y-POSITION OF TRACK POINT

	INT7!INCROF	/SET INTENSITY LEVEL 7

	V0!30

	V6!12

TSIDE0	LDNM!170	/LOAD NAME REGISTER

	565124

	565124

	564522

TSIDE1	LDNM!171

	566733

	566532

	566532

TSIDE2	LDNM!172

	571144

	571144

	570542

TSIDE3	LDNM!173

	572753

	572552

	572552

TSIDE4	LDNM!174

	574564

	574564

	574562

TSIDE5	LDNM!175

	576773

	576572

	576572

TSIDE6	LDNM!176

	561104

	561104

	560502

TSIDE7	LDNM!177

	562713

	562512

	562512

TSIDEX	LDNM!167

	INT3

	LPOF		/LIGHT PEN OFF

	V4!30		/RETURN BEAM TO CENTER OF SYMBOL  ##005##

	V2!12		/SO ITEM CAN FOLLOW TRACKING      ##005##

TRCK2	DNOP		/STORES DJMSI TO ARRAY+1, IF ARRAY PRESENT

	DJMPI	TRCK	/RETURNS TO MAIN FILE

TRCK3	0		/POINTER TO ARRAY WORD 2, FOR INDIRECT ADDRESSING

	.END