Google
 

Trailing-Edge - PDP-10 Archives - BB-D480G-SB_FORTRAN10_V11.0_short - forddt.mac
Click forddt.mac to see without markup as text/plain
There are 22 other files named forddt.mac in the archive. Click here to see a list.
Title FORDDT	FORTRAN INTERACTIVE DEBUGGING AID ,11(405)
SUBTTL	P.E.T. HARDING/DBT/FLD/MD/JMT/MA/SJW/JNG/DCE/BPK/CKS/DCC/BAH/BL/TGS/MRB
;	Brad Merrill/BCM/AlB/MEM/PLB/CDM	10-Jul-86


;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1973, 1987
;ALL RIGHTS RESERVED.
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR ANY  OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF THE  SOFTWARE  IS  HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT  NOTICE
;AND  SHOULD  NOT  BE  CONSTRUED  AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY  OF  ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.


EDITNO==405	;EDIT NO
VERSION==11	;MAJOR VERSION NO
VMINOR==0	;MINOR VERSION NO
VWHO==0		;WHO LAST EDITED


.JBDDT=74
.JBREN=124
.JBVER=137


; Get universals and HELPER

IFNDEF	TOPS20,<TOPS20==-1>	;[147] 0 = TOPS10, -1 = TOPS20
IFNDEF	EXTHLP,<EXTHLP==0>	;[147] -1 If using external HELPER

IFN EXTHLP,<			;[147] external HELPER

IFE TOPS20,<.TEXT 'REL:HELPER/SEGMENT:LOW'> ;[142] load HELPER in low-seg

IFN TOPS20,<.REQUEST SYS:HELPER> ;[142] Load HELPER

	>			;[147] end IFN EXTHLP

IFE TOPS20,<
	SEARCH	UUOSYM,MACTEN	;[142] Get -10 monitor symbols
	OPDEF	XMOVEI	[MOVEI]	;[310] define XMOVEI for -10
	OPDEF	EFIW	[EXP]	;[310] make sure its defined
	OPDEF	IFIW	[EXP]	;[310] ditto
	>			;end IFE TOPS20

IFN TOPS20,<SEARCH MONSYM,MACSYM> ;[142] Get -20 monitor symbols





;Report what code is being assembled.

IF1,
<IFE TOPS20,<
	PRINTX [Assembling for TOPS10]
>;END OF IFE TOPS20

IFN TOPS20,<
	PRINTX [Assembling for TOPS20]
>;END OF IFN TOPS20
>;END OF IF1

;[300]
; These locations may not exist on TOPS-20 as of V10.  The symbol tables
; will be in PDV's and the version number and reenter address are stored
; in the program entry vector.  FORDDT will not load with LINK V6 if the
; LOC's remain, so until we can resolve the problems associated with JOBDAT
; vestiges, the LOC's themselves will be for TOPS10 only.
;
IFE TOPS20,<
LOC	.JBVER

BYTE(3)VWHO(9)VERSION(6)VMINOR(18)EDITNO	;SETS FORDDT VERSION #

LOC	.JBREN
RE.ENT				;SETS THE RE - ENTER ADDRESS

LOC	.JBDDT
SFDDT				;[145] MAKES DEBUG PROG,FORDDT WORK

RELOC
> ;END IFN TOPS20


	SUBTTL	REVISION HISTORY

COMMENT \

***** Begin Revision History *****

21		REMOVE ALL HIBERNATE CALLS - JUST USE TTCALL 4
22		CHANGE TRACE% TO TRACE.
23		BEGIN UPDATE FOR (1) SYMBOL TABLE LOOKUP ALGORITHMS
				 (2) GENERAL CLEAN UP
24		(CONTINUING)
25		CONTINUING;  ALSO REWRITE OF LOOK
26		CONTINUING;  REWRITE OF OFFSET
			     REMOVAL OF 'BIGCOD'
27		CONTINUING
30		CONTINUING;  INCLUDING SYMBOL USAGE CLEANUP AND REMOVAL
			     OF SYMSET
31		CONTINUING;  REMOVAL OF MOST 'DEBUG' CONDITIONAL CODE
			     AND INTCPT CONDITIONAL AND CODE
32		CONTINUING;  REMOVAL OF SMART PORTION OF LOOK
33		CONTINUING;  FIXUP OF PAUSE LOGIC
34		CONTINUING;  REINSERT OF SMART CODE TO LOOK - IGNORE
			     UDDT, FORDDT, AND JOBDAT ON LOOKUP.
35		FINAL EDIT OF UPDATE - PATCH AREA GOES UNDER DEBUG
		   CONDITIONAL, CALL TO DO MACRO IS FIXED, SO THIS WILL
		   NOW ASSEMBLE WITH MACRO V50.
36		ANOTHER FINAL - HIERARCHY IN LOOK;  FNDSYM RESOLVED
37		CONTINUING FINAL - SCATTERED BUGS
40		FIX AC LONG ASCII AND RASCII
		FIX - LOCATE FOR LOCALS OUTSIDE OPEN
		FIX - DIM A(X(1)/1)
41		FIX USAGE OF PROGRAMS NAMED OTHER THAN MAIN.
42		INITIALIZE  ODF (NUMERIC BASE) FOR GROUP TYPEOUT
43		ADD  CURGRP (BIT MASK ) TO NOTE CURRENT GROUPS
		ACTIVE IN A TYPEOUT  AND CATCH RECURSION
44		FIX UP "LOOK" SO THAT IF "MATHSM" IS NON-0 THAT IT
		WILL ACCEPT ONLY A SYMBOL WHOSE NAME IS IN "MATHSM"
45		FIX PAUSE TYPING TO LISTEN TO TTY BETTER
46		CHECK RANGES TO SEE THAT EACH  SYMBOL IS THE SAME

***** Begin Version 4A *****

47		DIFFERENTIATES ASCII- AND RASCII-MODE "TYPE"-OUTPUT
50		ALLOWS = AS DELIMITER IN ACCEPT STATEMENTS
51		FIXES "HELP" TO LIST COMMANDS
52		FIX TYPEOUT OF COMPLEX VALUES
53	15732	FIX TYPOUT OF SYMBOL WHEN LOCAL SYMBOL FOUND BEFORE GLOBAL
54	15732	***** DELETED *****TYPE OUT NAMES OF ARGUMENTS WHEN PAUSE AT
		ROUTINE
55	15708	MAKE TYPE KNOW ABOUT FORMAL ARGUMENTS

***** Begin Version 4B *****

56	16928	ACCEPT LOWER CASE MODE MODIFIERS
57	17043	IF TWO SYMBOLS HAVE SAME ADDRESS VALUE AND SAME
		NAME VALUE , THEN THEY MUST BE IN COMMON , SO LOOK
		SHOULD SUCCEED (OK SKIP 2 RETURN)
		ALSO REMEMBER NAME OF ARRAY FOR DIM COMMAND.
60	17272	IF ARRAY INFORMATION DOES NOT EXIST, TELL THE USER
		BUT DO NOT GIVE FDTIER ERROR.
61	17574	IF ERROR HAPPENS IN TYPING GROUP, CURRENT GROUP VARIABLE
		IS NOT CLEARED AND LATER GIVES ERROR FDTRGR.
62	18059	ADD INFORMATION IN THE "WHAT" OUTPUT
		(LOCATION OF THE PAUSE LABEL)
63	18374	GIVE CORRECT INFORMATION FOR "WHAT" COMMAND:
		SINGLE VARIABLE NAME + ARRAY NAMES AND SUBSCRIPT
		+ LOCATION OF NAMES
64	S19206	DONT TYPE EXTRA CRLF BETWEEN TYPED VALUES.
65	18715	ACCEPT COMMENTS ON COMMAND LINES
		DELIMITER IS !  TO END OF LINE OR OTHER !
66	 --- 	FIX TEST FOR ARRAY BOUNDS EXCEEDED IN DIM COMMAND
67	19541	FIX LOWER CASE RANGE CHECK
70	QA570	FIX REENTER MESSAGE TO ALWAYS GIVE SECTION NAME

***** Begin Version 5A ***** 7-Nov-76

71	20553	TYPING A FORMAT STATEMENT CAUSES AN E8 INTERNAL
		ERROR IF THE PROGRAM WAS NOT COMPILED WITH THE
		/DEBUG SWITCH. ADD MORE INFORMATIVE ERROR MESSAGE
		AREAS AFFECTED: FRMSET, ERR41
72	10088	WHEN TYPING AN ARRAY, THE INDEXES ARE NOT CORRECTLY
		TYPED IF AND ONLY IF THE IS A HIGH SEGMENT SYMBOL
		TABLE (FOR EXAMPLE FOROTS IS LOADED WITH SYMBOLS).
73	21818	WHEN TYPING A COMPLEX ITEM OR ARRAY, OR ACCEPTING A
		VALUE FOR A COMPLEX ARRAY, FORDDT DOESN'T NOTICE THAT
		EACH ENTRY IS TWO WORDS AND MESSES UP SUBSCRIPTS ETC.
74	21988	FORDDT CANT SET BREAK POINTS (PAUSE) IN HIGH SEGMENT
		OF A FORTRAN PROGRAM. ROUTINE CHKADR CLOBBERS (T)
75	21910	WHEN DOING A START, PROGRAM SHOULD CLEAR
		ANY SUPPLIED ARGUMENTS FROM THE TTY BUFFER.
76	21910	FIX ERROR IN ACCEPT ROUTINE WHICH CAUSES UNNECESSARY
		WARNING MESSAGE WHEN EXACTLY 5 (OR EXACTLY 10 IF IN
		LONG MODE) CHARACTERS ARE ACCEPTED
77	21910	MAKE THE PAUSE COMMAND WITH NO ARGUMENTS DISPLAY
		THE PAUSES.
100		Add TOPS20 conditional, make FORDDT run in native
		mode under TOPS-20.
101	QA2171	FIX FORDDT OUTPUT TO USE FOROTS CORRECTLY AFTER OTS EDIT
		  661: OUTPUT MUST START WITH + AND CLEAR TTY BUFFER
		  AFTERWARDS

***** Begin Version 5B ***** 8-Nov-77

102	11018	PREVENT LOOP IF SYMBOL TABLE HAS BEEN BLT'ED TO
		ZERO, AS CAN HAPPEN WITH AN OVERLAID PROGRAM.
103	QA2182	PUT "SEARCH MONSYM" FROM EDIT 100 UNDER "IFN TOPS20"
		  AND MOVE IT TO AFTER THE DEFINITION OF TOPS20
104	24427	PREVENT ILLEGAL MEMORY REFERENCE IF SYMBOL TABLE ENDS
		  EXACTLY AND THE END OF LEGAL MEMORY.
105	11395	HANDLE TYPE WITH MULTIPLE ARGUMENTS.  FORDDT WAS
		BLOWING UP IF FIRST ARG WAS FORMAL ARRAY, BECAUSE
		FORMAL ARRAY FLAG NEVER GOT CLEARED.
106	25207	CHANGE FDTNAR NOT AN ARRAY TO FDTNAA.  THIS AVOIDS
		CONFLICT WITH FDTNAR NOT AFTER REENTER.
107		FIX SYMBOL SEARCH TERMINATION TEST (OFF BY 2).
110	25384	FIX TYPE OF A FORMAL ARRAY IN SMALL PROGRAMS.
111	11839	ACCEPT STMNT EATS FIRST CHARACTER OF INPUT VALUE
112	27201	MAKE USE OF TYPEOUTS AND MODE CONTROL MORE CONSISTANT
113	12316	RESTRICT USE OF DOUBLE PRECISION IN CONDITIONALS
114	-----	CLEAN UP SOME TOPS-20 CODE:  IMPLEMENT NONTRIVIAL DDT
		COMMAND, FIX HALTF WHEN COMND JSYS GIVES AN ERROR
		RETURN, REMOVE SOME REDUNDANT CODE IN LISTEN
115	-----	GET VMDDT ON TOPS-10 WHEN DDT ISN'T LOADED WITH PROG

116	28581	Implement use of logicals (.TRUE. and .FALSE.) in
		PAUSE conditionals.
117	-----	Make error messages upper and lower case /BPK
120	-----	Implement logicals into ACCEPT, MODE and TYPE statements
		using the flag "/L".  "/L" was previously used
		to specify long (ie. two word) ASCII, RASCII and OCTAL
		values in the ACCEPT and MODE commands.  This switch
		has been changed to "/B", mnemonic for "BIG".
121	-----	Fix -20 code to clear bad lines properly.
122	-----	Set .JBDDT when VMDDT is pulled in to prevent overflow
		warnings from FOROTS.
123	-----	Prevent infinite loop on TOPS-20 if .JBHSO is 0 but
		.JBHRL isn't.
124	-----	Fix logical TYPEing so that all positive values are .FALSE.
		and all negative values are .TRUE.
125	-----	Add a new entry point (%FDDT) to be used when returning
		from DDT in place of .F10 (which will still work).
126	-----	Add ?FDT prefix to COMND JSYS error messages.
127	-----	Call FOROTS routine DEC. to interpret real, integer,
		complex, and double precision numbers instead of IN. .
130	-----	Call HELPER to print out FORDDT.HLP when the HELP command
		is issued.
131	-----	Search universal FDDT20 to define TOPS20 instead of
		defining it within FORDDT.
132	29363	Fix various problems that occur when core file is filled
		during GROUP and TYPE commands.
133	29261	Fix up error handling when reading program name.
		Use command JSYS when reading program name on -20.
134	-----	PAUSE sometimes hangs if a line terminator is typed in an
		inappropriate place.  Fix it.
135	-----	When looking up symbol in symbol table, make sure we
		compare the whole symbol and not just the right half-word
136	-----	PAUSE command doesn't allow comments in all places.
		fix it.

***** Begin Version 6 ***** 9-Jun-80

137	-----   Add G-floating capability for input/output. Use of G-floating
		is determined at initialization time by the presence
		of the symbol "..GFL.". If ..GFL. is missing, default
		to D-floating. If ..GFL. is present, use G-floating.

140	-----	Fix COMND trailing space problem. On the -20, the COMND JSYS
		is used to parse the first keyword. COMND supplies an extra
		space which makes FORDDT think that there are arguments
		following the keyword. This bug fix edits the COMND text buffer
		before doing a RSCAN JSYS and passing it to FORDDT's parsing
		code. It appropiately skips over comments. /DCC 3-July-80

141	----	Fix G-floating bug. Symbol ..GFL. was changed to a deleted
		output global symbol, breaking FORDDT's symbol lookup routine.
		One line patch at: EVAL1. Replace existing line with
		MOVSI R,GLOBAL!DELO      /DCC 5-August-80

142	-----	Use the new FOROTS routine to get high-segment symbol table
		pointer.  This is in case the high segment is protected.
		Make sure HELPER gets loaded into the low-seg and that we
		look for it on REL: on TOPS-10.  Fix up	some error messages.
		Relocate univeral searches.

143	-----	Assume that FOROTS and FORLIB are loaded from now on.  So
		remove almost all the SKIPIF macro calls.  This also fixes
		the problem of GHSSYP recursively calling itself.

144	QA5031	Change output format to suppress FOROTS's CR, as FORDDT types
		a CR also.  Also remove FORBUF, which is now unnecessary.

145	-----	Make FORDDT the entry point for FORTRAN users who wish to
		call FORDDT as an error routine.  SFDDT is the new entry
		point for initializing FORDDT (including reseting all files
		opened by FOROTS).  SFDDT replaces the old FORDDT symbol.  
		Replace FORBUF.
		  NOTE: Since FORDDT is now a global symbol, users should be
		careful if they decide to use the label FORDDT as a program,
		subroutine or function name.

146	-----	New calling sequence for FOROP.

147	-----	Fix up help code so that we get FORDDT.HLP ourselves instead
		of using HELPER.  This way FOROTS' data will not get stomped
		on.  Conditionalize out the old code for the time being.
		Redefine AC0 to be accumulator 0 and redefine the memory
		location previously defined as AC0 to be SAVACS. Also,
		remove universal file FDDT20.

150	-----	Change so that all JSYSs consistently end with a percent sign
		(%).  Also clean up the listing a bit (e.g., change PAGE
		pseudo-ops to form-feeds, delete definitions already defined
		in UUOSYM, etc.).

151	16084	FORDDT always flags lowercase on ASCII typeout.  On TOPS20,
		don't do any flagging--the monitor and user commands will do
		it.  On TOPS10, if the terminal is set to uppercase, flag the
		lowercase character; if it is set to lowercase, don't do any
		flagging (default is no flagging).

152    Q20-1675	Prevent FORDDT from getting arithmetic overflows in its
		symbol offset calculation.

153	-----	Report what is assembling (TOPS10 or TOPS20).  Also PURGE
		some symbols which my conflict with users' subroutine names.

154	-----	Move setting .JBREN to before the call to RESET. Use a
		different mechanism for detecting multiple REENTER entries.

*****  Begin Version 7 *****

155	-----	Change START2 to look for global symbol instead of program
		name when finding START address, since there can now be
		character descriptors in front of executable code. (BL)
		Change also in GETPRG.

156	-----	Fix bug in ACCEPT code...when ACCEPTing /ASCII/BIG input
		into a range of double precision array elements, the
		second word of the last element within the range was
		not ACCEPTed, due to RANGE being set to the address of
		the first word of the element. (BL)

157	-----	Lots of code to make FORDDT TYPE and ACCEPT character
		scalars and arrays.

160	-----	Make character scalars work again.

161	-----	Fix problem recognizing character arrays using /DEBUG.

162	-----	Enable type-out of character strings at PAUSEes.
		Also insert check for G-floating arrays in RAYNAM
		F10-array-checking.

163	-----	Insert new address-checking code: allow R/W to low-
		segment, R only from High-segment.
		Array range checking now done only if array pointer
		is in symbol table (if compiled /DEBUG).
		Inserted <widgets> around (most) error messages.

164	-----	Fix bug in multiple type-out modes.

165	CDM	1-Sept-82
	Change
	TRNE	T5,1B13
	to
	TRNE	T5,(1B13)
	to make it assemble without warnings.

166	BL	3-NOV-82
	Eliminate check of indirect bit in CKBPTR...it was failing legal
	byte pointers

167	BL	3-Nov-82
	Insert code to simulate V6 EDIT 155...we were getting array type-out
	failures on formal arrays

170	BL	17-Nov-82
	Change a TLNE to a TRNE in OFFSET, so we test the correct output mode
	options.
	Change test of return instruction in START4 so that it tests the
	instruction, not the address of its storage location. This was
	causing a subroutine which had been entered via a NEXT to be repeated
	if a GOTO was then performed.

171	BL	18-Nov-82
	Merge in V6 EDIT 165...fix problems with TYPE of variables in
	COMMON.

172	BL	2-Dec-82
	Reinstate the check of the indirect bi in CKBPTR...but do it right!!! 

173	BL	12-13-82
	Move swapping of local and default type-out modes in DISP10 so that
	OFFSET is called with the right option. (was causing inaccurate
	subscripts).

	174	BL	7-Jan-83
	Move %FDDT (reentry from DDT) so that user-modes are not reset.

175	BL	11-Jan-83
	typo at DISP10+4.


176	BL 13-Jan-83
	Revise EDIT 174 so that %fddt still performs everything except the
	resetting of modes.

		 ***** End V7 Development *****

;.BEGINR 	***** Begin V7 Maintenance *****
;.COMPONENT FORDDT
;.VERSION 7
;.AUTOPATCH 7
;.EDIT	177	ALLOW " = " CONSTRUCTS IN ACCEPT,IMPLEMENT ERR= DECODE CALLS
;;	Since "ACCEPT A=3" is allowed (although a user error), also allow
;;	"ACCEPT A = 3" style constructs.  Push a 'STOP!!' billboard on FORDDT's
;;	stack so FORERR's PC finder will not loop.  Install an ERR= argument
;;	for calls to DECODE so truly illegal arguments passed to FOROTS will
;;	not abort debugging.
;		TGS,09-APR-83,SPR:20-19167
;		A:SRC FORDDT.MAC
;.EDIT	200	ACCEPT NAME/MODE<CR> HANGS
;;	ACCEPT Name/Mode<CR> hangs waiting for another CRLF.  Treat this and
;;	other cases where ACCEPT command lines terminate without any value
;;	supplied by the user as cases of bad syntax.
;		TGS,14-JUN-83,SPR:NONE
;		A:SRC FORDDT.MAC
;.EDIT	201	PROBLEM TYPING VARIABLE NAME WHEN SAME AS PROGRAM NAME
;;	If the PROGRAM name is the same as a variable name, then TYPEing
;;	the variable name yields "MAIN PROGRAM(1) = " etc. 
;		TGS,22-JUL-83,SPR:10-34002
;		A:SRC FORDDT.MAC
;.EDIT	202	1+NTH ARRAY NAME TYPED OUT AS "PAT..(n)"
;;	Typing an array on TOPS10 will garble the 2nd through nth array
;;	element name, typing it as PAT..
;		TGS,28-JUL-83,SPR:10-34001
;		A:SRC FORDDT.MAC
;.EDIT	203	PROBLEMS AFTER PAUSING AT MAIN.
;;	Setting a breakpoint at MAIN. will cause an ?Ill mem ref on
;;	TOPS10 as soon as the program is STARTed. On TOPS20 a private
;;	page may be created; in addition, a subsequent STRACE after
;;	the START will loop, finally getting an ?Ill instruction.
;		TGS,29-JUL-83,SPR:NONE
;		A:SRC FORDDT.MAC
;.EDIT	204	GARBLED ENTRY NAME ON TOPS20 CALL TO FORDDT
;;	On TOPS20, having found a valid offset during a low-seg symbol
;;	table search, do not then search the hiseg symbol table as well.
;		TGS,1-AUG-83,SPR:NONE
;		A:SRC FORDDT.MAC
;;.ENDA		7-SEP-83
;.EDIT	205	ACCEPT/S ECHO TYPEOUT ALWAYS IN FLOATING POINT
;;	ACCEPT/S <var> will always echo in floating point format, regardless
;;	of the current MODE setting.
;		TGS,19-SEP-83,SPR:10-34142
;		A:SRC FORDDT.MAC
;;.ENDA		3-OCT-83
;;.ENDA		31-OCT-83
;;.EDIT	206	RESERVED FOR AUTOPATCH
;.ENDA
;.AUTOPATCH 8
;;.ENDA		27-DEC-83
;;.ENDA		20-JAN-84
;;.ENDA		16-FEB-84
;.EDIT	207	NOOP EDIT TO UPDATE OUR VERSION 
;;	Update the edit number and thereby teach Autopatch to update it
;;	also. No code changes.
;		TGS,24-FEB-84,SPR:NONE
;		A:SRC FORDDT.MAC
;;.ENDA		23-MAR-84
;;.ENDA		26-APR-84
;.ENDA
;.AUTOPATCH 9
;;.ENDA		18-MAY-84
;.EDIT	210	FIX COMPLEX ARRAY TYPE OUT
;;	Recognize a complex array as a double word array.
;		MRB,5-JUN-84,SPR:20-20178
;		A:SRC FORDDT.MAC
;.EDIT	211	WARN IF WE CAN'T HACK IWI ERRORS FROM FOROTS
;;	FORDDT can't do anything useful if the user has set a breakpoint
;;	in an IOLST function call, since any TYPE or ACCEPT command will
;;	call FOROTS, thus getting an "I/O within I/O" (IWI) error.  Check
;;	at breakpoint processing by calling FO$UDB FOROP and warn if this
;;	breakpoint is "restricted".  Type an error if the user tries to
;;	ACCEPT or TYPE under IWI conditions.
;;	NOTE: This edit must not be installed unless FOROTS Edit 3432 has
;;	been installed.
;		TGS,7-JUN-84,SPR:20-20133
;		A:SRC FORDDT.MAC
;.EDIT	212	MONSYM "ENDSTR" CONFLICT
;;	Change label ENDSTR, as it may conflict with future releases of
;;	MONSYM and give a compilation error.
;		TGS,22-JUN-84,SPR:NONE
;		A:SRC FORDDT.MAC
;;.EDIT	213	RESERVED FOR AUTOPATCH
;;.EDIT	214	RESERVED FOR AUTOPATCH
;;.ENDA		22-JUN-84
;.EDIT	215	HACK AN OFFSET WHEN NEXTING WITHOUT LOCAL SYMBOLS
;;	If a program or program unit has been loaded /NOLOCALS, and
;;	the user tries to NEXT from a global pause, don't give up
;;	with FDTIER #7 when trying to print the label or source line.
;;	Use the offset returned by LOOK instead.
;		TGS,28-JUN-84,SPR:10-34742
;		A:SRC FORDDT.MAC
;;.EDIT	216	RESERVED FOR AUTOPATCH
;;.ENDA		19-JUL-84
;.EDIT	217	TYPE CHAR(VAR)/C TYPES VAR(1)...
;;	Each time SYMIN reads a variable it stores the symbol pointer in
;;	CRYSYM for special character array typeout.  Since CHAR(VAR) forms
;;	of variables will cause routine EITHER to call SYM2 recursively,
;;	CRYSYM will be left pointing to the subscript instead of the array
;;	name, causing OFFSET to type the wrong name.
;		TGS,2-AUG-84,SPR:10-34776
;		A:SRC FORDDT.MAC
;;.EDIT	220	RESERVED FOR AUTOPATCH
;;.ENDA		16-AUG-84
;;.ENDA		20-SEP-84
;.ENDA
;.AUTOPATCH 10
;.EDIT	221	NOOP EDIT TO UPDATE OUR VERSION 
;;	Update the edit number and thereby teach Autopatch to update it
;;	also. No code changes.
;		MRB,19-OCT-84,SPR:NONE
;		A:SRC FORDDT.MAC
;;.ENDA		19-OCT-84
;.EDIT	222	ACCEPT VAR/C MAY NOT DISPLAY NEW VALUE
;;	If the ACCEPTed string exactly fills the variable, the ACCEPT
;;	command does not display the new value.
;		TGS,27-NOV-84,SPR:10-34962
;		A:SRC FORDDT.MAC
;.EDIT	223	TYPING FORMAL ARRAY PARAMETERS LACK SUBSCRIPT
;;	A request to TYPE a formal array will type all subscripts
;;	except the first; a one-shot TYPE request (e.g. TYPE ARRAY(2))
;;	will thus not show which subscript is being typed.
;		TGS,7-DEC-84,SPR:10-34961
;		A:SRC FORDDT.MAC
;;.EDIT	224	RESERVED FOR AUTOPATCH
;;.ENDA		26-DEC-84
;;.ENDA		16-JAN-85
;.ENDA
;.ENDV
;.ENDR 		 ***** End V7 Maintenance *****

		***** Begin V10 Development *****

300	EXTENDED ADDRESSING DEVELOPMENT
	Many changes:
		Modify breakpoint table layout and handling.
		Address arithmetic changes.
		Extended FOROTS calls.
		Misc cleanup.
		BCM,18-JUN-84

301	ARRAY DEFINITION TABLE HAS GLOBAL INDICES
	The DIMTAB table is expanded to have three-word entries,
	  and all entries contain global indices.
	The definition of the entries have symbolic names.
	References to the entries are changed from half-word
	  to full-word.
	Miscellaneous cleanup.
	AlB,26-Jun-84

302	HELP COMMAND REQUIRES ONE-WORD GLOBAL BYTE POINTER
	The HELP command requests the allocation of core memory from
	the FOROTS ALCOR. routine.  That routine returns a global
	address, and thus the FORDDT HELP command must turn it into
	a OWGBP in order to get at the assigned buffer (which could be
	in another section under extended addressing).
	AlB,27-Jun-84

303	More development fixes
		Indirect reference in START4 no good in non-zero.
		Bug introduced by edit 170 that showed up in non-zero section.
		Address test failed with extra section number in WT15.
		Dummy the PC using current section number in STEP4.
		Fixed up address arithmetic in AUTOP.
		Push an AC instead of hiding on stack in FP7.
		BCM,28-Jun-84

304	RECOGNIZE GLOBAL SYMBOLS FOR LOCATE
		Fix an indirect reference in QLIST6.
		BCM,29-Jun-84

305	VERIFY THE CORRECT ADDRESS FOR BYTE POINTERS
	A call to CKWRIT was using the updated byte pointer
	after a ADJBP.  Changed to use original address for
	checking page access.
		BCM,9-Jul-84

306	CHECKING LH FLAGS FOR RH VALUE
	Old bug that showed up using flag DOUBLE.
		BCM,9-Jul-84

307	ADDITIONAL WORK FOR EDIT 301
	Needed to correct logic in DISP14 for DOUBLE arrays.
		AlB/BCM,9-Jul-84

310	TOPS-10 ADDITIONAL WORK
	Fix up EFIW,IFIW definitions for -10.
	Fix XJRSTF in RESTOR to have only RH of PC and not get flags.
		BCM,17-Jul-84

311	CANNOT PAUS/GOTO/START AT SOME LOCATIONS
	Insufficient check for FORMAT statement disallowed some legal
	breakpoints.  Fix to check second ascii character for being
	a control character, and if so, assume its NOT a FORMAT statement.
		BCM,17-Jul-84

312	Fix ERR branch & Page access bug in CKWREX.
		BCM,25-Jul-84

313	Development edit. Make extended code work with FORDDT. See spec
	for details.
		BCM,16-Aug-84

314	Get rid of all references to NEARST.
	Clean up the LOOK routine.
		AlB,23-Aug-84

315	Change the search of the symbol table which looks for the name of
	the main program.  Instead of looking for a program name of 'MAIN.',
	use the program which contains the global value 'MAIN.'.
		AlB,24-Aug-84

316	Change the START mechanism such that the main program could be
	in a section other than the one in which FORDDT is loaded.
		AlB,24-Aug-84

317	Add a three-word entry vector for Tops-20.
	The use of .JBREN is retained for Tops-10.
		AlB,24-Aug-84

320	Prepare for the handling of symbol tables which exist in a section
	other than the one in which FORDDT is loaded.

	o Add a temporary 'build a symbol vector' routine. This routine
	will be removed when a FOROP. call is added to do the same thing.
	o Change the SETLST and FIXSYR routines to allow for global indices
	into the symbol tables.
	o Remove SETLXS, which is no longer needed.
	o Modify GHSSYP to take error exit if we are in a non-zero section.
	o Modify OVRLAY so as to call SETLST whenever it detects that
	.JBSYM has changed.
		AlB,27-Aug-84

321	Change the symbol searches to use global addresses.
	Essentially, instead of using the JOBDAT IOWD-style symbol table
	addresses, we use two words: one is a global address into a
	symbol table, and the other is the number of unsearched words.
	This change enables the symbol tables to be anywhere in memory.

	Also made several miscellaneous changes to reflect the fact that
	we may be in a section other than the one in which the symbol
	tables reside.

	Also fixed some problems with array indices being larger than a
	half-word, and with array sizes larger than a half-word.

	Also made some changes just because I couldn't stand to look at
	some rottenly constructed code ONE MORE TIME!!
		AlB,29-Aug-84

322	Fix ACCEPT of character data.  When exactly enough characters were
	entered for the field, the field was not being displayed in
	confirmation.

	Fix TYPE of a range of character array elements.  Prior to this fix,
	only the last element was being TYPEd.
		AlB,30-Aug-84

323	Fix BLDVEC to get the correct section number for symbols.

	Re-do the handling of optional command switches.  It was rather
	confusing as written.  Now register P3 contains the default settings
	in the left half, and the currently active settings in the right half.
		AlB,4-Sep-84

324	Fix CONTINUE. LEAV2 was returning to user program via an indirect jump
	jump through a bogus location.
		AlB,7-Sep-84

325	Add PAUSE ON ERROR command.
		MEM,6-Sep-84

326	Remove references to FGLSNM, which was a flag to tell LOOK (a symbol
	table lookup) that global symbols are Ok.  Since that flag was being
	turned off by CPOPJ1 and CPOPJ2, we sometime could not find a global
	symbol.  Since global symbols are always Ok, we don't need that flag.

	Also changed all references to (erroneous) edit number 2460 and
	replaced them with 325. Put edit number on all places that were
	touched by 325 aka 2460. Fixed bugs in AC save and restore caused
	by edit 325.
		AlB,25-Sep-84

327	Use the routine in FORLIB which determines the location of the
	symbol table.  In this way, we are assured that FOROTS/FORLIB and
	FORDDT are using the same symbol table.
		AlB,25-Sep-84

330	Use the default MODEs when confirming the value ACCEPTed with
	modifier /S.
		AlB,27-Sep-84

331	Instead of typing message "Pause on error", JRST FORDDT
 	which will print message "Entering Forddt at..." and then do a
	breakpoint 0.
		MEM,2-Oct-84

332	Modify pause on error code according to comments made during its
	inspection. Make REMOVE remove pause on error and make WHAT
	display pause on error if it is set.
		MEM,9-Oct-84

333	Fixup problems with edit 321.
		BCM,5-Nov-84

334	Change message, when reentering FORDDT from ^C and running extended,
	from garbage address to "from FORDDT".
		MEM,27-Dec-84

335	Add a TOPS-20 conditional left out of edit 334
		JLC,27-Feb-85

		 ***** End V10 Development *****

;.VERSION 10
;.AUTOPATCH 11
;.EDIT	336	NOOP EDIT TO UPDATE OUR VERSION NUMBER
;;		No code changes. (See edit 221).
;		MRB,9-MAY-85,SPR:NONE
;		A:SRC FORDDT.MAC
;;.ENDA		9-MAY-85
;;.EDIT	337	RESERVED FOR AUTOPATCH
;;.ENDA		24-JUN-85
;;.EDIT	340	FORDDT CRUSHES USER ACS
;;		SAVACS was being used as scratch in PAUSE, START, and RESET
;		PLB,2-JUL-85,SPR:20-20789
;		A:SRC FORDDT.MAC
;;.ENDA
;.ENDA
;.ENDV
;.ENDR REVISION HISTORY

		***** Begin V11 Development *****

400	Become Version 11.
		MRB, 28-Mar-85

401	Add substring support in ACCEPT and TYPE statements.
		MEM, 19-Dec-85

402	Add long symbol support. For each FORDDT memory location that stores
	a symbol we also have a flag word that is zero if the symbol is short.
	When we have a symbol in a register then the LNAME bit of the left
	half is lit when the symbol is long.
		MEM, 17-Feb-86

403	Correct various error messages and an extended addressing problem.
		MEM/MRB, 1-Jun-86

404	CDM	10-Jul-86
	Call ERRSET when doing PAUSE ON ERROR, so that the user will
	get error/warning messages when his program pauses!

405	MEM	26-Sep-86
	In LSPT, check if global address before making OWGBP since KS
	can't handle them.

		 ***** End V11 Development *****
		 ***** End Revision History *****

ENDV11
\;END OF COMMENT
SUBTTL	DEFINITIONS	


;DEFINE ACCUMULATORS

ENTRY FORDDT,FDDT.,.F10,%FDDT
EXTERN .JBREL,.JBHRL,.JBSYM,.JBSA,.JBOPC,.JBDA	;[321]
EXTERN ERRSET			;[404] Set number of ots warnings to receive

IFN EXTHLP,<EXTERN .HELPR>	;[147] for external HELPER


;AC0=<F=0>			;[147] FLAGS
;AC1=<TF=1>			;[147] TEMPORARY FLAGS, RESET ON RETURN TO RET:
;AC2=<R=<T1=<A=2>>>		;[147] POINTERS TO TABLES, CORE, ETC.
;AC3=<S=<T2=<B=3>>>		;[147]
;AC4=<W=<T3=<C=4>>>		;[147] CONTAINS DISPATCH ADDR IN WORD ASSEMBLER
;AC5=<T=<T4=5>>			;[147] TRANSFER DATA
;W1=<T5=6>
;W2=<T6=7>
;TMOD=10				;TYPE MODE FLAGS
;AR=11
;ODF=12				;RADIX DEFINITION
;TT=<P3=13>			;TEMPORARY
;TT1=<P4=14>			;TEMPORARY
;RAY.==15			;POINTS TO NEXT F10 DEFINE ARRAY DIMENSION
;L=16				;[147] POINTER TO ARGUMENT LIST
;P=17				;PUSH DOWN


	T0==0			;FLAGS
	T1==1			;TEMPORARY FLAGS, RESET ON RETURN TO RET:.
	T2==2			;POINTERS TO TABLES, CORE, ETC
	T3==3
	T4==4			;CONTAINS DISPATCH ADDR IN WORD ASSEMBLER
	T5==5			;TRANSFER DATA
	P1==6
	P2==7
	P3==10			;[323] Mode flags (default,,active)
	P4==11
	S1==12			;RADIX DEFINITION
	S2==13			;TEMPORARY
	S3==14			;TEMPORARY
	S4==15			;POINTS TO NEXT F10 DEFINE ARRAY DIMENSION
	L==16			;POINTER TO ARGUMENT LIST
	P==17			;STACK

;DEFINE SYMBOL TABLE SYMBOL TYPES

; The SECONDARY SYMBOL TABLE which starts at the local symbol .SYMTB in each
; module has its start address stored into SSTAB in FORDDT by the code to OPEN
; the current module. This table starts with a count of the number of entries
; in the right half and the left half is zero if the secondary symbol table 
; contains only globals. The first entry in the symbol table (at .SYMTB+1)
; is for the module name. Each entry in the table is two words long. The first
; word has a 3 bit flag field, a 3 bit count of the number of words in the
; symbol name, and a 30 bit address to where the symbol name is stored. The
; second word is the address of the location where the value of the symbol is
; stored.
;
;          +-------------------------------------------------+
; .SYMTB:  |  symtb flag            |         entry count    |
;          +-------+------------+---+------------------------+
;          | flags | word count |           ptr to symbol    | First entry is
;          +-------+------------+----------------------------+ module name
;          |                    address of value of symbol   |
;          +-------+------------+---+------------------------+
;          |                                                 |
;          |                   ...                           |
;          +-------+------------+---+------------------------+
;          | flags | word count |           ptr to symbol    |
;          +-------+------------+----------------------------+
;          |                    address of value of symbol   |
;          +-------+------------+----------------------------+
;
;
;
;


CNTSFT==^D30		;[402] SHIFT TO GET CNT FROM CNT+PTR FOR LONG NAME
LGLOBL==200000		;[402] GLOBAL in secondary symbol table
LPNAME==600000		;[402] program name in secondary symbol table
LFLG==  700000		;[402] flag field in secondary symbol table entries
			

; In LINK's symbol table entries are also 2 words long. The first word contains
; a four bit flag field followed by the radix 50 name. The second word in the 
; address of the symbol value.

;          +-------+------------+----------------------------+
;          | flags |         radix 50 symbol name            |
;          +-------+------------+----------------------------+
;          |                    address of value of symbol   |
;          +-------+------------+----------------------------+
;          |                                                 |
;          |                  ...                            |
;          +-------+------------+----------------------------+
;          | flags |         radix 50 symbol name            |
;          +-------+------------+----------------------------+
;          |                    address of value of symbol   |
;          +-------+------------+----------------------------+

GLOBAL==040000		;GLOBAL SYMBOL
LOCAL==100000		;in ddt and secondary symbol table
PNAME==740000		;PROGRAM NAME
DELI==200000		;DELETE INPUT
DELO==400000		;DELETE OUTPUT


;[137] SYMBOLS REPRESENTING FOROTS ARG TYPES

TP%DPR==10		;[137] D-floating double precision
TP%DPX==13		;[137] G-floating double precision
TP%CPX==14		;[210] Complex
TP%CHR==15		;[157]  Character
FO$HSP==4		;[142] FOR RETURNING HISEG SYBOL TABLE PTR.
FO$GBA==20		;[332] GET BREAK ADDRESS
FO$UDB==23		;[211] FOR RETURNING CONTENTS OF %UDBAD
;	DEFINE SYSTEM PARAMETERS

IFNDEF SYMSPC,<SYMSPC==2>	;[402] 1 word for ptr to symbol
                                ;[402] plus 1 word for flag word

IFNDEF NBP,<NBP==^D10>		;NUMBER OF PUASE REQUESTS

IFNDEF GPMAX,<GPMAX==10>	;NUMBER OF GROUP STRINGS (MAX 35 )

IFNDEF PDSIZ,<PDSIZ==10>	;[327] DEFINE PDL SIZE FOR INITIAL STACK
IFG PDSIZ-100,<PDSIZ==100>	;LIMIT SIZE TO ^D64

IFNDEF CFSIZ,<CFSIZ==^D15>	;CORE FILE LENGTH



IFNDEF DIMSIZ,<DIMSIZ==^D50>	;AMOUNT OF SPACE FOR DIMENSION DEFINITIONS




IFNDEF DEBUG,<DEBUG==0>		;KEEP OFF - DEVELOPMENT ONLY - UNSUPORTED
				IFN DEBUG<  IF1<
	PRINTX	FORDDT - DEVELOPMENT VERSION
					>	>

COMMENT \

NBP	DEFINE THE MAXIMUM NUMBER OF PAUSE REQUESTS ALLOWED
	EACH PAUSE INCREASES CORE REQUIREMENTS BY DECIMAL 10

GPMAX	DEFINE THE MAXIMUM NUMBER OF GROUPS
	EACH GROUP SETTING REQUIRES AN EXTRA DECIMAL 23 LOCATIONS

PDSIZ	DEFINE THE SIZE OF THE PUSH DOWN STACK
	ALLOW SUFFICIENT STACK FOR ALL GROUPS TOGETHER
	LIMITS PDSIZE TO ^D64

CFSIZ	DEFINE THE SIZE OF EACH CORE FILE

DIMSIZ	DEFINE THE NUMBER OF ENTRIES
	USED TO HOLD ARRAY DIMENSION DATA

ESEFIW	location of table of EFIW of JSR's under /EXTEND

SZEFIW	Table of the EFIW's referenced by the JSR instruction.
	Word 0 points to BP1, word 1 points to BP2, etc.  In non-zero
	sections, this table will be copied to the address given by ESEFIW.

ESDIEB	Location of dispatch instruction execute block under /EXTEND

SZDIEB	Table of displaced instruction blocks.  In non-zero sections,
	this table will be copied to the address given by ESDIEB.

\

ESEFIW==.JBDA+1		;[313] location of EFIW table
ESDIEB==ESEFIW+NBP	;[313] location of displaced instruction block table
;FLAG F DEFINITIONS,  LEFT HALF:

EOL==   400000	;END OF USER LINE
FPF==   200000	;PERIOD TYPED FLAG
FEF==   100000	;EXPONENT FLAG

MF==    040000	;MINUS FLAG
SIGN==  020000	;PLUS OR MINUS TYPED
CFLIU== 010000	;CORE FILE IN USE FLAG

OFCFL== 004000	;OUTPUT FROM CORE FILE REQUESTED
CONS==  002000	;CONSTANT SEEN FLAG
GRPFL== 001000	;GROUP FLAG - ALLOWS GROUP LOGIC

AUTO==  000400	;AUTO PROCEDE FLAG
OCTF==  000200	;OCTAL NUMBER TYPED FLAG
;FGLSNM==000100	;[326] ALLOW GLOBAL SYMBOL NAMES (FOR LOOK AND FINDSYM)

LABEL== 000040	;INDICATES STATEMENT LABEL BEING PROCESSED
LFTSQB==000020	;FLAG THAT A [ IS SEEN - SO A ] WILL END THE SPECIFICATION
BAR==   000010	;FLAG THAT WE HAVE SEEN A / IN DIMENSION ANALYSIS

DIMEND==000004	; ) OR ] FOUND I.E. END OF DIMENSION SPEC IMINENT
;[321] FPRNM== 000002	; FIND PROGRAM NAME (FOR FNDSYM)
;[321] FLCLNM==000001	; FIND LOCAL IN CURRENT OPEN PROGRAM (FOR SYMBOL SEARCH)



;RIGHT HALF

POWF==  400000	;POWER FLAG # TO FOLLOW
DOUBLE==200000	;FLAG FOR DOUBLE WORD ARRAY DATA
BASENM==100000	;AN ARRAY BASE NAME HAS BEEN ACCEPTED

TRLABL==040000	;TRACING LABEL ONLY FLAG
;[157]PNAMEF==020000	;PROGRAM NAME SEEN IN SYBOL TABLE SEARCH
CHARS== 020000	;[157]Character array
MDLCLF==010000	;USED BY SYMBOL SEARCHES - MULTIPLY DEFINED LOCAL SYBOL

ID==    004000	;SYMBOL IDENTIFIED FLAG
IDINOS==002000	;SYMBOL IDENTIFIED IN OPEN SECTION
SILENT==001000	;DO NOT TYPE SYMBOL IF FOUND IN 'LOOK'UP

SUBFLG==000400	;SUBSCRIPT FLAG - CHECK SUBSCRIPTS IF ON
FLSHAL==000200	;FLUSH ALL ARRAY NAMES FROM BASRAY ONWARDS
IDPNAM==000100	;IF SET CAUSES 'LOOK' TO REMEMBER SECTION NAME

;[314] NEARST==000040	;IF SET CAUSES 'LOOK' TO RETURN THE NEXT LARGER SYMBOL
F10RAY==000020	;CURRENT ARRAY IS F10 DEFINED
TRLINE==000010	;TRACE AT LINES LEVEL

FORMAL==000004	;HANDLING ARRAY AS SUBROUTINE FORMAL PARAMETER
GFLOAT==000002	;[137] If set, G-floating is in use; else D-floating.
SURGFL= 000001	;ACCEPT  / AND : AS DIMENSION RANGE DELIMETERS
;	*** FLAG T1 ***
;
;	T1 TEMPORARY FLAG DEFINITIONS:
;	CLEARED ON EVERY RETURN TO USER (RET:)
;
;	RIGHT HALF

DCOPFG==000001	;DON'T CHANGE OPEN PROGRAM FOR GROUP
ALPHA== 000002	;PERSUADES ROUTINE EITHER TO RETURN SIXBIT ON NON # INPUT
ACCPT== 000004	;SIGNALS AN ACCEPT IN PROGRESS
ADELIM==000010	;FLAG THAT WE HAVE HAD AN ASCII TEXT DELIMITER
IMPRNG==000020	;REQUEST FOR IMPLIED RANGE
ARRAY.==000040	;AN ARRAY HAS BEEN DETECTED DURING ACCEPT LOGIC
		; ALSO DURING TYPE OFFSET PROCESS
GUDLBL==000100	;A GOOD NUMERIC LABEL FOUND IGNORING LAST CHARACTER
FGLONL==000200	;FIND GLOBAL SYMBOL ONLY
SYMLAB==000400	;SYMBOL IS A LABEL
DCEVAL==001000	;DON'T CALL EVAL ( FROM SYMIN )
COMDEL==002000	;COMMENT PROCESS IN PROGRESS
LGCLEG==004000	;[116] LOGICALS ARE LEGAL WHEN FLAG IS ON
ISLOGI==010000	;[116] WE ARE DEALING WITH A LOGICAL CONSTANT
TYPCMD==020000	;[171] Processing TYPE
COMDAT==040000	;[171] COMMON data
LNAME==	100000	;[402] WE HAVE A LONG SYMBOL NAME IN A REGISTER


;	*** FLAG P3 ***
;
;	DEFINE THE PRINT OPTION FLAGS USED IN LEFT & RIGHT OF P3
;[323]	LEFT HAND - DEFAULT USER SETTING
;[323]	RIGHT HAND  - LOCAL TEMPORARY SETTING (TAKES PRIORITY)

F.==000001	;TYPE FLOATING POINT FORMAT
I.==000002	;TYPE INTEGER FORMAT
O.==000004	;TYPE OCTAL FORMAT
A.==000010	;TYPE ASCII FOMAT
D.==000020	;TYPE DOUBLE PRECISION FORMAT
R.==000040	;TYPE RIGHT JUSTIFIED ASCII
X.==000100	;[157]TYPE COMPLEX FORM
B.==000200	;[120] 'BIG' OPTION REQUESTED
L.==002000	;[120] LOGICAL FORMAT (.TRUE. AND .FALSE.) OR TRACE LABELS
C.==004000	;[157] Character string

S.==000400	;TRACE SOURCE LINES
E.==001000	;TRACE ENTRIES

ANYMOD==400000	;USED BY OPTION TO SHOW LEGAL MODIFIER SEEN



;
;	********** FLAGS FOR LEFT HALF OF COND0 **********

LFTLOG==000001	;[116] LEFT CONSTANT IN CONDITIONAL WAS LOGICAL
RHTLOG==000002	;[116] RIGHT CONSTANT IN CONDITIONAL IS LOGICAL

;FLAG T0 - "STICKY FLAGS"

STIKYS==TRLABL!TRLINE!GFLOAT		;[137] Add "GFLOAT" to mask to be
					;[137]  "and"ed with STKYFL at RET:
;	USEFUL OPDEFS

	OPDEF	PJRST	[JRST]		;PUSHJ/=POPJ





;	POSSIBLE ERROR MESSAGES OF THE FORM ? E#
;	THE ASSOCIATED ERROR MESSAGE IS:
;	  ?FDTIER Internal FORDDT error - (number)
;
;	? E1	CANNOT FIND SYMBOLIC NAME FOR THE PAUSE IN A 'WHAT'
;	? E2	CANNOT FIND SYMBOLIC NAME FOR THIS PAUSE(BREAK)
;	? E3	CANNOT FIND SYMBOLIC NAME FOR AN ARGUMENT OF THE
;		ROUTINE ABOUT TO BE ENTERED
;	? E4	BAD LABEL FOUND WHERE SOURCE LINE OR STATEMENT LABEL EXPECTED
;	? E5	CANNOT FIND SYMBOL IN DIMENSION LOGIC
;	? E6	CANNOT FIND SYSMBOL MATCH IN A RE-ENTER
;	? E7	CANNOT FIND SYMBOL IN A TRACE INTERUPT
;	? E8	CANNOT FIND END OF F10 FORMAT STATEMENT = LABEL+F


;	THESE ERRORS SHOULD NEVER OCCUR - BUT COULD INDICATE THAT
;	THE SYMBOL TABLE HAD BEEN MODIFIED(OVERLAYED?) OR SOMETHING
SUBTTL	MACRO'S	

	;[325] Removed SETPDL

; Each FORDDT symbol is stored as follows:
; The first word may either contain a radix50 name or it may contain a 6 bit 
; word count for the length of the symbol followed by a 30 bit address of the 
; symbol (which is actually .+2). The symbol is long if the LNAME bit in the
; left half of the flag word is set.
;
;       +------------------------+
;       | wordcount| ptr to name | or radix50 name
;       +------------------------+
;       |      flag name         |
;       +------------------------+
;       |      symbol name       |
;       |          ...           |
;       +------------------------+
;
;
;

	DEFINE	CLRFLG(SYM)
	<SETZM	SYM+1>

	DEFINE	SETFLG(SYM)
	<SETOM	SYM+1>

	DEFINE	GETFLG(REG,SYM)
	<MOVE	REG,SYM+1>

	DEFINE	SYMSKN(SYM)
	<SKIPN	SYM+1>

	DEFINE	SYMSKE(SYM)
	<SKIPE	SYM+1>

	DEFINE	LDFLG(SYM)	
<	TRZ	T1,LNAME	; Clear long symbol flag
	SKIPE	SYM+1		; Is this a long symbol?
	TRO	T1,LNAME	; Yes, so set long symbol flag
>

	DEFINE	LDSYM(REG,SYM)	
<	MOVE	REG,SYM		; Load long symbol into register
	TRZ	T1,LNAME	; Clear long symbol flag
	SKIPE	SYM+1		; Is this a long symbol?
	TRO	T1,LNAME	; Yes, so set long symbol flag
>

	DEFINE	STSYM(REG,SYM)  
<	MOVEM	REG,SYM		; Store symbol into memory
	SETZM	SYM+1		; Assume symbol was short
	TRNE	T1,LNAME	; Was symbol long?
	 SETOM	SYM+1		; Yes, so set long symbol flag
>

	DEFINE	MOVSYM(SYM1,REG,SYM2)  
<	MOVE	REG,SYM1+1	;Copy flag word
	MOVEM	REG,SYM2+1
	MOVE	REG,SYM1	;Copy symbol
	MOVEM	REG,SYM2
>

	DEFINE	QUERY
<	TYPE	(? )	>

ife tops20,<
	DEFINE	TYPE(X)
<	OUTSTR	[ASCIZ/X/]	>

	DEFINE	LINE
<	OUTSTR	CRLF	>

	define	atype(x)
<	outstr x	>

	define	stype(x)
<	outstr [asciz x]>

	define	tab
<	outstr	[byte(7)11,0]	>

	define	openp
<	outstr	[byte(7)"(",0]	>

	define	closep
<	outstr	[byte(7)")",0]	>

	define	openb
<	outstr	[byte(7)74,0]	>

	define	closeb
<	outstr	[byte(7)76,0]	>

	define	putchr(x)
<	outchr x>
>				;end of conditional
ifn tops20,<
	define	type(x)
<	push	p,T1
	hrroi	T1,[asciz/x/]
	psout%
	pop	p,T1	>

	define	atype(x)
<	push	p,T1
	hrroi	T1,x
	psout%
	pop	p,T1	>

	define	stype(x)
<	push	p,T1
	hrroi	T1,[asciz x]
	psout%
	pop	p,T1	>

	define	line
<	push	p,T1
	hrroi	T1,[byte(7)15,12,0]
	psout%
	pop	p,T1	>

	define	openp
<	push	p,T1
	hrrzi	T1,"("
	pbout%
	pop	p,T1	>

	define	closep
<	push	p,T1
	hrrzi	T1,")"
	pbout%
	pop	p,T1	>

	define	openb
<	push	p,T1
	hrrzi	T1,74
	pbout%
	pop	p,T1	>

	define	closeb
<	push	p,T1
	hrrzi	T1,76
	pbout%
	pop	p,T1	>

	define	tab
<	push	p,T1
	hrrzi	T1,11
	pbout%
	pop	p,T1	>

	define	putchr(x)
<	push	p,T1
	move	T1,x
	pbout%
	pop	p,T1	>
>				;end of conditional





	DEFINE SKIPIF(STRING)		;IS STRING LOADED? - SKIP IF IT IS
<	MOVE	T5,[SQUOZE 0,STRING]	;GET RAD50 FORM OF 'STRING'
	PUSHJ	P,FINDST		;SEE IF STRING IS LOADED>



	DEFINE PROGIF(NAME)		;IS NAME LOADED?  SKIP IF SO
<	MOVE	T5,[SQUOZE 0,NAME]
	MOVEM	T5,SYM
	PUSHJ	P,FINDP	>		;[321]
;	RECURSION MACRO'S
;
;	MACRO -RECURS- TO SAVE RELEVANT INFORMATION TO
;	ALLOW RECURSION
;	CALL SRUCER TO RESTORE



	DEFINE RECURS(X)
<	XLIST
	IRP(X)<	PUSH	P,X>
	DEFINE SRUCER<NAMLST <X>	>
	LIST	>



	DEFINE NAMLST(X)
<	..A=100
	IRP(X)<DO(\..A,X)>
	..A=..A-1
	IRP(X)<UNDO(\..A)>
	PURGE	..A	>



	DEFINE DO(I,J)
<	..K'I=J
	..A=..A+1	>



	DEFINE UNDO(I)
<	XLIST
	POP	P,..K'I
	..A=..A-1
	PURGE	..K'I
	LIST	>



	DEFINE	JUSTIFY		;JUSTIFY THE OUTPUT & RESET T5
<	PUSHJ	P,JUSTFY	;DO TYPE COMMAND OUTPUT JUSTIFICATION>



	SALL			;SUPPRESS ALL MACRO EXPANSIONS
	DEFINE NAMES<
	XLIST
	C	ACCEPT,ACCEPT
	C	CHARAC,CARRAY
	C	CONTIN,CONTIN
	C	DDT,DDT
	C	DIMENS,DIM
	C	DOUBLE,DUBLE
	C	GROUP,GROUP
	C	GOTO,GOTO
	C	HELP,HELP
	C	LOCATE,Q
	C	MODE,MODE
	C	NEXT,NEXT
	C	OPEN,OPEN
	C	PAUSE,PAUSE
	C	REMOVE,RESET
	C	START,START
	C	STOP,EX.
	C	STRACE,TRACE
	C	TYPE,DISPLA
	C	WHAT,WHAT
	LIST
>

SUBTTL	INITIALIZATION

; Below are all valid entry points to FORDDT except for the entry
; to FORDDT caused by a PAUSE.  The PAUSE entry is a JSR into the table
; at BP1. This table's index is a function of the breakpoint number.
; From there a JSA to BCOM is performed.


; This entry point is used when stepping through a user program
; using the NEXT command.  If a NEXT has been issued, PUSHJ P,STEP4
; will be placed in FDDT..  An XCT FDDT. is performed at the beginning
; of each executable source statement if the /DEBUG:TRACE option was used.

FDDT.:	JFCL			;DEFAULT TO NO TRACE  MODE
				;OTHERWISE PUSHJ P,STEP4 TO TRACE


; This entry point should be used for reentering FORDDT from DDT.
; The DDT command %FDDT<ESC>G should be used.

%FDDT:				;[176] ADD THIS ENTRY POINT FROM DDT
	JSR	SAVE		;[176]SAVE USERS ACS
	PUSHJ	P,REMOVB	;[176]REMOVE PAUSES
	JRST	MODRT2		;[176]Re-enter(DDT only...& skip reset of mode)

;[174]%FDDT:				;[125] ADD THIS ENTRY POINT FROM DDT
.F10:	JSR	SAVE		;SAVE USERS ACS
	PUSHJ	P,REMOVB	;REMOVE PAUSES
	JRST	MODRET		;DO A RE-ENTER - FOR DDT ONLY


; A user may CALL FORDDT from his FORTRAN program.  This will
; fake a breakpoint.  FORDDT must have been run previously, as
; when DEBUG PROG.FOR is used, before the user may call this
; routine.  A CONTINUE may subsequently be used to reenter the
; user program.

FORDDT:				;[145] 'CALL' HERE FROM FORTRAN USER PROG
	POP	P,BP0		;[145] FAKE JSR TO GET RETURN ADDRESS
	SETOM	BP0FLG		;[145] REMEMBER WE WERE 'CALL'ED
	JRST	BP0+1		;[145]


;[317] The Tops-20 entry vector
ENTVEC:	JRST	SFDDT		;[317] Normal start address
REENT.::JRST	RE.ENT		;[317] REENTER address
	Z			;[317] Reserved for user

; This is the entry point when FORDDT is first run.  All
; initialization procedures are performed, including a call
; to FOROTS' RESET.

SFDDT:
	MOVE	P,[IOWD PDSIZ,PDL] ;[327] Stack for use during setup
IFE TOPS20,<
	MOVEI	T5,RE.ENT	;AND SET UP THE RE-ENTER ADDRESS
	MOVEM	T5,.JBREN	;[317]
>
IFN TOPS20,<
	SETZM	EXTEND		;[300] clear the extend flag
	XMOVEI	T5,.		;[317] Are we in
	TLNE	T5,-1		;[317]   non-zero section?
	SETOM	EXTEND		;[300] yes, set the flag
	SKIPE	EXTEND		;[327] In non-zero section?
	HLL	P,T5		;[327] Yes--Set section in stack pointer
>

	JSR	SAVE		;[145] SAVE THE WORLD
	PUSHJ	P,REMOVB	;REMOVE ANY STANDING PAUSE REQUESTS
	LINE
	TYPE(STARTING FORTRAN DDT)
	LINE

	JSP	16,FINIT.##	;[325] INITIALISE THE FOROTS SYSTEM
	0,,0			;[142] DUMMY RESET ARG
	MOVEM	P,SAVACS+17	;[326] So that RESTOR has something
	PUSHJ	P,SETLST	;[320] Set up symbol vector
IFN TOPS20,<
	SKIPE	EXTEND		;[300] non-zero section?
	 JRST	FORDX1		;[300] yes, get extended addrs symbol table
>
	HRRZ	T5,.JBSA	;REMEMBER THE START ADDRESS
	MOVEM	T5,JOBSA	; AND THE
	MOVE	T5,.JBSYM	;  SYMBOL TABLE DETAILS AT THE-
	MOVEM	T5,JOBSYM	;    TIME FORDDT IS ENTERED
ife tops20,<			;This hack doesn't work under TOPS20
	MOVE	T5,[XWD -1,3]	;GET THE CURRENT JOB
	GETTAB	T5,		;   NAME
	 CAIA			;DON'T PANIC IF NO JOB NAME
	MOVEM	T5,JOBNAM	;AND SAVE,
				;THIS WILL SERVE TO DETECT OVERLAYS
	SETZM	TTYLC		;[151] DEFAULT TO DON'T FLAG LOWERCASE
	MOVNI	P2,1		;[151] GET CURRENT JOB'S CONTROLLING TERMINAL UDX
	TRMNO.	P2,		;[151]
	  JRST	FORDD2		;[151] ERROR. DEFAULT TO NO FLAGGING OF LOWERCASE
	MOVEI	P1,.TOLCT	;[151] TRMOP. FUNCTION TO READ LOWERCASE SETTING
	MOVE	T5,[2,,P1]	;[151] SET UP TRMOP. CALL
	TRMOP.	T5,		;[151]
	  JRST	FORDD2		;[151] ERROR. ASSUME LOWERCASE. DOESN'T FLAG LC
	MOVEM	T5,TTYLC	;[151] STORE THE SETTING
FORDD2:				;[151]
> ;END OF IFE TOPS20
IFN TOPS20,<
	JRST	FORDX2		;[300] skip this stuff if not extended
FORDX1:	MOVEI	T1,ESEFIW	;[320] GET THE NON-ZERO VALUE
	MOVEM	T1,EFIWAD	;[313] STORE IT FOR LATER USE
	MOVEI	T1,ESDIEB	;[313] GET THE NON-ZERO VALUE
	MOVEM	T1,DIEBAD	;[313] STORE IT FOR LATER USE
	XHLLI	T1,.		;[313] SECTION # IN LH
	HRLZI	T2,-NBP		;[313] SETUP LOOP CNTR
FORDXL:	HLLM	T1,SZEFIW(T2)	;[313] STORE SECTION #
	AOBJN	T2,FORDXL	;[313] INCR AND LOOP
FORDX2:
>
	XMOVEI	T5,[JRST RET]	;[313] GUARD AGAINST CONTINUE AFTER CNTRL C
	MOVEM	T5,PROC0	;[313] STORE FULL ADDRESS
	MOVEI	T5,1		;RESET THE INITIAL TRACE VALUE
	MOVEM	T5,STPVAL	;   TO ONE
	SETZM	STARTU		;[316] User must 'START'
	PUSHJ	P,RE.NTR	;ALLOW A RE-ENTER TO WORK
	SETOM	ESCAPE		;NO ^C'S SO ALLOW ESCAPES TO FOROTS
;	RE - ENTER ENTRY

RE.RET:				;[326] Removed SETPDL
	SKIPIF	(CEXIT.)	;
	   SETZM T5		;NO CLUDGE CONECTIONS IN THIS PROG
	HRRM	T5,HELLO	;SET UP FOR HELLO MACRO DETECTOR
	MOVE	T0,STKYFL	;REINSTATE THE FLAG REGISTER
				;[137] This routine provides g-floating
				;[137]  capability to those programs
				;[137]  compiled with the /gfl switch.
	TRZ	T0,GFLOAT	;[137] Default to d-floating mode.
	TRO	T1,FGLONL	;[137] Search for globals only in sym table
	MOVE	S3,[SQUOZE 0,..GFL.] ;[137] Store "..GFL." in SYM for EVAL
	MOVEM	S3,SYM
	PUSHJ	P,EVAL		;[137] Search symbol table for "..GFL."
	   JRST	FSET		;[137] Not found, mode is d-floating; done
	MOVE	T0,STKYFL	;[137] Found, reinstate the flag reg(in case
				;[137]  T0 was modified by EVAL)
	TRO	T0,GFLOAT	;[137] Set GFLOAT flag to get g-floating
	MOVEM	T0,STKYFL	;[137] Update sticky flag store.
FSET:	MOVSI	T5,(JFCL)	;RESET THE TRACE ENTRY
	MOVEM	T5,FDDT.	;
	MOVE	T5,M2.F		;GET THE FOROTS FIN CALL
	MOVEM	T5,M2.I		;RE-INSTATE IN FORMAT - AFTER COMPLEX INPUT

;	SET THE DEFAULT TYPING FORMAT TO FLOATING  -  ALSO SET STKYFL

MODRET:	HRRZI	T5,F.		;SET UP TO TYPE FLOATING FORM
	MOVEM	T5,MODFLG	;SAVE AS THE STANDARD DEFAULT
MODRT2:	SKIPE	STARTU		;[402] See if already started
	JRST	RET		;YES - SO NOT FIRST TIME THROUGH

	PUSHJ	P,MAINF		;[315] Find the main program
	  CAIA			;[315] Not found
	JRST	BEGIN3		;[315] Name is in T4

BEGIN2:	 PUSHJ P,GETPRG		;NOT FOUND - GET THE MAIN PROGRAM NAME
	  MOVE	T4,[SQUOZE 0,MAIN.];No name -- Use MAIN. as default
				;DEFAULT MAIN PROG NAME IS MAIN.
BEGIN3:	STSYM	T4,PRGNAM	;[402] Store symbol into PRGNAM
	MOVEM	T4,SYM		;SET SO SETNAM CAN OPEN THE MAIN PROGRAM
	PUSHJ	P,SETNAM	;'OPEN' THE MAIN PROGRAM
SUBTTL	USER INPUT

RET:	MOVE	P3,MODFLG	;[323] Get the default settings into
	HRLS	P3		;[323]   both halves
	AND	T0,[STIKYS]	;MAKE SURE WE SAVE THE GOOD FLAGS
	MOVEM	T0,STKYFL	; IN THE STICKY STORE
	SETZI	T1,		;RESET THE TEMPORARY FLAGS
	SKIPGE	TERMK		;END OF LAST LINE SEEN?
	PUSHJ	P,CLRLIN	;CLEAR OUT THE REST OF USERS LINE
				;[325] Removed SETPDL
	CLEARM	CURGRP		;CLEAR CURRENT GROUP NUMBERS
	CLEARM	SYL
	CLEARM	MATHSM
	CLEARM	SYM
	CLEARM	DEN
	CLEARM	RANGE
	CLEARM	GETCHR
	CLEARM	SECSAV		;CLEAR SECTION NAME SAVED
ife tops20,<
	SKPINL			;CLEARS THE EFFECT -
	JFCL>			;   OF ^O, end of conditional
ifn tops20,<
	push	p,T1		;save T1
	push	p,T2		;save T2
	hrrzi	T1,.priou	;get terminal output designator
	rfmod%			;get terminal JFN word
	tlz	T2,(tt%osp)	;clear ^o effects
	hrrzi	T1,.priou	;get terminal output designator
	sfmod%			;set new JFN word
	pop	p,T2		;restore T2
	pop	p,T1>		;restore T1, end of conditional
	LINE
	PUSHJ	P,OVRLAY	;HAS AN OVERLAY OCCURED

	pushj	p,readcm	;prompt and read user command
	JUMPE	T3,RET		;NO SIGNIFICANT INFORMATION

	MOVEM	T3,COMAND	;SAVE USER COMAND
	JUMPN	T2,BADSYN	;COMMAND TERMINOLOGICAL INEXACTITUDE

	SKIPGE	T2,TERMK	; SPACE IS NOT EOL
	TLZA	T0,EOL		;CLEAR EOL FLAG
	TLO	T0,EOL		;SET EOL FLAG
				;NOW SEE WHAT USER WANTS!
;	ENTER WITH SIXBIT USER COMMAND IN T3
;
;	EXIT TO COMMAND IF RECOGNISED AND UNIQUE, OTHERWISE
;	DISPATCH TO UNKNOWN OR COMMAND NOT UNIQUE ROUTINES
;	N.B.    T2 = DISPATCH ADDRESS
;		T3 = USER COMMAND NAME
;		T4 = OFFICIAL COMMAND NAME

COMCON:	MOVE	T3,COMAND	;GET USER COMMAND IN T3
	MOVEI	S2,DISP		;START OF DISPATCH TABLE
	MOVE	S3,[XWD -DISPL,COMTAB]	;STEP THRO COMMANDS
	MOVE	T2,T3		;COPY USER COMMAND
	SETOI	T5,		;SET ALL ONES MASK
	LSH	T5,-6		;SET MASK IN
	LSH	T2,6		;      T5 TO LENGTH OF
	JUMPN	T2,.-2		;              USER COMMAND
	MOVEI	P4,0		;NO. OF NON-UNIQUE OCURRENCES
	MOVE	T2,S3		;AOBJN FOR COMMAND TABLE
COMLP:	MOVE	T4,(T2)		;GET NEXT COMMAND
	TDZ	T4,T5		;MASK OUT FOR MATCH WITH USER
	CAMN	T3,(T2)		;EXACT MATCH?
	JRST	COMFND		; YES - THIS IS IT

	CAME	T3,T4		;MATCH SO FAR
	JRST	COMNEQ		;NO MATCH AT ALL

	AOS	P4		;FLAG ANOTHER MATCH
	HRL	S2,T2		;MARK LAST INDEX
COMNEQ:	AOBJN	T2,COMLP	;TRIED ALL KNOWN COMMANDS?

	JUMPN	P4,.+2		;UNKNOWN?
	AOS	T2		;SET FOR NONE UNIQUE
	CAIN	P4,1		;WAS THE COMMAND UNIQUE?
	HLR	T2,S2		;YES - REMEMBER THIS INDEX
	MOVEI	S2,DISP		;[303] BASE OF DISPATCH TABLE, AGAIN
COMFND:	MOVE	T4,(T2)		;SAVE OFFICIAL COMMAND NAME
	SUBI	T2,(S3)		;INDEX DOWN DISPATCH
	ADDI	S2,(T2)		;INDEX INTO DISPATCH
	MOVE	T2,(S2)		;GET DISPATCH ADDRESS
	JRST	@T2		;     DISPATCH
	SUBTTL	COMMAND DECODER



	DEFINE C(A,B)
<	SIXBIT/A/	>


COMTAB:	XLIST		;NAMES
	NAMES
	LIST

DISPL=.-COMTAB




	DEFINE C(A,B)
<	IFIW	B	>	;[300]


DISP:	XLIST		;HANDLERS
	NAMES
	EXP	NOTUNQ		;COMMAND NOT UNIQUE
	EXP	ERROR		;UNKNOWN COMMAND
	LIST
SUBTTL	COMMAND SERVICE MODULES


;STRACE - SUBROUTINE CALLING SEQUENCE TRACE (WALK-BACK)

TRACE:	SKIPN	SAVACS+17	;[203] HAS USER INITIALIZED FOROTS?
	 JRST	RET		;[203] NO, JUST RETURN
	SKIPN	STARTU		;[316] User must
	 JRST	ERR4		;[316]   initialize with START
	SKIPN	ESCAPE		;ARE WE ALLOWING ESCAPES
	JRST	ERR30		;NO TRACE
	MOVE	T2,16		;[325] SAVE FORDDT REG 16??
	MOVE	16,SAVACS+16	;[147] - GET FOROTS REG 16
	PUSHJ	P,TRACE.##	;[143] DO A FORTRAN TRACE
	MOVE	16,T2		;[325] Restore Reg 16
	JRST	RET		;END OF TRACE
;	START FUNCTION

START:	MOVSI	T5,(JFCL)	;RESET THE TRACE ENTRY
	MOVEM	T5,FDDT.	;
	PUSHJ	P,CLRLIN	;FLUSH OUT LINE BUFFER
START2:	LDSYM	T5,PRGNAM	;[402]GET THE MAIN PROGRAM NAME
	MOVEM	T5,SYM		;SAVE FOR EVAL
	TRNE	T1,LNAME	;[402]IS LONG PROGRAM NAME FLAG SET?
	 JRST	STRT2B		;[402]  YES

	MOVSI	T2,GLOBAL	;[157]Global prefix
	MOVEM	T2,SYMASK	;[157]Reset mask in case it's been munged
	PUSHJ	P,FINDG		;No, Find the start of short name
	 JRST	ERR8		;NO START ADDRESS		
 	JRST	STRT2C		;[402]

STRT2B: MOVSI	T2,LPNAME	;[402] global/program name in sec. symbol tab
	MOVEM	T2,SYMASK	;[402] Reset mask in case it's been munged
	PUSHJ	P,FINDLG	;[402]
	 JRST	ERR8		;[402]

STRT2C:	MOVEM	T5,STARTU	;[316] Save for go
	MOVEM	T0,STKYFL	;MAKE THE FOROTS FLAG STICK
	PUSHJ	P,RE.NTR	;ALLOW RE-ENTERS AGAIN
	PUSHJ	P,INSRTB	;PUT IN BREAKPOINTS	
	HRRZI	T0,FO$GBA	;[332] HAVE FOROTS RETURN BREAK ADDRESS
	PUSHJ	P,FOROP.	;[325]   IN T0

	MOVE	T5,@T0		;[332] IF @T0=0 THEN NO PAUSE ON ERROR
	JUMPE	T5,START3	;[332] 
	MOVEM	T0,TEM10	;[340] SAVE BREAK ADDRESS
	JSP	L,FINIT.	;[332] INITIALIZE FOROTS
	JFCL			;[332]
	XMOVEI	T4,PAUERR	;[332] RESET PAUSE ON ERROR FLAG
	MOVEM	T4,@TEM10	;[340] STORE VIA BREAK ADDRESS

	XMOVEI	16,ERRARG	;[404] Biggest integer
	PUSHJ	17,ERRSET	;[404] Set number of errors allowed

START3: JSP	T5,RESTORE
	SETZI	16,		;MAKE F40 STRACE WORK	
	JRST	@STARTU		;[316] Start user program

;	GOTO  STATEMENT LABEL OR SYMBOL CONTENTS

GOTO:	JUMPL	T0,START4	;NO ARGUMENTS = START AT LAST GOTO
	PUSHJ	P,SYMIN		;GET USERS ARGUMENT
	  JRST	ERR6		;NONE SUCH
	  CAIA			;NUMERIC
	MOVE	T5,(T5)		;GET CONTENTS
	PUSHJ	P,ONFORM	;ON A FORMAT STATEMENT?
	  JRST	ERR36		;YES - ERROR
	PUSHJ	P,CHKADR	;DO A CHECK OF USER AREA
	 JRST	ERR31		;ILLEGAL - ERROR
	 JFCL
	CAIA
START4:	MOVE	T5,STARTU	;[316] Get start address

	SKIPN	STARTU		;[316] Any start address?
	 JRST	ERR4		;[316] No address - Refuse START and GOTO

	MOVEM	T5,GOLOC	;SET UP FOR EXTASK
	MOVE	T2,SAVACS+17	;[325] Get user P
	MOVSI	T5,(POPJ P,)	;HAVE WE STOPPED AFTER A NEXT?
	LDB	T3,[POINT 23,LEAV,35]	;[303] PICK UP AC,I,E
	TLO	T3,400000		;[303] MAKE THIS AN IFIW
	CAME	T5,@T3		;[303]Have we stopped after NEXT?
	 SKIPA	T5,GOLOC	;[303] NO, so skip the pop and reload T5
	 POP	T2,T5		;[170]YES, POP the user return addr
	MOVEM	T2,SAVACS+17	;[325] And reset his P
	SKIPN	ESCAPE		;HAS A RE ENTER BEEN DONE?
	JRST	ERR30		;YES - ONLY SOME FORM OF CONTINUE ALLOWED
	PUSHJ	P,ONFORM	;SKIP IF NOT A FORMAT AT (T5)
	  JRST	ERR24		;NOT ALLOWED
	PUSHJ	P,RE.NTR	;ALLOW RE-ENTERS AGAIN
	MOVSI	T5,(JFCL)	;RESET THE TRACE ENTRY
	MOVEM	T5,FDDT.	;
	PUSHJ	P,EXTASK	;TRANSFER TO EXTERNAL TASK
;	OPEN

OPEN:	JUMPL	T0,OPEN2	;ASSUME MAIN PROG IF JUST 'OPEN'
	PUSHJ	P,TTYIN		;WHAT NEXT
	JUMPN	T2,BADSYN	;MUST BE LINE END DELIMITER
	JUMPE	T3,BADSYN	;MUST HAVE SOME CHARACTERS
	PUSHJ	P,VALID		;CHECK VALIDITY & GET RAD50 IN T4
OPEN3:	MOVEM	T4,SYM		;SAVE FOR 'OPEN'
	PUSHJ	P,SETNAM	;DO THE OPEN
	JRST	RET		;WHAT NEXT

OPEN2:	LDSYM	T4,PRGNAM	;[402]GET FORTRAN MAIN PROG NAME
	JRST	OPEN3		;OPEN THIS

;	DDT FUNCTION

IFE TOPS20,<			;[114] TOPS-10 HAS UDDT LOADED, SO IT'S IN
				;[114] SYMBOL TABLE
DDT:	PROGIF	(UDDT)		;IS DDT LOADED?
	   JRST	MAPDDT		;[115] NO, GO GET VMDDT
	MOVE	T5,1(T2)	;[321] The address
	HRRZM	T5,GOLOC	;[333] just the RH
	JRST	EXTASK		;TRANSFER TO EXTERNAL TASK

MAPDDT:	MOVE	T5,[.PAGCA,,700] ;[115] CHECK FOR PAGE 700
	PAGE.	T5,		;[115] IS IT THERE?
	  JRST	ERR11		;[115] NO PAGE UUO, NO VMDDT
	TLNN	T5,(PA.GNE)	;[115] DOES PAGE EXIST?
	  JRST	GODDT		;[115] YES, GO TO IT

	MOVEM	17,MRGACS+17	;[115] MERGE WRECKS ALL ACS
	MOVEI	17,MRGACS	;[115] SO SAVE THEM
	BLT	17,MRGACS+16
	MOVEI	T5,['SYS   '	;[115] SET UP TO GET DDT
		   'VMDDT '
		    EXP 0,0,0,0]
	MERGE.	T5,		;[115] GET IT
	  JRST	[MOVSI 17,MRGACS ;[115] CAN'T, TOUGH
		 BLT 17,17
		 JRST ERR11]
	MOVE	T5,[775777,,700000] ;[122] SET .JBDDT
	SETDDT	T5,		;[122]
	MOVSI	17,MRGACS	;[115] PUT ACS BACK
	BLT	17,17

GODDT:	MOVEI	T5,700000	;[115] SET ADDRESS
	MOVEM	T5,GOLOC
	JRST	EXTASK		;[115] GO CALL EXTERNAL TASK
>

IFN TOPS20,<

DDT:	MOVE	T1,[.FHSLF,,770]	;[114] LOOK AT PAGE 770
	RPACS%			;[114] GET PAGE ACCESS BITS
	TXNN	T2,PA%PEX	;[114] DOES PAGE 770 EXIST?
	  JRST	MAPDDT		;[114] NO, GO MAP IN UDDT.EXE
	MOVE	T1,770000	;[300] GET DDT ENTRY VECTOR
	CAMN	T1,[JRST 770002] ;[114] IS IT REALLY DDT?
	  JRST	GODDT		;[114] YES, JUMP TO IT

MAPDDT: 
	MOVEI	T1,.FHSLF	;[114] GET ENTRY VECTOR LOC
	SKIPE	EXTEND			;[300] IS THIS AN EXTENDED PROG?
	JRST	[XGVEC%			;[300] YES, GET X-ENTRY VECTOR
		 DMOVEM	T2,DDTVEC	;[300] SAVE THE DDT ENTRY VECTOR
		 JRST	MAPDD2]		;[300] SKIP THE NON-EXTENDED VERSION
	GEVEC%			;[300] GET NON-EXTENDED ENTRY VECTOR
	MOVEM	T2,DDTVEC	;[300] STORE IT
MAPDD2:				;[300] COMMON JUNCTURE
	MOVX	T1,GJ%SHT+GJ%OLD	;[114] SHORT FORM, FILE MUST EXIST
	HRROI	T2,[ASCIZ /SYS:UDDT.EXE/] ;[114] DDT
	GTJFN%			;[114] FIND IT
	  ERJMP ERR11		;[114] NOT THERE, CAN'T HELP
	HRLI	T1,.FHSLF	;[114] MAP INTO THIS FORK
	TRO	T1,GT%ARG!GT%NOV ;[300] LIGHT SOME FUNCTION CODE BITS
	XMOVEI	T2,GTBLK	;[300] ARG BLOCK FOR GET%	
	HLRZM	T2,GTBLK+.GBASE	;[300] STORE CURRENT SECTION NUMBER
	GET%			;[114] READ IN DDT
	  ERJMP	ERR11		;[114] CAN'T
	DMOVE	T1,.JBSYM	;[300] GET SYMBOL TABLE PTRS FROM SAME SECTION
	MOVEM	T1,@770001	;[114] STORE FOR DDT
	MOVEM	T2,@770002
	MOVEI	T1,.FHSLF	;[114] THIS FORK
	SKIPE	EXTEND			;[300] ARE WE RUNNING EXTENDED?
	 JRST	[DMOVE	T2,DDTVEC	;[300] YES, RESTORE ENTRY VECTOR
		 XSVEC%			;[300] SET THE ENTRY VECTOR
		 JRST	GODDT]		;[300] JOIN COMMON CO
	MOVE	T2,DDTVEC	;[300] RESTORE ENTRY VECTOR
	SEVEC%			;[114] SET ENTRY VECTOR

GODDT:	TYPE	(<To return to FORDDT, type "%FDDT<ESC>G">)
	LINE
	XMOVEI	T2,770000	;[300] GET DDT START ADDRESS
	MOVEM	T2,GOLOC	;[114] SAVE
	JRST	EXTASK		;[114] GO CALL EXTERNAL TASK

>;[114] END IFN TOPS20

;	EXIT FUNCTION

EX.:	JUMPGE	T0,EX.R		;IS THE USER REQUESTING A MONITOR RETURN
	SKIPN	STARTU		;[316] NO - SEE IF A START HAS BEEN DONE
	 JRST	EX.A		;[316] NO START, DO NORMAL EXIT

	PUSHJ	P,CHKIWI	;[211] RECURSIVE IO IF WE CALL EXIT.?
	 JRST	EX.R2		;[211] YES, SIMULATE A STOP/RETURN
	SETZM	STARTU		;[316] No CONTINUE or REENTR
	SETZM	TEM		;SET UP ARG BLOCK
	SETZM	TEM1		;  TO EXIT FOROTS
	PUSHJ	P,INSRTB	;REPLACE PAUSES
	JSP	T5,RESTORE	;RESTORE USERS ACS
	XMOVEI	L,TEM		;[300] GET EXIT ARGBLOCK
	PUSHJ	P,EXIT.##	;[143] DO A FOROTS EXIT

EX.R:	PUSHJ	P,TTYIN		;GET NEXT INPUT
	JUMPN	T3,BADSYN	;LOOKING FOR / - NOCHARACTERS ALLOWED
	JUMPE	T2,BADSYN	;BETTER BE /
	CAIE	T2,"/"
	JRST	BADSYN		;SORRY
	PUSHJ	P,TTYIN		;LOOK FOR RETURN
	JUMPN	T2,BADSYN	;NO MORE CHARACTERS ALLOWED
	JUMPE	T3,BADSYN	;NO CHARACTERS IN INPUT????
	LSHC	T2,6		;GET FIRST CHARACTER
	CAIE	T2,'  R'	;LOOK FOR 'RETURN' - IMPLIED BY R
	JRST	BADSYN		;WE DONT UNDERSTAND ANY OTHER CHARACTER
EX.R2:				;[211]
ife tops20,<
	CALLI	1,12>		;DO A MONRET
ifn tops20,<
	haltf%>			;do a monret
	JRST	RET		;CONTINUE'S ALLOWED
ife tops20,<
ex.a:	exit>			;do a non-returnable return
ifn tops20,<
ex.a:	reset%			;close files, etc.
	haltf%			;stop
	jrst	ex.a>		;and don't permit continues
;	ROUTINE OVERLAY - TO DETECT WHEN THERE HAS BEEN AN APPARENT
;	OVERLAY OF THE PROGRAM.	THIS IS DONE BY OBSERVING THE
;	VALUES OF .JBSA AND .JBSYM EVERY RETURN TO USER MODE
;[320] OVRLAY through OVRL2 rewritten
OVRLAY:
IFN TOPS20,<
	SKIPE	EXTEND		;[321] Don't want this if
	 POPJ	P,>		;[321]   we are in non-zero section
	PUSH	P,T4
	SETZ	T5,		;Becomes non-zero if difference found
	MOVE	T4,.JBSYM	;Lowseg symbol pointer
	EXCH	T4,JOBSYM	;Save new symbol pointer
	JUMPE	T4,OVRL1	;Old value is zero if not inited
	CAMN	T4,JOBSYM	;Compare to last known value
	 JRST	OVRL1		;No change
	PUSHJ	P,SETLST	;Reset the symbol tables
	MOVEI	T5,1		;Remember that we did that

OVRL1:	HRRZ	T4,.JBSA	;The start address
	EXCH	T4,JOBSA	;Swap with previous value
	JUMPE	T4,OVRL2	;Exit if old start not set up
	CAME	T4,JOBSA	;Has this changed?
	 AOJ	T5,		;Yes

OVRL2:	POP	P,T4		;Restore register
	SKIPN	T5		;Any change?
	 POPJ	P,		;No - All is well

	LINE
	TYPE(<%FDTPOV Program overlayed>)
ife tops20,<			;this doesn't work under TOPS20
	MOVE	T5,[XWD -1,3]	;SET FOR PROGRAM NAME
	GETTAB	T5,>		;FIND THE CURRENT NAME,end of conditional
	JRST	OVRL3		;SECRETIVE TYPE??
	SKIPN	JOBNAM		;HAS ANY NAME BEEN STORED?
	MOVEM	T5,JOBNAM	;NO - REMEMBER THIS
	CAMN	T5,JOBNAM	;OVERLAYED BY SYSTEM WHICH DOSN'T CHANGE NAME?
	JRST	OVRL3		;YES

	MOVEM	T5,JOBNAM	;REMEMBER NEW NAME
	TYPE( by )
	PUSHJ	P,SIXBP		;OUTPUT PROGRAM NAME

OVRL3:	TYPE( ***)
	LINE
	SKIPN	T5,JOBOPC	;ANY RE-ENTER ADDRESS?
	MOVE	T5,BCOM		;IF NOT BCOM SHOULD BE USER BREAK
	HRRZ	T5,T5		;JUST THE ADDRESS THANK YOU
	PJRST	WHERE		;TELL WHERE - END OF OVERLAY
;	RE-ENTER LOGIC

RE.ENT:				;[325] Removed SETPDL
	SKIPE	REENTR		;ARE WE ALREADY REENTERED?
	 JRST	ER.ENT		;YES. REPORT
IFE TOPS20,<			;[300]
	MOVEM	P,SAVLOC	;FREE UP A SPARE REG
	HRRZ	P,.JBOPC	;GET THE BREAK P.C.
>				;[300]
	SKIPE	ESCAPE		;RE-ENTERS ALLOWED ONCE(SEE ER.ENT)
	JRST	RE.BRK		;DONT DESTROY USER PROFILE
IFE TOPS20,<			;[300]
	MOVE	P,SAVLOC	;RE-INSTATE THE OLD REG
>				;[300]
	JSR	SAVE		;SAVE THE EXTERNAL PROG STATUS
	PUSHJ	P,REMOVB	;AND REMOVE THE PAUSES
IFE TOPS20,<			;[300]
	MOVE	T5,.JBOPC	;GET THE PROG P.C.
	MOVEM	T5,JOBOPC	;STORE AND FLAG THAT WE ARE HANDLING RE-ENTER
	MOVEM	T5,JOBBRK	;SAVE THE JOB BREAK LOCATION
	MOVEM	T5,STARTU	;[316] ALLOW CONTINUES TO WORK
>				;[300]
	SETOM	REENTR		;SET FLAG THAT WE HAVE REENTERED
	SKIPE	PRGNAM		;[315] Do we have a main program?
	JRST	RE.LOC		;YES

	PUSHJ	P,MAINF		;[315] Find the main program
	 JRST	RE.LOC		;[315] Not found
	STSYM	T4,PRGNAM	;[402] Store main program name
	PUSHJ	P,SETNAM	;OPEN MAIN PROG

;	HERE TO DISPLAY THE CURRENT SUSPEND POINT
;	JOBBRK IS THE BREAK - NEED NOT = JOBOPC

RE.LOC:				;CLEAR THE OUTPUT BUFFER
ife tops20,<
	clrbfo
>
ifn tops20,<
	push	p,t1
	hrrzi	t1,.priou
	cfobf%
	pop	p,t1
>
	TYPE([ Program suspended )
	HRRZ	T5,JOBBRK	;SET UP THE ACTUAL SUSPEND POINT
ifn tops20,<			;[335]
	SKIPN	EXTEND		;[334] IF REENTERING AND PROGRAM IS IN EXTENDED
	JRST	RE.LO2		;[334]   SECTION THEN JUST SAY REENTERING FROM
>				;[335]
	TYPE 	(from FORDDT)	;[334]   FORDDT SINCE WE CAN'T GET ADDRESS
	LINE			;[334]
	SKIPA			;[334]
RE.LO2:	PUSHJ	P,WHERE		;TELL USER WHERE HE IS SUSSPENDED
	TYPE(Open section: )

	LDSYM	T5,OPENED	;[402]WHAT IS THE CURRENTLY OPEN SECTION
	PUSHJ	P,SPT1		;TYPE THAT
	TYPE	( ])
	MOVE	T0,STKYFL	;RESET THE FLAG REGISTER
	JRST	RET		;RETURN TO NORMAL WORKING
ER.ENT:	JRST	RE.LOC		;INDICATE THAT WE ARE ALREADY HANDLING A REENTER

RE.NTR:	SETZM	REENTR		;ALLOW REENTERS AGAIN
	SETZM	JOBOPC		;CLEAR THE RE-ENTER IN PROGRESS FLAG
	SETZM	ESCAPE		;DO NOT ALLOW ESCAPES FROM FORDDT
	POPJ	P,

RE.BRK:				;[325] Removed SETPDL
	SKIPN	STARTU		;[316] Has a start been done?
	 JRST	RE.RET		;[316] No - Return to FORDDT user mode

	MOVE	T5,BCOM		;GET THE PAUSE POINT
	MOVEI	T5,-1(T5)	;CORRECT FOR JSA
	ANDI	T5,-1		;JUST THE ADDRESS PORTION
	MOVEM	T5,JOBBRK	;SAVE THE JOB BREAK FOR RE.LOC
	JRST	RE.LOC		;DISPLAY PROGRAM EXECUTION SUSPENSION


;	ROUTINE TO DISPLAY WHERE THE PROGRAM IS SUSPENDED

WHERE:
IFN TOPS20,<
	SKIPE	EXTEND		;[300] CHECK IF WE ARE RUNNING EXTENDED
	  JRST	[TYPE(in extended section)
		 JRST	RE.L2]	;[300] YES, SAY SO, AND CONTINUE
>
	SKIPN	.JBHRL		;SKIP IF WE HAVE A HIGH SEG.
	JRST	RE.L2

	CAMLE	T5,.JBREL	;ARE WE SUSPENDED OVER THE LOW SEG.
	JRST	[TYPE(in high segment)
		JRST	RE.L2]
	TYPE(in low segment)
RE.L2:	TYPE( at )
;[326]	TLO	T0,FGLSNM	;GLOBALS ARE OK
	PUSHJ	P,LOOK		;DO A SYSMBOL 'LOOK'-UP
	  JRST	[TYPE( an unknown location)	;[300] SAY WE DON'T KNOW
		 JRST RE.L3]	;[300] AND PROCEED
	  CAIA			;NOTHING TYPED
	JRST	RE.L3A		;FOUND AND TYPED
	MOVEM	T5,TEM		;REMEMBER NEAREST REFERENCE
	PUSHJ	P,SPT		;TYPE THE SYMBOL
	TYPE( + )
	MOVE	T5,TEM		;GET THE OFFSET
	PUSHJ	P,TYP4		;DISPLAY AS OCTAL
RE.L3A:	SKIPN	PNAMSV		;DID WE FIND A SECTION NAME
	JRST	RE.L3		;NO
	TYPE( in )
	LDSYM	T5,PNAMSV	;[402]GET THE SECTION NAME
	PUSHJ	P,SPT1		;DISPLAY THAT
RE.L3:	LINE			;
	POPJ	P,		;
;	PAUSE LOGIC

PAUSE:	JUMPL	T0,PSEALL	;DISPLAY ALL PAUSES IF NO ARGUMENTS
	TRO	T1,FGLONL	;FIND GLOBAL SYMBOL ONLY
	SETZM	ONFLG		;[325]
	PUSHJ	P,SYMIN		;GET THE NEXT SYMBOL IN SYM
	   JRST	ONCHK		;[325]NONE SUCH!
	   JRST PAUS11		;[332]	;STATEMENT # FROM USER
	JRST	PAUS10		;SYMBOL - MEANS STOP AT ROUTINE
ONCHK:	CAME	T3,[SIXBIT/ON/] ;[325]
	JRST	ERR6		;[325] INVALID SYMBOL
	JRST	PAUS2		;[325]
PAUS11:	MOVEM	T5,TEM1		;[313] SAVE POINTER TEMPORARILY
	SETZM	TEM		;CLEAR CONDITIONAL REQUEST
	SKIPL	TERMK		;WAS THAT ALL THE USER WANTED?
	JRST	PAUS5		; YES

	PUSHJ	P,TTYIN		; NO,GET MOR
	JUMPN	T2,BADSYN	;DO WE HAVE A LEGAL DELIMITER
	JUMPE	T3,PAUS5	;[136] DID WE REALLY GET ANYTHING?
	SKIPN	ONFLG		;[325]
	JRST	TYPCHK		;[325] NO SUBROUTINE CALLED "ON"
	CAMN	T3,[SIXBIT/ERROR/];[325] 
	JRST	P2OK		;[325] PAUSE ON ERROR
	CAMN	T3,[SIXBIT/ERR/];[325] 
	JRST	P2OK		;[325] 
TYPCHK:	CAMN	T3,[SIXBIT/TYPING/] ;[134] YES, MAYBE A 'TYPING' REQUEST
	JRST	PAUS7		;[134]
	SKIPL	TERMK		;[134] DID WE GET A LINE TERMINATOR?
	JRST	BADSYN		;[134] YES, WRONG PLACE FOR IT
	CAMN	T3,[SIXBIT/AFTER/] ;FORCE USER TO TYPE WHOLE WORD
	JRST	PAUS4		;AFTER REQUESTED
	CAME	T3,[SIXBIT/IF/]	;WAS IT 'IF'?
	JRST	BADSYN		;ANYTHING ELSE MEANS TROUBLE
	TLZ	T0,CONS		;CLEAR CONSTANT SEEN FLAG
	TRO	T1,LGCLEG	;[116] LET EITHER KNOW WE MAY GET LOGICALS
	PUSHJ	P,EITHER	;NUMBER OR SYMBOL SHOULD FOLLOW
	  PUSHJ	P,NUMB		;CONSTANT SEEN
	  MOVEM	T5,COND1	;SAVE CONSTANT
	SKIPL	TERMK		;[134] DID WE GET A LINE TERMINATOR?
	JRST	BADSYN		;[134] YES, WRONG PLACE FOR IT
	CLEARM	COND0		;CLEAR FOR TYPE OF TEST
	TRZE	T1,ISLOGI	;[116] IS IT A LOGICAL CONSTANT
	JRST	[SETZ	T5,		;[116] YES, SET FLAG IN COND0
		TLO	T5,LFTLOG	;[116]
		MOVEM	T5,COND0 	;[116]
		JRST	.+1]		;[116]
	JUMPN	T2,.+2		;DELIMITER?
	PUSHJ	P,GETSKB	;NEXT CHARACTER
	CAIE	T2,"."		;MUST BE . OF .EQ. ETC
	JRST	BADSYN
	PUSHJ	P,TTYIN		;GET SIXBIT STRING
	CAIE	T2,"."		;MUST AGAIN BE TERMINATED BY .
	JRST	BADSYN
	HLRZS	T3,T3		;MORE USEFUL IN RIGHT HALF
	CAIN	T3,'LT '
	JRST	TEST1
	CAIN	T3,'LE '
	JRST	TEST2
	CAIN	T3,'EQ '
	JRST	TEST3
	CAIN	T3,'NE '
	JRST	TEST4
	CAIN	T3,'GT '
	JRST	TEST5
	CAIN	T3,'GE '
	JRST	TEST6
	JRST	BADSYN		;UNKNOWN CONDITION
TEST6:	AOS	COND0		;GE=5
TEST5:	AOS	COND0		;GR=4
TEST4:	AOS	COND0		;NE=3
TEST3:	AOS	COND0		;EQ=2
TEST2:	AOS	COND0		;LE=1
TEST1:	TRO	T1,LGCLEG	;[116] LET EITHER KNOW LOGICALS ARE LEGAL
	PUSHJ	P,EITHER
	  PUSHJ	P,NUMB		;SAVE AS A NUMBER
	  MOVEM	T5,COND2	;SAVE THE LOCATION
	TRZE	T1,ISLOGI	;[116] DID WE GET A LOGICAL CONSTANT?
	JRST	[SETZ	T5,		;[116] YUP, SET COND0 FLAG
		TLO	T5,RHTLOG	;[116]
		ORM	T5,COND0 	;[116]
		JRST	.+1]		;[116]
	MOVE	T5,[JSR	COND]
	MOVEM	T5,TEM		;FORM THE (CONDITIONAL TEST) LOCATION LINK
PAUS5:	SKIPA	T5,[Z 1]	;PROCEDE COUNT=1
PAUS4:	PUSHJ	P,EITHER	;GET USERS PROCEDE COUNT IN T5
	   CAIA			;CONSTANT GIVEN
	   MOVE T5,(T5)		;SYMBOL - GET CONTENTS
	JUMPL	T5,BADSYN	;DO NOT ALLOW NEGATIVE PROCEDE COUNTS
	EXCH	T5,TEM1		;GET BACK BREAKPOINT ADDRESS
	SKIPL	TERMK		;WAS THAT ALL
	JRST	PAUS6		; YES

	MOVEM	T5,SAVLOC	;SAVE PAUSE ADDRESS TEPORARILY
	PUSHJ	P,TTYIN		;GET SIXBIT USER INPUT
	JUMPN	T2,BADSYN
	MOVE	T5,SAVLOC	;[136] RESTORE PAUSE ADDR., IN CASE WE'RE DONE
	JUMPE	T3,PAUS6	;[136] WAS THERE REALLY ANYTHING THERE?
	CAME	T3,[SIXBIT/TYPING/] ;YES
	JRST	BADSYN
PAUS8:	SKIPL	TERMK		;[134] DID WE GET A LINE TERMINATOR?
	JRST	ERR15		;[134] YES, WRONG PLACE FOR IT
	PUSHJ	P,GETNUM	;USER WANTS AUTO DISPLAY
	JUMPN	T5,PAUS3	;ASSUME ZERO MEANS NO INPUT

	CAIN	T2,"/"		;A / HERE DENOTES THAT A GROUP# FOLLOWS
	JRST	PAUS8		;TRY FOR THE NUMBER AGAIN

PAUS3:	CAIL	T5,1		;MAKE SURE HE GETS
	CAILE	T5,GPMAX	;  ONLY A VALID GROUP #
	JRST	ERR15		;COMPLAIN ABOUT GROUP #
	HRLM	T5,TEM1		;[300] GROUP # TO LH OF PROCEDE COUNT
	MOVE	T5,SAVLOC	;[300] GET BACK PAUSE ADDRESS
	TLO	T0,AUTO		;SET THE AUTO PROCEDE FLAG

PAUS6:	PUSHJ	P,ONFORM	;SKIP IF NOT A FORMAT AT (T5)
	  JRST	ERR19
	PUSHJ	P,BPS1		;PLACE ALL PARAMETERS TO EFFECT A PAUSE
	JRST	RET		;DONE!
PAUS7:	SETZI	T5,		;CLEAR PROCEDE COUNT
	EXCH	T5,TEM1		;GET PAUSE PLACE
	MOVEM	T5,SAVLOC	;STORE PAUSE LOCATION
	JRST	PAUS8

PAUS2:	SKIPL	TERMK		;[332] DID WE GET A LINE TERMINATOR?
	JRST	ERR6		;[332] YES, WRONG PLACE FOR IT
	PUSHJ	P,TTYIN		;[325] GET SIXBIT USER INPUT
	JUMPN	T2,BADSYN	;[325]
	CAMN	T3,[SIXBIT /ERROR/];[325] IS IT 'PAUSE ON ERROR'?
	JRST	P2OK		;[325]    YES
	CAME	T3,[SIXBIT /ERR/];[325]   YES
	JRST	BADSYN		;[325]    NO SO PRINT ERROR MESSAGE

P2OK:	SKIPGE	TERMK		;[332] DID WE GET A LINE TERMINATOR?
	PUSHJ	P,CLRLIN	;[332] NO, JUNK AFTER "PAUSE ON ERROR"
	HRRZI	T0,FO$GBA	;[332] HAVE FOROTS RETURN BREAK ADDRESS
	PUSHJ	P,FOROP.	;[325]   IN T0
	PUSH	P,T4		;[340] SAVE T4
	XMOVEI	T4,PAUERR	;[332]
	MOVEM	T4,@T0		;[332] Set address for trap

	XMOVEI	16,ERRARG	;[404] Biggest integer
	PUSHJ	17,ERRSET	;[404] Set number of errors allowed

	POP	P,T4		;[340] RESTORE T4
	JRST	RET		;[325] GET NEXT FORDDT COMMAND

PAUS10:	SKIPE	SUBSCR		;NOR MUST THERE BE AN OFFSET
	JRST	ERR19
	MOVE	T2,@SYMSAV	;GET SYMBOL
	TRNE	T1,LNAME	;[402]Short symbols?
	 JRST	PAU10L		;[402]No
	TLNE	T2,700000	;IS THIS A PROGRAM NAME OR GLOBAL
	JRST	ERR19		;NO SO DONT ALLOW

	TLZ	T2,PNAME	;[331]
	CAMN	T2,[SQUOZE 0,ON];[331] IF IT IS "ON" THEN
	AOS	ONFLG		;[325]   SET "PAUSE ON" FLAG
	JRST	PAU10A		;[402]

PAU10L:	TLNN	T2,LGLOBL	;[402]IS THIS A PROGRAM NAME OR GLOBAL
	JRST	ERR19		;[402]NO SO DONT ALLOW
	MOVE	T2,(T2)		;[402] Get name
	CAMN	T2,[SIXBIT /ON/];[402] IF IT IS "ON" THEN
	AOS	ONFLG		;[325]   SET "PAUSE ON" FLAG
PAU10A:	MOVE	T2,1(T5)	;DOES THIS ROUTINE INVOKE THE 'HELLO' MACRO?
	CAMN	T2,HELLO	;YES IT DOES - STOP 2 ON
	ADDI	T5,2		;
	JRST	PAUS11

ONFLG:	Z			;[325] =1 IF "PAUSE ON"
COND0:	Z			;[116] LEFT = FLAGS;  RIGHT = # OF TEST
COND1:	Z			;SAVE ADDRESS OF FIRST ARGUMENT
COND2:	Z			;SAVES ADDRESS OF SECOND ARGUMENT
COND3:	Z			;SAVE VALUE OF CONSTANT IF DEFINED

NUMB:	TLOE	T0,CONS		;SET CONSTANT SEEN FLAG IF NOT ALREADY SET
	JRST	ERR14
	MOVEM	T5,COND3	;SAVE VALUE OF CONSTANT
	MOVEI	T5,COND3	;SAVE ADDRESS OF CONSTANT
	POPJ	P,


;	ROUTINE TO CHECK IF A FORTRAN FORMAT EXISTS AT
;	THE ADDRESS POINTED TO BY T5
;	RETURN 1   IF IT IS A FORMAT
;	RETURN 2   IF NOT A FORMAT

ONFORM:	LDB	P1,[POINT 7,(T5),6]
	CAIE	P1,"("		;[311] TRUE IF FIRST CHAR IS AN OPEN PAREN
	JRST	CPOPJ1		;NOT A FORMAT STATEMENT
	LDB	P1,[POINT 7,(T5),13] ;[311]
	CAIL	P1," "		;[311] IS IT LESS THAN A BLANK?
	POPJ	P,		;[311] NO, PROBABLY IS A FORMAT STATEMENT
	JRST	CPOPJ1		;[311] NOT FORMAT, CHAR IS A CNTRL CHAR
;	CONTINUE LOGIC


CONTIN:	MOVSI	T5,(JFCL)	;RESET THE TRACE ENTRY
	MOVEM	T5,FDDT.
	SKIPN	STARTU		;[316] Has START been done?
	 JRST	ERR4		;[316] No - Please type START
	SKIPE	T5,JOBOPC	;ARE WE IN A RE-ENTER CONDITION
	JRST	CONT2		;YES - DEAL WITH IT

	MOVEI	T5,[POPJ P,]	;POPJ P,  IS THE EXIT AFTER A 'NEXT'
	CAMN	T5,LEAV		;DID WE DO A 'NEXT' LAST TIME
	JRST	PROCED		;YES - DO NOT TAKE ARGS - RETURN WITH A POPJ

	JUMPL	T0,PROCED	;CONTINUE 1
	PUSHJ	P,EITHER	; NO - GET ARGUMENT
	   CAIA			;NUMBER TYPED
	   MOVE	T5,(T5)		;SYMBOL TYPED - GET CONTENTS
	JUMPL	T5,BADSYN	;DO NOT ALLOW NEGATIVE PROCEDE SETTINGS
	JRST	PROCDX		;SET UP A PROCEDE COUNT

CONT2:	MOVE	T5,JOBOPC	;GET THE CONTINUE P.C.
	MOVEM	T5,GOLOC	;PREPARE TO CONTINUE
	PUSHJ	P,RE.NTR	;ALLOW RE-ENTERS AGAIN
	PUSHJ	P,INSRTB	;PUT BACK PAUSES
	JSP	T5,RESTOR	;RESTORE USER ACS
	JRST	@GOLOC		;[300] DO AN OFFICIAL RE-ENTER, using JRST

;HELP code for using either external HELPER or an internal version
;depending on the value of EXTHLP (1 = use external HELPER, 0 =
;use internal HELPER).  WARNING: The current TOPS10 version of
;HELPER which uses memory above .JBFF for it's input buffers, will
;trash FOROTS' data areas.
;
;NOTE: All of the following help code unless otherwise noted is part
;      of edit [147].

IFN EXTHLP,<			;when using external HELPER
HELP:	MOVE	T1,[SIXBIT/FORDDT/]
	PUSHJ	P,.HELPR	;GIVE 'EM SOME REAL HELP
	JRST	RET		; AND RETURN
	>			;end IFN EXTHLP

;Starting IFE EXTHLP (internal help code).  TOPS-10 native
;help code.

IFE EXTHLP,<			;start internal help code

IFE TOPS20,<			;start -10 internal help code
	DSK=0			;INPUT CHANNEL FOR FORDDT.HLP

HELP:	PUSH	P,T0		;SAVE THE FLAGS

;Generate a home made buffer ring of two buffers and a buffer
;control block.  Use FOROTS' ALCOR and DECOR routines for
;allocating and deallocating the buffer space.

;Allocate the buffer space.

	MOVEI	T1,^D264	;ALLOCATE ENOUGH FOR TWO 128 WORD BUFFERS
	MOVEM	T1,ALCBLK+1	;PUT IT WHERE ALCOR WILL FIND IT
	MOVEI	L,ALCBLK	;POINT TO IT
	PUSHJ	P,ALCOR.##	;LET FOROTS DO IT'S THING
	SKIPG	T0		;A POSITIVE VALUE?
	JRST	ALCFAL		;NO, ALLOCATION FAILED
	MOVEM	T0,ALCBLK+1	;SAVE ADDR FOR DECOR

;Set up the buffer header blocks.

	AOS	T2,T0		;POINT TO 2ND WORD OF BUFFER HDR
	HRLZI	T1,^D129	;SIZE OF BUFFER+1
	HRR	T1,T2		;TACK ON ADDRESS OF 1ST BUFFER HDR+1
	MOVEM	T1,^D131(T2)	;PUT IT IN WORD 2 OF 2ND BUFFER HDR
	ADDI	T1,^D131	;ADDR OF 2ND BUFFER HDR+1
	MOVEM	T1,(T2)		;PUT IT IN WORD 2 OF 1ST BUFFER HDR

;Try to find the help file.

	SETZB	T2,T5		;SET UP A COUNTER AND ZERO T2

GETHLP:	SKIPA	T3,['HLP   ']	;GET HLP:
GETSYS:	MOVSI	T3,'SYS'	;OR GET SYS:
	MOVEI	T4,HLPCTB	;ADDRESS OF BUFFER CONTROL BLOCK
	OPEN	DSK,T2		;OPEN THE DEVICE CHANNEL
	  JRST	HLPNHF		;LOSE...

	MOVE	T1,[EXP BF.VBR]	;SET UP THE BUFFER CONTROL BLOCK
	MOVEM	T1,HLPCTB	;SIGNIFY VIRGIN BUFFER
	HRRM	T0,HLPCTB	;GIVE ADDRESS OF 2ND WORD OF 1ST BUFFER
	SETZM	HLPCTB+1	;ZERO NEXT TWO LOCATIONS
	SETZM	HLPCTB+2

	MOVE	T1,[SIXBIT/FORDDT/] ;FILE NAME
	MOVSI	T2,'HLP'	;EXTENSION
	SETZB	T3,T4		;ZERO NEXT TWO
	LOOKUP	DSK,T1		;LOOKUP FORDDT.HLP
	  TLZA	T2,-1		;CLEAR JUNK, WE BLEW IT
	JRST	NXTBUF		;GOOD--GO READ FILE
	CAIE	T2,ERSNF%	;SFD NOT FOUND?
	CAIN	T2,ERSLE%	;SEARCH LIST EMPTY?
	JRST	NXTSTR		;ONE OF THE ABOVE
	CAILE	T2,ERIPP%	;INCORRECT PPN OR FILE NOT FOUND?
	JRST	HLPNHF		;HORRIBLE DISK ERROR
NXTSTR:	SETZM	T2		;CLEAR PHYSICAL BIT
	AOS	T5		;TRY NEXT CASE
	TRNE	T5,1		;SEE IF ODD
	TXO	T2,UU.PHS	;YES--TRY PHYSICAL ONLY
	JRST	@[GETHLP	;TRY HLP: AGAIN
		  GETSYS	;THEN LOGICAL SYS:
		  GETSYS	;THEN PHYSICAL SYS:
		  HLPNHF]-1(T5) ;THEN GIVE UP

NXTBUF:	IN	DSK,		;GET A BUFFER
	  JRST	OUTBUFF		;OUTPUT THE BUFFER
	STATZ	DSK,IO.ERR	;SEE IF ERRORS
	  JRST	HLPIOE		;YES--ISSUE MESSAGE
	STATZ	DSK,IO.EOF	;DONE YET?
	  JRST	HLPDON		;YES

OUTBUF:	HRRZ	T1,HLPCTB+1	;POINT TO 1ST DATA LOC IN BUFFER
	AOS	T1		;         ''
	OUTSTR	@T1		;OUTPUT THE BUFFER
	JRST	NXTBUF		;GO GET THE NEXT

ALCFAL:	OUTSTR	[ASCIZ	/%FDTCAB Cannot allocate buffer for help file/]
	JRST	HLPRET

HLPIOE:	OUTSTR	[ASCIZ	\%FDTIOE I/O error reading help file\]
	SKIPA
HLPNHF:	OUTSTR	[ASCIZ	/%FDTNHF Cannot find help file/]
	OUTSTR	[ASCIZ	/; I'm sorry, I can't help you/]

HLPDON:	RELEAS	DSK,		;RELEASE DISK CHANNEL
	MOVEI	L,ALCBLK	;NEED TO DEALLOCATE BUFFER SPACE
	PUSHJ	P,DECOR.##	;DO IT
HLPRET:	OUTSTR	CRLF
	POP	P,T0		;RESTORE FLAGS
	JRST	RET		;ALL DONE

HLPCTB:	BLOCK	3
	>			;end IFE TOPS20 (-10 internal help code)

;Continuing IFE EXTHLP (internal help code).  TOPS-20 native
;help code.

IFN TOPS20,<			;start -20 internal help code

HELP:	PUSH	P,T0		;SAVE THE FLAGS

;Use FOROTS' ALCOR and DECOR routines for
;allocating and deallocating the buffer space.

	MOVEI	T1,^D128	;ALLOCATE ONE BLOCK FOR THE FILE
	MOVEM	T1,ALCBLK+1	;PUT IT WHERE ALCOR WILL FIND IT
	XMOVEI	L,ALCBLK	;[300] POINT TO IT
	PUSHJ	P,ALCOR.##	;LET FOROTS DO IT'S THING
	SKIPG	T0		;A POSITIVE VALUE?
	JRST	ALCFAL		;NO, ALLOCATION FAILED
	MOVEM	T0,ALCBLK+1	;SAVE ADDR FOR DECOR
	TLO	T0,(61B5)	;[302] Make it a OWGBP
	MOVEM	T0,ALCPTR	;[302] Remember it

	MOVEI	T3,4		;NUMBER OF ATTEMPTS AT FINDING FILE
GETHLP:	MOVE	T4,[POINT 7,[ASCIZ/HLP:/]] ;GET THE HLP: POINTER
	MOVEM	T4,GTJBLK+2	;PUT IT IN THE GTJFN BLOCK
	JRST	GETIT
GETSYS:	MOVE	T4,[POINT 7,[ASCIZ/SYS:/]] ;GET THE SYS: POINTER
	MOVEM	T4,GTJBLK+2	;PUT IT IN THE GTJFN BLOCK
GETIT:	HRROI	T2,FILENM	;GET POINTER TO 'FORDDT'
	MOVEI	T1,GTJBLK	;LONG FORM GTJFN BLOCK
	GTJFN%			;GET FORDDT.HLP
	  JRST	NXTSTR		;LOSE TEMPORARILY
	HRRM	T1,JFN		;SAVE THE JFN
	MOVE	T2,[FLD(7,OF%BSZ)!OF%RD] ;BYTE SIZE OF 7 AND READ ONLY
	OPENF%			;OPEN THE FILE FOR READ ACCESS
	  JRST	HLPIOE		;SOMETHING WEIRD HAPPENED

PRINT:	MOVE	T1,JFN		;GET JFN
	MOVE	T2,ALCPTR	;[302] POINTER FOR TEXT BUFFER
	MOVEI	T3,^D639	;HELP TEXT BUFFER SIZE IN CHARS (128*5-1)
	SIN%			;FILL THE BUFFER
	  ERJMP	HLPDON		;DON'T CARE ABOUT THIS ERROR
	SETZ	T1,		;NEED A ZERO BYTE
	IDPB	T1,T2		;MAKE SURE ZERO THE LAST BYTE
	MOVE	T1,ALCPTR	;[302] POINT TO BUFFER
	PSOUT%			;OUTPUT ASCIZ STRING
	JRST	PRINT		;IF THERE'S MORE, GO GET IT

NXTSTR:	MOVE	T4,GTJBLK	;GET THE FLAGS
	TXOE	T4,GJ%PHY	;TURN ON PHYSICAL DEVICE BIT
	TXZ	T4,GJ%PHY	;CLEAR PHYSICAL BIT
	MOVEM	T4,GTJBLK	;PUT IT BACK IN GTJFN BLOCK
	SOJLE	T3,HLPNHF	;SEE IF ANY DEVICES LEFT
	CAIG	T3,2		;TIME TO TRY SYS:?
	JRST	GETSYS		;YES, USE SYS:
	JRST	GETHLP		;NO, USE HLP:

HLPDON:	SETZ	T1,		;NEED A ZERO BYTE
	IDPB	T1,T2		;MAKE SURE ZERO THE LAST BYTE
	MOVE	T1,ALCPTR	;[302] POINT TO BUFFER
	PSOUT%			;OUTPUT ASCIZ STRING
	HRROI	T1,CRLF		;OUTPUT CRLF
	PSOUT%
	MOVE	T1,JFN
	CLOSF%			;GET RID OF THE JFN
	  JFCL			;NOT LIKELY
	JRST	HLPRET		;AND RETURN

HLPIOE:	MOVE	T1,JFN		;WE STILL HAVE TO RELEASE THE JFN
	CLOSF%
	  JFCL			;NOT LIKELY
	HRROI	T1,[ASCIZ/%FDTEOH Error opening help file/]
	SKIPA
HLPNHF:	HRROI	T1,[ASCIZ /%FDTNHF Cannot find help file/]
	PSOUT%
	HRROI	T1,[ASCIZ/; I'm sorry I can't help you/]	
	PSOUT%
	HRROI	T1,CRLF
	PSOUT%

HLPRET:	XMOVEI	L,ALCBLK	;[300] NEED TO DEALLOCATE BUFFER SPACE
	PUSHJ	P,DECOR.##	;DO IT
	POP	P,T0		;RESTORE FLAGS
	JRST	RET		;ALL DONE

ALCFAL:	HRROI	T1,[ASCIZ/%FDTCAB Cannot allocate buffer for help file/]
	PSOUT%
	HRROI	T1,CRLF
	PSOUT%
	POP	P,T0		;RESTORE FLAGS
	JRST	RET		;ALL DONE

FILENM:	ASCIZ	/FORDDT/
JFN:	0
GTJBLK: GJ%OLD			;FLAGS
	.NULIO,,.NULIO
	POINT	7,[ASCIZ/HLP:/]	;POINTER TO DEVICE
	0
	0
	POINT	7,[ASCIZ/HLP/]	;POINTER TO EXTENSION
	0
	0
	0

ALCPTR:	BLOCK 1			;[302] OWGBP to allocated buffer
	>			;end IFN TOPS20 (internal -20 help code)

	-1,,0			;NUMBER OF ARGUMENTS TO ALCOR
ALCBLK:	IFIW ALCBLK+1		;[302] POINTER TO ARGUMENT
	BLOCK	1		;NUMBER OF WORDS NEEDED

	>			;end IFE EXTHLP (internal help code)

;	REMOVE LOGIC

RESET:	JUMPL	T0,RESET5	;'RESET' - RESET ALL PAUSES
	TRO	T1,FGLONL	;FIND GLOBAL ONLY IF NOT LABEL
	PUSHJ	P,SYMIN		; NO - MUST BE ANOTHER SYMBOL TO FOLLOW
	  JRST	[CAME T3,[SIXBIT/ON/]
		JRST  ERR6
		JRST  .+1]	;[332]
	  JFCL			;STATEMENT #
RESET6:	MOVEM	T3,TEM11	;[340] SAVE T3
	MOVE	T3,SYMSAV	;[332]

	TRNE	T1,LNAME	;[402]Short symbols?
	 JRST	REST6L		;[402]No
	
	TLZ	T3,PNAME	;[332]
	CAME	T3,[SQUOZE 0,ON];[332] IS IT A "REMOVE ON"
	SKIPL	TERMK		;[332] DID WE GET A LINE TERMINATOR?
	JRST	RSET3		;[332] YES, CAN'T BE PAUSE ON ERRROR
	JRST	REST6A		;[402]
REST6L:	MOVE	T3,(T3)		;[402] Get ptr to name
	MOVE	T3,(T3)		;[402] Get name
	CAMN	T3,[SIXBIT /ON/];[402] IF IT IS "ON" THEN
	SKIPL	TERMK		;[332] DID WE GET A LINE TERMINATOR?
	JRST	RSET3		;[332] YES, CAN'T BE PAUSE ON ERRROR

REST6A:
	PUSHJ	P,TTYIN		;[332] GET SIXBIT USER INPUT
	JUMPN	T2,BADSYN	;[332]
	CAMN	T3,[SIXBIT /ERROR/];[332] IS IT 'REMOVE ON ERROR'?
	JRST	RESET1		;[332] REMOVE ON ERROR
	CAME	T3,[SIXBIT/ERR/];[332] 
	JRST	ERR6		;[332] "REMOVE ON" FOLLOWED BY JUNK
RESET1:	SKIPGE	TERMK		;[332] DID WE GET A LINE TERMINATOR?
	PUSHJ	P,CLRLIN	;[332] "REMOVE ON ERROR" FOLLOWED BY JUNK
	HRRZI	T0,FO$GBA	;[332] HAVE FOROTS RETURN BREAK ADDRESS
	PUSHJ	P,FOROP.	;[332]   IN T0			
	SETZM	@T0		;[332] CLEAR "REMOVE ON ERROR"
	JRST	RET		;[332]	
RSET3:	MOVEI	T2,B1ADR	;[402] LOOK THRO PAUSE POINTS FOR THE RIGHT ONE
RESET3:	MOVE	T3,TEM11	;[340] RESTORE T3, WAS NOT ERROR PAUSE
	HRRZ	T4,(T2)		;GET THE PAUSE CONTENTS
	CAIN	T4,(T5)		;IS THIS IT?
	JRST	RESET2		; YES - REMOVE IT!

	ADDI	T2,3		; NO  - TRY ANOTHER
	CAIG	T2,BNADR	;TRIED ALL POINTS YET?
	JRST	RESET3		; NO - FIND THE NEXT

	JRST	ERR17		;NO - NOT AN ARRAY NAME -  YOU LOSE

RESET2:	MOVE	T4,1(T5)	;DOES THIS ROUTINE USE THE HELLO MACRO
	CAMN	T4,HELLO
	ADDI	T5,1		;YES IT DOES - SO STOP 2 ON
	ADDI	T5,1		;STOP 1 ON FOR NORMAL ROUTINES
	CLEARM	(T2)		;CLEAR LOCATION OF PAUSE
	CLEARM	1(T2)		;CLEAR CONDITIONAL CLAUSE
	CLEARM	2(T2)		;CLEAR PROCEDE COUNT
	JRST	RET		;REMOVED!

RESET5:	CAME	T3,[SIXBIT/REMOVE/] ;DO NOT ALLOW ABREVIATIONS OF REMOVE
	JRST	BADSYN		;THIS ANNOYS MANY USERS
	HRRZI	T0,FO$GBA	;[332] HAVE FOROTS RETURN BREAK ADDRESS
	PUSHJ	P,FOROP.	;[332]   IN T0			
	SETZM	@T0		;[332] CLEAR "PAUSE ON ERROR"
	PJRST	BPS		;RESET ALL PAUSES
;	ACCEPT LOGIC	= ACCEPT NAME/X #

ACCEPT:	JUMPL	T0,BADSYN	;ACCEPT ALONE IS MEANINGLESS!
	SETZM	ARGVAL+1	;CLEAR IN CASE LONG INPUT
	SKIPN	ESCAPE		;ESCAPE TO FOROTS?
	JRST	ERR30		;SORRY
	PUSHJ	P,CHKIWI	;[211] RECURSIVE IO IF WE CALL THE OTS?
	 JRST	ERRIWI		;[211] YES, TELL AND RETURN TO COMMAND LOOP.
	TRO	T1,ACCPT	;ACCEPT IN PROGRESS
	CLEARM	CLMOFF		;[401]
	CLEARM	CLMRNG		;[401]
	CLEARM	SSLOW		;[401]ZERO THE LOWER SUBSTRING BOUND
	CLEARM	SSUP		;[401]ZERO THE UPPER SUBSTRING BOUND
	PUSHJ	P,SYMIN		;GET USERS SYMBOL
	  JRST	ERR6		;SORRY - WE DONT HAVE IT!
	  JRST	ACC2		;STATEMENT # = FORMAT
	MOVEM	T5,TEM2		;STORE FOR UPDATE
;[157]***For character, T5/TEM2=descriptor of array base=SAVLOC
	TRNE	T1,IMPRNG	;IS THIS AN IMPLIED RANGE?
	PUSHJ	P,DISP14	;YES SETUP RANLIM/RANGE IN CASE OF A RANGE
	MOVE	T5,SYMSAV	;GET THE SYMBOL POINTER
	HLRZ	T5,(T5)		;GET RADIX 50 FORM AND FLAGS
	TRNN	T1,LNAME	;[402] if it is not long name - check if local
	JRST	[TRNN	T5,LOCAL;[402]ALLOW ONLY LOCAL VARIABLES TO CHANGE
		JRST	ERR24	;YOU LOOSE
		JRST 	.+1]	;[402]
	MOVE	T2,LSTCHR	;RESTORE USERS LAST CHARACTER

;	HERE HAVING READ A GOOD VARIABLE	= ACCEPT NAME/

	SKIPL	TERMK		;END OF LINE SEEN?
	JRST	BADSYN		;YES - BAD NEWS
	JUMPE	T2,ACCF		;SPACE DELIMITER ASSUMES REAL TO FOLLOW
	CAIN	T2,"="		;ALLOW = AS DELIMITER
	JRST	ACCF
	CAIN	T2,"-"		;A - MEANS A RANGE OF VALUES TO SET
	JRST	ACC23		;
	CAIE	T2,"/"		; WE EXPECT ONLY / FROM NOW ON
	JRST	BADSYN		;ANYTHING ELSE LOOSES
	SETZM	TEM		;[323] No switches yet

ACC22:	PUSH	P,T1		;[402] Save long name flag
	PUSHJ	P,TTYIN		;READ ARGUMENT TYPE REQUIRED BY USER
	POP	P,T1		;[402] Restore long name flag
	JUMPE	T3,BADSYN	;NO CHARACTERS - BAD
	LDB	T5,[POINT 6,T3,5];GET 1ST. CHARACTER TO IDENTIFT ARG TYPE
	CAIE	T5,'B'		;[323] BIG SWITCH ?
	 TRZA	P3,777777-B.	;[323] No - Remove all but 'B'
	TROA	P3,B.		;[120] YES - SET IT AND LOOK FOR ANOTHER SWITCH
	 MOVEM	T5,TEM		;[323] NOT 'BIG', SAVE SWITCH IN CASE B FOLLOWS
	JUMPE	T2,ACC21	;NOTHING FOLLOWS
	CAIN	T2,"="		; ALLOW = AS DELIMITER
	JRST	ACC21		;PROCESS FORMAT
	CAIE	T2,"/"		;ANOTHER SWITCH ?
	JRST	BADSYN		;NO - ONLY / ALLOWED
	JRST	ACC22		;PROCESS ANOTHER SWITCH
;	HERE HAVING READ ALL THE MODE SWITCHES
;[120]	THE LAST SWITCH TAKES PRIORITY (/F/D/C/I/O/A/R/L) /B ALLOWED
;	ACCEPT NAME/B/I
;[156]	We now check to see whether input is /BIG/ASCII into a range
;	of double-precision array elements. If so, RANGE must be
;	incremented to the address of the second word of the last
;	element, in order for the end-of-range check at ACC14 to
;	be valid. (we were losing the second word of the last element).

ACC21:	SKIPL	TERMK		;[200] ALREADY AT EOL?
	 JRST	BADSYN		;[200] YES: BAD COMMAND SYNTAX
	SKIPN	T5,TEM		;[323] Get current mode flags
	 MOVEI	T5,'F'		;[323] Default is 'F'
	SKIPE	RANGE		;[156]looking for a range?
	 JRST	ACC21A		;[156]YES
	SETZM	CLMRNG		;[163]In case character
	JRST	ACC21B		;[163]Go get input
ACC21A:	TRNE	P3,B.		;[323]/BIG?
	 TRNN	T0,DOUBLE	;[306]and double precision?
	  JRST	ACC21B		;[156]NO
	CAIE	T5,'A'		;[156]ASCII?
	 CAIN	T5,'R'		;[156]or RASCII?
	  AOS	RANGE		;[156]YES. Don't lose second word

ACC21B:	CAIN	T5,'S'		;SYMBOLIC?
	JRST	ACCS		;DO SYMBOL INPUT
	CAIN	T5,'A'		;ASCII?
	JRST	ACCA		;PROCESS ASCII
	CAIN	T5,'R'		;RASCII?
	JRST	RASCII		;PROCESS RIGHT JUSTIFIED ASCII
	CAIN	T5,'O'		;OCTAL?
	JRST	ACCO		;PROCESS OCTAL
	CAIN	T5,'C'		;[157]Character?
	JRST	ACCC		;[157] YES. Process string
	TRZ	P3,B.		;[323] IGNORE /BIG FOR THE REST
	CAIN	T5,'F'		;FLOATING?
	JRST	ACCF		;PROCESS A FLOATING INPUT
	CAIN	T5,'D'		;REAL*8?
	JRST	ACCD		;PROCESS REAL*8
	CAIN	T5,'I'		;INTEGER?
	JRST	ACCI		;PROCESS INTEGER INPUT
	CAIN	T5,'X'		;[157]COMPLEX?
	JRST	ACCX		;[157]PROCESS COMPLEX INPUT
	CAIN	T5,'L'		;[120] LOGICAL?
	JRST	ACCL		;[120] PROCESS LOGICAL INPUT
	JRST	BADSYN		;NO OTHER TYPES SUPPORTED
;	ACCEPT A RANGE PROCESSING	= ACCEPT NAME(X)-

ACC23:	MOVE	T5,TEM2		;SAVE THE FIRST VALUE SOMEWHERE SAFE
	MOVEM	T5,RANGE	;SAVE THE FIRST VALUE OF A RANGE
	MOVE	T5,CLMOFF	;[157]Get beginning offset
	MOVEM	T5,CLMRNG	;[157]Save it in case this is /C
	TLZ	T0,GRPFL	;MAKE SURE WE DONT DO GROUP LOGIC
				;OR ACCEPT ANY PRINT MODIFIERS
	MOVE	T5,MATHSM	;[403]SAVE CURRENT SYMBOL
	MOVEM	T5,TEM10	;[403]
	PUSHJ	P,SYMIN		;GET THE NEXT VALUE
	  JRST	ERR6		;DOSNT EXIST
	  JRST	BADSYN		;NUMERICS????
	MOVE	T4,TEM10	;[403]GET FIRST SYMBOL BACK
	CAME	T4,MATHSM	;ARE THEY THE SAME
	JRST	ERR40		;NO - SORRY
	TRNN	T0,CHARS	;[157]Character?
	 JRST	CKRANG		;[157]NO
;	clmrng=first offset given
;	clmoff=offset just received
	MOVE	T2,CLMOFF	;[157]Get the lower offset
	CAMLE	T2,CLMRNG	;[157]Is lower .le. upper?
	 EXCH	T2,CLMRNG	;[157]NO. Make it so
	MOVEM	T2,CLMOFF	;[157]Restore lower offset
	MOVE	T5,SAVLOC	;[157]Restore sym
	JRST	ACCONT		;[157]And continue
CKRANG:	CAML	T5,RANGE	;SORT OUT THE RANGE ORDER
	EXCH	T5,RANGE	;WRONG WAY ROUND
	MOVEM	T5,TEM2		;LOWER VALIUE IN RANLIM, HI IN RANGE
ACCONT:	PUSHJ	P,EVAL		;GET SYMBOL IN SYMSAV
	 JFCL
	MOVE	T5,SYMSAV	;GET THE SYMBOL POINTER
	HLRZ	T5,(T5)		;GET SYMBOL FLAGS
	TRNN	T5,LOCAL	;MODIFY LOCALS ONLY
	JRST	ERR24		;NOT ALLOWED
	MOVE	T2,LSTCHR	;RESTORE USERS LAST CHARACTER
	CAIN	T2,"/"		;MAYBE FORMAT SPECIFIER
	JRST	ACC22		;YES - GO FIND THEM
	SKIPGE	TERMK		;[200] EOL ALREADY?
	JUMPE	T2,ACCF		;[200] NO. SPACE IMPLIES REAL*4
	JRST	BADSYN		;DONT ACCEPT ANYTHING ELSE HERE
;	*** FLOATING INPUT ***

ACCF:	TRO	P3,F.		;[323] DISPLAY TO USER AS FLOATING
	MOVEI	T3,4		;ARG TYPE REAL FOR FOROTS
	PUSHJ	P,FORINP	;YES - ASK FOROTS FOR INPUT

;	HERE TO PLACE ALL ACCEPTED VALUES

ACC10:	MOVE	T5,ARGVAL	;LETS SEE WHAT FOROTS HAS BEEN UP TO
ACC13:	EXCH	T5,TEM2		;[163]Save input value
	PUSHJ	P,CKWRIT	;[163]Validity check
	EXCH	T5,TEM2		;[163]Regain value	
	MOVEM	T5,@TEM2	;PLACE VALUE WHERE USER REQUESTED
	MOVEM	T5,ARGVAL	;SOME PRINT OPTIONS NEED THIS
	AOS	T2,TEM2		;NEXT ARRAY LOCATION
	TRNN	P3,X.!B.!D.	;[323] IF EITHER COMPLEX REAL*8 OR BIG OR -
	TRNE	T0,DOUBLE	;[112] WE HAVE A DOUBLE WORD ARRAY?
	CAIA			;THEN WE PLACE TWO ARGUMENTS
	JRST	ACC14		;IF NOT THEN CHECK THE RANGE CONDITION
	TRO	T0,SILENT	;QUIET
	PUSH	P,MATHSM	;SAVE CURRENT SYMBOL
	PUSH	P,T1		;[402] Save long name flag in T1 for symbol
	MOVE	T5,[SQUOZE 0,.VEND] ;END OF VARIABLE AREA
	MOVEM	T5,MATHSM	;ONLY ACCEPTABLE SYMBOL
	MOVE	T5,TEM2		;GET DESTINATION;T=dest addr
	PUSHJ	P,CKWRIT	;[163]Validity check; return if OK
	PUSHJ	P,LOOK		;FIND A SYMBOL FOR IT
	  JFCL			;NONE-OK
	  JRST	ACC13A		;[402]OFFSET - OK
	POP	P,T1		;[402]
	POP	P,T5		;[402]
	JRST	ERR35		;YES - ERROR
ACC13A:	POP	P,T1		;[402]
	POP	P,T5
	STSYM	T5,MATHSM	;[402]RESTORE CURRENT SYMBOL
	MOVE	T5,ARGVAL+1	;GET THE 2ND WORD
	MOVEM	T5,@TEM2	; - AND PLACE IN NEXT LOCATION
	AOS	T2,TEM2		;YES - SO NEXT DOUBLE WORD
ACC14:	SKIPN	RANGE		;ACCEPT A RANGE ?
	JRST	ACCPUT		;NO - UNLESS IMPLIED
	TRNE	P3,A.		;[323] SPECIAL TREATMENT FOR ASCII ARRAYS
	JRST	[CAMG	T2,RANGE ;END OF ARRAY?
		 JRST	ACC12	;GET SOME MORE
		 JRST	RET	] ;QUIT
	CAMG	T2,RANGE	;ALL DONE ?
	JRST	ACC10		;NO - KEEP GOING
	JRST	RET		;ALL OVER

;	VARIABLE 'ACCEPT'ED - NOW CONFIRM TO USER

ACCPUT:	SOS	T5,TEM2		;REMOVE OFFSET FROM ACC13
ACPUT1:	SETZM	TERMK		;PREPARE FOR -
	SETZM	RANGE		;  INPUT CONFIRMATION
	TRZN	T0,DOUBLE	;CHECK FOR ANY -
	TRNE	P3,X.!B.!D.	;[323] DOUBLE WORD WORKING
	SOS	T5,TEM2		;    AND IF SO CORRECT BASE ADDRESS
	PUSHJ	P,DISP10	;AND LET HIM SEE HIS EFFORTS
	JRST	RET		;END OF ACCEPT
	PUSHJ	P,GETNUM	;GENERAL GET NUMBER ROUTINE
	JRST	ACC13		;STORE FOR USER
;	*** DOUBLE PRECISION INPUT ***

ACCD:	TRO	P3,D.		;[323] DISPLAY TO USER AS REAL*8
	MOVEI	T3,TP%DPR	;[137]Set up for default D-float arg type=10
	TRNE	T0,GFLOAT	;[137]If D-float, skip to FOROTS call.
	MOVEI	T3,TP%DPX	;[137] else, we have G-float, set arg type=13
	PUSHJ	P,FORINP	;REQUEST INPUT
	JRST	ACC10		;PLACE FINAL ARG


;	*** INTEGER INPUT ***

ACCI:	TRO	P3,I.		;[323] DISPLAY TO USER AS INTEGER
	MOVEI	T3,2		;GET ARG TYPE INTEGER FOR FOROTS
	PUSHJ	P,FORINP	;GO TO FOROTS
	JRST	ACC10		;PLACE ARG FOR USER

;	*** COMPLEX INPUT ***

ACCX:	TRO	P3,X.!B.	;[323] DISPLAY TO USER AS VCOMPLEX
ACC11:	PUSHJ	P,GETSKB	;GET SIGNIFIGANT CHARACTER
	CAIE	T2,"("		;MAKE SURE ITS A (
	JRST	ERR32		; ( REQUIRED
	MOVE	T5,[401200,,ARGVAL+1]  ;[300] WHERE TO PUT IMAGINARY OF COMPLEX
	MOVEM	T5,M2.I		;SET UP THE FORMAT
	MOVEI	T3,4		;SET UP FOR TYPE REAL INPUT
	PUSHJ	P,FORINP	;LET FOROTS GET THE REAL PART
	MOVE	T5,M2.F		;RECOVER THE FIN CALL
	MOVEM	T5,M2.I		;AND REMOVE THE COMPLEX SETTING
	JRST	ACC10		;GO PLACE THE RESULTS

;	*** SYMBOLIC INPUT ***

ACCS:	TRNE	P3,B.		;[323] IF 'BIG' SET THEN
	 TROA	P3,X.		;[330] DISPLAY TO USER AS TWO REAL*4
	HLRS	P3		;[330] OTHERWISE USE CURRENT DEFAULT
	MOVE	T5,MATHSM	;[403]SAVE MATHSM
	MOVEM	T5,TEM10	;[403]
	MOVE	T5,SAVLOC	;[403]SAVE SAVLOC AROUND CALL
	MOVEM	T5,TEM11	;[403]
	PUSHJ	P,SYMIN		;GET A USER SYMBOL
	  JRST	ERR6		;CAN'T FIND IT!
	  JRST	BADSYN		;DONT GIVE ME STATEMENT #
	MOVE	T2,TEM11	;[403]
	MOVEM	T2,SAVLOC	;[403]RESTORE SAVLOC
	MOVE	T2,TEM10	;[403]
	MOVEM	T2,MATHSM	;[403]RESTORE
	MOVE	T2,(T5)		;I'LL ACCEPT THAT ONE
	MOVEM	T2,ARGVAL	;SAVE THE FIRST WORD VALUE
	TRNN	P3,B.		;[323] DOUBLE WORD WORKING?
	JRST	ACC10		;NO JUST PLACE SINGLE VALUE
	MOVE	T5,1(T5)	;GET SECOND VALUE
	MOVEM	T5,ARGVAL+1	;STORE THAT
	JRST	ACC10		;   AND EVEN STORE IT
;	*** ASCII INPUT RIGHT JUSTIFIED ***

RASCII:	TRO	P3,R.		;[323] DISPLAY TO USER AS RASCII
	JRST	ACC1		;DO ASCII INPUT TO T


;[120]	** LOGICAL INPUT **

ACCL:	TRO	P3,L.		;[323] DISPLAY TO USER AS LOGICAL
	MOVE	T2,[POPJ P,]	;[120] HOW WE WANT TO RETURN FROM LOGICL
	MOVEM	T2,DONE		;[120]
	TRO	T1,LGCLEG	;[120] LET 'EM WE'RE EXPECTING A LOGICAL
	PUSHJ	P,GETSKB	;[120] GET NEXT CHAR.
	CAIE	T2,"."		;[120] DOES IT START WITH A "."?
	JRST	ERR7		;[120] NO GOOD.
	PUSHJ	P,LOADCH	;[120] GET THE NEXT CHAR.
	PUSHJ	P,LOGICL	;[120] AND LET LOGICL HANDLE THE REST
	JRST	ACC13		;[120] SAVE THE RESULTS


;	*** ASCII INPUT ***

ACCA:	TRO	P3,A.		;[323] DISPLAY TO USER AS ASCII
	MOVE	T5,[ASCII .     .] ;BLANK SECOND WORD FOR POSSIBLE
	MOVEM	T5,ARGVAL+1	;LONG OR DOUBLE
	SKIPN	RANGE		;[120] IGNORE /BIG IF ACCEPTING LONG ASCII
	JRST	ACC1		;OK IF NOT A RANGE
	TRZ	P3,B.		;[323] CLEAR /B FLAG
	TRZ	T0,DOUBLE	;CLEAR DOUBLE
ACC1:	SKIPE	SSLOW		;[400]ASSIGNING INTO SUBSTRING
	JRST	ERR42		;[400]DON'T LET USER - IT WILL MESS UP BYTEPTR
	PUSHJ	P,GETSKB	;GETA SIGNIFICANT USER CHARACTER
	SKIPL	TERMK		;EOL?
	JRST	BADSYN		;YES - SYNTAX ERROR
	MOVEI	P1,(T2)		;SAVE IN T3
ACC12:	SETZM	ARGVAL		;CLEAR FOR DOUBLE LENGTH ASCII
	TRZE	T1,ADELIM	; IF SET WE CLEAR THE REST OF THE ARRAY
	JRST	ACCA2		;
ACC24:	MOVE	T5,[ASCII .     .]	;T BUILDS ASCII INPUT
	TRNE	P3,R.		;[323] BUILD WITH ZERO IF RASCII
	SETZI	T5,
	MOVE	P2,[POINT 7,T5]	;STORES BYTES IN T5
ACC15:	pushj	p,loadch	;NEXT ASCII CHARACTER
	CAIN	T2,(P1)		;TEXT DELIMITER FOUND?
	JRST	ACC18		;YES - CHECK FOR A SECOND
	TRZE	T1,ADELIM	;WAS THE LAST CHARACTER OUR DELIMITER
	JRST	[PUSH P,T2	;YES
		 MOVE T2,[pushj p,loadch] ;FOR GETSKB
		 MOVEM	T2,GETCHR
		 POP	P,T2
		 PUSHJ	P,GETSK2 ;CHECK FOR COMMENT
		 PUSHJ P,CLRLIN	; WIND UP
		 JRST	ACC17]
ACC19:	IDPB	T2,P2		;SAVE USERS TEXT
	TLNE	P2,760000	;FILLED T?
	JRST	ACC15		;NO - TAKE MORE

	CAIA			;DONT CONFUSE THE INDEFINATE ACCEPT
ACC17:	TRO	T1,ADELIM	;SET TO CLEAR REST OF ARRAY IF IN A RANGE
	TRNE	T0,DOUBLE	;TEST FOR ANY DOUBLE WORD -
	JRST	ACC2WD		;  WORKING -
	TRNN	P3,B.		;[323] IMPLIED BY REAL*8 OR B.
	JRST	ACC20		;STORE FINAL SINGLE VALUE IN T5
;	DOUBLE WORD WORKING

ACC2WD:	SKIPN	ARGVAL		;IS THE FIRST VALUE STOREF?
	JRST	ACC3WD		;NO
	MOVEM	T5,ARGVAL+1	;YES STORE SECOND
	JRST	ACC25		;PLACE BOTH VALUES
ACC3WD:	MOVEM	T5,ARGVAL	;HOLD FIRST OF PAIR
	TRNN	T1,ADELIM	;ANY MORE TO COME
	JRST	ACC24		;YES - GO FIND IT
ACC25:	HRRZM	P1,DELCHR	;SAVE DELIMITER FOR CLRLIN
	PUSHJ	P,CLRLIN	;CLEAR REST OF LINE
	TRNN	P3,R.		;[323] ARE WE ACCEPTING RIGHT JUSTIFIED TEXT
	JRST	ACC10		;RELAX JUST ASCII
	MOVE	T2,ARGVAL	;GET BACK THE DOUBLE WORD
	JUMPE	T2,ACC10	;NO TEXT?????
	MOVE	T3,ARGVAL+1	;INTO A LONG SHIFT FORM
	LSH	T2,-1		;FIRST MAKE A CONTINUOUS STRING OF TEXT
	LSHC	T2,-1		;GET READY FOR 7BIT CHARACTER SHIFTS
ACC27:	LDB	T4,[POINT 7,T3,35]
	JUMPN	T4,ACC26	;TEST FOR SUCCESSFUL RIGHT JUSTIFICATION
	LSHC	T2,-7		;NOT YET MOVE DOWN
	JRST	ACC27		;TRY AGAIN
ACC26:	LSH	T2,1		;ASCII-ISE
	TLZE	T3,400000	;SHOULD THERE BE A LOWER BIT FOR T2
	TRO	T2,1		;YES - PUT IT IN
	MOVEM	T2,ARGVAL	;STORE TOP VALUE
	MOVEM	T3,ARGVAL+1	;AND FINALLY LAST VALUE
	JRST	ACC10		;AND GIVE THEM TO THE USER

ACC18:	TRON	T1,ADELIM	;FLAG THIS AS OUR DELIMITER
	JRST	ACC15		;SEE IF NEXT CHARACTER IS SAME
	TRZ	T1,ADELIM	;YES IT IS -
	JRST	ACC19		;PASS ON JUST ONE

ACCA2:	TRZ	P3,A.!R.	;[323] REMOVE THE TEXT FLAGS
	MOVE	T5,[ASCII .     .] ;FILL THE REST OF THE ARRAY
	MOVEM	T5,ARGVAL	;WITH SPACES
	MOVEM	T5,ARGVAL+1
	JRST	ACC13


;	FINISHED TEXT INPUT

ACC20:	HRRZM	P1,DELCHR	;SAVE DELIMITER FOR CLRLIN
	SKIPN	RANGE		;IF NOT IN A RANGE SETTING -
	PUSHJ	P,CLRLIN	;THEN CLEAR THE REST OF THE USER INPUT
	TRNN	P3,R.		;[323] LEFT OR RIGHT JUSTIFY
	JRST	ACC13		;LEFT
	LDB	T2,[POINT 6,P2,5] ;RIGHT - GET THE T4 POINTER RESIDUE
	SETCA	T2,		;RIGHT SHIFT
	LSH	T5,1(T2)	; NOW
	JRST	ACC13		;NOW PLACE TEXT

;	*** CHARACTER STRING INPUT ***		;[157]

ACCC:				;[157]
	TRO	P3,C.		;[323]Display to user properly
	PUSHJ	P,GETSKB	;[157]Look for quote
	SKIPL	TERMK		;[157]EOL?
	 JRST	BADSYN		;[157]YES. Syntax error
ACCC1:	CAIE	T2,"'"		;[157]Single quote?
	 JRST	[TYPE (<%Character string must begin with single quote>)
		JRST	RET]	;[157]Try again
	DMOVE	T2,@SAVLOC	;[157]Get descriptor
	MOVE	T4,T3		;[163]Save length for descriptor check & loop
	IMUL	T3,CLMOFF	;[157]Compute for ADJBP
	SKIPN	SSLOW		;[401]
	JRST	ACOMOF		;[401]
	MOVE	T4,SSUP		;[401]	
	SUB	T4,SSLOW	;[401]
	AOJ	T4,		;[401] t4 = length = upper - (lower - 1)
	ADD	T3,SSLOW	;[401]substring offset
	SOJ	T3,		;[401] t3 = array offset + (lower - 1)
ACOMOF:	ADJBP	T3,T2		;[157]Get BP to element
	MOVEM	T3,ORIGLM	;[157]Save starting address
	MOVEI	T5,T3		;[163]T5=location of descriptor to validate
	PUSHJ	P,CKBPTR	;[163]Validate descriptor; return if OK
	MOVE	T5,T2		;[305]GET THE REAL ADDR TO VALIDATE
	TLZ	T5,770000	;[305]CLEAR THE OWGBP BITS LEAVING ADDR
	PUSHJ	P,CKWRIT	;[163]Check destination; return if OK
INSTRL:	PUSHJ	P,LOADCH	;[157]Get next character
	CAIE	T2,"'"		;[157]Quote?
	 JRST	PUTBYT		;[157]NO. Store it.
	PUSHJ	P,LOADCH	;[157]YES. see if there is another
	CAIN	T2,"'"		;[157]Another quote?
	 JRST	PUTBYT		;[157]YES. Store one only!
	DMOVEM	T3,TEM4		;[157]Save pointer & count
	MOVE	T5,[PUSHJ P,LOADCH] ;[157]for GETSKB
	MOVEM	T5,GETCHR	;[157]Tell GETCHR how to get input
	PUSHJ	P,GETSK1	;[157]Check for comment
	PUSHJ	P,CLRLIN	;[157]Clear extraneous input
	DMOVE	T3,TEM4		;[157]Restore pointer & count
	 JRST	STREND		;[212][157]End of this string


BYT2T5==^D29		;[BL]Bits left if BP points to firstbyte in word
PUTBYT:	IBP	T3		;[163]Destination address
	MOVE	T5,T3		;[163]T5=address to validate
	LDB	P1,[POINT 6,T3,05] ;[163]Get byte position within word
	CAIN	P1,BYT2T5	;[163]First byte in this word?
	PUSHJ	P,CKWRIT	;[163]YES. Validate destination; here +1 if OK
	DPB	T2,T3		;[163]Store byte
	SOJG	T4,INSTRL	;[157]Loop thru input string

	MOVEI	T5,"'"		;[157]Anticipated delimiter
	MOVEM	T5,DELCHR	;[157]Save for CLRLIN

STREND:	MOVEI	T5," "		;[212][157]Fill character
FILSTR:	SOJL	T4,NDSTR1	;[157]Jump if string full
	IDPB	T5,T3		;[157]Store a space
	JRST	FILSTR		;[157]Loop till full
NDSTR1:	MOVE	T4,CLMRNG	;[157]Relative location of last element
	SUB	T4,CLMOFF	;[157]Elements to fill
	JUMPLE	T4,ENDCK	;[157]NONE.....
	MOVE	T5,SAVLOC	;[157]Addr/descriptor
	MOVE	T5,1(T5)	;[157]Get count
	IMULI	T5,(T4)		;[157]Total bytes to move
	MOVE	T4,ORIGLM	;[157]Get source addr
RNGLUP:	ILDB	P1,T4		;[157]Load byte
	IDPB	P1,T3		;[157]Store it
	SOJG	T5,RNGLUP	;[157]
ENDCK:	MOVE T5,[pushj p,loadch];FOR GETSKB
	MOVEM	T5,GETCHR
	PUSHJ	P,GETSK1	;[157]CHECK FOR COMMENT
	SKIPGE	TERMK		;[322]Line terminator?
	PUSHJ	P,CLRLIN	;[322]No - Show user error

	MOVE	T5,SAVLOC	;[322]Restore for display
	SKIPN	CLMRNG		;[157]Accept a range?
	 JRST	ACPUT1		;[157]NO. Go display single element
	JRST	RET		;[157]YES. all done!!!!!
;	*** OCTAL INPUT ***

ACCO:	TRO	P3,O.		;[323] DISPLAY TO USER AS OCTAL
	SETZI	T5,		;CLEAR FOR OCTAL BUILD
	SKIPL	TERMK		;END OF LINE SEEN?
	JRST	ACC13		;YES - ASSUME OCTAL = 0
	PUSHJ	P,GETSKB	;LOOK FOR "-"
	SKIPL	TERMK
	JRST	ACC13		;END OF LINE - =0
	SETZB	P1,P2		;CLEAR BUILD AREA
	MOVEI	T5,^D12		;INITIALIZE COUNT
	TRNE	P3,B.		;[323] CHECK BIG
	MOVEI	T5,^D24		;[120] DOUBLE IT FOR BIG
	CAIA

ACC29:	PUSHJ	P,GETSKB	;GET NEXT CHARACTER
	SKIPL	TERMK		;END OF LINE?
	JRST	ACC16		;
	CAIE	T2,"+"		;PLUS?
	JRST	ACC31
	TLNE	T0,MF		;YES - MINUS SEEN?
	JRST	BADSYN
	JRST	ACC29		;NO - IGNORE THE +
ACC31:	CAIN	T2,42		;DOUBLE QUOTE?
	JRST	ACC29		;YES - IGNORE
	CAIE	T2,"-"
	JRST	ACC16		;NOT A "-"
	TLC	T0,MF		;COMPLEMENT FLAG
	JRST	ACC29		;GET NEXT CHARACTER

ACC16:	SUBI	T2,60		;OCTALISE
	JUMPL	T2,ERR2		;CHARACTER MUST OF COURSE -
	CAIL	T2,10		;   BE OCTAL
	JRST	ERR2		;NOT OCTAL - COMPLAIN
	LSHC	P1,3		;BUILD OCTAL VALUE 
	IOR	P2,T2
	SOJE	T5,ACC28	;CHECK FOR PROPER NUMBER OF CHARACTERS
ACA16:	PUSHJ	P,GETSKB	;GET A CHARACTER
	SKIPGE	TERMK		;END OF LINE
	JRST	ACC16		;BACK FOR MORE
;	HERE WITH LINE END OR FULL WORD(S)

ACC28:	TRNN	P3,B.		;[323] BIG WORKING?
	JRST	ACC30		;AS YOU WERE - STORE OCTAL
	MOVEM	P1,ARGVAL	;STORE LONG OCTAL
	MOVEM	P2,ARGVAL+1
	JRST	ACC32
ACC30:	MOVEM	P2,ARGVAL	;STORE SINGLE OCTAL

;	HERE AT END OF INPUT

ACC32:	PUSHJ	P,CLRLIN	;CLEAR THE LINE
	TLZN	T0,MF		;FLAGGED AS A NEGATIVE #?
	JRST	ACC10		;NORMAL
	SETCMM	ARGVAL		;SET TO NEGATIVE -
	SETCMM	ARGVAL+1	;	= 1'S COMPLEMENT
	AOS	ARGVAL+1	; LETS MAKE IT 2'S COMPLEMENT
	SKIPN	ARGVAL+1
	AOS	ARGVAL
	JRST	ACC10		;NOW PLACE THAT LOT
;	'ACCEPT' FORMAT PROCESSING

ACC2:	SKIPL	TERMK		;[200] EOL ALREADY?
	 JRST	BADSYN		;[200] YES
	PUSHJ	P,EVAL
	   JRST	ERR6		;NO SUCH STATEMENT NO
	PUSHJ	P,FRMSET	;SET UP TO ACCESS A FORMAT STATEMENT
	  JRST	RET		;CANT DO IT!
	MOVE	P1,T4		;FORMAT START
	MOVE	P2,T2		;FORMAT END

;	HERE WITH A RECOGNISED FORMAT REFFERENCE SET UP


ACC3:	MOVE	T5,[POINT 7,(P1)]
	pushj	p,loadch	;GET A USER CHARACTER
	CAIE	T2," "		;BLANKS
	CAIN	T2,11		; AND TABS IGNORED TO START WITH
	JRST	ACC3

	MOVE	T3,[pushj p,loadch]
	MOVEM	T3,GETCHR	;SET TO READ FROM USER
	PUSHJ	P,GETSK2
	CAIE	T2,"("		;FIRST FORMAT CHARACTER MUST BE (
	JUMPA	T2,BADSYN
ACC4:	ILDB	T3,T5		;INCREMENT POINTER NOW
	HRRM	T5,.+1
	CAIG	P2,(P1)		;HAVE WE EXHAUSTED THE FORMAT
	JRST	[JUMPE	T2,RET
		 JRST	ERR13]	;YES
	DPB	T2,T5		;STORE NEXT CHARACTER
	JUMPE	T2,ACC4

ACC6:	pushj	p,loadch	;GET ANOTHER USER FORMAT CHARACTER
	CAIE	T2," "		;NOW ALLOW
	CAIN	T2,11		;BLANKS AND TABS AS USER WANTS
	CAIA
	PUSHJ	P,GETSK2
	JUMPN	T2,ACC7		;NOT THE LAST CHARACTER YET IF NON ZERO
	CAIE	T4,")"		;LAST USER CHARACTER MUST BE A )
	JRST	ERR32		;  IT WASN'T SO COMPLAIN
ACC7:	MOVE	T4,T2		;REMEMBER THE LST USER CHARACTER
	CAIE	T2,37		;DOES USER WANT LINE CONTINUATION = ^_
	JRST	ACC4		;NO - NORMAL

ACC5:	pushj	p,loadch	;ACCEPT ANOTHER USER CHARACTER
	CAIN	T2,12		;UNTIL END OF LAST LINE
	JRST	ACC6
	JRST	ACC5		;DO A CONTINUATION
;	TYPE LOGIC

DISPLA:	SKIPN	ESCAPE		;CAN WE USE FOROTS?
	JRST	ERR30		;NOT AFTER A ^C RE-ENTER
	PUSHJ	P,CHKIWI	;[211] RECURSIVE IO IF WE CALL THE OTS?
	 JRST	ERRIWI		;[211] YES, TELL AND RETURN TO COMMAND LOOP.
	PUSHJ	P,FORBUF	;[211] OK, CLEAR FOROTS BUFFER
	SETZM	CURGRP		;CLEAR CURRENT GROUP STACK FLAGS
	TRO	T1,TYPCMD	;[171] Remember it's a TYPE command
	TLO	T0,CFLIU!GRPFL	;SET CORE FILE IN USE - ALLOW GROUPS
	CLEARM	GETCHR		;THIS IS THE FIRST ACCESS TO CORE FILE THIS LINE
	TLNE	T0,EOL		;USER GAVE ANY ARGUMENTS?
	TLOA	T0,OFCFL	;NO - GET THEM FROM CORE FILE
	TLZ	T0,OFCFL	;YES - PUT THEM INTO CORE FILE
	PUSHJ	P,DISP4		;DISPLAY ROUTINE
	TLZ	T0,CFLIU!OFCFL!GRPFL ;PULL DOWN DANGEROUS FLAGS
	PUSHJ	P,REINOP	;REINSTATE OPEN PROGRAM
	JRST	RET		;END OF TYPE COMMAND

DISP4:	CLEARM	RANGE		;CLEAR FOR RANGE INDICATION
	CLEARM	CLMOFF		;[157]Initialization
	CLEARM	CLMRNG		;[157]
	CLEARM	SSLOW		;[401]ZERO THE LOWER SUBSTRING BOUND
	CLEARM	SSUP		;[401]ZERO THE UPPER SUBSTRING BOUND
	HLRS	P3		;[323] Use default flags
	PUSHJ	P,SYMIN		;GET USERS NEXT SYMBOL VALUE
	   JRST	DISP9		;NOT THERE
	   CAIA			;STATEMENT # FOUND
	JRST	DISP2		;TRUE VARIABLE

;	FORMAT STATEMENT PROCESSOR


DISP13:	PUSHJ	P,FRMSET	;SET UP TO ACCESS A FORMAT STATEMENT
	  JRST	DISP5		;CANNOT DO IT

;	NOW FOUND A RECOGNISED FORMAT STATEMENT

	MOVE	T3,[POINT 7,(T4)]
	MOVEI	P1,SYM		;SET UP FOR SYMBOL PRINT
	TRZ	T1,LNAME	;[402] clear long name flag
	PUSHJ	P,SPT		;PRINT SYMBOL=STATEMENT #
	TYPE(	FORMAT)
DISP6:	ILDB	T5,T3		;GET A CHARACTER FROM THE FORMAT TEXT
	HRRM	T3,.+1		;GET NO OF WORDS DONE
	CAIG	T2,(T4)		;ALL DONE?
	JRST	DISP5		;DONE WITH FORMAT
	putchr	(T5)		;TYPE IT
	JRST	DISP6		;MORE TO DO - BACK FOR MORE
;	SET UP ACCESS TO A FORMAT STATEMENT  T4=START  T2=END
;	SKIP ON SUCCESS.

FRMSET:	MOVEI	T4,(T5)		;SHOULD POINT TO A JRST
	LINE
	LDB	T5,[POINT 7,(T4),6]	;GET FIRST CHARACTER OF FORMAT
	CAIE	T5,"("		;FIRST CHARACTER MUST BE A (
	PJRST	ERR16		;USER LOSES
	MOVE	T5,T4		;ACCEPTED START OF FORMAT -
	MOVEM	T5,SAVLOC	; NOW FIND END OF F10 FORMAT
	HRREI	T5,-12		;CHANGE LABEL+P TO LABEL+F
	ADDM	T5,SYM		;LIKE SO
	PUSH	P,T4		;SAVE (T4)
	PUSHJ	P,EVAL		;LOCATE THE FORMAT END
	  JRST	[POP	P,T4	;[403]
		JRST	ERR41]	;[403]CANT FIND FORMAT END
	POP	P,T4		;RESTORE
	MOVEI	T2,1(T5)	;SET UP END OF FORMAT IN T2
	JRST	CPOPJ1		;T4 START - T2 END . . . ALL SET UP

VAL2:	TAB
	MOVE	T5,RANLIM	;GET THE CURRENT VALUE POINTER
	MOVE	T5,1(T5)	;GET THE NEXT VALUE
	POPJ	P,

;	IMPLIED RANGE   I.E. TYPE ARRAY

DISP2:	CAIN	T2,"-"
	JRST	DISP1		;GET LIMIT OF RANGE
	TRZN	T1,IMPRNG	;IS THIS A SIMULATED RANGE
	JRST	DISP10		; NO - JUST NORMAL

DISP11:	PUSHJ	P,DISP14	;SET UP RANGE WITH UPPER LIMIT
	TLO	T0,GRPFL	;[323] PERMIT GROUP LOGIC AGAIN


;	ONE-SHOT TYPE REQUEST
;	ENTER WITH SYMBOL VALUE IN T5
;	ENSURE TERMK,RANGE=0

DISP10:

	MOVEM	T5,LWT		;SAVE SYMBOL VALUE
	MOVE	T5,(T5)		;GET CONTENTS OF SYMBOLIC ADDRESS
	EXCH	T5,LWT		;SAVE CONTENTS AND GET SYMBOL VALUE
				;SAVE SYMBOL VALUE IN CASE WE DO A RANGE
	MOVEM	T5,RANLIM	;SAVE FOR RANGE NAME ID SUPRESSION
	TRO	P3,ANYMOD	;[173]FLAG FIRST PRINT ON LINE
	PUSHJ	P,OFFSET	;TYPE USERS SYMBOL
	 JRST	DISP9
				;[202]
	EXCH	T5,SYM		;GET BACK SYMBOL CONTENTS

	TRNN	P3,C.		;[157]Character string?
	 JRST	TYPF		;[157]NO. Next test

;	*** TYPE CHARACTER ***
	DMOVE	T2,@SAVLOC	;[157]Load ptr & length
	MOVE	T4,T3		;[163]Save string length
	IMUL	T4,CLMOFF	;[157]Compute for ADJBP
	SKIPN	SSLOW		;[401]
	JRST	DCOMOF		;[401]
	MOVE	T3,SSUP		;[401]	
	SUB	T3,SSLOW	;[401]
	AOJ	T3,		;[401] t3 = length = upper - (lower - 1)
	ADD	T4,SSLOW	;[401]
	SOJ	T4,		;[401] t4 = array offset + (lower - 1)
DCOMOF:	ADJBP	T4,T2		;[157]Create BP to element
	MOVE	T2,T4		;[157]Get the adjusted pointer
CHKPTR:	MOVEI	T5,T2		;[163]T5=Location of descriptor to validate
	PUSHJ	P,CKBPTR	;[163]Validate; return if OK
	MOVE	T5,T2		;[163]T5=address to validate
	PUSHJ	P,CKREAD	;[163]Validate;return if OK
CKBIG:	TRNE	P3,B.		;[157]Display whole string?
	 JRST	TYPEC		;[157]YES. skip size check
	CAILE	T3,^D256	;[157]Large string?
;***	flag
	 MOVEI	T3,^D256	;[157]YES. truncate

TYPEC:	PUSHJ	P,DSPSTR	;[162]Put out string
	JRST	TYPF		;[157][164]Go check for other type-out modes

;	DSPSTR is a routine to display character strings.
;	DSPST1 is an entry point to allow TYPCS (from PAUSE) to display
;	character strings without calling JUSTIFY.

DSPSTR:	JUSTIFY			;[164](VARIABLE NAME),TAB,=
;	TYPE	( )		;[157]Space
DSPST1:	TYPE	(')		;[157]Initial quote
BYTLUP:	IBP	T2		;[163]Destination address
	MOVE	T5,T2		;[163]T5=location of address to validate
	LDB	T4,[POINT 6,T2,05] ;[163]Get byte position within word
	CAIN	T4,BYT2T5	;[163]First byte in this word?
	PUSHJ	P,CKREAD	;[163]YES. Validate source; return here if OK
	LDB	T5,T2		;[163]Store byte
	CAIN	T5,"'"		;[157]Single quote?
	 PUSHJ	P,ASCOUT	;[157]YES. double it
	PUSHJ	P,ASCOUT	;[157]Display it
	SOJG	T3,BYTLUP	;[157]Loop til thru
	TYPE	(')		;[157]Concluding quote
	POPJ	P,
;***	check for truncated string?

;	*** TYPE FLOATING ***

TYPF:	TRNN	P3,F.		;TEST THE FLOATING FLAG
	JRST	TYPD		;NO REAL TRY DOUBLE REAL
	JUSTIFY
	MOVEI	T3,4		;ARG TYPE REAL FOR FOROTS
	PUSHJ	P,FOROUT	;ONE ARG OUTPUT

;	*** TYPE DOUBLE REAL ***

TYPD:	TRNN	P3,D.		;TEST FOR DOUBLE REAL
	JRST	TYPX		;NO FLOATING TRY COMPLEX
	JUSTIFY
	MOVE	T3,RANLIM	;GET ARG POINTER
	MOVE	T5,1(T3)	;GET SECOND ARG
	MOVEM	T5,ARGVAL+1	;SAVE 2ND. HALF FOR FOROTS
	MOVE	T5,(T3)		;RE-INSTATE IST.ARG IN T5
	MOVEI	T3,TP%DPR	;[137]Set up for default D-float arg type=10
	TRNE	T0,GFLOAT	;[137]If D-float, skip to FOROTS call.
	MOVEI	T3,TP%DPX	;[137] else, we have G-float, set are type=13
	PUSHJ	P,FOROUT	;OUTPUT REAL*8

;	*** TYPE COMPLEX ***

TYPX:	TRNN	P3,X.		;[157]TEST FOR COMPLEX TYPE OUT
	JRST	TYPI		;NO COMLEX TRY FOR INTEGER
	JUSTIFY
	MOVE	T3,RANLIM	;GET ARG POINTER
	MOVE	T5,1(T3)	;GET SECOND ARG
	MOVEM	T5,ARGVAL+1	;SAVE 2ND HALF FOR FOROTS
	MOVE	T5,(T3)		;REINSTATE 1ST ARG IN T5
	MOVEI	T3,14		;SET UP ARGTYPE FOR COMPLEX
	PUSHJ	P,FOROUT	;ONE ARG OUTPUT

;	** TYPE INTEGER ***

TYPI:	TRNN	P3,I.		;TYPE AS INTEGER?
	JRST	TYPO		;NO - TRY OCTAL
	JUSTIFY
	MOVEI	S1,^D10		;PREPARE FOR DECIMAL TYPE OUT
	PUSHJ	P,FTOC		;CONSTANT PRINT

;	*** TYPE OCTAL ***

TYPO:	TRNN	P3,O.		;TYPE AS OCTAL?
	JRST	TYPA		;NO - TRY ASCII
	JUSTIFY
	MOVEI	S1,10		;PREPARE FOR OCTAL PRINT
	PUSHJ	P,FTOC		;PRINT IN OCTAL
	TRNN	P3,B.		;[120] DOUBLE WORD
	JRST	TYPA		;NO - TRY ASCII
	PUSHJ	P,VAL2		;GET THE NEXT VALUE
	PUSHJ	P,FTOC		; DISPLAY THAT
;	*** TYPE ASCII ***

TYPA:	TRNN	P3,A.		;TYPE AS ASCII?
	JRST	TYPR		;NO - SEE IF RIGH JUSTIFIED ASCII
	JUSTIFY
	PUSHJ	P,TXT341	;THROW UP ASCII
	TRNN	P3,B.		;[120] DOUBLE?
	JRST	TYPR		;NO - TRY RASCII   ?????????
	PUSHJ	P,VAL2		;GET THE NEXT VALUE
	PUSHJ	P,TXT341	;AND TYPE THAT AS ASCII

;	*** TYPE RIGHT JUSTIFIED ASCII ***

TYPR:	TRNN	P3,R.		;TYPE AS ASCII RIGHT JUSTIFY
	JRST	TYPL		;[120] NO - TRY OCTAL
	JUSTIFY
	TYPE(R)			;RASCII IDENTIFIER
	LSH	T5,1		;MAKE LEFT JUSTIFIED ASCII
	PUSHJ	P,TXT341	;TYPE AS USUAL
	TRNN	P3,B.		;[120] DOUBLE RASCII?
	JRST	TYPL		;[120] NO
	PUSHJ	P,VAL2		;GET NEXT VALUE
	LSH	T5,1		;FAKE ASCII
	PUSHJ	P,TXT341	;TYPE AS ASCII

TYPL:	TRNN	P3,L.		;[120] TYPE AS LOGICAL?
	JRST	TYPS		;[120] NO - SEE IF IN RANGE
	JUSTIFY			;[120]
	JUMPGE	T5,TYPL1	;[124][120] IF POSITIVE, IT'S FALSE
	TYPE(.TRUE.)		;[124][120] IT MUST BE NEGATIVE SO TRUE
	JRST	TYPS		;[124][120]
TYPL1:	TYPE(.FALSE.)		;[124][120] IT'S POSITIVE

TYPS:	TRNN	P3,S.		;/S IS ILLEGAL FOR TYPE
	JRST	TYPN
	JRST	ERR37		; - ERROR
;	HERE AT END OF TYPING - EXAMINE RANGE CONDITION

TYPN:	LINE
	SKIPN	RANGE		;ARE WE IN A RANGE CONDITION
	JRST	DISP5		; NO
	TRNE	P3,C.		;[157]Character string?
	 JRST	TYPC		;[157]YES.
	AOS	T5,RANLIM	; YES INCREMENT VARIABLE
	TRNE	T0,DOUBLE	;[112] IS THIS A DOUBLE WORD ARRAY RANGE
	AOS	T5,RANLIM	;DOUBLE WORD ARRAYS GO UP BY TWO
	CAMG	T5,RANGE		;TO LIMIT OF RANGE
	 JRST	DISP10		;AND TYPE ALL REQUIRED
	JRST	DISP5		;[157]DONE. Go clean up
TYPC:	MOVE	T5,RANLIM	;[157]Restore base
	AOS	T2,CLMOFF	;[157]Count this element
	CAMG	T2,CLMRNG	;[157]Was that the last?
	 JRST	DISP10		;[157]NO. Go type next element

DISP5:	SKIPGE	TERMK		;[323] END OF USER INPUT LINE YET?
	JRST	DISP4		; NO - KEEP GOING
	POPJ	P,		; YES - END OF TYPE COMMAND

JUSTFY:	TRZN	P3,ANYMOD	;SEE IF FIRST OUTPUT THIS VARIABLE
	jrst	[LINE
		jrst	.+1]
	TYPE(	=  )
	MOVE	T5,LWT		;GET BACK THE OUTPUT VARIABLE CONTENTS
	POPJ	P,



;	GET THE LIMIT OF A RANGE CONDITION AND CHECK THE ORDER

DISP1:

;	if character, save original offset, get new offset, save as
;	hi offset. (ranlim?)
;
;
;


	MOVEM	T5,RANGE		;REMEMBER START OF RANGE

	MOVE	T5,CLMOFF	;[157]Get beginning offset
	MOVEM	T5,CLMRNG	;[157]Save it in case this is /C
	TLZ	T0,GRPFL	;NO GROUP REQUESTS HERE OR PRINT MODIFIERS
	MOVE	T5,MATHSM	;[403]SAVE CURRENT SYMBOL
	MOVEM	T5,TEM10	;[403]
	PUSHJ	P,SYMIN		;GET NEXT SYMBOL
	   JRST	DISP9		;BAD LABEL
	   JRST	BADSYN		;STATEMENT NO. ????
	MOVE	T4,TEM10	;[403]GET FIRST SYMBOL BACK
	CAME	T4,MATHSM	;ARE THEY THE SAME
	JRST	ERR40		;NO - SORRY
	TRZE	T0,SUBFLG	;WAS THERE AN IMPLIED RANGE
	JRST	DISP11		;YES - GO DEAL WITH IT

	CAML	T5,RANGE	;SORT OUT SYMBOL ORDER
	EXCH	T5,RANGE	;CHANGE THEIR ORDER
	CAIN	T2,"-"		;"-" IS A DELIMITER BUT IS BAD HERE
	JRST	BADSYN
	TLO	T0,GRPFL	;O.K. FOR GROUPS AGAIN

	TRNN	P3,C.		;[322] MODE Character?
	 JRST	DISP10		;[322] No - Now type range

;	clmrng=first offset given
;	clmoff=offset just received
DISP1B:	MOVE	T2,CLMOFF	;[157]Get the lower offset
	CAMLE	T2,CLMRNG	;[157]Is lower .le. upper?
	 EXCH	T2,CLMRNG	;[157]NO. Make it so
	MOVEM	T2,CLMOFF	;[157]Restore lower offset
	JRST	DISP10		;[157]Go type for the user
SYM4:	TLNE	T0,GRPFL	;ARE WE ALLOWING CORE STRINGS
	CAIE	T2,"/"		;AND IF SO DOES THE USER WANT ONE
	JRST	SYM1		;NOT IN GROUP LOGIC
;	ACCEPT TEMPORARY PRINT OPTION MODIFIERS

SYM15:	PUSHJ	P,OPTION	;GET THE PRINT OPTION SETTINGS
	  JRST	SYM14		;NUMERIC - MUST HAVE BEEN A GROUP REQUEST
	HRLS	P3		;[323] New settings become the default
	SKIPL	TERMK		;EOL?
	JRST	BADSYN		;CAN'T HAVE THAT!
	PJRST	SYMIN		;RESUME SYMIN ACTIVITIES

;	HANDLE GROUP REQUESTS

SYM14:	CAIL	T5,1
	CAILE	T5,GPMAX	;WHICH MUST BE IN RANGE
	JRST	ERR15		;NO GOOD
	CAIE	T2,","		;ALLOW COMMA AS DELIMITER
	JUMPN	T2,BADSYN	;ANYOTHER CHARACTER IS BAD


	PUSHJ	P,SYM5		;PROCESS GROUP CONTENTS


	POP	P,(P)		;REMOVE SYMIN PUSH
	JRST	DISP5		;ANYTHING ELSE ON USERS LINE?

SYM1:	TLNN	T0,GRPFL	;IS GROUP LOGIC IN ACTION
	JRST	RET		;ASSUME NUL INPUT GO BACK TO USER

	POP	P,(P)		;REMOVE THE SYMIN PUSH
	JUMPE	T2,DISP5	;EMPTY GROUP?
	JRST	BADSYN		;MUST BE BAD SYNTAX


;	ROUTINE TO DETERMINE THE LENGTH OF AN IMPLIED RANGE

DISP14:	MOVEM	T5,RANLIM	;SAVE THE BASE ARRAY REFFERENCE
	SETZM	PUTTER		;SET FOR RAYNAM
	PUSHJ	P,GET.RP	;GET THE RANGE PRODUCT FOR THIS ARRAY
	MOVE	T5,DIMTOT	;
	SOJ	T5,		;
	MOVEM	T5,CLMRNG	;[157]In case character
	TRNE	T0,DOUBLE	;[307] IS IT DOUBLE PRECISION?
	LSH	T5,1		;[307] YES, DOUBLE THE RANGE PRODUCT
	ADD	T5,RANLIM	;FORM UPPER RANGE LIMIT
	MOVEM	T5,RANGE	;SAVE THE RANGE
	MOVE	T5,RANLIM	;GET THE START ADDRESS
	POPJ	P,
;	ENTRY POINT FOR A GROUP 'TYPE' REQUEST
;	PUSHJ P,SYM5
;	WITH GROUP # 1-GPMAX IN T5
;	AND TERMK=0

SYM5:	TRZE	T1,DCOPFG	;DON'T OPEN PROG?
	JRST	SYM16		;NO - DON'T
	SKIPN	T4,GRP2(T5)	;GET GROUP'S PROG
	JRST	SYM16		;NULL - IGNORE IT
	CAMN	T4,OPENED	;IS IT CURRENT?
	JRST	SYM16		;YES
	MOVEM	T4,SYM		;NO - SAVE IT
	MOVSYM	OPENED,T4,OLDOPN;[402]Save OPENED into OLDOPN
	TRZ	T1,LNAME	;[402] ASSUME SHORT NAME
	SKIPE	GRPFLG(T5)	;[402] WAS IT SHORT
	 TRO	T1,LNAME	;[402] NO, SET LONG NAME FLAG
	PUSH	P,T5		;SAVE (T5)
	PUSHJ	P,IMPOPN	;DO THE OPEN AND MESSAGE
	POP	P,T5		;RESTORE (T5)

SYM16:	
;	CHECK FOR GROUP RECURSION

	MOVEI	T4,1
	LSH	T4,(T5)		;SET UP MASK BIT
	TDOE	T4,CURGRP	;CHECK AND SET
	JRST	ERR39		;GROUP ALREADY ACTIVE - ERROR
	MOVEM	T4,CURGRP	;SAVE STATE
	PUSH	P,T5		;SAVE T

	IMULI	T5,CFSIZ	;GET RELEVANT GROUP SECTION
	ADD	T5,[POINT 7,GRP1-CFSIZ]	;FORM POINTER TO IT

	RECURS <CFLPTR,CFLST,GETCHR,TERMK>
				;CFLPTR - SAVE CURRENT CORE POINTER
				;CFLST - SAVE CURRENT CORE LIMIT
				;GETCHR - SAVE CURRENT STRING SOURCE
				;TERMK - SAVE CURRENT DELIMITER DESCRIPTOR
	MOVEM	T5,CFLPTR	;SET UP NEW POINTER
	HRRZM	T5,CFLST	;DEFINE NEW STRING LIMIT
	MOVE	T5,[ILDB T2,CFLPTR] ;GET POINTER TO NEW INFORMATION
	MOVEM	T5,GETCHR	;STATE NEW STRING SOURCE
	PUSHJ	P,DISP4		;DO A RE-ENTER

	SRUCER			;POP BACK ALL ABOVE RECURS-ED VALUES

;	CLEAR CURRENT GROUP FLAG

	POP	P,T5		;GET NUMBER BACK
	MOVEI	T4,1
	LSH	T4,(T5)		;SET UP MASK
	TDC	T4,CURGRP	;CLEAR THIS GROUP FLAG
	MOVEM	T4,CURGRP	;SAVE IT

	PJRST	DISP5		;SEE IF THERE IS AN ORIGINAL USER
				;STRING TO PROCESS

DISP3:	PJRST	DISP9		;CANNOT FIND SYMBOL
;OPEN LOGIC
; input:  SYM contains section name
; output: OPENED contains section name
;         SSTAB points to secondary symbol table

SETNAM:	SETZM	SSTAB		;[402] Zero ptr to secondary symbol table
	CLRFLG	OPENED		;[402] Assume short name of open section
	TRNE	T1,LNAME	;[402] Looking for long symbol name?
	JRST	SETLNM		;[402] Yes
	PUSHJ	P,FINDP		;[321] Find program name
	 JRST	ERR6		; NO SUCH NAME
	MOVE	T5,SYM
	MOVEM	T5,OPENED	; PROGRAM NAME OPENED
	JRST	SETNM1		;[402]

SETLNM:	MOVSI	T2,LPNAME	;[402]Global prefix
	MOVEM	T2,SYMASK	;[402]Reset mask in case it's been munged
	PUSHJ 	P,FINDLG	;[402] Yes
	 JRST	ERR6		;[402] No such name
	MOVE	T5,SYM
	STSYM	T5,OPENED	;[402] PROGRAM NAME OPENED
	SOJ	T2,		;[402] Point to top of table
	MOVEM	T2,SSTAB	;[402] STORE PTR TO SECONDARY SYMBOL TABLE
	MOVE	T2,TMPSAV	;[402] Get .SYMTB entry in ddt symbol table
LG9LP:	ADDI	T2,2		;[402] Loop to find ddt entry for program name
	MOVE	T5,(T2)		;[402] Get name of entry
	TLNE	T5,PNAME	;[402] Program name?
	 JRST	LG9LP		;No

SETNM1:	HLRE	T5,1(T2)	;[321] Length of module (negative)
	MOVMM	T5,OPENLZ	;[321] Save positive size
	ADD	T5,T2		;[321] Point to beginning of
	ADDI	T5,2		;[321]   symbols for
	MOVEM	T5,OPENLS	;[321]   this module

	TRNN	T1,LNAME	;[402] Short program name?
	JRST	SETNM2		;[402] No
                                ;[402] Yes, Look for secondary symbol table
	MOVE	T5,[SQUOZE 0,.SYMTB]	;[402] .SYMTB in RAD50
	MOVEM	T5,SYM		;[402]
	PUSHJ	P,FINDL		;[402] Look for local .SYMTB
	 JRST	SETNM2		;[402] No .symtb
	MOVEM	T5,SSTAB	;[402] Store ptr to secondary symbol table 
SETNM2:	MOVE	T5,OPENED	;[402]
	MOVEM	T5,SYM		;[402]
	POPJ	P,
;	DIMENSION LOGIC
;
;	[301] Reworked
;
;	This is the heap which will contain dimension information.
;
;	Each heap entry contains three words, and come in three types:
;	     1) Empty
		DENXT==0	;Global index to next free entry
				;The remaining two words are unused
;
;	     2) Array Header
		DSNXT==0	;Global index to next array header
		DSDIM==1	;Global index to first dimension entry for
				;   this array.
		DSLOC==2	;Global index to the first element of the array

;	     3) Dimension information
		DDNXT==0	;Global index to next dimension for this array
		DDLOW==1	;Lower dimension
		DDRNG==2	;Number of elements (less 1) in this dimension
				;   Higher dimension = DDLOW + DDRNG

;	Bits 1-5 of DSDIM can contain flags.
;	Note that these bits are not used by global indexing.
		DFDBL==1B1	;The array contains double-word data
		DFCHAR==1B2	;The array contains character data

DIMTAB:	XLIST			;Allocate an empty heap
	REPEAT	DIMSIZ-1,<
	EFIW	.+3		;Next empty slot
	EXP	0		;Unused
	EXP	0		;Unused
>
DIMTE:	EXP	0		;Zero index in last entry
	EXP	0
	EXP	0
	LIST

DIMFF:	EFIW	DIMTAB		;Start of free slots
DIMLF:	EFIW	DIMTE		;End of free slots

DIMNAM:	EXP	0		;Global index to first array header
;	ROUTINE TO OBTAIN A FREE DIMTAB ENTRY
;	CALL PUSHJ P,GETRAY
;	     RETURN - ADDRESS OF SLOT IN T5

GETRAY:	MOVE	T5,DIMFF	;[301] Get the start of the free list
	MOVE	T2,DENXT(T5)	;[301] Find the location of the next slot
	JUMPE	T2,GETNON	;END OF LIST REACHED
	MOVEM	T2,DIMFF	;[301] Remove this entry from free list
	POPJ	P,		;RETURN WITH GOOD ENTRY ADDRESS IN T5

GETNON:	PUSHJ	P,FLUSHA	;REMOVE ALL STRUCTURES CREATED FOR
				;THE ARRAY VALUE IN SAVLOC
	TYPE(?FDTDTO Dimension table overflow)
	JRST	RET

;	SUBROUTINE TO RETURN A DIMTAB ENTRY TO THE FREE LIST
;	CALL PUSHJ P,PUTRAY
;	     ENTER WITH ADDRESS OF SLOT IN T5
;	     RETURN

PUTRAY:	MOVE	T2,DIMLF	;[301] Get address of end of free list
	MOVEM	T5,DENXT(T2)	;[301] Append the slot
	SETZM	DSNXT(T5)	;[301] Slot becomes end of list
	MOVEM	T5,DIMLF	;[301] Record that fact
	POPJ	P,
;	ROUTINE TO LOOK THROUGH LIST OF ARRAY NAMES TO FIND IF
;	THIS (SAVLOC) NAME IS ALREADY IN USE
;	CALL PUSHJ	P,RAYNAM
;	RETURN HERE IF NOT FOUND
;	RETURN HERE IF FOUND . . . T5=ADDRESS OF ARRAY,  T3=LAST ARRAY
;				   F10RAY IN T0 IS SET IF F10 DEFINED

RAYNAM:	TRZ	T0,FORMAL!F10RAY ;[105] ASSUME NEITHER HOLDS
				;[202]
	XMOVEI	T3,DIMNAM	;[301] Set up for
	MOVE	T5,(T3)		;[301]   first array
RAY:	JUMPE	T5,RAY3		;T3 WILL POINT TO THE END OF THE LIST
	MOVE	T2,DSLOC(T5)	;[301] THIS IS AN ARRAY BLOCK - GET THE VALUE
	CAMN	T2,SAVLOC	;ARE WE REDEFINING CURRENT NAME?
	JRST	RAY2		; YES - REMOVE THE ENTRY FIRST

	MOVE	T3,T5		;T3 WILL POINT TO THE CURRENT GOOD ENTRY
	MOVE	T5,DSNXT(T5)	;[301] Find the next entry
	JRST	RAY

RAY2:	TRZ	T0,DOUBLE!CHARS	;[301] Assume they are going to be off
	MOVE	T4,DSDIM(T5)	;[301] Flags from array entry
	TLNE	T4,(DFDBL)	;[301] Is it double word?
	TRO	T0,DOUBLE	;[301] Yes - Remember that
	TLNE	T4,(DFCHAR)	;[301] Character array?
	TRO	T0,CHARS	;[157]YES. mark it.
	JRST	CPOPJ1		;ARRAY IDENTIFIED EXIT
;	HERE IF NO USER DEFINITION EXISTS IN FORDDT DIMENSION LISTS
;	NOW CHECK FOR AN F10 DEFINITION

RAY3:	PUSH	P,T5		;SAVE BOTH T5 AND-
	PUSH	P,T3		;  T3 AROUND EVAL
	MOVE	T5,SAVLOC
	TRO	T0,SILENT	;DON'T PRINT SYMBOL
	PUSHJ	P,LOOK		;SETS UP P1 FROM T5
	  JRST	RAYPOP		;
	  JRST	RAYPOP		;DOSENT EXIST
	POP	P,T3		;RETURN T3
	POP	P,T5		; AND T5
	MOVE	S4,P1		;[321] GET THE ARRAY SYMBOL
	MOVE	T2,(S4)		; AND SEE IF WE HAVE AN F10 ARRAY -
	TRNE	T1,LNAME	;[402] Long name?
	JRST	RAY3A		;[402] Yes - skip 
	TLZ	T2,PNAME	;    DEFINITION -
	TLO	T2,(50B5)	;[301] THIS IS THE SAME SYMBOL
RAY3A:	CAME	T2,2(S4)	;[402]   WITH FLAGS 50 SET
	POPJ	P,		;NO - NOT AN F10 DEFINITION

	TRO	T0,F10RAY	;YES - FLAG THIS AS AN F10 ARRAY
	MOVE	S4,3(S4)	;SET POINTER TO ARRAY TABLE INFORMATION
	LDB	T2,[POINT 4,1(S4),12]
	TRZ	T0,DOUBLE	;[162]MAKE SURE DOUBLE IS OFF
	CAIE	T2,TP%DPR	;[112] [161]Double word array?
	 CAIN	T2,TP%DPX	;[162]NO. G-Floating double array?
	  TROA	T0,DOUBLE	;[162]YES FLAG IT & reset character flag
	CAIN	T2,TP%CPX	;[210]Complex is double word array also
	 TRO	T0,DOUBLE	;[210]Yes it's complex
	CAIE	T2,TP%CHR	;[161]Character array?
	 TRZA	T0,CHARS	;[161]NO
	TRO	T0,CHARS	;[161]YES
;[161]	LDB	T2,[POINT 9,1(S4),8]
	LDB	T2,[POINT 7,1(S4),8] ;[161]
	MOVEM	T2,DIMCNT	;SET UP THE NUMBER OF DIMENSIONS

	LDB	T2,[POINT 2,2(S4),1] ;[301] Array & Formal flags (V6 or before)
	CAIN	T2,2		     ;[301] V7 Fortran (or later)?
	 LDB	T2,[POINT 2,2(S4),3] ;[301] Yes - These flags instead
	TRNN	T2,1		;[301] Is it a formal array argument?
	 JRST	RAY5		;[301] No
	TRO	T0,FORMAL	;[301] Yes - Flag it
	XMOVEI	T5,@1(S4)	;[301] Get the actual array base
	MOVEM	T5,FRMSAV	;[301] Save the formal reference

RAY5:	ADDI	S4,3		;[301] SET TO POINT TO THE FIRST DIMENSION
	JRST	CPOPJ1


RAYPOP:	POP	P,T3		;[321] MUST RESET T3-
	POP	P,T5		; AND T5 BEFORE
	POPJ	P,		; GIVING A NO FOUND EXIT
;	ROUTINE TO CREATE AN ARRAY ENTRY
;	MUST HAVE A PAIR OF SUBSCRIPTS IN TEM,TEM1
;	 CALL PUSHJ P,PUTNAM
;	     ENTER WITH SAVLOC = VALUE OF NAME OF ARRAY

PUTNAM:	PUSH	P,T0		;SAVE FLAGS ROUND THE NEXT FEW LINES
	PUSHJ	P,SIMDEF	;SEE IF THIS ARRAY NAME IS AFTER BASE-ARRAY
PUTCHK:	PUSHJ	P,RAYNAM	;HAVE WE USED THIS NAME BEFORE?
	  JRST	PUTOK		;NO  - GO AHEAD - PLACE NEW NAME
	PUSHJ	P,FLUSH		;NAME ALREADY IN USE STAND BY FOR REDEFINITION
	TRZE	T0,FORMAL	;ATTEMPT TO RE-DIMENSION A FORMAL PARAMETER
	JRST	[POP	P,T0	;[403]
		JRST	ERR33]	;[403]NO YOU DON'T
	TRNN	T0,F10RAY	;F10 DEFINED ARRAY?
	JRST	PUTCHK		;RESET ALL
	JRST	ERR28		;WARN OF F10 REDEFINITION

PUTOK:	POP	P,T0		;RESTORE FLAGS FROM ABOVE
	PUSHJ	P,GETRAY	;[301] GET A SLOT - END OF NAMES = T3
	MOVEM	T5,T4		;SAVE FOR NAME DEFINITION - T4
	PUSHJ	P,GETRAY	;[301] GET A SLOT FOR DIMENSION DEFINITION
				;ENSURE WE HAVE 2 SLOTS FREE NOW
				;SAVE PAIN IN 'FLUSHING' LATER
	MOVEM	T4,DSNXT(T3)	;[301] SAY HELLO TO NEW MEMBER
	SETZM	(T4)		;NEW MEMBER BECOMES END OF CHAIN
	MOVE	T2,SAVLOC	;GET THE NEW MEMBERS NAME
	MOVEM	T2,DSLOC(T4)	;[301] ACCEPT THE NEW MEMBER TO THE FAMILY
	TRNE	T0,DOUBLE	;IS THIS A DOUBLE WORD ARRAY
	TLO	T5,(DFDBL)	;[301] YES - SAVE THE FACT
	TRNE	T0,CHARS	;[157]Character array?
	TLO	T5,(DFCHAR)	;[301] YES.
	MOVEM	T5,DSDIM(T4)	;[301] NEW MEMBERS ARE GIVEN A DIMENSION LIST
	PUSHJ	P,PUTSUB	;STORE THE SUBSCRIPTS
	JRST	CPOPJ1		;JUMP OVER POSSIBLE PUTDIM ENTRY

PUTSUB:	MOVE	T2,TEM1		;GET THE UPPER SUBSCRIPT
	SUB	T2,TEM		;[301] Compute the
	MOVEM	T2,DDRNG(T5)	;[301]    dimension range
	MOVE	T2,TEM		;[301] Save the
	MOVEM	T2,DDLOW(T5)	;[301]    lower dimension
	SETZM	DDNXT(T5)	;[301] End of present list
	MOVEM	T5,PUTTER	;SAVE THE END OF THE DIMENSION LIST
	POPJ	P,

;	ROUTINE TO ADD ANOTHER DIMENSION TO AN ARRAY DIMENSION LIST
;	CALL PUSHJ P,PUTDIM
;	     ENTER WITH TEM,TEM1 = LOWER AND UPPER SUBSRIPTS

PUTDIM:	PUSHJ	P,GETRAY	;[301] GET A FREE ENTRY
	MOVE	T2,PUTTER	;FIND WHERE THE LAST DIMENSION WAS STORED
	MOVEM	T5,DDNXT(T2)	;[301] Link new entry to list
	PJRST	PUTSUB		;SAVE THE SUBSCRIPTS
;	ROUTINE TO GET THE DIMENSIONS, IN ORDER, FOR THE ARRAY VALUE(SAVLOC)
;	CALL PUSHJ P,GETDIM
;	WITH ARRAY VALUE IN SAVLOC AND PUTTER = 0 FOR FIRST CALL
;	EXIT WITH TEM=SUB LOWER   TEM1=SUB UPPER

GETDIM:	SKIPE	T5,PUTTER	;IS THIS THE FIRST CALL?
	JRST	GET4		; NO - GET NEXT DIMENSION RANGE

	PUSHJ	P,RAYNAM	;YES - SET UP THE ARRAY REFERENCES
	  JRST	E5		;SAVLOC NAME NOT KNOWN??
	TRNE	T0,F10RAY	;F10 DEFINED?
	JRST	GET3		;YES
	MOVE	T5,DSDIM(T5)	;[301] GET THE START OF DIMENSION LIST
	JRST	GET5		;FIRST TIME IS SPECIAL
GET4:	TRNE	T0,F10RAY	;F10 ARRAY DEFINITION?
	JRST	GET3		;YES
	MOVE	T5,DDNXT(T5)	;[301] GET NEXT DIMENSION IF ANY
GET5:	JUMPE	T5,ERR22	;END OF LIST - TOO MANY DIMENSIONS EXPECTED
	MOVEM	T5,PUTTER	;SAVE LINK TO NEXT DIMENSION
	MOVE	T3,DDLOW(T5)	;[301] Get the
	MOVEM	T3,TEM		;[301]  lower dimension
	ADD	T3,DDRNG(T5)	;[301] Form the
	MOVEM	T3,TEM1		;[301]  upper dimension
	POPJ	P,


;	HERE TO GET THE NEXT UPPER AND LOWER BOUNDS
;	FOR AN F10 DEFINED ARRAY

GET3:	SETOM	PUTTER		;FLAG NOT FIRST TIME FOR F10 ARRAYS
	SOSGE	DIMCNT		;ARE THERE ANY MORE DIMENSIONS TO COME?
 	JRST	ERR22		;NO HARD LUCK
	MOVE	T5,@(S4)	;GET THE LOWER BOUND
	MOVEM	T5,TEM		;SAVE LOWER
	MOVE	T5,@1(S4)	;GET THE UPPER BOUND
	MOVEM	T5,TEM1		;SAVE UPPER
	ADDI	S4,3		;[301] S4 NOW POINTS TO NEXT DIMENSION-
	POPJ	P,		;	IF ANY
;	ROUTINE TO GUARD AGAINST SIMULTANEOUS SINGLE COMMAND RE-DIMENSIONING
;	OF THE SAME ARRAY. THE LOCATION BASRAY CONTAINS A REFFERENCE TO
;	THE ARRAY NAME WHICH STARTED THE CURRENT DIMENSION WORKING
;	AND WILL BE THE POINT IN THE NAMES LIST AFTER WHICH A REDEFINITION
;	OF THE NAME NOW FOUND IN SAVLOC WILL BE ILLEGAL

SIMDEF:	MOVE	T4,SAVLOC	;GET THE NEW ARRAY NAME(VALUE)
	EXCH	T4,BASRAY	;SAVE AND START AT BASE-ARRAY NAME
	PUSHJ	P,RAYNAM	;SET UP POINTERS TO BASE-ARRAY
	  POPJ	P,		;   ????
	MOVEM	T4,BASRAY	;RESET BASE ARRAY AND CURRENT NAME
	TRNE	T0,F10RAY	;F10 DEFINED ARRAY?
	POPJ	P,		;MUST BE A NEW DEFINITION
	PUSHJ	P,RAY		;SEE IF THIS ARRAY NAME OCCURS AFTER BASRAY
	  POPJ	P,		;NO
	TYPE	(?FDTMLD )
	MOVE	T5,SAVLOC	;GET THE OFFENDING VALUE
	PUSHJ	P,LOOK		;DISPLAY IT
	  JFCL
	  JFCL
	TYPE( Multi-level array definition not allowed.)
	PUSHJ	P,FLUSHA	;FLUSH ALL FROM BASRAY TO END OF NAME LIST
	JRST	RET		;EXIT TO USER MODEFORDDT


;	ROUTINE TO ENSURE THAT THERE ARE NO MORE DIMENSIONS
;	TO BE CHECK FOR THIS (SAVLOC) ARRAY

SUBCHK:	PUSHJ	P,MORDIM	;ARE THERE ANY MORE DIMENSIONS LEFT
	POPJ	P,		;O.K.
	JRST	ERR1		;NOT ENOUGH DIMENSION INFO

;	TYPE THE DIMENSION LIST FOR THE ARRAY NAME VALUE IN SAVLOC

DIM1:	PUSHJ	P,RAYNAM	;SET UP REFERENCES TO THIS ARRAY NAME
	JRST	ERR34		;NONE SUCH
	TRNE	T0,F10RAY	;IS THIS AN F10 DEFINED ARRAY
	SKIPA	T4,[EXP SAVLOC-1]  ;IF SO FOOL TYPDIM
	MOVE	T4,T5		;PREPARE FOR TYPDIM
	PUSHJ	P,TYPDIM	;TYPE OUT THE DIMENSIONS
	JRST	RET		;ALL DONE
;	ROUTINE TO REMOVE AND RETURN(GARBAGE COLLECTION) ALL REFERENCE
;	TO THE ARRAYS WHICH FOLLOW THAT DEFINED IN SAVLOC IF FLSHAL IS SET

FLUSHA:	TRO	T0,FLSHAL	;SET UP TO FLUSH ALL FROM BASE-ARRAY
	MOVE	T5,BASRAY	;GET THE BASE ARRAY VALUE
	MOVEM	T5,SAVLOC	;AND SET UP FOR RAYNAM
	PUSHJ	P,RAYNAM	;RESET F10RAY FLAG TO NEW BASRAY SETTING
	  POPJ	P,		;?????

FLUSH:	TRNN	T0,F10RAY	;NOTHING TO DO IF AN F10 ARRAY
	PUSHJ	P,RAYNAM	;SET UP POINTERS TO THE ARRAY IN SAVLOC
	  POPJ	P,		; CAN'T FIND THE ARRAY NAME
				;T3=POINTS TO LAST ARRAY NAME BLOCK
				;T5= CURRENT ARRAY NAME BLOCK
FLUSH2:	MOVE	T4,DSDIM(T5)	;[301] GET DIMENSION LIST ADDRESS
	MOVE	T2,DSNXT(T5)	;[301] GET NEXT MEMBER ADDRESS
	MOVEM	T2,DSNXT(T3)	;[301] LOOP OUT THE OFFENDING ARRAY NAME ENTRY
	PUSHJ	P,PUTRAY	;[301] RETURN A ENTRY
	PUSHJ	P,DELIST	;DELETE THE LIST STARTING AT C(T4)
	TRNN	T0,FLSHAL	;HARD FLUSH?
	POPJ	P,		;JUST ONE ARRAY FOR NOW
	MOVE	T5,DSNXT(T3)	;[301] GET NEXT ARRAY REFERENCE IF ANY
	JUMPE	T5,CPOPJ	;EXIT IF END OF LIST
	JRST	FLUSH2		;MORE TO DO

;ROUTINE TO DELETE A LIST - STARTING IN T4

DELIST:	SKIPN	T5,T4		;TEST FOR END OF LIST - RETURN ENTRY IN T5
	  POPJ	P,		;END OF LIST
	MOVE	T4,DDNXT(T4)	;[301] GET NEXT ENTRY ADDRESS
	PUSHJ	P,PUTRAY	;[301] RETURN THE OLD ENTRY
	PJRST	DELIST		;FOLLOW THROUGH TO END OF LIST

DIM5:	PUSHJ	P,DIMOUT	;DISPLAY ALL ARRAY INFO.
	LINE
	JRST	RET
;	DIMENSION LOGIC
CARRAY:	TROA	T0,CHARS	;[157]Character array

DUBLE:	TRO	T0,DOUBLE	;[112] FLAG THIS AS A DOUBLE WORD ARRAY

DIM:	JUMPL	T0,DIM5		;OUTPUT ALL DIMENSION SPECS
	PUSHJ	P,TTYIN		;GET NEXT USER STRING
	JUMPE	T3,DIM5		;TYPE ALL ARRAYS IF EOL

	PUSHJ	P,ALLNUM	;SEE IF USER TYPED A LABEL
	  JRST	DIM13		;NO - MUST BE VARIABLE
	JRST	BADSYN		;BAD SYNTAX
DIM13:	PUSHJ	P,VALID		;CHECK VALIDITY OF VARIABLE
	STSYM	T4,MATHSM	;[402]THATS WHAT USER TYPED
	MOVEM	T4,SYM		;SAVE FOR 'EVAL'UATION
	PUSHJ	P,EVAL		;EVALUATE SYMBOL
	  JRST	ERR6		;WE DON'T HAVE IT
	MOVEM	T5,SAVLOC	;SAVE ARRAY NAME VALUE
	MOVE	T2,LSTCHR	;RE-INSTATE USERS LAST CHARACTER
	SKIPL	TERMK		;END OF LINE?
	JRST	DIM1		;YES - USER WANTS TO SEE DIMENSION LIST

	PUSHJ	P,NXTCHR	;MOVE TO NEXT SIGNIFICANT CHARACTER
	CAIN	T2,"("		; [ DENOTES START OF DIMENSION DEFINITION
	JRST	DIM14		;COMMAND - WILL NOW BE NON ZERO

	CAIE	T2,"["		; ( IS AN ALTERNATIVE TO [
	JRST	DIM7
	TLO	T0,LFTSQB	;FLAG THAT A LSB FOUND - SO RSB MUST END SPEC
DIM14:	PUSHJ	P,DIMIN		;SET UP A NEW ARRAY DEFINITION
	JRST	RET

DIM7:	CAIE	T2,"/"		;A / IS ACCEPTABLE TO REMOVE ARRAYS
	JRST	BADSYN		;ANYTHING ELSE WONT DO
	PUSHJ	P,TTYIN		;GET NEXT INPUT
	JUMPN	T2,BADSYN	;MUST BE LINE END NOW
	JUMPE	T3,BADSYN	;NO CHARACTERS??
	LSHC	T2,6		;GET THE FIRST SWITCH CHARACTER
	CAIE	T2,'R'		;DID THE USER REQUEST A REMOVE
	JRST	BADSYN		;NO - WELL TOO BAD
	PUSHJ	P,RAYNAM	;SEE IF WE KNOW ABOUT HIS ARRAY
	  JRST	ERR26		;NO - TELL HIM
	PJRST	DMFLSH		;REMOVE IT
;	ROUTINE TO SET UP A NEW ARRAY DEFINITION

DIMIN:	SETZM	DIMTOT		;CLEAR TOTAL ELEMENT COUNT
	TROE	T0,BASENM	;HAS A BASE NAME BEEN ACCEPTED
	JRST	DIM0		;YES - DON'T FLUSH YET
	SETZM	F10RP		;[163]Reset
	PUSH	P,T0		;PROTECT THE DOUBLE FLAG AWHILE
	PUSHJ	P,RAYNAM	;HAVE WE HAD THIS BASE ARRAY BEFORE
	 JRST	DIMBAS		;[163]No references to this array
	TRNE	T0,F10RAY	;[163]Compiler reference?
	 JRST	DRNGPR		;[163]YES. Go get range product
	PUSHJ	P,FLUSH		;[163]Clear user reference
	PUSHJ	P,RAYNAM	;[163]Look for compiler reference
	 JRST	DIMBAS		;[163]None
	TRNN	T0,F10RAY	;[163]Better be F10 defined!!!!
	 JRST	DIMBAS		;[163]NOT!!!!!
DRNGPR:	SETZM	PUTTER		;[163]Reset first-time flag
	PUSHJ	P,GET.RP	;[163]Get the compiled range-product
	MOVE	T5,DIMTOT	;[163]Load the range product
	MOVEM	T5