Google
 

Trailing-Edge - PDP-10 Archives - BB-BT99S-BB_1990 - 10,7/ddt/ddt.mac
Click 10,7/ddt/ddt.mac to see without markup as text/plain
There are 31 other files named ddt.mac in the archive. Click here to see a list.
SUBTTL	DDT	/TW/PFC/TWE/EJW/JNG/RDH/DIB/DLM/JBS/PTR/JM/RCB 18-Sep-89


	COMMENT	\

DDT  --  "Dynamic Debugging Technique" for TOPS-10/TOPS-20

;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1970,1980,1983,1984,1987,1988,1989.
;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 THAT IS NOT SUPPLIED BY DIGITAL.

\


;DDT VERSION IDENTIFICATION

MAJVER==45	;MAJOR VERSION LEVEL
MINVER==1	;MINOR (MAINTENANCE RELEASE) LEVEL
CSTVER==0	;CUSTOMER VERSION (WHO LAST . . .)
EDTVER==715	;EDIT LEVEL

%%DDT==:<BYTE (3)CSTVER(9)MAJVER(6)MINVER(18)EDTVER>

	IF2	<PURGE MAJVER,MINVER,CSTVER,EDTVER>
;               TABLE OF CONTENTS FOR DDT
;
;
;                        SECTION                                   PAGE
;    1. REVISION HISTORY..........................................   5
;    2. DDT ASSEMBLY SWITCHES.....................................  10
;    3. TITLE AND VERSION SETTING.................................  11
;    4. OPDEFS, MACROS, ETC.......................................  12
;    5. DDT SYMBOLS...............................................  16
;    6. GLOBAL SYMBOLS FOR USE BY THE OUTSIDE WORLD...............  17
;    7. MEMORY ALLOCATION PARAMETERS..............................  18
;    8. MISCELLANEOUS DDT SYMBOLS.................................  20
;    9. FILDDT
;         9.1   COMMAND SCANNER...................................  25
;         9.2   SETUP PAGE BUFFERS AND SYMBOLS....................  53
;   10. START DDT.................................................  59
;   11. DDT COMMAND PARSER........................................  60
;   12. COMMAND DISPATCH TABLE....................................  65
;   13. COMMAND ROUTINES
;        13.1   CLASS 1...........................................  66
;        13.2   CLASS 2...........................................  84
;        13.3   CLASS 3...........................................  85
;        13.4   CLASS 4...........................................  86
;        13.5   CLASS 5...........................................  87
;        13.6   CLASS 6...........................................  89
;        13.7   REGISTER DEPOSIT AND OPEN.........................  89
;        13.8   RETYPE LAST QUANTITY..............................  97
;        13.9   TYPEOUT MODE CONTROL..............................  98
;        13.10  LIMITS AND PATCHING............................... 100
;        13.11  MEMORY AND PAGING CONTROL......................... 105
;        13.12  BREAKPOINT FACILITY............................... 111
;        13.13  EXECUTE AND SINGLE STEP........................... 118
;        13.14  PUNCH PAPER TAPE.................................. 144
;        13.15  SEARCHING......................................... 148
;        13.16  COMMAND FILE INPUT................................ 150
;        13.17  MISCELLANEOUS COMMANDS............................ 153
;   14. FILE SPECIFICATION PARSING AND ERROR ROUTINES............. 159
;                        SECTION                                   PAGE
;   15. ENTER AND LEAVE DDT
;        15.1   SAVE.............................................. 169
;        15.2   RESTOR............................................ 174
;        15.3   SWAP.............................................. 176
;        15.4   BCOM.............................................. 177
;   16. WORD TYPEOUT AND FORMATTING ROUTINES...................... 180
;   17. OUTPUT SUBROUTINES........................................ 187
;   18. SYMBOL TABLE ROUTINES
;        18.1   CHECK POINTERS.................................... 192
;        18.2   CONVERT SYMBOL TO VALUE........................... 194
;        18.3   CONVERT VALUE TO SYMBOL........................... 196
;        18.4   HARDWARE OPCODE PROCESSING........................ 199
;        18.5   FIND PROGRAM NAME................................. 209
;        18.6   REMOVE AN UNDEFINED SYMBOL........................ 210
;        18.7   SYMSET, USYSET, AND ADVSYM........................ 211
;   19. MEMORY MANAGEMENT ROUTINES
;        19.1   FETCH............................................. 218
;        19.2   DEPOSIT........................................... 226
;        19.3   ADDRESS MAPPING................................... 238
;        19.4   PHYSICAL MEMORY................................... 243
;        19.5   FILDDT I/O........................................ 246
;        19.6   SYMBOL TABLE ACCESS............................... 252
;        19.7   ADDRESS CHECKING.................................. 259
;        19.8   MISCELLANEOUS..................................... 270
;   20. PRESERVATION ROUTINES..................................... 286
;   21. TELETYPE IO LOGIC
;        21.1   DEFINITIONS....................................... 288
;        21.2   INPUT ROUTINES.................................... 291
;        21.3   LINE BUFFERING ROUTINES........................... 295
;        21.4   UTILITY ROUTINES.................................. 312
;        21.5   OUTPUT SUBROUTINES................................ 319
;        21.6   SAVE/RESTORE...................................... 324
;   22. STORAGE
;        22.1   LITERALS AND END OF CODE.......................... 336
;        22.2   ALLOCATION MACROS................................. 337
;        22.3   MISCELLANEOUS..................................... 339
;        22.4   $X LOGIC AND PATCH COMMAND........................ 341
;        22.5   BREAKPOINTS....................................... 342
;        22.6   SYMBOL TABLE LOGIC................................ 344
;        22.7   ADDRESSING DATA................................... 346
;        22.8   SAVE AREAS FOR PREVIOUS CONTEXT................... 347
;        22.9   STATE VARIABLES................................... 349
;        22.10  FILDDT............................................ 350
;        22.11  PUSH DOWN LIST.................................... 353
SUBTTL	REVISION HISTORY

;THE REVISION HISTORY STARTS SUDDENLY AT EDIT 200
;
;	DDT %37(200)   RDH   14-NOV-76

;200	RDH	14-NOV-76	SPR 10-17714
;	VALIDITY-CHECK THE SYMBOL POINTER FOR THE HIGH-SEG SYMBOL
;	TABLE (.JBHSM) RATHER THAN ARBITRARILY BELIEVING IT (AND
;	SUBSEQUENTLY ILL MEM REF'ING, ETC.).

;201	RDH	14-NOV-76	SPR 10-18806
;	MORE OF EDIT 200, AT DEF1:

;202	RDH	14-NOV-76	SPR 10-19661
;	TREAT THE MAP INSTRUCTION "E" FIELD AS AN IMMEDIATE QUANTITY
;	RATHER THAN AS A MEMORY REFERENCE.

;203	RDH	14-NOV-76
;	EXPAND FILDDT TO HANDLE FULL 22-BIT ADDRESSING IN EXE-FORMAT
;	FILES (SPECIFICALLY CRASH.EXE).

;204	RDH	14-NOV-76	SPR 10-20165
;	IMPLEMENT SPECIAL BYTE-FORMAT TYPEOUT FOR THE VARIOUS
;	BYTE MANIPULATION INSTRUCTIONS. CODE COURTESY OF THE
;	UNIVERSITY OF ARIZONA.

;205	RDH	15-NOV-76
;	PUT TAG PTDFLG: UNDER FTYANK RATHER THAN FTEXEC!FTFILE FOR
;	THOSE SITES THAT WISH TO TAKE THEIR CHANCES WITH $Y IN EITHER
;	UDDT OR VMDDT (NOTE: $Y USES I/O CHANNEL 17 - BE WARNED)

;206	RDH	4-DEC-76
;	REWRITTEN CODE IN CHKADR (TO BETTER HANDLE KL'S) FORGOT HOW
;	KA'S WORKED AND LOST THE APR PI ASSIGNMENT.

;207	RDH	4-DEC-76
;	IMPLEMENT "/D" FOR FILDDT  --  TREAT FILE SPECIFIED AS PURE
;	DATA FILE - DON'T CRUMP ON FIRST 20 LOCATIONS (THE "ACS"),
;	DON'T LOOK FOR SYMBOL TABLE. IF NOT .EXE FORMAT AND NOT .XPN
;	FORMAT THEN "/D" IS ASSUMED.

;210	RDH	6-DEC-76
;	EXTEND THE $M COMMAND  --  <M>$<N>M  --  WHERE <N> IS THE
;	MASK NUMBER AND <M> IS THE ASSOCIATED MASK.
;
;	<N> =  0 OR NOT-SPECIFIED THEN <M> IS THE SEARCH MASK
;	<N> = 1 THEN <M> IS TTY CONTROL MASK:
;		1B35 = 1 THEN "ECHO" <DEL>'S AS <BS><SP><BS>
;211	RDH	6-DEC-76
;	NEW ASSEMBLY PARAMETER "SKPMAX" TO SET MAXIMUM NUMBER OF
;	LOCATIONS SKIPPED FOR $X LOGIC. IF <INSTR>$X THEN TYPE
;	<SKP> FOR EACH LOCATION SKIPPED. IF $$X THEN DO INDEFINITE
;	$X UNTIL OLD-PC .LT. NEW-PC .LE. OLD-PC+SKPMAX

;212	RDH	7-DEC-76
;	MATCH ANGLE BRACKETTS  --  <<
;	WHEN PATCHING ($>) DON'T INSERT A 0 WORD UNLESS USER EXPLICITLY
;	TYPED IT - I.E., ALLOW THE $> TO APPEAR BY ITSELF - THE WAY MOST
;	PEOPLE TEND TO USE IT.

;213	RDH	9-DEC-76
;	CHANGE SKIPN'S TO SKIPE'S IN [207] AND CAILE TO CAIL IN [210]

;214	RDH	18-DEC-76
;	MATCH ANGLE BRACKETTS IN EDIT [212] COMMENTS TO KEEP VARIOUS
;	AND SUNDRY PEOPLE HAPPY.

;215	RDH	19-DEC-76
;	IF SPYSEG THEN NO HISEG SYMBOL TABLE.

;216	RDH	19-DEC-76
;	CHKHSM ROUTINE ([200],[201]) IS TOO RESTRICTIVE, WON'T ALLOW
;	.JBHSM TO POINT TO LOW SEG; CHKADR ROUTINE WON'T ALLOW RANDOM
;	NON-CONTIGUOUS PAGES.

;217	RDH	19-DEC-76
;	NAMSET ROUTINE (TO HANDLE MODULE$:) ASSUMES HIGH SEGMENT ALWAYS
;	STARTS AT 400000, LEADING TO SUBSEQUENT ILL MEM REF'S.

;220	JNG	28-JAN-77
;	PREVENT ILL MEM REF ON PATCH CLOSE WHEN USING A WRITE-LOCKED
;	(E.G. HISEG) SYMBOL TABLE.

;DDT %40(220) MARCH, 1977

;221	TAH	13-MAR-77
;	ADD COMMAND FRONT END TO INTERFACE FILDDT TO TOPS-20 SYSTEM.
;	ADD KL PAGING CODE TO CVTADR, ALL UNDER FTFD20 CONDITIONAL
;	(FTFILE MUST STILL BE ON ALSO).

;222	ASM	13-MAR-77
;	IN EXEC DDT DETERMINE EXEC VIRTUAL ADDRESS OF EPT BY SCANNING
;	EXEC VIRT ADR SPACE IF PAGING IS ON.

;223	TAH	13-MAR-77
;	MAKE LPDL LARGER FOR TOPS-20 MDDT
;224	RDH	13-MAR-77
;	MAKE SEARCHES HANDLE NON-CONTIGUOUS CORE/FILE IMAGES, ADD
;	TWO NEW ASSEMBLY PARAMETERS:
;
;	    INDPTH	;MAX INDIRECT NESTING FOR $E SEARCHES
;	    LISCNT	;NUM OF <PUSHJ P,LISTEN>'S TWEEN INCHRS'S

;225	RDH	13-MAR-77
;	HANDLE TYPEOUT RADIX .GE. 10 (E.G., HEX) MORE GRACEFULLY

;226	RDH	13-MAR-77
;	EDIT 215 IS WRONG, .GTSGN == 14

;227	JNG	13-MAR-77
;	ADD CODE TO DDT TO WRITE-ENABLE PAGES ON TOPS-20 BEFORE
;	ATTEMPTING TO WRITE THEM - E.G., FOR BREAKPOINTS, PATCHS,
;	AND SO FORTH. IF PAGE NOT WRITE-ENABLED, SET COPY-ON-WRITE
;	SO AS NOT TO ZAP OTHER USERS "SHARING" THE PAGE.

;230	RDH	13-MAR-77
;	WHEN IN A COMMAND FILE ($Y) THEN DO NOT CHECK THE COMMAND
;	FILE FOR INPUT ON CALLS TO LISTEN - ONLY ACCEPT PHYSICAL
;	TTY INPUT.

;231	RDH	14-MAR-77
;	CLEAR $U POINTERS IN FILDDT ON ^Z, START SEQUENCE

;232	RDH	14-MAR-77
;	UPDATE LH(.JBSA) ON PATCH END IF .JBFF WAS DEFAULTED TO
;	ON PATCH BEGIN. THIS WAY THE PATCH IS AT LEAST SAVED ON
;	SAVE'S, RESET'S, AD NAUSEUM.

;233	RDH	14-MAR-77
;	REVAMP PATCH LOGIC ($< AND $>) TO DISPLAY LOCATION BEFORE
;	MODIFYING SAME LOCATION SO THAT FILDDT CAN PATCH RUNNING
;	MONITOR (ALSO LOOKS NEATER).

;234	RDH	23-MAR-77
;	ADD NEW "MASK" COMMAND <N>$2M TO SET THE SYMBOL OFFSET RANGE
;	(I.E. THE RANGE IN WHICH VALUES WILL BE TYPED IN THE FORM
;	SYMBOL+<OFFSET>) TO <N>. ADD ASSEMBLY PARAMETER "ADRNGE"
;	AS THE DEFAULT VALUE. ALSO MAKE $1M/ ETC. WORK.

;235	RDH	24-MAR-77
;	REVAMP BYTE TYPEOUT LOGIC: ADD <N>$3M AS BYTE TYPEOUT MASK
;	(EACH "1" BIT IN THE MASK MARKS THE END OF A BYTE, BIT 35
;	IS ALWAYS CONSIDERED THE END OF A BYTE). FOR VALUES OF <N>
;	SUCH THAT 1 .LE. <N> .LE. 36(10) THE COMMANDS $<N>O & $$<N>O
;	WORK AS USUAL BY SETTING AN INTERNAL BYTE MASK. FOR <N> = 0
;	THE $3M BYTE MASK WILL BE USED. FOR <N> = <NULL> (I.E. THE
;	$O COMMAND) THE CURRENTLY PREVAILING $O OR $$O MASK WILL
;	BE USED IF NON-BLANK, ELSE THE $3M MASK WILL BE USED.
;	$$O MAKES PERMANENT THE CURRENTLY PREVAILING $O (OR $$O)
;	BYTE MASK.
;236	RDH	14-APR-77
;	ADD IFN FTYANK CONDITIONALS SO THAT FILDDT CAN BE ASSEMBLED
;	WITH FTYANK TURNED OFF.

;237	RDH	17-APR-77
;	GENERAL CLEANUP AND REARRANGEMENT. MAKE TOPS-10 DDT SEARCH
;	THE "C" UNIVERSAL FILE. TYPE OUT "DDT" WHEN USER MODE DDT
;	IS ENTERED. PUT TOPS-10-SPECIFIC CODE UNDER "IFN FTDEC10"
;	RATHER THAN "IFE FTDEC20".

;240	RDH	15-JUN-77
;	ADD CODE TO TYPE OUT SYMBOLIC WORDS WITH USER-DEFINED SYMBOLS
;	SUCH AS THE CALLI OR JSYS MNEMONICS. ORDER OF SEARCH IS:
;	   1)	OPCODE & AC & I & X & Y FIELDS
;	   2)	OPCODE & I & X & Y FIELDS (E.G. CALLI OR JSYS)
;	   3)	OPCODE & AC FIELDS (E.G. TTCALLS)
;	   4)	OPCODE ONLY
;	   5)	HARDWARE-KNOWN OPCODE (JRST, ETC.)
;	PUT CODE UNDER FTOPX .NE. 0 CONDITIONAL SINCE UNTIL SORTED
;	SYMBOL TABLES AVAILABLE THIS CODE TAKES MUCH RUN TIME.
;	ALSO MAKE TRXX AND TLXX TYPE OUT ADDRESS AS OCTAL RATHER
;	THAN SYMBOL+OFFSET.

;241	RDH	15-SEP-77	SPR # 10-22011
;	"777777" COULD GET TYPED OUT AS "-1" WHEN $X'ING IF THE
;	AC BEING TYPED OUT WAS TYPED OUT IN XWD FORMAT.

;242	RDH	16-SEP-77	SPR # 10-22616
;	"AOS UND#(AC)" LOST BOTH THE UND SYMBOL AND THE AC IN
;	THE WORD BEING BUILT (I.E., LEFT ONLY THE AOS).

;243	RDH	16-SEP-77	SPR # 10-22788
;	PATCHING WITH FILDDT WRONG IF NONE OF THE USUAL PATCHING
;	SYMBOLS (PAT.., PAT, PATCH) ARE PRESENT AND THUS PATCHING
;	DEFAULTS TO C(.JBFF) - THE .JBFF USED WAS FILDDT'S, NOT
;	THE FILE'S.

;244	RDH	16-SEP-77	SPR # 10-22894
;	SOME RUBOUT'S STILL GET TYPED OUT.

;245	RDH	17-SEP-77	SPR # 10-23013
;	AFTER REFERENCING AN UNDEFINED SYMBOL, THE UNDEFINED SYMBOL
;	IS LEFT IN THE SYMBOL CACHE WITH ITS BOGUS VALUE (E.G., THE
;	ADDRESS TO FIX UP).

;246	RDH	25-SEP-77
;	BE MORE CHOOSEY ABOUT TYPE-IN INVOLVING UNDEFINEDS - CATCH ERRORS
;	SUCH AS "PUSHJ UND#,FOO" OR "MOVE 4,(UND#)"
;247	RDH/JNG	16-OCT-77 TO 28-JUN-78
;	MASSIVE DEVELOPMENT AND REVAMPING: EXTENDED ADDRESSING; JSYSIZE FILDDT;
;	REMOVE SYMBOL CACHE; ADD $0W AND $1W; DISK SUPER I/O (FILDDT);
;	PHYSICAL MEMORY ADDRESSING; KS-10 SUPPORT; KI/KL PAGING SUPPORT;
;	$Z; $8T AND $9T; $.; $U ENHANCEMENTS; $B ENHANCEMENTS; $X EN-
;	HANCEMENTS; DECOMMIT EXEC PAPER TAPE STUFF; SYMBOLIC TYPEOUT
;	ENHANCEMENTS; $Y ENHANCEMENTS (TOPS-10 ONLY); NUMEROUS RANDOM
;	BUG FIXES. CALL VERSION 41.

;250	JNG	15-AUG-78
;	SEARCH UUOSYM, MACTEN INSTEAD OF C.

;DDT %40A(250)	OCTOBER, 1978

;251	JNG/RDH	15-AUG-78 TO 26-JAN-79
;	CONTINUING AND FIXING BUGS IN 247: IMPLEMENT HISEG SYMBOL TABLES
;	IN FILDDT; ALLOW THE SYMBOL TABLE TO BE IN ANOTHER ADDRESS SPACE
;	FOR EDDT AND MDDT; ADD $: WITH NO ARGUMENT; ADD "M" ERROR.

;252	JNG	4-FEB-79
;	CHANGE HIDDEN SYMBOL LOGIC TO DO EXEC VIRTUAL BLT'S INSTEAD
;	OF SWITCHING THE EPT BASE ADDRESS.

;253	DIB	8-MAR-79
;	INSERT A NEW SYMBOL TABLE CACHE FOR OUTPUT ONLY.  ALSO MOVE
;	DATA PAGES BELOW CODE PAGES SO SYMBOL CACHE WILL FIT IN UDDT.

;254	JNG/RDH	8-MAR-79
;	GET FAKEAC LOGIC RIGHT IN $U COMMANDS.  BROKEN BY 251. ONLY
;	SETUP .JBVER IF FILDDT. ADD /A (ABORT ON COMMAND ERROR) FOR
;	$Y. MAKE ^W WORK MORE REASONABLY ON -10. MAKE FANCY RUBOUT
;	HANDLING AUTOMATIC ON -10 (7.01 ONLY). ADD $$. AS PREVIOUS
;	$. (USEFUL FOR $$.<$$X ETC.).
;	(MATCH ANGLE BRACKETS:>)

;255	RDH	31-MAR-79
;	LOST INSTRUCTION IN EDDT FOR KI-10'S. SUPPRESS ADDRESS BREAKS
;	IN FETCH AND STORE LOGIC. IF $$X'ING (OR $W'ING (SEARCHING)
;	OR $Z'ING (DEPOSITING)) AND USER TYPES A ? THEN GIVE A QUICKIE
;	TYPEOUT STATUS. SECOND FIELD TEST FOR TOPS-10 7.00.

;256	RDH	17-APR-79
;	RANDOM VERSION 41 BUGS (IN PARTICULAR $P OF A BREAKPOINT CAUSED
;	BY XCT'ING A BREAKPOINT LOCATION FAILED). HANDLE ERCAL/JMP ON
;	$P. HANDLE INIT UUO.

;257	JNG	21-APR-79
;	CONVERT $U COMMAND TO FUNCTION CODES.
;260	RDH	13-MAY-79
;	ADD ADR$V COMMAND TO "WATCH" A LOCATION AND REPORT ANY CHANGE IN
;	ITS CONTENTS (ADR DEFAULTS TO LAST LOCATION OPENED).

;261	RDH	22-MAY-79
;	STUPID LITTLE BUGS.

;262	RDH	8-JUL-79
;	XJRSTF AND FRIENDS WANT ALL 36 BITS OF PC FLAGS, NOT JUST THE
;	LEFT-MOST 18 BITS. $I+3 IS 36-BIT PC FLAGS, $I+4 IS 36-BIT PC.

;263	RDH	16-JUL-79
;	MORE STUPID LITTLE BUGGIES. IN PARTICULAR, N$P BROKE.

;264	DZN	25-OCT-79
;	REPLACE SUB IN LOOKDN WITH EQUIVALENT CODE THAT DOESN'T OVERFLOW.

;265	DZN	6-NOV-79
;	REMOVE MULTIPLY-DEFINED GLOBALS $nB, $I, $M WHEN KDDT AND MDDT ARE
;	LOADED TOGETHER.

;DDT %41(265) RELEASED MAY, 1980
;VERSION 41A BEGINS

;266	DIB	18-FEB-80
;	ADD RP20 SUPPORT TO FILDDT.

;267	BPK	11-APR-80
;	REPLACE SUB IN LOOK10 WITH EQUIVALENT CODE THAT DOESN'T OVERFLOW.

;270	BPK	17-APR-80
;	TURN OFF CTRL-O WHENEVER WE STOP AT A BREAKPOINT.

;271	DLM	4-OCT-79
;	FLAG IN TTYMSK FOR INST TYPEOUT ON BPT; WARNING IF BPT INSERTION/REMOVAL
;	FAILS; DIAGNOSTICS ON MEM REF FAILURE; RUN IN NON-0 SEC IF POSSIBLE.

;272	JBS	9-NOV-80	SPR 10-30155
;	ADD ^E TEXT TO -10 HELP MESSAGE.

;273	JBS	10-NOV-80	SPR 10-30019
;	FIX OVERFLOW IN ADD INSTR. AT L4+18.

;274	JBS	12-NOV-80	SPR 10-30058
;	FIX SUB AT DOITX0 THAT SET CARRY1 AND CARRY0 IN USER CONTEXT.

;275	JBS	14-NOV-80
;	FIX ERJMP/ERCAL $X ROUTINES TO AGREE WITH EDIT 274.

;276	JBS	17-NOV-80	SPR 10-30156
;	MOVE "PUSH" OUT OF CONDITIONALS TO AGREE WITH "POP" IN RDBIN.
;277	JBS	18-NOV-80	SPR 20-15067
;	FIX $<RET> AFTER $<TAB>.

;300	JBS	19-NOV-80	SPR 10-30237
;	ADD USER TTY CONTROL BIT FOR $Y ECHO DURING FILE READ/EXECUTION.

;301	JBS	25-NOV-80
;	ALL KINDS OF MISC. EDITS TO FIX LITTLE THINGS HERE AND THERE.

;302	JBS	3-DEC-80	SPR 10-30277
;	FIX MOVING OF PAT.. IN $< MODE.

;303	JBS	4-DEC-80
;	MAKE $Z ABORT WITH "?" IF ANY MEM. WRITE FAILS, REMOVE $$Z,
;	MOVE /H TEXT AROUND FOR -10 VERSION, FIX EXTENDED ADDRESSING BUG.

;304	JBS	10-DEC-80	SPR 10-30337
;	FIX ILDB TYPEOUT IN EXTENDED ADDRESSING MODE - WAS MESSING UP SECTION #
;	WHEN AN AC WAS USED.

;305	JBS	29-DEC-80
;	REMOVE TEMPORARY PATCH THAT BYPASSED MACRO BUG, REVISE EDIT 300.

;306	JBS	29-DEC-80	SPR 10-30404
;	ADD $$1X FEATURE TO DO QUICKER $$X BY NOT CHECKING FOR DANGEROUS
;	INSTRUCTIONS.  USED OVER LONG BUT SAFE PUSHJ'S, ETC.

;307	JBS/RDH	30-JAN-81
;	SETUP LOCATION .JBBPT WITH $0BPT FOR TOPS-10 USER/EXEC DDT'S,
;	CHANGE FLOATING OUTPUT SUBROUTINE "TFLOT" TO USE "FLOUT" JSYS ON
;	TOPS-20, ADD $2F DOUBLE-PRECISION FLOATING TYPEOUT ON TOPS-20,
;	ALLOW READING $M AND $U MASKS IN FILDDT (SPECIAL-CASE THEM),
;	REMOVE $L PAPER TAPE PUNCH CODE, ADD $[ANY DIGIT] COMMAND TO 
;	ABORT PATCH INSERT MODE, MAKE $[ANY DIGIT]< ILLEGAL,
;	CLEAR "PATCH MODE" FLAG AND RESET LOCATION POINTERS AT START-UP,
;	DON'T ALLOW NESTED PATCHING, CHANGE <LF> AND ^H TO RECOGNIZE
;	DOUBLE-WORD MODE ON TOPS20 (I.E., DOUBLE PRECISION FLOATING TYPEOUT),
;	CHANGE $X CODE TO CLEAR INPUT BUFFER AND RESET ^O BEFORE NEXT
;	INSTRUCTION TYPEOUT.
;	(MATCH ANGLE BRACKETS IN [302] >)

;310	JBS	22-JAN-81	SPR 20-15518
;	CHANGE HANDLING OF TEXT INSERTION - AUTOMATICALLY CLOSE LOCATION
;	UPON RECEIPT OF TEXT DELIMITER.

;311	JBS	6-FEB-81
;	REDEFINE PATCH ABORT COMMAND TO $0>, FIX BREAKPOINT TYPEAHEAD
;	CLEARING BUG - WAS MUNCHING FIRST CHR. TYPED AFTER BREAKPOINT
;	STUFF BEGAN TYPING OUT, FIX FILDDT BUG WHICH WOULD SETUP PAGTBL
;	WRONG (SOMETIMES) FOR PAGES OVER 4000, CHANGE TEXT INSERTION MODE
;	SO IT WON'T FORCE A CRLF IF A LOCATION IS OPEN BUT NOTHING HAS
;	BEEN DEPOSITED YET (REVISION OF EDIT 310), REINSTALL EDIT 273
;	WITH A CHANGE (EDIT 303 REMOVED EDIT 273).
;312	RDH/JBS	4-MAR-81
;	(<<MATCH ANGLE BRACKETS)
;	FIX BROKEN NEGATIVE INTEGER TYPEOUT, FIX TOPS-10 OUTPUT BROKEN BY
;	EDIT 305, MAKE $7T MODE DO RIGHT-JUSTIFIED TYPEOUT ONLY IF LEFT 29
;	BITS ARE ALL NULL, CHANGE PATCH ABORT (AGAIN) TO $$0>, MAKE A BOTCHED
;	PATCH-INSERT FIX PTLOC BEFORE LOSING, MAKE $N> SET MAXIMUM SKIP
;	RETURNS FROM PATCH (N=1 GIVES 1 JUMPA, ETC.), FIX BUG THAT WOULD SET
;	"." TO ZERO AFTER ^C/DDT COMMANDS, ADD $0T/$$0T COMMAND TO TYPE THE
;	ASCIZ STRING STARTING AT ".", MAKE XMOVEI TYPE OUT AC CONTENTS AFTER
;	$X.

;313	JBS	10-APR-81
;	EDITS 302 AND 312 MUST BE INSTALLED FIRST -
;	ADD <ADDR.>$0T TO TYPE ASCIZ STRING AT <ADDR.>, CHANGE $0T CODE TO
;	BE MORE EFFICIENT, ALLOW USER TO STOP $0T TYPEOUT ANYTIME, MORE WORK
;	TO GET $T TO WORK RIGHT FOR RIGHT-JUSTIFIED SINGLE CHR., HANDLE RPACS%
;	ERROR IF SECTION DOESN'T EXIST, MAKE FILDDT STOP SEARCHING AFTER EOF
;	ON DATA FILES, FIX MOVING OF PAT.. WHEN AN UNDEFINED SYMBOL EXISTS
;	AND A NEW DEFINITION IS MADE (CACHE PROBLEM), MAKE CONDITIONAL
;	BREAKPOINT INSTRUCTION EXECUTE IN USER CONTEXT, DON'T FORCE $P
;	DEFAULT TO 1 IF USER HAS SPECIFIED OWN NUMBER.

;314	JBS	10-AUG-81
;	REMOVE AUTO CRLF AFTER LONG STRING INSERTION, FIX ANOTHER BUG WITH
;	UNDEFINED SYMBOLS NOT GETTING FIXED UP.

;315	JBS	13-AUG-81	SPR 10-31459
;	OUTPUT RADIX WASN'T SETUP BEFORE TYPING FILOP. ERROR CODE, CAUSING
;	GARBAGE TO PRINT OUT.  FILDDT-10 ONLY.

;316	JBS	17-AUG-81
;	FIND "REAL" EOF FOR A TOPS-20 FILE - EDIT 313 BROKE THIS BECAUSE IT
;	ASSUMED SIZEF% RETURNED EOF.  BUT EOF DOESN'T REALLY EXIST IN TOPS-20!

;317	JBS/RDH	19-AUG-81
;	[JBS] FIX FILDDT FOR BIG DATA FILES AGAIN.
;	[RDH] HANDLE ^S/^Q IN EXEC MODE, IMPLEMENT EXEC MODE TYPEAHEAD,
;	IMPLEMENT XXX<ADR>N$B WHERE "ADR" IS ADDRESS OF COMMAND STRING TO
;	BE EXECUTED ON BREAKPOINT (DEPENDS ON FTYANK), HANDLE $X'ING IN
;	THE ACS IN NON-ZERO SECTION (PC ALWAYS LOCAL, THEREFORE ALWAYS
;	A "REGISTER" ADDRESS)

;THIS SOURCE FILE IS MADE FROM FIELD-IMAGE DDT 42(320), AS RELEASED WITH
;TOPS-20 V5.  IT INCLUDES SOME PUBLISHED AND UNPUBLISHED EDITS MADE TO DDT
;41A.

;320	RDH/JBS	30-SEP-81
;	EDIT 317 BROKE TYPING SOMETHING TO GET OUT OF A (E.G.) SEARCH LOOP 
;	(EXEC MODE ONLY), PRESERVE APR BITS IN EXEC MODE, TYPE "/" INSTEAD OF A
;	SPACE IN $0T COMMAND.  NOTE: THIS EDIT IS NOT IN 42(320).

;321	JBS	30-SEP-81	10-31641
;	REMOVE DEFINITION OF RADIX50 PAT FROM LIST OF PATCH LOCATIONS IN
;	USER MODE.

;322	JBS	6-OCT-81
;	PHYSICALLY REMOVE DESUPPORTED $L CODE.

;323	ALREADY INSTALLED IN 42(320).


;324	JBS	27-JAN-82
;	FIX TYPO IN EDIT 317 THAT CAUSED EDDT-10 TO HANG ON STARTUP.

;DDT %41A(324) RELEASED FEB, 1982
;%42(320) RELEASED ON TOPS-20 VERSION 5 SYSTEMS SUMMER 1982.

;325	RDH/JBS	3-FEB-82
;	FIX PUSH/POPJ MISMATCH THAT HAPPENS IF NO SPT SETUP IN KL-PAGING.

;326	JBS/RDH	19-MAR-82
;	CHANGE CONDITIONAL BREAKPOINT CODE TO COMPLETELY RESTORE THE WORLD
;	BEFORE EXECUTING (IN CASE OF CONSZ PI, ETC. IN EXEC MODE).

;327	JBS	12-MAY-82	20-17648
;	TYPE SYMBOL IN OPEN MODULE IN PREFERENCE TO A GLOBAL, IF THEY BOTH HAVE
;	THE SAME VALUE.

;330	NOT INSTALLED.

;331	JBS/RDH	17-DEC-82	20-17727
;	REWORK $X CODE TO MINIMIZE PROBLEMS WITH PSI SWITCHING.  USER WOULD
;	GET PSI TRAPS WITH DDT'S ACS SET UP, OR NOT GET PSI AT ALL.  THIS DOES
;	NOT ELIMINATE THE PROBLEM COMPLETELY (CAN'T BE DONE ANYWAY), IT JUST
;	HELPS IT A LOT.

;332	JBS	1-SEP-82	10-32308
;	MAKE RDIO NOT CRASH THE SYSTEM WHEN $X'ED ON A KS.  FIXED ON TOPS-10
;	AND EDDT-20; S/UDDT DON'T HAVE ENOUGH ROOM LEFT TO BE FIXED.

;333	DLM/RDH	25-DEC-82
;	NOTE: THIS EDIT IS NOT INSTALLED.  IT IS ONLY FOR FURTHER DOCUMENTATION
;	OF 42(320) AS RELEASED.
;	CREATE SECTIONS AS NEEDED FOR TOPS-20 USER-MODE DDTS; DEFAULT
;	THE SECTION IN ADDRESS EXPRESSION IF ADDRESS IS .LT. 18 BITS, OR
;	IF SPACE OR COMMA TYPED, BUT NEVER IF COMMA-COMMA TYPED; IMPLEMENT
;	"INTERNAL" ADDRESSES (E.G., FOR $M, $I, ETC.) - MAKE $NI, $NM, AND
;	$NU CONSISTENT (ALLOW SETTING AS WELL AS READING OF ALL).

;334	JBS	31-JAN-83	10-33035, 10-33811
;	TYPE I/O INSTRUCTIONS CORRECTLY.

;335	NOT INSTALLED.

;336	JBS	25-MAR-83
;	FIX ERROR MESSAGE TYPEOUT AT REMOER.

;337	JBS	2-FEB-83
;	FIX INEFFICIENT CODE AFTER SYMBOL TABLE CACHE FEATURE TEST WAS ADDED.

;< (match angle brackets)
;340	JBS	2-FEB-83
;	REMOVE $$0> AS PATCH ABORT COMMAND.  LEAVE $0< AS THE COMMAND.
;> (more matching anglies)

;341	NOT INSTALLED.

;342	JBS	16-FEB-83
;	FIX $G TO USE 30 BIT START ADDRESSES ON TOPS-20.

;343	JBS	25-FEB-83
;	REMOVE EXEC-MODE ONLY CODE FROM USER DDTS.  EDIT 331 MUST BE INSTALLED
;	FIRST.

;344	JBS	14-MAR-83
;	DON'T DIE IF USER GIVES BAD FORK NUMBER IN FORK<$$?.
;(MATCH ANGLE BRACKETS:>)

;345	JBS	4-APR-83
;	MOVE SOME CODE TO PAGES 764 AND 765 IN UDDT-20 TO GET CODE SPACE.

;346	JBS	4-APR-83
;	FIX EDIT 343 SO TOPS-10 USER MODE WORKS.  EDIT 343 MUST BE INSTALLED.

;347	JBS	6-APR-83
;	EXPAND EDIT 332 TO WORK IN UDDT-20 AND SDDT-20 ON THE KS.  EDIT 345
;	MADE ENOUGH ROOM TO INSTALL THIS BUG FIX.

;350	JBS	8-APR-83
;	FIX EXEC TYPEAHEAD CHECK AT LOOK2 + A FEW.

;351	JBS	8-APR-83
;	REMOVE DEFINITION OF MRPAC% JSYS FROM SOURCE.

;352	JBS	8-APR-83	20-19074
;	FIX $W IN FILDDT-20.

;353	JBS	6-MAY-83
;	FIX $? COMMAND TO NOT TYPE GARBAGE STRINGS.

;354	JBS	9-MAY-83
;	REMOVE $$? COMMAND FROM FILDDT-20.

;355	JBS	8-JUL-83
;	MOVE SAVE4 LABEL SO EXEC DDT'S START.  FIX TO EDIT 331 AND 332.

;356	NOT INSTALLED.

;357	JBS	26-JUL-83
;	FIX $W FOR DISKS - PAGE ACCESS BITS WERE NOT UPDATED.

;360	JBS	28-JUL-83
;	DO MONITOR FIXUPS RIGHT - PEEK JUST BEFORE POKE.'ING.

;361	RDH	15-NOV-83
;	KEEP THE LAWYERS HAPPY - PUT COPYRIGHT IN THE BINARIES

;362	PTR	20-DEC-83	20-17198
;	FIX NON-ZERO SECTION $X OF XMOVEI, XHLLI, LDB ET AL. BY
;	REMEMBERING THE LOCAL/GLOBAL PART OF THE EA CALC.
;	MAKE A NEW ENTRY IN $XTBL FOR XHLLI, SO SECTION NO. IS PRINTED.
;	ADD CODE TO TBPNT TO DECODE ALL FORMS OF BYTE POINTERS.
;	FIX EA CALC OF BYTE POINTERS AT IXBP; HANDLE ALL THE FORMATS.

;DDT %42A(362) SHIPPED WITH TOPS-10 7.02

;363	JBS	1-FEB-84	RAW
;	MAKE PSECT XCODE READ-ONLY.

;364	PTR	 7-FEB-84	10-34464
;	WRTWIN THOUGHT THE REFERENCED ADDRESS WAS ALWAYS IN R; IT ISN'T.
;	USE THE FILE PAGE NUMBER INSTEAD.

;365	RDH	21-FEB-84
;	ONLY GIVE HARDWARE 8 BITS OF CHAR IN EXEC MODE.

;366	PTR	21-FEB-84
;	DON'T CONFUSE FLOAT INPUT AND SYMBOLS STARTING WITH ".E" SO MUCH

;367	JM	21-JUN-84
;	FIX $O TYPEOUT MODE (N-BIT BYTES) SO THAT ADDRESSES ARE RENDERED
;	SYMBOLICALLY RATHER THAN ABSOLUTELY.

;370	JM	30-AUG-84	10-34852
;	MOVE TYPEOUT MODE SAVE FROM DD2: TO AFTER LIS1:

;371	JM	 2-OCT-84
;	CAUSE RUBOUT OF TEMPORARY TYPEOUT MODE TO WORK AGAIN (BROKEN BY
;	EDIT 370).

;372	JM	21-NOV-84
;	FIX SINGLESTEP OF XPCW:  RESTORE CORRECT CONTEXT; DON'T OVERWRITE
;	SAVED FLAGS WITH SAVED PC.

;373	PTR	 6-DEC-84
;	NOT INSTALLED, EQUIVALENT TO EDIT 621.

;374	PTR	 6-DEC-84
;	ALREADY INSTALLED AS EDIT 601.

;375	PTR	 6-DEC-84
;	NOT INSTALLED, EQUIVALENT TO EDIT 622.

;376	PTR	 6-DEC-84
;	NOT INSTALLED (PARTLY INSTALLED AS EDIT 422).

;377	PTR	 6-DEC-84
;	ALLOW < > AS PATH DELIMITERS AS WELL AS [ ] IN TOPS-10 FILESPECS.
;	MINOR BUG IN <LF> RE TYPEOUT MODE FLAG.
;EDIT NUMBERS THRU 417 RESERVED FOR DDT V42 SPR'S.
;DDT V43 DEVELOPMENT BEGINS AT EDIT 420.

;420	PTR	 9-JAN-84
;	CREATE THIS SOURCE FILE FROM DDT V42(362).  CLEAN UP COMMENTS,
;	MAKE CODE FORMAT CONSISTENT AS POSSIBLE.  NO CODE CHANGES.

;421	PTR	 9-JAN-84
;	SUPPORT INTER-SECTION BREAKPOINTS.  IMPLEMENT $4M.

;422	PTR	18-JAN-84
;	ADD SUPPORT FOR $X OF XJRST INSTRUCTION.  FIX IO INSTRUCTION
;	RESULTS TYPEOUT.

;423	PTR	19-JAN-84
;	NOT INSTALLED.

;424	PTR	19-JAN-84
;	REVISE INSTRUCTION TYPEOUT CODE TO ALLOW FOR SYMBOLS WITH
;	NON-ZERO LEFT HALVES.

;425	PTR	20-JAN-84
;	FIX $X OF STACK INSTRUCTIONS TO WORK WITH LOCAL STACK POINTERS
;	IN NON-DDT SECTIONS.

;426	PTR	23-JAN-84
;	ALWAYS INSERT/REMOVE BREAKPOINTS AROUND INSTRUCTIONS.  JSYS CAN
;	CAUSE RANDOM DISPATCHES, INTERRUPT OR ARITH OVL MAY OCCUR;
;	MAKE SURE DDT HAS A CHANCE OF RECOVERING.

;427	PTR	24-JAN-84
;	REDO SAVEG: A BIT.  MOVE SOME EXEC MODE TYPEAHEAD CHECKS.

;430	PTR	24-JAN-84
;	INSTALL DLM'S SYMBOL TABLE CHANGES VERBATIM -- WILL CHANGE TO
;	MEET SPEC LATER.  INCLUDES MDDT STUFF; RIP OUT WINDOWING CODE.
;	NO MORE "HIDDEN" SYMBOLS ON -20.

;431	PTR	25-JAN-84
;	ADD STACK/ARITH TRAP-CAUSING INSTRUCTIONS TO DANGEROUS OPCODE
;	TABLE; FIX [426] TO INSERT/REMOVE BPTS ONLY FOR DANGEROUS
;	INSTRUCTIONS.  REORGANIZE DANGEROUS OPCODE TABLE DEFINITION.

;432	PTR	26-JAN-84
;	FIX UP SYTSEC TO ASSUME -1,,N FORMAT.  IF WORD IS 0, DEFAULT
;	TO SECDDT.  CLEAR CACHE IF STUFFING NEW SYMBOL POINTERS (SYMCHK).

;433	PTR	30-JAN-84
;	MAKE FILDDT ASSEMBLE AGAIN.  CNTRLZ/CNTRLE WERE TOO BIG FOR COMMAND
;	DISPATCH TABLE.

;434	PTR	 3-FEB-84
;	KEEP SYMCHK FROM SWITCHING SYMBOL TABLES IN MDDT/KDDT.
;	NEVER LOOK OUTSIDE SECTION 0 FOR SYMBOL TABLES IF RUNNING IN ZERO.
;435	PTR	 3-FEB-84
;	FIX [430] TO USE IFIW WHEN ZEROING "@SYMP".
;	CHANGE MAP AC,(R) AND SKIP (R) TO USE @R (SO SEC. 0 REFS FROM
;	NON-ZERO WILL WORK).

;436	PTR	 6-FEB-84
;	FIX [430] SO DOESN'T REFERENCE .EDSEC ON -10.

;437	PTR	 6-FEB-84
;	SPECIAL MDDT BREAKPOINT INTERLOCK; ONLY ONE FORK CAN SET BREAKPOINTS
;	AT A TIME.  SET DEFAULT MDDT/KDDT BREAKPOINT BLOCKS.
;	CHANGE MDDT/KDDT PSECT NAMES.

;440	PTR	15-FEB-84
;	MAKE <FOO>$X DO THE INSTRUCTION IN USER'S SECTION, NOT DDT'S SECTION.
;	FIX CNTRLZ NOT TO USE $X CODE.

;441	PTR	15-FEB-84
;	MAKE $V DEFAULT SECTION IF NONE TYPED.

;442	PTR	16-FEB-84
;	FIX HANDLING OF SYTSEC SO SDDT STILL WORKS.
;	MAKE HISEG S.T. CHECKS DO LOCAL FETCHES.

;443	PTR	23-FEB-84
;	DEFAULT BPBLK TO LAST N WORDS IN SECTION.  MAKE SURE IT HAS ROOM
;	FOR $X NEEDS.

;444	PTR	24-FEB-84
;	FIX SYTSEC HANDLING SOME MORE SO S.T. STUFFING (INCL SDDT) WORKS IN
;	NON-ZERO SECTIONS.

;445	PTR	27-FEB-84
;	MAKE MDDT STACK POINTER GLOBAL.  OTHERS SHOULD STILL BE LOCAL.

;446	PTR	27-FEB-84
;	DON'T DIDDLE PSI STATUS IN MDDT. STACK NOT SET UP AT THAT POINT ANYWAY.

;447	PTR	27-FEB-84
;	IN <INSTR>$X, DON'T INSERT BREAKPOINTS UNLESS WE'RE REALLY GOING
;	TO EXECUTE THE INSTRUCTION.

;450	PTR	27-FEB-84
;	TURN SOME RAW NUMBERS INTO SYMBOLS IN KL PAGING STUFF.
;	FIX EXEC MODE $W, INCLUDE CST WRITE BIT.

;451	PTR	27-FEB-84
;	IMPLEMENT "PERMANENT DEFAULT SECTION," $6M.  IF SET, USE IT INSTEAD
;	OF LLOCS IN DEFSEC.  REWRITE DEFSEC TO INCLUDE NEW ROUTINE GDFSEC
;	(GET DEFAULT SECTION).
;452	PTR	28-FEB-84
;	WHEN A LOCAL AND GLOBAL HAVE THE SAME VALUE, CONSISTENTLY PICK
;	THE GLOBAL FOR TYPEOUT.  IMPROVEMENT ON [327].

;453	PTR	28-FEB-84
;	FIX PROBLEM WITH OKAF.  CLEAR IT IN MORE PLACES, SO # APPEARS
;	AFTER LOCALS CONSISTENTLY.

;454	PTR	 2-MAR-84
;	FIX PROBLEM WITH [447].  INSTR$X COULD DIE IF BREAKPOINTS SET.

;455	PTR	 5-MAR-84
;	IN KDDT USER MODE, JUMP INTO MONITOR ON ^Z SO IT CAN PLAY MAPPING
;	GAMES.  THIS IS SO "@GET SYSTEM:MONITR  @START 140" WILL WORK.

;456	PTR	21-MAR-84
;	OPDEF SOME OPCODES SO THAT DECREPIT VERSIONS OF MACRO CAN STILL
;	ASSEMBLE DDT.

;457	PTR	22-MAR-84
;	FIX SYMCHK NOT TO STEP ON FILDDT'S SYMBOL POINTERS.  FOR NOW
;	FILDDT WILL IGNORE $5M.

;460	PTR	30-MAR-84
;	MAKE $X OF PC-SECTION-REF INSTRUCTIONS (BYTE, EXTEND, BLT, JSYS)
;	EXECUTE IN ORIGINAL PC SECTION.

;461	PTR	18-APR-84
;	MASSIVE EDIT TO RECOGNIZE PDV'S AND THEIR SYMBOL VECTORS.
;	THE IOWD IS HEREBY DEFUNCT.  SYMBOL TABLE POINTERS ARE NOW KEPT
;	INTERNALLY AS TWO-WORD ADDRESS/LENGTH PAIRS.  SYMP AND FRIENDS ARE
;	NOW BLOCKS OF SYMBOL TABLE INFORMATION.  THIS CHANGES HOW SYMBOL
;	TABLES ARE HANDLED ALL OVER DDT.  IN PARTICULAR, SYMFIX, SYMCHK
;	AND CLSFIL HAVE BASICALLY BEEN REWRITTEN.  ALL OTHER PLACES THAT
;	TOUCH SYMBOL TABLE POINTERS HAVE BEEN CHANGED TO ACCOUNT FOR THE
;	NEW FORMAT.  NOTE THIS EDIT NEVER REFLECTS CHANGES TO SYMBOL TABLE
;	POINTERS IN THE USER'S ORIGINAL COPY (EXCEPT FILDDT).

;462	PTR	18-APR-84
;	PROHIBIT PATCHING ACROSS SECTION BOUNDARIES.  USE PATCHED SECTION'S
;	.JBFF, NOT SECTION ZERO'S, WHEN NO SYMBOLS EXIST.

;463	PTR	18-APR-84
;	SIMULATE $X OF JRSTF IN SECTION ZERO WHEN RUNNING IN NON-ZERO.

;464	PTR	19-APR-84
;	PRESERVE SECTION NUMBER OF PATCH SYMBOL.

;465	PTR	19-APR-84
;	PERMANENTLY WRITE-ENABLE BREAKPOINT BLOCK WHEN DOING AN $X,
;	SO THE "SOS FOO" DOESN'T CAUSE AN ILL MEM WRITE.
;466	PTR	23-APR-84
;	IMPLEMENT $$:/TEXT/ TO LOOK UP FIRST PDV WITH NAME TEXT AND
;	SET $5M TO ITS ADDRESS.  USER-FRIENDLY VERSION OF $5M.
;	$$1: TYPES OUT CURRENT PDV NAME IF ANY.

;467	PTR	23-APR-84
;	FIX [461] SO DEFINING NEW SYMBOLS WORKS.

;470	PTR	24-APR-84
;	NEW ROUTINE INCSYP TO UPDATE INTERNAL SYMBOL TABLE POINTERS AS
;	WELL AS USER'S ORIGINAL POINTERS (EXCEPT FILDDT, WHICH UPDATES
;	POINTERS ONLY ON CLOSE).

;471	PTR	25-APR-84
;	FIX SYMCHK TO ALWAYS SET ESTUT (PREVENTS STARTUP PROBLEMS).

;472	PTR	27-APR-84
;	HAVE TTYSAV CALL SYMCHK, SO POINTERS WILL REALLY BE SET UP
;	ON ENTRY.  THAT WAY IF THE FIRST THING THE USER DOES IS "$5M/"
;	IT WILL ALREADY BE SET UP.  MAKE AN EFFORT TO KEEP TOPS-10 EDDT
;	WORKING WITH THIS (NOT TESTED).  NUDGE CONDITIONALS TO PREVENT
;	SOME UNDEFINEDS.

;473	PTR	30-APR-84
;	BYTE POINTERS GIVEN TO A JSYS IN SECTION ZERO MUST BE 1-WORD LOCALS.

;474	PTR	 1-MAY-84
;	TURN ON FTPAGM IN -20 EXEC MODE.

;475	PTR	 3-MAY-84
;	LOOK FOR HISEG TABLE EVEN IF POINTERS ARE STUFFED.

;476	PTR	 7-MAY-84
;	TEACH INCSYP ABOUT 0$5M.  DON'T CALL SYMCHK SO OFTEN (DEPRA).
;	LET FILDDT READ DUMPS AGAIN.  MAKE ERROR MESSAGE IF USER TRIES TO
;	CREATE A PAGE WHEN $$1W.

;477	PTR	 8-MAY-84
;	FIX $NM (OTHER THAN $5M) IN FILDDT TO LOOK LIKE IT ALWAYS DID.

;500	PTR	 8-MAY-84
;	IF DDT IN NON-ZERO, PC IN ZERO, XMOVEI BECOMES PC REF INSTRUCTION.
;	(XMOVEI 1,0 WOULD RETURN 1,,0 INSTEAD OF 0,,0.)
;	FIX TYPEOUT OF XMOVEI 1,0 SO 0 TYPES OUT.

;501	PTR	 9-MAY-84
;	SWITCH MONITOR DDTS BACK TO USING EDV ([430] AND OTHERS HAD THEM
;	USING JOBDAT).  MAKE TTYRE6 LOOK MORE LIKE V42.

;502	PTR	12-MAY-84
;	MAKE SYMCHK SET .JBUSY IF CREATING AN UNDEFINED SYMBOL POINTER
;	OUT OF THIN AIR (JOBDAT ONLY).  MAKE IOWBLK WORK FOR MONITORS.
;	MAKE SURE SYMBOL BLOCKS CLEARED IF NO POINTERS FOUND.
;503	PTR	14-MAY-84
;	IN SAVEG, DON'T SET LLOCS IF IN AN $X SITUATION (SCREWED UP
;	HISEG SYMBOL TABLE).  FIX BUG IN [502].  DON'T MAKE TTYSAV CALL
;	SYMCHK, IT'LL HAPPEN TOO OFTEN -- CALL SYMCHK DIRECTLY WHEN DDT
;	IS STARTED.  DON'T NEED TO ON BREAKPOINT, DISPLAY ROUTINES WILL
;	TAKE CARE OF IT.

;504	PTR	22-MAY-84
;	MAKE UDDT-20 LIVE IN ITS OWN SECTION.  CREATE AN "EXPORT" VECTOR
;	TO BE POINTED TO BY DDT'S PDV.  KEEP DDT FROM FINDING ITS OWN
;	PDV UNLESS RUNNING ALONE IN THE FORK (DETERMINED VIA ENTRY VECTOR).
;	DEFAULT LLOCS TO STUB'S SECTION OR ENTRY VECTOR SECTION (USER-20)
;	OR DDT'S SECTION (MONITOR-20, ALL-10).

;505	JM	31-MAY-84
;	GET DDT TO UNDERSTAND $N"C$ AND $N"/.../ SYNTAX.  REPLACE PEEK
;	JSYS WITH XPEEK% IN FILDDT.

;506	PTR	 5-JUN-84
;	FIX OVERFLOW AT NUM+10.  FIX 3.2E2$F; BUG.  MAKE SURE WE HAVE
;	AN IFIW AT HIDPD1.  ONLY LOOK IN DDT'S SECTION FOR ITS PDV.

;507	PTR	 5-JUN-84
;	TEACH CODE AT UND1, DEF5, AND DEPRA THAT UNDEFINED SYMS HAVE 30-BIT
;	ADDRESS VALUES, SO FIXUPS CAN BE OUTSIDE SYM TAB'S SECTION.
;	CHAINS STILL CAN'T CROSS SECTION BOUNDARIES THOUGH.
;	FIX WHERE [505] BROKE $$: COMMAND.

;510	PTR	 7-JUN-84
;	SUPPORT ERJMPR/ERCALR/ERJMPS/ERCALS IN $X CODE.

;511	PTR	 7-JUN-84
;	TURN HIDPDV INTO ONCE-ONLY CODE TO PROTECT OURSELVES AGAINST OLD LINKS.
;	DDT 43 WILL GO OUT BEFORE LINK 6 SO WE HAVE TO BE CAREFUL.

;512	PTR	 8-JUN-84
;	SPLIT THE "DANGEROUS OPCODE" TABLE INTO TWO PARTS, THE MEMORY MUNGERS
;	AND THE TRULY DANGEROUS.  MEMORY MUNGERS FORCE RECHECK OF SYMTAB,
;	TRULY DANGEROUS GET FULL ENVIRONMENT AND BREAKPOINTS AROUND THE XCT.
;	RESTORE TEMP DISPLAY MODES AT TELLX, SINCE DANGEROUS XCT SMASHES THEM.

;513	PTR	 8-JUN-84
;	$G WOULDN'T WORK FOR A TOPS-10 STYLE ENTRY VECTOR IN A NON-ZERO SECTION.
;	MAKE IT LOOK AT <ENTRY VECTOR SECTION>,,.JBSA INSTEAD OF 0,,.JBSA TO
;	DETERMINE THE SECTION-RELATIVE START ADDRESS.

;514	PTR	12-JUN-84
;	$X OF A DANGEROUS INSTRUCTION FROM SECTION ZERO MUST BE EXECUTED
;	IN ZERO SO ANY GENERATED TRAP/INTERRUPT CAN BE DEALT WITH BY A
;	SECTION ZERO HANDLER.

;515	JM	13-JUN-84
;	FILDDT(TOPS-20):  ADD "ENABLE THAWED" COMMAND AND "GET <FILE>/THAWED"
;	OPTION.  OPEN FILE FOR UNRESTRICTED READ ACCESS WHEN READ ONLY.
;516	PTR	14-JUN-84
;	ADD XMOVEI AND XHLLI TO THE HARDWARE OPCODE TABLE, PERSERVING
;	HLLI AND SETMI FOR TYPEIN.

;517	PTR	14-JUN-84
;	IMPLEMENT $1: COMMAND TO TYPE OUT CURRENT OPEN MODULE (GIVEN IN
;	LAST $: COMMAND).

;520	JM	14-JUN-84
;	IMPLEMENT $1T COMMAND TO SET BYTE POINTER TYPEOUT MODE.

;521	PTR	15-JUN-84
;	REDO $XBLK NOT TO USE SOS'S, SINCE SOS CAN CHANGE USER'S FLAGS.
;	FIX DANGEROUS JRST'S (E.G. XJEN) TO SET DANGEROUS FLAG.
;	HANDLE LUUO'S OUTSIDE SECTION ZERO ON TOPS-20.

;522	PTR	15-JUN-84
;	CLEAN UP WHAT KINDS OF $$? ARE LEGAL IN WHAT FLAVORS.

;523	PTR	18-JUN-84
;	MAKE XDDT BE PSECTED LIKE UDDT WAS (SO CODE PSECT IS WRITE-LOCKED).
;	FIX HIDPDV SO XDDT CAN MODIFY THE (WRITE-LOCKED) PDV, AND SO RDDT
;	WON'T FALL OVER DEAD IN A USER PROGRAM.

;524	PTR	20-JUN-84
;	ON TOPS-20, IF A SECTION ZERO PROGRAM USES OLD-STYLE PSI TABLES TO
;	TRAP PAGE CREATES (E.G. PA1050) AND DDT CAUSES A PAGE CREATE FROM
;	OUTSIDE SECTION ZERO, THE MONITOR TERMINATES THE PROCESS SINCE THE
;	SECTION ZERO TABLE HAS NO PLACE FOR A 30-BIT PC.  TURNING OFF THE
;	PSI SYSTEM ONLY DEFERS THE INTERRUPT, WE MUST ACTUALLY DEACTIVATE
;	THE CHANNEL TO PREVENT TERMINATION.

;525	PTR	20-JUN-84
;	MISCELLANEOUS MINOR FIXES, MOSTLY COSMETIC.  UNDEFINE FLAG POWF
;	(BIT 24) SINCE IT WASN'T DOING ANYTHING USEFUL.

;526	JM	20-JUN-84
;	MOVE THE ROUTINE "TBPNT" OUT OF SINGLE STEPPING CODE INTO GENERAL
;	TYPEOUT SECTION.  THIS WILL MAKE EDIT 520 WORK FOR FILDDT.

;527	PTR	22-JUN-84
;	REDO $X SOME MORE TO LET $X OF ERSTR% JSYS WORK.

;530	JM	25-JUN-84
;	SET DEFAULT SECTION WITH $V, $G, $B, $W, $N, $E, $Z, AND $U.

;531	JM	26-JUN-84
;	MAKE $Z CONSISTENT WITH $W, $N, AND $E IN SETTING "." TO THE LAST
;	LOCATION ZAPPED.

;532	PTR	26-JUN-84
;	CLEAN UP REFERENCES TO SECUDD, ONLY USE IT IN USER DDT.
;	SINCE FETCHL NOW USED ONLY TO CHASE JOBDAT STUFF, MAKE IT RETURN
;	FAILURE IF SYTLOC INDICATES A PDV.
;533	PTR	26-JUN-84
;	CLEAN UP SYMBOL STUFF IN EDDT SO USER MODE EDDT IS MORE LIKE NORMAL
;	USER DDT.  MAKE GEVECS SKIP IF ENTRY VECTOR EXISTS, NON-SKIP IF NOT.
;	FIX SOME SYMBOLS SO DDT STILL ASSEMBLES FOR TOPS-10.
;	HAVE TOPS-20 MONITOR DDTS CHECK MONPDV IN CASE TOPS-20 HAS A PDV.

;534	JM	27-JUN-84
;	SAVE THE STATE OF THE COMF FLAG FOR OBJECTS SCANNED BY THE SYNTAX
;	"LOWER<UPPER>".  USE THIS INFORMATION IN SECTION DEFAULTING FOR THE
;	COMMANDS $Z, $E, $W, AND $N.

;535	JM	29-JUN-84
;	EXECUTE THE CONDITIONAL BREAKPOINT INSTRUCTION IN THE SECTION OF THE
;	BREAKPOINT.

;536	PTR	 2-JUL-84
;	DON'T FORCE SECTION-REF $X TO BE DANGEROUS.  CLEAR I.CJMP FLAG IN THE
;	CONDITIONAL BREAKPOINT INSTRUCTION CODE.

;537	PTR	 2-JUL-84
;	KEEP XDDT FROM INCORRECTLY REMEMBERING TTY STATE AFTER ONCE-ONLY CODE.

;540	JM/PTR	 3-JUL-84
;	PARSE SIGNED EXPONENTS CORRECTLY IN FLOATING POINT TYPEIN.  BAD
;	BEHAVIOR ASCRIBED TO EDIT 506.

;541	PTR	 5-JUL-84
;	FIX HIDPDV TO HANDLE LINK 5.1 CASE CORRECTLY.

;542	JM	 9-JUL-84
;	MAKE LEFT HALF OF ACCCF A DOUBLE COMMA FLAG SO THAT DEFAULT SECTIONING
;	WORKS PROPERLY WITH <TAB> AND "\".  (CF. TOPS-10 MAINTENANCE VERSION)

;543	PTR	10-JUL-84
;	IN DEPMEM WHEN WRITE-ENABLING A PAGE, TURN ON FH%EPN SO REFS TO
;	SECTION 0 WORK.

;544	PTR	10-JUL-84
;	FIX INCSYP ET AL. TO NOT INVALIDATE THE SYMBOL POINTER THEY JUST
;	UPDATED.  ALSO DO BETTER ERROR CHECKING IN DEFIN:.  THIS MAKES
;	DEFINING NEW SYMBOLS WORK (BROKEN SINCE [470]).
;	DON'T CHECK FOR INDIRECTION IN PDV OR SYMBOL VECTOR, ADDRESSES
;	MUST BE EITHER "IFIW LOCAL-ADDR" OR "GLOBAL-ADDR".

;545	PTR	11-JUL-84
;	FIX DEF5 NOT TO STOMP ON W1 (NEEDED FOR THE CALL TO REMUN).  THIS
;	WILL CAUSE DEFINING UNDEFINED SYMBOLS TO WORK AGAIN.
;	REPLACE SAVE OF W DONE IN SYMCHK (REMOVED BY 544).

;546	PTR	11-JUL-84
;	IN WRTSYM, DON'T CHECK FOR HISEG SYMTAB IF PDV.

;547	JM	11-JUL-84
;	GET/SET CORRECT DEFAULT SECTION FOR EFFECTIVE ADDRESS SEARCH.
;550	PTR	13-JUL-84
;	MAKE REFS TO TOPS-20 DATA/CODE BE GLOBAL REFS TO SECTION 1 WHERE
;	NECESSARY, SO SEC. 1 DOESN'T NEED TO BE MAPPED TO DDT'S SECTION.

;551	PTR	17-JUL-84
;	FIX $D SO YOU CAN SUPPRESS THE FIRST SYMBOL IN THE TABLE.

;552	PTR	19-JUL-84
;	MAKE SURE DDTSYV POINTS TO SYMTAB LOCALLY.

;553	PTR	19-JUL-84
;	ADD AN ERJMP AFTER THE PDVOP% IN PDVSE2, JUST IN CASE.
;	.POLOC CAN BE PRONE TO CAUSING ILL INSTR TRAPS.

;554	JM	23-JUL-84
;	SET FLOATING DEFAULT SECTION WHEN OPENING LOCATIONS VIA THE LOCATION
;	SEQUENCE STACK.

;555	PTR	23-JUL-84
;	TRY DOING A PEEK IF XPEEK% FAILS (SO FILDDT WILL RUN ON 5.1 SYSTEMS).

;556	PTR	25-JUL-84
;	IF RESTOR IS GOING BACK TO SEC. 0 AND THE PSI NEEDS TO BE TURNED
;	BACK ON, DON'T DO IT TILL WE'RE ALREADY IN SEC. 0.  THAT WAY DEFERRED
;	INTERRUPTS WON'T CAUSE THE FORK TO HALT.  DON'T BOTHER TREATING
;	PAGE-CREATES AS A SPECIAL CASE ANYMORE (REMOVE [524]).
;	MAKE ^Z RETURN TO THE STUB IF THERE IS ONE (SO PA1050 WILL SEE A HALT
;	PC IN SEC. 0).  EDIT 6 OF UDDT.MAC MUST BE INSTALLED.

;557	JM	 2-AUG-84
;	FILDDT:  IF A LOCATION IS OPENED WITH AN EXPLICIT SECTION TYPED IN,
;	USE THAT SECTION VALUE TO SET THE FLOATING DEFAULT SECTION.  ALSO,
;	DON'T SET THE FLOATING DEFAULT SECTION IF AN ACCUMULATOR IS POPPED
;	OFF OF THE LOCATION SEQUENCE STACK.

;560	PTR	 2-AUG-84
;	RESERVE A FULL 100 WORDS FOR THE BREAKPOINT BLOCK.  MAKE SYMBOLS
;	FOR PC FLAGS.  DON'T REF SECUDD IN EDDT.

;561	PTR	 8-AUG-84
;	MOVE DEFINITION OF SKPUSR ETC. TO AFTER THE .PSECT STATEMENT (SO
;	KDDT CAN BE LOADED IN A NON-ZERO SECTION, AND NOT HAVE THE OPDEFS
;	GET FIXED UP WITH SECTION NUMBERS).

;562	PTR	10-AUG-84
;	REDO $X OF PUSH(J) SO WE DON'T USE STACK MEMORY BEFORE ALLOCATING
;	IT IN THE STACK POINTER.  CAN KILL US IF PSI TRAPS WAITING.

;563	PTR	11-AUG-84
;	MAKE BUNCHES OF EDDT REFS TO EPT (AND OTHERS) BE INDIRECT INSTEAD
;	INDEXED.  THEN THE EPT DOESN'T HAVE TO BE IN EDDT'S SECTION.

;564	PTR	13-AUG-84
;	[461] INADVERTENTLY REMOVED THE LENGTH CHECK FROM CHKSYP.  PUT
;	IN A LENGTH CHECK.
;565	PTR	16-AUG-84
;	ADD FAKDDT ROUTINE TO KDDT.  CALLED DIRECTLY BY MONITOR AFTER KDDT
;	HAS CHANGED SECTIONS, SO BREAKPOINTS BREAK TO PROPER PLACES.

;566	JM	23-AUG-84
;	DEFSEC:  WHEN AN EXPLICIT SECTION IS TYPED IN (EITHER WITH ",," OR BY
;	USING A SYMBOL WITH A SECTION NUMBER IN THE LEFT HALF, ALWAYS SET THE
;	DEFAULT SECTION, EVEN WHEN REFERENCE IS MADE TO AN ACCUMULATOR
;	(E.G. 1,,7).

;567	PTR	23-AUG-84
;	MAKE KDDT USE MONEDV IN PREFERENCE TO JOBDAT, EVEN IN USER MODE.

;570	PTR	 7-SEP-84
;	PREVENT PAGE CREATES FROM GENERATING PAGE-CREATE INTERRUPTS.  THIS
;	IS SO CREATING THE PAGE WHERE THE BREAKPOINT BLOCK SITS DOESN'T MAKE
;	TROUBLE.  THIS ALSO ALLOWS THE USER TO CREATE RANDOM PAGES WITHOUT
;	CAUSING AN INTERRUPT (FORMERLY, CREATING A PAGE WOULD CAUSE AN
;	INTERRUPT WHICH MOST LIKELY WOULD BE ASYNCHRONOUSLY HANDLED/REPORTED).

;571	JM	10-SEP-84
;	NEVER "FIX UP" A BLT INSTRUCTION FOR SINGLESTEPPING.  ADD THE SPECIAL
;	ENTRY "FETCHI" TO THE "FETCH" PROCEDURE.  "FETCHI" IS FOR FETCHING
;	INSTRUCTIONS, AND IT TREATS MEMORY ADDRESSES WITH RIGHT HALF IN THE
;	RANGE 0 THROUGH 20 AS ACCUMULATOR ADDRESSES.

;572	JM	10-SEP-84
;	MONITOR EDDT RUNNING IN USER MODE WILL NOT ATTEMPT TO LEAVE SECTION 0
;	IF IT SHOULD HAPPEN TO FIND ITSELF THERE.

;573	JM	10-SEP-84
;	WHEN PRINTING AN IFIW SECOND WORD OF A 2-WORD BYTE POINTER DISPLAY
;	"<2>" AS WITH AN EFIW WORD.

;574	PTR	12-SEP-84
;	USER-MODE KDDT SHOULD REF MONPDV IN SECTION ZERO, NOT SECTION 1.

;575	PTR	13-SEP-84
;	USER-MODE KDDT SHOULD BE MORE LIKE USER DDT.  DO NORMAL PDV
;	SEARCHING FOR 6.1, STILL WIND UP WITH JOBDAT IN 6.0.

;576	PTR	13-SEP-84
;	GIVE SINGLE-STEP $X AND INSTR$X DISTINCT PORTIONS OF THE BREAKPOINT
;	BLOCK, SO THEY DON'T INTERFERE WITH ONE ANOTHER (WILL HAPPEN IF
;	"CALL FOO$X" AND FOO HAS A BREAKPOINT IN IT).  REQUIRES RECLAIMING
;	THE BREAKPOINT BLOCK SPACE RESERVED FOR BREAKPOINT 0 (WHICH WILL
;	NEVER BE USED).

;577	PTR	19-SEP-84
;	IN FILDDT, CHECK FOR THE LAST EXISTING PAGE IN THE FILE INSTEAD OF
;	ALWAYS USING THE MAXIMUM POSSIBLE LENGTH.  THAT WAY SEARCHES ETC.
;	WILL STOP AT "REAL EOF."
;600	PTR	26-SEP-84
;	SPEED UP FNDPAG, FPVPG AND FRIENDS BY TRYING TO GUESS WHAT THE
;	VIRTUAL PAGE IS GOING TO BE, INSTEAD OF PLODDING THROUGH EVERY
;	PAGE EVERY TIME.

;601	PTR	27-SEP-84
;	ADD "FOO$?" COMMAND TO TYPE ALL SYMBOLS BEGINNING WITH CHARS "FOO".

;602	JM	29-SEP-84
;	IF DDT WAS STARTED FROM THE STUB (UDDT) AND $5M POINTS TO JOBDAT IN
;	THE SAME SECTION OR $5M IS 0, CHECK FOR STUFFED SYMBOL TABLE VALUES
;	ON EACH PASS THROUGH SYMCHK.

;603	PTR	10-OCT-84
;	ADD NEW $L COMMANDS TO TYPE OUT SECTION/PAGE ACCESSES.

;604	PTR	10-OCT-84
;	REVISE [600] SO ONE NEED NOT SUPPLY A GUESS TO FPVPG.

;605	PTR	15-OCT-84
;	CALL LISTEN DURING "FOO$?" SO USER CAN ABORT HIS FOOLISH CHOICE OF
;	PREFIX CHARACTERS.

;606	PTR	18-OCT-84
;	HAVE FILDDT-20 PARSE UNIT, CHANNEL, CONTROLLER NUMBERS IN DECIMAL
;	INSTEAD OF OCTAL.

;607	PTR	18-OCT-84
;	GROW DATA PAGES TO THREE, INCREASE STACK SIZE SO MDDT WON'T
;	FALL OVER FROM DECNET, REVERT MDDT TO LOCAL STACK POINTER IN 6.1.

;610	PTR	18-OCT-84
;	FIX HIDPDV AGAIN SO $W DEFAULT IS PRESERVED.

;611	PTR	22-OCT-84
;	FIX $L NOT TO REPORT BOTH WRITE AND COPY-ON-WRITE FOR THE SAME PAGE.

;612	JM	22-OCT-84
;	DEFINE A GENERAL PURPOSE CHECKPOINT FOR MDDT, AND INSTALL IT AROUND
;	THE BREAKPOINT BLOCK.

;613	PTR	31-OCT-84
;	FIX [600]/[604] AGAIN.

;614	JM	 7-NOV-84
;	CORRECT MDDT INTERLOCK LOGIC (CF. [612]); ALSO MIGRATE TBPNT TO WORD
;	TYPEOUT ROUTINES FROM COMMAND ROUTINES.

;615	JM	 9-NOV-84
;	IF NO ENTRY VECTOR IN FORK, USER DDT20 SETS $5M TO -1,,0 RATHER THAN
;	-1,,SECDDT.  VT2XX COMPATIBILITY FEATURE:  "`" WORKS LIKE "<ESC>".

;616	PTR	12-NOV-84
;	MAKE "ADDR$0T" DO DEFAULT SECTIONING.
;617	PTR	12-NOV-84
;	MINOR BUGS IN FOO$? COMMAND.

;620	JM	16-NOV-84
;	USER DDT:  IF NO ENTRY VECTOR AND NO STUB, SET FLOATING DEFAULT
;	SECTION TO 0 ON ENTRY.  ANALOGOUS TO [615].

;621	RCB/PTR	 6-DEC-84
;	ALLOW TYPEOUT AND TYPEIN OF N-BIT ASCII STRINGS.  $NT AND $N"
;	NOW ALLOW N FROM 5 THRU 36 (DECIMAL).

;622	JMF/PTR	 6-DEC-84
;	PREVENT CLOBBERING PREVIOUS-CONTEXT SECTION WHEN JUMPING INTO
;	NON-ZERO SECTION IN EDDT.

;623	DPM/PTR	 6-DEC-84
;	FIXES TO $L: MAKE SURE NOT IN SYMBOL SPACE IN TOPS-10 EXEC MODE,
;	DON'T MAKE RASH ASSUMPTIONS ABOUT LOWSEG IN CHKADR, DO MORE
;	RATIONAL ARG CHECKING IN FILDDT.

;624	JM	 8-DEC-84
;	FIX SINGLESTEP OF ILDB/IDPB WITH LOCAL ACCUMULATOR REFERENCE TO BYTE
;	POINTER.	

;625	PTR	12-DEC-84
;	SPEED UP CHKADR IN FILDDT-20 BY NOT DOING AN RPACS% ON EVERY
;	CALL.  INSTEAD DO THE RPACS% WHEN THE PAGE IS MAPPED IN AND
;	REMEMBER THE BITS.  THIS WINS BIG ESPECIALLY IN SEARCHES WHEN
;	THE USER HAS SPECIFIED SOME KIND OF MAPPING (E.G. EP$U).

;626	PTR	22-MAR-85
;	FIX TEXTNT TO NOT TYPE GARBAGE FROM THE LEFTOVER BITS IN THE WORD.

;627	JM	10-APR-85
;	TEXTNT TYPES OUT LEFT-JUSTIFIED BYTES ONLY.

;DDT %43(627) SHIPPED WITH TOPS-20 6.1

;630	PTR/RCB/RDH	25-SEP-85
;	FOR TOPS-10, IF .JBSYM .GT. 0 THEN IT IS THE GLOBAL ADDRESS OF A
;	SYMBOL TABLE VECTOR.  DITTO $5M.  LOOK FOR TOPS-10 ENTRY VECTOR
;	ON $G.  FIX UP $L, $Y COMMANDS.  CHKADR, FETCH, STORE CAN SEE
;	BEYOND SEC. 0 FROM SEC. 0 (TOPS-10 EDDT ONLY).  FIX EXEC-MODE CHKSEC.

;631	RCB	 3-OCT-85
;	MAKE DEFAULT PAGING BE KL ALWAYS.  ADD BLTBU/BLTUB TO $X (KS-10).

;632	RDH	7-OCT-85
;	MAKE IO INSTRUCTION TYPEOUT PAY ATTENTION TO CPU TYPE (KS HAS DIFFERENT
;	IO INSTRUCTION SET).  ADD $20/21/22/23U TO SET KA/KI/KL/KS CPU TYPE.

;633	RDH/PTR	 8-OCT-85
;	MAKE SYMBOL "$NB" GLOBAL AS # BREAKPOINTS AVAILABLE (EDDT-10 ONLY);
;	ENHANCE BREAKPOITN INSERT/REMOVE TO DEAL WITH ERRORS (PARTICULARLY
;	BREAKPOINTS THAT MOVED); ONLY TYPE ONE ERROR MESSAGE PER BREAKPOINT
;	FAILURE.

;634	RDH	29-OCT-85
;	MAKE DDT %43 WORK ON TOPS-10 (ASSORTED TYPOS, ETC.). *NEVER* INSERT
;	BREAKPOINTS ON $X (IT CAN'T WORK). IF AN $4M BLOCK HAS BEEN SPECIFIED,
;	UNCONDITIONALLY USE IT (ALWAYS 3-WORD JSR'S, ETC.), OTHERWISE VERIFY
;	THAT DDT IS MAPPED INTO THE APPROPRIATE SECTION AND BLINDLY JUMP
;	INTO THAT SECTION FOR $X'ING. ALLOW NZS REFERENCES FROM SECTION ZERO
;	(RENAMES NZSXCT INTO PZAFI, CALLED LIKE PCAFI; RENAMES DEFSEC INTO
;	CEFFAS). FIX $L. IF NZS SYMBOL TABLE(S) AND DDT IN SECTION 0 THEN
;	TRY FOR NZS, MAPPING SECTION 0 INTO SECTION 1 (USER MODE ONLY) IF
;	POSSIBLE. MAKE <INSTR>$$NX TRY TO EXECUTE THE INSTRUCTION IN SECTION
;	"N" (IF BLANK, THEN OK TO EXECUTE IN DDT SECTION). ALLOW BOTH .JBSYM
;	AND .JBHSM TO POINT TO GLOBAL SYMBOL VECTOR ADDRESS (BUT UNDEFINEDS
;	ONLY FROM .JBSYM).

;635	RCB	9-JAN-86
;	FIX $X OF NZS LUUO (TOPS10). FIX USAGE OF ENTVC. UUO (TOPS10)
;	IN PARTICULAR TO HELP LOCATE USER'S SYMBOL TABLE FOR RUN/USE:N WHERE
;	PROGRAM CAN GET "RELOCATED" TO DIFFERENT SECTION.

;636	RDH	10-JAN-86
;	$M, $I, AND $U DON'T RETURN ADDRESS AS VALUE (EDIT 333 LOST).

;637	RDH	11-JAN-86
;	FILDDT CAN'T UPDATE 7.03 EXE FILE SYMBOL TABLE.

;640	RDH	19-JAN-86
;	MAKE THE "N" OF $NM AND $NI COMMANDS BE *DECIMAL*.

;641	PTR	30-JAN-86
;	MAKE CEFFAS DEAL WITH IMPOSSIBLE SECTION NUMBERS A BIT BETTER.
;	MAKE <INSTR>$X ALWAYS EXECUTE IN THE DEFAULT SECTION, INSTEAD OF
;	SOMETIMES IN DDT'S SECTION.

;642	RDH	4-MAR-86
;	MAKE TAG DEFINITIONS TAKE FULL 36-BIT VALUE, RATHER THAN JUST THE
;	RIGHT-HALF (18-BIT) VALUE OF "."

;DDT %44(642) Released with TOPS10 version 7.03, Spring 1986

;643	RDH	12-Apr-86	QAR 869027
;	$4M falls off end of literal, Ill Mem Refs (typo in [636]).

;DDT %44A(643) Released on Autopatch tape 14, Summer 1986

;644	RCB	1-Jul-86
;	Introduce $X to PMOVE & PMOVEM.  Add them to the opcode tables.

;645	RCB	10-Jul-86
;	Fix effective address calculation wrt global references to ACs.
;	Needed for LUUO handlers and $1T typeout.

;646	RCB	11-Jul-86
;	Fix some problems with supporting $$Y.  Only changes the I/O setup,
;	doesn't add any logic for interpreting .SYM files.

;647	RCB	11-Jul-86
;	Prepare for further changes to TOPS-10 entry vector format by allowing
;	IFIW as well as global address in $[n]G.

;650	RCB	11-Jul-86
;	I don't know what the authors of 626 & 627 meant to accomplish, but
;	those edits broke the symmetry of $nT with $7T.  Restore it, this
;	time correctly.

;651	RCB	15-Jul-86
;	Finally teach EDDT about CPNDDT.  Accomplished via new EDV words:
;	.EDCPN (physical address of CPNDDT) and .EDCPU (AOBJN-style pointer
;	to table of APR serial numbers).

;652	RCB	15-Jul-86
;	Finally teach FILDDT about the EDV.  This allows FILDDT to set up
;	mapping on a crash dump (if MCO 12993 is installed).  Requires EDV
;	word .EDCAC (pointer to crash ACs).

;653	RCB	16-Jul-86
;	Enhance foo$? (ABBREV) to accept LLIMIT, ULIMIT, and WRD2O for
;	additional constraints upon symbol value, flags, and module.
;	$1? will dump the open module (error if none).  $4? will dump only
;	globals.  $40? will dump only half-killed symbols.  The 74 mask
;	is anded and then compared.  2 is reserved.  LLIMIT and ULIMIT are
;	used in the obvious fashion for restricting possible values of
;	symbols to be displayed.

;654	RCB	19-Sep-86
;	Fix up changing sections for NZS symbol table access to account for
;	the fact that the flags are changed by PUSHJ, and hence not always
;	what we expect at the first entry in PDL.

;655	RCB	30-Sep-86
;	Fix up changing sections for $X of pc-reference instructions.  Always
;	do RESTOR/SAVE (rather than SWAP) so that SECDDT and the various
;	SKPS0/SKPNS0 side-effects will be right.

;656	DPM	30-Sep-86
;	Enhance FILDDT-10 by making it type the filespec being examined
;	or patched like the -20 version does.  Also type filespec of
;	file being yanked and the number of symbols loaded.

;DDT %44B(656) released on Autopatch tape 15, Fall 1986

;657	RCB	4-Nov-86
;	Fixup symbol table information typed out by $1: in FILDDT.

;660	RCB	21-Nov-86
;	Fix 0$nB in non-zero sections not to set 1,,0 as the B.P. address.

;661	RCB	6-Jan-87
;	Fix global breakpoints using the breakpoint block not to assume the
;	JSR came from section 0.

;662	RCB	16-Jan-87
;	Fix hidden symbol processing problems with TOPS-10 EDDT, especially
;	for SMP.  This has the side-effect of replacing edit 657.

;663	RCB	21-Jan-87
;	Finally physically remove the papertape code.  This finishes edits 247,
;	307, and 322.  FTPTP has been completely removed.

;664	RCB	26-Jan-87
;	Fix up all symbol tables in the ring of EDVs when using hidden symbol
;	processing.  EDDT-10 only.

;665	RCB	 1-Feb-87
;	Fix up $? for NZS DDT examining a program's symbols in S0.

;666	RCB	 6-Mar-87
;	Fix up $X of ILDB/IDPB with byte pointer in an AC and PC not in DDT's
;	section to not increment the B.P. twice.

;667	RCB	 6-Mar-87
;	Fix up for "3/-1,,400<SP><TAB>" nonsense.
;	Don't mistake garbage for an attempt at a DDT internal address, and
;	allow space after a comma to override the left half for section
;	defaulting.

;670	RCB	10-Mar-87
;	Revoke the second half of 667.

;671	RCB	15-May-87
;	Fix PDFSEC.  It gets in TOPS-20's way, too.

;672	RCB	02-Jun-87
;	Fixup some definitions for TOPS-20 to account for the continued
;	existance of 4.1 monitors.

;673	RCB	03-Jun-87
;	672 is incomplete.  Forgot about FILDDT and XPEEK%.  Deal with it.

;674	RCB	28-Aug-87
;	CEFFAS calls too many low core address ACs.  Fix the mask.

;675	RCB	28-Aug-87
;	Default MDDT's initial floating section to MSEC1 rather than to MDDT's
;	own executing section.  Too many problems with ill-advised $X'ing from
;	section 6 happen otherwise.

;676	RCB	26-Feb-88
;	Fix the copyrights for TOPS-20 7.0 and TOPS-10 7.04.

;677	RCB	26-Feb-88
;	Fix problem with building WHO and with the TOPS-10 monitor's symbol
;	table size in general.  Add FTDSYM, debugging symbols, which defaults
;	off for FTEX10 and on for all other cases.  If FTDSYM is off, then
;	all of DDT's local symbols will be expunged at assembly time.

;700	RCB	26-Feb-88
;	Add the clearm<setm>value$nM flavor of $M.  The 'clearm' is a mask
;	to clear and the 'setm' is a mask to set.  The masking arguments
;	are applied after the 'value' argument if it is also present.
;	This applies to $I as well as to $M, but it's more useful for $M.

;701	RCB	26-Feb-88
;	Fix DEPMEM to be able to handle SEGOP. and .PAGWL for 7.04.

;702	RCB	06-Oct-88
;	Add the $$ flavors of searches to type out the number of matches.

;703	RCB	08-Nov-88
;	Finally handle SEGOP.s for 7.04.  $$:/text/ looks for a hiseg named
;	'text' to use for the hiseg symbol table on a -10.  Also handle
;	name$$: appropriately (even for the -20).

;Become version 45 (due mainly to SEGOP.)

;704	RCB	10-Jan-88
;	Fix "c$ (single-character ASCII input).  Probably broken by edit 703,
;	but I'm not sure.

;705	RCB	11-Mar-89
;	Fix $L typeout for spy pages.  They are off by one when adjacent to any
;	(different) existing pages within a section.

;706	RCB	27-Apr-89
;	Fix $L for virtual spy pages.  The virtual bit was getting lost.

;707	RCB	20-Jun-89
;	Fix $$W, $$N, $$E to type match count again.

;710	RCB	20-Jun-89
;	Fix $U in FILDDT on a crash file when the EDV was good.  Re-use the EDV
;	information rather than reverting to $$U.

;711	RCB	21-Jun-89
;	Fix $L in FILDDT for a .EXE file with mapping in use.  Don't compare
;	virtual page numbers against physical limits.  Translate first.

;712	RCB	22-Jun-89
;	Clean up some symbol definitions (PC$xxx and PG$xxx) by borrowing SYSPRM
;	from GLXMAC.

;713	RCB	23-Jun-89
;	Add FTPURE for starting to do XDDT on the -10.

;714	RCB	23-Jun-89
;	Make $G and ^Z clear BPTIP so that we won't allow $X after a restart.

;715	RCB	18-Sep-89
;	Fix reference to JOBEDV in FILDDT startup (broken on TOPS-20).
SUBTTL	DDT ASSEMBLY SWITCHES

;SWITCHES FOR DDT FEATURES

;FTDEC10	;TOPS-10 FACILITIES
;FTDEC20	;TOPS-20 FACILITIES
;FTEXEC		;EXEC MODE FACILITIES (ALSO RUNS IN USER MODE)
;FTEX20		;TOPS-20 MONITOR EDDT (LOADS ONLY WITH TOPS-20 MONITOR)
;FTFILE		;FILE DDT
;FTYANK		;PAPER TAPE INPUT FACILITIES ($Y)
;FTVMX		;BUILD DDT.VMX FOR TOPS-10 VIRTUAL MEMORY
;FTMON		;TOPS-20 MONITOR DDT
;FTOPX		;EXTENDED OPCODE DECODING FOR TYPEOUT
;FTDBUG		;DEBUGGING FACILITIES FOR DDT ITSELF (ESP EXEC MODE)
;FTPAGM		;PAGE MAPPING FEATURES
;FTSCSH		;SYMBOL TABLE CACHE
;FTUD20		;TOPS-20 USER DDT (SHORTHAND SYMBOL)
;FTEX10		;TOPS-10 EXEC DDT (SHORTHAND FOR FTDEC10&FTEXEC)
;FTUE10		;TOPS-10 NON-FILE DDT (SHORTHAND SYMBOL)
;FTDSYM		;DEBUGGING SYMBOLS (DDT'S OWN SYMBOLS INCLUDED)
;FTPURE		;READ-WRITE PSECT STARTS OUT EMPTY (TWOSEG ON -10)

IFNDEF	FTDEC10,<
	IFNDEF	FTDEC20,<
		FTDEC10==-1
		FTDEC20==0>>
IFNDEF	FTDEC10,<FTDEC10==0>
IFNDEF	FTDEC20,<FTDEC20==0>
IFNDEF	FTFILE,<FTFILE==0>
IFNDEF	FTYANK,<FTYANK==0>
IFNDEF	FTEX20,<FTEX20==0>
IFNDEF	FTEXEC,<
	IFN FTEX20,<FTEXEC==-1>
	IFE FTEX20,<FTEXEC==0>>
IFNDEF	FTVMX,<	FTVMX==0>
IFNDEF	FTMON,<	FTMON==0>
IFNDEF	FTOPX,<FTOPX==-1>
IFNDEF	FTDBUG,<FTDBUG==0>
IFNDEF FTPAGM,<FTPAGM==FTFILE!FTEXEC!FTDEC10> ;NEVER ON TOPS20 USER MODE
IFNDEF FTSCSH,<FTSCSH==-1>	;HAVE CACHE UNLESS EXCLUDED

;NORMALIZE ALL SWITCH VALUES TO 0 OR -1 SO BOOLEAN EXPRESSIONS IN
;CONDITIONALS WORK CORRECTLY.

DEFINE ..N (SW)<
	IRP	SW,<
  IFN SW,<SW==-1>>>

..N	<FTDEC10,FTDEC20,FTEXEC,FTEX20,FTFILE,FTYANK,FTVMX,FTMON>
..N	<FTOPX,FTDBUG,FTPAGM,FTSCSH>

	FTUD20==FTDEC20&<^-FTEXEC>&<^-FTFILE>&<^-FTMON>	;USER -20
	FTEX10==FTDEC10&FTEXEC			;EDDT-10
	FTUE10==FTDEC10&<^-FTFILE>		;NON-FILE -10

IFNDEF	FTDSYM,<FTDSYM==FTDBUG!<^-FTEX10>>
IFNDEF	FTPURE,<FTPURE==FTMON>		;MDDT INITIALIZES IN THE PSB
..N	<FTDSYM,FTPURE>

  IFN FTDEC10&<FTDEC20!FTMON!FTEX20>,<PRINTX ? Illegal FTDEC10>
  IFN FTDEC20&<FTDEC10!FTYANK!FTVMX>,<PRINTX ? Illegal FTDEC20>
  IFN FTEXEC&<FTFILE!FTVMX!FTMON>,<PRINTX ? Illegal FTEXEC>
  IFN ^-FTEXEC&<FTEX20>,<PRINTX ? Illegal ^-FTEXEC>
  IFN FTFILE&<FTEXEC!FTVMX!FTMON!FTEX20>,<PRINTX ? Illegal FTFILE>
  IFN FTPURE&FTEXEC,<PRINTX ? Illegal FTPURE>
SUBTTL	TITLE SETTING AND UNIVERSAL SEARCHING

	SALL			;CLEAN LISTINGS
	.DIREC	FLBLST		;CLEANER LISTINGS


  IFN FTDEC10,<		;TOPS-10 VERSIONS

	SEARCH	JOBDAT,MACTEN,UUOSYM	;ALL STANDARD TOPS-10 DEFINITIONS

  IFE FTDBUG,<
  IFN FTEXEC,<TITLE	EDDT -- TOPS-10 EXEC MODE DDT>
  IFN FTFILE,<TITLE	FILDDT -- TOPS-10 FILE DDT>
  IFN FTVMX,<
    IFN FTPURE,<TITLE	XDDT -- TOPS-10 EXTENDED DDT>
    IFE FTPURE,<TITLE	VMDDT -- TOPS-10 VM DDT>
  >
  IFE FTFILE!FTEXEC!FTVMX,<
	TITLE	UDDT -- TOPS-10 USER MODE DDT>
  > ;END OF IFE FTDBUG
  > ;END OF TOPS-10 TITLES


  IFN FTDEC20,<		;TOPS-20 VERSIONS

	SEARCH	JOBDAT,MONSYM,MACSYM	;ALL STANDARD TOPS-20 DEFINITIONS

  IFE FTDBUG,<
  IFN FTEXEC&<^-FTEX20>,<TITLE	EDDT -- TOPS-20 EXEC MODE DDT>
  IFN FTEXEC&FTEX20,<TITLE	KDDT -- TOPS-20 MONITOR KERNAL DDT>
  IFN FTFILE,<TITLE	FILDDT -- TOPS-20 FILE DDT>
  IFN FTMON,<TITLE	MDDT -- TOPS-20 MONITOR DDT>
  IFE FTEXEC!FTFILE!FTMON,<TITLE	UDDT -- TOPS-20 USER MODE DDT>
  > ;END IFE FTDBUG
  > ;END OF TOPS-20 TITLES

  IFN FTDBUG,<TITLE	DEBDDT -- DEBUGGING VERSION OF DDT>
	SUBTTL	PROGRAM (JOB CONTEXT) PARAMETERS

  IFN FTFILE!FTVMX,<		;ONLY FILDDTS SET UP VERSION NUMBER
	LOC	.JBVER		;WHERE THE TOPS-10 VERSION INFO GOES
	%%DDT			;SET THE VERSION WORD
	RELOC			;BACK TO NORMAL
  > ;END IFN FTFILE!FTVMX

  IFN FTDEC10,<			;ONLY TOPS-10 USES .JBDDT
    IFE FTFILE,<
	LOC	.JBDDT		;CONTAINS DDT END AND START ADDRESSES
	XWD	DDTEND,DDTX	;SET DDT END AND START ADDRESS
	RELOC			;BACK TO NORMAL
    > ;END IFE FTFILE
				;ONLY TOPS-10 USES .JBBPT
    IFE FTFILE,<		;BUT ONLY IF NOT FILDDT
	LOC	.JBBPT		;WHERE THE BREAKPOINT PROCESSOR GOES
	$0BPT			;ADDRESS OF UNSOLICITED BREAKPOINT HANDLER
	RELOC			;BACK TO NORMAL
    > ;END IFE FTFILE
  > ;END IFN FTDEC10
SUBTTL	MACROS, ETC.

;.PHASE AND .DEPHASE MACRO DEFINITIONS
;NEEDED BECAUSE PHASE AND DEPHASE DON'T NEST
;USE THESE IN ALL CASES INSTEAD OF PHASE AND DEPHASE


	..PLVL==0		;INITIAL PHASE NESTING LEVEL

;MACRO TO REFERENCE THE LAST LOCATION AT PHASE LEVEL N

DEFINE	..PL(N)<..PL'N>		;SYMBOL DEFINED BY .PHASE


;SUBSTITUTE FOR PHASE STATEMENT

DEFINE	.PHASE(N),<

	..==10			;;SAVE RADIX
	RADIX	10		;;MOST LEVELS PER CHAR
	..PL(\..PLVL)==.	;;REMEMBER WHERE WE ARE
	RADIX	..		;;RESTORE THE RADIX

  IFE <..PLVL-^D99>,<PRINTX ? .PHASE NESTING OVERFLOW>
	..PLVL==..PLVL+1		;;BUMP NESTING LEVEL

	PHASE	N
  > ;END OF .PHASE DEFINITION


;SUBSTITUTE FOR DEPHASE

DEFINE	.DEPHASE,<

	..PLVL==..PLVL-1

IFL ..PLVL,<PRINTX ? .PHASE NESTING UNDERFLOW>

IFG ..PLVL,<
	..==10			;;SAVE RADIX
	RADIX	10		;;USE RADIX WE WANT
	PHASE	.+..PL(\..PLVL)	;;BACK TO PREVIOUS PHASE LEVEL
	RADIX	..		;;BACK TO OLD RADIX
>

  IFE ..PLVL,<
	DEPHASE			;;JUST DEPHASE AT OUTER LEVEL
>

  > ;END OF .DEPHASE DEFINITION
;SYMBOLS NOT OTHERWISE DEFINED IN STANDARD UNIVSERALS

;TOPS-10 SPECIFIC

  IFN FTDEC10,<

DEFINE	TMSG(TEXT)<
	OUTSTR	[ASCIZ\TEXT\]	;;DEFINED IN MACSYM FOR TOPS-20
>

  > ;END OF IFN FTDEC10



;TOPS-20 SPECIFIC

  IFN FTDEC20,<

DEFINE	ND(S,V),<IF2,<IFDEF S,<S==S>> IFNDEF S,<S==V>> ;NOT IN MACSYM

ND	.CHCNH,.CHBSP		;THE -10 AND THE -20 USE DIFFERENT NAMES
	IF2	<PURGE .CHBSP>	;DON'T CLUTTER UP THE SYM TABLE

	OPDEF	PJRST	[JRST]	;NOT IN MACSYM
	.NODDT	PJRST		;NO TYPEOUT IN OPCODE FIELD

  > ;END OF IFN FTDEC20

;GENERAL MACROS

;SAVE ERROR MESSAGE STRING FOR POSSIBLE LATER TYPEOUT

;REMOVE IFN FTDEC20
DEFINE SMERS (MSG)<
	PUSH P,[[ASCIZ \MSG\]]
	POP P,MEMERS>

;TYPE LITERAL STRING

DEFINE TSTR (MSG)<
	MOVEI W1,[ASCIZ \MSG\]
	PUSHJ P,TSTRG>

;INIT DDT STACK

IFN FTMON,<
  DEFINE INIPDL<
	MOVEI	P,DDTPGA	;;WHERE MDDT THINKS ITS VARS ARE
	CAIN	P,DDTPXA	;;DIRECTLY MAPPED INTO PSB?
	SKIPA	P,[IOWD	LPDL,PDL] ;;YES, WE CAN USE A LOCAL STACK POINTER
	XMOVEI	P,PDL-1>	;;MDDT STACK PTR IS GLOBAL
> ;END IFN FTMON

IFE FTMON,<
  DEFINE INIPDL<MOVE	P,[IOWD LPDL,PDL]>> ;OTHERS ARE LOCAL
;MDDT CHECKPOINT DEFINITIONS

IFN FTMON,<
  DEFINE CHKIN (%CKLAB) <
	SKIPLE	CHKCNT			;;DO WE ALREADY HAVE THE LOCK?
	JRST	%CKLAB			;;YES
	AOSE	@[MSEC1,,MDDLCK]	;;NO, ATTEMPT TO TAKE LOCK
	JRST [	TSTR	<?MDDT BREAKPOINT BLOCK ALREADY IN USE>
		POPJ	P,]		;;FAIL
	PUSH	P,@[MSEC1,,FORKX]	;;SUCCEED
	POP	P,@[MSEC1,,MDDFX]	;;SHOW THE LOCK IS OURS.
%CKLAB:	AOS	CHKCNT>			;;INCREMENT OUR USE COUNT.

  DEFINE CHKOUT<
	SKIPG	CHKCNT			;;DO WE HAVE THE LOCK?
	JRST	.+3			;;NO, DON'T TOUCH IT.
	SOSG	CHKCNT			;;DECREMENT USE COUNT.
	SETOM	@[MSEC1,,MDDLCK]>	;;GIVE UP THE LOCK.

  DEFINE BRKLCK<
	SKIPG	CHKCNT			;;DO WE HAVE THE LOCK?
	JRST	.+3			;;NO, DON'T TOUCH IT.
	SETZM	CHKCNT			;;YES, CLEAR USE COUNT
	SETOM	@[MSEC1,,MDDLCK]>	;;GIVE UP THE LOCK.

> ;END IFN FTMON
SUBTTL	DDT SYMBOLS

;DEFINE ACCUMULATORS

F=0				;FLAGS
P=1				;PUSH DOWN
R=<A==2>			;POINTERS TO TABLES, CORE, ETC.
S=<B==3>
W=<C==4>			;CONTAINS DISPATCH ADDRESS IN WORD ASSEMBLER
T=5				;TRANSFER DATA
W1=6
W2=7
SCH=10				;MODE CONTROL SWITCH FOR OUTPUT
AR=11				;MODE CONTROL SWITCH FOR OUTPUT
ODF=12				;MODE CONTROL SWITCH FOR OUTPUT - CURRENT RADIX
TT=13				;TEMPORARY
TT1=14				;TEMPORARY
TT2=15				;TEMPORARY
TT3=16				;TEMPORARY

.XCREF	F, P, R, S, W, A, B, C, T, W1, W2, TT, TT1, TT2, TT3	;SAVE SOME PAPER
.XCREF	..DD

  IFN FTDEC20,<
T1=1
T2=2
T3=3
T4=4
P=17				;OVERRIDES P=1 ABOVE

.XCREF	T1, T2, T3, T4, P		;SAVE SOME MORE PAPER
.XCREF	..MX1, ..MX2, ..TX1, ..TX2	;SUPPRESS JUNK SYMBOLS
  > ;END OF IFN FTDEC20

;DEFINE PUSHDOWN LIST LENGTH

	ND	LPDL,400	;400 WORDS IS ENOUGH FOR EVERYBODY
				;(INCLUDING MDDT)

;DEFINE NUMBER OF DATA PAGES (MUST AGREE WITH MONITOR FOR MDDT)

	ND	NDDTPG,3	;HERE TO AVOID MACRO BUG WITH FORWARD REF BELOW
SUBTTL	GLOBAL SYMBOLS FOR USE BY THE OUTSIDE WORLD

  IFE FTFILE,<			;FILDDT HAS NO GLOBAL SYMBOLS

    IFE FTMON,<			;DON'T CONFLICT MDDT WITH EDDT

	ENTRY	DDT		;DEFINE THE MAIN DDT START ADDRESS
				;USED ON "R DDT", "DDT$G", ETC.
      IFN FTEXEC,<

	ENTRY	DDTX		;ENTRY POINT USED BY MONITORS
				;ALSO ON TOPS-10 "DDT" MONITOR
				;COMMAND TO CLEAR $Y IN PROGRESS
      > ;END IFN FTEXEC

	INTERN	DDTEND		;END OF DDT, FOR USERS AND MONITOR

    > ;END IFE FTMON

    IFN FTDEC20,<		;TOPS-20 SPECIFIC DEFINITIONS

      IFN FTUD20,<		;TOPS-20 USER DDT DEFINITIONS
	INTERN	DDTEXP		;"EXPORT" VECTOR FOR STUB
      > ;END IFN FTUD20

      IFN FTEX20,<		;TOPS-20 EDDT DEFINITIONS
	ENTRY	$EDDT		;FORCES LOADING OF EDDT IN LIB SEARCH
	$EDDT==0		;DON'T CARE ABOUT THE DEFINITION
	EXTERN	EDDBLK		;BREAKPOINT BLOCK FOR KDDT
	EXTERN	DDTCZ		;KDDT USER-MODE EXIT ROUTINE
	INTERN	FAKDDT		;RECOVER AFTER CHANGING SECTIONS
      > ;END IFN FTEX20

      IFN FTEX20!FTMON,<	;COMMON TOPS-20 MONITOR DEFINITIONS
	EXTERN	MSEC1		;USEFUL MONITOR SECTION
	EXTERN	MONPDV		;MONITOR'S PDVA IF ANY
      > ;END IFN FTEX20!FTMON

      IFN FTMON,<		;TOPS-20 MDDT DEFINITIONS
	ENTRY	$MDDT		;FORCES LOADING OF MDDT IN LIBRARY SEARCH
	$MDDT==0		;DON'T CARE
	ENTRY	MDDTX		;MDDT EQUIVALENT OF DDTX
	MDDTX=DDTX
	EXTERN	DDTPGA,DDTPXA	;MONITOR'S PLACE FOR MDDT'S VARIABLES
	EXTERN	FORKX,MDDLCK,MDDFX  ;MONITOR BPT INTERLOCK LOCATIONS
	EXTERN	MDDBLK		;BREAKPOINT BLOCK FOR MDDT
	EXTERN	MRETN		;MDDT RETURN ON ^Z
	EXTERN	SWPMWE,SWPMWP	;WRITE-ENABLE/LOCK SWAPPABLE MONITOR
	EXTERN	KIEPT,SPT	;ADDRESSES OF USEFUL TABLES
	INTERN	NDDTPG		;MUST AGREE WITH SPACE IN PSB
      > ;END IFN FTMON
    > ;END IFN FTDEC20
  > ;END IFE FTFILE
SUBTTL	MEMORY ALLOCATION PARAMETERS

;THE FOLLOWING PARAMETERS CONTROL WHERE DDT GETS LOADED.

;RUNLOC		WHERE DDT'S CODE WILL GO AT RUNTIME.  IF NEGATIVE,
;		DDT'S CODE WILL START AT RELOCATABLE ZERO.  THIS
;		PARAMETER IS IGNORED IF FTMON OR FTEX20, SINCE THESE
;		FLAVORS OF DDT GO IN SPECIFIC PSECTS OF THE TOPS-20
;		MONITOR.
;
;VARLOC		WHERE DDT'S VARIABLES WILL GO AT RUNTIME.  IF
;		NEGATIVE, DDT'S VARIABLES WILL IMMEDIATELY
;		FOLLOW THE CODE.  IGNORED IF FTMON OR FTEX20.


;THE FOLLOWING VARIABLES DESCRIBE/REMEMBER DDT'S MEMORY LAYOUT

;BEG.C		THE FIRST LOCATION CONTAINING CODE
;END.C		THE LAST LOCATION CONTAINING CODE + 1
;LEN.C		THE LENGTH OF THE CODE (END.C-BEG.C)
;BEG.V		THE FIRST LOCATION CONTAINING VARIABLE STORAGE
;END.V		THE LAST LOCATION CONTAINING VARIABLE STORAGE + 1
;LEN.V		THE LENGTH OF THE VARIABLE AREA (END.V-BEG.V)
;PHVAR		THE LOCATION INSIDE THE CODE AREA WHERE A PURE
;		COPY OF THE VARIABLE AREA STARTS.
;DDTBEG		THE LOWEST ADDRESS THAT IS PART OF DDT (FOR $$Z CODE)
;DDTEND		THE HIGHEST ADDRESS (+1) THAT IS PART OF DDT


;DEFAULT RUNLOC AND VARLOC

  IFN FTVMX,<
	ND	RUNLOC,700000	;VMDDT DEFAULT ORIGIN
    IFN FTPURE,<ND VARLOC,770000>	;TWOSEG VERSION'S VARIABLES
>

  IFN FTUD20,<
	ND	RUNLOC,740000	;TOPS-20 USER DDT'S DEFAULT ORIGIN
	ND	VARLOC,RUNLOC-NDDTPG*1000	;ORIGIN OF -20 UDDT'S VARS
>

	ND	RUNLOC,-1	;DEFAULT TO RELOCATABLE IF NOT GIVEN
	ND	VARLOC,-1	; . . .
;SETUP TO ALLOCATE DDT'S CODE AT THE RIGHT PLACE

  IFN FTEX20,<
	.PSECT	ERCOD		;-20 EDDT IN EXTENDED RESIDENT CODE
  > ;END IFN FTEX20


  IFN FTMON,<
	.PSECT	ENCOD		;-20 MDDT IN EXTENDED NON-RESIDENT CODE
  > ;END IFN FTMON


  IFE FTEX20!FTMON,<


    IFGE RUNLOC,<


	IFGE VARLOC,<
	IFN FTPURE&FTDEC10,<.PSECT .HIGH.,RUNLOC>	;HISEG ON -10
	IFE FTPURE&FTDEC10,<.PSECT DDTCOD/RONLY,RUNLOC>
		;READ-ONLY IF VARS GO ELSEWHERE
	> ;END IFGE VARLOC

	IFL VARLOC,<
	.PSECT	DDTALL/RWRITE,RUNLOC	;READ/WRITE IF WE GET VARS TOO
	> ;END IFL VARLOC
    > ;END IFGE RUNLOC


    IFL RUNLOC,<
	RELOC	0		;START AT RELOCATABLE 0 IF NO RUNLOC
    > ;END IFL RUNLOC
  > ;END IFE FTEX20!FTMON


  IFGE VARLOC,<IFGE RUNLOC,<IFL <VARLOC-RUNLOC>,<
;>>>	DDTBEG:!		;PUT DDTBEG HERE UNLESS SURE VARS ARE LOWER


BEG.C:!				;START OF CODE
DDTOFS:!			;OFFSET FOR COMMAND DISPATCH
SUBTTL	OPDEFS

;GENERAL

OPDEF	SKPUSR	[SKIPL USRFLG]	;SKIP IN USER MODE
OPDEF	SKPEXC	[SKIPGE USRFLG]	;SKIP IN EXEC MODE
OPDEF	SKPKA	[SKIPN KAFLG]	;SKIP FOR KA10
OPDEF	SKPNKA	[SKIPE KAFLG]	;SKIP NOT KA10
OPDEF	SKPKI	[SKIPN KIFLG]	;SKIP FOR KI10
OPDEF	SKPNKI	[SKIPE KIFLG]	;SKIP NOT KI10
OPDEF	SKPKL	[SKIPN KLFLG]	;SKIP FOR KL10
OPDEF	SKPNKL	[SKIPE KLFLG]	;SKIP NOT KL10
OPDEF	SKPKS	[SKIPN KSFLG]	;SKIP FOR KS10
OPDEF	SKPNKS	[SKIPE KSFLG]	;SKIP NOT KS10
OPDEF	SKPKLS	[SKIPN KLSFLG]	;SKIP FOR KL10 OR KS10

OPDEF	SKPKIP	[SKIPN KIPAG]	;SKIP FOR KI-PAGING
OPDEF	SKPKLP	[SKIPN KLPAG]	;SKIP FOR KL-PAGING
OPDEF	SKPS0	[SKIPE SECDDT]	;SKIP IF IN ZERO SECTION 
OPDEF	SKPNS0	[SKIPN SECDDT]	;SKIP IF IN NON-ZERO SECTION

;PROCESSOR

OPDEF	APRID	[700000,,000000];KL-10/KS-10 READ APR ID
OPDEF	RDAPR	[700240,,000000];KS-10 CONI APR,
OPDEF	WRAPR	[700200,,000000];KS-10 CONO APR,
OPDEF	RDCSB	[702040,,000000];KS-10 READ CST BASE
OPDEF	RDSPB	[702000,,000000];KS-10 READ SPT BASE
OPDEF	RDTIMS	[702200,,000000];KS-10 RDTIME
OPDEF	WRTIMS	[702600,,000000];KS-10 WRTIME
OPDEF	BLTBU	[716000,,000000];KS-10 BLT BYTE TO UNIBUS
OPDEF	BLTUB	[717000,,000000];KS-10 BLT UNIBUS TO BYTE
OPDEF	PMOVE	[052000,,000000];KL-10 PHYSICAL MOVE
OPDEF	PMOVEM	[053000,,000000];KL-10 PHYSICAL MOVEM

OPDEF	GFAD	[102B8]		;G-FLOATING ADD
OPDEF	GFSB	[103B8]		;G-FLOATING SUBTRACT
OPDEF	GFMP	[106B8]		;G-FLOATING MULTIPLY
OPDEF	GFDV	[107B8]		;G-FLOATING DIVIDE
OPDEF	XMOVEI	[SETMI]		;MACRO HASN'T GOT IT YET
OPDEF	IFIW	[1B0]		; . . .
.NODDT	IFIW			;DON'T WANT TO OVERRIDE SETZ
OPDEF	NOP	[TRN]		;FAST NO-OP
SUBTTL	MISCELLANEOUS DDT SYMBOLS

;ASSEMBLY CONSTANTS

	ND PAGSIZ,1000		;"BLOCK" SIZE OF LOGICAL DISK/MEMORY ALLOCATION
	PAGMSK==PAGSIZ-1	;"AND" TO MASK TO ADDRESS WITHIN PAGE
	PG2WRD==^D36-^L<PAGSIZ-1> ;"LSH" FOR PAGE TO WORD ADDRESS
	WRD2PG==-PG2WRD		;"LSH" FOR WORD TO PAGE ADDRESS
	VMADR==7777,,777777	;MASK FOR VIRTUAL MEMORY ADDRESS
	VSECNO==7777,,0		;VIRTUAL SECTION NUMBER MASK
	PCFLGS==777740,,0	;PC FLAG MASK
	DDAF==1B0		;DDT INTERNAL ADDRESS
	EFIWX==17B5		;INDEX FIELD IN EFIW
	EFIWI0==1B0		;EFIW INDIRECT BIT 0
	EFIWI1==1B1		;EFIW INDIRECT BIT 1

	ND BLKSIZ,200		;"BLOCK" SIZE OF PHYSICAL DISK ALLOCATION
	BLKMSK==BLKSIZ-1	;"AND" TO MASK TO ADDRESS WITHIN BLOCK
	BL2WRD==^D36-^L<BLKSIZ-1> ;"LSH" FOR BLOCK TO WORD ADDRESS
	WRD2BL==-BL2WRD		;"LSH" FOR WORD TO BLOCK ADDRESS

	PG2BLK==PG2WRD-BL2WRD	;"LSH" FOR PAGE TO BLOCK ADDRESS
	BLK2PG==-PG2BLK		;"LSH" FOR BLOCK TO PAGE ADDRESS

	ND SKPMAX,3		;MAX NUMBER OF SKP'S IN $X LOGIC
	ND NSAVTB,^D17		;NUMBER OF PC'S IN RING BUFFER ($<CR> ETC.)
	ND INDPTH,100		;MAX NESTING IN $E SEARCHES
	ND ADRNGE,1000		;ADDRESS RANGE FOR SYMBOL+VALUE TYPEOUT
	ND XTYPAV,4321		;EXEC-MODE TYPEAHEAD CHECK INTERVAL
	ND XTYPAW,4		;WORDS OF BUFFER FOR EXEC-MODE TYPEAHEAD
	ND PVNAML,^D39		;PDV NAME LENGTH FOR TYPEIN
	PVNMSZ==<PVNAML/5>+1	;WORDS TO STORE PDV NAME

  IFN FTFILE,<ND SCSIZ,^D200>	;SIZE OF SYMBOL TABLE CACHE FOR FILDDT
  IFE FTFILE,<ND SCSIZ,^D100>	; ALL OTHER DDTS

;BREAKPOINT SYMBOLS, BREAKPOINT BLOCK ALLOCATION
;  REPEAT NBP,<BLOCK NBPBW>	;STORAGE FOR EACH BREAKPOINT (1-12)
;				;(NOTE: BREAKPOINT 0 DOESN'T NEED SPACE HERE)
;  BLOCK BPBRST			; FOR USE BY RESTOR
;  BLOCK BPB$XL			; FOR USE BY $X CODE
;  BLOCK BPI$XL			; FOR USE BY INSTR$X CODE

	ND NBP,^D12		;NUMBER OF BREAKPOINTS
  IFN FTEX10,<$NB==:NBP>	;FOR TOPS-10 MONITOR
	ND NBPBW,3		;WORDS PER ENTRY IN BREAKPOINT BLOCK
	BPBRST==NBP*NBPBW	;1ST BPBLK WORD AVAIL TO RESTOR
	ND BPBRSL,4		;WORDS NEEDED BY RESTOR IN BPBLK
	BPB$X==BPBRST+BPBRSL	;1ST BPBLK WORD AVAIL TO $X
	ND BPB$XL,2*<SKPMAX+1>+5;WORDS NEEDED BY $X IN BPBLK
	BPI$X==BPB$X+BPB$XL	;1ST BPBLK WORD AVAIL TO INSTR$X
	ND BPI$XL,2*<SKPMAX+1>+1;WORDS NEEDED BY INSTR$X IN BPBLK
	BPBLEN==BPI$X+BPI$XL	;TOTAL LENGTH OF USED BREAKPOINT BLOCK
	BPBMAX==100		;ADVERTISED LENGTH OF BREAKPOINT BLOCK
				; (MUST AGREE W/ TOPS-20 EDDBLK, MDDBLK)
  IF2,<IFL <BPBMAX-BPBLEN>,<PRINTX ?BREAKPOINT BLOCK TOO LONG>>
;ADDRESS (PAGE) ACCESS BIT DEFINITIONS

DEFINE	SYSPRM(NAM,T10,T20),<
	IFN FTDEC10,<NAM==<T10>>
	IFN FTDEC20,<NAM==<T20>>>

SYSPRM	PG$EXI,	PA.GNE,	PA%PEX	;PAGE EXISTS
SYSPRM	PG$REA,	PA.GRD,	PA%RD	;PAGE CAN BE READ
SYSPRM	PG$WRT,	PA.GWR,	1B15	;PAGE HAS SOME KIND OF WRITE ACCESS
SYSPRM	PG$WT,	PG$WRT,	PA%WT	;PAGE IS REALLY WRITABLE
SYSPRM	PG$CPY,	0,	PA%CPY	;PAGE IS COPY-ON-WRITE
SYSPRM	PG$EXE,	0,	PA%EX	;PAGE IS EXECUTABLE
SYSPRM	PG$ACC,	PA.GAA,	0	;PAGE ACCESS ALLOWED
SYSPRM	PG$PRV,	0,	PA%PRV	;PAGE IS PRIVATE
SYSPRM	PG$SHR,	PA.GSH,	0	;PAGE IS SHARABLE
SYSPRM	PG$HGH,	PA.GHI,	0	;PAGE IS PART OF HIGH SEGMENT
SYSPRM	PG$ABZ,	PA.GAZ,	1B17	;PAGE IS ALLOCATED BUT ZERO
SYSPRM	PG$SPY,	PA.GSP,	0	;PAGE IS ACTUALLY SPYING ON SOMEONE
SYSPRM	PG$VIR,	PA.GVR,	0	;SPY PAGE IS VIRTUAL (ON MONITOR)
SYSPRM	PG$NPG,	PA.GCP,	0	;PAGE CANNOT BE PAGED OUT
SYSPRM	PG$PGO,	PA.GPO,	0	;PAGE IS PAGED OUT
SYSPRM	PG$LCK,	PA.GLK,	0	;PAGE IS LOCKED IN MEMORY
SYSPRM	PG$NCA,	PA.GNC,	0	;PAGE IS NOT CACHED
SYSPRM	PG$SXI,	PA.GSN,	PA%PEX	;SECTION EXISTS
SYSPRM	PG$SMA,	PA.GIN,	1B12	;SECTION MAPPED ELSEWHERE
SYSPRM	PG$SIN,	PA.GIN,	SM%IND	;SECTION MAPPED INDIRECTLY
SYSPRM	PG$SFJ,	0,	1B11	;SECTION MAPPED TO FORK OR JFN
SYSPRM	PG$SEC,	PA.GSC,	37B17	;SECTION NUMBER MAPPED TO
SYSPRM	PG$FRK,	0,	777777	;FORK/JFN MAPPED TO


;BITS AND FIELDS RELEVANT TO KL PAGING.

  IFN FTEXEC!FTMON!FTPAGM,<
	AGEMSK==777B5		;AGE FIELD
	CSWRB==1B18		;CST WRITE ENABLE BIT
	CORMB==1B35		;CST MODIFIED BIT
	PTRCOD==7B2		;POINTER CODE FIELD
	 IMMCOD==1		;IMMEDIATE POINTER CODE
	 SHRCOD==2		;SHARED POINTER CODE
	 INDCOD==3		;INDIRECT POINTER CODE
	IMMPTR==<IMMCOD>B2	;IMMEDIATE POINTER
	PTPUB==1B3		;POINTER PUBLIC BIT
	PTWR==1B4		;POINTER WRITE BIT
	PTCACH==1B6		;POINTER CACHE BIT
	MSECTB==540		;MONITOR SECTION TABLE IN EPT
	PGKLMD==1B21		;KL PAGING MODE (IN CONI PAG,)
	PGTPEN==1B22		;TRAP ENABLE (PAGING ON) (IN CONI PAG,)
	TWUSR==1B0		;USER MODE BIT IN PF AND MAP WORD
	TWHPFF==1B1		;HARD FAILURE BIT
	TWVALD==1B2		;VALID BIT
	TWWRT==1B5		;WRITE REF BIT
  > ;END OF IFN FTEXEC!FTMON!FTPAGM
;PC BITS OF INTEREST

SYSPRM	PC$AFI,	PC.AFI,	PC%AFI	;ADDRESS FAILURE INHIBIT
SYSPRM	PC$USR,	PC.USR,	PC%USR	;USER MODE
SYSPRM	PC$BIS,	PC.BIS,	PC%BIS	;FIRST PART DONE
SYSPRM	PC$UIO,	PC.UIO,	PC%UIO	;USER IO MODE


;TERMINAL CONTROL (IN TTYMSK, N$1M COMMAND)

;LEFT HALF BITS, PRESERVED AND SET ONLY BY USER

	TT$EYB==1B15		;ECHO $Y BIT (0=ECHO, 1=SUPPRESS)
	TT$BPI==1B16		;PRINT INSTRUCTION ON BPT (0=YES, 1=NO)
	TT$SPC==1B17		;3 SPACES OR TAB (0=SPACES, 1=TAB)
				; (CONTROLS ONLY TTAB; TEXT OUTPUT OK)

;RIGHT HALF BITS, SET AUTOMATICALLY ON USER DDT ENTRY (NOT APPLICABLE
;TO TOPS-20), PRESERVED IN EXEC DDT (WHERE THEY MUST MANUALLY BE SET).

	TT$TAB==1B34		;TAB CAPABILITY
				; (IF 1 THEN TERMINAL HANDLES TABS)
	TT$DEL==1B35		;FANCY DELETE HANDLING
				; (IF 1 THEN <BS><SP><BS>)
;FOR FILE DDT ONLY

  IFN FTFILE,<
FIL==1				;PRIMARY FILE I/O CHANNEL

	ND WINMAX,^D20		;PAGE "CACHE" SIZE - PAGES KEPT IN CORE
	ND MEXSIZ,^D512*^D32	;MAX PAGES IN REASONABLE .EXE FILE

;.EXE DIRECTORY INFORMATION

SV$HIS==SV%HIS			;PAGE IS PART OF HIGH SEGMENT
SV$SHR==SV%SHR			;PAGE IS SHARABLE
SV$WRT==SV%WRT			;PAGE IS WRITABLE
SV$CON==SV%CON			;PAGE IS CONCEALED
SV$ABZ==SV%ABZ			;PAGE IS ZERO
SV$MOD==1B17			;PAGE HAS BEEN MODIFIED (WINDIR BIT)
SV$FPN==777,,777777		;FILE PAGE NUMBER MASK

  > ;END OF IFN FTFILE

;************************************************************
;
;	TEMP DEFS TIL UNIVERSALS HAVE THEM INCORPORATED
;
;************************************************************

    IFN FTDEC10,<		;SOME TOPS-10 STUFF
.PVCNT==0			;PDV LENGTH
.PVNAM==1			;POINTER TO NAME STRING
.PVSYM==6			;SYMBOL VECTOR WORD
.PVLVR==12			;LINK VERSION WORD
SV%ABZ==0			;EXE DIRECTORY - PAGE IS ZERO
    > ;END OF TOPS-10 STUFF

    IFN FTDEC20,<		;AND SOME TOPS-20 STUFF
.SVDIR==1776			;EXE DIRECTORY HEADER TYPE
SV%HIS==1B0			;EXE DIRECTORY - PAGE IS HISEG PAGE
SV%SHR==1B1			;EXE DIRECTORY - PAGE IS SHARABLE
SV%WRT==1B2			;EXE DIRECTORY - PAGE IS WRITABLE
SV%CON==0			;EXE DIRECTORY - PAGE IS CONCEALED
SV%ABZ==1B3			;EXE DIRECTORY - PAGE IS ZERO
.PVEXP==.PVSTR			;"EXPORT" VECTOR (USED TO BE START ADR)
    > ;END OF FTDEC20 STUFF

.SVVEC==1775			;EXE DIRECTORY ENTRY VECTOR TYPE
.SVPDV==1774			;EXE DIRECTORY PDV TYPE

;PDV SYMBOL VECTOR SYMBOLS
.STLEN==0			;LENGTH WORD IN SYMBOL VECTOR
.STDAT==0			;TYPE/LENGTH WORD IN SUBTABLE
.STPTR==1			;ADDRESS WORD IN SUBTABLE
ST%TYP==77B5			;TYPE FIELD IN .STDAT WORD
ST%LEN==^-ST%TYP		;LENGTH FIELD IN .STDAT WORD
.UNDFD==0			;UNDEFINED SYMBOL TYPE CODE
.R50D==1			;RADIX-50 DEFINED TYPE CODE
.R50U==2			;RADIX-50 UNDEFINED TYPE CODE
;*** FLAGS IN F ***

FEF==	1B0			;"E" FLAG
COMF==	1B1			;COMMA TYPED
TIF==	1B2			;TRUNCATE TO 18 BITS - SET BY SPACE OR COMMA
DVF==	1B3			;DIVIDE
FPF==	1B4			;"." TYPED
CCF==	1B5			;"$$" TYPED
STF==	1B6			;SUPPRESS TYPEOUT
SAF==	1B7			;RIGHT ANGLEBRACKET TYPED
FAF==	1B8			;LEFT ANGLEBRACKET TYPED
SPF==	1B9			;SPACE TYPED (USED BY CEFFAD)
MLF==	1B10			;MULTIPLY
PTF==	1B11			;ARITHMETIC OPERATOR TYPED
CF==	1B12			;"$" TYPED
LTF==	1B13			;LETTER TYPED IN CURRENT SYLLABLE
DTF==	1B14			;DIGIT TYPED
SF==	1B15			;SYLLABLE
MF==	1B16			;MINUS SIGN TYPED
QF==	1B17			;QUANTITY TYPED IN TO WORD ASSEMBLER
DDLF==	1B18			;DDT INTERNAL SYMBOL TYPED
ROF==	1B19			;REGISTER OPEN
TXF==1B20			;IN TEXT ([$]"/---/) COMMAND
USYMF==1B21			;R POINTS TO THE UNDEFINED SYMBOL TABLE
MDLCLF==1B22			;MULT DEF LOCAL SYMBOL (EVAL)
PNAMEF==1B23			;PROGRAM NAME SEEN IN SYM TABLE SEARCH
;BIT 24 AVAILABLE
LF1==	1B25			;OUTPUT ONE REGISTER IN FORCED MODE
OLF==	1B26			;OUTSIDE LOCAL FLAG IN LOOK
CF1==	1B27			;OUTPUT ONE REGISTER AS CONSTANT
NAF==	1B28			;NEGATIVE ADDRESSES PERMISSABLE
FANYSF==1B29			;EVAL OR LOOK HAS FOUND A SYMBOL
OPTRYF==1B30			;WE'RE TRYING TO DECODE A SYMBOLIC OPCODE
HSYMF==	1B31			;R POINTS TO HISEG SYMBOL TABLE
OKAF==	1B32			;OK AMBIGUOUS (LOOK ROUTINE)
OUTF==	1B33			;OUTPUT
ITF==	1B34			;INSTRUCTION TYPED
Q2F==	1B35			;NUMBER TYPED AFTER $

;DEFINE SYMBOL TABLE SYMBOL TYPES
GLOBL==	04B5			;GLOBAL SYMBOL
LOCL==	10B5
PNAME==	74B5			;PROGRAM NAME
DELI==	20B5			;DELETE INPUT
DELO==	40B5			;DELETE OUTPUT

;DEFINE UNDEFINED SYMBOL TABLE (.JBUSY) TYPES

STADD==	1B0			;IF 1, THEN ADDITIVE REQUEST
STLH==	1B1			;IF 1, THEN REQUEST FOR LEFT HALF
STNEG==	1B4			;IF 1, THEN NEGATIVE REQUEST
;RANDOM SYMBOL DEFINITIONS FOR TOPS-10

  IFN FTDEC10,<

;THE FSBLK BITS

FS$SWT==1B0		;SWITCH SPECIFIED
FS$DEV==1B2		;DEVICE SPECIFIED
FS$NAM==1B3		;FILENAME SPECIFIED
FS$EXT==1B4		;EXTENSION (FILE TYPE) SPECIFIED
FS$PTH==1B5		;DIRECTORY PATH SPECIFIED

FS$FIL==FS$DEV!FS$NAM!FS$EXT!FS$PTH  ;FILE SPEC WAS SPECIFIED


;I/O CHANNELS

    IFN FTYANK,<
	CM==17			;I/O CHANNEL TO READ COMMAND FILES
	ND	YBFSIZ,203	;SIZE OF [INTERNAL] BUFFER FOR COMMAND FILES
    > ;END IFN FTYANK
  > ;END OF IFN FTDEC10
SUBTTL	START DDT

  IFE FTFILE,<

  IFN FTDBUG,<
DEBDDT::>

DDTX:
DDT:

IFN FTPURE&FTDEC10,<DEFINE SETRT1<@[0,,.JBBLT]>>
  IFN FTPURE,<
	MOVEM	T,SETRT1	;SAVE AN AC
    IFN FTDEC10,<
	DMOVEM	TT1,@[0,,.JBBLT+1] ;SAVE SOME MORE ACS
	MOVNI	TT1,<<END.V!PAGMSK+1>-<BEG.V&<^-PAGMSK>>>/PAGSIZ
	XMOVEI	TT2,BEG.V	;GET -VE LENGTH AND ADDRESS
	LSH	TT2,WRD2PG	;CONVERT TO STARTING PAGE NUMBER
	TXO	TT2,PA.GDC	;OK IF PAGES ALREADY EXIST
	MOVE	T,[.PAGCD,,TT1]	;UUO ARGUMENT POINTER
	PAGE.	T,		;TRY TO CREATE THE PAGES
	  TRNA			;CAN'T CREATE IN PHYSICAL MEMORY
	JRST	DDTIN0		;PAGES CREATED
	TXO	TT2,PA.GSL	;TRY TO MAKE THE PAGES ABZ INSTEAD
	MOVE	T,[.PAGCD,,TT1]	;UUO ARGUMENT POINTER
	PAGE.	T,		;TRY TO ALLOCATE THE PAGES
	  TRN			;GIVE UP AND HOPE FOR THE BEST
DDTIN0:	DMOVE	TT1,@[0,,.JBBLT+1] ;RESTORE UUO ARGUMENT ACS
    > ;END OF IFN FTDEC10
	MOVE	T,BPT$B+B$JSR
	CAMN	T,[JSR BCOM]	;VARIABLES AREA INITIALIZED?
	JRST	DDTIN1		;YES
	MOVE	T,[PHVAR,,BEG.V] ;NO, DO IT
	BLT	T,VAREND-1
    IFN FTDEC10,<
	XMOVEI	T,$0BPT		;WHERE ^D SHOULD GO
	MOVEM	T,@[0,,.JBBPT]	;SET IT UP
	SKIPE	@[0,,.JBDDT]	;IF ALREADY HAVE THIS,
	JRST	DDTIN1		;DON'T WASTE THE UUO
	MOVE	T,[DDTEND,,DDT]	;NO--WE NEED TO SET THIS UP
	SETDDT	T,		;SO DO IT
    > ;END OF IFN FTDEC10
DDTIN1:	MOVE	T,SETRT1	;RESTORE SCRATCH AC
  > ;END IFN FTPURE

  IFN FTYANK,<
	SETZM	COMAND>		;INDICATE NO COMMAND FILE IF
				;STARTING BY DDT COMMAND
	JSR	SAVE
	 PUSHJ	P,REMOVB
  IFN FTUD20,<			;CHECK DDTPDV BEFORE CALLING SYMCHK
	SKIPN	DDTPDV		;DID WE LOOK FOR IT YET?
	PUSHJ	P,HIDPDV	;NO, FIND IT.  COME BACK IF NON-EXISTANT.
	SKIPL	T,DDTPDV	;ALREADY LOCATE DDT'S PDV?
	HLL	T,SECDDT	;YES, FIX UP SECTION NUMBER
	MOVEM	T,DDTPDV	;REMEMBER PDVA IN OUR SECTION
  > ;END IFN FTUD20
	PUSHJ	P,SYMCHK	;MAKE SURE SYMBOLS ARE OK
  IFE FTVMX!FTMON,<MOVE W1,[ASCII /DDT/]> ;IDENTIFY USER MODE DDT
  IFN FTVMX,<
    IFE FTPURE,<MOVE W1,[ASCII /VMDDT/]>	;IDENTIFY TOPS-10 VM DDT
    IFN FTPURE,<MOVE W1,[ASCII /XDDT/]>	;IDENTIFY TOPS-10 X DDT
  >
  IFN FTMON,<MOVE W1,[ASCII /MDDT/]>	;IDENTIFY TOPS-20 MDDT
  IFN FTEXEC&<^-FTMON>,<
	SKPUSR				;IF EXEC MODE, THEN
	MOVE	W1,[ASCII /EDDT/]	;IDENTIFY EXEC MODE DDT
  > ;END OF IFN FTEXEC
	PUSHJ	P,TEXT2		;TYPE MESSAGE SAYING WHICH DDT
  IFN FTDBUG,<
	MOVEI	W1,[ASCIZ/ (debugging)/]
	PUSHJ	P,TSTRG		;DIFFERENTIATE FROM REGULAR DDT(S)
  > ;END IFN FTDBUG
	JRST	DD1.0		;GO FOR IT!
  >				;END IFE FTFILE

;RUDE HACK TO TRY TO GET THE COPYRIGHT TO BE INTACT IN DDT.REL

	.ORG	0
	EXP	0
	.ORG

;LEGAL NOTICE FOR BINARIES

	ASCIZ	"
COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1970,1989. ALL RIGHTS RESERVED.
"
SUBTTL	DDT COMMAND PARSER
DD1.0:	SKIPE	T,PTLLC		;GET LAST PATCH LOCATION CHANGED
	MOVEM	T,LLOC		;SET . TO IT, IF WE WERE PATCHING
	SETZM	PTLOC		;DEFINE NO PATCH IN PROGRESS
DD1:	PUSHJ	P,TCRLF
DD1.5:	TXZ	F,ROF		;CLOSE ANY OPEN REGISTER
	MOVE	T,[XWD SCHM,SCH]
	BLT	T,ODF		;LOAD ACS
	MOVE	T,PSVBTS
	MOVEM	T,SVBTS
	MOVE	T,PBYSS
	MOVEM	T,BYSS
	SKIPA			;SKIP TAB TYPEOUT
RET:	PUSHJ	P,TTAB		;TYPE A TAB AND FALL THROUGH TO DD2
  IFN FTMON,<BRKLCK>		;GIVE UP MDDT LOCK IF HOLDING IT.
DD2:	MOVE	T,[SCH,,SCHR]	;SAVE CURRENT TYPEOUT MODES
	BLT	T,ODFR		;IN CASE REPARSE NEEDED
	SETZM	PRNC		;PARENTHESES COUNT
	INIPDL			;INIT STACK POINTER
	SETZM	WAKALL		;SET WAKEUP SET TO PUNCT AND CTRLS
	XMOVEI	T,RET		;INIT TOP OF STACK TO RET
	MOVEM	T,XPDL		;SO COMMAND ROUTINES CAN POPJ
	DMOVE	T,USYMP+S$ADR	;GET ORIGINAL UNDEFINED SYMBOL PTR
	DMOVEM	T,ESTUT		;INIT UNDEFINED SYM ASSEMBLER COPY
LIS0C:	TXZ	F,<^-<STF>&<-1,,0>>!LF1!CF1!OKAF!ITF!Q2F
LIS0E:	TXZ	F,<^-<STF!FAF!SAF>&<-1,,0>>!NAF!DDLF
	SETZM	ACCCF		;CLEAR COMMACOMMA FLAG/VALUE
	SETZM	WRD
LIS1:	SETZM	FRASE
	TXZ	F,FEF		;TURN OFF SCIENTIFIC EXPONENT FLAG
LIS2:	MOVEI	T,1
	MOVEM	T,FRASE1
	TXZ	F,MLF!DVF
L1:	TXZ	F,CF!CCF!SF!FPF!Q2F!LTF!TXF!DTF ;TURN OFF CONTROL, SYL, PERIOD FLAG
L1A:	SETZM	SYL
L1RPR:	SETZM	SYM
	MOVEI	T,6
	MOVEM	T,TEM		;INIT SYMBOL COUNTER
	MOVE	T,[POINT 7,OPTXT]
	MOVEM	T,CHP		;SETUP FOR OPEVAL SYMBOL
	SETZM	DEN
	SETZM	WRD2D
	SETZM	WRD2O

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

L2:	PUSHJ	P,TIN		;PICK UP CHARACTER
	CAIL	T,"A"+40	;LOWER CASE A
	CAILE	T,"Z"+40	;LOWER CASE Z
	JRST	.+2
	TRC	T,40		;CHANGE LOWER CASE TO UPPER CASE
	TXNE	F,CF		;CONTROL FLAG
	JRST	L21
	CAIG	T,"Z"		;Z
	CAIGE	T,"A"		;A
	JRST	.+2
	JRST	LET
L21:	CAIN	T,"`"		;<GRAVE> MAPPED TO <ESC>
	MOVEI	T,.CHESC
	MOVE	R,T
	CAILE	T,137		;DISPATCH TABLE HAS ENTRIES ONLY .LE. 137
	JRST	ERR
	IDIVI	R,3		;REMAINDER GIVES COLUMN, QUOTIENT GIVES ROW
	LDB	W,BDISP(R+1)	;GET 12 BIT ADDRESS FROM DISPATCH TABLE
	CAIGE	W,MULT-DDTOFS	;FIRST EVAL ROUTINE
	JRST	DDTOFS(W)
L0:	MOVE	T,SYL
	TXNN	F,LTF
	JRST	POWER


;TIME TO EVALUATE A SYMBOL.  IF THIS IS IN THE OPCODE FIELD (1ST THING
;TYPED AND TERMINATED WITH A SPACE), THEN SEARCH ORDER IS:
;1. OPDEFS FROM THE S.T. (B0-8 .NE. 0) 2. BUILT-IN OPCODES 3. REST OF S.T.
;IF THE SYMBOL TYPED IS NOT IN THE OPCODE FIELD, THEN THE ORDER IS:
;1. ANY MATCH IN THE S.T. 2. DDT'S BUILT-IN OPCODES.
;THE FLAG OPTRYF INDICATES THAT WE ARE TRYING TO SEARCH FOR AN OPCODE.

	TXO	F,OPTRYF	;ASSUME WE ARE IN THE OPCODE FIELD
	CAIN	W,SPACE-DDTOFS	;IS TERMINATOR A SPACE?
	SKIPE	WRD		;IS CONSTRUCTED WORD SO FAR ZERO?
	TXZ	F,OPTRYF	;NO, NOT AN OPCODE
	PUSHJ	P,EVAL		;TRY FOR A MATCH IN THE S.T.
	 JRST [	TXZ	F,OPTRYF	;SO UNDEF TEST BELOW WILL WORK
		JRST	L27]		;TRY BUILT-IN OPCODES
	TXNE	F,OPTRYF	;ONLY WANT OPDEFS?
	TXNE	T,777B8		;YES, IS THIS ONE?
	JRST	L3		;WE'LL TAKE ANYTHING OR THIS IS AN OPCODE
	MOVEM	T,TENSYM	;ONLY NON-OPCODE FOUND, SAVE TENATIVE MATCH
L27:	PUSHJ	P,OPEVAL	;SEARCH FOR A (BETTER?) MATCH IN OPCODES
	  SKIPA	T,TENSYM	;NOTHING, HAD BETTER BE A SAVED VAL
	JRST	L3		;BETTER MATCH FOUND, GO WITH IT
	TXZN	F,OPTRYF	;DID EARLIER EVAL FIND ANYTHING?
	JRST	UND1		;NO, GIVE UP

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

L3:	CAIN	W,ASSEM-DDTOFS	;DEFINED SYMBOL FOLLOWED BY #?
	JRST	ERR		;IF DEFINED, DON'T ALLOW #
L4:	TXZE	F,MF
	MOVN	T,T
	TXNN	F,SF
	CAIE	W,LPRN-DDTOFS
	JRST	.+2
	JRST	LPRN

	EXCH	T,FRASE1
	TXNN	F,DVF
	IMULB	T,FRASE1
	TXZE	F,DVF
	IDIVB	T,FRASE1
	CAIGE	W,ASSEM-DDTOFS
	JRST	DDTOFS(W)	;MULTIPLY OR DIVIDE
	ADDB	T,FRASE
	CAIGE	W,SPACE-DDTOFS
	JRST	DDTOFS(W)	; + - @ ,

	MOVE	W1,T		;GET A WORKING COPY OF ARGUMENT
	XOR	W1,WRD		;WILL ADD OVERFLOW?
	JUMPL	W1,SKP311	;NO, DO IT NORMALLY
	TLC	T,(1B0)		;YES, TURN OFF SIGN BIT
	ADD	T,WRD		;NOW DO THE ADD
	TLCA	T,(1B0)		;FIX THE SIGN BIT AND SKIP
SKP311:	ADD	T,WRD
	TXNE	F,TIF		;TRUNCATE INDICATOR FLAG
	HLL	T,WRD		;TRUNCATE
	MOVEM	T,WRD
	TXNN	F,QF
	MOVE	T,LWT
	SETZM	R
	DMOVE	W1,ESTUT	;GET ADR AND LENGTH FOR DEPRA
	CAMN	W1,USYMP+S$ADR	;IF THERE ARE ANY UNDEFINED SYMBOLS IN
	JRST	L5		;THE CURRENT EXPRESSION, ANYTHING EXCEPT
	CAILE	W,CARR-DDTOFS	;FURTHER EXPRESSION INPUT, OR DEPOSITING
	JRST	ERR		;  INTO MEMORY IS ILLEGAL
L5:	CAIG	W,RPRN-DDTOFS
	JRST	DDTOFS(W)
	SKIPN	PRNC		;WHEN INSIDE ( ), CURRENT EXPRESSION INVALID
	JRST	DDTOFS(W)	;FOR ANYTHING OTHER THAN MORE EXPRESSION INPUT
	JRST	ERR

;CALL TO EVAL ARGUMENT IF NOT ALREADY DONE (I.E. CODE WAS IN "NO-EVAL"
;ADDRESS RANGE)

XEVAL:	MOVEI	W,[POPJ P,]	;COUNT ON THIS LITERAL BEING AFTER EVERYTHING
	SUBI	W,DDTOFS	;ADJUST FOR OFFSET
	JRST	L0		;GO EVAL, THEN JUMP TO THE POPJ
;HANDLE AN UNDEFINED SYMBOL

UND1:	SKIPN	ESTUT		;ANY UNDEFINED SYMBOL TABLE?
	JRST	UNDEF		;NO, CAN'T DO THIS
	PUSHJ	P,EVALU		;SEE IF SYM IS IN THE UNDEFINED TABLE
	 JRST	UND3		;SYMBOL DOES NOT EXIST
	TXNE	F,ROF		;SYM EXISTS, LOCATION OPEN
	CAILE	W,CARR-DDTOFS	;AND STILL BUILDING WORD FOR IT?
	 JRST	UNDEF		;NO - THEN "U" ERROR (E.G. "=" CMD)
	CAIE	W,ACCF-DDTOFS	;EXPRESSION INVOLVING A COMMA?
	SKIPE	PRNC		;OR INSIDE PARENTHESIS?
	 JRST	UNDEF		;YES - "U" ERROR
	JRST	UND4		;NO, CONTINUE

UND3:	CAIN	W,ASSEM-DDTOFS	;DEFINING SYMBOL VIA "#" CMD
	TXNN	F,ROF		;FOR A LOCATION THAT IS OPEN?
	 JRST	UNDEF		;NO - THEN "U" ERROR
	SKIPE	PRNC		;YES - INSIDE PARENTHESIS?
	 JRST	ERR		;YES - ILLEGAL, "?" ERROR

UND4:	MOVEI	T,"#"
	CAIE	W,ASSEM-DDTOFS
	PUSHJ	P,TOUT
	SOS	ESTUT		;MAKE ROOM IN UNDEF TABLE
	SOS	ESTUT
	AOS	ESTUTL		;UPDATE LENGTH TOO
	AOS	ESTUTL
	MOVE	T,SYM
	TXO	T,GLOBL
	MOVX	R,1B1		;DEPOSIT INTO 1ST WORD OF UNDEF TABLE
	PUSHJ	P,DSYMER	;DEPOSIT AND TYPE ? IF IT FAILS
	MOVE	T,LLOCO		;WANT 30-BIT FIXUP ADDRESS
	TXNE	F,MF
	TXO	T,STNEG		;SET FLAG TO SHOW SUBTRACTIVE REQUEST
	TXO	T,STADD		;SET FLAG TO SHOW UNCHAINED REQUEST
	ADDI	R,1
	PUSHJ	P,DSYMER
	SETZ	T,
	JRST	L4
;DDT'S COMMAND PARSER DETERMINES WHAT TYPE OF COMMAND THIS IS BY
;RANGE-CHECKING THE DISPATCH ADDRESS OF THE COMMAND TO SEE WHICH
;ONE OF THE BELOW REGIONS IT FALLS INTO, THEREFORE:
;
;
;			***** WARNING ******
;
;DO NOT MOVE A COMMAND ROUTINE ACROSS A REGION BOUNDARY UNLESS YOU KNOW
;WHAT YOU ARE DOING!  THE PARSER IS VERY UNFORGIVING IN THIS RESPECT!
;
;
;THE FOLLOWING CLASSES OF COMMAND EXIST:
;
;CLASS 1:	COMMANDS THAT TAKE NO ARGUMENT, OR THAT TAKE A SYMBOL
;		NAME WITHOUT EVALUATION.
;
;CLASS 2:	MULTIPLY AND DIVIDE.
;
;CLASS 3:	COMMANDS THAT ADD SOME FUNCTION OF THE UPCOMING QUANTITY
;		TO THE ACCUMULATING RESULT.
;
;CLASS 4:	LAST COMMANDS THAT ARE LEGAL INSIDE PARENTHESES.
;
;CLASS 5:	LAST COMMANDS THAT ARE LEGAL WHEN THE EXPRESSION
;		CONTAINS UNDEFINED SYMBOLS.
;
;CLASS 6:	EVERYTHING ELSE.  THESE COMMANDS TYPICALLY TAKE A
;		COMPLETELY EVALUATED EXPRESSION, THAT CANNOT CONTAIN
;		REFERENCES TO UNDEFINED SYMBOLS.
;
;
;NOTE THAT THESE CLASSES ARE ONLY APPROXIMATE.  REFER TO THE CODE IN
;THE COMMAND PARSER FOR DEFINITIVE INFORMATION.
SUBTTL	COMMAND DISPATCH TABLE

BDISP:	POINT	12,DISP(R),11
	POINT	12,DISP(R),23
	POINT	12,DISP(R),35
DISP:
DEFINE D (Z1,Z2,Z3)<
	BYTE	(12) Z1-DDTOFS,Z2-DDTOFS,Z3-DDTOFS
  IFN <<Z1-DDTOFS>!<Z2-DDTOFS>!<Z3-DDTOFS>>&<-1,,770000>,
	<PRINTX Z1, Z2, OR Z3 TOO LARGE FOR DISPATCH TABLE> >
;THIS MACRO PACKS 3 ADDRESSES INTO ONE WORD; EACH ADR IS 12 BITS


D (ERR,ERR,ERR);	(0)	^@   ^A   ^B
D (CNTRLZ,ERR,CNTRLE);	(3)	^C   ^D   ^E
D (ERR,ERR,VARRW);	(6)	^F   ^G   ^H
D (TAB,LINEF,ERR);	(11)	^I   ^J   ^K
D (ERR,CARR,ERR);	(14)	^L   ^M   ^N
D (ERR,ERR,ERR);	(17)	^O   ^P   ^Q
D (ERR,ERR,ERR);	(22)	^R   ^S   ^T
D (ERR,ERR,ERR);	(25)	^U   ^V   ^W
D (ERR,ERR,CNTRLZ);	(30)	^X   ^Y   ^Z
D (CONTROL,ERR,ERR);	(33)	^[   ^\   ^]
D (ERR,ERR,SPACE);	(36)	^^   ^_     
D (SUPTYO,TEXI,ASSEM);	(41)	 !    "    #
D (DOLLAR,PERC,ERR);	(44)	 $    %    &
D (DIVD,LPRN,RPRN);	(47)	 '    (    )
D (MULT,PLUS,ACCF);	(52)	 *    +    ,
D (MINUS,PERIOD,SLASH);	(55)	 -    .    /
D (NUM,NUM,NUM);	(60)	 0    1    2
D (NUM,NUM,NUM);	(63)	 3    4    5
D (NUM,NUM,NUM);	(66)	 6    7    8
D (NUM,TAG,SEMIC);	(71)	 9    :    ;
D (LLIM,EQUAL,ULIM);	(74)	 <    =    >
D (QUESTN,INDIRE,ABSA);	(77)	 ?    @    A
D (BPS,CON,SYMD);	(102)	 B    C    D
D (EFFEC,SFLOT,GO);	(105)	 E    F    G
D (HWRDS,PILOC,ERR);	(110)	 H    I    J
D (KILL,PAGMAP,MASK);	(113)	 K    L    M
D (NWORD,BITO,PROCD);	(116)	 N    O    P
D (QUAN,RELA,SYMBOL);	(121)	 Q    R    S
D (TEXO,SETPAG,WATCH);	(124)	 T    U    V
D (DBLU,XEC,TAPIN);	(127)	 W    X    Y
D (ZERO,OCON,ICON);	(132)	 Z    [    \
D (OSYM,VARRW,UNDRL);	(135)	 ]    ^    _

;THIS TABLE DOES NOT HAVE ENTRIES FOR CHARS .GE. 140; THESE
; ARE DETECTED AS ERRORS NEAR L21:
SUBTTL	COMMAND ROUTINES -- CLASS 1

;*************** START OF CLASS ONE COMMANDS ***************

;"ERR" IS THE DISPATCH FOR ALL UNDEFINED COMMANDS.  VARIOUS COMMANDS
;ALSO JUMP TO ERR, WRONG, ETC. IF THEY DETECT SOME KIND OF ERROR.

WRONG:	MOVE	W1,[ASCII /XXX/]
	PUSHJ	P,TEXT
	JRST	WRONG6

RERR:	SETZ	T,		;ERROR RETURN WO PRINTING ANYTHING
	JRST	WRONG2

ERR:	MOVEI	T,"?"		;DDT'S UBIQUITOUS QUESTION MARK
	JRST	WRONG2		;JOIN COMMON ERROR PROCESSING

MULDEF:	SKIPA	T,["M"]		;MULTIPLY-DEFINED SYMBOL
UNDEF:	MOVEI	T,"U"		;UNDEFINED SYMBOL
WRONG2:	INIPDL			;ENSURE FRESH STACK
  IFN FTYANK,<			;IF COMMAND FILES SUPPORTED
	SKIPE	COMAND		;IN A COMMAND FILE?
	SKIPN	YASWF		;YES, ABORT ON COMMAND ERROR?
	JRST	WRONG3		;NO,KEEP ON GOING (IGNORE ERROR)
	PUSH	P,T		;YES, SAVE ERROR SYMBOL
	PUSHJ	P,PTRKIL	;KILL OFF THE COMMAND FILE
	POP	P,T		;RESTORE ERROR SYMBOL
	TXZ	F,ROF		;ARBITRARILY CLOSE OPEN LOCATION
  > ;END IFN FTYANK
WRONG3:	JUMPE	T,WRONG4	;SKIP DINK IF NOTHING TO TYPE HERE
	PUSHJ	P,TOUT		;ISSUE ERROR MESSAGE
	PUSHJ	P,TBEL		;AND DINK THE USER

WRONG4:	PUSHJ	P,TTYCLR	;CLEAR INPUT BUFFER
WRONG6:	TXNN	F,ROF		;REGISTER OPEN?
	JRST	DD1		;NO, CRLF.  OTHERWISE, FALL INTO RET
	JRST	RET
;HERE ON A DIGIT

NUM:	TXO	F,DTF		;DIGIT TYPED
	ANDI	T,17		;T HOLDS CHARACTER
	TXNE	F,CF!FPF
	JRST	NM1
	MOVE	W,SYL
	LSH	W,3
	ADD	W,T
	MOVEM	W,SYL
	MOVE	W1,DEN
	MULI	W1,12		;CONVERT TO DECIMAL WITHOUT OVERFLOW
	ADD	W2,T
	MOVEM	W2,DEN
	AOJA	T,LE1A

DOLLAR:	SKIPA	T,[46+101-13]	;RADIX 50 $ TO BE
PERC:	MOVEI	T,47+101-13	;PERCENT SIGN
LET:	TXC	F,SF!FPF!DTF	;EXPONENT IFF (LTF)'*(FEF)'*(T=105)*(SF)*(FPF)*(DTF)=1
	TXZN	F,LTF!FEF!SF!FPF!DTF
	CAIE	T,"E"
	TXOA	F,LTF
	TXOA	F,FEF
	JRST	LET1
	TXZN	F,MF
	SKIPA	W1,SYL
	MOVN	W1,SYL
	MOVEM	W1,FSV
	SETZM	DEN
LET1:	SUBI	T,101-13	;FORM RADIX 50 SYMBOL
LE1A:	TXO	F,SF!QF
LE2:	SOSGE	TEM		;IGNORE CHARACS AFTER 6
	JRST	L2
	MOVEI	W,50
	IMULM	W,SYM		;MULTIPLY BY RADIX 50
	ADDM	T,SYM		;  AND ADD NEW CHAR INTO SYM
	PUSHJ	P,PSYMT		;CONVERT LETTERS BACK TO ASCII
	IDPB	T,CHP
	JRST	L2
NUM1:	MOVE	W,WRD2O		;OCTAL FORM OF NUMBER AFTER $
	LSH	W,3
	ADD	W,T
	MOVEM	W,WRD2O
	EXCH	T,WRD2D		;DECIMAL FORM OF NUMBER AFTER $
	IMULI	T,12
	ADDM	T,WRD2D
	TRO	F,Q2F
	JRST	L2

NM1:	TXNE	F,CF
	JRST	NUM1
	MOVEI	W1,6		;FORM FLOATING POINT NUMBER
	AOS	NM1A
	XCT	NM1A		;MOVEI W2,..
	MOVSI	R,201400
NM1A1:	TRZE	W2,1
	FMPR	R,FT(W1)
	JUMPE	W2,NM1B
	LSH	W2,-1
	SOJG	W1,NM1A1
NM1B:	MOVSI	W1,211000(T)
	FMPR	R,W1		;COMPUTE VALUE OF NEW DIGIT
	FADRB	R,FH		;ADD VALUE INTO FLOATING NO.
	MOVEM	R,SYL
	AOJA	T,LE1A

POWER:	TXNN	F,FEF
	JRST	L4		;NO EXPONENT
				;REMOVE USELESS CODE
	MOVE	W2,DEN
	SETZM	FRASE
	MOVEI	W1,FT-1
	TXZE	F,MF
	MOVEI	W1,FT01
	SKIPA	T,FSV
POW2:	LSH	W2,-1
	TRZE	W2,1
	FMPR	T,(W1)
	JUMPE	W2,L4
	SOJA	W1,POW2
PERIOD:	TXNN	F,CF!CCF	;$. OR $$. COMMAND?
	JRST	PERIO2		;NO, JUST . CHARACTER BY ITSELF
  IFE FTFILE,<		;YES
	SKIPN	BPTIP		;BREAKPOINT IN PROGRESS?
	JRST	ERR		;NO, THEN NOT LEGAL AFTER ALL
	TXNN	F,CCF		;$. OR $$. COMMAND?
	SKIPA	T,PCWRD		;$.  -- CURRENT $X PC
	MOVE	T,I.NPC		;$$. -- PREVIOUS $X PC
	TXZA	F,CF!CCF	;CLEAR CONTROL FLAGS
  > ;END IFE FTFILE

  IFN FTFILE,<
	JRST	ERR>		;ILLEGAL IN FILDDT

PERIO2:	MOVE	T,LLOC		;JUST ".", LAST LOCATION OPENED
	TXNE	F,SF
	MOVE	T,DEN
	MOVEM	T,SYL
	TXNE	F,FPF		;HAS A PERIOD BEEN SEEN BEFORE?
	TXO	F,LTF		;YES, TWO PERIODS MAKES A SYMBOL
	TXON	F,FPF!SF!QF
	SETZ	T,
	IDIVI	T,400
	SKIPE	T
	TLC	T,243000
	TLC	W1,233000
	FAD	T,[0]		;NORMALIZE T AND W1
	FAD	W1,[0]
	FADR	T,W1
	MOVEM	T,FH
	HLLZS	NM1A
	MOVEI	T,45		;RADIX 50 PERIOD
	JRST	LE2

QUAN:	TXNN	F,CCF		;$Q OR $$Q, WHICH?
	SKIPA	T,LWT		;$Q STRAIGHT
	MOVS	T,LWT		;$$Q SWAPPED
QUAN1:	MOVEM	T,SYL
QUAN2:	TXO	F,SF!QF		;WRD,SYL STARTED
	TXZ	F,CF!CCF
	JRST	L2

;HERE WHEN ESC TYPED

CONTRO:	TXOE	F,CF
	TXO	F,CCF
	SETOM	WAKALL		;SET WAKEUP ON EVERYTHING
	JRST	L2
QUESTN:	PUSHJ	P,TCRLF		;HERE FOR "?"
IFN FTDEC20,<
	TXNE	F,CCF		;TWO ESC?
	JRST [	PUSHJ	P,XEVAL		;YES, EVAL PREV EXPRESSION
		MOVEI	T1,.PRIOU
		HRLOI	T2,.FHSLF	;ASSUME THIS FORK, LAST ERROR
  IFN FTEXEC,<
		SKPUSR			;ONLY LEGAL IN USER MODE
		JRST	ERR		;EXEC MODE, ERROR
  > ;END IFN FTEXEC
  IFN FTFILE,<
		TXC	F,QF		;TEST FOR ILLEGAL COMBINATIONS
		TXNE	F,QF!FAF	;FOO$$? IS ONLY LEGAL FORM
		JRST	ERR		;FORK OR NO ERR CODE, NO GOOD
  > ;END IFN FTFILE
  IFE FTFILE,<
		TXNE	F,FAF		;FORK SPECIFIED?
		HRL	T2,LLIMIT	;YES
		TXNE	F,QF		;ERROR CODE SPECIFIED?
  > ;END IFE FTFILE
		HRR	T2,WRD		;YES
		SETZ	T3,
		ERSTR%
		 ERJMP	ERR		;TRAP ILLEGAL FORK NUMBER FROM USER
		 JRST	ERR
		JRST	DD1]		;DONE
> ;END IFN FTDEC20

	TXNE	F,CF		;ONE ESC?
	 JRST [	TXNE	F,QF!SAF!FAF!Q2F ;YES, ANYTHING TYPED IN FRONT?
		JRST	ABBREV		;YES, GO TYPE SOME SYMBOLS
		SKIPE	W1,MEMERS	;YES, TYPE LAST ERROR MESSAGE
		PUSHJ	P,TSTRG
		JRST	DD1]
	TXNE	F,LTF		;HAS A SYMBOL BEEN TYPED?
	 JRST	QLIST		;YES
	PUSHJ	P,USYSET	;NO, LIST UNDEFINED SYMBOLS

QUEST2:	SOSGE	R		;POINT TO NAME WORD OF PREVIOUS SYMBOL
	PUSHJ	P,ADVSYM	;DONE, SEE IF ANY MORE TABLE
	SKIPA	W2,@SYPTR	;GET THE NAME
	JRST	DD1		;ALL DONE, <CRLF> AND RESTART
	TXZ	W2,PNAME	;CLEAR FLAGS
	PUSHJ	P,PSYM		;TYPE THE SYMBOL
	PUSHJ	P,TCRLF		;END WITH A CRLF
	SOJA	R,QUEST2	;SKIP VAL WORD OF NEXT SYMBOL AND LOOP
;HERE TO LIST ALL REFERENCES TO A SYMBOL

QLIST:	PUSHJ	P,SYMSET	;SET UP TO WALK THROUGH TABLE

QLIST2:	SOSGE	R		;ANY MORE TABLE?
	PUSHJ	P,ADVSYM	;MAYBE NOT, CHECK IT OUT
	SKIPA	W1,@SYPTR	;YES, GET THE NEXT NAME
	JRST	DD1		;ALL DONE, <CRLF> AND GET NEXT COMMAND
	TXZE	W1,PNAME	;IS THIS THE NEXT MODULE NAME?
	JRST	QLIST4		;NO, GO SEE IF THE SYMBOL NAME MATCHES
	MOVE	W2,W1		;SAVE THIS MODULE NAME IN CASE WE MATCH
	SOJA	R,QLIST2	;GET NEXT NAME

QLIST4:	CAME	W1,SYM		;A MATCH?
	SOJA	R,QLIST2	;NO, PROCEED
	PUSHJ	P,PSYM		;YES, TYPE CURRENT MODULE NAME
	MOVE	W1,@SYPTR	;RETRIEVE FLAGS
	TXNN	W1,GLOBL	;A GLOBAL SYMBOL?
	JRST	QLIST6		;NO, GO TYPE CRLF
	PUSHJ	P,TSPC		;YES, TYPE " G"
	MOVEI	T,"G"		; . . .
	PUSHJ	P,TOUT		; . . .

QLIST6:	PUSHJ	P,TCRLF		;END LINE
	SOJA	R,QLIST2	;ON TO ANOTHER SYMBOL
;FOO$? COMMAND -- TYPE OUT SYMBOLS STARTING WITH FOO

ABBREV:	TXNE	F,TIF!COMF!PTF!MF!CCF ;CHECK FOR LEGAL ARGUMENTS
	JRST	ERR		;$$ AND EXPRESSION ARE ILLEGAL
	SKIPN	W1,SYM		;ANYTHING RESEMBLING A SYMBOL TYPED?
	TXNE	F,SAF!FAF!Q2F	;NO, IS IT OK ANYWAY?
	SKIPA	W2,W1		;YES, GET ANOTHER COPY
	JRST	ERR		;NO, COMPLAIN
	TXNN	F,Q2F		;DID WE GET ANY FLAGS?
	SETZM	WRD2O		;NO, MAKE SURE WE KNOW IT
	MOVX	T,1B0		;NEGATIVE INFINITY
	TXNN	F,FAF		;HAVE A LOWER LIMIT?
	MOVEM	T,LLIMIT	;NO, SET IT UP
	TXNE	F,FAF		;CHECK AGAIN
	SKIPA	T,LLIMIT	;YES, COPY IT
	MOVX	T,<^-<1B0>>	;NO, USE POSITIVE INFINITY
	TXNN	F,SAF		;IF NO UPPER LIMIT GIVEN,
	MOVEM	T,ULIMIT	;USE WHAT WE JUST SET UP
	MOVE	T,ULIMIT	;GET UPPER LIMIT
	CAMGE	T,LLIMIT	;LIMITS IN THE RIGHT ORDER?
	JRST	ERR		;NO, COMPLAIN
	MOVEI	T,75		;ONLY MASKS CURRENTLY DEFINED
	ANDCA	T,WRD2O		;SEE IF ANY UNKNOWN BITS ARE ON
	JUMPN	T,ERR		;COMPLAIN IF SO
ABBRE1:	CAMLE	W2,[RADIX50 0,%%%%%]	;PADDED ENOUGH YET?
	JRST	ABBRE2		;YES
	IMULI	W1,50		;SHIFT SYM ONE PLACE TO THE LEFT
	IMULI	W2,50		;THIS ONE TOO
	ADDI	W2,47		;AND PAD TO BE UPPER LIMIT
	JRST	ABBRE1		;SEE IF IT'S ENOUGH

;HERE WITH W1 LEFT JUSTIFIED, BLANK PADDED, AND W2 LEFT JUSTIFIED, MAX PADDED.

ABBRE2:	DMOVEM	W1,ABBSY1	;SAVE THE PADDED SYMBOLS
	PUSHJ	P,SYMSET	;SET UP TO LOOK AT SYMBOL TABLE
	MOVE	T,WRD2O		;GET FLAGS AGAIN
	TRZE	T,1		;WANT ONLY OPEN SYMBOL TABLE?
	TXNN	F,PNAMEF	;YES, IS THERE ONE OPEN?
	CAIA			;IT'S OK, PROCEED
	JRST	ERR		;NO, GIVE UP
	ANDCAM	T,WRD2O		;MAKE 0/NON-0 FLAG FOR LATER
	ROT	T,-6		;SHIFT TO MATCH PNAME
	MOVEM	T,ABBSY3	;SAVE FOR FLAG TESTING
ABBRE3:	TRNN	R,36		;EVERY FEW SYMBOLS
	JRST [	PUSHJ	P,LISTEN	;CHECK FOR TYPEIN
		 JRST	.+1		;NOTHING, KEEP GOING
		 JRST	DD1]		;USER WANTS TO ABORT
	SOSGE	R		;COUNT DOWN SYMBOLS
	PUSHJ	P,ADVSYM	;REACHED END, ANY MORE?
	SKIPA	W2,@SYPTR	;FETCH THE SYMBOL
	JRST	DD1		;NO MORE SYMBOLS, ALL DONE
	MOVE	T,W2		;KEEP A COPY WITH THE FLAGS
	TXZE	W2,PNAME	;IS IT A MODULE NAME?
	TDZA	W1,W1		;NO, REMEMBER THAT
	SETO	W1,		;YES, REMEMBER THAT
ABBRE5:	CAMG	W2,[RADIX50 0,%%%%%]	;PADDED TO SIX CHARS?
	JRST [	IMULI	W2,50		;NO, SHIFT ONE PLACE
		JRST	ABBRE5]		;AND TRY AGAIN
	JUMPE	W1,ABBRE7	;IS IT A MODULE NAME?
	MOVE	W,W2		;YES, SAVE (PADDED) NAME
	SKIPN	WRD2O		;IF ALL MODULES DESIRED,
	SOJA	R,ABBRE3	;TRY NEXT SYMBOL
	AOS	T,WRD2O		;INCREMENT COUNTER
	CAIN	T,2		;IF JUST PASSING OUR DESIRED MODULE NAME,
	SOJA	R,ABBRE3	;KEEP GOING
	JRST	DD1		;ELSE DONE
ABBRE7:	CAML	W2,ABBSY1	;IS IT IN RANGE?
	CAMLE	W2,ABBSY2
	SOJA	R,ABBRE3	;NO, TRY NEXT SYMBOL
	AND	T,ABBSY3	;YES, GET ITS FLAGS
	CAME	T,ABBSY3	;SEE IF A MATCH
	SOJA	R,ABBRE3	;NO, TRY NEXT
	XMOVEI	T,@SYPTR	;POINT TO SYMBOL ENTRY
	AOJ	T,		;WANT VALUE WORD
	MOVE	T,@T		;FETCH IT
	CAML	T,LLIMIT	;IN RANGE?
	CAMLE	T,ULIMIT	;BOTH WAYS?
	SOJA	R,ABBRE3	;NO, TRY NEXT SYMBOL
	PUSH	P,R		;YES, SAVE SYMBOL INDEX
	PUSH	P,T		;AND VALUE
	PUSHJ	P,PSYM		;YES, TYPE OUT THE (PADDED) SYMBOL
	PUSHJ	P,TTAB		;WHITE SPACE
	MOVE	W2,W		;GET MODULE NAME
	PUSHJ	P,PSYM		;TYPE THAT TOO (ALSO PADDED)
	PUSHJ	P,TSPC		;A SPACE
	MOVE	W1,@SYPTR	;GET SYMBOL FLAGS
	MOVEI	T,"G"		;INDICATE GLOBAL SYMBOL
	TXNN	W1,GLOBL	;UNLESS OF COURSE...
	MOVEI	T," "		;IT'S A LOCAL
	PUSHJ	P,TOUT		;TYPE THE INDICATOR
	PUSHJ	P,TTAB		;MORE WHITE SPACE
	MOVE	T,(P)		;RETRIEVE VALUE
	PUSHJ	P,TOC		;TYPE VALUE NUMERICALLY
	POP	P,W1		;GET VALUE BACK
	MOVN	W2,W1		;(X .AND. -X) = RIGHTMOST BIT OF X
	AND	W2,W1		;FIND THE BIT
	CAMN	W2,W1		;TYPE BIT NUMBER ONLY IF SINGLE-BIT VALUE
	 JFFO	W1,.+2		;FIND THE BIT NUMBER INTO W2
	  JRST	ABBRE9		;NOT EXACTLY ONE BIT, DON'T TYPE IT
	MOVE	W1,[ASCII /	(1B/]	;SEPARATING TEXT
	PUSHJ	P,TEXT		;TYPE IT OUT
	MOVE	A,W2		;GET THE NUMBER (NOTE: A=R)
	PUSHJ	P,FP7		;TYPE IT IN DECIMAL
	MOVEI	T,")"		;CLOSING TEXT
	PUSHJ	P,TOUT		;TYPE IT
ABBRE9:	POP	P,R		;RESTORE SYM INDEX
	PUSHJ	P,TCRLF		;CLOSE OUT THE LINE
	SOJA	R,ABBRE3	;AND GO FOR NEXT SYMBOL
;$K COMMAND -- SUPPRESS A SYMBOL TO DDT TYPEOUT OR DELETE IT ENTIRELY

KILL:	TXNN	F,LTF		;DELETE SYMBOLS
	JRST	ERR
	MOVE	S,SYM		;GET SYMBOL
  IFN FTSCSH,<			;ONLY IF USING SYMBOL TABLE CACHE
	PUSHJ	P,DELCSH	;REMOVE SYMBOL FROM SYMBOL TABLE CACHE
  > ;END IFN FTSCSH
	PUSHJ	P,EVAL
	JRST	KILL2
	MOVE	R,W1		;SYMBOL INDEX INTO R
	MOVE	T,W2		;FLAGS INTO T
	TXO	T,DELO		;ASSUME DELETE OUTPUT
	TXNE	F,CCF		;$$K?
	MOVX	T,DELO!DELI!37777B17 ;MAKE SYM DELETED IN AND OUT
	PJRST	DSYMER		;DEPOSIT IF POSSIBLE


KILL2:	SKIPN	ESTUT		;ANY UNDEFINED TABLE?
	JRST	UNDEF		;NO, CAN'T FIND THE SYMBOL

KILL4:	PUSHJ	P,EVALU		;SEE IF ANY MORE OCCURENCES OF SYM
	  POPJ	P,		;NO, DONE
	PUSHJ	P,REMUN
	 JRST	ERR		;CAN'T MODIFY SYMTAB
	JRST	KILL4		;LOOK FOR MORE OCCURENCES


;$D ;DELETE LAST SYM & PRINT NEW

SYMD:	SKIPL	R,SPSAV		;PICK UP POINTER TO LAST SYM
	PUSHJ	P,FETSYM	;PICK UP SYMBOL
	  JRST	ERR		;CAN'T GET IT?
	MOVE	S,T		;COPY SYMBOL
  IFN FTSCSH,<			;ONLY IF USING SYMBOL TABLE CACHE
	PUSHJ	P,DELCSH	;REMOVE IT FROM THE SYMBOL TABLE CACHE
  > ;END IFN FTSCSH
	TXO	T,DELO		;TURN ON "SUPPRESS OUTPUT" BIT
	PUSHJ	P,DSYMER	;STORE BACK IN SYMBOL TABLE
	MOVE	T,LWT
	JRST	CONSYM		;PRINT OUT NEXT BEST SYMBOL
;COLON OR ALT COLON OR ALT ALT COLON COMMANDS

TAG:	TXNE	F,CCF		;SYMBOL OR PDV?
	JRST	PDVSET		;PDV NAME
	TXNE	F,CF		;DEFINE SYMBOL OR OPEN SYMBOL TABLE?
	JRST	NAMSET		;OPEN (SELECT) LOCAL SYMBOL TABLE
	TXNN	F,LTF		; NO LETTERS IS ERROR
	JRST	ERR		; GO SAY ERROR
	TXNE	F,FAF		; DEFINE SYMBOLS
	JRST	DEFIN		;A.LT.B:
	MOVE	W,LLOCO		;DEFINE SYMBOL (TAG) TO BE "."
	MOVEM	W,LLIMIT	;SAVE NEW TAG VALUE

DEFIN:	MOVE	S,LLIMIT	;GET VALUE BEING DEFINED
  IFN FTSCSH,<			;ONLY IF USING SYMBOL TABLE CACHE
	PUSHJ	P,DELCSV	;REMOVE ANY CACHE SYMBOL USING THIS VALUE
  > ;END IFN FTSCSH
	PUSHJ	P,EVAL		;DEFINED SYMBOL?
	 JRST	DEF1		;NO - DEFINE
	MOVE	S,SYM		;YES - GET SYMBOL NAME BEING DEFINED
  IFN FTSCSH,<			;ONLY IF USING SYMBOL TABLE CACHE
	PUSHJ	P,DELCSH	;REMOVE THE SYMBOL FROM THE CACHE
  > ;END IFN FTSCSH
	MOVE	R,W1		;REMEMBER SYMBOL INDEX IN R
	JRST	DEF4		;REDEFINE EXISTING SYMBOL

DEF1:	TXZ	F,HSYMF		;ASSUME LOWSEG SYMBOL TABLE
	SKIPN	SYMP+S$ADR	;DEFINE A NEW SYMBOL
	JRST [	SKIPN	HSYMP+S$ADR	;NO ST, TRY HISEG PTR
		JRST	ERR		;NONE THERE EITHER
		MOVEI	W1,HSYMP	;WANT TO UPDATE HISEG POINTER
		PUSHJ	P,INCSYP	;GO TRY
		 JRST	DMER1		;COULDN'T, GO SAY WHY
		TXO	F,HSYMF		;REMEMBER HISEG TABLE USED
		SKIPL	PRGM		;AN OPEN MODULE IN THE HIGH SEG?
		JRST	DEF2		;NO, CONTINUE
		JRST	DEFF]		;YES, COMPENSATE FOR SUB FIRST
	MOVEI	W1,SYMP		;WANT TO UPDATE LO SEG POINTER
	PUSHJ	P,INCSYP	;GO DO IT
	 JRST	DMER1		;CAN'T, GO SAY WHY
	SKIPG	PRGM		;AN OPEN MODULE IN THE LOWSEG TABLE?
	JRST	DEF2		;NO, CONTINUE
DEFF:	AOS	PRGM		;YES, COMPENSATE FOR THE SUB
	AOS	PRGM		; . . .
DEF2:	AOS	PTFIX		;COMPENSATE FOR THE SUB HERE TOO
	AOS	PTFIX		;SO PAT.. WILL BE MOVED
  IFN FTSCSH,<			;ONLY IF USING SYMBOL TABLE CACHE
	PUSHJ	P,CLRCSH	;CLEAR CACHE, ALL INDEXES NOW WRONG
  > ;END IFN FTSCSH
	SOS	ESTUT		;EAT TWO WORDS OF PATCH SPACE
	SOS	ESTUT		;  FOR NEW SYMBOL TO LIVE IN
	SKIPN	R,ESTUTL	;DOES AN UNDEFINED TABLE EXIST?
	JRST	DEF3		;NO, JUST DEC ADDRESS OF WHERE IT WOULD EXIST

;FALL THROUGH TO NEXT PAGE
;HERE WHEN WE WANT TO INSERT A NEW SYMBOL, BUT THE UNDEFINED SYMBOL
;TABLE IS IN THE WAY.  MOVE THE LAST SYMBOL OF THE UNDEFINED TABLE TO
;RIGHT BEFORE THE FIRST ONE, AND USE THE WORDS FREED TO INSERT THE NEW
;DEFINED SYMBOL.  THIS IS OK BECAUSE THE UNDEFINED TABLE IS NOT ORDERED.

	TXO	R,1B1		;FORM AN UNDEFINED ST SYMBOL INDEX
	PUSHJ	P,FETSYM	;GET 1ST WORD OF LAST SYMBOL
	  JRST	ERR		;ERROR?
	MOVE	W1,R		;SAVE WHERE WE GOT IT
	MOVX	R,1B1		;POINT TO 1ST WORD (USED TO BE IN PATCH AREA)
	PUSHJ	P,DSYMER	;STORE SYMBOL IN NEW HOME
	AOS	R,W1		;POINT TO 2ND WORD OF LAST SYMBOL
	PUSHJ	P,FETSYM	;GET IT
	  JRST	ERR		;ERROR
	MOVX	R,1B1+1		;2ND WORD OF TABLE
	PUSHJ	P,DSYMER	;DEPOSIT


;NOW TO STORE THE SYMBOL TO BE DEFINED.  ENTER AT DEF3 TO APPEND TO THE
;SYMBOL TABLE AS A GLOBAL DEFINITION IN MODULE PAT.., AND AT DEF4 TO
;UPDATE AN EXISTING SYMBOL.

DEF3:	MOVEI	W1,USYMP	;IT ALL WORKED, MAKE OUR WORKING COPY
	PUSHJ	P,DECSYA	; OFFICIAL BY DECREMENTING UNDEF PTR
	 JRST	DMER1		;BUT... BUT...
	PUSH	P,SYM		;IF APPENDING, NEED TO UPDATE THE MODULE
	MOVX	R,<RADIX50 0,PAT..> ;  LENGTH FOR THE MODULE "PAT.."
	MOVEM	R,SYM		;SAVE WHERE NAMSRH CAN FIND IT
	PUSHJ	P,NAMSRH	;LOOK UP PAT.. IN THE TABLE
	  JRST	DEF3A		;NOT THERE, GIVE UP
	PUSHJ	P,FETSYM	;GET ITS VALUE WORD
	  JRST	DEF3A		;NOT ACCESSIBLE?
	JUMPGE	T,DEF3A		;DON'T IF COUNT IS 0 (OLD LINK BUG)
	SUB	T,[2,,0]	;COUNT ANOTHER SYMBOL
	PUSHJ	P,DEPSYM	;STORE NEW VALUE
	  JFCL			;??
DEF3A:	POP	P,SYM		;RESTORE SYM FOR DEF4
	TXNN	F,HSYMF		;CHANGING HISEG TABLE?
	TDZA	R,R		;NO, POINT TO 0'TH WORD OF LOWSEG TABLE
	MOVX	R,1B0		;YES, POINT TO 0'TH WORD OF HISEG TABLE
DEF4:	MOVX	T,GLOBL
	IOR	T,SYM
	PUSHJ	P,DSYMER
	MOVE	T,LLIMIT
	ADDI	R,1
	PUSHJ	P,DSYMER

;FALL THROUGH TO NEXT PAGE
;NOW TO SEARCH THE UNDEFINED TABLE, LOOKING FOR REFERENCES TO THIS SYMBOL.
;IF WE FIND ANY, FIX UP THE LOCATION(S) THEY POINT TO, AND REMOVE THEM
;FROM THE UNDEFINED TABLE.

DEF5:	PUSHJ	P,EVALU		;SEARCH UNDEFINED TABLE
	  POPJ	P,		;NOT FOUND, ALL DONE
	SKIPL	R,T		;ADDITIVE OR CHAINED FIXUP?
	JRST	DEF7		;CHAINED, GO HANDLE
	MOVE	W2,R		;GET A COPY OF THE FIXUP FLAGS
	ANDX	R,VMADR		;REDUCE R TO 30-BIT ADDRESS
	PUSHJ	P,FETCHV	;GET OBJECT CELL
	 JRST	ERR
	TXNN	W2,STNEG	;ADDITIVE OR SUBTRACTIVE?
	SKIPA	S,LLIMIT	;ADDITIVE
	MOVN	S,LLIMIT	;SUBTRACTIVE
	TXNE	W2,STLH		;RIGHT OR LEFT HALF?
	JRST [	HRLZS	S	;LEFT HALF
		ADD	T,S	;ADD INTO LEFT HALF
		JRST	DEF6]
	ADD	S,T		;RIGHT HALF, ADD HALVES
	HRR	T,S		;  AND REPLACE RIGHT HALF
DEF6:				;DO FIXUPS RIGHT IN TOPS-10 MONITOR
  IFN FTFILE&FTDEC10,<		;PEEK BEFORE POKE
	SKIPE	FILING		;POKING MONITOR?
	 JRST	DEF60		;NO, SKIP AHEAD
	PUSH	P,T		;SAVE NEW WORD TO POKE
	PUSHJ	P,FETCHV	;YES, GET CURRENT WORD IN MONITOR
	 JRST	ERR		;PEEK FAILED
	MOVEM	T,POKBLK+1	;PUT INTO POKE. BLOCK
	POP	P,T		;RESTORE T
DEF60:
  > ;END IFN FTFILE&FTDEC10
	PUSHJ	P,STOREV	;STORE RESULT BACK INTO MEMORY
	 JRST	ERR		;FAILED
	JRST	DEF8		;GO REMOVE SYMBOL AND TRY AGAIN

DEF7:	MOVE	S,R		;COPY INITIAL FIXUP ADDRESS
DEF7A:	JUMPE	S,DEF8		;IF CHAIN REACHES 0, WE'RE DONE
	PUSHJ	P,FETCHV	;GET OBJECT CELL
	 JRST	ERR
	HRRZ	S,T		;SAVE CHAIN POINTER
	HRR	T,LLIMIT	;REPLACE WITH NEW VALUE
	PUSHJ	P,STOREV	;AND STORE BACK INTO MEMORY
	 JRST	ERR		;FAILED
	HRR	R,S		;LOOP IN-SECTION TO END
	JRST	DEF7A		;  OF CHAIN

DEF8:	PUSHJ	P,REMUN
	 JRST	ERR		;CAN'T MODIFY SYMTAB
	JRST	DEF5
;HERE ON A NAME$: COMMAND -- OPEN A MODULE'S SYMBOL TABLE

NAMSET:	TXNE	F,Q2F		;2ND QUANTITY TYPED?
	SKIPA	TT,WRD2D	;YES, FETCH IT
	SETZ	TT,		;NO, DEFINITELY OURS
	JUMPN	TT,NAMTYP	;IF NOT $0:, GO SEE IF $1:
	TXNE	F,FAF!SAF!TIF!COMF!PTF!MF ;MOST ARGS BEFORE $0: ARE ILLEGAL
	JRST	ERR		;RESERVE THEM
	TXNE	F,QF		;ANYTHING TYPED?
	JRST	NAMS2		;YES, SET NEW MODULE
	SETZM	PRGM		;NO, JUST CLEAR CURRENT MODULE
	SETZM	SEGNAM		;AND HISEG IT CAME FROM
IFN FTSCSH,<
	JRST	CLRCSH>	;CLEAR SYMBOL TABLE CACHE
IFE FTSCSH,<
	POPJ	P,>

;HERE TO SET A NEW MODULE NAME.

NAMS2:	PUSHJ	P,NAMSRH	;SEARCH FOR THE NAME
	  JRST	UNDEF		;NOT FOUND
  IFN FTSCSH,<			;ONLY IF USING SYMBOL TABLE CACHE
	PUSHJ	P,CLRCSH	;FOUND IT, CLEAR THE SYMBOL TABLE CACHE
  > ;END OF IFN FTSCSH
	MOVEM	R,PRGM		;STORE AS NEW OPEN MODULE
	JUMPGE	R,CPOPJ		;DONE IF R POINTS TO LOW SEG
	MOVEI	R,.JBHNM	;POINTS TO HI SEG, POINT TO SEGMENT NAME
	PUSHJ	P,HFETCH	;GET IT
	 SETZ	T,		;NO HI SEG, OR EXEC MODE
	MOVEM	T,SEGNAM	;STORE SEGMENT NAME FOR SYMCHK
	POPJ	P,		;DONE

;HERE TO TYPE OUT CURRENT OPEN MODULE NAME

NAMTYP:	SOJN	TT,NAMLST	;IF NOT $1:, SEE IF $2:
	TXNE	F,QF!FAF!SAF!SF	;MOST ARGS ILLEGAL FOR $1:
	JRST	ERR		;RESERVE THEM
	SKIPN	T,PRGM		;IS THERE AN OPEN MODULE?
	POPJ	P,		;NO, JUST RETURN
	SOS	R,T		;POINT TO FIRST WORD OF SYMBOL ENTRY
	PUSHJ	P,FETSYM	;GET THE WORD
	 JRST	ERR		;CAN'T HAPPEN
	PUSH	P,T		;SAVE OVER TOUT CALL
	MOVEI	T,"/"		;SEPARATE TEXT FROM COMMAND
	PUSHJ	P,TOUT		; WITH A SLASH
	POP	P,W2		;GET SYMBOL BACK
	PUSHJ	P,PSYM		;TYPE IT OUT
	SKIPG	PRGM		;HISEG MODULE?
	SKIPN	T,SEGNAM	;WITH A NAME?
	POPJ	P,		;NO OR NO, ALL DONE
	MOVEM	T,LWT		;YES, SAVE IT AWAY
	PUSHJ	P,TTAB		;SEPARATE THE NAMES
	PJRST	SIXBP		;AND GO TYPE THE HISEG NAME

;HERE FOR $2: TO LIST ALL KNOWN MODULES

NAMLST:	SOJN	TT,ERR		;$2: WAS YOUR LAST CHANCE
	TXNE	F,QF!FAF!SAF!SF	;MOST ARGS ILLEGAL FOR $2:
	JRST	ERR		;RESERVE THEM
	PUSHJ	P,SYMCHK	;MAKE SURE OF SYMBOLS BEFORE HFETCH
	MOVEI	R,.JBHNM	;OFFSET FOR HISEG NAME
	PUSHJ	P,HFETCH	;GET THE NAME
	  SETZ	T,		;NONE THERE
	MOVE	W,T		;SAVE THE HISEG NAME FOR LATER USE
	PUSHJ	P,SYMSET	;SETUP TO SEARCH THE SYMBOL TABLE
	SOJ	R,		;ACCOUNT FOR AOSGE BELOW
	PUSHJ	P,TCRLF		;START AT LEFT MARGIN

;HERE TO GET NEXT MODULE

NAMLS2:	AOSGE	R		;IF OUT OF SYMBOLS IN THIS TABLE,
	PUSHJ	P,ADVSYM	;THEN ADVANCE THE POINTER
	SKIPA	T,@SYPTR	;GET NEXT VALUE WORD
	JRST	DD1		;DONE WITH LISTING
	HLRE	T,T		;GET -VE LENGTH OF THIS TABLE
	SOSGE	R		;BACK OFF TO MODULE NAME WORD
	PUSHJ	P,ADVSYM	;ADVANCING IF NECESSARY
	SKIPA	W2,@SYPTR	;GET THE NAME
	JRST	ERR		;VALUE BUT NO NAME IS BAD FORMAT
	TXNE	W2,PNAME	;MUST LOOK LIKE A MODULE NAME
	JRST	ERR		;ELSE IS BAD FORMAT
	ADD	R,T		;BACKUP POINTER TO NEXT MODULE
	SKIPN	T		;ZERO IS PAT.. BEFORE LINK BUG WAS FIXED,
	MOVNI	R,2		;SO SET TO ADVANCE TABLES
	PUSHJ	P,PSYM		;TYPE THE MODULE NAME
	TXNE	F,HSYMF		;IF NOT HISEG,
	SKIPN	W		;OR NAME NOT KNOWN,
	JRST	NAMLS3		;SKIP TYPING THE SEGMENT NAME
	MOVE	W1,TOHPS	;GET CURRENT HPOS
	SUBI	W1,7		;GET -VE DISTANCE UNTIL WE'VE PADDED ENOUGH
	MOVEI	T," "		;LOAD UP A SPACE
	PUSHJ	P,TOUT		;TYPE ONE
	AOJL	W1,.-1		;PAD UNTIL DONE
	MOVE	W1,W		;GET THE SEGMENT NAME
	PUSHJ	P,TSIXN		;TYPE IT IN SIXBIT
NAMLS3:	PUSHJ	P,TCRLF		;END THE LINE
	JRST	NAMLS2		;TYPE ALL KNOWN MODULES

;HERE ON $$: COMMAND -- READ PDV NAME AND SET $5M

  IFN FTEX20!FTMON!<FTDEC10&FTFILE>,<PDVSET==ERR>  ;ILLEGAL IN MONITORS, -10

  IFE FTEX20!FTMON!<FTDEC10&FTFILE>,<

PDVSET:
  IFN FTFILE,<
	SKIPE	FILING		;MUST BE LOOKING AT A FILE
	SKIPN	EXEFMT		;IN .EXE FORMAT
	JRST	ERR		;OR WE CAN'T DO IT
  > ;END IFN FTFILE
  IFN FTEXEC,<
	SKPUSR			;MUST BE IN USER MODE
	JRST	ERR		;OR WE CAN'T DO IT
  > ;END IFN FTEXEC
	TXNE	F,Q2F		;$$1: ?
	SKIPA	T,WRD2D		;MAYBE, GET THE FLAG
	SETZ	T,		;NO, IT'S OURS
	JUMPN	T,PDVTYP	;IF NOT $$0:, GO SEE IF $$1:
	TXNE	F,FAF!SAF!TIF!COMF!PTF!MF ;MOST ARGS BEFORE $$0: ARE ILLEGAL
	JRST	ERR		;BAD SYNTAX
IFN FTDEC20,<
	TXZ	F,CF!TXF	;CLEAR SOME FLAGS FOR TEXI
	XMOVEI	T,1(P)		;STORE PDV NAME ON STACK
	MOVEM	T,TEM		;REMEMBER WHERE
	MOVEM	T,WRD		;KEEP AN ORIGINAL COPY
	ADJSP	P,PVNMSZ	;MAKE ROOM FOR NAME
	ADDI	T,PVNMSZ-1	;GET LAST ADDRESS OF BLOCK
	MOVEM	T,TEM1		;SAVE THAT TOO
	MOVEI	T,7		;NORMAL ASCII BYTE SIZE
> ;END IFN FTDEC20
IFN FTDEC10,<
	TXZ	F,ROF!TXF	;CLEAR SOME FLAGS FOR TEXI
	MOVEI	T,6		;BYTE SIZE FOR SIXBIT TYPEIN
> ;END IFN FTDEC10
	MOVEM	T,WRD2D		; FOR BUILDING BYTE POINTERS
	TXNN	F,QF		;IF NO ARG,
	JRST	TEXI1		;GO READ THE STRING
	SETZ	T,		;GET A NULL
	IDPB	T,CHP		;FINISH THE SYMBOL TYPEIN
IFN FTDEC20,<
	DMOVE	TT,OPTXT	;GET THE TEXT
	DMOVEM	TT,@WRD		;PUT IT WHERE WE LOOK FOR IT
	MOVE	R,TEM1		;POINT PAST THE COPIED OPTXT
	;FALL INTO PDVSE2
> ;END IFN FTDEC20
IFN FTDEC10,<
	MOVE	TT,[POINT 7,OPTXT] ;SOURCE BYTE POINTER
	MOVE	W2,[POINT 6,W]	;DESTINATION BYTE POINTER
	SETZ	W,		;CLEAR ACCUMULATOR
PDVSE1:	ILDB	T,TT		;GET SOURCE BYTE
	JUMPE	T,PDVSE2	;DONE AT END OF STRING
	SUBI	T," "		;CONVERT TO SIXBIT
	IDPB	T,W2		;APPEND TO SEGMENT NAME
	JRST	PDVSE1		;LOOP OVER THE PROPOSED NAME
> ;END IFN FTDEC10

;HERE AFTER THE STRING HAS BEEN READ IN

PDVSE2:
IFN FTDEC20,<
	CAMG	R,TEM1		;PAST END OF BLOCK?
	MOVEM	W,(R)		;NO, STORE END OF STRING
	MOVEI	R,377		;RIGHT-MOST BYTE
	ANDCAM	R,@TEM1		;MAKE SURE WE'RE ASCIZ

  IFE FTFILE,<			;FIRST THE NON-FILDDT CASE
	PUSHJ	P,PDVINI	;SET UP PDVOP% ARG BLOCK
	MOVEI	T1,.POLOC	;LOCATE FUNCTION
	XMOVEI	T2,PDVARG	;ADDRESS OF ARG BLOCK
	HRRO	T3,WRD		;MAKE A BYTE POINTER TO PDV NAME
	PDVOP%			;FIND THE PDV
	 ERJMP	ERR		;SOMETHING DIED, GUESS IT'S NOT THERE
	SKIPN	PDVARG+.POCT2	;ANYTHING FOUND?
	JRST	ERR		;NO, DON'T DIDDLE ANYTHING
	ADJSP	P,-PVNMSZ	;RECLAIM STACK SPACE
	MOVE	T1,PDVA		;GET THE PDVA
	MOVEM	T1,SYTLOC	;SET $5M
	SETZM	SYMVAL		;DON'T TRUST IT
	PJRST	SYMCHK		;GO CHECK IT OUT NOW
  > ;END IFE FTFILE
;STILL IFE FTEX20!FTMON!<FTDEC10&FTFILE> AND IFN FTDEC20

;FILDDT CASE AFTER THE STRING HAS BEEN READ IN

;FALL IN FROM PDVSE2

  IFN FTFILE,<
	SKIPG	W1,PDVNUM	;ANY PDVS EXIST?
	JRST	ERR		;NO, DON'T BOTHER LOOKING
	SETO	W2,		;START WITH FIRST ONE
PDVSE3:	PUSHJ	P,NXTPDV	;GET THE PDVA
	ADDI	R,.PVNAM	;GET NAME ENTRY
	PUSHJ	P,FETCH		;GRAB THE WORD
	 JRST	ERR		;NAUGHTY!
	TXNE	T,IFIW		;IS NAME POINTER LOCAL?
	HLL	T,R		;YES, SET REAL SECTION NUMBER
	MOVE	R,T		;MOVE INTO RIGHT AC
	SKIPN	@WRD		;USER TYPE NULL STRING?
	JRST [	JUMPE	R,PDVSE5	;YES, ZERO ADDRESS IS A MATCH
		PUSHJ	P,FETCH		;FETCH FIRST STRING WORD
		 JRST	ERR		;BAD POINTER
		TLNN	T,774000	;IS FIRST BYTE ZERO?
		JRST	PDVSE5		;YES, STRING IS NULL
		JRST	PDVSE4]		;NO, TRY TRY AGAIN
	JUMPE	R,PDVSE4	;ZERO ADDRESS WILL NEVER MATCH
	MOVE	T,WRD		;USER'S STRING ADDRESS
	PUSHJ	P,CMPSTR	;COMPARE NAMES
PDVSE4:	 SOJG	W1,PDVSE3	;NO MATCH, TRY AGAIN
	JUMPE	W1,ERR		;DIDN'T FIND ANY MATCHES
PDVSE5:	MOVE	T,@PDVTBL	;MATCHED, GET THE PDVA
	MOVEM	T,SYTLOC	;SET $5M
	ADJSP	P,-PVNMSZ	;RECLAIM STACK SPACE
	JRST	MASK5C		;GO TRADE SYMBOL TABLES
;STILL IFE FTEX20!FTMON!<FTDEC10&FTFILE> AND IFN FTDEC20 AND IFN FTFILE

;CMPSTR -- COMPARE TWO ASCIZ STRINGS
;CALL:
;	MOVX	T,<GLOBAL ADDRESS OF INTERNAL STRING>
;	MOVX	R,<GLOBAL ADDRESS OF PROG'S STRING>
;	PUSHJ	P,CMPSTR
;RETURNS +1: STRINGS NOT IDENTICAL
;	+2: STRINGS IDENTICAL
;USES ONLY TT,TT1,TT2

CMPSTR:	PUSHJ	P,SAVRST	;AS ADVERTISED
	PUSH	P,W1		;SAVE SOME MORE ACS
	PUSH	P,W2
	TLO	T,610000	;MAKE GLOBAL "POINT 7,"
	MOVE	W1,T		;SAVE IN ANOTHER AC
CMPST1:	MOVE	W2,[POINT 7,T]	;MAKE A POINTER FOR PROG
	PUSHJ	P,FETCH		;GET A WORD OF PROG'S STRING
	 JRST	ERR		;SIGH....
	MOVEI	TT,5		;FIVE BYTES TO A WORD
CMPST2:	ILDB	TT1,W1		;GET SOME BYTES
	ILDB	TT2,W2		; TO LOOK AT
	CAIL	TT1,"a"		;SEARCH MUST BE
	CAILE	TT1,"z"		; CASE INSENSITIVE
	CAIA			;DON'T CONVERT
	TRC	TT1,40		;CONVERT
	CAIL	TT2,"a"		;SEARCH MUST BE
	CAILE	TT2,"z"		; CASE INSENSITIVE
	CAIA			;DON'T CONVERT
	TRC	TT2,40		;CONVERT
	CAME	TT2,TT1		;SAME?
	JRST	CMPST4		;NO, ALL DONE
	JUMPE	TT1,CMPST3	;LOOP UNLESS WE GOT A NULL
	SOJG	TT,CMPST2	;LOOP THROUGH THIS WORD
	AOJA	R,CMPST1	;TRY NEXT WORD
CMPST3:	AOS	-2(P)		;SUCCESS!!
CMPST4:	POP	P,W2		;RESTORE THE ACS
	POP	P,W1
	POPJ	P,		;ALL DONE

  > ;END IFN FTFILE
;STILL IFE FTEX20!FTMON!<FTDEC10&FTFILE> AND IFN FTDEC20

;HERE TO TYPE OUT CURRENT PDV NAME

PDVTYP:	SOJN	T,PDVLST	;IF NOT $$1:, SEE IF $$2:
	TXNE	F,QF!FAF!SAF!SF!LTF ;NO ARGS DEFINED
	JRST	ERR		;RESERVE THEM
	SKIPG	R,SYTLOC	;PDV OR JOBDAT?
	POPJ	P,		;JOBDAT, DON'T TYPE ANYTHING
	ADDI	R,.PVNAM	;POINT TO NAME WORD
	PUSHJ	P,FETCH		;GET THE POINTER
	 JRST	ERR		;CAN'T DO IT
	JUMPE	T,CPOPJ		;AIN'T ONE
	TXNE	T,IFIW		;LOCAL POINTER?
	HLL	T,R		;YES, GET REAL ADDRESS
	PUSH	P,LLOCO		;TYPZ WILL BOMB THIS
	MOVEM	T,LLOCO		;WHERE TYPZ EXPECTS ADDR
	PUSHJ	P,TYPZ		;TYPE USER STRING
	POP	P,LLOCO		;RESTORE ADDRESS
	POPJ	P,		;ALL DONE

PDVLST:	SOJN	T,ERR		;$$2: WAS YOUR LAST CHANCE
	TXNE	F,QF!FAF!SAF!SF!LTF ;NO ARGS DEFINED
	JRST	ERR		;RESERVE THEM
	PUSHJ	P,TCRLF		;START OFF AT LEFT MARGIN
  IFN FTFILE,<			;FILDDT CASE
	SKIPG	W1,PDVNUM	;IF NO PDVS,
	JRST	DD1		;END COMMAND NOW
	SETO	W2,		;SETUP TO GET THE FIRST ONE
  > ;END IFN FTFILE
  IFE FTFILE,<			;NON-FILDDT SETUP
	PUSHJ	P,PDVINI	;SETUP THE ARG BLOCK
	SETZM	PDVA		;START FROM THE BEGINNING
	PUSHJ	P,NXTPDV	;GET THE FIRST PDVA
	HLRZ	W1,PDVARG+.POCT2 ;SEE HOW MANY PDVS EXIST
	JUMPE	W1,DD1		;GET OUT NOW IF NONE
	TRNA			;KEEP THIS ADDRESS FIRST TIME THROUGH
  > ;END IFE FTFILE
PDVLS1:	PUSHJ	P,NXTPDV	;GET NEXT ADDRESS
	ADDI	R,.PVNAM	;OFFSET TO THE NAME POINTER
	PUSHJ	P,FETCH		;GET NAME POINTER
	  SETZ	T,		;SIGH
	TXNE	T,IFIW		;IF SECTION-LOCAL,
	HLL	T,R		;MAKE IT GLOBAL
	SKIPN	R,T		;PUT IN RIGHT REGISTER
	JRST	PDVLS3		;ZERO NAME ADDRESS MEANS DON'T TYPE IT
	PUSHJ	P,FETCH		;GET FIRST WORD FROM NAME
	  SETZ	T,		;SIGH
	TLNN	T,(177B6)	;SEE IF NON-NULL
	JRST	PDVLS3		;SKIP NAME IF NULL
	PUSH	P,W1		;NO, SAVE SOME NEEDED REGISTERS
	PUSH	P,W2		;AROUND TYPZ0
	PUSH	P,LLOCO		;AND THE OPEN LOCATION
	MOVEM	R,LLOCO		;FAKE IT OUT
	PUSHJ	P,TYPZ0		;TYPE ASCIZ NAME WITHOUT LEADING SLASH
	POP	P,LLOCO		;RESTORE OPEN CELL ADDRESS
	POP	P,W2		;AND PDVTBL INDEX
	POP	P,W1		;AND REMAINING COUNT OF PDVS
	PUSHJ	P,TCRLF		;END THE LINE
PDVLS3:	SOJG	W1,PDVLS1	;LOOP OVER ALL KNOWN PDVS
	JRST	DD1		;TYPE EXTRA CRLF AND END WHEN DONE WITH LIST

> ;END IFN FTDEC20
;STILL IN FTEX20!FTMON!<FTDEC10&FTFILE>

;HERE FOR TOPS-10 CASES

  IFN FTDEC10,<
;REST OF PDVSET FOR TOPS-10

PDVSE2:	JUMPE	W,[SETZM SYTLOC	;0$5M
		   SETZM SYMVAL	;MAKE SURE WE CHECK
		   PJRST SYMCHK] ;GO VALIDATE IT
	MOVEM	W,SEGOPB+.SGSNM	;SET UP THE SEGMENT NAME
	SETZM	SEGOPB+.SGSGN	;DON'T KNOW THE NUMBER
	SETZM	SEGOPB+.SGFLG	;CLEAR THE STEP FLAG
	MOVSI	W,.SGORG+1	;GET THE DESIRED LENGTH
	HLLM	W,SEGOPB	;SET FOR THE UUO
	XMOVEI	W,SEGOPB	;POINT TO THE ARG BLOCK
	SEGOP.	W,		;FIND THE SEGMENT
	  JRST	PDVSE3		;CAN'T DO IT THIS WAY, SEE IF OLD WAY WORKS
	HRRZ	R,SEGOPB+.SGORG	;GET LOCAL PAGE ORIGIN
	LSH	R,PG2WRD	;CONVERT TO ADDRESS
	JRST	PDVSE4		;HAVE THE HISEG ORIGIN, GO VALIDATE IT
PDVSE3:	MOVE	W1,SYTLOC	;SAVE THE CURRENT POINTER
	SETZM	SYTLOC		;MAKE GETHSO LOOK HARD
	PUSHJ	P,GETHSO	;SEE IF WE HAVE A HISEG ORIGIN
	MOVEM	W1,SYTLOC	;RESTORE CURRENT $5M
	JUMPE	T,ERR		;NO HISEG
	MOVE	R,T		;COPY THE POINTER
	ADDI	R,.JBHNM	;POINT AT THE SEGMENT NAME
	PUSHJ	P,FETCHV	;AND GRAB IT
	  JRST	ERR		;NO GO
	CAME	T,W		;IF NOT THE RIGHT SEGMENT,
	JRST	ERR		;CAN'T USE IT
	TRZ	R,PAGMSK	;BACK OFF TO THE ORIGIN AGAIN
				;FALL INTO PDVSE4
PDVSE4:	ADDI	R,.JBHSM	;POINT TO ITS SYMBOL TABLE POINTER
	PUSHJ	P,FETCHV	;GET ITS SYMBOL LIST
	  JRST	ERR		;NO GO
	JUMPE	T,[SMERS <No symbols> ;SAY WHAT'S WRONG
		   JRST  ERR]	;AND PUNT
	SKIPG	T		;IF GLOBAL POINTER, JUST USE IT
	MOVE	T,R		;NO, USE ADDRESS OF IOWBLK POINTER
	MOVEM	T,SYTLOC	;SET AS $5M ARGUMENT
	SETZM	SYMVAL		;DON'T TRUST IT YET
	PJRST	SYMCHK		;GO VALIDATE IT

PDVTYP:	SOJN	T,PDVLST	;IF NOT $$1:, SEE IF $$2:
	TXNE	F,QF!FAF!SAF!SF!LTF ;NO ARGS DEFINED
	JRST	ERR		;RESERVE THEM
	SKIPG	R,SYTLOC	;GET ADDRESS OF SYMBOL TABLE
	POPJ	P,		;BE SILENT IF JOBDAT FORMAT
	PUSHJ	P,CHKADR	;SEE IF WE KNOW ITS BITS
	TXNE	TT,PG$HGH	;MUST BE PART OF A HISEG
	TXNE	TT,PG$SPY	;AND NOT A SPY-SEG
	POPJ	P,		;WRONG, TYPE NOTHING
	PUSHJ	P,GETHSO	;GET THE START OF ITS SEGMENT
	JUMPE	T,CPOPJ		;SHOULD NEVER HAPPEN....
	MOVE	R,T		;COPY THE ADDRESS
	ADDI	R,.JBHNM	;POINT TO ITS NAME WORD
	PUSHJ	P,FETCHV	;GET ITS NAME
	  JRST	ERR		;THIS IS BAD NEWS
	MOVE	W1,T		;COPY THE NAME TO SOMEWHERE SAFE
	MOVEI	T,"/"		;INTRODUCER CHARACTER
	PUSHJ	P,TOUT		;TYPE IT
	PJRST	TSIXN		;TYPE THE SIXBIT SEGMENT NAME AND RETURN

PDVLST:	SOJN	T,ERR		;$$2: WAS YOUR LAST CHANCE
	TXNE	F,QF!FAF!SAF!SF!LTF ;NO ARGS DEFINED
	JRST	ERR		;RESERVE THEM
	PUSHJ	P,TCRLF		;START AT LEFT MARGIN
  IFE FTFILE,<
	SETZM	SEGOPB+.SGSGN	;START WITH FIRST SEGMENT
	SETZM	SEGOPB+.SGSNM	;NAME NOT KNOWN YET
	MOVSI	R,.SGSNM+1	;THE DESIRED LENGTH
	HLLM	R,SEGOPB	;SET UP FOR UUO
	MOVX	R,SG.STP	;THE STEP FLAG
	MOVEM	R,SEGOPB+.SGFLG	;SET TO FIND ALL HISEGS
PDVLS1:	XMOVEI	R,SEGOPB	;POINT AT UUO BLOCK
	SEGOP.	R,		;GET THE NEXT HISEG
	  JRST	PDVLS3		;OLD MONITOR?
	SKIPN	SEGOPB+.SGSGN	;IF NO NEXT SEGMENT NUMBER,
	JRST	DD1		;WE'RE DONE
	SKIPN	W1,SEGOPB+.SGSNM ;IF BLANK NAME,
	JRST	PDVLS1		;SKIP THIS SEGMENT
	PUSHJ	P,TSIXN		;TYPE THE NAME
	PUSHJ	P,TCRLF		;END THE LINE
	JRST	PDVLS1		;LOOP OVER ALL KNOWN SEGMENTS
  > ;END IFE FTFILE
PDVLS3:	MOVEI	R,.JBHNM	;OLD MONITOR
	PUSHJ	P,HFETCH	;TRY FOR NAME OF THE ONLY HISEG
	  JRST	DD1		;NONE AT ALL
	JUMPE	T,DD1		;DON'T BOTHER WITH A BLANK NAME
	MOVE	W1,T		;POSITION FOR TYPEOUT
	PUSHJ	P,TSIXN		;TYPE THE NAME
	PUSHJ	P,TCRLF		;END THE LINE
	JRST	DD1		;END THE COMMAND

  > ;END IFN FTDEC10

  > ;END IFE FTEX20!FTMON!<FTDEC10&FTFILE>
;TEXT COMMANDS:	$n"c$, $n"/.../, XXXX$5"
;			"X$	(same as $7c$),
;			$"X$		($6c$),
;			"/.../		($7"/.../),
;			$"/.../		($6"/.../)

TEXI:	MOVEI	T,7		;START OFF AS "X$ OR "/.../
	TXNE	F,CF		;<ESC> SEEN?
	SOS	T		;YES, CHANGE TO $"X$ OR $"/.../
	TXZN	F,Q2F		;NUMBER AFTER <ESC>?
	MOVEM	T,WRD2D		;NO, SIMULATE CORRECT VALUE.
	MOVE	T,WRD2D		;GET THE BYTE WIDTH.
	CAIL	T,5		;WIDTH MUST BE BETWEEN 5 AND
	CAILE	T,^D36		;36 INCLUSIVE.
	JRST	ERR
	CAIN	T,5		;XXXX$5" ?
	JRST [	MOVE	T,SYM		;YES, TAKE PREVIOUS SYL AS RADIX50
		TXZ	F,FPF!FEF!LTF	;REINIT SYL
		JRST	QUAN1]
	CAIE	T,6		;SIXBIT?
	TXZ	F,CF		;NO, CLEAR <ESC> SEEN FLAG.
	TXO	F,TXF		;FLAG PROCESSING TEXT 
	MOVE	T,LLOCO		;GET ADR OF OPEN REG
	MOVEM	T,TEM		;SAVE IT FOR LOCAL USE
TEXI1:	PUSHJ	P,TIN		;GET TERMINATOR
	MOVEM	T,SYL		;SAVE TERMINATOR
	PUSHJ	P,TIN		;GET FIRST CHARACTER
  IFE FTEX20!FTMON!<FTDEC10&FTFILE>,<	;IF USER MODE -20 OR -10,
	TXNN	F,TXF		;IN TEXT COMMAND?
	JRST	TEXI4		;NO, SKIP TEST
  > ;END IFE FTEX20!FTMON!<FTDEC10&FTFILE>
	TXNN	F,CCF		;DOUBLE-ESCAPE MEANS NO SINGLE-CHARACTER MODE
	CAIE	T,.CHESC	;ESC?
	JRST	TEXI4		;NO, HANDLE AS TEXT
	MOVE	T,SYL		;YES, RESTORE THE CHARACTER
	PUSHJ	P,TEXIN1	;CONVERT TO SIXBIT IF NECESSARY
	JRST	QUAN1		;EQUALS ONE ASCII/SIXBIT CHAR
TEXI4:	MOVE	W1,WRD2D	;FETCH BYTE SIZE
	LSH	W1,^D24		;SHIFT BYTE SIZE TO PROPER PLACE
	IOR	W1,[POINT 0,W]	;BUILD THE REST OF THE BYTE POINTER
	SETZ	W,		;INIT WORD TO 0
TEXI2:	CAMN	T,SYL		;REACHED TERMINATOR?
	JRST [	MOVE	R,TEM		;LAST ADDRESS
  IFE FTEX20!FTMON!<FTDEC10&FTFILE>,<	;MONITORS DON'T HAVE PDVS
		TXNN	F,TXF		;PDV NAME?
		JRST	PDVSE2		;YES, GO CHECK IT OUT
  > ;END IFE FTEX20!FTMON!<FTDEC10&FTFILE>
		MOVEM	R,LLOC		;SET LOC TO END OF INPUT
		MOVEM	R,LLOCO		;UPDATE LLOCO TOO
		MOVE	T,W		;GET LAST WORD
		JRST	QUAN1]		;NO, DONE
	IBP	W1		;POINT TO NEXT BYTE.
	TRNE	W1,^-W		;STILL POINTING TO W?
	JRST	TEXI3		;NO
	PUSHJ	P,TEXIN1	;CONVERT TO SIXBIT IF NECESSARY
	DPB	T,W1		;BYTE GOES INTO W.
	PUSHJ	P,TIN		;GET ANOTHER INPUT CHARACTER
	JRST	TEXI2
;HERE WHEN WORD FULL

TEXI3:	MOVEI	W1,W		;ONLY GET HERE ONCE IF NO LOC OPEN
	MOVE	R,TEM		;GET LOC OF NEXT REGISTER
  IFE FTMON!FTEX20!FTDEC10,<	;NO REAL PDV ON A -10 OR -20 MONITORS
	TXNN	F,TXF		;IF READING A PDV NAME
	JRST [	CAMLE	R,TEM1		;PAST END OF BLOCK?
		JRST	TEXI2		;YES, STOP STORING
		MOVEM	W,(R)		;NO, STORE THE WORD
		JRST	TEXI5]		;AND CONTINUE
> ;END IFE FTMON!FTEX20!FTDEC10
	TXNN	F,ROF		;REGISTER OPEN?
	JRST	TEXI2		;NO, LOSE ANY ADDITIONAL INPUT
	PUSH	P,T		;SAVE CHARACTER
	MOVE	T,W		;GET FULL WORD
	PUSHJ	P,DMEMER	;STORE WORD IF POSSIBLE
	POP	P,T		;RECOVER CHARACTER
TEXI5:	AOS	TEM		;BUMP LOC
	JRST	TEXI4		;GO REINIT WORD AND CONTINUE INPUT

;CONVERT INPUT CHARACTER TO SIXBIT IF NECESSARY

TEXIN1:	TXNN	F,CF		;SIXBIT MODE?
	POPJ	P,		;NO
	CAIL	T,"A"+40	;IS CHAR BETWEEN LOWER CASE "A" AND
	CAILE	T,"Z"+40	; LOWER CASE "Z"?
	SKIPA			;NO
	TRC	T,40		;YES, CONVERT TO UPPER CASE
	CAIL	T," "		;IS CHAR IN SIXBIT SET?
	CAILE	T,"_"
	JRST	ERR		;NO
	ANDI	T,77		;YES, MASK TO 6 BITS
	TRC	T,40		;CONVERT TO SIXBIT FORM
	POPJ	P,
;DDT EXIT AND RESTART COMMANDS (^C, ^E, AND ^Z)

;FIRST, THE NON-FILDDT CASE

  IFE FTFILE,<
CNTRLZ:

  IFN FTEXEC,<
	SKPUSR			;SEE IF USER MODE
	JRST	ERR		;NO--ERROR  
  > ;END IFN FTEXEC

  IFN FTMON,<
	MOVE	T,[MSEC1,,MRETN]>  ;MDDT RETURN
  IFN FTEX20,<
	MOVEI	T,DDTCZ>	;KDDT USER-MODE RETURN
  IFE FTMON!FTEX20,<
	XMOVEI	T,HLTA		;NORMAL DDT RETURN
    IFN FTUD20,<		;NO STUB EXCEPT USER-20
	SKIPGE	R,SECUDD	;IS THERE A STUB?
	JRST	CTLZ1		;NO
	HRRI	R,770003	;RETURN @770003 OF STUB
	PUSHJ	P,FETCH		;GET THE ADDRESS
	 JRST	ERR		;CAN'T??
	HLL	T,R		;FIX UP SECTION NUMBER
CTLZ1:
    > ;END IFN FTUD20
  > ;END IFE FTMON!FTEX20
	JRST	GO1		;RESTORE CONTEXT AND JUMP

;HERE AFTER ^Z WITH ALL BREAKPOINTS INSERTED AND CONTEXT RESTORED.

  IFE FTMON,<
HLTA:
  IFN FTDEC10,<
	EXIT	1,>		;TOPS-10 MONRET
  IFN FTDEC20,<
	HALTF%>			;TOPS-20 MONRET
	JRST	DDT		;CONTINUE IS LIKE START NOW
  > ;END IFE FTMON


	CNTRLE==ERR		;^E ONLY WORKS IN FILDDT

  > ;END IFE FTFILE

;NOW THE FILDDT CASE

  IFN FTFILE,<
CNTRLZ:	JRST	CTLZ		;JUMP TO REAL ROUTINE

CNTRLE:	JRST	CTLE		;JUMP TO REAL ROUTINE

  > ;END IFN FTFILE

SUBTTL	COMMAND ROUTINES -- CLASS 2

;*************** START OF CLASS TWO COMMANDS ***************

MULT:	TXOA	F,PTF!MLF	;*
DIVD:	TXO	F,DVF!PTF	;SINGLE QUOTE
	JRST	L1
SUBTTL	COMMAND ROUTINES -- CLASS 3

;*************** START OF CLASS THREE COMMANDS ***************

ASSEM:	JRST	LIS2		;#
MINUS:	TXO	F,MF
PLUS:	TXO	F,PTF
	JRST	LIS2

LPRN:	PUSH	P,F		;RECURSE FOR OPEN PAREN
	PUSH	P,ACCCF		;PUSH COMMACOMMA FLAG/VALUE
	PUSH	P,WRD
	PUSH	P,FRASE
	PUSH	P,FRASE1
	AOS	PRNC
	SETZM	WAKALL		;SET WAKEUP SET TO PUNCT AND CTRLS
	JRST	LIS0C		;AND READ NEW EXPRESSION

INDIRE:	HRLZI	W,20		;@
	IORB	W,WRD
	TXO	F,QF
	JRST	LIS2


ACCF:	MOVE	R,ESTUT		;GET UNDEFINED PROCESSOR SO FAR
	CAME	R,USYMP+S$ADR	;ANY UNDEFINED'S CREATED YET?
	 JRST	ERR		;YES, ERROR
				;(CAN ONLY GET HERE ON "FOO#," ETC.)
	MOVE	R,T		;COMMA PROCESSOR
	TXOE	F,COMF		;COMMA TYPED BEFORE?
	JRST	ACCF1		;YES
	HRRZM	R,ACCCF		;NO, SAVE POTENTIAL "A" OF "A,,B"
	HLLZ	T,R
	LDB	W1,[POINT 3,WRD,2] ;CHECK FOR IO INSTRUCTION
	CAIE	W1,7		;7XX?
	JRST	ACCF0		;NO, ASSUME AC FIELD
	MOVX	W1,774B11	;YES, CHECK DEVICE CODE FIELD
	TDNE	W1,WRD		;DEVICE CODE FILLED IN YET?
ACCF0:	TDZA	W1,W1		;YES, OPCODE WAS UMOVE, RDTIME, ETC.
				;  ASSUME AC FIELD
	MOVEI	W1,1		;NO, OPCODE WAS CONO, DATAO, ETC.
				;  ASSUME DEVICE CODE
	LSH	R,27(W1)	;MOVE QUANTITY TO CORRECT FIELD
	ADD	T,R
	ADDB	T,WRD
	JRST	SPACE1

ACCF1:	HRRZ	T,ACCCF		;RETRIEVE "A" OF "A,,B" EXPRESSION
	ADD	T,WRD		;FOR ",," GET LEFT HALF TOGETHER
	HRLZM	T,WRD		; AND PUT IT IN LEFT HALF
	HRROM	T,ACCCF		;FLAG COMMACOMMA CONSTRUCTION
	JRST	SPACE1
SUBTTL	COMMAND ROUTINES -- CLASS 4

;*************** START OF CLASS FOUR COMMANDS ***************

SPACE:	TXO	F,SPF		;(E.G., "JRST PAT..") FLAG SPACE TYPED
SPACE1:	TXO	F,TIF		;FLAG TRUNCATE (ADD MOD 2**18)
	TXZ	F,MF!PTF
	JRST	LIS1


RPRN:	TXNN	F,QF		;)
	SETZ	T,
	MOVS	T,T
	SOSGE	PRNC
	JRST	ERR
	POP	P,FRASE1
	POP	P,FRASE
	POP	P,WRD
	POP	P,ACCCF		;POP COMMACOMMA FLAG/VALUE
	POP	P,F
	TXNE	F,PTF
	TXNE	F,SF
	JRST	RPRN1
	MOVEM	T,SYL
	TXO	F,QF!SF
	JRST	L1RPR
RPRN1:	ADDB	T,WRD
	TXO	F,QF
	JRST	L1A
SUBTTL	COMMAND ROUTINES -- CLASS 5

;*************** START OF CLASS FIVE COMMANDS ***************

;CRLF AND OPEN NEXT REGISTER SUBROUTINE

LI0:	PUSHJ	P,TCRLF		;TYPE <CR><LF>
	JRST	LINEF0		;JOIN COMMON CODE


;"^" COMMAND - CLOSE CURRENT AND OPEN PREVIOUS SEQUENTIAL LOCATION

VARRW:	PUSHJ	P,DEPRA		;^
	PUSHJ	P,TCRLF		;TYPE <CR><LF>
	MOVE	T,LLOC
	HRRI	T,-1(T)		;DECREMENT CURRENT LOC
	JRST	LI1		;JOIN COMMON CODE


;<LF> COMMAND, CLOSE CURRENT AND OPEN NEXT SEQUENTIAL LOCATION

LINEF:	PUSHJ	P,DEPRA		;NEXT REGISTER
	PUSHJ	P,TCR		;DO CR ONLY
LINEF0:	MOVE	T,LLOC		;BUMP LOC
	HRRI	T,1(T)		;BUT DON'T CHANGE SECTION
LI1:	MOVEM	T,LLOC		;NEW LAST LOCATION
	MOVEM	T,LLOCO		;NEW LAST LOCATION OPEN
LI1P:	PUSHJ	P,PADR		;PRINT AS ADDRESS
	MOVEI	T,"/"		;"/" TO INDICATE OPEN ADDRESS
	CAME	SCH,SCHM	;TEMP MODE SAME AS PERM?
	JRST [	CAIN	SCH,FTOC	;NO, CONSTANT?
		MOVEI	T,"["		;YES - INDICATE "[" MODE
		CAIE	SCH,PINQ	;EITHER KIND OF
		CAIN	SCH,PIN		;INSTRUCTION?
		MOVEI	T,"]"		;YES - INDICATE "]" MODE
		JRST	.+1]		;USE APPROPRIATE INDICATION
	TXNE	F,STF		;SUPPRESSING OUTPUT?
	MOVEI	T,"!"		;YES - THEN OVER-RIDE WITH "!" MODE
	PUSHJ	P,TOUT		;TELL USER WHAT IS HAPPENING
LI2:	PUSHJ	P,TTAB		;TYPE A <TAB>
	TXO	F,ROF		;MARK REGISTER OPEN
	TXNE	F,STF		;SUPPRESS TYPEOUT OF LOCATION?
	POPJ	P,		;YES, DONE
	MOVE	R,LLOCO		;GET ADDRESS OF OPEN LOC
	MOVEI	W1,"?"		;TYPE ? IF FETCH FAILS
	PUSHJ	P,FETCH		;FETCH CONTENTS
	 JRST	TEXT		;CAN'T -- GO TYPE ?