/

/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

/VT15 DISPLAY - FORTRAN CALLABLE SUBPROGRAM PACKAGE

/DISPLAY FILE RELOCATION ROUTINES

/

/ EDIT	#001	SCR	8/11/75		FIX UP FOR XVM, ETC.

/ EDIT	#002	SCR	9/2/75		COPYRIGHT

/

/

/VT15 COMMANDS

CHARSI=060000			/CHARACTER STRING INDIRECT INSTRUCTION.

SAVE=240000			/SAVE INSTRUCTION.

RSTR=260000			/RESTORE INSTRUCTION.

DJMSI=660000			/SUBPICTURE CALL

DJMPI=620000			/SUBPICTURE RETURN

DJMP=600000			/DISPLAY JUMP INSTRUCTION.

	.EBREL

	.GLOBL	DYSET,DYLINK

/SUBROUTINE DYSET

DYSET	XX

	LAC	DYL34		/SET SWITCH TO SHOW DYSET ENTRY

	DAC	DYS24

/SET UP POINTERS TO START AND END OF ARGUMENT LIST.

	LAC	DYSET		/GET A POINTER TO THE ARGUMENT LIST.

DYS05	DAC	ARGP

	LAC*	DYSET		/GET A POINTER (13 BIT) TO THE

	AND	(17777		/END OF THE ARGUMENT LIST.

	DAC	ARGEND

/ANY MORE ARGUMENTS?

DYS10	ISZ	ARGP		/POINT AT DISPLAY POINTER

	LAC	ARGP		/CHECK FOR ANY MORE ARGUMENTS.

	AND	(17777		/KEEP 13 BITS.

	SAD	ARGEND

	JMP*	DYSET		/NO MORE ARGUMENTS, RETURN.

/SET UP DISPLAY FILE POINTERS

	LAC*	ARGP

	DAC	TEMP

	LAC*	TEMP

	SNA			/0= TEXT ARRAY FLAG

	JMP*	DYSET		/RETURN IF REMAINING ARGS ARE TEXT ARRAYS.

	LAC*	ARGP		/GET ARG POINTER AGAIN.

	JMS	INDRCT		/GET ACTUAL POINTER.

	DAC	PNAME

	DAC	PNPTR		/POINTER TO THE DISPLAY FILE.

	LAC*	PNPTR		/GET DISPLAY LENGTH.

	TAD	PNPTR		/ADD LOCATION.

	DAC	EPTR		/POINTER TO END OF DISPLAY FILE.

	DAC	EOF		/(001) EPTR OVER-USED, HAVE ANOTHER.

	ISZ	PNPTR		/(001) DON'T PICK UP ENTRY POINT!!

	ISZ	ARGP		/POINT AT ASCII POINTER.

/FIND SUBPICTURE CALLS

DYS20	ISZ	PNPTR		/POINT AT NEXT DISPLAY COMMAND.

	LAC*	PNPTR		/GET IT.

	AND	(760000		/MASK IT.

	SAD	(DJMSI		/IF DJMS*

	JMP	DYS30		/GO CHANGE OPERAND.

	SAD	(CHARSI		/IF CHARS*

	JMP	DYS30		/GO CHANGE OPERAND.

	SAD	(SAVE		/(001) SAVE INST?

	JMP	DYS91		/(001) GO CLEAR OPERAND

DYS22	LAC	PNPTR		/ELSE CHECK IF END OF

	SAD	EOF		/(001) END? EOF UNCHANGED, EPTR MOVES.

DYS24	XX			/RECYCLE IF SET, SET PNAME IF LINK.

	JMP	DYS20		/NOT YET, RECYCLE.

	.EJECT

/LOOK FOR DJMS* OPERAND IN THE ARGUMENT LIST.

DYS30	LAC	DYSET		/SET UP AN ARGUMENT POINTER FOR

	DAC	ARGP2		/THIS PASS THRU THE ARGUMENT LIST.

	LAC	D.1		/ADD 2

	TAD	PNPTR		/TO FILE POINTER, TO

	DAC	PNPTR		/POINT AT OPERAND OF DJMS*.

	LAC	DYS24		/WAS THIS A CALL TO DYSET

	SAD	DYL31		/OR

	JMP	DYL10		/DYLINK.

DYS32	ISZ	ARGP2		/POINT AT DISPLAY FILE PTR.

	LAC	ARGP2		/CHECK FOR END OF ARGUMENT LIST.

	AND	(17777

	SAD	ARGEND

	JMP	DYS20		/GO CHECK NEXT DISPLAY COMMAND.

	LAC*	ARGP2		/GET DISPLAY FILE PTR.

	DAC	TEMP

	LAC*	TEMP

	SNA			/IF TEXT ARRAY FLAG (ARG=0)

	JMP	DYS32	/GO GET NEXT ARG.

	LAC*	ARGP2		/GET DISPLAY FILE POINTER.

	JMS	INDRCT	/GET ACTUAL ARG POINTER.

	DAC	TEMP		/(001) REMOVE AND (77777

	ISZ	ARGP2		/POINT AT ASCII POINTER.

	LAC*	PNPTR		/GET DJMS* OR CHARS* OPERAND.

/				/(001) REMOVE AND (77777)

	SAD	TEMP		/IF EQUAL TO ARGUMENT (TEXT ARRAY),

	JMP	DYS40		/GO SET UP RELATIVE POINTER.

	ISZ	TEMP		/BUMP TO CHECK DJMS* PNAME+1

	SAD	TEMP		/IF EQUAL TO ARG (PNAME+1),

	JMP	DYS40		/GO SET UP RELATIVE POINTER.

	JMP	DYS32		/ELSE RECYCLE.

/SEARCH THRU END OF DISPLAY FILE FOR ASCII SUBPICTURE NAMES.

DYS40	LAC	EPTR

DYS42	DAC	EPTR2		/(001)PTR TO MOVE UP FROM END OF FILE.

	SAD	EOF		/(001) UP TO DIPLAY CODE YET

	JMP	DYS50		/GO INSERT ASCII IN DISPLAY FILE.

	TAD	(-3		/4-WORD ASCII BLOCK.

	DAC	EPTR2

	JMS	COMPR		/COMPARE ASCII STRINGS.

	JMP	DYS44		/SAME.

	LAW	-1		/(001) MOVE REST OF 4 LOC.'S

	TAD	EPTR2		/(001)

	JMP	DYS42		/RECYCLE.

	.EJECT

/INSERT RELATIVE POINTER TO ASCII OPERAND OF DJMS*

DYS44	LAC	PNAME		/SET UP POINTER TO ASCII STRING

	CMA; TAD (1		/RELATIVE TO THE BEGINNING

	TAD	EPTR2		/OF THIS DISPLAY FILE.

	DAC*	PNPTR		/INSERT AS OPERAND OF PJMP.

	JMP	DYS20		/RETURN FOR NEXT DISPLAY COMMAND.

/INSERT NEW ASCII BLOCK AT END OF DISPLAY FILE.

DYS50	LAC*	ARGP2		/GET PTR TO ASCII BLOCK POINTER.

	JMS	INDRCT		/CORRECT FOR INDIRECT CALL ARG.

	DAC	TEMP		/(001)REMOVE XTRA INDIRECT

	LAW	-4		/4 WORDS INTO FILE

	DAC	CNTR

DYS52	ISZ	EPTR		/MOVE END PTR DOWN FOR ASCII.

	LAC*	TEMP		/GET ASCII.

	DAC*	EPTR		/INSERT IN FILE.

	ISZ	TEMP

	ISZ	CNTR		/DONE 4?

	JMP	DYS52		/NO, RECYCLE.

	LAC	EPTR		/SET UP POINTER

	TAD	(-3		/TO START OF NEW BLOCK.

	DAC	EPTR2

	LAC*	PNAME		/UPDATE FILE LENGTH.

	TAD	(4

	DAC*	PNAME

	JMP	DYS44		/GO SET DJMS* OPERAND.

	.EJECT

/COMPARE ASCII STRINGS. AC=STRING IN DISPLAY FILE, ARGP2=POINTER IN ARG LIST.

COMPR	XX

	DAC	TEMP2		/SAVE PTR TO ASCII IN DISPLAY FILE

	LAC*	ARGP2		/GET A POINTER FROM THE ARGUMENT

	JMS	INDRCT

	DAC	TEMP		/(001) REMOVE XTRA INDIRECT

	LAW	-4		/4 WORD BLOCK.

	DAC	CNTR

COM10	LAC*	TEMP		/COMPARE A WORD OF ASCII.

	SAD*	TEMP2

	JMP	COM20		/SAME, SET UP FOR NEXT WORD.

	ISZ	COMPR

	JMP*	COMPR		/DIFFERENT, RETURN.

COM20	ISZ	TEMP		/NEXT WORD OF ARGUMENT ASCII.

	ISZ	TEMP2		/NEXT WORD OF DISPLAY FILE ASCII.

	ISZ	CNTR		/DONE 4 WORDS?

	JMP	COM10		/NO, RECYCLE

	JMP*	COMPR		/RETURN.

/

/GET ACTUAL ARGUMENT INTO AC IF GIVEN ARGUMENT (IN AC) WAS INDIRECT.

INDRCT	XX

	SMA			/INDIRECT IF MINUS.

	JMP*	INDRCT		/DIRECT,RETURN.

	DAC	TEMP		/SAVE INDIRECT POINTER.

	LAC*	TEMP		/GET ACTUAL POINTER.

	JMP*	INDRCT		/RETURN

/

DYS91	LAC*	PNPTR		/(001)ZERO SAVVE OPERAND, SO IT

/				/(001) DOESN'T LOOK LIKE A VT-15 OP.

	XOR	PNPTR		/(001)TOP 5 BITS PNPTR. BOTTOM 13

	AND	(17777		/(001) INDIR FROM PNPTR

	XOR	PNPTR		/(001)

	DAC	TEMP		/(001) ADDR OF OFFENDING WORD

	DZM*	TEMP		/(001)ALSO DO AT DYLINK TIME,

	JMP	DYS20		/(001)IRRELEVANT.

/

	.EJECT

/SUBROUTINE DYLINK

DYLINK	XX

	LAC	DYL31		/SET UP BRANCH TO INDICATE DYLINK

	DAC	DYS24		/ENTRY.

	LAC	DYLINK		/SET UP COMMON EXIT.

	DAC	DYSET

	JMP	DYS05		/GO START.

/SEARCH ARGUMENT LIST FOR ASCII POINTED AT BY DJMS* OPERAND.

DYL10	ISZ	ARGP2		/NEXT DISPLAY FILE.

	LAC	ARGP2		/CHECK FOR END OF ARGUMENT

	AND	(17777

	SAD	ARGEND		/LIST.

	JMP	DYS20

	LAC*	ARGP2		/IF TEXT ARRAY FLAG (ARG=0),

	DAC	TEMP 	

	LAC*	TEMP

	SNA

	ISZ	ARGP2		/GO TO NEXT ARG.

	ISZ	ARGP2		/NEXT ASCII POINTER IN ARG LIST.

	LAC*	PNPTR		/COMPUTE ABS PTR TO DISPLAY FILE

	TAD	PNAME		/ASCII FROM DJMS* OPERAND.

	JMS	COMPR		/COMPARE ASCII STRINGS.

	JMP	DYL20		/SAME, GO SET UP DJMS* OPERAND.

	JMP	DYL10		/DIFFERENT, RECYCLE.

/INSERT DISPLAY FILE LOCATION AS OPERAND OF DJMS*.

DYL20	LAC	ARGP2		/MOVE ARGUMENT PTR BACK TO PNAME

	TAD	(-1		/CORRESPONDING TO THIS ASCII.

	DAC	TEMP

	LAC*	TEMP		/GET DISPLAY FILE POINTER.

	JMS	INDRCT		/GET ACTUAL ARG PTR.

/				/(001) REMOVE  AND  (77777)

	DAC*	PNPTR		/INSERT AS DJMS* OR CHARS* OPERAND.

	DZM	SRFLG		/CLEAR OUT SAVE-RESTORE FLAG

	LAC	PNPTR		/GET FILE POINTER,

	AND	(17777		/KEEP 13 BITS,

	DAC	TEMP		/SAVE AS INSERT LOC. FOR INDIRECT REFERENCE.

	LAC	PNPTR		/GET FILE POINTER (15 BITS),

	TAD	(-3		/MOVE BACK 3 LOCS,

	DAC	TEMP2		/AND SAVE IT.

	LAC*	TEMP2		/GET CONTENTS OF PNPTR-3,

	AND	(760000		/MASK,

	SAD	(SAVE		/AND TEST FOR SAVE INSTRUCTION.

	SKP			/EQUAL SAVE INSTRUCTION.

	JMP	DYL25		/NOT SAVE, CONTINUE.

	XOR	TEMP

	TAD	(1		/FORM AND

	DAC*	TEMP2		/STORE NEW SAVE INSTRUCTION.

	ISZ	SRFLG		/SET SAVE-RESTORE FLAG.

DYL25	ISZ	TEMP2		/POINT TO CHARS* OR DJMS*,

	LAC*	TEMP2		/GET IT,

	AND	(760000		/AND MASK IT.

	SAD	(DJMSI		/IF DJMS*,

	ISZ*	PNPTR		/BUMP EFFECTIVE OPERAND TO PNAME+1.

	TAD	TEMP		/FORM NEW ADDRESS PORTION,

	DAC*	TEMP2		/AND STORE IT.

	ISZ	TEMP2		/POINT TO DJMP.

	ISZ	TEMP		/POINT TO LOC AFTER INDIRECT WORD.

	LAC	(DJMP		/FORM DJMP INSTRUCTION

	TAD	TEMP		/WITH NEW ADDRESS,

	DAC*	TEMP2		/AND STORE IT.

	LAC	SRFLG		

	SZA

	ISZ*	TEMP2		/INCREMENT DJMP IF SAVE-RESTORE GROUP.

	SNA

	JMP	DYS20		/DONE, IF NOT SAVE-RESTORE GROUP.

	LAC	TEMP2

	TAD	(3

	DAC	TEMP2		/POINT TO LOC FOR RSTR INSTRUCTION.

	LAC	(RSTR		/FORM RSTR INSTRUCTION

	TAD	TEMP		/WITH NEW ADDRESS PORTION,

	DAC*	TEMP2		/AND STORE IT.

	JMP	DYS20		/NEXT DISPLAY COMMAND.

/FIND LAST DISPLAY COMMAND (DJMPI) AND SET RELATIVE POINTER (FILE LENGTH) TO IT AT

/WORD 0, EXCLUDING ASCII BLOCKS AT END OF FILE.

DYL30	LAC*	EPTR		/GET LAST DISPLAY FILE WORD.

	AND	(760000

	SAD	(DJMPI		/DJMPI IS THE LAST DISPLAY COMMAND.

	JMP	DYL32		/GO SET UP POINTER.

	LAC	EPTR		/DECREMENT END POINTER.

	TAD	(-1

	DAC	EPTR

DYL31	JMP	DYL30		/GET NEXT.

DYL32	LAC	PNAME		/FORM NEW

	AND	(17777

	TAD	(DJMPI+1	/DJMP* INSTRUCTION

	DAC*	EPTR		/AND STORE IT.

	LAC	PNAME		/POINTS TO BEGINNING OF FILE.

	CMA			/SUBTRACT FROM

	TAD	(1

	TAD	EPTR		/END POINTER.

	DAC*	PNAME		/STORE RELATIVE POINTER.

DYL34	JMP	DYS10		/BACK FOR NEXT DISPLAY FILE.

/CONSTANTS AND TEMPORARY STORAGE

ARGP				/ARGUMENT LIST POINTERS

ARGP2

ARGEND

PNAME				/DISPLAY FILE POINTERS

PNPTR

EPTR

EOF				/(001) END OF FILE ADDR (STABLE)

EPTR2

D.1	2			/DISTANCE FROM START OF FILE TO FIRST COMMAND.

TEMP				/TEMPORARY STORAGE

TEMP2

CNTR				/COUNTER

SRFLG				/SAVE-RESTORE GROUP FLAG.

	.END