Google
 

Trailing-Edge - PDP-10 Archives - BB-FP64A-SB_1986 - 10,7/dteco/dteco.mac
Click 10,7/dteco/dteco.mac to see without markup as text/plain
There are 4 other files named dteco.mac in the archive. Click here to see a list.
	TITLE	TECO %26(257) TEXT EDITOR AND CORRECTOR
	SUBTTL	RC CLEMENTS/PMH/CAM/EAR/DML/JNG/BGS/DCE/MHK/CGN/RDH

	SEARCH	JOBDAT,MACTEN,UUOSYM	;STANDARD DEFINITIONS
	SEARCH	SWIL			;SWIL DEFINITIONS

	.REQUE	REL:SWIL		;SWIL PACKAGE

	SALL				;PRETTY LISTINGS
	.DIREC	FLBLST			;PRETTIER LISTINGS

	COMMENT	\

TECO  --  "Text Editor and COrrector" for TOPS-10

Copyright (C) 1970, 1971, 1972, 1975, 1976, 1977, 1978, 1980, 1982, 1984, 1986
Digital Equipment Corporation, Maynard, Massachusetts, U.S.A.

This software is furnished under a license and may be used and copied only
in accordance with the terms of such license and with the inclusion of the
above copyright notice.  This software or any other copies thereof may not
be provided or otherwise made available to any other person.   No title to
and ownership of the software is hereby transferred.

The information in this software is subject to change  without  notice and
should not be construed as a commitment by Digital Equipment Corporation.

Digital  assumes  no  responsibility  for  the  use  or reliability of its
software on equipment which is not supplied by Digital.

\


;TECO VERSION IDENTIFICATION

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

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

IF2,<	PURGE	CSTVER,MAJVER,MINVER,EDTVER>

	LOC	.JBVER
	EXP	%%TECO		;VERSION #
	SUBTTL	Revision History

;*** CHANGES FROM VERSION 23 TO 23B ***

; EDIT 114- REMOVES CODE WHICH CHANGED BAK FILE PROTECTION TO
;           STANDARD. CHANGES SEARCH COMMAND TO ACCEPT LOWER CASE
;           FS AND FN. PROVIDES FOR $ IN Q REGISTER BY RETURNING
;           TO NEXT LEVEL WHEN $ SEEN RATHER THAN REINITIALIZING.
;           AREAS AFFECTED: GO, RCH2, ALTMOD, MAC, BKCLS2,
;                           FILSP2, FCMD, EQM

; EDIT 115- FIXES PERTAIN TO LINE SEQUENCE NUMBER PROCESSING
;           CHANGES INSERTION OF 5 SPACES TO 5 SPACES AND TAB
;           CHANGES SEQ# CHECK SO THAT 5 SPACES AND TAB ARE
;            ACCEPTED AS LINE SEQ# (THIS ELIMINATES THE INSERTION
;            AFTER THE FIRST TIME AND ALLOWS THEM TO BE REMOVED
;            USING THE /SUPLSN SWITCH)
;           AREAS AFFECTED:PPA06, PPA08,

; EDIT 116- CHANGES GARBAGE COLLECTION ROUTINE TO CHECK FOR
;           ANYTHING TO SAVE PRIOR TO ATTEMPTING A BLT.
;           AREAS AFFEDTED: GCS12


; EDIT 117- CHANGES SEARCH ROUTINE TO PROVIDE PROPER OPERATION
;           OF ^S, TECO'S "WILD DELIMITER", WHEN THE DELIMITER
;           IS THE FIRST BUFFER CHARACTER.
;           AREAS AFFECTED: S1, S4A, BCOUNT

; EDIT 120- CHANGES OPERATION OF ET COMMAND TO CONFORM TO
;           DOCUMENTATION. ET SHOULD SUPPRESS CASE FLAGGING.
;           AREAS AFFECTED: TYO

; EDIT 121- PROVIDES WARNING MESSAGE WHEN TECO
;           DETECTS SEQUENCED FILE WITH NO LSN SWITCHES.
;           ADDS CLEAR OF OUTPUT BUFFER PRIOR TO PACKING
;           TO INSURE AGAINST SPURIOUS BIT35 SETTING.
;           AREAS AFFECTED: YNKSEQ,PPA05

; EDIT 122- FIXES HP COMMAND TO SET BIT 35 FOR FIRST
;           LINE NUMBER IN THE BUFFER.
;           AREAS AFFECTED: HOLE

; EDIT 123- REDEFINES OUTPUT BUFFERS AFTER SECOND OPEN FOR
;           FILES WHICH ARE SUPERSEDED. THIS FIXES THE "ADDRESS
;           CHECK FOR DEVICE DSK" PROBLEM.
;           AREAS AFFECTED: OPNW3

; EDIT 124- REMOVES THE %SUPERSEDING EXISTING FILE MESSAGE
;           FOR NON-DIRECTORY DEVICES AND LIB: FILES.
;           AREAS AFFECTED: OPNW2, OPNW3

; EDIT 125- CORRECTS "ILL MEM REF AT USER PC 403647" BY ADDING
;           A CHECK FOR SHORT ERROR MESSAGES USED PRIOR TO
;           PERFORMING CORE CONTRACTION.
;           AREAS AFFECTED: ERRP7

; EDIT 126- CHANGES RENAME PROCESSING TO CONFORM TO DATE75
;           STANDARD.
;            AREAS AFFECTED: EBAKU1, OPNW33, BKCLS3, BKCLS5

; EDIT 127- CORRECTS EDIT#114 WHICH FAILED TO KEEP PROTECTION
;           OF INPUT FILE AS PROT FOR BAK FILE.
;           AREAS AFFECTED: BKCLS2

; EDIT 130- CORRECTS PROBLEM CAUSED BY EDIT 121. PW COMMAND
;           DID NOT WORK SINCE REGISTER "T" WAS NOT SAVED
;           CAUSING THE COMMAND TO BE INTERPRETED AS A P COMMAND.
;            AREAS AFFECTED: PPA05

; EDIT 131- CORRECTS PORTION OF EDIT 124 WHICH CHECKED WRONG STATUS
;           BIT. AREAS AFFECTED: OPNW3B

; EDIT 132- ADDS CHECK FOR DATA IN Q REGISTER PRIOR TO ALLOWING
;           INCREMENT (% COMMAND) AND GENERATES ERROR MESSAGE IF
;           ATTEMPTED WITH TEXT.  AREAS AFFECTED: PCNT

; EDIT 133- MAKES EB WORK PROPERLY FOR FILES OUTSIDE OF
;           USER'S PPN. SHOULD JUST DO ER/EW UNDER THIS
;           CONDITION INSTEAD OF TRYING TO RENAME FILES.
;           AREAS AFFECTED: EBAKUP

; EDIT 134- CHANGES CALLI AND TTCALL UUO'S TO STANDARD FORMAT

; EDIT 135- REPLACES EDIT 132 TO PUT ERROR MESSAGE IN STANDARD FORM
;           AND PROVIDE FOR CHECK ON Q COMMAND AS WELL AS %
;           ALSO PROVIDES PROPER OPERATION WITH NEGATIVE INTEGER.
;            AREAS AFFECTED: PCNT, QREG

; EDIT 136- GENERAL CLEAN-UP TO MAKE EDIT 123 MORE EFFICIENT,
;           REMOVE ROUTINE NOT NEEDED WITH EDIT 133, AND MAKE
;           DEVICE DTA WORK PROPERLY.
;           AREAS AFFECTED: OPNRD, EBAKUP, OPNWR, BAKCLS, EBS1

; EDIT 137- ELIMINATES THE CONVERSION OF OLD ALTMODES TO CODE 033
;           IN COMMAND STRINGS IF TTY NO ALTMOD IS SET.
;           AREAS AFFECTED: ALTIN, TYI

;EDIT 140- ADDS DEBUG SWITCH WHICH SAVES SYMBOLS, MAKES YANK
;          MORE EFFICIENT FOR NNN<Y> COMMANDS, AND CLEANS UP
;          THE %LINE NUMBER DETECTED MESSAGE
;          AREAS AFFECTED: TECO, LIS03, YANK2, YNKSEQ, CMDBAS

; EDIT 141- REMOVE UNNECESSARY PORTION OF EDIT 121 AND
;           EDIT 130.  WORK ON LINE SEQUENCE NUMBER PROCESSING.
;           AREAS AFFECTED:PPA04,PPA05

; EDIT 142- FIXES COMMAND DISPATCH TABLE ENTRIES FOR CR AND
;           LF TO PRESERVE NUMERIC ARGUMENTS.
;           AREAS AFFECTED: DTB

; EDIT 143- MAKE CODE FOR Q-REG MORE EFFICIENT.
;           AREAS AFFECTED: QREG, QTXTST

; EDIT 144- MAKES EH COMMAND USE STACK PROPERLY.
;           AREAS AFFECTED: ERRSET

; EDIT 145- FIXES EW TO OTHER PPN'S.
;           AREAS AFFECTED: OPNW33

; EDIT 146- MAKES EB WORK PROPERLY FOR ERSATZ DEVICES.  RENAMES
;	    DEVICE TO DSK FOR OUTPUT.  AREAS AFFECTED: EBAKU2

; EDIT 147- CHANGES OPEN FOR EB COMMAND TO PHYSICAL ONLY SINCE
;           PHYS DEVICE NAME IS IN OPEN BLOCK.  THIS IS NECESSARY
;           TO ALLOW PROPER OPERATION OF RENAME SEQUENCE.
;           AREAS AFFECTED: OPNW4, BKCLS4

; EDIT 150- MODIFY LSN PROCESSING TO HANDLE SOS PAGE MARKS.
;           AREAS AFFECTED: PPA08, PPA13, YANK5

; EDIT 151- GENERAL CLEANUP OF COMMENTS, ETC.

; EDIT 152- CORRECTS CCL PROCESSING TO ACCEPT SPACES FROM COMPIL
;           TO MAKE TECO FOO. COMMANDS WORK.
;           AREAS AFFECTED: CCLTM1, CCLIL

; EDIT 153- ADDS SPECIAL CHECK FOR ERSATZ PPN TO INSURE SUPERSEDING
;           MESSAGE WORKS FOR SYS:, NEW:, ETC.
;            AREA AFFECTED: FILSP7

; EDIT 154- MAKE EDIT 147 MORE EFFICIENT
;           AREAS AFFECTED: OPNW44

; EDIT 155- DELAY CLEARING EB AND OUTPUT OPEN FLAGS ON EX
;           COMMAND IN CASE ERROR OCCURS IN PROCESSING.
;            AREAS AFFECTED: CLOSEF

; EDIT 156- ADD ERROR CHECK AND MESSAGE FOR TAG TOO LONG.
;           AREAS AFFECTED: OG1

; EDIT 157- NOT USED (RESERVED)

; EDIT 160- PREVENTS TECO FROM GOING INTO INFINITE LOOP IF
;           ERROR FILE IS NOT FOUND AND USER HAS SET 3EH.
;           AREA AFFECTED: ERRP5

; EDIT 161- CHANGES THE WAY <> USE THE STACK TO INSURE PROPER
;           GARBAGE COLLECTIOM.
;            AREAS AFFECTED: LSSTH, INCMA2

; EDIT 162- FIXES PROBLEM CAUSED BY EDITS 147, 154, AND 160.
;            AREAS AFFECTED: ERRP5, OPNW44, BKCLS4
;*** CHANGES FROM VERSION 23B TO 24 ***

; EDIT 163- CORRECT OPERATION OF EB WHEN USER HAS CHANGED PATH
;           AREAS AFFECTED: EBAKU2

; EDIT 164- CORRECTS ERROR PRINTOUT PROBLEM WHICH CAN CAUSE RANDOM
;           CORE UUO'S TO BE EXECUTED.
;            AREAS AFFECTED: ERRP, ERRP0

; EDIT 165- PROVIDES PRINTING OF LOOKUP ERROR CODE DURING EB
;            AREAS AFFECTED: LKUPER

; EDIT 166- CORRECTS PROBLEMS WITH ?NCS ERROR
;           AREAS AFFECTED: LIS01, ERRTYP

; EDIT 167- CAUSES SPACES IN ARITHMETIC STRINGS TO BE IGNORED
;           EXCEPT AS A + OPERATOR
;           AREAS AFFECTED: CD93

; EDIT 170- CORRECTS TYPEOUT OF Q-REG NAME ON AN IQN ERROR FROM
;           AN * COMMAND
;           AREAS AFFECTED: LIS03

; EDIT 171- CORRECTS OPERATION OF EW COMMAND WHEN PPN IS SPECIFIED
;           PRIOR TO FILE.EXT
;           AREAS AFFECTED: FILSP6

; EDIT 172- CORRECTLY PUTS BOTH ARGUMENTS, IN A TWO ARGUMENT
;	    COMMAND (M,N T; M,N X; M,N K), WITHIN BUFFER BOUNDS
;	     AREA AFFECTED: CHK1

;EDIT 173- FIXES TWO ARGUMENT P COMMAND TO SET BIT 35 WHEN
;	   FIRST ARGUMENT IS BEG OF BUFFER OR BEG OF LINE
;	    AREAS AFFECTED: CHK1, PUNCHR, PUNCH1(DELETED)

;EDIT 174- CORRECTS UIN ERROR CAUSED BY A NULL REPLACEMENT
;	   ALTMODE DELIMITED F SEARCH FOLLOWED BY AN *
;	   COMMAND
;	    AREAS AFFECTED:NOALT; LIS03; LIS02; FND3-1

;EDIT 175- RE-DO ER,EW,EB,EZ,EM,EF,EX,EG COMMANDS TO UNDERSTAND
;	   DEFAULT PATHS, SFD'S, ERSATZ DEVICES, LIBRARIES,
;	   THE /SCAN PATH SETTING, THE FILE DAEMON, ETC. ETC.
;	   TECO WILL NOW EDIT THE FILE SPECIFIED BY AN EB
;	   COMMAND IN PLACE, I.E. BOTH THE BAK FILE AND THE EDITED
;	   SOURCE FILE WILL APPEAR IN THE DIRECTORY THAT THE USER
;	   SPECIFIED IN THE EB COMMAND. EXCEPTION: IF THE FILE TO
;	   BE EDITED IS NOT FOUND IN THE AREA SPECIFIED, BUT RATHER
;	   IN SOME LIBRARY AREA (LIB:, A HIGHER-LEVEL SFD, ON [1,4]
;	   WHEN NEW: WAS SPECIFIED, ETC.), THEN TECO WILL PRINT THE
;	   MESSAGE %FILE WAS FOUND IN [P,PN,SFD,SFD...] AND THEN
;	   TURN THE COMMAND INTO AN ER FROM THE AREA WHERE THE FILE
;	   WAS ACTUALLY FOUND AND AN EW INTO THE AREA THAT THE USER
;	   SPECIFIED. AN EB IN PLACE IS OBVIOUSLY NOT REASONABLE FOR
;	   FILES FOUND IN LIBRARY AREAS, AND THIS ACTION IS THOUGHT TO
;	   BE MORE REASONABLE THAN A ?FNF-0 ERROR. TECO WILL NOW ALSO
;	   RESPECT .RBSPL AND .RBNCA (NOT .RBVER - EDITING CHANGES THE
;	   VERSION) WHEN EDITING A FILE AS A RESULT OF AN EB COMMAND.
;	   THIS EDIT WAS CAREFUL NOT TO BREAK DECTAPES.
;		AREAS: LOTS

;EDIT 176- CORRECTS PROBLEM OF /SUPLSN SWITCH AND NULL CHARACTERS
;	   IN OUTPUT FILES.  CORRECTES PROBLEM OF /GENLSN
;	   WITH THE M,NP COMMAND AND EX COMMAND.  EX PROBLEM CAUSED BY
;	   EDIT 174.
;	     AREAS AFFECTED: PPA02; PPA06; PPA13; CHK1

;EDIT 177- PREVENTS RANDOM CORE UUO CAUSED BY EDIT 164.
;		AREAS AFFECTED: ERRP0

;EDIT 200- CORRECTS SOME MINOR PROBLEMS WITH EDIT 175. TECO.ERR WAS
;	   SOMETIMES BEING PRINTED INCORRECTLY. REMOVES ERDONE FLAG.
;	AREAS AFFECTED: ERDONE,OPNRD,EBAKUP,WTFIL,BAKCLS,EPATH,CCLIL

;EDIT 201- MAKE FS SEARCH FASTER FOR SAME LENGTH ARGUMENTS.
;		AREAS AFFECTED: FND

;EDIT 202- CLEAR THE OCTAL NUMBER FLAG ON ILLEGAL OCTAL DIGITS.
;		AREAS AFFECTED: CDNUM

;[LAST EDIT IN VERSION 24]
;EDIT 203- INITIALIZE LINE SEQUENCE NUMBER FOR EB COMMAND
;		AREA AFFECTED: EBAKUP

;EDIT 204- SAVE/RESTORE REGISTER USED BY TRACE.  THIS CORRECTS
;		FNF ERRORS FROM ER OR EB COMMANDS IF TRACE IS ON.
;		AREA AFFECTED: RCH

;EDIT 205- IMPLEMENT "?AOR ARGUMENT OUT OF RANGE " FOR U COMMAND
;		AREA AFFECTED: USE

;EDIT 206- MOVE "RUBSW==0" UP NEAR THE BEGINNING OF THE PROGRAM SO MACRO
;		VERSION 53 DOSEN'T COMPLAIN THAT RUBSW WAS REFERENCED
;		BEFORE IT WAS DEFINED.
;		AREAS AFFECTED:CNTRLR+3,"MISC PARAMETERS"+25

;EDIT 207- ADD CODE TO CHECK IF THE COMMAND BUFFER NEEDS MEMORY, IN ORDER
;		TO STAY WITHIN BOUNDS, UPON INITIALIZATION.
;		IF NECESSARY MEMORY IS EXPANDED.
;		AREAS AFFECTED:INITG+2

; EDIT 210- ADD CODE TO MAKE WINNING SEARCHES WITHIN ITERATIONS
;		RETURN -1.
;		AREAS AFFECTED:FND2+1

; EDIT 211- FOR THE X COMMAND USE FULL WORDS TO REPRESENT THE BUFFER
;		POINTER SO WHEN GREATER THAN 2**18 WE WON'T LOSE.
;		AREA AFFECTED: X+4

; EDIT 212- WHEN DOING A *I COMMAND DON'T GET FOOLED INTO THINKING THAT
;		THE COMMAND BUFFER HAS MOVED WHEN A GARBAGE COLLECTION HAS
;		OCCURED.
;		AREA AFFECTED:X3+6.5

; EDIT 213- WHEN SEARCHING, LEARN THAT WE ARE DONE WHEN WE EXAMINE
;		AND DON'T MATCH A CHARACTER OUTSIDE OF THE
;		BUFFER.  THIS MAKES ^EL WORK BECAUSE THE BIT MASK
;		ISN'T MESSED UP BY ADDITIONAL SEARCH ATTEMPTS.
;		AREAS AFFECTED: S3, S4A+4.5

; EDIT 214- FIX FILE STUFF IN EDIT [175] THAT DOESN'T SUPPORT NON-SFD
;		MONITORS.

; EDIT 215- REMEMBER X-MATCH FOR ADDITIONAL SEARCHES.
;		AREAS AFFECTED: CD93+8L, SERCHT

; EDIT 216- DON'T OVERFLOW THE SEARCH STRING STORAGE AREA
;		WHEN THE 81ST CHARACTER IS ^R OR ^Q.
;		AREA AFFECTED: SERCHG

; EDIT 217- GENERATE SOS PAGE MARKS WHEN USING LINE SEQUENCE
;		NUMBERS.
;		AREAS AFFECTED: PPA06, PPA14

; EDIT 220- STOP TIMESHARING THE SEQUIN FLAG FOR INPUT AND OUTPUT
;		OF SEQUENCED FILES.  THIS ELIMINATES THE LOSS OF
;		THE FIRST CHARACTER IN A /GENLSN'ED OUTPUT FILE
;		IF IT IS A TAB OR A CR.
;		AREAS AFFECTED: YANK1, YANK5, YNKSEZ

; EDIT 221- ACCOUNT FOR COMPIL FEATURE WHICH THROWS IN A NULL
;		AFTER THE FILE SPEC IN COMMAND LINE.
;		AREAS AFFECTED:CCLIL,CCLNUL

; EDIT 222- PREVENT SEARCHES FROM MATCHING A NULL WHEN THE ^^
;		COMMAND IS NOT GIVEN A CHARACTER TO OPERATE ON.
;		ADD THE MCO ERROR (MISSING CHARACTER OPERAND).
;		AREAS AFFECTED:CNTRU, THE ERR FILE

; EDIT 223- PREVENT SPACE/TAB SEARCHING FROM GOING TO FURTHER BUFFER
;		POSITIONS WHEN A CHARACTER HAS ALREADY BEEN FOUND.
;		AREAS AFFECTED:SPTB, S4D

; EDIT 224- CLEAN UP SOME COMMENTS AND ADD NEW ONES.

; EDIT 225 - FIX THE MAKE AND TECO COMMANDS BROKEN BY EDIT 221.
;	       AREAS AFFECTED: CCLDUN
;
; EDIT 226 - MAKE TECO SAVE SYMBOLS IN THE HIGH SEGMENT ONLY
;		IF DEBUGGING.

; EDIT 227- REWRITE *I LOGIC BECAUSE IT EXHIBITED A VARIETY
;		OF OBSCURE BUGS.
;		AREAS AFFECTED: LIS01, LIS03, TIMES, ERRTYP

;230	GIVE A WARNING MESSAGE IF OUTPUT IS TO DEVICE NUL:
;		AREA AFFECTED: OPNWR0

;231	IMPLEMENT "EC" COMMAND TO PREVENT TECO FROM MAKING
;		ALL SEARCHES WITHIN ITERATIONS INTO
;		COLON-SEARCHES.
;		0EC	MAKES ITERATION-SEARCHES COLON-SEARCHES.
;		NEC	FOR ANY NON-ZERO N, MAKES ITERATION-SEARCHES
;			NON-COLON SEARCHES.
;		EC	RETURNS CURRENT SETTING.
;
;		AREAS AFFECTED: ECTABL, FND2, COLOIT.
;				(COLOIT IS A NEW ROUTINE)

;232	DON'T SUPERCEDE OUTPUT FILE WHEN ?FNF ERROR OCCURS AFTER
;		"MAKE OUTFIL=INFILE" COMMAND.
;		AREA AFFECTED: ERRP6
;VERSION 24 (DISPLAY TECO... JUD LEONARD)
; EDIT 162- SCREEN FEATURES FROM ERIC OSMAN'S TV
; EDIT 163- FIX TTYSET TO TURN OFF FREE CRLF, NOT ON.
; EDIT 164- FIX VT05 FILL SEQUENCE TO USE RUBOUT RATHER THAN NULL
;	    AS FILLER.  DAS87 DISCARDS NULLS.
;	    AREA AFFECTED: CNFILL+2

;Version 25(233) RDH 19-Sep-79
;
;233	Use 700 series monitor terminal types, don't enquire
;	directly of terminal; add "EA" = Edit All command, read in
;	entire file (with <FF>s etc.); don't set "." to "B" on a search
;	failure - rather preserve "." across the failure; write crash
;	recovery file nnnTEB.TMP; add "E@" = Edit At (indirect) to
;	read commands from file (such as nnnTEB.TMP); support ANSI
;	terminals (VT100); add space (as first char typed) to scroll
;	through text, <LF> to do a "1L$$"; add "\\" as octal mode "\".
;
;234	RDH	24-Dec-79
;	Implement dump mode I/O for disk (read/write entire file in one
;	giant I/O operation). Initial load with SCAN/WILD (only to read
;	SWITCH.INI at the moment, but . . .). Add SWITCH.INI switchs:
;		/EAMODE:[ON/OFF] Default dump in entire file
;		/OKLSN		Don't worry about LSN's in EAMODE
;		/OKNULL		Don't worry about null's in EAMODE
;		/INITFILE:file	Process "file" as command file on startup
;	Add "EP" to write out (using dump mode if possible) file and then
;	"EF" it (like "EX" but without THE EXIT). Add ^H (backspace) to
;	scroll backwards (a backwards space). Rename crash recovery file
;	to be nnnTEC.CMD (so LOGOUT doesn't delete it!). Add <CR> to put
;	cursor on current screen (if not already there a la back/space).
;
;235	RDH	5-Feb-80
;	Obscure bug in memory management on ?Core cap exceeded errors.
;	Revise [205] to allow Q-reg text anywhere in addressable memory
;	Q-reg numerical values can range to approx +- 25 billion.
;
;236	RDH	18-Feb-80
;	Implement "arrow" keys. Various and sundry minor bugs.
;
;237	RDH	28-Feb-80
;	Don't allow 0-length inserts. Make <TAB> command part of normal
;	insert command (saves call to NROOM to expand buffer by 1).
;
;240	RDH	4-Mar-80
;	More junky little bugs: Q-reg relocation bug; If core expansion
;	fails acs get trounced (F2 in particular, which causes all
;	further SFD references to fail - this is also regular TECO bug).
;	Modernize command editing - ^R to retype, ^W to rubout a word,
;	^V to quote next character, ^A/^B to do lower/upper case (it's
;	what TV does, and seems as good as any other idea); TECO'S EO
;	value is now 3, setting EO=2 reverts to old editing characters.
;
;241	RDH	26-Apr-80
;	Trash left on screen in obscure situations (due to CNTLF being
;	called for character that wasn't echoed - either from command
;	file or first char typed in command string). Add crash recovery
;	file control - /CRFILE:file names the file, /CRPROT:nnn gives
;	the protection, /CRDISP:NEVER!TEMPORARY!DELETE!PRESERVE to [not]
;	delete the crash file, /CRSAVE:n to update the recovery file
;	every "n" characters, modulo line breaks.
;
;242	RDH	20-May-80
;	Assorted buggies.
;
;243	MHK	2-Jun-80
;	Implement University of Texas search algorithm which includes the
;	following features:
;		1) 10 times faster searching (forward direction)
;		2) backwards searches (using old TECO method)
;		3) bounded searches
;		4) FK searches (Find and Kill specified string)
;
;244	DPM	13-Jun-80
;	With all the various flavors of TECO floating around, finding the
;	correct TECO.ERR file is nearly impossible. Solution: don't depend
;	on an error file for messages. Implement $INFO, $WARN, and $FATAL
;	macros to generate verbosity controlled messages.
;	RDH	15-Jul-80
;	"FD<str>$" to find and delete matched string, "FK<str>$" to find
;	string, then delete from previous "." inclusively through to new
;	"."; "FR<str>$" to delete last string and replace with <str>;
;	"FV" to return last string value (size of string); and "F_" as
;	similar to "FS" on general principles. Allow user to specify /RUN
;	in SWITCH.INI (if he does, he deserves whatever he gets). Change
;	"EP" to "EC" for compatibility with "-11/etc." TECO's, and always
;	zero the buffer on exit. Add "EK" to kill current output file.
;	Make "1+:Sblah$" type expressions work (":" commands imply a
;	free "()" sequence, which includes PUSHing SARG). Ill mem ref
;	from "FS" search (day one bug) - must call NROOM after setting new
;	COMCNT/COMPTR. Don't do TEBJ sequence if nested into a command file
;	(<CR>'s from command file cause nnnJ$$ to appear in nnnTEB file,
;	which are not re-executed until after the entire command file
;	is completed).
;
;245	RDH	24-Sep-80
;	Minor bug(s).
;
;246	RDH	24-Feb-81
;	Use TERMINAL LENGTH/STOP if available.
;
;247	RDH	21-Apr-82
;	Add VK100/VT101/VT102/VT125 terminal types (equivalent to VT100).
;
;250	RDH	22-Jul-82
;	Edit 217 will lead to I/O Address Check for certain bizarre
;	files (e.g., a TOPS-20 DUMPER tape) - if a break character
;	appears within a few characters of end of I/O buffer and input
;	file LSNs exist. Note: an unexpected side "aspect" of this edit
;	is that the "cleaned-up" code now generates LSNed files that
;	are approximately .2% smaller than before (re standard TECO -
;	which liked to leave random nulls sprinkled in the output file).
;	In particular, while the files will FILCOM, they will not match
;	using DIRECT/CHECKSUM!
;
;251	RDH	22-Aug-82
;	i,jP commands appended <FF> characters to output stream (this
;	was caused by an earlier edit to clean up some code - not a problem
;	with standard TECO sources).
;
;252	RDH	28-OCT-82
;	Preserve file version (.RBVER) for EB files. This applies even
;	to faked ER/EW files, but does not apply to explicit user ER/EW
;	sequences (i.e., if the user types "EB" the version is preserved,
;	if the user types "ER" and/or "EW" the version is zero).

;DTECO %25(252) Released with 7.02 (as a tool) Spring, 1984
;253	RDH	22-Jun-84
;	Add VT103/VT180/VT185/VT220/VT240 as more ANSI klones.
;
;254	RDH
;	Version 26
;	Change over to SWIL (replace SCAN/WILD); first pass at running in
;	extended addressing. (Also note the /SFT switch added, but forgotten
;	in the edit history...); add "EP" command to PUSH to a new context;
;
;255	RDH	16-Feb-85
;	Don't do moby dump I/O except for disk devices (LPTs for example
;	get annoyed); other assorted little buggies of little import.
;	Some source cleanup (remove ancient edit numbers).
;
;256	RDH	22-Feb-85
;	Make n%<Q> add value "n" to q-register <Q>; Make n^T type out
;	ASCII character of value "n". Both are under control of EO=3.
;
;257	LEO	20-SEP-85
;	Copyrights.
;
;[END OF REVISION HISTORY]
;DEFAULT DEFINITIONS FOR ASSEMBLY SWITCHES & PARAMETERS:

ND	ERRMSG,2		;MEDIUM LENGTH ERROR MESSAGES
ND	AUTOFS,0		;DEFAULT IS NON-AUTOTYPE AFTER SEARCHES
ND	TYCASW,0		;DEFAULT TYPE-OUT MODE CAUSES FLAGGING OF
				;CHARACTERS IN THE LOWER CASE RANGE WITH '
ND	SRCHSW,0		;DEFAULT PREVAILING SEARCH MODE IS ACCEPT
				;EITHER LC OR UC ALPHABETICS AS A MATCH
ND	SRCHMX,^D200		;MAXIMUM CHARACTERS IN A SEARCH STRING
ND	EOVAL,3			;THE STANDARD SETTING OF THE EO FLAG FOR
				;THIS VERSION IS 3 (^R/^W/^U EDITING)
ND	BUGSW,1			;STANDARD IS SAVE SYMBOLS

ND	TEBPRT,077		;DEFAULT CRASH FILE PROTECTION
ND	TEBSAV,^D128		;UPDATE CRASH RECOVERY FILE EVERY TEBSAV CHARS
				; (CAN BE OVERRIDDEN VIA /CRSAVE:NNN)

ND	HIORGP,600		;HIGH SEG ORIGIN PAGE
ND	CSECTN,1		;CODE SECTION FOR EXTENDED ADDRESSING
ND	DSECTN,3		;DATA SECTION FOR EXTENDED ADDRESSING
ND	LSECTN,6		;LAST SECTION FOR EXTENDED ADDRESSING
				;  (LSECTN+1 = FIRST FREE SECTION)

ND	PDLEN,^D200		;LENGTH OF PROGRAM STACK
ND	LPF,40			;32 WORD Q-REGISTER PDL
ND	QRGMAX,44		;NUMBER OF Q-REGISTERS (A-Z; 0-9)

ND	CMFMAX,4		;LEVELS COMMAND FILES MAY NEST.

ND	XSPGMX,4		;MAXIMUM "IDLE" PAGES TO CARRY AROUND
				;ANY IN EXCESS WILL BE DEALLOCATED

ND	RMWAIW,1000		;RANDOM MEMORY ALLOCATION INCREMENT (WORDS)
ND	COMAIW,200		;COMMAND BUFFER ALLOCATION INCREMENT (WORDS)
ND	TMPBSZ,200		;SIZE OF TMPCOR BUFFER

ND	DSKBFN,3		;NUMBER OF INPUT BUFFERS
ND	DSKBSZ,^D128		;SIZE OF DISK INPUT BUFFERS
				;  THIS UTILIZES ONE PAGE OF BUFFER SPACE.
				;  TECO IS SUFFICIENTLY COMPUTE BOUND THAT
				;  USING MANY/LARGE BUFFERS DOES NOT RUN
				;  ANY FASTER.

ND	TTIBFN,1		;NUMBER OF TERMINAL INPUT BUFFERS
ND	TTIBSZ,30		;SIZE OF TERMINAL INPUT BUFFER(S)
ND	TTOBFN,2		;NUMBER OF TERMINAL OUTPUT BUFFERS
ND	TTOBSZ,100		;SIZE OF TERMINAL OUTPUT BUFFERS

ND	TTLMAX,^D36		;MAXIMUM SCREEN LENGTH WE CAN HANDLE
ND	TTWMAX,^D132		;MAXIMUM SCREEN WIDTH WE CAN HANDLE
	WINDEX==<<TTWMAX+2>/5>+1;INTERNAL LINE STORAGE ALLOCATION SIZE
	WINTOP==TTLMAX*WINDEX	;INTERNAL SCREEN STORAGE ALLOCATION SIZE

ND	RUN603,0		;ALLOW TO RUN UNDER 6.03 MONITORS
ND	TTY603,'VT52  '		;TERMINAL TYPE TO USE FOR 6.03
;ACCUMULATOR ASSIGNMENTS

FF=	0	;CONTROL FLAGS
T=	1
TT=	2	;*** TT AND TT1 MUST BE ADJACENT ***
TT1=	3
A=	4	;*** A, AA AND B MUST BE CONTIGUOUS AND IN THAT ORDER ***
AA=	5	;TYPE-IN POINTER TO COMMAND BUFFER & SEARCH TABLE INDEX
B=	6	;*** B AND E MUST BE ADJACENT ***
E=	7
C=	10
D=	11
F2=	12	;MORE CONTROL FLAGS
I=	13	;"INPUT" CHARACTER ADDRESS
OU=	14	;"OUTPUT" CHARACTER ADDRESS (MUST BE I+1)
CH=	15	;CHARACTER AC
PF=	16	;Q-REGISTER PDL PTR
P=	17	;PROGRAM STACK

;DIFFERENT AC DEFINITIONS FOR INTERFACING WITH SCAN/WILD
;THESE WILL HAVE TO BE RECONCILED WITH TECO'S CONVENTIONS SOMEDAY

T1=1		;TEMP ACS
T2=T1+1
T3=T2+1
T4=T3+1
P1=5		;PERM ACS
P2=P1+1
P3=P2+1
P4=P3+1
;CONTROL FLAGS
;RIGHT HALF - AC FF

ALTF==	1B35		;ALT-MODE SEEN
ARG2==	1B34		;THERE IS A SECOND ARGUMENT
ARG==	1B33		;THERE IS AN ARGUMENT
SLSL==	1B32		;@ SEEN
PCHFLG==1B31		;N SEARCH
COLONF==1B30		;COLON SEEN
COLONP==1B29		;FREE "()" DUE TO COLON MODIFIER IN EFFECT
SYLF==	1B28		;SYLLABLE FLAG
XPLNFL==1B27		;HAVE TYPED EXTENSION OF ERROR MESSAGE ALREADY
EMFLAG==1B26		;HAVE TYPED 1ST LINE OF ERROR MESSAGE
FINDR==	1B25		;LEFT ARROW SEARCH
QMFLG==	1B24		;PROCESSING ERROR MESSAGE
SEQUIN==1B23		;OUTPUT: AFTER EOL NEXT 5 CHARS ARE SEQ #
TRACEF==1B22		;? SEEN
SEQF==	1B21		;SEQUENCE NUMBER SEEN ON INPUT
BELLF==	1B20		;^G SEEN
;	1B19		;FREE
FORM==	1B18		;A FORM FEED TERMINATED THE LAST YANK OR APPEND COMMAND

;LEFT HALF - AC FF

F.NNUL==1B17		;NON-NULL INSERT STRING (MIGHT BE ONLY ^V, SAY)
PMATCH==1B16		;PREVAILING MATCH MODE
TABSRT==1B15		;TABBED INSERT (<TAB> COMMAND)
TIBKA== 1B14		;INPUT IN [BREAK ON ALL] CHARACTER MODE
TINEC== 1B13		;DON'T ECHO INPUT CHARACTERS
TMPFLG==1B12		;TMPCOR UUO ALLOWED
FINF==	1B11		;INPUT CLOSED BY EOF
UREAD==	1B10		;INPUT FILE IS OPEN
UWRITE==1B09		;OUTPUT FILE IS OPEN
CFOF==	1B08		;COMMAND FILE OPEN, USE IT RATHER THAN TTY
EZTMP== 1B07		;THIS COMMAND IS EZ, NOT EW
FEXTF==	1B06		;FILE EXT EXPECTED (.TYPED).
UBAK==	1B05		;EB IN EFFECT
;	1B04		;FREE
TYOF==	1B03		;NEED TO OUTPUT A BUFFER
TYOCTF==1B02		;ALLOW CONTROL CHARS TYPED WITHOUT "^"
CCLFLG==1B01		;TECO COMMAND REQUESTS Y AFTER EB
;CONTROL FLAGS
;RIGHT HALF - AC F2

CTLVA==	1B35		;^V/A SEEN INSIDE TEXT
CTLVVA==1B34		;DOUBLE ^V/A SEEN INSIDE TEXT
CTLWB==	1B33		;^W/^B SEEN INSIDE TEXT
CTLWWB==1B32		;DOUBLE ^W/^B SEEN INSIDE TEXT
XMATCH==1B31		;EXACT MATCH SEARCH MODE
EMATCH==1B30		;TEMPORARILY ACCEPT EITHER UPPER OR LOWER CASE
LINCHR==1B29		;TTY LINE HAS LC BIT ON
TYMSGF==1B28		;TYPE MESSAGE WITH NO CASE FLAGGING
OCTALF==1B27		;OCTAL RADIX
CQUOTE==1B26		;QUOTE THE NEXT COMMAND CHARACTER
SKIMRF==1B25		;WATCH FOR ^R WHEN SKIMMING
SKIMQF==1B24		;WATCH FOR ^Q WHEN SKIMMING
NOTRAC==1B23		;DISABLE TRACING
TYSPCL==1B22		;TYPE <CR>, ETC INSTEAD OF PRINTER CONTROLS
SKANFS==1B21		;SKANNING FS OR FN
TXTCTL==1B20		;NO CONTROL COMMANDS IN TEXT EXCEPT ^T, ^R
LCASE==	1B19		;CONVERT UPPER CASE TO LOWER CASE BY DEFAULT
UCASE==	1B18		;CONVERT LOWER CASE TO UPPER CASE BY DEFAULT

XCASE==UCASE!LCASE!CTLVA!CTLVVA!CTLWB!CTLWWB	;ANY CASE CONTROL

;LEFT HALF - AC F2

GOING== 1B17		;A COMMAND STRING HAS BEEN SEEN
DOING==	1B16		;AND IS BEING EXECUTED NOW
CTXN==	1B15		;^N IN SEARCH ARGUMENT
NOALT== 1B14		;DON'T CONVERT OLD ALTMODES TO 033
NALTFS==1B13		;NULL REPLACEMENT ALTMODE DELIMITED F SEARCH

SFDS==  1B12		;SUB FILE DIRECTORIES ARE IN EFFECT
LSNINF==1B11		;IGNORE CHAR AFTER SEQ# IF IT'S A TAB OR CR
			;REPLACES USE OF SEQUIN
LSNF==  1B10		;A LSN WAS SEEN SOMETIME IN THE TEXT BUFFER
CBTMF== 1B09		;CLEAR TO EOS IN GO BEFORE CLIS
S.MINS==1B08		;MINUS SEARCH
S.REPL==1B07		;FIND AND REPLACE SEARCH
S.DELE==1B06		;FD COMMAND
S.KILL==1B05		;FK COMMAND
S.FRCM==1B04		;FR COMMAND
;CHARACTER ECHO CONTROL FLAGS

EC$UPA==1B0	;ECHO AS ^X
EC$SLF==1B1	;ECHO AS SELF
EC$DLR==1B2	;ECHO AS "$"
EC$CRL==1B3	;ECHO WITH <CR><LF> APPENDED


;I/O CHANNELS

INCHN==	2
OUTCHN==3
TTYCHN==4	;CHANNEL FOR TTY IO
  TTYIOS==IO.FCS+.IOASC	;BASIC TTY I/O MODE
CCLCHN==5	;CHANNEL FOR THE CCL TMP FILE
ERRCHN==6	;CHANNEL FOR ERROR MESSAGE FILE
TEBCHN==7	;CRASH RECOVERY FILE I/O CHANNEL
CMFCHN==10	;COMMAND ("E@") FILE I/O CHANNEL
;MISC PARAMETERS

BEGPAG==200	;FAKE ASCII CHAR = BEGINNING OF BUFFER
ENDPAG==201	;FAKE ASCII CHAR = END OF BUFFER IF NO EOL AT END
SPCTAB==202	;FAKE ASCII CHAR = SIGNAL TO SEARCH FOR A STRING OF SPACE/TABS
SMATXN==^D131	;Number of characters in the search matricies
BITMLN==SMATXN/^D36+1 ;Number of words needed to hold SMATXN bits


STABLN==^D131	;LENGTH OF SEARCH TABLE
GCTBLN==100	;GARBAGE COLLECTION TABLE(S) SIZE

EO21==1		;TECO %22+ FEATURES
EO25==2		;TECO %25+ NEW HANDLING OF ^R, ^W, ^V, ^G; ^T AND % COMMANDS

FXVRSN==<12,,%%FXVE>	;SCAN/WILD PROTOCOL VERSION

BLKSIZ==200	;SIZE OF DISK BLOCK IN WORDS

PAGSIZ==1000	;SIZE OF MEMORY PAGE IN WORDS
  PG2WRD==^D9	;LSH OF PAGE ADDRESS TO WORD ADDRESS
  WRD2PG==-^D9	;LSH OF WORD ADDRESS TO PAGE ADDRESS
;OPERATORS

;TEMP (HA!)

	OPDEF	IFIW	[1B0]
		.NODDT	IFIW		;KEEP SETZ OPCODE

	IFX2EF==^D17-^D05		;LSH FOR IFIW INDEX TO EFIW INDEX


;CHECK EO FLAG: CHKEO	EO#,ADDR
;IF EOFLAG GREATER THAN EO#, RETURN AT CALL+1
;OTHERWISE GO TO ADDR

; OPDEF Local UUOS
;
	OPDEF	MSG.	[1B8]		;Verbosity controlled message processor
	OPDEF	CHKEO	[20B8]		;EO flag checking

; Macro to generate a comment message
;
DEFINE	$INFO	(PFX,ADR,TXT),<
	MSG.	0,[''PFX'',,[ASCIZ |TXT|]
		   IFB	<ADR>,<EXP .+1>
		   IFNB	<ADR>,<EXP ADR>
		  ]
>


; Macro to generate a warning message
;
DEFINE	$WARN	(PFX,ADR,TXT),<
	MSG.	1,[''PFX'',,[ASCIZ |TXT|]
		   IFB	<ADR>,<EXP .+1>
		   IFNB	<ADR>,<EXP ADR>
		  ]
>


; Macro to generate a fatal message
;
DEFINE	$FATAL	(PFX,ADR,TXT),<
	MSG.	2,[''PFX'',,[ASCIZ |TXT|]
		   IFB	<ADR>,<EXP GO>
		   IFNB	<ADR>,<EXP ADR>
		  ]
>
;MACRO TO DEFINE DATA LOCATIONS

DEFINE U(A,B)<
RELOC
A:	BLOCK	B
RELOC
>
SUBTTL	Program entry and initialization

	TWOSEG	<HIORGP_PG2WRD>

U LOCORE,0			;START OF DATA AREA

COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1986. ALL RIGHTS RESERVED.
\ ;END COPYRIGHT\

TECO:	TDZA	B,B		;NORMAL PROGRAM ENTRY
	MOVNI	B,1		;THE CCL ENTRY
	RESET			;INITIALIZE ALL IO
	MOVE	P,[IOWD PDLEN,PDLST]  ;INITIALIZE STACK
	SKIPN	CH,SECTN	;WERE WE RUNNING EXTENDED (^C, START)?
	JRST	TECO01		;NO
	HRRI	CH,TECO05	;YES
	XJRST	CH		;SO GET BACK TO DESIGNATED PC SECTION

;SELECT A SECTION IF FEASIBLE

TECO01:	XMOVEI	CH,777		;GET CURRENT PC SECTION
	HLRZ	CH,CH		;REDUCE TO JUST SECTION NUMBER
	JUMPE	CH,TECO02	;IF IN SECTION 0 (NORMAL) JUST INITIALIZE
	CAIN	CH,CSECTN	;WERE WE MAGICALLY STARTED IN CODE SECTION?
	JRST	TECO05		;YES, ALL SET HERE, NO FINAGALING NEEDED
	OUTSTR	[ASCIZ\? DTECO knows better than you in which section to run!\]
	EXIT			;PISS ON MEDDLING USER

;RUNNING IN SECTION 0, TRY FOR DESIGNATED EXTENDED PC SECTION (CSECTN)

TECO02:	MOVE	TT1,[PA.GMS!<0,,CSECTN>]  ;MAP SECTION 0 INTO SECTION CSECTN
	MOVEI	TT,1		;ONLY MAP ONE SECTION
	MOVE	T,[.PAGSC,,TT]	;PAGE. ARG POINTER TO
	PAGE.	T,		;TRY FOR EXTENDED PC SECTION
	 JRST	TECO05		;NOPE, OH WELL, NO BIG DEAL
	XJRST	[CSECTN,,TECO05];GOT IT
;RESET MEMORY (IN CASE ^C, START)

TECO05:	SETZB	FF,F2		;INITIALIZE FLAGS
	SETZM	LOCORE		;CLEAR DATA IN CASE OF ^C,ST
	MOVE	A,[XWD LOCORE,LOCORE+1]  ;BLT POINTER TO
	BLT	A,LOWEND-1	;CLEAR IMPURE STORAGE
	MOVEM	B,CCLSW		;REMEMBER HOW WE WERE STARTED

;FLAG RUNNING EXTENDED OR SECTION-0 (E.G., 7.02, KS10, ETC.)

	XMOVEI	A,777		;CURRENT PC SECTION
	HLLZM	A,SECTN		;REMEMBER CURRENT PC SECTION
	LSH	A,WRD2PG	;MAKE "PAGE NUMBER" OFFSET
;***				;MUST USE SECTION 0 PAGE ADDRESSES!!!
;***	MOVEM	A,SECTNP	;REMEMBER PC SECTION PAGE OFFSET

;GET RID OF DANGLING I/O BUFFER PAGES AND THE LIKE

	MOVE	TT,.JBREL	;HIGHEST LOCATION IN LOW SEGMENT
	ADDI	TT,PAGSIZ-1	;ROUND UP AND
	LSH	TT,WRD2PG	;TRUNCATE TO PAGE ADDRESS
	MOVEI	T,HIORGP-1	;FIRST PAGE IN HIGH SEGMENT
	SUB	T,TT		;MAKE COUNT OF PAGES THAT SHOULDN'T EXIST
	JUMPE	T,TECO07	;NO PAGES TO DELETE
	ADD	TT,A		;RELOCATE TO PAGES IN CURRENT SECTION
	PUSHJ	P,PGZAP		;MAKE SURE PAGES DON'T EXIST
	 HALT	.		;BLETCH

;GET RID OF DANGLING DATA SECTIONS

TECO07:	SKIPN	SECTN		;RUNNING EXTENDED
	JRST	TECO10		;NO
	MOVEI	T,<LSECTN-DSECTN+1>  ;MAX DATA SECTIONS POSSIBLE
	MOVEI	TT,DSECTN	;FIRST POSSIBLE DATA SECTION
	PUSHJ	P,PSZAP		;MAKE SURE THEY DON'T EXIST
	 HALT	.		;EXTENDED BLETCH

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

TECO10:	PUSHJ	P,TTOPEN	;GO OPEN TTY
	PUSHJ	P,GETTYP	;FIGURE OUT WHAT KIND OF SCREEN
	PUSHJ	P,TTYGET	;GET AND REMEMBER INITIAL TTY MODES
	MOVEI	A,1		;SET TABS
	MOVEM	A,OURTAB	;SET NO TAB CONVERSION
	MOVEM	A,OURFCR	;SET NO FREE CRLF
	MOVEM	A,OURDEM	;SET DEFERRED ECHO MODE
	SETZM	OURBLN		;SET NO BLANK SUPPRESSION
	SETZM	OURPSZ		;SET PAGE 0
	SETZM	OURSTO		;SET NO STOP
	PUSHJ	P,TTYSET	;SETUP TECO TERMINAL CHARACTERISTICS
	SKIPE	SCTYPE		;IF VIDEO SCREENING
	PUSHJ	P,CLRSCN	;THEN CLEAR SCREEN
	MOVSI	A,(ASCII */\*)
	MOVEM	A,PTRCHR	;WHAT POINTER LOOKS LIKE ON SCREEN
	SETOM	SCH		;SO FIRST CHARACTER IS TTYED

	PUSHJ	P,UUOINI	;INITIALIZE UUO HANDLER
	 HALT	.		;CAN'T RECOVER FROM THIS
	PUSHJ	P,PSIINI	;INITIALIZE PSI SERVICE (^C TRAP IN PARTICULAR)
	 HALT	.+1		;CAN'T INIT PSI????

;*** THIS IS A KROCK, BUT WHAT CAN I SAY?

	MOVE	A,[BOSWT,,BOSWT+1]  ;START OF SWITCHES BLOCK
	SETOM	BOSWT		;INITIALIZE SWITCHES
	BLT	A,EOSWT		;TO NO VALUE SEEN FLAG
	JSP	OU,CALLSW	;CALL SCAN/WILD
		ISLEN,,ISBLK		;MOVE	T1,[ISLEN,,ISBLK]
		IFIW	.ISCAN##	;PUSHJ	P,.ISCAN##
	JSP	OU,CALLSW	;CALL SCAN/WILD
		OSLEN,,OSBLK		;MOVE	T1,[OSLEN,,OSBLK]
		IFIW	.OSCAN##	;PUSHJ	P,.OSCAN##

;*** END OF THE KROCK

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

TECO20:	MOVE	TT,.JBFF	;FIRST FREE LOSEG LOCATION
	MOVEM	TT,RMWBAS	;BECOMES BASE FOR RANDOM MEMORY ALLOCATION
	MOVEM	TT,RMWEND	;SET END ADDRESS FOR RANDOM MEMORY

	SKIPE	SECTN		;RUNNING EXTENDED?
	MOVSI	TT,DSECTN	;YES, SELECT FIRST DATA SECTION AS BASE ADDRESS
	MOVEM	TT,CMDBAS	;SET BASE ADDRESS FOR COMMAND BUFFER
	MOVEM	TT,CMDEND	;ALSO END ADDRESS FOR COMMAND BUFFER SO FAR
	MOVSI	T,(POINT 7,0,-1);PROTOTYPE BYTE POINTER
	SKIPE	SECTN		;PC IN EXTENDED SECTION?
	TLOA	T,(1B12)	;YES, USE DOUBLE-WORD BYTE POINTER
	HRR	T,TT		;NO, USE SINGLE-WORD BYTE POINTER
	DMOVEM	T,CMDPTR	;SET MASTER COMMAND BUFFER BYTE POINTER
	IMULI	TT,5		;CONVERT TO TEXT ADDRESS
	MOVEM	TT,QRBUF	;SET Q-REG/ETC BASE ADDRESS
	MOVEM	TT,BEG		;SET BEGIN ("B") ADDRESS OF EDITING TEXT
	MOVEM	TT,PT		;SET CURSOR (".") ADDRESS WITHIN EDITING TEXT
	MOVEM	TT,Z		;SET END ("Z") ADDRESS FOR EDITING TEXT
	SKIPN	SECTN		;RUNNING EXTENDED?
	SKIPA	TT,.JBREL	;NO, LOCAL CURRENT MEMORY LIMIT (WORDS)
	HRLOI	TT,DSECTN-1	;YES, GLOBAL CURRENT MEMORY LIMIT (WORDS)
	IMULI	TT,5		;CURRENT MEMORY LIMIT (CHARACTERS)
	MOVEM	TT,MEMSIZ	;SET END ADDRESS FOR Q-REG/TEXT MEMORY
	SETOM	MESFLG		;ON STARTUP THE SCREEN IS ALL MESSED UP!
				; THIS WILL FORCE INITIALIZATION OF SCRN??
				; VARIABLES

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

TECO30:	MOVE	A,[F%FDAE&<-1,,0>!.GTFET]	;GETTAB FTFDAE
	GETTAB	A,		;NEED TO KNOW IF FILE DAEMON
	  SETZ	A,		;MONITOR FOR EB STUFF
	SETZM	FDAEM		;ASSUME NOT
	TXNE	A,F%FDAE&<0,,-1>;FILE DAEMON MONITOR?
	SETOM	FDAEM		;YES, SIGN BIT OF .RBPRV CHANGED
	MOVE	C,[%FTSTR]	;FIND OUT IF SFDS ARE USED
	GETTAB	C,		;...
	JRST	.+2		;ASSUME SO
	TXNE	C,F%SFD &<0,,-1>;SFDS HERE?
	TXO	F2,SFDS		;YES, SET THE FLAG

	MOVE	A,.MYJOB##	;GET OUR JOB NUMBER
	MOVEI	C,3		;WANT THREE DIGITS' WORTH
TECO40:	IDIVI	A,12		;CONVERT JOB NUMBER TO SIXBIT
	ADDI	AA,20
	LSHC	AA,-6
	SOJG	C,TECO40
	HRRI	B,'TEC'		;FORM NAME ###TEC
	MOVEM	B,TMPTEC	;SAVE
	HRREI	A,TYCASW	;GET DEFAULT TYPE-OUT CASE FLAGGING MODE
	MOVEM	A,TYCASF	;AND MAKE IT CURRENT
	HRROI	A,.GTLIM	;THE "BATCH" JOB TABLE
	GETTAB	A,		;READ MONITOR INFORMATION
	 SETZ	A,		;DUH?
	TXNE	A,JB.LBT	;ARE WE A BATCH JOB?
	SKIPGE	A,S.EOBA	;YES, GET BATCH EO VALUE
	MOVE	A,S.EOMO	;NO (OR NO /EOBATCH), GET TIMESHARING EO
	CAIG	A,EOVAL		;USER GIVE AN EOVAL WITHIN REASON?
	CAIGE	A,0		;DID USER SPECIFY EITHER /EOMODE OR /EOBATCH?
	MOVEI	A,EOVAL		;NO, PICKUP SYSTEM DEFAULT
	MOVEM	A,EOFLAG	;AND SET OUR EO RUNTIME VALUE
	MOVEM	A,EOFLAG
	HRREI	A,ERRMSG-2	;SET ERROR MESSAGE TYPE INDICATOR
	MOVEM	A,ERRLEN	;-1=SHORT, 0=MEDIUM, +1=LONG
	HRREI	A,AUTOFS	;INIT AUTOTYPE-AFTER-SEARCHES FLAG
	MOVEM	A,AUTOF

;FALL THROUGH TO NEXT PAGE
;COMPUTE A VALUE WHICH IS 2/3 THE SIZE OF THE CHARACTER BUFFER.IF
;1/3 IS LESS THAN 128 CHARACTERS, THE BUFFER WILL BE 2/3 FILLED ON
;A "Y" OR "A" COMMAND,OTHERWISE, THE BUFFER WILL BE FILLED TO THE
;TOTAL AVAILABLE BUFFER - 128 CHARACTERS. PAYING ATTENTION TO THE
;FORM FEED AND LF OPERATORS.

;IT SHOULD BE NOTED THAT IN THE CASE OF AUTOMATIC
;MEMORY EXPANSION, THESE INSTRUCTIONS MUST BE RE-EXECUTED
;TO INSURE PROPER MEMORY BOUNDS.

TECO50:	MOVEI	A,SYL
	MOVEM	A,DLIM		;DLIM:=SYL
	MOVEI	FF,0		;CLEAR FLAG REGISTER
IFN SRCHSW,<TXO	FF,PMATCH>	;MAKE EXACT MODE CURRENT
	XMOVEI	T,RENTR		;OUR "REENTER" ADDRESS
	MOVEM	T,.JBREN	;SET IT UP TOO
	JRST	GO		;START TECO'ING
	SUBTTL	REENTER COMMAND RECOVERY

RENTR:	MOVE	P,[IOWD PDLEN,PDLST]  ;[RE]INITIALIZE PUSHDOWN STACK
	SKIPN	CH,SECTN	;RUNNING EXTENDED ADDRESSING?
	JRST	RENTR1		;NO
	HRRI	CH,RENTR1	;YES
	XJRST	CH		;[RE]ENTER SELECTED PC SECTION

RENTR1:	PUSHJ	P,TTOPEN	;GO [RE]OPEN TERMINAL CHANNEL
	PUSHJ	P,GETTYP	;FIND OUT WHAT TYPE OF TERMINAL WE NOW HAVE
	PUSHJ	P,TTYGET	;GET AND REMEMBER TTY MODES BECAUSE USER
				;MAY HAVE CHANGED THEM WHILE AT MONITOR LEVEL
	PUSHJ	P,TTYSEC	;RESTORE OUR OWN MODES

;FAKE OUT THE CRASH FILE

	MOVEI	CH,.CHBEL	;A ^G CHARACTER
	PUSHJ	P,TEBCHR	;STUFF IN FIRST ^G
	PUSHJ	P,TEBCHR	;A SECOND ^G IN CASE THE FIRST GETS CAUGHT
				; BY A "DANGLING" ^V IN THE CRASH FILE
	MOVEI	CH,.CHCNU	;A ^U CHARACTER
	PUSHJ	P,TEBCHR	;ABORT LAST POSSIBLE PARTIAL COMMAND
	PUSHJ	P,TEBJ		;ISSUE NNNJ$$ COMMAND SO WE KNOW WHERE WE ARE

;OTHER RANDOM CLEANUP

	PUSHJ	P,TYICNR	;ZAP COMMAND FILE (IF ANY)
	SETOM	SCH		;SO CHARACTER COMES FROM TTY
	SETOM	MESFLG		;ASSUME DISPLAY IS AMUCK
	SETZM	WINFLG		;SO DISPLAY HAPPENS
	SETZM	VFREEZ		; . . .

;RESUME TECO'ING

	XMOVEI	T,GO		;ADDRESS FROM WHENCE TO RESUME
	MOVEM	T,PSICCV+.PSVOP	;SET FOR DEBRK. TO SEE
	DEBRK.			;ALLOW FURTHER CONTROL-C'S
	 JRST	GO		;MUST HAVE BEEN ?ILL MEM REF OR SUCH
	 JRST	GO		; WHICH TOOK US TO MONITOR LEVEL
;SCAN/WILD INTERFACE STUFF

;CALLSW -- CALL A SCAN/WILD ROUTINE
;CALL IS:
;
;	JSP	OU,CALLSW
;		<ARG>
;		<RTN>
;	 NON-SKIP RETURN
;	SKIP RETURN
;
;WHERE <ARG> IS THE ARGUMENT TO BE PASSED IN SCAN'S T1; AND <RTN> IS
;THE ROUTINE TO BE CALLED.
;
;SKIP OR NON-SKIP RETURN IS PRESERVED.
;
;PRESERVES ALL ACS.

CALLSW:	PUSH	P,T1		;SAVE
	PUSH	P,T2		; SCAN'S
	PUSH	P,T3		;  VOLATILE
	PUSH	P,T4		;   ACS
	MOVE	T1,(OU)		;FETCH T1 ARGUMENT
	PUSHJ	P,@1(OU)	;CALL SCAN/WILD ROUTINE
	 HRRI	OU,-1(OU)	;NON-SKIP RETURN
	DMOVEM	T1,SCNT1	;SAVE WHAT SCAN RETURNED US
	DMOVEM	T3,SCNT3	; . . .
	POP	P,T4		;   RESTORE
	POP	P,T3		;  SCAN'S
	POP	P,T2		; VOLATILE
	POP	P,T1		;ACS
	JRST	3(OU)		;RETURN TO CALLER


U SCNT1,1			;SCAN'S RETURNED T1
U SCNT2,1			; AND T2
U SCNT3,1			;  AND T3
U SCNT4,1			;   AND T4
;TECO/SCAN CHARACTER I/O

;SCNTYI  --  RETURN ONE COMMAND INPUT CHARACTER

SCNTYI:	MOVEI	P4,.CHLFD	;HMMM
	POPJ	P,		;GO AWAY AGAIN


;SCNTYO  --  TYPE ONE COMMAND TERMINAL CHARACTER

SCNTYO:	PUSHJ	P,TECCTX	;SWITCH TO TECO ACS
	PUSH	P,CH		;SAVE A REG
	PUSH	P,A		; AND ANOTHER REG
	PUSH	P,AA		;  AND YET ANOTHER REG
	MOVE	CH,SCNACS+T1	;THE CHARACTER SCAN WANTS TO OUTPUT
	PUSHJ	P,TYOM		;TYPE A CHARACTER
	POP	P,AA		;  RESTORE A REG
	POP	P,A		; AND ANOTHER REG
	POP	P,CH		;AND YET ANOTHER REG
	PJRST	SCNCTX		;SWITCH BACK TO SCAN


;SCNTYS  --  TYPE ONE SPECIAL CHARACTER (E.G., "<ESC>")

SCNTYS:	PUSHJ	P,TECCTX	;SWITCH TO TECO ACS
	PUSH	P,CH		;SAVE A REG
	PUSH	P,A		; AND ANOTHER REG
	PUSH	P,AA		;  AND YET ANOTHER REG
	MOVE	CH,SCNACS+T1	;THE CHARACTER SCAN WANTS TO OUTPUT
	PUSHJ	P,TYOS		;TYPE A SPECIAL CHARACTER
	POP	P,AA		;  RESTORE A REG
	POP	P,A		; AND ANOTHER REG
	POP	P,CH		;AND YET ANOTHER REG
	PJRST	SCNCTX		;SWITCH BACK TO SCAN
;SCNCTX  --  SWITCH TO SCAN/WILD CONTEXT

SCNCTX:	MOVEM	10,TECACS+10	;Save AC 10
	MOVEI	10,TECACS	;Set up BLT
	BLT	10,TECACS+10-1	;Save TECO's ACs
	MOVSI	10,SCNACS	;SCAN'S ACS
	BLT	10,10		;SET THEM UP
	POPJ	P,		;Return in SCAN's context


;TECCTX  --  SWITCH TO TECO CONTEXT

TECCTX:	MOVEM	10,SCNACS+10	;Save AC 10
	MOVEI	10,SCNACS	;Set up BLT
	BLT	10,SCNACS+10-1	;Save SCAN's ACs
	MOVSI	10,TECACS	;Address of TECO context acs
	BLT	10,10		;Back to TECO mode
	POPJ	P,		;Return in TECO's context


U	TECACS,10		;TECO's ACs
U	SCNACS,10		;SCAN's ACs
;SWITCH DEFINITIONS

DM	CRF,.FXLEN,0,0
DM	INI,.FXLEN,0,0

DEFINE	SWTCHS,<
SL	CRDISP,S.CRDI,$TB,$TBDEL,FS.NFS!FS.VRQ
SP	CRFILE,S.CRFI,.SWFIL##,CRF,FS.NFS!FS.VRQ
SP	CRPROT,S.CRPR,.SWOCT##,,FS.NFS!FS.VRQ
SP	CRSAVE,S.CRSA,.SWDEC##,,FS.NFS!FS.VRQ
SN	EAMODE,S.EAMO,FS.NFS
SP	EOBATC,S.EOBA,.SWDEC##,,FS.NFS!FS.VRQ
SP	EOMODE,S.EOMO,.SWDEC##,,FS.NFS!FS.VRQ
SP	INITFI,S.INIT,.SWFIL##,INI,FS.NFS!FS.VRQ
SN	OKLSN,S.OKLS,FS.NFS
SN	OKNULL,S.OKNU,FS.NFS
SN	SFT,S.SFT,FS.NFS
>

KEYS	($TB,<NEVER,TEMPORARY,DELETE,PRESERVE>)

DOSCAN(TECSW)
;DATA BLOCKS

;FOR SCAN

;MONITOR COMMAND TABLE

CCMDT:	'MAKE  '		;CREATE A NEW FILE
	'TECO  '		;EDIT AN EXISTING FILE

	CCMDL==.-CCMDT

;ISCAN PARAMETER BLOCK

ISBLK:	EXP	FXVRSN		;SCAN/WILD PROTOCOL VERSION WORD
	IOWD	CCMDL,CCMDT	;IOWD OF LEGAL MONITOR COMMANDS
	CCLSW,,'TEC'		;ADR OF STARTING OFFSET,,CCL NAME
	0,,SCNTYO		;CHAR INPUT RTN,,CHAR OUTPUT RTN
	Z			;INDIRECT FILE BLOCK POINTER (XWD)
	Z			;PROMPT RTN,,MONRET RTN
	Z			;FLAGS,,<FUTURE>
	Z			;ERROR INTERCEPT RTN

	ISLEN==.-ISBLK

;TSCAN PARAMETER BLOCK

;TSBLK:	EXP	FXVRSN		;SCAN/WILD PROTOCOL VERSION WORD
;	IOWD	TECSWL,TECSWN	;IOWD POINTER FOR SWITCH NAMES
;	XWD	TECSWD,TECSWM	;DEFAULT TABLE,,PROCESSOR TABLE
;	XWD	0,TECSWP	;<FUTURE>,,STORAGE POINTERS
;	SIXBIT	/TECO/		;HELP
;	XWD	CLRALL,0	;CLEAR ALL,,CLEAR FILE
;	XWD	INX,OUX		;ALLOC INPUT AREA,,ALLOC OUTPUT AREA
;	Z			;MEMORIZE STICKY,,APPLY STICKY
;	Z			;CLEAR STICKY,,FLAGS
;	Z			;<FUTURE>,,SWITCH VALUE STORAGE RTN
;
;	TSLEN==.-TSBLK

;OSCAN BLOCK

OSBLK:	EXP	FXVRSN		;SCAN/WILD PROTOCOL VERSION WORD
	IOWD	TECSWL,TECSWN	;IOWD POINTER FOR SWITCH NAMES
	XWD	TECSWD,TECSWM	;DEFAULT TABLE,,PROCESSOR TABLE
	XWD	0,TECSWP	;<FUTURE>,,STORAGE POINTERS
	SIXBIT	/TECO/		;HELP
	SIXBIT	/TECO/		;OPTIONS NAME

	OSLEN==.-OSBLK
;FOR WILD

;LKBLK:	EXP	FXVRSN		;SCAN/WILD PROTOCOL VERSION WORD
;	WIFIR,,WILAS		;<FIRST,,LAST> SCAN BLOCK POINTER ADR
;	INOPN,,INFIL		;<OPEN,,LOOKUP> BLOCK ADDRESS
;	.FXLEN,,FILLEN		;SCAN BLOCK LENGTH,,LOOKUP LENGTH
;	0,,WICUR		;FLAGS!CHANNEL,,CUR SCNBLK PTR ADR
;	Z			;END OF DIRECTORY RTN
;
;	LKLEN==.-LKBLK


;SCBLK:	EXP	FXVRSN		;SCAN/WILD PROTOCOL VERSION WORD
;	WICUR,,[OUSCN]		;<CUR INPUT,,OUTPUT> SCNBLK PTR ADR
;	INOPN,,OUOPN		;<INPUT,,OUTPUT> OPEN BLK ADR
;	INFIL,,OUFIL		;<INPUT,,OUTPUT> FILE BLK ADR
;	[0,,-1],,FILLEN		;DEFAULT EXT ADR,,FILE BLK LEN
;	0,,SCFLG		;<FUTURE>,,SCWILD PROCESSING FLAGS
;
;	SCLEN==.-SCBLK
;THIS PAGE CONTAINS THE COMMAND READER FOR THE CCL SYSTEM

CCLDSK:	.IOASC			;ASCII I/O
	'DSK   '		;TO A DISK DEVICE
	0,,CCLB			;INPUT BUFFER RING HEADER

U CCLB,3			;THE HEADER FOR CCL FILE I/O

CCLIN:	HRRZ	TT,.JBFF	;GET FIRST FREE
	ADDI	TT,TMPBSZ	;LAST LOC USED IN TMPCOR
	CAMG	TT,.JBREL	;ENOUGH ROOM?
	JRST	CCLIN2		;YES, JUST READ IN BUFFER
	LSH	TT,WRD2PG	;NO, MAKE PAGE ADDRESS
	ADD	TT,SECTNP	;OFFSET TO PC SECTION
	PUSHJ	P,P1CRE		;ALLOCATE ANOTHER MEMORY PAGE
	 HALT	.		;BAD NEWS
CCLIN2:	HRLI	T,'EDT'		;SET UP READ BLOCK FOR TMPCOR UUO
	HRLOI	TT,-TMPBSZ-1	;SIZE OF TMPCOR READ
	ADD	TT,.JBFF	;MAKE IOWD POINTER TO TMPCOR BUFFER
	MOVE	TT1,[.TCRDF,,T]	;TMPCOR UUO ARG POINTER TO
	TMPCOR	TT1,		;READ AND DELETE FILE EDT
	  JRST	CCLTMP		;NO FILE EDT OR NO TMPCOR UUO
	HRRZ	AA,.JBFF	;GET START OF BUFFER AREA
	HRLI	AA,350700	;PICK UP EDT CHARACTERS, SKIP LINED "S"
	TXO	FF,TMPFLG	;SET TMPCOR FLAG
	JRST	CCLTM1		;FINISH PROCESSING COMMAND
;HERE IF TMPCOR FAILED. READ NNNEDT.TMP FROM DSK:

CCLTMP:	HLLZ	B,TMPTEC	;GET SIXBIT JOB #
	HRRI	B,'EDT'		;REST OF NAME
	MOVE	T,[-XFILEN,,XFILNM-1]	;PDL INTO LOOKUP BLOCK
	PUSH	T,[XFILEN]	;FIRST WORD IS CNT OF ARGS
	PUSH	T,[0]		;LOOK ON DEFAULT PATH
	PUSH	T,B		;STORE FILENAME
	PUSH	T,['TMP   ']	;EXTENSION
	MOVE	T,.JBFF		;USE BUFFER SPACE BRIEFLY
	OPEN	CCLCHN,CCLDSK	;OPEN DSK CHANNEL
	  JRST	TECO		;IF NO DSK, SAY "*"
	INBUF	CCLCHN,1	;DONT ADR CHECK
	LOOKUP	CCLCHN,XFILNM	;OPEN THE FILE
	  JRST	TECO		;IT WASN'T THERE?
	INPUT	CCLCHN,0
	MOVEM	T,.JBFF		;GIVE BACK SPACE
	IBP	CCLB+1		;SKIP THE LINED S
	MOVE	AA,CCLB+1	;SETUP BYTE POINTER TO INPUT
CCLTM1:	MOVE	T,TTYPT2	;OUTPUT CHARS
	MOVEI	C,2		;INIT CHAR CTR
	MOVEI	A,"="		;FLAG NO EQUALS SIGN SEEN


;FALL INTO LOOP ON NEXT PAGE
;LOOP BACK HERE ON EACH NEW CHARACTER IN THE TMP FILE
CCLIL:	ILDB	B,AA		;INPUT THE FILE NAME & EXT
	CAMN	B,A		;FIRST EQUALS SIGN SEEN?
	JRST	CCLEQL		;YES
	CAIE	B,.CHCRT	;CR?
	CAIN	B,"}"		;OLD ALT?
	AOJA	C,CCLNUL	;THEN PROCESS
	JUMPE	B,CCLIL		;THROW AWAY NULLS
	IDPB	B,T		;ELSE STORE CHAR
	AOJA	C,CCLIL		;AND LOOP FOR ALL CHARS

;HERE ON THE FIRST "=" IN THE COMMAND STRING
CCLEQL:	MOVE	D,T		;SAVE C & T
	MOVE	E,C		;INCASE .TE A=B
	MOVEI	B,.CHESC	;REPLACE FIRST EQUALS SIGN
	IDPB	B,T		;  WITH <ALT>ER
	MOVEI	B,"E"		;  SINCE WE EXPECT
	IDPB	B,T		;  AN INPUT FILE
	MOVEI	B,"R"		;  SPEC TO FOLLOW
	IDPB	B,T		;  THE FIRST ONE
	ADDI	C,3		;COUNT THE CHARS STORED
	SETO	A,		;PREVENT FINDING LATER EQUALS
	TXO	FF,CCLFLG	;DO A Y IN ANY CASE
	JRST	CCLIL		;AND LOOP BACK FOR NEXT CHAR
;HERE ON A NUL (END OF COMMAND). SEE IF IT WAS MAKE OR TECO

CCLNUL:	MOVEI	TT,"W"		;PREPARE FOR EW COMMAND
	CAILE	B,.CHCRT	;WAS BREAK A CRLF?
	JRST	CCLDUN		;NO. ALTMODE ASSUMED
	TXO	FF,CCLFLG	;REQUEST Y AFTER EB
	MOVEI	TT,"B"		;NOW PREPARE FOR EB
	AOJN	A,CCLDUN	;CONTINUE UNLESS EB & "=" WAS SEEN
	MOVE	T,D		;IF .TE A=B,  WE NEVER SAW THE "="
	AOS	C,E		;IN CASE .MA A=B, THEN .TE<CRLF>
				; SINCE TYI USES SOSG, THE COUNT MUST BE
				; ONE TOO LARGE (YECH).
CCLDUN:	MOVEI	B,.CHESC	;AN <ESC> TO TERMINATE THE FILE SPEC
	IDPB	B,T		;TERMINATE THE FILE SPEC
	SKIPL	S.EAMO		;EAMODE SET?
	TXZ	FF,CCLFLG	;YES, NO FREE YANKS THEN
	TXZN	FF,CCLFLG	;WANT TO YANK IN THE FIRST PAGE?
	JRST	CCLDU1		;NO
	MOVEI	B,"E"		;YES, A YANK COMMAND
	IDPB	B,T		;STUFF IT INTO THE BUFFER
	MOVEI	B,"Y"		;YANK COMMAND, PART TWO
	IDPB	B,T		;STUFF IT INTO THE BUFFER TOO
	MOVEI	B,.CHESC	;ANOTHER <ESC> CHARACTER
	IDPB	B,T		;TERMINATE THE YANK COMMAND
	ADDI	C,3		;COUNT THE "EY$" CHARACTERS
CCLDU1:	IDPB	B,T		;SECOND ALT TO TERMINATE COMMAND
	ADDI	C,2		;COUNT TERMINATING "$$" CHARACTERS
	MOVEI	B,"E"		;NOW FILL IN THE EB OR EW
	MOVE	T,TTYPT		;AT THE BEGINNING OF STRING
	MOVEM	T,TIB+.BFPTR	;ALSO INITIALIZE TO READ THIS
	IDPB	B,T		;STORE "E"
	IDPB	TT,T		;AND EITHER W OR B
	MOVEM	C,TIB+.BFCTR	;SET BUFR CTR
	TXZE	FF,TMPFLG	;TMPCOR UUO IN PROGRESS?
	JRST	CCLDU2		;YES, DON'T CLOSE DSK
	SETZM	XNAM		;NOW FLUSH FILE
	RENAME	CCLCHN,XFILNM	;BY RENAME TO ZERO
	  JFCL			;PROTECTED?
CCLDU2:	RELEAS	CCLCHN,
	POPJ	P,
;FIGURE OUT WHAT KIND OF TERMINAL THIS IS, AND SET THE SCTYPE CODE

GETTYP:	MOVEI	A,.TOTRM	;TRMOP. TERMINAL TYPE FUNCTION
	MOVE	AA,TTYUDX	;GET TERMINAL UDX
	MOVE	B,[2,,A]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;READ MONITOR'S TERMINAL TYPE
	 SETO	B,		;MONITOR DOESN'T KNOW (PRE-7.00)

IFN	RUN603,<MOVE B,[TTY603]>;IF 6.03, SET ASSEMBLED TERMINAL

;HERE WITH TERMINAL TYPE IN B (SIXBIT NAME), SEE IF WE LIKE IT

	MOVSI	A,-TYPTLN	;LENGTH OF OUR TYPE TABLE
GETTY2:	CAME	B,TYPTBL(A)	;TERMINAL WE KNOW ABOUT?
	AOBJN	A,GETTY2	;NO, CHECK REST OF TABLE
	MOVE	B,TYPVTX(A)	;GET INTERNAL TERMINAL TYPE
				; (0 IF UNKNOWN)
	MOVEM	B,SCTYPE	;REMEMBER FOR SCREEN CHECKING
	HRLZ	A,TYPCTL(B)	;ADDRESS OF CONTROL CODES TABLE
	HRRI	A,TTYESC	;ADDRESS OF CONTROL CODES TABLE
	BLT	A,TTYESZ	;COPY WORKING TABLE
	MOVEI	A,8
	MOVEM	A,TABSIZ	;TABS EVERY 8 COLUMNS
	POPJ	P,
;TTY CONTROL STUFF

;INTERNAL TERMINAL TYPES

VXTTY==0			;NO SCREEN CONTROL (UNKNOWN/HARDCOPY)
VX05==1				;VT05
VXD50==2			;VT50-CLASS
VXDEC==3			;VT52-CLASS
VXANSI==4			;VT100 (ANSI) CLASS

TYPCTL:	VCTTY			;(00) NONE (E.G., HARDCOPY TERMINAL)
	VC05			;(01) VT05 CONTROL
	VCD50			;(02) DEC-STANDARD SANS CURSOR ADDRESSING
	VCDEC			;(03) DEC-STANDARD ESCAPE CONTROL
	VCANSI			;(04) ANSI-STANDARD ESCAPE CONTROL



;TERMINAL TYPES DEFINITIONS

DEFINE	TRMTYP,<
X	VT05,	VX05		;GOOD OLE VT05
X	VT50,	VXD50		;DINKY VT50
X	VT52,	VXDEC		;STANDARD VT52
X	VT55,	VXDEC		;VT52 WITH GRAPHICS
X	VT61,	VXDEC		;FANCY EDITING TERMINAL
X	DAS21,	VXDEC		;FUNNY LOOKING VT52
X	VT100,	VXANSI		;NOT-SO-NEW-ANYMORE NEWEST LATEST GREATEST
X	VT101,	VXANSI		;EL CHEAPO VT100
X	VT102,	VXANSI		;FANCY VERSION OF EL CHEAPO VT100
X	VT103,	VXANSI		;EGADS, THEY'RE PROLIFERATING LIKE RABBITS
X	VT125,	VXANSI		;VT100 WITH GRAPHICS
X	VT180,	VXANSI		;ROBIN
X	VT185,	VXANSI		;ROBIN RED BREST?
X	VT220,	VXANSI		;NEWEST LATEST GREATEST WITH SUCKY KEYBOARD
X	VT240,	VXANSI		;FANCIER VERSION OF NEWEST ETC.
X	VK100,	VXANSI		;VT100 WITH EVEN MORE GRAPHICS ("GIGI")
> ;END TRMTYP MACRO



;THE TTY TYPES TABLE

DEFINE	X(NAM,DSP),<SIXBIT\NAM\>

TYPTBL:	TRMTYP			;DEFINE TERMINAL NAMES TABLE
	TYPTLN==.-TYPTBL	;LENGTH OF TYPE TABLE



;THE TTY TYPE DISPATCH TABLE

DEFINE	X(NAM,DSP),<EXP DSP>

TYPVTX:	TRMTYP			;DEFINE TYPE DISPATCH TABLE
	VXTTY			;(--) UNKNOWN TERMINAL (NO CONTROL)
;OUR WORKING TABLE OF TTY CONTROL

U THOME,1			;(00) HOME
U TEREOL,1			;(01) ERASE TO END OF LINE
U TEREOS,1			;(02) ERASE TO END OF SCREEN
U TCUP,1			;(03) CURSOR UP
U TDOWN,1			;(04) CURSOR DOWN
U TRIGHT,1			;(05) CURSOR RIGHT
U TLEFT,1			;(06) CURSOR LEFT
U TDCAD,1			;(07) DIRECT CURSOR ADDRESS PROCESSOR
U TKESC,1			;(10) START OF ESCAPE SEQUENCE
U TKCUP,1			;(11) CURSOR UP "KEY"
U TKDWN,1			;(12) CURSOR DOWN "KEY"
U TKRGT,1			;(13) CURSOR RIGHT "KEY"
U TKLFT,1			;(14) CURSOR LEFT "KEY"
U TCOCH,1			;(15) CONTINUATION CHARACTER

	TTYESC==THOME		;START OF CONTROL TABLE
	TTYESZ==TCOCH		;END OF CONTROL TABLE
;PROTOTYPE CONTROL TABLE FOR HARDCOPY TERMINALS

VCTTY:	BLOCK	1			;(00) HOME
	BLOCK	1			;(01) ERASE TO END OF LINE
	BLOCK	1			;(02) ERASE TO END OF SCREEN
	BLOCK	1			;(03) CURSOR UP
	BLOCK	1			;(04) CURSOR DOWN
	BLOCK	1			;(05) CURSOR RIGHT
	BLOCK	1			;(06) CURSOR LEFT
	BLOCK	1			;(07) DIRECT CURSOR ADDRESS PROCESSOR
	BLOCK	1			;(10) START OF ESCAPE SEQUENCE
	BLOCK	1			;(11) CURSOR UP "KEY"
	BLOCK	1			;(12) CURSOR DOWN "KEY"
	BLOCK	1			;(13) CURSOR RIGHT "KEY"
	BLOCK	1			;(14) CURSOR LEFT "KEY"
	EXP	"!"			;(15) LINE CONTINUATION CHARACTER

;PROTOTYPE CONTROL TABLE FOR VT05'S

VC05:	BYTE(7)	035,177,177,177,177	;(00) HOME
	BYTE(7)	036,177,177,177,177	;(01) ERASE TO END OF LINE
	BYTE(7)	037,177,177,177,177	;(02) ERASE TO END OF SCREEN
	BYTE(7)	032,177,177,177,177	;(03) CURSOR UP
	BYTE(7)	012,000,000,000,000	;(04) CURSOR DOWN
	BYTE(7)	030,000,000,000,000	;(05) CURSOR RIGHT
	BYTE(7)	010,000,000,000,000	;(06) CURSOR LEFT
	IFIW	VT05LN			;(07) DIRECT CURSOR ADDRESS PROCESSOR
	EXP	0			;(10) START OF ESCAPE SEQUENCE
	EXP	032			;(11) CURSOR UP "KEY"
	EXP	013			;(12) CURSOR DOWN "KEY"
	EXP	030			;(13) CURSOR RIGHT "KEY"
	EXP	010			;(14) CURSOR LEFT "KEY"
	EXP	"!"			;(15) CONTINUATION CHARACTER

;PROTOTYPE CONTROL TABLE FOR DEC-STANDARD TERMINALS SANS CURSOR CONTROL (VT50'S)

VCD50:	BYTE(7)	033,"H",000,000,000	;(00) HOME
	BYTE(7)	033,"K",000,000,000	;(01) ERASE TO EOL
	BYTE(7)	033,"J",000,000,000	;(02) ERASE TO EOS
	BYTE(7)	033,"A",000,000,000	;(03) CURSOR UP
	BYTE(7)	033,"B",000,000,000	;(04) CURSOR DOWN
	BYTE(7) 033,"C",000,000,000	;(05) CURSOR RIGHT
	BYTE(7)	033,"D",000,000,000	;(06) CURSOR LEFT
	IFIW	VT50LN			;(07) DCA PROCESSOR
	EXP	.CHESC			;(10) START OF ESCAPE SEQUENCE
	EXP	"A"			;(11) CURSOR UP "KEY"
	EXP	"B"			;(12) CURSOR DOWN "KEY"
	EXP	"C"			;(13) CURSOR RIGHT "KEY"
	EXP	"D"			;(14) CURSOR LEFT "KEY"
	EXP	"!"			;(15) CONTINUATION CHARACTER
;PROTOTYPE CONTROL TABLE FOR DEC-STANDARD TERMINALS (VT52'S)

VCDEC:	BYTE(7)	033,"H",000,000,000	;(00) HOME
	BYTE(7)	033,"K",000,000,000	;(01) ERASE TO EOL
	BYTE(7)	033,"J",000,000,000	;(02) ERASE TO EOS
	BYTE(7)	033,"A",000,000,000	;(03) CURSOR UP
	BYTE(7)	033,"B",000,000,000	;(04) CURSOR DOWN
	BYTE(7) 033,"C",000,000,000	;(05) CURSOR RIGHT
	BYTE(7)	033,"D",000,000,000	;(06) CURSOR LEFT
	IFIW	VT52LN			;(07) DCA PROCESSOR
	EXP	.CHESC			;(10) START OF ESCAPE SEQUENCE
	EXP	"A"			;(11) CURSOR UP "KEY"
	EXP	"B"			;(12) CURSOR DOWN "KEY"
	EXP	"C"			;(13) CURSOR RIGHT "KEY"
	EXP	"D"			;(14) CURSOR LEFT "KEY"
	EXP	"|"			;(15) CONTINUATION CHARACTER

;PROTOTYPE CONTROL TABLE FOR ANSI-STANDARD TERMINALS (VT100)

VCANSI:	BYTE(7)	033,"[","H",000,000	;(00) HOME
	BYTE(7)	033,"[","0","K",000	;(01) ERASE TO EOL
	BYTE(7)	033,"[","0","J",000	;(02) ERASE TO EOS
	BYTE(7)	033,"[","1","A",000	;(03) CURSOR UP
	BYTE(7) 033,"[","1","B",000	;(04) CURSOR DOWN
	BYTE(7) 033,"[","1","C",000	;(05) CURSOR RIGHT
	BYTE(7) 033,"[","1","D",000	;(06) CURSOR LEFT
	IFIW	VTANLN			;(07) DCA PROCESSOR
	EXP	.CHESC			;(10) START OF ESCAPE SEQUENCE
	EXP	"A"			;(11) CURSOR UP "KEY"
	EXP	"B"			;(12) CURSOR DOWN "KEY"
	EXP	"C"			;(13) CURSOR RIGHT "KEY"
	EXP	"D"			;(14) CURSOR LEFT "KEY"
	EXP	"|"			;(15) CONTINUATION CHARACTER
;PSI SERVICE INITIALIZATION

;SETUP PSI SYSTEM

PSIINI:	XMOVEI	T,PSIVEC	;BASE PSI VECTOR
	SKIPE	SECTN		;RUNNING EXTENDED?
	TXO	T,PS.IEA	;YES, WANT "EXTENDED" FORMAT THEN
	PIINI.	T,		;INITIALIZE PSI SYSTEM
	 POPJ	P,		;BLETCH

;BY DEFAULT, ALWAYS GET ^C TRAPPING, SO INCLUDE IT AS PART OF THE
;"GENERIC" PSI SETUP CODE

	XMOVEI	T,CCINT		;CONTROL-C TRAP ROUTINE
	MOVEM	T,PSICCV+.PSVNP	;SET TRAP PC
	MOVX	T,PS.VTO!PS.VDS	;CONTROL-FLAGS: IGNORE FURTHER ^C'S
	MOVEM	T,PSICCV+.PSVFL	;SET FLAGS WORD
	MOVE	T,[PS.FON!PS.FAC+[.PCSTP  ;ENABLE ARG BLOCK FOR ^C TRAP
			XWD	PSICCV-PSIVEC,0	;VECTOR OFFSET
			EXP	0]]		;JUNK WORD
	PISYS.	T,		;ENABLE CONTROL-C TRAPPING
	 POPJ	P,		;JUNK
	JRST	CPOPJ1		;PSI (AND ^C TRAP) SETUP
;CONTROL-C TRAP SERVICE ROUTINE

CCINT:	PUSH	P,A		;SAVE ACCUMULATORS A, AA,  AND B
	PUSH	P,AA		; . . .
	PUSH	P,B		; . . .
	PUSH	P,T		;SAVE
	PUSH	P,TT		; EVEN
	PUSH	P,TT1		;  MORE
	PUSH	P,CH		;   ACS
	PUSHJ	P,TEBURB	;FORCE COMMAND BACKUP UPDATE NOW
	PUSHJ	P,CLREOS	;CLEAR OUT JUNK AT BOTTOM OF SCREEN
	PUSHJ	P,TTYRST	;RESTORE ORIGINAL USER TTY MODES
	PUSHJ	P,ZAPTT		;CLEAR OUT THE TTY
	EXIT	1,		;LET MONITOR HAVE USER

;BACK HERE WHEN USER TYPES CONTINUE

CCONT:	PUSHJ	P,TTOPEN	;RE-OPEN DEVICE TTY:
	PUSHJ	P,GETTYP	;CHECK ON TERMINAL TYPE JUST IN CASE . . .
	PUSHJ	P,TTYGET	;GET TTY MODES (USER MAY HAVE CHANGED THEM)
	PUSHJ	P,TTYSEC	;SETUP OUR TTY MODES
	TXNN	F2,DOING	;EXECUTING A COMMAND?
	SKIPE	COMCNT		;NO, ANY COMMAND CHARACTERS IN YET?
	JRST	CCONT5		;YES TO ONE OF THE ABOVE, JUST RESUME

;HERE WHEN USER ^C'ED FROM COMMAND INPUT WAIT, NO CHARACTERS IN YET

	PUSHJ	P,CLRSCN	;FORCIBLY CLEAR THE WHOLE SCREEN
	XMOVEI	CH,GO		;ADDRESS FROM WHENCE TO RESUME
	MOVEM	CH,PSICCV+.PSVOP;SET FOR DEBRK. TO SEE
	JRST	CCONT8		;AND GO RESTART

;HERE WHEN USER ^C'ED FROM SOMETHING HAPPENING, JUST RESUME

CCONT5:	SETOM	MESFLG		;NOTE THAT SCREEN IS [PROBABLY] TRASHED
	SETZM	WINFLG		;WE WANT IT UPDATED NOW!
	SETZM	VFREEZ		; . . .
CCONT8:	POP	P,CH		;RESTORE
	POP	P,TT1		; SOME
	POP	P,TT		;  MORE
	POP	P,T		;   ACS
	POP	P,B		;RESTORE A, AA, AND B
	POP	P,AA		; . . .
	POP	P,A		; . . .
	DEBRK.			;BACK TO THE OLD GRIND....
	 HALT	GO		;DUH?
	 HALT	GO		;DOUBLE DUH?
	SUBTTL	TERMINAL HANDLING AND I/O ROUTINES

;TTOPEN - OPEN AND INITIALIZE THE TERMINAL I/O CHANNEL

TTOPEN:	OPEN	TTYCHN,TTYBLK	;OPEN DEVICE TTY:
	  JRST	TTOPF1		;OPEN FAILURE? OFF TO A BAD START!
	SETOM	TTSTS		;INITIALLY JUNK STATUS
	MOVEI	T,TTYCHN	;TTY I/O CHANNEL
	DEVTYP	T,		;GET DEVICE TYPE INFORMATION
	  JRST	TTOPF2		;CAN'T FAIL
	LDB	TT,[POINTR T,TY.DEV]  ;GET DEVICE CODE
	CAIE	TT,.TYTTY	;IS TTY: A TRUE TERMINAL?
	  JRST	TTOPF3		;NO, BARF ON USER
	MOVEI	T,TTYCHN	;TTY I/O CHANNEL AGAIN
	IONDX.	T,		;GET OFFICIAL TTY UDX
	  JRST	TTOPF4		;CAN'T FAIL
	MOVEM	T,TTYUDX	;SAVE FOR ASSORTED AND SUNDRY TRMOP.S

;NOW SET UP INPUT BUFFER RING STRUCTURE

	MOVE	A,[TTIBFN,,TTIBSZ+3]  ;TERMINAL INPUT BUFARG
	MOVEI	AA,TTIBF1	;FIRST INPUT BUFFER
	MOVEI	B,TIB		;TERMINAL INPUT BUFFER RING
	PUSHJ	P,SETBF		;INITIALIZE INPUT BUFFER RING
	 HALT	.		;CAN'T HAPPEN

;NOW SET UP OUTPUT BUFFER RING STRUCTURE

	MOVE	A,[TTOBFN,,TTOBSZ+3]  ;TERMINAL OUTPUT BUFARG
	MOVEI	AA,TTOBF1	;FIRST OUTPUT BUFFER
	MOVEI	B,TOB		;OUTPUT RING HEADER
	PUSHJ	P,SETBF		;INITIALIZE OUTPUT BUFFER RING
	 HALT	.		;CAN'T HAPPEN

	POPJ	P,		;TERMINAL CHANNEL ALL SET
;TTOPEN ERRORS

TTOPF1:	OUTSTR	[ASCIZ\? Can't OPEN device TTY:\]
	JRST	TTOPFX		;COMMON ERROR EXIT

TTOPF2:	OUTSTR	[ASCIZ\? DEVTYP failure for TTY channel\]
	JRST	TTOPFX		;COMMON ERROR EXIT

TTOPF3:	OUTSTR	[ASCIZ\? Device TTY: is not a real terminal\]
	JRST	TTOPFX		;COMMON ERROR EXIT

TTOPF4:	OUTSTR	[ASCIZ\? IONDX. failure for TTY channel\]
	JRST	TTOPFX		;COMMON ERROR EXIT

TTOPFX:	OUTSTR	[ASCIZ\
\]				;BLANK LINE BEFORE THE "."
	EXIT	1,		;RETURN TO MONITOR LEVEL
	JRST	TTOPEN		;USER .CONTINUED, SO TRY AGAIN
;ROUTINE TO GET AND REMEMBER VARIOUS TTY SETTINGS, SO IF WE CHANGE THEM,
;WE CAN RESTORE THEM CORRECTLY WHEN TECO EXITS TO THE MONITOR FOR ANY
;REASON

TTYGET:	MOVE	TT,TTYUDX	;GET OUR TTY UDX FOR SUBSEQUENT TRMOP.'S

	MOVEI	T,.TOLCT	;LOWER CASE CONVERSION
	MOVE	B,[2,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;READ LC SETTING
	  SETZ	B,		;ASSUME LOWER CASE TTY
	SKIPN	B		;LOWER CASE CAPABILITY?
	TXOA	F2,LINCHR	;YES, SET FLAG
	TXZ	F2,LINCHR	;NO, CLEAR IT

	MOVEI	T,.TOALT	;READY TO CHECK FOR ALTMODE CONVERSION
	MOVE	B,[2,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;READ ALTMODE CONVERSION SETTING
	  MOVEI	B,0		;ASSUME NOT
	SKIPE	B		;COPY ALTMODE CONVERSION SWITCH TO F2
	TXOA	F2,NOALT
	TXZ	F2,NOALT

	MOVEI	T,.TOTAB	;PREPARE TO READ TAB-SPACES SWITCH
	MOVE	B,[2,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;READ TAB-SPACES SWITCH
	  SETZ	B,		;ASSUME NOT
	MOVEM	B,TTYTAB	;REMEMBER TAB SWITCH SETTING

	MOVEI	T,.TONFC	;PREPARE TO READ FREE CRLF SWITCH
	MOVE	B,[2,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;READ CRLF SWITCH
	  SETZ	B,		;ASSUME FREE CRLF
	MOVEM	B,TTYFCR	;SAVE CURRENT FREE CRLF SETTING

	MOVEI	T,.TOBLK	;PREPARE TO READ TTY BLANK
	MOVE	B,[2,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;READ CRLF SWITCH
	 SETZ	B,		;ASSUME TTY NO BLANK SUPPRESS
	MOVEM	B,TTYBLN	;SAVE CURRENT TTY BLANK

	MOVEI	T,.TODEM	;PREPARE TO READ DEFERRED ECHO MODE
	MOVE	B,[2,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;READ DEFERRED ECHO SETTING
	  SETZ	B,		;ASSUME IMMEDIATE ECHO
	MOVEM	B,TTYDEM	;SAVE CURRENT DEFERRED ECHO MODE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

	MOVEI	T,.TOWID	;PREPARE TO READ TTY WIDTH
	MOVE	B,[2,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;READ TTY WIDTH
	  MOVEI	B,^D80		;ASSUME VT52-CLASS WIDTH
	CAILE	B,TTWMAX	;CAN WE HANDLE IT?
	MOVEI	B,TTWMAX	;NO, USE MOST WE SUPPORT
	SUBI	B,1		;(WE START AT 0)
	MOVEM	B,SWIDTH	;SET SCREEN WIDTH

	MOVEI	T,.TOSTO	;PREPARE TO READ TERMINAL STOP
	MOVE	B,[2,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;READ TERMINAL [NO] STOP
	  JRST	TTYGE5		;FALL BACK TO TERMINAL PAGE
	MOVEM	B,TTYSTO	;REMEMBER USER'S TERMINAL [NO] STOP SETTING

	MOVEI	T,.TOLNB	;PREPARE TO READ TERMINAL LENGTH
	MOVE	B,[2,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;READ TERMINAL "FORMS" LENGTH
	  JRST	TTYGE5		;ASSUME NOT YET IMPLEMENTED
	JUMPN	B,TTYGE7	;USE LENGTH IF ANY IS SET
	MOVEI	T,.TOSSZ	;PREPARE TO READ STOP SIZE
	MOVE	B,[2,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;READ STOP SIZE
	  JRST	TTYGE5		;ASSUME NOT YET IMPLEMENTED
	JUMPN	B,TTYGE7	;USE STOP SIZE IF ANY IS SET

TTYGE5:	MOVEI	T,.TOPSZ	;PREPARE TO READ PAGE SIZE
	MOVE	B,[2,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;READ PAGE SIZE
	  SETZ	B,		;ASSUME PAGE 0
	MOVEM	B,TTYPSZ	;SAVE CURRENT USER'S PAGE SIZE
TTYGE6:	JUMPN	B,TTYGE7	;USE KNOWN PAGE SIZE
	MOVE	B,SCTYPE	;GET TTY TYPE
	MOVE	B,[DEC 63,20,12,24,24](B)  ;HYPOTHESIZE A LENGTH
TTYGE7:	CAILE	B,TTLMAX	;CAN WE HANDLE IT?
	MOVEI	B,TTLMAX	;NO, THE MOST WE CAN HANDLE
	MOVEM	B,SSIZE		;SAVE SCREEN "SIZE"
	MOVE	T,B		;NEED TWO CONTIGUOUS REGISTERS
	IMULI	T,^D100		;TO CALCULATE PERCENTAGE OF SCREEN
	IDIVI	T,^D120		;TO USE FOR TEXT (20 OUT OF 24 LINES)
	MOVEM	T,DLENTH	;SET LENGTH OF TEXT AREA
	MOVEM	T,SLENTH	; . . .
	IDIVI	T,3		;PREFERRED OFFSET FOR CURSOR
	MOVEM	T,CLENTH	;SET FOR OTHERS

	POPJ	P,		;WE HAVE READ ALL PERTINENT TTY INFO
;ROUTINE TO SET VARIOUS TTY MODES FROM OURTAB, OURFCR ETC.
;
;ENTER AT TTYSEC TO CLEAR THE TERMINAL INPUT STREAM COMMAND WHICH
;STARTED US UP (E.G., REENTER COMMAND) AND WHICH WOULD OTHERWISE PREVENT
;THE DISPLA ROUTINE FROM UPDATING THE SCREEN (IT WOULD THINK IT HAD
;TYPEAHEAD (THE MONITOR COMMAND) AND TERMINATE).

TTYSEC:	MOVEI	T,.TOSIP	;SKIP-IF-INPUT FUNCTION
	MOVE	TT,TTYUDX	;FOR OUR COMMAND TERMINAL
	MOVE	B,[2,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;NUDGE TERMINAL AND CLEAR COUNTERS
	 JFCL			;DON'T CARE, AS LONG AS DISPLA DOES OUTPUT

TTYSET:	TDZA	A,A		;SETUP FROM OUR MODES
TTYRST:	MOVEI	A,1		;RESET OLD TERMINAL MODES
	SKIPN	SCTYPE		;ONLY MUCK WITH USER TTY IF VIDEO SCREENING
	POPJ	P,		;HARDCOPY, LEAVE IT ALONE
	MOVE	TT,TTYUDX	;SET TTY UDX FOR TRMOP.S BELOW

	MOVEI	T,.TOTAB+.TOSET	;PREPARE TO SET TAB CONVERSION
	MOVE	TT1,OURTAB(A)	;GET TAB SETTING
	MOVE	B,[3,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;SET UP TTY TAB-SPACES SWITCH
	  JFCL			;IGNORE FAILURE

	MOVEI	T,.TONFC+.TOSET	;PREPARE TO SET FREE CRLF SETTING
	MOVE	TT1,OURFCR(A)	;GET STATE TO SET
	MOVE	B,[3,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;SET UP FREE CRLF SWITCH
	  JFCL			;ERROR IS OK

	MOVEI	T,.TOBLK+.TOSET	;PREPARE TO SET TTY NO BLANK SUPPRESSION
	MOVE	TT1,OURBLN(A)	;GET STATE TO SET
	MOVE	B,[3,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;SET TTY NO BLANK SUPPRESSION
	  JFCL			;ERROR IS OK

	MOVEI	T,.TODEM+.TOSET	;PREPARE TO SET DEFERRED ECHO MODE
	MOVE	TT1,OURDEM(A)	;GET STATE TO SET
	MOVE	B,[3,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;SET UP DEFERRED ECHO MODE
	  JFCL			;ERROR IS OK

	MOVEI	T,.TOSTO+.TOSET	;PREPARE TO SET STOP
	MOVE	TT1,OURSTO(A)	;GET STATE TO SET
	MOVE	B,[3,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;SET TERMINAL [NO] STOP
	  JRST	TTYSE5		;FAILED, USE TERMINAL PAGE INSTEAD
	JRST	TTYSE7		;DO NOT USE PAGE TRMOP.!

TTYSE5:	MOVEI	T,.TOPSZ+.TOSET	;PREPARE TO SET PAGE SIZE 0
	MOVE	TT1,OURPSZ(A)	;GET STATE TO SET
	MOVE	B,[3,,T]	;TRMOP. ARG POINTER TO
	TRMOP.	B,		;SET UP PAGE SIZE 0
	  JFCL			;ERROR IS OK

TTYSE7:	POPJ	P,		;USER'S TERMINAL HAS BEEN [RE]SET
;*** DO NOT SEPARATE OURFCR FROM TTYFCR, NOR OURTAB FROM TTYTAB ***
U OURFCR,1			;WHAT TECO'S CRLF BIT IS
U TTYFCR,1			;HOLDS CRLF BIT AS EXISTING THE LAST
				;TIME WE WENT FROM MONITOR TO TECO
U OURTAB,1			;WHAT TECO'S TAB-SPACE BIT IS
U TTYTAB,1			;SAME FOR TAB-SPACES BIT

U OURBLN,1			;WHAT TECO'S BLANK SUPRESSION IS
U TTYBLN,1			;AND USER'S SELECTION

U OURDEM,1			;WHAT TECO'S DEFERRED ECHO MODE IS
U TTYDEM,1			;AND USER'S SELECTION

U OURPSZ,1			;TECO'S PAGE SIZE
U TTYPSZ,1			;ORIGINAL PAGE SIZE

U OURSTO,1			;TECO'S [NO] STOP
U TTYSTO,1			;ORIGINAL [NO] STOP
;ROUTINE TO RETURN NON-NULL TTY CHARACTER IN CH.
;CALL	PUSHJ PDP,TYI
;	RETURN

TYI:	TXZE	FF,TYOF		;NEED A TYO?
	PUSHJ	P,TYOOUT	;YES. DO SO.
TYI0:	SKIPL	CH,SCH		;IF SAVED CHARACTER IN SCH
	JRST	TYIB4		;USE IT INSTEAD OF INPUTTING ONE FROM TTY
	TXNE	FF,CFOF		;READING FROM COMMAND FILE?
	JRST	TYICF		;YES, DIFFERENT BUFFER(S)
	SOSG	TIB+.BFCTR	;CHARS IN NORMAL MODE?
	PUSHJ	P,TYIIN		;NONE LEFT, GET ANOTHER BUFFERFUL
	ILDB	CH,TIB+.BFPTR	;YES. GET ONE
	JUMPE	CH,TYI0		;FLUSH NULLS
TYI3:	PUSHJ	P,TEBCHR	;SAVE COMMAND CHARACTER IN CRASH RECOVERY FILE
TYI4:	TXZ	FF,TIBKA	;CLEAR CHARACTER MODE
	TXZN	FF,TINEC	;NO ECHO?
	SKIPE	CMFECH		;OR SUPPRESSING COMMAND FILE ECHO?
	PJRST	ALTLIN		;YES, DON'T DO ANY SPECIAL CHARACTER STUFF
				; 1) ECHO <BEL> AS ^G
				; 2) COUNT SCREEN SCROLLING
	CAIE	CH,.CHBEL	;NO, USER TYPE A <BEL>?
	JRST	TYI4NG		;NO, NO ECHO WORRIES THEN
	MOVE	CH,CHTBL(CH)	;YES, GET <BEL> ECHO CONTROL
	TXZ	CH,EC$SLF	;THE MONITOR ALREADY ECHOED THIS WAY
	PJRST	TYIEC0		;SO JUST ECHO IT FOR HIM AS ^G

TYI4NG:	CAIL	CH," "		;CONTROL CHARACTER?
	JRST	ALTLIN		;NO (BUT WATCH FOR OLDE ALTMODES)
	CAIL	CH,.CHLFD	;VERTICAL MOTION CHARACTER?
	CAILE	CH,.CHFFD	; . . .
	SKIPA	CH,CHTBL(CH)	;NO, GET ECHO CONTROL BITS
	JRST	CNTLF		;YES, COUNT ANY EFFECTS ON SCREEN
	TXNE	CH,EC$CRL	;THIS CHARACTER ECHO WITH <CR><LF>?
	JRST	TYI5C		;YES, ACCOUNT FOR POSSIBLE SCROLLING
	ANDI	CH,177		;NO, REDUCE TO JUST ASCII CHARACTER
	POPJ	P,		;AND GIVE IT TO CALLER

TYI5C:	PUSH	P,CH		;SAVE THE BITS/CHARACTER
	MOVEI	CH,.CHLFD	;PRETEND A LINE FEED
	PUSHJ	P,CNTLF		;NOTE SCREEN MAY HAVE SCROLLED
	POP	P,CH		;RESTORE THE BITS/CHARACTER
	ANDI	CH,177		;AND REDUCE TO JUST CHARACTER
	POPJ	P,		;AND GIVE IT TO CALLER
TYIINZ:	CLOSE	TTYCHN,		;CLEAR EOF (^Z)
TYIIN:	MOVEI	CH,TTYIOS	;BASIC TTY STATUS
	TXNE	FF,TIBKA	;WANT SINGLE CHARACTER?
	IORI	CH,IO.BKA	;YEAH
	TXNE	FF,TINEC	;WANT TO SUPPRESS ECHO?
	IORI	CH,IO.SUP	;YEAH
	CAME	CH,TTSTS	;SAME IOS AS LAST PASS THROUGH HERE?
	SETSTS	TTYCHN,(CH)	;NO, CHANGE TO NEW TERMINAL MODE
	MOVEM	CH,TTSTS	;SAVE NEW LAST STATUS

IFN	RUN603,<
	TXNE	CH,IO.BKA	;WANT CHARACTER MODE HERE?
	JRST	[INCHRW	CH		;YES, PICK UP SINGLE CHARACTER
		JRST	CPOPJ1]		;AND SKIP TYI0'S "ILDB"
> ;END IFN RUN603

	IN	TTYCHN,		;ASK FOR INPUT
	POPJ	P,		;GOT IT, RETURN TO READ IT
	STATZ	TTYCHN,IO.EOF	;END OF FILE?
	JRST	TYIINZ		;GO CLEAR EOF
	OUTSTR	[ASCIZ\? I/O error reading from command terminal\]
	EXIT			;AND THAT IS THE END OF THAT
TYIB4:	SETOM	SCH		;SO CHARACTER IS INPUT NEXT TIME
	POPJ	P,

;CONVERT 175 & 176 TO ALTMODE (033) UNLESS TTY NOALT IS ON

ALTLIN:	CAIL	CH,175		;OLD ALTMODE?
	CAILE	CH,176
	POPJ	P,		;NO
	TXNN	F2,NOALT	;TEST TTY NOALT BIT
ALTX:	MOVEI	CH,.CHESC	; CONVERT TO 033
	POPJ	P,

;CONVERT 175 & 176 TO ALTMODE (033) IF EO = 1

ALTEO:	CAIE	CH,175		;OLD ALTMODE?
	CAIN	CH,176
	CHKEO	EO21,ALTX	;RUNNING OLD MACRO? IF SO, CONVERT
	POPJ	P,		;NO, 175=RIGHT BRACE, 176=TILDE
;HERE TO READ CHARACTER FROM COMMAND FILE RATHER THAN TTY:

TYICF:	SOSL	CMFIBH+.BFCTR	;ANY CHARACTERS LEFT?
	JRST	TYICF3		;YES, KEEP READING THEM
	PUSHJ	P,TYICN		;NO, READ ANOTHER BUFFER
	  SKIPA	CH,COMCNT	;EOF, GET COMMAND CHARACTER COUNT
	JRST	TYICF		;GOT MORE CHARACTERS, COUNT EM DOWN
	SKIPE	EQM		;IF REQUEST FROM A MACRO, OK
	JRST	TYI		; (MUST BE FROM CMCCT)
	JUMPE	CH,GO		;NO, IF NO OUTSTANDING COMMANDS, RESTART
				; AND REFRESH SCREEN AS NEEDED
	$WARN	(EOC,,<End of command file with unterminated commands pending>)
	JRST	TYI		;AND GET REGULAR TTY COMMANDS

TYICF3:	ILDB	CH,CMFIBH+.BFPTR;YES, READ NEXT COMMAND FILE CHARACTER
	AOS	CMFCTR		;BUMP CHARACTER COUNTER
	JUMPE	CH,TYICF	;DISCARD NULLS
	SKIPN	CMFECH		;USER REQUEST ECHOING OF THE COMMAND FILE?
	CAIN	CH,.CHDEL	;YES, BUT DON'T ECHO RUBOUTS
	JRST	TYI4		;RETURN COMMAND CHARACTER (BUT DON'T WRITE
				; IT IN CRASH RECOVERY FILE!)
	TXNE	FF,TINEC	;SUPPRESSING INPUT ECHO?
	JRST	TYI4		;YES, IF IT NEEDS ECHOING, IT WILL BE ECHOED LATER
	PUSH	P,A		;SAVE SOME ACS
	PUSH	P,AA		; THAT TYOM KRUMPS UPON
	CAIN	CH,.CHLFD	;A <LF>???
	SOS	CURLIN		;YES, CNTLF GETS CALLED BY TYI AND TYO . . .
	PUSHJ	P,TYOM		;"ECHO" THE COMMAND FILE CHARACTER
	POP	P,AA		;RESTORE POSSIBLE TROUNCED ACS
	POP	P,A		; . . .
	JRST	TYI4		;PROCESS COMMAND CHARACTER NORMALLY
;READ ANOTHER BUFFER, POPPING UP TO PREVIOUS FILE ON EOF

TYICN:	IN	CMFCHN,		;READ NEXT BUFFER
	JRST	CPOPJ1		;RETURN WITH CHARACTERS
	STATO	CMFCHN,IO.EOF	;END OF FILE?
	JRST	TYICE2		;NO, I/O ERROR, GO COMPLAIN
	TXZ	FF,CFOF		;NO MORE COMMAND FILE (PROBABLY)
	RELEAS	CMFCHN,		;LET GO OF USED-UP FILE
	SOSG	CMFLVL		;DECREMENT NESTING COUNT
	JRST	TYICNZ		;ALL FILES USED UP, BACK TO TTY:

;HERE ON EOF FROM COMMAND FILE NESTED WITHIN ANOTHER COMMAND FILE,
;"POP" BACK TO PREVIOUS COMMAND FILE AND CONTINUE PROCESSING

	PUSH	P,A		;NEED A COUPLA ACS HERE
	PUSH	P,AA		; . . .
	MOVE	A,CMFPDP	;COMMAND FILE STACK POINTER
	SUBI	A,CMFLEN	;"POP" THE POINTER
	MOVEM	A,CMFPDP	;SAVE NEW POINTER FOR NEXT TIME
	HRLZ	A,A		;LEFT HALF OF BLT POINTER
	HRRI	A,CMFBLK	;POINT TO "ACTIVE" COMMAND FILE AREA
	BLT	A,CMFBLK+CMFLEN-1  ;"POP" PREVIOUS COMMAND FILE SPECS
	MOVE	A,[CMFBLK,,COMBLK]  ;BLT POINTER TO
	BLT	A,COMBLK+COMBLN-1  ;SET UP SPEC IN FILE SPEC AREA
	PUSHJ	P,FILALT	;GO SETUP OPEN AND LOOKUP BLOCKS
	PUSHJ	P,CMFOPN	;OPEN AND SET UP FOR I/O
	MOVE	A,CMFCTR	;CHAR POSITION IN FILE WE WERE LAST AT
	IDIVI	A,<BLKSIZ*5>	;A:=BLOCK NUMBER IN FILE
	USETI	CMFCHN,1(A)	;SET TO READ THAT PARTICULAR BLOCK
	IN	CMFCHN,		;AND BRING IT IN
	CAIA			;GOOD
	  JRST	TYICE2		;CAN'T GET EOF SO MUST BE ERROR
	MOVN	AA,AA		;DON'T HAVE SUB AC FROM MEM
	ADDM	AA,CMFIBH+.BFCTR;SO DO ADD NEGATIVE INSTEAD
	IBP	CMFIBH+.BFPTR	;BUMP BYTE POINTER PAST ALREADY READ CHARS
	AOJL	AA,.-1		;LOOP FOR ALL OF THEM
				; (CAN'T DO ADJBP SINCE IT DOESN'T DO THE
				;  RIGHT THING IN THIS CASE)
	TXO	FF,CFOF		;COMMAND FILE OPEN AGAIN
	POP	P,AA		;RESTORE ACS USED UP
	POP	P,A		; . . .
	JRST	CPOPJ1		;BACK TO TYICF TO READ A CHARACTER
;COMMAND FILE I/O ERROR ROUTINE(S)

TYICE2:	GETSTS	CMFCHN,B	;I/O STATUS IN B FOR ERRP
	PUSHJ	P,TYICNR	;ABORT AND CLEAR COMMAND FILE
	$FATAL (INP,,<Input error 11 on file 09>)

;CLEAR COMMAND FILE PROCESSING

TYICNR:	RELEAS	CMFCHN,		;TOSS OUT FILE
TYICNZ:	SETZM	CMFLVL		;NO COMMAND FILES NESTED
	SETZM	CMFECH		;NO LONGER SUPPRESSING TYI ECHO
	SETZM	CMFTYO		;NOR GENERAL PROGRAM OUTPUT
	SETZM	CMFPDP		;NO MORE SPECS ON THE STACK
	TXZ	FF,CFOF		;COMMAND FILE PROCESSING IS DEAD
;RDH	SETOM	MESFLG		;SCREEN NEEDS REFRESHING
	POPJ	P,		;ET C'EST CA.
;TYIEC  --  "ECHO" A COMMAND CHARACTER
;CALL IS:
;
;	MOVX	CH,<CHAR>
;	PUSHJ	P,TYIEC
;	RETURN
;
;WHERE <CHAR> IS THE 7-BIT ASCII COMMAND CHARACTER TO BE ECHOED JUST AS
;WOULD THE MONITOR.
;
;PRESERVES ALL ACS.

TYIEC:	CAIN	CH,.CHDEL	;A <DEL>
	IORI	CH,1000		;YES
	CAIGE	CH," "		;NORMAL PRINTING ASCII?
	SKIPA	CH,CHTBL(CH)	;NO, CONTROL, FETCH ECHO BITS
	TXO	CH,EC$SLF	;YES, JUST ECHO AS SELF
	TRZE	CH,1000		;WAS IT A <DEL>?
	ANDI	CH,177		;YES, RUBOUTS DON'T ECHO AT ALL

;NOW ECHO THE CHARACTER TO THE TERMINAL AS WOULD THE MONITOR

TYIEC0:	PUSH	P,CH		;SAVE THEM
	TXNN	CH,EC$UPA	;ECHO IN ^X FORM?
	JRST	TYIEC2		;NO
	MOVEI	CH,"^"		;YES, FIRST THE UP-ARROW
	PUSHJ	P,TYOM		;OUTPUT IT
	HRRZ	CH,0(P)		;THE CHARACTER AGAIN
	TRO	CH,100		;ASCIIIZE IT
	PUSHJ	P,TYOM		;AND OUTPUT IT TOO
	MOVE	CH,0(P)		;CHARACTER AND FLAGS AGAIN
TYIEC2:	TXNN	CH,EC$SLF	;ECHO LITERALLY
	JRST	TYIEC3		;NO
	ANDI	CH,177		;YES
	PUSHJ	P,TYOM		;OUTPUT CHARACTER
	MOVE	CH,0(P)		;RESTORE FLAGS AND CHARACTER
TYIEC3:	TXNN	CH,EC$DLR	;ECHO AS "$" (I.E., ALTMODE)
	JRST	TYIEC4		;NO
	MOVEI	CH,"$"		;YES
	PUSHJ	P,TYOM		;SO OUTPUT THE DOLLAR SIGN
	MOVE	CH,0(P)		;RESTORE FLAGS AND CHARACTER
TYIEC4:	TXNN	CH,EC$CRL	;CHARACTER GET <CR><LF> APPENDED?
	JRST	TYIEC5		;NO
	MOVEI	CH,.CHCRT	;YES, FIRST THE <CR>
	PUSHJ	P,TYOM		;OUTPUT IT
	MOVEI	CH,.CHLFD	;THEN THE <LF>
	PUSHJ	P,TYOM		;OUTPUT IT TOO
TYIEC5:	POP	P,CH		;RESTORE STACK AND CHARACTER
	ANDI	CH,177		;AND NOTHING BUT THE CHARACTER
	POPJ	P,		;RETURN
;THE CHARACTER TABLE

CHTBL:	EC$UPA+.CHNUL			;000  NUL
	EC$UPA+.CHCNA			;001  ^A
	EC$UPA+.CHCNB			;002  ^B
	EC$UPA+.CHCNC			;003  ^C
	EC$UPA+.CHCND			;004  ^D
	EC$UPA+.CHCNE			;005  ^E
	EC$UPA+.CHCNF			;006  ^F
	EC$UPA+EC$SLF+.CHBEL		;007  ^G (BELL)
	EC$UPA+.CHCNH			;010  ^H (BACKSPACE)
	EC$SLF+.CHTAB			;011  ^I (TAB)
	EC$SLF+.CHLFD			;012  ^J (LINE FEED)
	EC$SLF+.CHVTB			;013  ^K (VERTICAL TAB)
	EC$SLF+.CHFFD			;014  ^L (FORM FEED)
	EC$SLF+.CHCRT			;015  ^M (CARRIAGE RETURN)
	EC$UPA+.CHCNN			;016  ^N
	EC$UPA!EC$CRL+.CHCNO		;017  ^O
	EC$UPA+.CHCNP			;020  ^P
	.CHCNQ				;021  ^Q (XON)
	EC$UPA+.CHCNR			;022  ^R
	.CHCNS				;023  ^S (XOFF)
	.CHCNT				;024  ^T
	EC$UPA+.CHCNU			;025  ^U
	EC$UPA+.CHCNV			;026  ^V
	EC$UPA+.CHCNW			;027  ^W
	EC$UPA+.CHCNX			;030  ^X
	EC$UPA+.CHCNY			;031  ^Y
	EC$UPA!EC$CRL+.CHCNZ		;032  ^Z (EOF)
	EC$DLR+.CHESC			;033  ^[ (ESCAPE)
	EC$UPA+.CHCBS			;034  ^\
	EC$UPA+.CHCRB			;035  ^]
	EC$UPA+.CHCCF			;036  ^^
	EC$UPA+.CHCUN			;037  ^_
;HERE WHEN A LINE FEED PASSES THE SCREEN, TO NOTE WHEN SCROLLING OCCURS

CNTLF:	CAIL	CH,.CHLFD	;VERTICAL CHARACTER MOTION?
	CAILE	CH,.CHFFD	; . . .
	POPJ	P,		;NO
	PUSH	P,CH		;YES, SAVE IT
	CAIN	CH,.CHLFD	;<LF>?
	MOVEI	CH,1		;YES
	CAIN	CH,.CHVTB	;<VT>?
	MOVEI	CH,4		;YES
	CAIN	CH,.CHFFD	;<FF>?
	MOVEI	CH,10		;YES
	PUSH	P,CH		;SAVE COUNT OF LINES THIS CHARACTER IS WORTH
CNTLF2:	AOS	CH,CURLIN	;COUNT CURSOR MOVEMENT DOWNWARDS
	SUB	CH,SSIZE	;FORCED SCREEN TO SCROLL YET?
	JUMPL	CH,CNTLF8	;NO
	SETOM	SCRLED		;NOTE THE SCREEN HAS ACTUALLY SCROLLED
	MOVE	CH,[WINDOW+WINDEX,,WINDOW]  ;YES, SCREEN SCROLLED A LINE
	BLT	CH,WINDOW+WINTOP-WINDEX-1  ;SO SCROLL OUR COPY TOO
	SETOM	WINDOW+WINTOP-WINDEX  ;LAST LINE NOW BLANK
	MOVE	CH,[WINDOW+WINTOP-WINDEX,,WINDOW+WINTOP-WINDEX+1]
	BLT	CH,WINDOW+WINTOP-1  ;SO BLANK OUR COPY TOO
	PUSH	P,A		;NEED
	PUSH	P,AA		; TO
	PUSH	P,B		;  SAVE
	PUSH	P,C		;   LOTS
	PUSH	P,D		;    OF
	PUSH	P,E		;     ACS
	PUSH	P,T		;      .
	PUSH	P,TT		;       .
	PUSH	P,TT1		;        .
	PUSH	P,I		;         .
	PUSH	P,OU		;          .
	DMOVE	A,SCRNA		;SCREEN BASE
	MOVEI	D,1		;WANT TO MOVE DOWN A LINE
	PUSHJ	P,DISMV		;CALL THE MAGIC ROUTINE
	DMOVEM	A,SCRNA		;SET FOR NEXT CALL TO WINFIL
	POP	P,OU		;          .
	POP	P,I		;         .
	POP	P,TT1		;        .
	POP	P,TT		;       .
	POP	P,T		;      .
	POP	P,E		;     NEED
	POP	P,D		;    TO
	POP	P,C		;   RESTORE
	POP	P,B		;  LOTS
	POP	P,AA		; OF
	POP	P,A		;ACS
	SOS	CURLIN		;BACKUP CURSOR TO LAST LINE AGAIN
CNTLF8:	SOSLE	(P)		;NEED TO ACCOUNT FOR MORE LINES?
	JRST	CNTLF2		;YES, GO BACK AND DO IT AGAIN
	POP	P,CH		;NO, JUNK COUNT WORD
	POP	P,CH		;RESTORE CALLER'S CHARACTER
	POPJ	P,		;AND RETURN TO WHOMEVER
U SCH,1				;HOLDS SAVED CHARACTER TO BE "INPUT" NEXT
				; INSTEAD OF TYPED IN ONE
U SCRLED,1			;.LT. 0 IF SCREEN SCROLLED DUE TO TYPEIN
U COLUMN,1			;PRINTING COLUMN
U CURLIN,1			;DISPLAY CURSOR IS CURRENTLY ON THIS LINE #
;ROUTINE TO TYPE A CHARACTER.
;CALL AS FOLLOWS:
;FOR TYPING TEXT:		FOR TYPING MESSAGES:
;	MOVE CH,CHARACTER		MOVE CH,CHARACTER
;	PUSHJ P,TYO			PUSHJ P,TYOM
;	RETURN				RETURN
;UNLESS TYOCTF IS TRUE, CONTROL CHARACTERS ARE TYPED WITH "^"
;FOLLOWED BY THE CORRESPONDING PRINTING CHARACTER.
;
;USES ACS A AND AA

TYOS:	TXOA	F2,TYSPCL	;TYPE <CR>, ETC INSTEAD OF PRINTER CONTROLS
TYOM:	TXZ	F2,TYSPCL	;CLR SPECIAL TYPEOUT FLAG
	TXOA	F2,TYMSGF	;SET NO-CASE-FLAGGING FLAG
TYO:	TXZ	F2,TYMSGF+TYSPCL;CLR NO-CASE-FLAGGING FLAG & SPECIAL FLAG
	PUSHJ	P,ALTEO		;CHECK FOR FUNNY ALTMODES
	TXNE	F2,TYSPCL	;ARE WE TYPING <ALT>, <CR> ETC. ??
	JRST	TYOSP		;YES, LOOK FOR SPECIAL CASES
TYO2:	CAIN	CH,.CHTAB	;IS IT A TAB ??
	JRST	TYOTAB		;YES
	CAIN	CH,.CHLFD	;LINEFEED??
	JRST	TYOLF		;YES
	CAIN	CH,.CHCRT	;CARRIAGE RETURN ??
	JRST	TYOCR		;YES
	CAIN	CH,.CHESC	;ESCAPE??
	JRST	TYOESC		;YES
	CAIE	CH,.CHFFD	;<FF>?
	CAIN	CH,.CHBEL	;A <BEL>?
	JRST	TYOBEL		;YES, JUST OUTPUT IT
	CAIN	CH,.CHCNH	;<BS>?
	JRST	TYOBS		;YES
	CAIG	CH,37		;SKIP IF NON-CONTROL
	JRST	TYOCT		;HANDLE NON-FORMATTING CONTROLS
	PUSHJ	P,SFLAGC	;SKIP IF CHARACTER WRONG CASE
	CAIA			;IT'S THE CORRECT CASE
	JRST	TYOFLG		;FLAG WRONG CASE CHARACTERS
TYOCH:	AOS	COLUMN		;YES, SO REMEMBER TO INCREMENT IT FOR CHARACTER
	JRST	TYOA		;FINALLY....GO TYPE THE BLASTED CHARACTER !!!
TYOBEL:	TXNN	F2,TYMSGF	;MESSAGE OR TEXT?
TYOCT:	TXNE	FF,TYOCTF	;WANT TO OUTPUT CONTROL LITERALLY?
	JRST	TYOA		;TYPE CONTROL CHARACTER LITERALLY
	PUSH	P,CH		;SAVE CONTROL-CHARACTER TO BE TYPED
	MOVEI	CH,"^"		;GET UPARROW
	PUSHJ	P,TYO		;TYPE IT
	MOVE	CH,(P)		;GET CONTROL CHARACTER, BUT LEAVE IT ON THE STACK
	ADDI	CH,100		;MAKE IT CORRESPONDING NON-CONTROL
	JRST	TYOFL5		;TYPE X OF ^X


TYOFLG:	PUSH	P,CH		;SAVE CHARACTER
	MOVEI	CH,CFLAG	;GET WRONG CASE SYMBOL
	PUSHJ	P,TYO		;TYPE WRONG CASE FLAG
	MOVE	CH,(P)		;GET CHARACTER ORIGINALLY TO BE PRINTED
TYOFL5:	PUSH	P,TYCASF	;SAVE CURRENT CASE SWITCH
	SETOM	TYCASF		;SET CASE TO 0 SO NO FLAGGING
	PUSHJ	P,TYO		;OF X PART OF ^X
	POP	P,TYCASF	;RESTORE CASE SWITCH
	POP	P,CH		;AND ORIGINAL CONTROL CHARACTER
	POPJ	P,		;AND RETURN


TYOBS:	SKIPN	SCTYPE		;ON VIDEO SCREEN?
	JRST	TYOCT		;NO, RANDOM CONTROL CHARACTER
	SOSGE	COLUMN		;BACKSPACE MOVES CURSOR BACKWARDS
	SETZM	COLUMN		;***KROCK
	JRST	TYOA		;OUTPUT THE CHARACTER WITHOUT FURTHER ADO

TYOTAB:	MOVE	CH,COLUMN	;GET CURRENT COLUMN COUNT
;RDH	CAML	CH,SWIDTH	;ARE WE AT RIGHT MARGIN?
;RDH	PUSHJ	P,CRR		;YES, SO GO TO NEXT LINE
;RDH	MOVE	CH,COLUMN	;GET CURRENT COLUMN COUNT
	ADDI	CH,8		;ADD 8 TO IT FOR TAB COUNT
	TRZ	CH,7		;BUT JUST GO TO NEXT MULTIPLE OF 8
	SUB	CH,COLUMN	;CH:=COUNT OF POSITIONS TO NEXT TAB STOP
	ADDM	CH,COLUMN	;UPDATE COLUMN POSITION COUNTER NOW
	PUSH	P,CH		;SAVE COUNT
	MOVEI	CH," "		;GET TAB SIMULATOR CHARACTER (SPACE)
	PUSHJ	P,TYOA		;OUTPUT A SPACE (ERASING SCREEN SLOT)
	SOSLE	(P)		;COUNT IT DOWN
	JRST	.-2		;FILL ENTIRE TAB SLOT
	POP	P,CH		;RESTORE STACK
	MOVEI	CH,.CHTAB	;RETURN WHAT WE WERE CALLED WITH
	POPJ	P,		;RETURN TO CALLER

TYOCR:	SETZM	COLUMN		;SET COLUMN TO 0 BECAUSE CR GOES TO LEFT MARGIN
	MOVEI	CH,.CHCRT	;REMEMBER WE STARTED WITH CR
	JRST	TYOA		;TYPE CARRIAGE RETURN
TYOESC:	MOVEI	CH,"$"		;ALTMODE PRINTS AS DOLLAR SIGN
	PUSHJ	P,TYO		;TYPE DOLLAR SIGN
	MOVEI	CH,.CHESC	;RESTORE CH AS ESCAPE
	POPJ	P,

;HERE TO TYPE OUT CHARACTERS IN THE FORM <ESC>, ETC.

TYOSP:	PUSH	P,A		;SAVE A
	PUSH	P,CH		;AND CH TOO
	MOVEI	A,TSPTBL	;SPECIAL CHARACTER-NAMES TABLE
TYOSP2:	LDB	CH,[POINT 7,(A),35]  ;LOOK AT TABLE ENTRY
	JUMPE	CH,TYOSP9	;NOT A SPECIAL CHARACTER
	CAME	CH,(P)		;SPECIAL CASE CHARACTER?
	AOJA	A,TYOSP2	;NOT THIS ONE, LOOK AT REST OF THE TABLE
	MOVEI	CH,"<"		;YES, START OF SPECIAL TYPEOUT
	PUSHJ	P,TYOCH		;OUTPUT CHARACTER
	TLOA	A,(POINT 7,)	;MAKE BYTE POINTER TO SPECIAL TYPEOUT
TYOSP5:	PUSHJ	P,TYOCH		;OUTPUT ANOTHER CHARACTER
	ILDB	CH,A		;FETCH NEXT FUNNY CHARACTER
	JUMPN	CH,TYOSP5	;AND TYPE IT OUT
	MOVEI	CH,">"		;END OF SPECIAL CASE NAME
	PUSHJ	P,TYOCH		;TYPE IT OUT
	POP	P,CH		;RESTORE REAL CHARACTER
	POP	P,A		;AND SCRATCH AC USED
	POPJ	P,		;RETURN TO TYOS CALLER

TYOSP9:	POP	P,CH		;RESTORE CHARACTER
	POP	P,A		;AND SCRATCH AC TROUNCED
	JRST	TYO2		;TYPE OUT NORMALLY

;THE SPECIAL NAME TABLE FOR CHARACTERS

TSPTBL:	<ASCII	"BEL"> + .CHBEL	;^G = <BEL>
	<ASCII	"TAB"> + .CHTAB	;^I = <TAB>
	<ASCII	"LF">  + .CHLFD	;^J = <LF>
	<ASCII	"VT">  + .CHVTB	;^K = <VT>
	<ASCII	"FF">  + .CHFFD	;^L = <FF>
	<ASCII	"CR">  + .CHCRT	;^M = <CR>
	<ASCII	"ESC"> + .CHESC	;^[ = <ESC>
	EXP	0		;END OF TABLE

TYOLF:	PUSHJ	P,CNTLF		;GO NOTE LINE WENT OUT
				;AND OUTPUT IT
TYOA:	SOSG	TOB+.BFCTR	;OUTPUT SPACE AVAILABLE?
	PUSHJ	P,TYOOUT	;NO, DO OUTPUT
	IDPB	CH,TOB+.BFPTR	;STUFF CHARACTER IN OUTPUT BUFFER
	TXO	FF,TYOF		;MARK OUTPUT PENDING IN BUFFER
	AOS	TYOTCT		;COUNT TOTAL ACTIVITY
	POPJ	P,		;RETURN

TYOOUT:	TXZ	FF,TYOF		;NOTE NO NEED FOR OUTPUT ANYMORE
	OUT	TTYCHN,		;GIVE CURRENT BUFFER TO MONITOR
	POPJ	P,		;RETURN WITH NEW BUFFER
	POPJ	P,		;IGNORE ERROR FOR NOW
;TTY OPEN BLOCK

TTYBLK:	TTYIOS			;INITIAL I/O STATUS
	'TTY   '		;AIM FOR TTY DEVICE
	TOB,,TIB		;RING HEADERS FOR I/O

TTYPT:	POINT	7,TTIBF1+3	;CCL COMMAND BUFFER POINTER
TTYPT2:	POINT	7,TTIBF1+3,13	;TO INSERT FILE NAME AFTER EW OR EB


U TYIPT,1			;
U TIB,3				;BUFFER HEADER
U TTIBF1,<TTIBFN*<TTIBSZ+3>>	;TERMINAL INPUT BUFFER RING
U TOB,3				;DITTO
U TTOBF1,<TTOBFN*<TTOBSZ+3>>	;TERMINAL OUTPUT BUFFER RING
U TTSTS,1			;CURRENT TERMINAL I/O MODE
U TTYUDX,1			;UDX OF TTY ON TTY CHANNEL
U TYOTCT,1			;COUNT OF TERMINAL OUTPUT SINCE START OF CMD

U IBUF,3			;INPUT TEXT FILE BUFFER RING HEADER
U OBUF,3			;OUTPUT TEXT FILE BUFFER RING HEADER
U BICNT,1			;.EQ. 0 THEN INPUT BUFFER RING NOT SETUP
				;.GT. 0 THEN COUNT OF BUFFERED INPUTS (+1)
U BOCNT,1			;.EQ. 0 THEN OUTPUT BUFFER RING NOT SETUP
				;.GT. 0 THEN COUNT OF BUFFERED OUTPUTS (+1)
U IOFIR,1			;FIRST PAGE IN USE FOR I/O
U IOLIST,4			;DUMP-MODE I/O COMMAND LIST
;INBMES  --  TYPE OUT A MESSAGE, INSURING A FRESH LINE
;CALL IS:
;
;	PUSHJ	P,INBMES
;	  ASCIZ\TEXT\
;	RETURN
;
;USES CH

INBMES:	SKIPE	COLUMN		;IN COLUMN 0 (LEFT MARGIN)
	PUSHJ	P,CRR		;NO, ISSUE A CRLF
INLMES:	PUSH	P,A		;PRESERVE AC "A"
	HRRZ	A,-1(P)		;GET LOCAL ADDRESS OF ASCIZ STRING
	TLOA	A,(POINT 7,)	;MAKE INTO A BYTE POINTER AND SKIP INTO LOOP
INLME2:	PUSHJ	P,TYOM		;OUTPUT THIS CHARACTER
	ILDB	CH,A		;GET THE NEXT CHARACTER
	JUMPN	CH,INLME2	;AND OUTPUT IT
	HRRI	A,1(A)		;ADVANCE PAST JUNK
	HRRM	A,-1(P)		;AND SET RETURN ADDRESS
	POP	P,A		;RESTORE AC "A"
	PJRST	CRR		;CAP OFF THE MESSAGE WITH A <CR><LF>
;ROUTINE TO OUTPUT DECIMAL (OCTAL IF OCTALF IS ON) INTEGER
;CALL	MOVE B,INTEGER
;	MOVEI A,ADDRESS OF OUTPUT ROUTINE
;	PUSHJ P,DPT
;	RETURN

DPT:	MOVEM	A,LISTF5
	JUMPGE	B,DPT1		;NUMBER GREATER THAN 0?
	MOVEI	CH,"-"		;NO. OUTPUT -
	PUSHJ	P,@LISTF5
	MOVMS	B		;B:=ABSOLUTE VALUE OF B
DPT1:	MOVEI	A,12		;RADIX 10
	TXNE	F2,OCTALF	;OCTAL RADIX?
	MOVEI	A,10		;YES, CHANGE TO RADIX 8
DPT3:	IDIVI	B,(A)		;E:=DIGIT
	PUSH	P,E		;PUT DIGIT ON TOP OF PUSH DOWN LIST
	CAIE	B,0		;DONE?
	PUSHJ	P,DPT3		;NO. PUSH THIS DIGIT AND PRINT RETURN ADDRESS.
	POP	P,CH		;YES. CH:=DIGIT
	ADDI	CH,"0"		;CONVERT IT TO ASCII.
	JRST	@LISTF5		;PRINT IT

;ROUTINE TO TYPE CARRIAGE RETURN LINE FEED
;CALL	PUSHJ P,CRR
;	RETURN

CRR:	MOVEI	CH,.CHCRT	;A <CR>
	PUSHJ	P,TYOM		;OUTPUT IT
	MOVEI	CH,.CHLFD	;AND A <LF>
	PJRST	TYOM		;OUTPUT IT AND RETURN
	SUBTTL	CRASH RECOVERY FILE ROUTINES

;THE TEB??? ROUTINES (AND ASSOCIATED VARIABLES) WRITE THE CRASH RECOVERY
;FILE WHICH CONTAINS VERBATIM EVERY CHARACTER TYPED IN BY THE USER (YES,
;EVEN RUBOUTS!). CCL CHARACTERS ARE INCLUDED, BUT ALL OTHER COMMAND FILE
;CHARACTERS (E@ FILES) ARE EXCLUDED.
;
;THE CRASH RECOVERY FILE IS CONTROLLED BY THE /CRDISP SWITCH, WHICH
;TAKES "NEVER", "TEMPORARY", "DELETE", OR "PRESERVE" AS ARGUMENTS.
;"NEVER" TURNS OFF CRASH RECOVERY. "TEMPORARY" WRITES THE RECOVERY FILE
;AS NNNTEB.TMP AND DELETES IT ON EXIT. "DELETE" WRITES THE RECOVERY FILE
;AS NNNTEB.TEB (SO LOGOUT WON'T GET IT) AND DELETES IT ON EXIT. "PRESERVE"
;WRITES THE RECOVERY FILE AS NNNTEB.TEB AND DOESN'T DELETE IT.
;
;FURTHER, THE USER CAN SPECIFY THE CRASH RECOVERY FILE EXPLICITLY
;VIA /CRFILE:FILESPEC.
;
;THE CRASH RECOVERY FILE IS AUTOMATICALLY UPDATED EVERY TEBSAV CHARACTERS
;(ACTUALLY THE FIRST BREAK CHARACTER AFTER TEBSAV CHARACTERS) AND IN ANY
;CASE EVERY BLOCK'S WORTH (640 DECIMAL).


;CRASH RECOVERY IMPURE DATA

U TEBINF,1			;.NE. 0 THEN TEBINI HAS BEEN CALLED
U TEBING,1			;.NE. 0 THEN CRASH FILE BEING WRITTEN
U TEBCNT,1			;COUNT OF CHARACTERS TILL NEXT CHECKPOINT
U TEBOBH,3			;OUTPUT BUFFER RING HEADER BLOCK
U TEBOBF,BLKSIZ+3		;OUTPUT BUFFER RING (1 BUFFER ONLY)
;TEBINI  --  INITIALIZE CRASH RECOVERY FILE FOR WRITTING

TEBINI:	SETOM	TEBINF		;TEBINI HAS BEEN CALLED
	SETZM	TEBING		;BUT WE'RE NOT WRITING THE FILE (YET)
	MOVE	TT,S.CRDI	;/CRDISP SETTING
	CAIN	TT,$TBNEV	;/CRDISP:NEVER?
	POPJ	P,		;YES, THEN NO CRASH RECOVERY FILE

;SUPPLY DEFAULT CRASH FILE IF USER DIDN'T GIVE ONE

	MOVSI	A,'DSK'		;DEFAULT CRASH FILE DEVICE
	SKIPN	S.CRFI+.FXDEV	;/CRFILE GIVE A DEVICE?
	MOVEM	A,S.CRFI+.FXDEV	;NO, USE OUR DEFAULT
	SKIPGE	TT,S.CRDI	;/CRDISP SETTING
	MOVEI	TT,$TBTEM	;NONE, DEFAULT IS /CRDISP:TEMPORARY
	MOVE	A,TMPTEC	;SIXBIT/NNNTEC/
	SUBI	A,1		;SIXBIT/NNNTEB/ (IN CASE .TMP EXTENSION)
	SETO	AA,		; -1 = NO WILDCARDS
	SKIPN	S.CRFI+.FXNAM	;/CRFILE GIVE A FILENAME?
	DMOVEM	A,S.CRFI+.FXNAM	;NO, USE NNNTEB AS A DEFAULT
	MOVSI	A,'TEB'		;TEB EXTENSION
	CAIN	TT,$TBTEM	;/CRDISP:TEMPORARY?
	MOVSI	A,'TMP'		;YES, LET LOGOUT DELETE IT FOR US
	SKIPN	S.CRFI+.FXEXT	;/CRFILE GIVE AN EXTENSION?
	HLLOM	A,S.CRFI+.FXEXT	;NO, USE DEFAULT (,,-1 = NO WILDCARDS)
	MOVX	B,FX.DIR	;THE DIRECTORY-TYPED FLAG
	TDNE	B,S.CRFI+.FXMOM	;/CRFILE GIVE A DIRECTORY?
	JRST	TEBIN1		;YES
	IORM	B,S.CRFI+.FXMOM	;NO, WE ARE SUPPLYING ONE THEN
	IORM	B,S.CRFI+.FXMOD	;AND IT IS TO BE [,]
	SETZM	S.CRFI+.FXDIR	; . . .
	SETOM	S.CRFI+.FXDIM	; -1 = NO WILDCARDS
TEBIN1:	MOVEI	A,TEBPRT	;DEFAULT CRASH FILE PROTECTION
	SKIPE	FDAEM		;IS THIS A FILE-DAEMON SYSTEM?
	TRO	A,400		;YES
	SKIPL	S.CRPR		;USER SPECIFY /CRSPRO?
	MOVE	A,S.CRPR	;YES, USE HIS EXPLICIT PROTECTION THEN
	DPB	A,[POINTR S.CRFI+.FXMOD,FX.PRO]  ;SUPPLY PROTECTION
	MOVEI	A,FX.PRO	;THE PROTECTION MASK
	DPB	A,[POINTR S.CRFI+.FXMOM,FX.PRO]  ;SET MASK TOO

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;NOW SETUP THE OPEN AND LOOKUP BLOCKS FROM THE SCAN BLOCK

	SETZM	XFIBLK		;INITIALIZE FIRST WORD OF FILE BLOCK
	MOVE	A,[XFIBLK,,XFIBLK+1]  ;BLT POINTER TO
	BLT	A,XFIBLK+XFILEN-1  ;INITIALIZE ENTIRE FILE BLOCK
	MOVEI	A,XFILEN	;LENGTH OF ENTER BLOCK
	MOVEM	A,XCNT		;SET IN ENTER BLOCK
	JSP	OU,CALLSW	;THIS IS A TOTALLY DISGUSTING KROCK!
		.FXLEN,,S.CRFI		;T1/SCAN BLOCK
		IFIW	TEBIX		;ADDRESS OF ROUTINE TO GO TO .STOPB
	 JRST	TEBIF5		;WILDCARDS?
	MOVX	A,UU.RRC	;ASCII, AUTO UPDATE OF RIB

IFN	RUN603,<SETZ A,>	;6.03 WILL GIVE ?ILL DATA MODE . . .

	IORM	A,OPNSTS	;SET INITIAL I/O STATUS
	MOVSI	A,TEBOBH	;ADDRESS OF OUTPUT BUFFER RING HEADER
	MOVEM	A,OPNBUF	;SET IN OPEN BLOCK
	OPEN	TEBCHN,OPNBLK	;INITIALIZE I/O CHANNEL
	 JRST	TEBIF1		;CAN'T OPEN DSK:?????????

;WE HAVE OUTPUT DEVICE, VERIFY IT'S USEFULLNESS

	MOVEI	A,OPNBLK	;I/O CHANNEL
	DEVSIZ	A,		;SEE HOW BIG BUFFERS SHOULD BE
	 MOVEI	A,BLKSIZ+3	;ASSUME OK
	ANDI	A,-1		;JUST BUFFER SIZE (INC OVERHEAD)
	SUBI	A,2		;JUST BUFFER SIZE
	CAIE	A,BLKSIZ+1	;RIGHT SIZE?
	JRST	TEBIF3		;NO, FORGET IT
	HRLI	A,TEBOBF+.BFHDR	;ADDRESS OF BUFFER IN RING
	MOVSM	A,TEBOBF+.BFHDR	;SETUP BUFFER RING
	HRRI	A,(BF.VBR)	;VIRGIN BUFFER RING BIT
	MOVSM	A,TEBOBH+.BFADR	;LINK RING TO HEADER BLOCK
	SETZM	TEBOBH+.BFCTR	;FORCE INITIAL OUT

;NOW CREATE OUTPUT FILE

	ENTER	TEBCHN,XFIBLK	;CREATE THE RECOVERY FILE
	 JRST	TEBIF4		;CREATE ERROR

;ALL SET FOR CRASH RECOVERY FILE WRITING

	SETOM	TEBING		;WE ARE NOW LOGGING ALL INPUT
	POPJ	P,		;RETURN ALL SET


;JUNK KROCK ROUTINE FOR CALLING .STOPB

TEBIX:	MOVEI	T2,OPNBLK	;ADDRESS OF OPEN BLOCK
	MOVE	T3,[XFILEN,,XFIBLK]  ;LENGTH,,ADDRESS OF ENTER BLOCK
	MOVEI	T4,PTHBLK	;AND A PATH BLOCK WE CAN USE
	PJRST	.STOPB##	;NOW LET SCAN DO ITS THING
;INITIALIZATION FAILURES

;THESE ROUTINES ARE JUNK, BUT UNTIL TECO HAS A BETTER ERROR-HANDLING
;FACILITY THEY WILL JUST HAVE TO DO . . .

TEBIF1:	$WARN	(COC,TEBIFX,<Cannot OPEN crash recovery file>)

TEBIF3:	$WARN	(CRB,TEBIFX,<Crash recovery file blocksize not 200>)

TEBIF4:	$WARN	(CEC,TEBIFX,<Cannot ENTER crash recovery file>)

TEBIF5:	$WARN	(WIC,TEBIFX,<Wildcards illegal in /CRFILE switch>)

TEBIFX:	$WARN	(RWC,,<Running without crash recovery>)
	SETZM	TEBING		;MAKE PREDICTION COME TRUE
	SETOM	WINFLG		;DON'T MUNGE ON THE SCREEN
	PJRST	CRR		;ISSUE <CR><LF>
;TEBCHR  --  ADD COMMAND CHARACTER TO CRASH RECOVERY FILE.
;CALL IS:
;
;	MOVX	CH,<CHAR>
;	PUSHJ	P,TEBCHR
;	RETURN
;
;WHERE <CHAR> IS THE 7-BIT ASCII COMMAND CHARACTER AS TYPED BY THE USER.
;
;ON AN I/O ERROR A WARNING MESSAGE IS ISSUED, BUT ANY REAL ERRORS ARE
;JUST IGNORED.
;
;PRESERVES ALL ACS.

TEBCHR:	SKIPN	TEBING		;DOING COMMAND BACKUP?
	POPJ	P,		;NO, THEN DON'T DO IT
	SOSG	TEBOBH+.BFCTR	;ANY ROOM IN OUTPUT BUFFER?
	PUSHJ	P,TEBOUT	;NO, OUTPUT CURRENT BUFFER
	IDPB	CH,TEBOBH+.BFPTR;PUT CHARACTER IN BUFFER
	SOSLE	TEBCNT		;TIME TO FORCE A CHECKPOINT YET?
	POPJ	P,		;NO
	CAIL	CH,.CHLFD	;YES, A BREAK CHARACTER ENCOUNTERED?
	CAILE	CH,.CHFFD	; (I.E., A <LF>, <VT>, OR <FF>)
	CAIN	CH,.CHESC	;OR AN <ESC>?
	CAIA			;YES
	POPJ	P,		;NO, THEN STILL MORE TO COME

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;TIME TO CHECKPOINT THE OUTPUT FILE

TEBURB:	SKIPN	TEBING		;DOING COMMAND CRASH RECOVERY?
	POPJ	P,		;NO, THEN DON'T DO IT
	PUSH	P,A		;NEED A COUPLA ACS
	PUSH	P,AA		; . . .
	MOVE	AA,[TEBCHN,,.FOURB]  ;FILOP. FUNCTION WORD
	MOVE	A,[1,,AA]	;FILOP. ARG POINTER TO
	PUSH	P,TEBOBH+.BFPTR	;MONITOR BUG - LEAVES POINTER MUNGED
	PUSH	P,TEBOBH+.BFCTR	;MONITOR BUG - THE COUNTER TOO
	FILOP.	A,		;CHECKPOINT THE CRASH RECOVERY FILE
	 OUTSTR	[ASCIZ\% Error checkpointing crash recovery file, proceeding
\]				;COMPLAIN TO USER
	POP	P,A		;SAVED BYTE COUNTER
	SKIPE	TEBOBH+.BFCTR	;DID WE JUST CROSS A BLOCK BOUNDRY?
	MOVEM	A,TEBOBH+.BFCTR	;NO, STILL HAVE OLD BLOCK, SUPPRESS NULLS
	POP	P,TEBOBH+.BFPTR	;END OF MONITOR BUG
	SKIPGE	A,S.CRSA	;/CRSAVE:NNN GIVEN?
	MOVEI	A,TEBSAV	;NO, COUNT OF CHARACTERS TILL NEXT CHECKPOINT
	CAIG	A,0		;IF 0 (E.G., /CRSAVE:0)
	MOVEI	A,-1		;THEN WAIT FOR A BLOCK BOUNDRY
	MOVEM	A,TEBCNT	;RESET CHARACTER COUNTER
	POP	P,AA		;RESTORE THE CRUNCHED ACS
	POP	P,A		; . . .
	POPJ	P,		;AND RETURN IN ANY CASE

;OUTPUT CURRENT BUFFER, GET NEW ONE

TEBOUT:	OUT	TEBCHN,		;GIVE BUFFER TO MONITOR
	CAIA			;ALL WELL AND GOOD
	 OUTSTR	[ASCIZ\% Error writing crash recovery file, proceeding
\]				;COMPLAIN TO USER
	MOVEM	A,TEBCNT	;NEED AN AC
	SKIPGE	A,S.CRSA	;GET USER-SPECIFIED SAVE COUNT
	MOVEI	A,TEBSAV	;COUNT OF CHARACTERS TO NEXT CHECKPOINT
	CAIG	A,0		;IF 0 (E.G., /CRSAVE:0)
	MOVEI	A,-1		;THEN WAIT FOR A BLOCK BOUNDRY
	EXCH	A,TEBCNT	;RESET SINCE OUT IS AN IMPLICIT CHECKPOINT
	POPJ	P,		;AND RETURN IN ANY CASE
;TEBFIN  --  TIME TO EXIT, TOSS OUT CRASH RECOVERY FILE NOW.

TEBFIN:	SKIPGE	A,S.CRDI	;GET /CRDISP SETTING
	MOVEI	A,$TBDEL	;NONE, ASSUME /CRDISP:DELETE
	JUMPE	A,TEBFI6	;IF NO FILE DON'T BOTHER
	CAIN	A,$TBPRE	;/CRDISP:PRESERVE?
	JRST	TEBFI3		;YES
	SETZB	A,AA		;NULL FILENAM = DELETE
	SKIPE	TEBING		;I/O CHANNEL OPEN?
	RENAME	TEBCHN,A	;YES, DELETE CRASH RECOVERY FILE
	 JFCL			;HO HUM
TEBFI3:	CLOSE	TEBCHN,		;LET GO OF FILE IN ANY CASE
	RELEAS	TEBCHN		;AND DEVICE/CHANNEL AS WELL
TEBFI6:	SETZM	TEBING		;FILE NO LONGER OPEN
	POPJ	P,		;AND THAT'S THAT.



;TEBJ  --  WRITE OUT A <NNN>J COMMAND TO THE BACKUP COMMAND FILE TO
;ENSURE THAT, IN THE EVENT OF A CRASH RECOVERY STINT ON A DIFFERENT
;TERMINAL TYPE, THE CURSOR (".") WILL BE IN THE RIGHT PLACE.

TEBJ:	PUSH	P,A		;SAVE A
	PUSH	P,B		;SAVE B
	PUSH	P,B+1		;AND "IDIVI B,"
	PUSH	P,CH		;SAVE CHARACTER
	XMOVEI	A,TEBCHR	;CHARACTER OUTPUT ROUTINE
	MOVE	B,I		;THE CURRENT CURSOR POSITION
	SUB	B,BEG		;MAKE INTO RELATIVE TEXT POSITION
	PUSHJ	P,DPT		;"TYPE" THE CURSOR POSITION
	MOVEI	CH,"J"		;A "J" COMMAND
	PUSHJ	P,TEBCHR	;PUT IT IN BACKUP FILE
	MOVEI	CH,.CHESC	;AND TERMINATING <ESC>
	PUSHJ	P,TEBCHR	;PUT IT IN BACKUP FILE
	PUSHJ	P,TEBCHR	;TERMINATE REGULAR COMMAND
	POP	P,CH		;RESTORE CH
	POP	P,B+1		;RESTORE "IDIVI B,"
	POP	P,B		;RESTORE B
	POP	P,A		;RESTORE A
	POPJ	P,		;RETURN
	SUBTTL	COMMAND CHARACTER ROUTINES

;RETURN NEXT COMMAND CHAR AT CURRENT LEVEL
;CALL:	PUSHJ	P,SKRCH
;	ERROR RETURN IF NO MORE CHARS AT THIS LEVEL
;	NORMAL RETURN WITH CHAR IN CH

SKRCH:	SKIPG	COMCNT		;ANY CHARS LEFT?
	POPJ	P,		;NO, TAKE ERROR RETURN
	PUSHJ	P,RCH		;YES, GET NEXT
CPOPJ1:	AOS	(P)		;SKIP RETURN
	POPJ	P,



;PEEK AT NEXT COMMAND CHAR AT CURRENT LEVEL
;CALL:	PUSHJ	P,PKRCH
;	ERROR RETURN IF NO MORE CHARS AT THIS LEVEL
;	NORMAL RETURN WITH CHAR IN CH

PKRCH:	SKIPG	COMCNT		;ANY CHARS LEFT?
	POPJ	P,		;NO, TAKE ERROR RETURN
	PUSH	P,COMPTR	;SAVE CURRENT COMMAND POINTER
	PUSH	P,COMPTX	; (DOUBLE-WORD POINTER ADDRESS)
	PUSH	P,COMCNT	;SAVE CURRENT COMMAND COUNTER
	PUSHJ	P,GCH		;YES, GET NEXT CHAR SANS TRACING
	POP	P,COMCNT	;RESTORE COMMAND COUNTER
	POP	P,COMPTX	; (DOUBLE-WORD POINTER ADDRESS)
	POP	P,COMPTR	;RESTORE COMMAND POINTER
	JRST	CPOPJ1		;TAKE SUCCESSFUL RETURN WITH CHAR IN CH
;GET NEXT CHAR FROM CURRENT COMMAND LEVEL WHERE A CHAR IS
;KNOWN TO BE THERE, AND NO TRACING IS WANTED

GCH:	SOS	COMCNT		;REDUCE CHAR COUNT
	ILDB	CH,COMPTR	;GET CHAR.
	JRST	ALTEO		;CONVERT OLD ALTMODES AND RETURN



;ROUTINE TO RETURN NEXT CHARACTER FROM COMMAND BUFFER.
;CALL	PUSHJ P,RCH
;	RETURN ALWAYS WITH CHARACTER IN CH

RCH:	SOSGE	COMCNT		;DECREMENT COMMAND BUFFER CHARACTER COUNT
				;IS COMMAND BUFFER EMPTY?
	JRST	RCH2		;YES. POP UP TO HIGHER MACRO LEVEL.
	ILDB	CH,COMPTR	;NO. GET COMMAND CHARACTER IN CH
	PUSHJ	P,ALTEO		;CONVERT OLD ALTMODES IF EO = 1
	TXNE	FF,TRACEF	;IN TRACE MODE?
	TXNE	F2,NOTRAC	;TRACE ENABLED?
	POPJ	P,		;NO, RETURN
	PUSH	P,A		;YES, SAVE A FOR CALLING ROUTINE
	PUSHJ	P,TYO		;TYPE THE COMMAND
	POP 	P,A		;RESTORE THE STATE
	POPJ	P,		;AND RETURN

RCH2:	POP	P,CH		;SAVE RETURN FOR POPJ IN CH
	POP	P,COMCNT	;GET RID OF FLAG
	SKIPE	EQM		;DON'T ALLOW NEG MACRO COUNT
	SOS	EQM		;DECREMENT THE MACRO LEVEL
	SOSG	COMCNT		;IF ANG BRAK ON PDL, ITS A INCOMPLETE MACRO
	$FATAL	(IAB,,<Incomplete <...> or (...) in macro>)
	POP	P,COMCNT	;GET COUNT FROM NEXT MACRO LEVEL
	POP	P,COMPTX	;RESTORE DOUBLE-WORD POINTER ADDRESS (IF ANY)
	POP	P,COMPTR	;CURRENT POINTER TOO
	POP	P,COMMAX	;NUMBER OF COMMAND CHARACTERS
	PUSH	P,CH		;PUT RETURN BACK ON PDL.
	JRST	RCH		;TRY AGAIN.
;SCAN COMMAND STRING FOR CHARACTER IN TT
;IGNORING PAIRS STARTING WITH CHAR. IN TT1 AND ENDING WITH (TT)
;ASSUMED THAT COMPTR IS SET
;NON-SKIP RETURN IF (TT) CAN'T BE FOUND
;SKIP RETURN IF FOUND
;COMPTR LEFT SET FOR NEXT CHAR. IN COMMAND STRING

SKAN:	TXO	F2,NOTRAC	;INHIBIT TRACE ACTION WHILE SKANNING
	MOVEI	C,0		;CTR FOR <> AND "...' PAIRS
SKAN0:	TXZ	F2,SKIMQF+SKIMRF+SKANFS	;CLR SKIM FLAGS
	PUSHJ	P,SKIMCH	;GET COMMAND CHAR.
	CAIN	CH,(TT1)	;SECONDARY CHARACTER?
	AOJA	C,SKAN1		;YES, COUNT IT
	CAIN	CH,(TT)		;PRIMARY CHAR?
	JRST	SKAN99		;YES!
SKAN1:	CHKEO	EO21,SKAN0	;OLD STYLE SKAN IF EO = 1
	MOVEI	T,SKNTAB	;NO, WATCH OUT FOR TEXT STRINGS
SKAN00:	PUSHJ	P,DISPAT
	JRST	SKAN0		;NOT A TEXT-ARG COMMAND, IGNORE IT
SKAN2:	PUSHJ	P,SKIMCH	;GET CHAR AFTER "^"
	CAIN	CH,"A"
	JRST	SKAN7		;^A COMMAND
	CAIN	CH,"^"
	JRST	SKAN11		;^^ COMMAND
	JRST	SKAN0		;ORDINARY CONTROL-COMMAND, FORGET IT


;EB; EP; ER; EW; EZ; E@.

SKAN3:	PUSHJ	P,SKIMCH
	MOVEI	T,SK3TAB	;WHICH E COMMAND?
	JRST	SKAN00


;@I; @N; @S; @_; @FN; @FS; @F_

SKAN4:	PUSHJ	P,SKIMCH	;WHAT FOLLOWS @?
	MOVEI	T,SK4TAB
	PUSHJ	P,DISPAT
	JRST	SKAN4		;MUST BE 1 OF THESE 4


;O; EB; EP; ER; EW; E@ - EAT NORMAL STRING DELIMITED BY <ESC>

SKAN9:	PUSHJ	P,SKIM		;IGNORE TO $
	JRST	SKAN0
;HERE TO EAT ^AMESSAGE^A

SKAN7:	MOVEI	T,.CHCNA	;IGNORE TO ^A
	JRST	SKAN5


;HERE TO EAT !TAG!

SKAN8:	MOVEI	T,"!"		;IGNORE TO !
SKAN5:	PUSHJ	P,SKIM1		;IGNORE TO CHAR IN T
	JRST	SKAN0


;EAT TEXT STRING DELIMITED BY @/TEXT/ CLASS CONSTRUCTION

SKAN6:	PUSHJ	P,SKIMCH	;GET SEARCH DELIMITER
	SKIPA	T,CH		;IGNORE TO NEXT OCCURRENCE


;EAT TEXT DELIMITED BY NORMAL <ESC> CONSTRUCTION

SKAN12:	MOVEI	T,.CHESC	;DELIMITER IS ALTMODE
	PUSHJ	P,SKIMRQ	;SKIP TO DELIMITER & WATCH OUT FOR ^Q,^R
	JRST	SKAN0


;@I - GET EXPLICIT TERMINATOR AND EAT STRING

SKAN13:	PUSHJ	P,SKIMCH	;GET INSERT DELIMITER
	SKIPA	T,CH		;IGNORE TO NEXT OCCURRENCE


;I; <TAB> - EAT STRING UP TO NORMAL <ESC> DELIMITER

SKAN14:	MOVEI	T,.CHESC	;DELIMITER IS ALTMODE
	PUSHJ	P,SKIM.R	;SKIP TO DELIMITER & WATCH OUT FOR ^R
	JRST	SKAN0


;Q-REGISTER COMMAND, EAT Q-REGISTER NAME

SKAN11:	PUSHJ	P,SKIMCH	;IGNORE NEXT CHAR.
	JRST	SKAN0
;@FN; @FS; @F_ - EAT TWO TEXT STRINGS WITH EXPLICIT DELIMITERS

SKAN16:	MOVEI	T,SK5TAB	;TABLE FOR @F
	JRST	SKAN17


;FN; FS; F_ - EAT TWO TEXT STRINGS WITH NORMAL <ESC> DELIMITER

SKAN15:	MOVEI	T,SK1TAB	;TABLE FOR F COMMANDS
SKAN17:	TXO	F2,SKANFS	;SIGNAL FS OR FN IN PROGRESS
	PUSHJ	P,SKIMCH	;GET CHAR AFTER F
	JRST	SKAN00


;D/FD; K/FK; R/FR

SKAN20:	TXZN	F2,SKANFS	;CLEAR F-COMMAND (2 STRING ARGS) FLAG
	JRST	SKAN0		;OOPS - WASN'T AN F COMMAND
	JRST	SKAN12		;GO EAT SINGLE STRING


;@D/@FD; @K/@FK; @R/@FR

SKAN21:	TXZN	F2,SKANFS	;CLEAR F-COMMAND (2 STRING ARGS) FLAG
	JRST	SKAN0		;OOPS - WASN'T AN F COMMAND
	JRST	SKAN6		;GO EAT SINGLE STRING


;HERE ON END OF "PAIRED" STRING, RETURN UNLESS NESTED

SKAN99:	SOJGE	C,SKAN0		;IF MATCH JUST ENDS A PAIR, LOOP BACK
	TXZ	F2,NOTRAC	;ENABLE TRACING
	JRST	CPOPJ1		;OTHERWISE, WE HAVE WHAT WE WANT
;SKIM OVER TEXT
;
;SKIM	SKIP TO NEXT ALTMODE, GIVING ^R & ^Q NO SPECIAL TREATMENT
;SKIM1	SKIP OVER ARBITRARY CHAR IN T, GIVING ^R & ^Q NO SPECIAL TREATMENT
;SKIM.R	SKIP TO ARBITRARY CHAR IN T, UNLESS IT IS AFTER ^R
;SKIMRQ	SKIP TO ARBITRARY CHAR IN T, UNLESS IT IS AFTER EITHER ^R OR ^Q

SKIMRQ:	TXO	F2,SKIMQF	;CK FOR ^Q AND ^R
SKIM.R:	TXOA	F2,SKIMRF	;CK FOR ^R
SKIM:	MOVEI	T,.CHESC	;SKIP TO NEXT ALTMODE
SKIM0:	CHKEO	EO25,SKIM1	;IF EO=1,2 THEN USE OLD QUOTING CHARACTERS

SKIM1V:	PUSHJ	P,SKIMCH	;SKIM ANOTHER COMMAND CHARACTER
	CAIN	CH,(T)		;DELIMITER CHARACTER WE WANT?
	JRST	SKIM3		;YES
	TXNE	F2,SKIMRF	;NO, ALLOWING QUOTING?
	CAIE	CH,.CHCNV	;YES, IS THIS THE QUOTE CHARACTER?
	JRST	SKIM1V		;NO, KEEP LOOKING FOR DELIMITER
	PUSHJ	P,SKIMCH	;YES, EAT IT AND THE CHARACTER QUOTED
	JRST	SKIM1V		;KEEP LOOKING FOR DELIMITER

SKIM1:	PUSHJ	P,SKIMCH	;GET NEXT TEXT CHAR.
	CAIN	CH,(T)		;CHARACTER WE WANT?
	JRST	SKIM3		;YES
	CAIN	CH,.CHCNQ	;^Q?
	TXNN	F2,SKIMQF	;YES, CK FLAG ON?
	JRST	.+2		;NO
	JRST	SKIM2		;YES
	CAIN	CH,.CHCNR	;^R?
	TXNN	F2,SKIMRF	;YES, CK FLAG ON?
	JRST	SKIM1		;NO, KEEP LOOKING
SKIM2:	PUSHJ	P,SKIMCH	;GOBBLE UP NEXT CHARACTER
	JRST	SKIM1		;CONTINUE SKIMMING
SKIM3:	TXZE	F2,SKANFS	;SKIMMING OVER FS OR FN?
	JRST	SKIM0		;YES, IGNORE 1ST DELIMITER
	POPJ	P,

;GET A SINGLE CHARACTER FROM COMMAND STRING
;TAKE ERROR RETURN FROM SKAN IF THERE ARE NO MORE

SKIMCH:	PUSHJ	P,SKRCH		;GET A COMMAND CHAR.
APOPJ:	POP	P,A		;ERROR RETURN FROM SKAN IF NO MORE CHARS.
	POPJ	P,
;SKAN ROUTINE DISPATCH TABLES

SKNTAB:	XWD	SKAN15,"F"
	XWD	SKAN14,"I"
	XWD	SKAN14,.CHTAB	;TAB
	XWD	SKAN9,"O"
	XWD	SKAN8,"!"
	XWD	SKAN7,1		;^A
	XWD	SKAN11,36	;^^
	XWD	SKAN2,"^"
	XWD	SKAN3,"E"
	XWD	SKAN11,"U"
	XWD	SKAN11,"Q"
	XWD	SKAN11,"X"
	XWD	SKAN11,"G"
	XWD	SKAN11,"M"
	XWD	SKAN11,"%"
	XWD	SKAN11,"["
	XWD	SKAN11,"]"
	XWD	SKAN4,"@"
	XWD	SKAN11,42	;"
SK1TAB:	XWD	SKAN12,"S"	;S OR FS
	XWD	SKAN12,"N"	;N OR FN
	XWD	SKAN12,"_"	;_ OR F_
	XWD	SKAN20,"D"	;D (IGNORED) OR FD
	XWD	SKAN20,"K"	;K (IGNORED) OR FK
	XWD	SKAN20,"R"	;R (IGNORED) OR FR
	XWD	0,0		;LIST TERMINATOR

SK3TAB:	XWD	SKAN9,"B"	;EB
	XWD	SKAN9,"P"	;EP
	XWD	SKAN9,"R"	;ER
	XWD	SKAN9,"W"	;EW
	XWD	SKAN9,"Z"	;EZ
	XWD	SKAN9,"@"	;E@
	XWD	0,0

SK4TAB:	XWD	SKAN16,"F"	;@F
	XWD	SKAN13,"I"	;@I
SK5TAB:	XWD	SKAN6,"S"	;@S OR @FS
	XWD	SKAN6,"N"	;@N OR @FN
	XWD	SKAN6,"_"	;@_ OR @F_
	XWD	SKAN21,"D"	;@D (IGNORED) OR @FD
	XWD	SKAN21,"K"	;@K (IGNORED) OR @FK
	XWD	SKAN21,"R"	;@R (IGNORED) OR @FR
	XWD	0,0
	SUBTTL	START TECO'ING

;HERE FROM ERROR

GOE:	TRZA	FF,777777-TRACEF-QMFLG-FORM-SEQF

;HERE TO START UP A NEW COMMAND

GO:	TRZ	FF,777777-TRACEF-FORM-SEQF
	PUSHJ	P,PCSEC		;VERIFY PC IN PROPER SECTION
;RDH	TXZ	FF,CCLFLG	;CLEAR "Y" REQUESTED FLAG
	TXZ	F2,DOING	;NOT IN A COMMAND YET
	TXZ	F2,NOTRAC
	MOVE	P,[IOWD PDLEN,PDLST]	;INITIALIZE PUSHDOWN LIST
	SETZM	PDLST0		;FLAG PDL TOP - NOTE: PDL FLAGS ARE
				;0    =	TOP OF PDL
				;-1   =	LAST ITEM IS AN ITERATION
				;+1   =	LAST ITEM IS A PARENTHESIS
				;GT 1 =	LAST ITEM IS A MACRO
	PUSH	P,CH		;SAVE POSSIBLE ALREADY INPUT CHARACTER
	AOSN	TOOBIG		;MAYBE TIME TO TRY TO SHRINK DOWN?
	PUSHJ	P,SHRINK	;YES, SEE IF ANY MEMORY CAN BE RECLAIMED
;	MOVE	A,BEG		;GET POSITION BUFFER FLOATED AWAY TO
;	SUB	A,OLDBEG	;CALCULATE DISTANCE IT MOVED
;	ADDM	A,SCRNA		;MARK NEW START OF SCREEN BASE
;	ADDM	A,SCRNB		;AND FIRST CHARACTER ON SCREEN
;	ADDM	A,SCRNZ		;AND END OF SCREEN TOO
;	ADDM	A,OLDBEG	;MARK FOR NEXT DRIFT
	SKIPE	SCTYPE		;MAYBE DON'T DISPLAY
	SKIPE	CMFTYO		;SUPPRESSING OUTPUT DUE TO COMMAND FILE?
	JRST	GO2		;DO NOT DISPLAY
	SKIPE	VFREEZ		;SCREEN FROZEN BY "V" COMMAND?
	JRST	GO2		;YES, DO NOT REDISPLAY!
	SKIPN	WINFLG		;SCREEN HAVE IMPORTANT INFO?
	JRST	GOSC		;NO, OK TO REDISPLAY
	SKIPN	SCRLED		;YES, DID IT CAUSE A SCROLL?
	JRST	GOSB		;NO, THEN WE CAN STILL SAFELY REDISPLAY
	SKIPE	S.SFT		;USER TIRED OF JUNK MESSAGE?
	$INFO	(SFT,,<Screen "frozen" due to program typeout, ^L to refresh>)
	JRST	GO2		;JUST TYPE "*"

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

GOSB:	TXZ	F2,CBTMF	;DON'T ERASE TO END OF SCREEN
GOSC:	MOVE	I,Z		;GET POINTER TO END OF BUFFER
	MOVEM	I,SCRNVZ	;TELL DISPLAY TO GO ALL THE WAY
;	MOVE	B,SCRNB		;START OF SCREEN
;	MOVE	C,SCRNZ		;END OF SCREEN
;	CAML	B,BEG		;SCREEN START IN IN TEXT BUFFER?
;	CAMLE	C,Z		;AND END STILL IN TEXT BUFFER?
;	SETOM	MESFLG		;NO - SOMETHING MESSED UP
	SKIPE	MESFLG		;RECONFIGURE DISPLAY IF REFRESH NECESSARY
	PUSHJ	P,WINIT		;RECALCULATE DISPLAY START
	PUSHJ	P,WINFIL	;FILL UP NEW SCREENFUL
	SKIPGE	DISPTF		;SEE IF POINTER IS ON SCREEN
	JRST	GOSC2		;IT WAS, WE'RE OK
	PUSHJ	P,WINIT		;WASN'T, SO RECALCULATE SCREEN START
	PUSHJ	P,WINFIL	;AND REBUILD A SCREEN IMAGE
	SKIPL	DISPTF		;CURSOR ON SCREEN NOW?
	 HALT	.+1		;BLETCH
GOSC2:	SKIPE	MESFLG		;IF WINDOW OUT OF SYNC WITH SCREEN,
	PUSHJ	P,ZAPSCN	;MAKE THEM BOTH EMPTY
	PUSHJ	P,DISPLX	;OUTPUT THE SCREEN IMAGE
	MOVE	CH,SLENTH	;LENGTH OF SCREEN DISPLAY AREA
	PUSHJ	P,LINECH	;POSITION CURSOR TO COMMAND AREA
	TXZE	F2,CBTMF	;WANT A CLREOS HERE?
	PUSHJ	P,CLREOS	;YES
	SETZM	SCRLED		;CLEAR SCREEN-HAS-SCROLLED FLAG
GO2:	POP	P,CH		;RESTORE POSSIBLE FIRST COMMAND CHARACTER
	SETZM	EQM		;CLEAR MACRO LEVEL COUNT
	MOVE	PF,[XWD -LPF-1,PFL-1]
	SKIPN	CMFINF		;HAVE WE PROCESSED INIT FILE YET?
	PUSHJ	P,CMFINI	;NO, PROCESS IT IF REQUESTED
	SKIPN	TEBINF		;HAVE WE CALLED TEBINI YET?
	PUSHJ	P,TEBINI	;NO, INITIALIZE CRASH RECOVERY FILE
	JRST	CLIS
CLIS:	SETZM	WINFLG		;SO DISPLAY WILL HAPPEN NEXT TIME
	SETZM	VFREEZ		; . . .
CLIS4:	SETZM	COMCNT		;AT THIS POINT WE HAVE NO COMMAND CHARACTERS
	SETZM	COLUMN		;AND ARE AGAINST THE LEFT MARGIN
	SKIPN	CCLSW		;NEED CCL COMMAND?
	JRST	LIS0		;NO
	PUSHJ	P,CCLIN		;GET THE CCL COMMAND TO TYI BUFFER
	JRST	LI0		;AND DON'T PROMPT "*"

LIS0:	SKIPN	CMFECH		;NOECHOING OF COMMAND FILE INPUT?
	TXNE	FF,QMFLG	;1ST CHARACTER IN ALREADY?
	JRST	LIS1A		;YES
	MOVEI	CH,"*"
	PUSHJ	P,TYOM		;TYPE *
LIS1:	TXO	FF,TIBKA!TINEC	;CATCH FIRST CHARACTER TYPED
LIS1A:	TXOE	FF,QMFLG	;UNLESS ONE ALREADY IN
	JRST	LIS1C		;WE ALREADY HAVE FIRST CHAR
	PUSHJ	P,TYI
	SKIPN	CMFECH		;NOECHOING COMMAND FILE INPUT?
	SKIPN	SCTYPE		;IF USING A SCREEN,
	JRST	LIS1C		;NOT, JUST PROCESS COMMAND
	PUSH	P,CH		;WE ARE, SAVE TYPED CHARACTER A MOMENT
	PUSHJ	P,CLREOS	;CLEAR OLD COMMAND FROM SCREEN
	POP	P,CH		;GET USER'S CHARACTER BACK
LIS1C:	CAIE	CH,.CHDEL	;IS CHARACTER A <DEL>
	CAIN	CH,.CHCNU	;OR A ^U?
LIS1E:	TXZA	FF,QMFLG	;FORCE TYI CALL
	CAIA			;(SKIP)
	JRST	LIS1		;JUST EAT THE CHARACTER SANS ECHO
LIS1F:	SKIPE	TKESC		;DOES THIS TERMINAL SEND ESCAPE SEQUENCES?
	JRST	LIS2		;YES, GO CHECK FOR ESCAPE SEQUENCE
	CAMN	CH,TKCUP	;CURSOR UP KEY?
	JRST	LIS4A		;YES
	CAMN	CH,TKDWN	;CURSOR DOWN KEY?
	JRST	LIS4B		;YES
	CAMN	CH,TKRGT	;CURSOR RIGHT KEY?
	JRST	LIS4C		;YES
	CAMN	CH,TKLFT	;CURSOR LEFT KEY?
	JRST	LIS4D		;YES
LIS1N:	CAIN	CH,.CHCNH	;^H (BACKSPACE) TYPED?
	JRST	LIS4P		;YES, DISPLAY PREVIOUS SCREEN
	CAIN	CH," "		;SPACE TYPED?
	JRST	LIS4S		;YES, DISPLAY MORE OF SCREEN
	CAIN	CH,.CHCRT	;<CR>?
	JRST	LIS4V		;YES, PUT CURSOR ON SCREEN
	CAIN	CH,.CHLFD	;<LF>?
	JRST	LIS4L		;YES, 1L$$
	CAIN	CH,.CHFFD	;<FF>?
	JRST	LIS4R		;YES, REFRESH SCREEN
	SKIPN	CMFECH		;NO, SUPPRESSING COMMAND FILE ECHO?
	PUSHJ	P,TYIEC		;NO, ECHO THE CHARACTER
	CAIN	CH,.CHCNZ	;^Z?
	JRST	LIS4Z		;YES, RETURN TO MONITOR LEVEL
	CAIN	CH,"*"		;1ST CHAR AN ASTERISK?
	JRST	LIS4X		;YES, SAVE AWAY PREVIOUS COMMAND STRING
	JRST	LI0		;NO, REGULAR COMMAND - CONTINUE NORMALLY
;HERE TO INTERPRET POSSIBLE USER-INDUCED ESCAPE SEQUENCE (E.G., THE
;VARIOUS "ARROW" KEYS).

LIS2:	CAMN	CH,TKESC	;START OF AN ESCAPE SEQUENCE?
	SKIPN	TT,SCTYPE	;ON A VIDEO TERMINAL?
	JRST	LIS1N		;NO, FORGET THIS STUFF
	CAIE	TT,VXANSI	;ANSI ESCAPE SEQUENCES?
	JRST	LIS2E		;NO
	TXO	FF,TIBKA!TINEC	;YES, QUIETLY
	PUSHJ	P,TYI		; READ SECOND CHARACTER OF SEQUENCE
	CAIE	CH,"["		;REALLY ANSI SEQUENCE?
	JRST	LIS2U		;NO, QUEER CHARACTERS
LIS2E:	TXO	FF,TIBKA!TINEC	;QUIETLY
	PUSHJ	P,TYI		; SNARF NEXT NEXT INPUT CHARACTER
	CAMN	CH,TKCUP	;CURSOR UP KEY?
	JRST	LIS4A		;YES
	CAMN	CH,TKDWN	;CURSOR DOWN KEY?
	JRST	LIS4B		;YES
	CAMN	CH,TKRGT	;CURSOR RIGHT KEY?
	JRST	LIS4C		;YES
	CAMN	CH,TKLFT	;CURSOR LEFT KEY?
	JRST	LIS4D		;YES

;UNKNOWN ESCAPE SEQUENCE, JUST TREAT IT AS A REGULAR COMMAND SEQUENCE
;IF ANSI, THEN WE LOSE THE "[", BUT THINGS ARE TOUGH ALL OVER.

LIS2U:	MOVEM	CH,SCH		;SAVE SECOND CHARACTER
	SKIPE	CMFECH		;SUPPRESSING COMMAND FILE ECHO?
	JRST	LIS2X		;YES, DON'T ECHO STUFF THEN
	MOVE	CH,TKESC	;NO, "ESCAPE" CHARACTER
	PUSHJ	P,TYIEC		;"ECHO" IT
	MOVE	CH,SCH		;AND THE OTHER CHARACTER TYPED
	PUSHJ	P,TYIEC		;"ECHO" IT TOO
LIS2X:	MOVE	CH,TKESC	;FIRST CHARACTER TYPED
	JRST	LI0		;TREAT AS A REGULAR COMMAND
;MOVE CURSOR UP ONE SCREEN LINE

LIS4A:	SKIPA	D,[-1]		;MOVE "UP" ONE LINE

;MOVE CURSOR DOWN ONE SCREEN LINE

LIS4B:	MOVEI	D,1		;MOVE "DOWN" ONE LINE
	SKIPN	SCTYPE		;ON A VIDEO TERMINAL?
	JRST	LI0		;NO, TREAT AS NORMAL CHARACTER THEN
	PUSH	P,D		;SAVE COUNT
	MOVE	A,DIPTI		;GET LAST REMEMBERED "." IN DISPLAY IMAGE
	CAMN	A,PT		;HAS "." CHANGED (E.G., "BJ.=$$" COMMAND)
	SKIPL	DISPTF		;NO, IS "." ON THE CURRENT SCREEN?
	CAIA			;SOMETHING SMELLS, RE-BUILD THE BLOODY SCREEN
	JRST	LIS4B1		;NO, PROCEEDING NORMALLY

;HERE WHEN SOMETHING FUNNY IS HAPPENING - FOR SOME REASON THE CURSOR
;(I.E., ".") IS NOT ON THE CURRENT SCREEN IMAGE (E.G., ^H COMMAND) OR
;"." IS NOT CORRECTLY REPRESENTED BY THE CURRENT SCREEN IMAGE WHICH
;DISPLAYS "." (E.G., "BJ.=$$" COMMAND WHICH LEAVES THE SCREEN FROZEN,
;"." DISPLAYED ON FROZEN SCREEN, BUT "." IS REALLY AT 0).

	MOVE	TT,Z		;GET END OF TEXT BUFFER
	MOVEM	TT,SCRNVZ	;ENSURE THAT DISPLAY GOES ALL THE WAY
	PUSHJ	P,WINIT		;INITIALIZE A VIRGIN SCREEN
	PUSHJ	P,WINFIL	;AND RE-BUILD IT FROM FIRST PRINCIPLES
	MOVE	D,(P)		;RESTORE D
LIS4B1:	CAIN	D,1		;MOVING DOWN?
	SETOM	PT		;YES, DON'T GET CONFUSED BY THE "/\"
	DMOVE	A,DIPTA		;BASE/COUNT PAIR FOR SCREEN LINE WITH "."
	PUSHJ	P,DISMV		;MOVE POINTER AROUND
	POP	P,D		;RESTORE COUNT (DIRECTION FLAG ALSO)
	JUMPGE	D,LIS4B3	;IF MOVING FORWARD ALL SET
	CAMN	A,DIPTA		;HAS ANYTHING HAPPENED
	CAME	AA,DIPTAA	; (DITTO)
	CAIA			;YES
	JRST	[MOVEM	A,PT	;NO, AT TOP OF TEXT
		JRST	GO]	;SO CAN'T GO ANY FURTHER
	SETZ	D,		;CHANGE THE POINTER NOT AT ALL
	PUSHJ	P,DISMV		;BUT SET I TO START OF SCREEN LINE
LIS4B3:	SETZB	C,CH		;INITIALIZE COUNTER AND CHARACTER
	CAMGE	I,Z		;AGAINST BOTTOM OF TEXT?
	SKIPN	DIPTC		;OR CURSOR AGAINST MARGIN?
	JRST	LIS4B8		;YES
LIS4B5:	PUSHJ	P,DISCHR	;GET A DISPLAY CHARACTER
	CAIE	CH,.CHCRT	;IF END OF DISPLAY LINE
	CAMN	C,DIPTC		;OR REACHED OLD CURSOR'S "POSITION"
	SOSA	I		;YES, TOSS OUT "CURRENT" CHARACTER
	AOJA	C,LIS4B5	;NOT YET
LIS4B8:	MOVEM	I,PT		;MOVE THE CURSOR (".")

;NOW WRITE AN NNNJ COMMAND INTO COMMAND FILE (IN CASE LATER EXECUTED ON
;A DIFFERENT SCREEN SIZE)

	TXNN	FF,CFOF		;IF TOP-LEVEL COMMAND TERMINAL TYPEIN
	PUSHJ	P,TEBJ		;THEN WRITE THE NNNJ COMMAND
	JRST	GO		;NOW UPDATE SCREEN
;CURSOR RIGHT

LIS4C:	AOS	A,PT		;MOVE RIGHT ONE PLACE
	CAMLE	A,Z		;STILL IN THE TEXT BUFFER?
	SOS	PT		;NO, BACK TO WHERE WE WERE
	JRST	GO		;NEXT COMMAND


;CURSOR LEFT

LIS4D:	SOS	A,PT		;MOVE LEFT ONE PLACE
	CAMGE	A,BEG		;STILL IN THE TEXT BUFFER?
	AOS	PT		;NO, BACK TO WHERE WE WERE
	JRST	GO		;NEXT COMMAND
;HERE TO FORCE A SCREEN REFRESH

LIS4R:	SETZM	WINFLG		;CLEAR STICKY SCREEN FLAG
	SETZM	VFREEZ		; . . .
	SETOM	MESFLG		;AND ANNOUNCE THE TRASHED SCREEN EFFECT
	TXO	F2,CBTMF	;ALSO CLEAR OUT BOTTOM OF SCREEN
LIS4RG:	TXZ	FF,QMFLG	;GOBBLE UP THE CHARACTER
	JRST	GO		;AND LET GOSC REFRESH THE SCREEN


;HERE TO DO A "1L$$" COMMAND WHEN USER TYPES A <LF>. IN ADDITION,
;IF NOT VIDEO SCREEN MODE DO A "1T$$" AS WELL.

LIS4L:	MOVEI	B,1		;EXPLICIT "1" LINE
	TXO	FF,ARG		;MAKE IT TOTALLY EXPLICIT
	PUSHJ	P,LINE		;ADVANCE ONE LINE
	SKIPE	SCTYPE		;VIDEO SCREEN HANDLING?
	JRST	GO		;YES, DO SCREEN UPDATE
	PUSHJ	P,CRR		;NO, START UP A NEW LINE
	MOVEI	B,1		;WANT ONE LINE ONLY
	TXO	FF,ARG		;EXPLICITLY ONE LINE
	PUSHJ	P,TYPE		;TYPE ONE LINE
	JRST	GO		;GO FOR NEXT COMMAND


;HERE TO "SCROLL" BACKWARDS THROUGH THE TEXT WITHOUT CHANGING "."

LIS4P:	SKIPN	SCTYPE		;DOING VIDEO SCREEN HANDLING?
	JRST	LI0		;NO, TREAT BACKSPACE AS A CHARACTER
	PUSHJ	P,VUPRV		;VIEW PREVIOUS WINDOW'S WORTH
	PUSHJ	P,CLREOS	;CLEAR ANY JUNK LEFT LYING AROUND
	JRST	LIS4RG		;RESTART COMMAND SCANNING


;HERE TO "SCROLL" FOREWARDS THROUGH THE TEXT WITHOUT CHANGING "."

LIS4S:	SKIPN	SCTYPE		;DOING VIDEO SCREEN HANDLING?
	JRST	LI0		;NO, TREAT SPACE AS A SPACE
	PUSHJ	P,VUNXT		;VIEW NEXT WINDOW'S WORTH
	PUSHJ	P,CLREOS	;CLEAR ANY JUNK LEFT LYING AROUND
	JRST	LIS4RG		;RESTART COMMAND SCANNING
;HERE TO PUT CURSOR ON CURRENT SCREEN

LIS4V:	PUSHJ	P,TYI		;GET THE FOLLOWING <LF>
	CAIE	CH,.CHLFD	;IT IS A <LF>, ISN'T IT?
	HALT	.+1		;BLETCH
	SKIPN	SCTYPE		;OR NON-SCREEN-MODE TERMINAL?
	JRST	LIS1E		;YES, EAT THE <CR><LF>
	SKIPL	DISPTF		;CURSOR ALREADY ON SCREEN?
	JRST	LIS4V2		;NO
	DMOVE	A,DIPTA		;YES, GET CURSOR BASE
	SETZ	D,		;MOVE 0 LINES
	JRST	LIS4V4		;FIND START OF LINE

LIS4V2:	DMOVE	A,SCRNA		;CURRENT SCREEN BASE
	MOVE	D,CLENTH	;HOW FAR DOWN WE PREFER THE CURSOR
LIS4V4:	PUSHJ	P,DISMV		;GET APPROPRIATE TEXT ADDRESS
	MOVEM	I,PT		;SET NEW "."

;NOW WRITE AN NNNJ COMMAND INTO COMMAND FILE (IN CASE LATER EXECUTED ON
;A DIFFERENT SCREEN SIZE)

	TXNN	FF,CFOF		;IF TOP-LEVEL COMMAND TERMINAL TYPEIN
	PUSHJ	P,TEBJ		;THEN WRITE THE NNNJ COMMAND
	JRST	GO		;NOW UPDATE SCREEN



;RETURN TO MONITOR LEVEL. NO ATTEMPT IS MADE TO PROTECT AGAINST
;PSYCHOPATHIC USERS ISSUING ".FINISH" COMMANDS . . .

LIS4Z:	TXZE	FF,TYOF		;NEED A TYO?
	PUSHJ	P,TYOOUT	;YES. DO SO.
	PJRST	FINISZ		;NOTHING SPECIAL HERE


;SAVE PREVIOUS COMMAND STRING IN NAMED Q-REGISTER

LIS4X:	MOVE	C,COMLEN	;LENGTH OF STRING
	TXNN	F2,NALTFS	;FS<STRING>$$ COMMAND LAST THING?
	SUBI	C,1		;NO, TOSS OUT SECOND $ OF $$
				; NOTE THAT IF COMMAND WAS ABORTED BY ^G^U
				; THEN DELLIN LEFT COMLEN COUNTING THE ^G
				; CHARACTER SO WE CAN DO THE SUBI HERE.
	MOVE	B,CMDBAS	;POSITION OF FIRST CHAR. IN BYTES
	IMULI	B,5
	TXNN	F2,GOING	;ANY CMD SEEN BEFORE?
	TDZA	B,B		;NO - FLAG NCS ERROR FOR LATER.
	PUSHJ	P,XQREG		;YES - SAVE CMD IN Q-REG BUFFER
	MOVEM	B,COMSAV	;SAVE FOR LATER
	HRRZI	CH,"*"		;RESTORE CH (GARBAGED BY XQREG)
	JRST	LI0		;START UP COMMAND PROCESSING
	SUBTTL	TECO COMMAND INPUT AND EDITING

LI0:;	SETZM	COMCNT		;COMCNT:=0
	TXZ	F2,NALTFS	;CLEAR FLAG
	SETZM	TAGSYM		;INITIALIZE "O" COMMAND TAG "SYMBOL TABLE"
	MOVE	T,[XWD TAGSYM,TAGSYM+1]  ;BLT POINTER TO
	BLT	T,SYMEND-1	;ZERO TAG SYMBOL TABLE
	DMOVE	A,CMDPTR	;MASTER COMMAND BUFFER STUFFER
	DMOVEM	A,COMPTR	;RESET DYNAMIC COMMAND POINTER

LI10:	TXZ	FF,ALTF+BELLF+XPLNFL+EMFLAG
LI11:	MOVEI	A,1		;ONE CHARACTER
	ADJBP	A,COMPTR	;ADVANCE COMMAND BUFFER BYTE POINTER
	SKIPN	SECTN		;PC IN EXTENDED SECTION?
	HRRZ	AA,A		;NO, HALF WORD ADDRESS
	CAMGE	AA,CMDEND	;ROOM IN COMMAND BUFFER?
	JRST	LI30		;YES

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;EXPAND COMMAND BUFFER, ALLOCATING CORE IF NEEDED

LI20:	MOVE	T,Z		;GET THE NUMBER OF CHARACTERS NOW
	ADDI	T,COMAIW*5	;PLUS INCREMENTAL TEXT GROWTH SIZE
	CAMG	T,MEMSIZ	;WILL THIS OVERFLOW?
	JRST	LI23		;NO, JUST EXPAND THE COMMAND BUFFER
	PUSHJ	P,GRABAK	;GET THE NECESSARY CORE
	 JRST	CORERR		;BUMMER! COMMAND GOT TOO BIG

;OK, EXPAND THE COMMAND BUFFER CONFIDENTLY

LI23:	MOVEI	B,COMAIW	;EXPAND COMMAND BUFFER
	ADDB	B,CMDEND	;EXTEND COMMAND BUFFER END ADDRESS
	MOVE	A,QRBUF		;BASE TEXT ADDRESS FOR Q-REGS/ETC.
	IDIVI	A,5		;A:=Q-REG/ETC. BASE WORD ADDRESS.
	MOVE	AA,A		;BASE TEXT ADDRESS (WORDS)
	ADDI	AA,COMAIW	;OFFSET BY "EXPANSION" SIZE
	MOVE	B,Z		;EDITING BUFFER END TEXT ADDRESS
	IDIVI	B,5		;B:=EDITING BUFFER END WORD ADDRESS.
	SUB	B,A		;B:=TOTAL Q-REG AND TEXT WORDS
	MOVSI	T,((B))		;ASSUME IFIW INDEXING OFF OF AC "B"
	SKIPE	SECTN		;PC IN EXTENDED SECTION?
	LSH	T,IFX2EF	;YES, SELECT EFIW INDEXING THEN
	IOR	A,T		;INDEX "SOURCE" POINTER
	IOR	AA,T		;INDEX "DESTINATION" POINTER

;LOOP MOVING TEXT AREA DOWN IN MEMORY

LI25:	MOVE	T,@A		;GET A Q-REG/DATA BUFFER WORD
	MOVEM	T,@AA		;AND MOVE IT DOWN
	SOJGE	B,LI25		;LOOP FOR ENTIRE TEXT AREA

;NOW RELOCATE ALL THE WORLD'S POINTERS (MUCH SIMPLER THAN GC'S WORRIES)

	MOVEI	B,COMAIW*5	;HOW FAR TEXT MOVED
	ADDM	B,QRBUF		;RELOCATE Q-REG BASE ADDRESS
	ADDM	B,BEG		;RELOCATE EDITING BUFFER "B" ADDRESS
	ADDM	B,PT		;RELOCATE EDITING BUFFER "." ADDRESS
	ADDM	B,Z		;RELOCATE EDITING BUFFER "Z" ADDRESS
	MOVSI	AA,-SCRNRL	;LENGTH OF SCREEN RELOCATION TABLE
	ADDM	B,@SCRNRP	;RELOCATE SCREEN POINTER
	AOBJN	AA,.-1		;RELOCATE THE REST OF 'EM

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;HERE ON EACH COMMAND INPUT CHARACTER

LI30:	TXZN	FF,QMFLG	;1ST CHAR IN ALREADY?
	PUSHJ	P,TYI		;GET A NON-NULL CHARACTER IN CH
	CAIN	CH,.CHDEL	;<DEL>?
	JRST	CTRDL		;YES, UNCONDITIONALLY RUBOUT ONE CHARACTER
	TXZE	F2,CQUOTE	;IS QUOTE-THE-NEXT-CHARACTER SET?
	JRST	LI3QT		;YES, THEN WE HAVE A COMMAND CHARACTER
	CAIN	CH,.CHBEL	;CONTROL-G?
	JRST	CTRLG		;YES
	CAIN	CH,.CHCNR	;CONTROL-R?
	JRST	CTRLR		;YES
	CAIN	CH,.CHCNU	;CONTROL-U?
	JRST	CTRLU		;YES
	CAIN	CH,.CHCNV	;CONTROL-V?
	JRST	CTRLV		;YES
	CAIN	CH,.CHCNW	;CONTROL-W?
	JRST	CTRLW		;YES

;WE HAVE A COMMAND CHARACTER IN CH. STASH IT AWAY AND READ MORE

	AOS	COMCNT		;COUNT ANOTHER COMMAND CHARACTER
	IDPB	CH,COMPTR	;AND STASH IT IN THE COMMAND BUFFER
	CAIN	CH,.CHESC	;<ESC>?
	JRST	LI70		;YES, MAYBE TIME TO EXECUTE THE COMMAND
	JRST	LI10		;BACK FOR THE NEXT COMMAND CHARACTER

LI3QN:	TXO	F2,CQUOTE	;WANT TO QUOTE THE NEXT CHARACTER
LI3QQ:	TXZ	FF,ALTF!BELLF	;AND DO NOTHING ELSE WITH IT
LI3QT:	AOS	COMCNT		;COUNT THIS CHARACTER AS A COMMAND CHARACTER
	IDPB	CH,COMPTR	;AND PUT IT IN THE COMMAND BUFFER
	JRST	LI11		;BACK FOR THE NEXT COMMAND CHARACTER
LI70:	TXZ	FF,BELLF	;$ CLEARS ^G FLAG
	TXON	FF,ALTF		;SET ALT-MODE FLAG. WAS IT ON?
	JRST	LI11		;NO, KEEP ACCEPTING COMMAND INPUT
	MOVE	A,COMCNT	;COUNT OF COMMAND CHARACTERS
	MOVEM	A,COMMAX	;SET COMMAND CHARACTER ADDRESS UPPER BOUND
	MOVEM	A,COMLEN	;SAVE IN CASE OF * COMMAND NEXT
	CAIG	A,2		;JUST $$?
	PUSHJ	P,TEBURB	;YES, FORCE OUT BACKUP FILE CHARACTERS
	DMOVE	A,CMDPTR	;MASTER COMMAND BUFFER BYTE POINTER
	DMOVEM	A,COMPTR	;RESET COMMAND BUFFER BYTE POINTER
	SETZM	CCLSW		;FINISHED WITH CCL READ
	SKIPE	CMFECH		;SUPPRESSING ECHO DUE TO COMMAND FILE?
	JRST	LI74		;YES, THEN NO <CR><LF>
	SKIPN	SCTYPE		;UNLESS DISPLAYING,
	PUSHJ	P,CRR		;TYPE CRLF
LI74:	TXZE	FF,TYOF		;ANY OUTPUT HANGING AROUND?
	PUSHJ	P,TYOOUT	;YEAH, NOW IS A REASONABLE TIME TO FORCE IT OUT
	SETZM	TYOTCT		;CLEAR OUTPUT ACTIVITY COUNTER
				; (SO "<SBLAH$;0TT>" DOES NICE THINGS)
	JRST	CD		;DECODE COMMAND
;HERE ON <DEL>

CTRDL:	PUSHJ	P,RUBCHR	;RUBOUT ONE COMMAND CHARACTER
	 JRST	LIS1E		;EMPTY, WATCH FIRST CHARACTER SPECIAL
	JRST	LI10		;RESUME COMMAND TYPEIN


;HERE ON CONTROL-G

CTRLG:	TXO	FF,BELLF	;SET BELL FLAG
	TXZ	FF,ALTF		;AND CLEAR ESC SEEN FLAG
	JRST	LI3QT		;AND STUFF ^G INTO COMMAND BUFFER


;HERE ON CONTROL-R

CTRLR:	CHKEO	EO21,LI3QQ	;IF EO=1 THEN ^R IS RANDOM CHARACTER
	CHKEO	EO25,LI3QN	;IF EO=2 THEN ^R IS QUOTING CHARACTER
	PUSHJ	P,RETYPR	;OTHERWISE ^R RETYPES THE CURRENT LINE
	SKIPG	COMCNT		;HAVE ANY COMMANDS?
	JRST	LIS1E		;NO, WATCH FIRST CHARACTER SPECIAL
	JRST	LI11		;AND SIMPLY DISAPPEARS

;HERE ON CONTROL-U

CTRLU:	PUSHJ	P,DELLIN	;DELETE ONE "PHYSICAL" COMMAND LINE
	 JRST	CLIS4		;EMPTY, RE-PROMPT
	JRST	LI10		;RESUME COMMAND TYPEIN


;HERE ON CONTROL-V

CTRLV:	CHKEO	EO25,LI3QQ	;IF EO=1 OR 2 THEN ^V IS RANDOM CHARACTER
	JRST	LI3QN		;OTHERWISE ^V IS QUOTING CHARACTER



;HERE ON CONTROL-W

CTRLW:	CHKEO	EO25,LI3QQ	;IF EO=1 OR 2 THEN ^W IS RANDOM CHARACTER
	PUSHJ	P,RUBWRD	;OTHERWISE ^W RUBS-OUT A COMMAND WORD
	 JRST	LIS1E		;EMPTY, WATCH FIRST CHARACTER SPECIAL
	JRST	LI10		;RESUME COMMAND TYPEIN
;RETYPE THE CURRENT COMMAND LINE

RETYPR:	TXNE	FF,BELLF	;^G^R (RETYPE ENTIRE COMMAND)?
	PUSHJ	P,BACKUP	;YES, DELETE THE ^G FROM THE COMMAND BUFFER
	MOVE	D,COMCNT	;MARK CURRENT POSITION
	PUSHJ	P,BACKLN	;BACK UP TO BEG OF LINE
	 JRST	RETYP2		;HIT BEG OF COMMAND STRING
	IBP	COMPTR		;SKIP THE <CR>
	AOS	C,COMCNT	; (AND COUNTER TOO)

;AT THIS POINT, COMCNT IS ONE TOO SMALL AND COMPTR POINTS ONE BYTE IN FRONT
;OF THE FIRST TEXT COMMAND CHARACTER TO BE REPRINTED (E.G., ON THE <LF>
;OR IMMEDIATELY IN FRONT OF THE COMMAND BUFFER IF NO FULL LINES YET).

RETYP2:	SKIPE	CMFECH		;COMMAND FILE NO ECHO?
	JRST	RETYP4		;YES, NO OUTPUT HERE THEN
	MOVEI	CH,.CHCRT	;<CR>
	PUSHJ	P,TYOM		;BACK TO START OF LINE
	MOVEI	CH,.CHLFD	;<LF>
	SKIPN	SCTYPE		;ON VIDEO TERMINAL?
	PUSHJ	P,TYOM		;NO, THEN NEED NEW LINE AS WELL
	CAILE	E,0		;NICE NORMAL <CR><LF> SETUP?
	PUSHJ	P,RETYUP	;NO, EMBEDDED LINE MOVEMENTS, WORK HARDER
	MOVEI	CH,"*"		;OUR PROMPT
	SKIPG	COMCNT		;HAVE WE BACKED UP TO THE START?
	PUSHJ	P,TYOM		;YES, THEN RE-PROMPT FOR NEATNESS TOO
	MOVEM	D,COMCNT	;RESET COMCNT TO CORRECTNESS
	JRST	RETYP5		;ENTER RETYPE LOOP

;LOOP OUTPUTTING THE COMMAND LINE AS PRESENT IN THE BUFFER

RETYP4:	ILDB	CH,COMPTR	;GET NEXT [POSSIBLE] COMMAND CHAR
	JUMPLE	C,RETYP5	;(BACKLN CAN RETURN US -1)
	SKIPN	CMFECH		;SUPPRESSING ECHO DUE TO COMMAND FILE?
	PUSHJ	P,TYIEC		;ECHO (TYPE) COMMAND CHARACTER
RETYP5:	CAMGE	C,D		;CAUGHT UP YET?
	AOJA	C,RETYP4	;NO, DO MORE

RETYP8:	SKIPE	SCTYPE		;ON VIDEO SCREEN?
	PUSHJ	P,CLREOS	;YES, ERASE POSSIBLE GARBAGE
	LDB	CH,COMPTR	;RELOAD CURRENT [LAST] CHARACTER
	CAIN	CH,.CHESC	;LOOKING AT AN ALTMODE?
	TXO	FF,ALTF		;YES, BETTER SET FLAG
	POPJ	P,		;RETURN
RETYUP:	SKIPN	SCTYPE		;ON VIDEO SCREEN?
	POPJ	P,		;HARDCOPY - WE CAN DO NOTHING USEFUL HERE
	PUSH	P,CH		;SAVE CHARACTER
	CAML	E,SLENTH	;MOVEMENT GREATER THAN SCREEN SIZE?
	JRST	RETYU8		;YES, JUST CLEAR SCREEN
	PUSHJ	P,CUP		;MOVE CURSOR UP ONE LINE
	SOJG	E,.-1		;MOVE UP AS MANY LINES AS NEEDED
	PUSHJ	P,CLREOS	;CLEAR REST OF SCREEN
	POP	P,CH		;RESTORE CHARACTER
	POPJ	P,		;AND RETURN

RETYU8:	PUSHJ	P,CLRSCN	;ERASE AND HOME UP
	SETZ	E,		;WE DID ALL THE LINES NEEDED
	POP	P,CH		;RESTORE CHARACTER
	POPJ	P,		;BACK TO WHOMEVER
;HERE TO RUBOUT ONE COMMAND CHARACTER

RUBCHR:	PUSHJ	P,RUBOUT	;RUBOUT ONE COMMAND CHARACTER
	 POPJ	P,		;ALL USED UP, WATCH FIRST CHAR SPECIAL
	JRST	CPOPJ1		;BACK FOR MORE COMMAND INPUT


;HERE TO RUBOUT ONE COMMAND "WORD"

RUBWRD:	SKIPN	SCTYPE		;ON VIDEO TERMINAL?
	JRST	RUBWR1		;NO, THE "^W" STAYS
	PUSHJ	P,RUB2P		;YES, ERASE THE "^W" FROM THE SCREEN
	TXNN	FF,BELLF	;^G^W (RUBOUT "SENTENCE")?
	JRST	RUBWR1		;NO
	PUSHJ	P,RUB2P		;YES, ERASE THE "^G" FROM THE SCREEN
	PUSHJ	P,BACKUP	; AND FROM THE COMMAND BUFFER TOO!

;NOW EAT ANY AND ALL PRECEDING SPACES (ASSUME <CR><LF> = SPACE)

RUBWR1:	LDB	CH,COMPTR	;FETCH CURRENT LAST COMMAND CHARACTER
	CAIE	CH,.CHVTB	;IF A <VT>
	CAIN	CH,.CHFFD	;OR A <FF>
	JRST	RUBWR4		;EAT IT, AND PRECEDING <CR>, IF PRESENT
RUBWR2:	CAIE	CH,.CHTAB	;IF A <TAB>
	CAIN	CH," "		;OR A SPACE
	JRST	RUBWR3		;JUST ABSORB IT
	CAIE	CH,.CHLFD	;A <LF>?
	JRST	RUBWR7		;RANDOM CHARACTER, EAT IT
	PUSHJ	P,RUBOUT	;RUBOUT THE <LF>
	 POPJ	P,		;ALL USED UP, WATCH FIRST CHAR SPECIAL
	CAIE	CH,.CHCRT	;PRECEDED BY A <CR>?
	JRST	RUBWR5		;NO, TREAT AS A POSSIBLE WORD BREAK

RUBWR3:	PUSHJ	P,RUBOUT	;RUBOUT THE CHARACTER
	 POPJ	P,		;ALL USED UP, WATCH FIRST CHAR SPECIAL
	JRST	RUBWR2		;LOOK FOR MORE SPACES
RUBWR4:	PUSHJ	P,RUBOUT	;EAT THE <VT> OR <FF>
	 POPJ	P,		;ALL USED UP, WATCH FIRST CHAR SPECIAL
	CAIN	CH,.CHCRT	;PRECEDED BY A <CR>?
	JRST	RUBWR7		;YES, EAT THE <CR> TOO

RUBWR5:	CAIL	CH,"0"		;NUMERIC?
	CAILE	CH,"9"		; . . .
	CAIL	CH,"A"		;ALPHAMERIC (UPPER CASE)?
	CAILE	CH,"Z"		; . . .
	CAIL	CH,"a"		;ALPHAMERIC (LOWER CASE)?
	CAILE	CH,"z"		; . . .
	CAIN	CH,"-"		;OR RANDOM HYPHEN?
	JRST	RUBWR7		;YES TO ONE OF ABOVE, PART OF WORD, EAT IT
	TXNN	FF,BELLF	;^G^W (RUBOUT "SENTENCE")?
	JRST	CPOPJ1		;NO, ONLY ONE WORD, ALL DONE
	CAIE	CH," "		;YES, ON A SPACE?
	CAIN	CH,.CHCRT	;OR A TAB?
	JRST	RUBWR7		;YES, THEN NOT A "SENTENCE" BREAK
	CAIE	CH,.CHLFD	;<LF>?
	JRST	RUBWR6		;NO, END OF "SENTENCE"
	PUSHJ	P,BACKUP	;PEEK AT CHARACTER PRECEDING <LF>
	AOS	COMCNT		;RESTORE COMMAND CHARACTER COUNT
	IBP	COMPTR		;AND COMMAND CHARACTER POINTER
	CAIN	CH,.CHCRT	;<CR><LF> PAIR?
	JRST	RUBWR4		;YES, THEN NOT A "SENTENCE" BREAK
	LDB	CH,COMPTR	;NO, RESTORE CHARACTER
RUBWR6:	TXZ	FF,BELLF	;CLEAR ^G FLAG
	JRST	CPOPJ1		;AND RESUME COMMAND TYPEIN

RUBWR7:	PUSHJ	P,RUBOUT	;RUBOUT ANOTHER COMMAND CHARACTER
	 POPJ	P,		;ALL USED UP, WATCH FIRST CHAR SPECIAL
	JRST	RUBWR5		;SEE IF END OF "WORD" YET
;DELETE ONE "PHYSICAL" (TERMINATED BY <CR><EOL>) COMMAND LINE

DELLIN:	TXNN	FF,BELLF	;^G^U (DELETE ENTIRE COMMAND)?
	JRST	DELLI2		;NO, JUST ^U, EAT THIS PHYSICAL LINE
	PUSHJ	P,BACKUP	;YES, EAT THE ^G
	ADDI	C,1		;(SIGH) SO LIS4X CAN SUBI IT OUT AGAIN
	MOVEM	C,COMLEN	;IN CASE OF "*" COMMAND IMMEDIATELY FOLLOWING
	TXO	F2,GOING	;FLAG THAT WE HAVE SOMETHING GOING ON
DELLI2:	PUSHJ	P,BACKLU	;BACKUP A LINE, GUARANTEEING MOVEMENT
	SETOM	COMCNT		;NOTE NO COMMANDS LEFT
	SKIPE	CMFECH		;COMMAND FILE NO ECHO?
	JRST	DELLI6		;YES
	SKIPE	SCTYPE		;NO, USER TYPEIN, ON VIDEO TERMINAL?
	JRST	DELLI4		;YES, ERASE THE LINE
	PUSHJ	P,INLMES	;"ECHO" THE ^U
	ASCIZ	\^U\
	PUSHJ	P,CRR		;GO TO A NEW LINE
	JRST	DELLI6		;AND FINISH UP

DELLI4:	MOVEI	CH,.CHCRT	;A <CR>
	PUSHJ	P,TYOM		;BACK TO MARGIN
	CAIE	E,0		;BAD CASE (EMBEDDED "LINES")?
	PUSHJ	P,RETYUP	;YES, MOVE CURSOR BACK THEN
	PUSHJ	P,CLREOL	;YES, ERASE ABOUT-TO-BE ERASED LINE FROM SCREEN
DELLI6:	SKIPGE	COMCNT		;ANYTHING LEFT IN BUFFER?
	POPJ	P,		;NO
	AOS	COMCNT		;KEEP CRLF
	IBP	COMPTR
	JRST	CPOPJ1		;CONTINUE TYPE-IN
;RUBOUT ONE COMMAND CHARACTER, CLEARING THE SCREEN AS NEEDED

RUBOUT:	SKIPG	COMCNT		;ANYTHING TYPED IN?
	POPJ	P,		;NO, RETURN ALL USED UP
	LDB	CH,COMPTR	;RELOAD THE CHAR.
	SKIPE	COMCNT		;AT BEGINNING OF COMMAND STRING?
	SKIPE	CMFECH		;COMMAND FILE NO ECHO?
	JRST	RUBOU8		;YES TO ONE OF ABOVE

;RUBOUT ONE LOGICAL CHARACTER FROM THE SCREEN

	SKIPN	SCTYPE		;ON VIDEO TERMINAL?
	JRST	RUBOU6		;NO
	CAIN	CH,.CHDEL	;A RUBOUT?
	JRST	RUBOU8		;YES (?)
	CAIE	CH,.CHCRT	;A <CR>?
	CAIN	CH,.CHTAB	;A <TAB>?
	JRST	RUBTAB		;YES, HAIRY CASE
	CAIN	CH,.CHLFD	;<LF>?
	JRST	RUBLF		;YES
	CAIN	CH,.CHVTB	;<VT>?
	JRST	RUBVT		;YES
	CAIN	CH,.CHFFD	;<FF>?
	JRST	RUBFF		;YES
	CAIGE	CH," "		;RANDOM CONTROL CHARACTER?
	SKIPA	CH,CHTBL(CH)	;YES
	HRLI	CH,(EC$SLF)	;NO, PRINTING ASCII
	TXNE	CH,EC$CRL	;ECHO WITH <CR><LF>?
	JRST	RUBCRL		;YES, ICK
	PUSH	P,C		;SAVE AN AC
	SETZ	C,		;INITIAL COUNTER
	TXNN	CH,EC$SLF	;ECHO LITERALLY?
	TXNE	CH,EC$DLR	;OR AS "$"?
	MOVEI	C,1		;YES, ONE SCREEN POSITION TAKEN UP
	TXNE	CH,EC$UPA	;ECHO AS ^X?
	MOVEI	C,2		;YES, THEN TAKES UP TWO POSITIONS
RUBOU3:	PUSHJ	P,RUB1P		;WIPE OUT ONE SCREEN CHARACTER
	SOJG	C,RUBOU3	;LOOP FOR ALL SCREEN POSITIONS
	POP	P,C		;RESTORE AC
	JRST	RUBOU8		;FINALLY GO DELETE CHARACTER
RUBOU6:	PUSHJ	P,TYOM		;JUST ECHO THE CHARACTER BEING RUBBED-OUT

RUBOU8:	PUSHJ	P,BACKUP	;BACK OVER THE CHAR.
RUBOU9:	JUMPG	C,CPOPJ1	;RESUME TYPE-IN IF ANYTHING LEFT
	SKIPE	SCTYPE		;ON SCREEN-MODE TERMINAL?
	POPJ	P,		;YES, JUST WAIT
	PUSHJ	P,CRR		;NO, SO GO TO NEW LINE,
	MOVEI	CH,"*"		;RE-PROMPT,
	PJRST	TYOM		;AND WAIT FOR NEW COMMAND

RUBCRL:	PUSHJ	P,CUP		;BACKUP A LINE FIRST, THEN
RUBTAB:	PUSHJ	P,BACKUP	;RUBOUT THE LAST CHARACTER
	JUMPLE	C,RETYPR	;IF NONE LEFT, RE-PROMPT
	TXZE	FF,BELLF	;^G SEEN RECENTLY (E.G., ^G^W)?
	JRST	RUBTA2		;YES, DON'T DELETE IT IN RETYPE CODE
	PUSHJ	P,RETYPR	;OTHERWISE REBUILD THE SCREEN LINE
	JRST	CPOPJ1		;AND RETURN FOR MORE INPUT

RUBTA2:	PUSHJ	P,RETYPR	;REBUILD THE SCREEN LINE
	TXO	FF,BELLF	;TURN ^G FLAG BACK ON
	JRST	CPOPJ1		;RETURN HAPPILY

RUBVT:	SKIPA	E,[4]		;<VT> IS 4 <LF>S
RUBFF:	MOVEI	E,^D8		;<FF> IS 8 <LF>S
	PUSHJ	P,CUP		;MOVE UP THE SCREEN
	SOJG	E,.-1		; FOR REQUISITE NUMBER OF LINES
	JRST	RUBOU8		;AND DELETE THE CHARACTER

RUBLF:	PUSHJ	P,CUP		;MOVE CURSOR UP ONE LINE
	JRST	RUBOU8		;DELETE THE <LF>

RUB2P:	PUSHJ	P,RUB1P		;BLANK FIRST (OF TWO) SCREEN POSITIONS
RUB1P:	SKIPE	CMFECH		;NO-ECHOING OF COMMAND FILE?
	POPJ	P,		;YES, THEN NO OUTPUT
	MOVEI	CH,.CHCNH	;BACKSPACE CHARACTER
	PUSHJ	P,TYOM		;OUTPUT IT
	MOVEI	CH," "		;SPACE CHARACTER
	PUSHJ	P,TYOM		;OUTPUT IT
	MOVEI	CH,.CHCNH	;ANOTHER BACKSPACE CHARACTER
	PJRST	TYOM		;OUTPUT IT
;BACKUP TO BEGINNING OF CURRENT LINE
;CALL:	PUSHJ	P,BACKLN
;	RETURN IF BACKUP WENT TO BEGINNING OF COMMAND STRING
;	RETURN IF CR-EOL COMBINATION FOUND
;
;RETURNS IN E THE COUNT OF "LOGICAL" LINES PASSED - I.E., THE COUNT OF
;<LF>'S, <VT>'S, OR <FF>'S NOT IMMEDIATELY PRECEDED BY A <CR>. NOTE THAT
;A <VT> IS 4 <LF>S, AND A <FF> IS 8 <LF>S.
;
;BACKLU IS LIKE BACKLN ONLY IT WILL GO BACK A LINE EVEN IF POINTER
;IS ONLY JUST PAST A <CR><LF>. THIS ALLOWS MULTIPLE ^U'S TO EAT MULTIPLE
;LINES.

BACKLU:	SETZ	E,		;COUNT OF LINES PASSED
	LDB	CH,COMPTR	;GET CURRENT COMMAND CHARACTER
	CAIN	CH,.CHLFD	;<LF>
	MOVEI	E,1		;YES, ONE LINE
	CAIN	CH,.CHVTB	;<VT>?
	MOVEI	E,4		;YES, FOUR LINES
	CAIN	CH,.CHFFD	;<FF>?
	MOVEI	E,^D8		;YES, EIGHT LINES
	JRST	BACKL0		;NOW SEARCH FOR THE PRECEDING LINE

BACKLN:	SETZ	E,		;COUNT OF LINES PASSED LOOKING FOR <CR>
	LDB	CH,COMPTR	;COPY OF CURRENT LAST CHARACTER
	SKIPA	C,COMCNT	;AND COUNT OF CHARACTERS
BACKL0:	PUSHJ	P,BACKUP	;BACK UP ONE CHAR
BACKL1:	JUMPG	C,BACKL5	;KEEP GOING IF MORE TO DO
BACKL2:	HLRZ	C,E		;GET LAST "LINES" COUNT
	ADD	E,C		;ADD TO TOTAL SO FAR
	ANDI	E,-1		;RETURN "LINES" SKIPPED
	MOVE	C,COMCNT	;RESTORE C
	TXZ	FF,BELLF	;CLEAR FLAG
	POPJ	P,		;SINCE WE JUST HIT THE START OF THE BUFFER
BACKL5:	PUSHJ	P,CKEOL		;IS THIS AN EOL CHAR?
	JRST	BACKL8		;NO, LOOP FOR OTHER FUNNY CHARACTERS
	HLRZ	C,E		;GET LAST "LINES" COUNT
	ADD	E,C		;ADD TO TOTAL SO FAR
	CAIN	CH,.CHLFD	;<LF>?
	HRLI	E,1		;YES
	CAIN	CH,.CHVTB	;<VT>?
	HRLI	E,4		;YES, = 4 <LF>S
	CAIN	CH,.CHFFD	;<FF>?
	HRLI	E,^D8		;YES, = 8 <LF>S
	PUSHJ	P,BACKUP	;YES, BACK UP ONE MORE
	JUMPLE	C,BACKL2	;IF AT BEGINING, THEN STOP IN ANY CASE
	TXNN	FF,BELLF	;DOING ^G BACKUP (E.G., ^G^R OR ^G^U)?
	CAIE	CH,.CHCRT	;NO, AT OTHER THAN A <CR><EOL>?
	JRST	BACKL1		;YES (TO EITHER), DON'T STOP HERE
	ANDI	E,-1		;RETURN COUNT OF "EXCESS" LINES SKIPPED
	JRST	CPOPJ1		;TAKE SKIP RETURN

BACKL8:	CAIGE	CH," "		;CONTROL CHARACTER?
	MOVE	CH,CHTBL(CH)	;YES, GET ECHO CONTROL BITS
	TXNE	CH,EC$CRL	;THIS CHARACTER ECHO WITH <CR><LF>?
	ADDI	E,1		;YES, COUNT IT IN LINES COUNTER
	JRST	BACKL0		;AND LOOK AT NEXT (PREVIOUS) CHARACTER



;BACK UP BYTE POINTER IN COMPTR, LOAD APPROPRIATE CHARACTER IN CH,
;AND ADJUST COMCNT

BACKUP:	MOVNI	T,1		;NEGATIVE ONE POSITIONS
	ADJBP	T,COMPTR	;BACK UP COMPTR ONE POSITION
	DMOVEM	T,COMPTR	;AND LEAVE RESULTS IN COMPTR
	SOSLE	C,COMCNT	;DECREMENT COMMAND COUNT
	LDB	CH,COMPTR	;LOAD CHAR IF ANY LEFT
	POPJ	P,
	SUBTTL	TECO COMMAND EXECUTION

CD:	TXO	F2,GOING!DOING	;A COMMAND STRING IS IN
RET:	PUSHJ	P,PCSEC		;CHECK FOR WRONG PC SECTION
	TXZ	FF,ARG!ARG2!FINDR!PCHFLG!SEQUIN
	TXZ	F2,S.MINS!S.REPL!S.DELE!S.KILL!S.FRCM  ;CLEAR SEARCH FLAGS
	TXZE	FF,COLONP	;COLON-MODIFIED COMMAND FORGET TO RETURN VALUE?
	$FATAL	(NVR,,<Colon-modified command didn't return a value>)
CD1:	SETZM	SYL		;NO ARGUMENT ELEMENT (OR ATOM) SEEN
CD2:	SETZM	NUM		;NO ARGUMENT STRING SEEN
	MOVE	A,BEG		;STARTING CHARACTER ADDRESS
	CAML	A,Z		;ANY TEXT IN TEXT BUFFER
	TXZ	F2,LSNF		;NO, THEN NO LSN'S LEFT EITHER
	MOVSI	A,(MOVE B,)	;STANDARD ARG OPERATOR IS MOVE B,SYL
CD3:	HLLM	A,DLIM
CD5:	PUSHJ	P,RCH
CD9:	MOVE	A,CH		;GET COMMAND CHARACTER
	CAIL	CH,"0"		;IS IT A DIGIT?
	CAILE	CH,"9"
	TXZ	F2,OCTALF	;NO, CLEAR OCTAL RADIX FLAG
	CAIE	A,"`"		;ACCENT GRAVE IS ILLEGAL
	CAILE	A,"z"		;ALSO 173-177 ARE ILLEGAL
	MOVEI	A,0
	CAILE	A,"_"		;REDUCE LOWER CASE TO UPPER
	SUBI	A,40
	ROT	A,-1		;DIV BY 2
	JUMPL	A,CD92		;ODD CHARACTER
	HLRZ	A,DTB(A)	;GET CODE & ADDR FOR EVEN CHAR.
	JRST	CD93
CD92:	HRRZ	A,DTB(A)	;GET CODE & ADDR FOR ODD CHAR.
CD93:	TRNN	A,300000	;IS IT A JRST DISPATCH WITH NO ARG PROCESSING?
	JRST	<HIORGP_PG2WRD>(A)  ;YES, DO IT
	MOVE	B,NUM		;NO, TAKE CARE OF ARGUMENTS
	XCT	DLIM		;NUM:=NUM (DLIM OPERATOR) SYL
	MOVEM	B,NUM
	SETZM	SYL		;CLEAR OLD OPERAND
	MOVE	C,SARG		;SAVE SECOND ARGUMENT IN C.
	TXZ	FF,SYLF		;CLR DIGIT STRING BIT
	TXZ	F2,CTLVA+CTLVVA+CTLWB+CTLWWB+EMATCH+TXTCTL
	TRZ	A,100000	;CLR PUSHJ DISPATCH BIT
	TRZE	A,200000	;JRST OR PUSHJ DISPATCH?
	JRST	<HIORGP_PG2WRD>(A)
	PUSHJ	P,<HIORGP_PG2WRD>(A)
	JRST	RET


U DLIM,1			;
U NUM,1				;
U SYL,1				;
U SARG,1			;
;CHECK FOR PC SECTION GOODNESS

PCSEC:	PUSH	P,TT		;SAVE AN AC
	XMOVEI	TT,777		;GET CURRENT PC SECTION
	ANDCMI	TT,777		;REDUCE TO JUST SECTION COUNT
	CAMN	TT,SECTN	;PC STILL IN RIGHT SECTION?
	JRST	PCSEC8		;YES, OK
	$FATAL	(WPS,PCSEC3,<Wrong PC section, returning to proper PC section>)

PCSEC3:	MOVE	TT,SECTN	;THE CORRECT PC SECTION
	HLLM	TT,