File: TECO31.PA of Tape: Sources/Focal/s9
(Source file text) 

/ OS/8 TECO VERSION 3
/BROUGHT TO YOU BY: RUSS HAMM, O.M.S.I., AND RICHARD LARY (IN THAT ORDER)
/WITH ASSISTANCE FROM MARIO DENOBILI OF THE P?S
/ MODIFIED BY W.V.D.MARK , ETH , ZUERICH FOR HIS OWN DISPLAY AND
/ AND SOME OTHER SMALL CHANGES ( ED MEANS EDIT DELETE FILE)
	WVDM=	1

	DECIMAL
VERSN=	31	/ VERSION NUMBER - CHANGE WITH EVERY EDIT 
	OCTAL	/ LAST EDIT  12/10/73  
		/ WVDM 11/1/76 **WM**

IN=	6200		/INPUT BUFFER AT 26200 **WM**
INLEN=	7600-IN^3%2
INCNT=	-INLEN
INSIZ=	7600-IN%400
INCTL=	INSIZ^200!20!1
INHAND=	7200
OUHAND=	6600		/**WM**
OUT=	5200		/OUTPUT BUFFER AT 05200
OULEN=	OUHAND-OUT%2
OUSIZ=	-OULEN-1	
ZMAX=	7640		/MAX 4000 CHARACTERS IN TEXT BUFFER
/QMAX=	3720		/MAX 2000[10] Q-REGISTER CHARS IN 8K
Q12MAX=	IN		/MAX 2944[10] Q-REGISTER CHARS IN 12K
QMAX=Q12MAX		/**WM**
CHNSTR=	46		/38 CHARACTER STRING PASSED ON CHAIN

TWO=	CLA CLL CML RTL
MTWO=	CLA CLL CMA RAL
MTHREE=	CLA CLL CMA RTL


/*****************************************
/	TECO ERROR MESSAGES:
/*****************************************

/	TECO ERROR MESSAGES CONSIST OF A QUESTION MARK AND A NUMBER.
/	TYPING "?" IMMEDIATELY AFTER AN ERROR MESSAGE PRINTOUT PRINTS
/	THE CURRENT COMMAND LINE UP TO THE ERROR CHARACTER.

/1	ILLEGAL COMMAND
/2	INCOMPLETE COMMAND (PDL NOT EMPTY AT END OF COMMAND STRING)
/3	NON-ALPHANUMERIC Q-REGISTER NAME
/4	PUSHDOWN OVERFLOW (MACROS & ITERATIONS NESTED TOO DEEPLY)
/5	TEXT BUFFER OVERFLOW
/6	SEARCH STRING TOO LARGE ( >31 CHARS)
/7	NUMBER MISSING BEFORE COMMA, EQUALS SIGN, U,  OR QUOTE (")
/8	ILLEGAL FILE NAME IN "ER","EW" OR "EB" COMMAND
/9	SEMICOLON OR FAILING SEARCH ON COMMAND LEVEL
/10	ITERATION CLOSE (>) WITHOUT MATCHING OPEN (<)
/11	ATTEMPT TO MOVE POINTER OUTSIDE OF TEXT BUFFER
/12	Q-REGISTER STORAGE OVERFLOW
/13	INCOMPLETE COMMAND (PDL NOT EMPTY AT END OF MACRO)
/14	OUTPUT FILE TOO BIG OR OUTPUT PARITY ERROR
/15	PARITY ERROR ON INPUT FILE
/16	FILE ERROR: CAN MEAN EITHER
/	A)	INPUT FILE NOT FOUND ON "ER" COMMAND
/	B)	CANNOT ENTER OUTPUT FILE ON "EW" OR "EB" COMMAND
/	C)	DEVICE SPECIFIED FOR FILE DOES NOT EXIST
/	D)	"EB" COMMAND GIVEN ON NON-FILE-STRUCTURED DEVICE
/17	OUTPUT COMMAND WOULD HAVE OVERFLOWED OUTPUT FILE
/18	ATTEMPT TO OUTPUT WITHOUT OPENING AN OUTPUT FILE
/**  TECO KLUDGES **		/7/27/73
/ONE OF THE REASONS WHY TECO GETS SO MANY OPERATIONS
/INTO SUCH A SMALL AMOUNT OF CORE IS THAT IT
/IS FULL OF *K*L*U*D*G*E*S*.  THESE SHOULD BE KEPT IN MIND WHEN
/MODIFYING THE PROGRAM.  SOME OF THEM ARE:

/	THE "SORT" ROUTINE COMPARE LIST MUST END WITH A NEGATIVE NUMBER.
/	USUALLY A FORTITUOUS JMS OR OPR INSTRUCTION IS USED

/	THE "SORT" JUMP LIST ENTRIES ARE TREATED AS JUMP ADDRESSES
/	IF THEY ARE POSITIVE AND SUBSTITUTE VALUES IF THEY ARE
/	NEGATIVE - THEREFORE ALL LOCS JUMPED TO MUST BE BELOW 4000
/	ANOTHER CONSEQUENCE IS THAT "QUOTST" CANNOT BE CALLED FROM
/	ABOVE 4000

/	THERE ARE OTHER LOCALIZED KLUDGES - THEY CAN GENERALLY
/	BE IDENTIFIED BY THE APPEARANCE OF A DOUBLE-ASTERISK IN THE
/	COMMENTS FIELD ALONG WITH A TERSE DESCRIPTIVE COMMENT



/	OS/8 EQUIVALENCES:

JSBITS=	7746	/JOB STATUS BITS - IN FIELD 0
OSHNDT=	7647	/OS/8 DEVICE HANDLER TABLE - IN FIELD 1
OSDCBT=	7760	/OS/8 DEVICE CONTROL TABLE - IN FIELD 1
CCLADR=	400	/CCL OVERLAY LOAD ADDRESS
CCLOVL=	67	/BLOCK OF CCL OVERLAY
CCLOST=	602	/CCL OVERLAY SECONDARY START ADDRESS

/DISPLAY PLOTTER CODES **WM**
DLXA=6060	/LOAD X REGISTER FROM AC
DLXB=6061	/LOAD X REGISTER FROM AC, CLEAR AC
DLXC=6062	/LOAD X REGISTER FROM AC AND INTENSIFY
DLXD=6063	/LOAD X REGISTER FROM AC, CLEAR AC, INTENSIFY
DSPA=6064	/PEN UP
DSPB=6065	/PEN DOWN
DINX=6066	/INCREMENT X AND INTENSIFY
DSC=6067	/DISPLAY CHARACTER FROM AC
DLYA=6070	/LOAD Y REGISTER FROM AC
DLYB=6071	/LOAD Y REGISTER FROM AC AND CLEAR AC
DLYC=6072	/LOAD Y REGISTER FROM AC AND INTENSIFY
DLYD=6073	/LOAD Y REGISTER FROM AC, CLEAR AC, INTENSIFY
DCHS=6074	/SCOPE CHANNEL
DCHP=6075	/PLOTTER CHANNEL
DINY=6076	/INCREMENT Y AND INTENSIFY
DCSI=6077	/CLEAR STATUS, INTERRUPT ENABLE REGS.
DIEN=6050	/LOAD INTERRUPT ENABLE REGS. FROM AC
DSPD=6051	/SKIP ON POINT DONE FLAG AND CLEAR FLAG
DSCD=6052	/SKIP ON CHARACTER DONE FLAG AND CLEAR FLAG
DSLP=6053	/SKIP ON FORTRAN FLAG AND CLEAR FLAG
DSDF=6054	/SKIP ON ANY FLAG
DRIS=6055	/READ INTERRUPT FLAGS INTO AC,CLEAR FLAGS
DSFF=6056	/SET FAST PLOTTING
DCFF=6057	/CLEAR FAST PLOTTING
	*0
NAME,	ZBLOCK	4	/NAME BUILD BUFFER - MUST BE AT LOCATION 0
			/LOCS 4,5&6 ARE RESERVED SO WE CAN USE OS/8 ODT

	*10	/CONSTANTS & NON-INDIRECT TEMPS STORED IN AUTO-XRS!
QUOTE,	33	/QUOTE CHAR - SINGLE WORD SORT LIST
ERR01,
SERR,	ERR	/END OF LIST
INRSIZ,	INSIZ	/ # OF RECORDS ON INPUT **WM**
NUMLNS,	3	/NUMBER OF LINES (+ AND -) TO DISPLAY ON VR12 SCOPE
DX,	7577	/DISPLAY XR
SXR,	QPUT12-1	/XR USED BY SEARCH PROCESSOR
INXR,	ASR33-1	/XR USED TO UNPACK INPUT BUFFER
XR,	ASR35-1	/WORK XR

NMT,	0	/USED  AS NUMBER TEMP AND SEARCH FAIL FLAG
CFLG,	0	/COMMA FLAG
CLNF,	0	/COLON FLAG
TFLG,	0	/TRACE FLAG
NFLG,	0	/NUMBER FLAG
QFLG,	0	/QUOTED STRING FLAG
M,	0	/NUMBER ARGS
N,	0
NLINK,	0	/LINK AFTER ARITH OPERATIONS - TESTED BY "A AND "B
CHAR,	0	/CHARACTER BUFFER
ITRST,	0	/ITERATION FLAG
ITRCNT,	0	/ITERATION COUNT
MPDL,	0	/MACRO FLAG
SCHAR,	0	/LAST CHAR SORTED
FFFLAG,	0	/FORM FEED FLAG - 7777 IF FORM FEED SEEN ON THIS READ
REND,	0	/INPUT END-OF-FILE FLAG
SCANP,	0	/COMMAND LINE EXECUTION POINTER
OSCANP,	0	/BACKUP FOR SCANP
PDLP,	PDLBEG	/PUSH-DOWN-LIST POINTER
QCMND,	0	/COMM LINE OR MACRO POINTER
P,	0	/CURRENT PNTR TO TEXT BUFFER
ZZ,	0	/END OF TEXT BUFFER POINTER
Q,	0	/EXTRA BUFFER POINTERS
R,	0
QP,	0	/Q REGISTER POINTER
QZ,	CHNSTR	/END OF Q-REG POINTER
CTLBEL,	7
CAFF,	14	/FF: END OF PAGE
	13	/VT
CALF,	12	/LF
CACR,	15	/CR
CAHT,	11	/HT
CTRLF,	6		/**WM**
BSPACE,	10		/**WM**
CAAM,	33	/ALT MODE
ERR07,
NERR,	ERR	/END OF LIST
RADIX,	DRAD	/RADIX TABLE POINTER - DRAD OR ORAD
MQ,	0
DVT1,	0
ODEV,	0	/OUTPUT DEVICE NUMBER
OUTHND,	0
INHND,	0
EBFLG,	0	/EDIT BACKUP FLAG
QNMBR,	0	/LAST Q-REG REFERENCED
QBASE,	0	/BASE OF CURRENT COMMAND LINE
QLENGT,	0	/LENGTH OF CURRENT COMMAND LINE
QPTR,	0	/POINTER TO Q-REGISTER CONTROL BLOCK
ICRCNT,	0	/INPUT DOUBLEWORD COUNTER
OCRCNT,	0	/OUTPUT "
OPTR2,	0	/OUTPUT BUFFER POINTER
INRCNT,	0	/NUMBER OF INPUT RECORDS LEFT
OCMDLN,	0	/LENGTH OF OLD COMMAND LINE
REPFLG,	0	/REPLACE FLAG FOR SEARCH
	/TECO PSEUDO-OPERATIONS

PUSH=	JMS I	.;	PUSHXX
POP=	JMS I	.;	POPXX	/** MUST BE ONE MORE THAN "PUSH"
PUSHJ=	JMS I	.;	PUSHJY
POPJ=	JMP I	.;	POPJXX
PUSHL=	JMS I	.;	PUSHLX
POPL=	PUSHL			/** POPL CALLED WITH POSITIVE AC

ERR=	JMS I	.;ERROR,ERRXX
SORT=	JMS I	.;	SORTB
RESORT=	JMP I	.;	SORTA2
SCAN=	JMS I	.;	SGET
LISTEN=	JMS I	.;	TYI
TYPE=	JMS I	.;	TYPCTV
OUTPUT=	JMS I	.;OUTR,	ERRXX	/** MUST BE ONE MORE THAN "TYPE"
CRLF=	JMS I	.;	TYCRLF
GETQ=	JMS I	.;	GETQX
SKPSET=	JMS I	.;	SETSKP
NCHK=	ISZ	NFLG		/USED TO BE A SUBROUTINE CALL
CTCCHK=	JMS I	.;	CHKCTC
BZCHK=	JMS I	.;	CHKBZ
QCHK=	JMS I	.;	CHKQF
QSKP=	JMS I	.;	QOVER
QREF=	JMS I	.;	QREFER
QSUM=	JMS I	.;	QSUMR
QPUT=	JMS I	.;	QPUTS
QUOTST=	JMS I	.;	QTST
SETCMD=	JMS I	.;	CMDSET
GETN=	JMS I	.;	NGET
ADJQ=	JMS I	.;	QADJ
MQLDVI=	JMS I	.;	DVIMQL
UPPERC=	JMS I	.;	CUPPER
SCANUP=	JMS I	.;	SCUPPR
TSTSEP=	JMS I	.;	SCHSRT
DISPLY=	JMS I	.;	DSPLAY
NOTRCE=	JMS I	.;	SAVTRA
ENTRCE=	JMS I	.;	RESTRA
GETCAR=	JMS I	.;	CHARO	/**WM**

	PAGE
/ENTER HERE TO USE AN ASR33 AS THE TELETYPE

TECO,	ISZ I	SPUT	/IF CALLED BY "R" OR "RUN" - CHANGED TO TLS
	JMP I	COMPAR	/IF CALLED VIA "CHAIN" - CHANGED TO "JMP T0A"
TBEL,	JMS	COMPAR	/HERE ON ^G - 2 ^G'S KILL ENTIRE COMMAND

T0,	CRLF
T0A,	TAD	(PDLBEG
	DCA	PDLP	/INITIALIZE PUSHDOWN LIST
T1,	TAD	PDLP
	TAD	(-PDLBEG
	SZA CLA
ERR02,	ERR		/ERROR - PUSHDOWN LIST DID NOT BALANCE
	TAD	(45
	QREF		/SET UP POINTERS TO COMMAND LINE
	TAD I	[QPNTR
	DCA	OCMDLN	/SAVE OLD COMMAND LINE LENGTH
	ADJQ		/REDUCE COMMAND LINE LENGTH TO 0
	PUSHJ
		NRET	/CLEAR NUMBER AND LAST OPERATOR
	DCA	CFLG
	DCA	MPDL	/DELETE MACRO FLAG
	DCA	ITRST	/ALSO ITERATION FLAG,
	DCA	REPFLG	/REPLACE FLAG,
	DCA	CLNF	/AND COLON FLAG
	PUSHJ		/KILL QUOTE FLAG
		ZROSPN	/KILL QUOTE AND NUMBER FLAGS AND SCAN POINTER
	KCC		/KILL ^O IF IN KEYBOARD BUFFER
	DCA I	(CHOOPS	/KILL FATAL ERROR RETURN
	TAD	(52
	SKP
ROCMND,	JMS	BACKUP	/BACK UP AND GET LAST CHAR
	TYPE
	DCA	CHAR	/KILL CHAR TO PREVENT SPURIOUS DOUBLE CHARACTERS
T2,	LISTEN		/BUILD COMMAND LINE
	SORT
		COMLST
		COMTAB-COMLST
T2A,	DCA	CHAR
	JMS	SPUT	/PUT INTO C.L. BUFFER
	JMP	T2	/GO GET ANOTHER
BACKUP,	0
	TAD I	[QPNTR	/SEE IF ANYTHING TO ERASE
	SNA CLA
	JMP	T0	/NO, START ALL OVER
	STA
	TAD I	[QPNTR	/THEN THE CHARACTER COUNT
	ADJQ		/REDUCE THE LENGTH OF THE COMMAND REGISTER BY 1
	TAD	QZ
	GETQ		/GET THE CHARACTER WE RUBBED OUT
	JMP I	BACKUP

TCTLU,	TAD	SCHAR
	TYPE		/PRINT "^U"
TCTLUP,	JMS	BACKUP
	TAD	(-15	/CHECK FOR CR
	SZA CLA
	JMP	TCTLUP	/LOOP UNTIL CR, THEN FALL INTO CR INSERTION

TCRLF,	TAD	CACR	/CR IN COMM LINE
	DCA	CHAR
	JMS	SPUT	/PUT INTO COMM LINE
	TAD	CALF	/THEN PUT IN A LF
	JMP	T2A	/AND GET SOME MORE
	/COMMAND EXECUTION LOOP

TALTM,	JMS	COMPAR	/2ND ALTM STARTS EXECUTION
	CRLF		/START COMM EXECUTION
CHTECO,	TAD	(45	/NUMBER OF INPUT COMMAND Q-REGISTER
	SETCMD		/SET UP THE INPUT LINE AS THE CURRENT COMMAND LINE
T6,	SCANUP
T6A,	DCA	CHAR	/SAVE COMMAND CHAR
	TAD	CHAR
	TAD	(CDSP	/ADD BASE OF DISPATCH TABLE
	DCA	T7	/LOK UP ENTRY IN
	TAD I	T7	/COMMAND DISPATCH TABLE
	DCA	T7	/CALL RECURSIVELY
	PUSHJ
T7,		0	/CALL TO ROUTINE
	CTCCHK		/CHECK FOR ^C - ** AC MAY NOT BE 0 HERE **
	CLA		/CTCCHK LEAVES AC NON-ZERO
	TAD	NFLG
	SMA CLA		/IF WE ARE NOT ENTERING A NUMBER,
	DCA	N	/SET N TO ZERO
	JMP	T6	/KEEP INTERPRETING
TQMK,	TAD I	ERROR
	SNA CLA		/ERROR ROUTINE ENTRY POINT NON-ZERO?
	RESORT		/NO
	STA		/AN ERROR PRINTOUT
	DCA	QLENGT	/SET QLENGT BIG SO WE CAN ACCESS ENTIRE LINE
	NOTRCE		/TURN TRACE OFF
	SCAN
	TYPE		/PRINT OUT THE LINE WHICH CAUSED THE ERROR
	ISZ I	ERROR	/UP TO THE ERROR CHAR ITSELF
	JMP	.-3
	JMP	T0	/RE-INITIALIZE

CHUA,	POP		/^ COMMAND - POP OFF RETURN ADDRESS
	SCANUP		/GET THE NEXT CHARACTER IN UPPER CASE
	AND	[77	/MAKE IT A CONTROL CHARACTER
	JMP	T6A	/USE IT INSTEAD OF THE ^
COMPAR,	TCINIT		/LOOK FOR DOUBLED COMM LINE CHARS
	TAD	SCHAR	/MOST RECENT
	CIA
	TAD	CHAR	/PREVIOUS
	SZA CLA
	RESORT		/NOT THE SAME
	JMS	SPUT	/PUT THE CHAR INTO THE COMMAND LINE AND ECHO IT
	JMP I	COMPAR	/SAME-SPECIAL HANDLING

SPUT,	JTECO		/PUT CHAR INTO COMM LINE
	TAD	QZ
	DCA	QP
	TAD	CHAR
	QPUT		/STORE CHARACTER AWAY
	TAD I	[QPNTR
	IAC
	ADJQ		/ADJUST COMMAND LINE REGISTER LENGTH
	DCA I	ERROR	/CLEAR "ERROR JUST OCCURRED" FLAG
	TAD	CHAR
	TYPE		/TYPE THE INSERTED CHARACTER
	CLL
	TAD	QZ
	TAD	QLIMIT
	SNL CLA		/TYPE A BELL IF THE LINE IS
	JMP I	SPUT	/ WITHIN 12 CHARS OF OVERFLOW
	TAD	[7
	TYPE
	JMP I	SPUT
QLIMIT,	12-QMAX
	PAGE
	/Q REGISTER PACK AND UNPACK
	/12K VERSION **WM**
QPUTS,	0		/12K Q-REGISTER PUT ROUTINE
	AND	[377
	CDF 20
	DCA I	QP
	CDF 0
	ISZ	QP
	JMP I	QPUTS

GETQX,	0		/12K Q-REGISTER GET ROUTINE
	DCA	CHKCTC
	CDF 20
	TAD I	CHKCTC
	CDF 0
	AND	[377
	JMP I	GETQX

CHKCTC,	0		/SUBROUTINE TO CHECK FOR ^C IN KEYBOARD
	CLA OSR		/** AC MAY NOT BE 0 ON ENTRY
	DCA	QPUTS	/GET LOCATION FROM SWITCH REGISTER
	TAD I	QPUTS
	7421		/DISPLAY INDICATED LOCATION IN MQ
C7600,	7600		/JUST IN CASE THERE IS NO MQ
	KSF
	JMP I	CHKCTC	/NO CHAR IN KEYBOARD BUFFER - EXIT
	KRS
	AND	[177	/KILL PARITY BIT
	TAD	(-20
	SNA		/^P?
	JMP I	(CTRLP	/YES - BACK TO TECO INPUT PROCESSOR
	TAD	CACR
	SZA		/^C?
	JMP I	CHKCTC	/NO - RESUME WITH NON-ZERO AC

CTLC,	TSF
	JMP	CTLC	/WAIT FOR TELETYPE TO DIE DOWN
	JMP I	C7600	/RETURN TO PS/8

CHARO,	0		/**WM** GET A CHARACTER FROM FIELD 1
	CDF 10
	TAD I	P
	AND	[377	/** FIELD STAYS ON !RTS8!
	JMP I	CHARO

CUPPER,	0		/FORCE CHARACTER TO UPPER CASE
	TAD	[-100
	SMA		/IF ITS >100
	AND	(37	/REDUCE IT TO BE <140
	TAD	[100
	JMP I	CUPPER	/RETURN
DELETE,	JMS I	(OPEN	/FOR DELETING FILES **WM**
	7201
	CLA CLL
	TAD I	(DEVNO
	CIF 10
	JMS I	[200
	4		/USR CLOSE
	NAME
	0		/0 BLOCKS FOR DELETE
	CLA CLL		/DON'T CARE IF NOT FOUND
	JMP I	(ECDISM

	/"EX" AND "EC" COMMANDS
EXIT,	PUSHJ		/"EX" COMMAND
		EXITC	/CLOSE OUT THE FILES
	JMP	CTLC	/AND GO AWAY

EXITC,	TAD	OUTR	/"EC" COMMAND
	CIA		/CHECK FOR OPEN OUTPUT FILE
	TAD	ERROR
	SNA CLA
	POPJ		/NOPE, EXIT ALREADY
EXLOOP,	JMS I	[NXTBUF	/GET NEXT BUFFER
	TAD	REND
	CIA
	TAD	ZZ	/CHECK FOR END-OF-FILE AND
	SZA CLA		/TEXT BUFFER EMPTY
	JMP	EXLOOP	/NOT YET
	JMP I	(ENDFIL	/CLOSE OUTPUT FILE AND POPJ

POPJXX,	DCA	GETQX	/POPJ ROUTINE
	POP
POPJXY,	DCA	POPXX
	TAD	GETQX
	JMP I	POPXX
	/PUSH DOWN LIST ROUTINES

POPXX,	0		/POP ROUTINE
	CLA CMA
	TAD	PDLP
	DCA	PDLP
	TAD I	PDLP
	JMP I	POPXX

PUSHXX,	0		/PUSH ROUTINE
	DCA I	PDLP
	ISZ	PDLP	/BUMP PUSHDOWN POINTER
	TAD	PDLP	/CHECK FOR EXACTLY FULL - THIS ALLOWS THE
	TAD	(-PDLEND
	SNA CLA		/** ERROR ROUTINE TO DO A PUSHJ
ERR04,	ERR		/FULL - REPORT IT
	JMP I	PUSHXX

PUSHJY,	0		/PUSHJ ROUTINE
	DCA	GETQX
	CLL IAC		/** LINK SHOULD BE 0 ON EXIT
	TAD	PUSHJY
	PUSH
	TAD I	PUSHJY
	JMP	POPJXY

PUSHLX,	0		/PUSH AND CLEAR A LIST
	CLL
	SMA		/PUSH LIST IF AC<0, POP IT IF >=0
	CMA STL
	DCA	PUSHJY	/SET COUNTER
	RAL		/** DEPENDS ON FACT THAT POP=PUSH+1 **
	TAD	PUSHYY
	DCA	PUSHYX	/STORE EITHER A "PUSH" OR A "POP"
	POP		/SAVE RETURN POINTER
	DCA	CHKCTC
PUSHLP,	TAD I	PUSHLX
	DCA	GETQX
	TAD I	GETQX
PUSHYX,	PUSH		/PUSH OR POP
	DCA I	GETQX	/IF PUSHYX=PUSH, THIS ZEROES THE PUSHED LOCATION
	ISZ	PUSHLX
	ISZ	PUSHJY
	JMP	PUSHLP
	TAD	CHKCTC	/RESTORE RETURN POINTER
PUSHYY,	PUSH
	JMP I	PUSHLX
	PAGE
/POINTER MOVING COMMANDS - C,R,J,L

CHRJ,	DCA	NFLG
	TAD	N	/COMMAND J
	JMP	CLOQ

CHRR,	GETN		/GET LAST NUMBER, DEFAULT=(+ OR -)1
	CIA
	SKP
CHRC,	GETN		/GET LAST NUMBER, DEFAULT=(+ OR -)1
	TAD	P	/OFFSET RELATIVE TO .
CLOQ,	BZCHK		/SEE IF IN RANGE B,Z
	DCA	P	/IN RANGE
DNN3,	CDF 0
	POPJ

CHRL,	GETN		/GET LAST NUMBER, DEFAULT=(+ OR -)1
	CIA CLL		/MAKE NEGATIVE
	SMA		/DID IT?
	CMA STL		/NO, MAKE MORE NEGATIVE
	DCA	CDT	/SAVE IN SUBR ENTRY
	CDF 10
	SZL
	JMP	CHRLM	/NEGATIVE - GO TO BACKWARDS LOOP
CHRLP,	TAD	P
	CIA
	TAD	ZZ
	SNA CLA		/IF WE ARE AT THE END OF THE BUFFER,
	JMP	DNN3	/RETURN
	JMS	CHLCMP	/COMPARE CHARACTER AGAINST LINE FEED
	ISZ	P
	JMP	CHRLP	/KEEP GOING UNTIL WE GET THERE OR OVERFLOW BUFFER
CHRLM,	CLA CMA CLL
	TAD	P
	DCA	P	/MOVE POINTER BACKWARD 1
	SNL
	JMP	CHRLI	/OOPS - PAST THE BEGINNING OF THE BUFFER - RETURN
	JMS	CHLCMP	/COMPARE CHARACTER AGAINST LINE FEED
	JMP	CHRLM	/NOT SATISFIED YET - KEEP LOOPING

CHLCMP,	0		/COMPARISON SUBROUTINE
	TAD I	P	/DATA FIELD IS 10
	AND	[377
	TAD	[-12
	SNA CLA		/IS THE CHAR A LINE FEED?
	ISZ	CDT	/YES - IS THE COUNT EXHAUSTED?
	JMP I	CHLCMP	/NO - RETURN
CHRLI,	CLA IAC		/WE'VE GONE FAR ENOUGH - SKIP
	JMP	CHRC+1	/PAST THE LINE FEED WE'VE FOUND

CDT,	0		/TEMPORARY
/D COMMAND AND PART OF ADJUST ROUTINE

CHRD,	GETN		/GET LAST NUMBER, DEFAULT=(+ OR -)1
	SMA
	JMP	PLUSND	/+ND
	DCA	CDT	/-ND
	TAD	CDT
	PUSHJ		/DO (-)NC(+)ND
		CHRC+1
	TAD	CDT
			/FALL THROUGH "ADJ" ROUTINE

ADJ,	SPA		/ADJUST BUFFER + OR - N CHARS
	JMP	DNNC	/-N CHARACTERS
	SNA		/TEST FOR NOTHING
	POPJ		/GO AWAY
	STL		/MOVE UP N CHARACTERS
	TAD	ZZ	/ADD TO MAX CHARACTER
	DCA	R	/NEW HIGHEST
	TAD	R	/SEE IF TOO HIGH
	TAD	(-ZMAX
	SNL SZA CLA	/TWO PLACES FOR OVERFLOW THERE
ERR05,	ERR
	TAD	ZZ
	DCA	Q
	TAD	R
	DCA	ZZ
	CDF 10
UPNL,	TAD	Q
	CIA
	TAD	P
	SNA CLA		/FINISHED?
	JMP	DNN3	/YES
	CMA
	TAD	Q
	DCA	Q
	CMA
	TAD	R
	DCA	R
	TAD I	Q	/GET A CHAR
			/L12K1,	AND	[377	/**WM** IF 8K
			/	DCA	CHLCMP
			/	TAD I	R	/BE CAREFUL 
			/	AND	[7400	/NOT TO KILL
			/	TAD	CHLCMP	/HIGH-ORDER
			/J12K1=	JMP	.	/ 4 BITS
	DCA I	R
	JMP	UPNL
/K COMMAND AND MORE OF ADJUST ROUTINE

CHRK,	JMS I	(NLINES	/CONVERT LINES TO CHARS
	DCA	CDT
	TAD	M	/SET POINTER
	DCA	P	/LOWER ARG
	TAD	CDT
PLUSND,	SNA
	POPJ		/IGNORE 0D
	CIA
DNNC,	CIA CLL		/REACHED FROM ADJ
	TAD	P	/MOVE DOWN N CHARACTERS
	SZL
	CLA CMA		/DETECT GROSS OVERFLOWS
	BZCHK
	DCA	Q	/N IN AC
	TAD	P
	DCA	R
	CDF 10
DNN1,	TAD	ZZ
	CIA
	TAD	Q
	SNA CLA		/FINISHED?
	JMP	DNN2
	TAD I	Q	/GET A CHAR
			/L12K2,	AND	[377	/**WM** IF 8K
			/	DCA	CHLCMP
			/	TAD I	R	/BE CAREFUL
			/	AND	[7400	/NOT TO KILL
			/	TAD	CHLCMP	/HIGH-ORDER
			/J12K2=	JMP	.	/ 4 BITS
	DCA I	R
	ISZ	Q
	ISZ	R
	JMP	DNN1
DNN2,	TAD	R
	DCA	ZZ
	JMP	DNN3
	PAGE
/SEARCH SUBROUTINE - CALLED BY N, S, AND _ COMMANDS

SEARCH,	0
	GETN
	CIA
	DCA	CSN	/GET NUMBER OF OCCURRANCES TO SEARCH FOR
	QCHK		/GET REPLACEMENT FOR ALTMODE, IF ANY
	TAD	(STABLE-1
	DCA	SXR	/INITIALIZE XR
	TAD	[-40
	DCA	CSP
SGTLP,	QUOTST		/GET A CHARACTER FROM THE SEARCH STRING
	JMP	SCHQUO	/OOPS- NO MORE
	SORT		/SEE IF ITS SPECIAL
		SCHLST
		SCHTAB-SCHLST
SSTCHR,	DCA I	SXR	/STORE THE CHAR IN THE SEARCH BUFFER
	ISZ	CSP
	JMP	SGTLP	/LOOP
ERR06,	ERR		/OOPS - SEARCH BUFFER FULL!

SCHQUO,	TAD	CSP
	TAD	(40	/A NULL SEARCH STRING MEANS USE THE
	SZA CLA		/PREV CONTENTS OF THE SEARCH BUFFER, ELSE
	DCA I	SXR	/STORE TERMINATING 0 AND BEGIN THE SEARCH
CSST,	TAD	P
	DCA	CSP
	JMP	CSF+1
SCHINV,	TAD	CSNCL	/^N, INVERT SKIP SENSE
	DCA	CSWT

CSL,	TAD I	SXR	/GET A CHAR FROM THE SEARCH BUFFER
	SPA SNA
	JMP	SCCOMD	/NEGATIVE CHARS AND 0 ARE SPECIAL
	CIA
	GETCAR		/**WM**
CSWT1,	CDF 0
CSWT,	SZA CLA
	JMP	CSF	/FAIL TO MATCH ON THIS CHARACTER
	ISZ	P
CSG,	TAD	CSZCL
	DCA	CSWT	/RESTORE SEARCH TEST
	TAD	ZZ
	CMA
	TAD	P
CSZCL,	SZA CLA		/CHECK FOR END OF BUFFER
	JMP	CSL	/NO
	DCA	P
CSZ,	DCA	NMT
	JMP I	SEARCH
/SEARCH SUBROUTINE - CONTINUED

SCCOMD,	DCA	.+1	/SPECIAL CHARACTERS ARE JUMPS OR 0
	HLT		/0 FALLS THROUGH INTO TERMINATION CODE
	ISZ	CSN	/GET NTH OCCURRENCE
	JMP	CSF	/MORE TO GO
	CMA
	JMP	CSZ	/GOT IT
CSF,	ISZ	CSP	/INDEX P
	TAD	(STABLE-1
	DCA	SXR	/INITIALIZE AUTO - INDEX
	TAD	CSP
	DCA	P
	JMP	CSG

/SEARCH STRING MODIFIERS ^N,^Q,^S, AND ^X

SCHTAB,	JMP	SCHINV	/^N: ANYTHING BUT
	SCHCTQ		/^Q: LITERALLY
	JMP	SCHSEP	/^S: ANY SEPARATOR
	JMP	CSWT1	/^X: ANYTHING

SCHCTQ,	SCAN		/GET THE NEXT CHARACTER
	JMP	SSTCHR	/AND STORE IT IN PLACE OF THE ^Q

SCHSEP,	GETCAR		/^S, LOOK FOR SEPARATOR **WM**
	TSTSEP		/SHARED SORTING ROUTINE
	SKP
	CMA		/SET AC = -1 IF NON-SEPARATOR
	JMP	CSWT1	/GO CHECK RESULTS

CHRF,	STA		/F COMMAND - SET REPLACE FLAG
	DCA	REPFLG
	POPJ		/AND RETURN

CCLN,	STA		/: COMMAND - SET VALUE FLAG
	DCA	CLNF
	POPJ		/SO NEXT SEARCH WILL HAVE A NUMERIC VALUE
/S,N,^R AND _ COMMANDS (ALSO FS, FN AND F_)

CTLR,	STA
	DCA	REPFLG	/^R = FS FOR COMPATIBILITY WITH TECO V2
CHRS,	JMS	SEARCH	/S COMMAND - DO A SEARCH
CHKREP,	ISZ	REPFLG	/WAS THERE A REPLACE SPECIFIED?
	JMP	CHKCLN	/NO - CHECK FOR COLON
	QSKP		/COUNT UP STRING 2
	TAD	NMT
	SMA CLA
	JMP	CHKCLN	/FAILED, SET VALUE & EXIT
	TAD	CSP	/FIGURE OUT OFFSET TO FAKE OUT "I" ROUTINE
	CIA		/SO THAT WE HAVE THE RIGHT INSERTION COUNT
	TAD	P	/BUT THE SIZE OF THE HOLE WE NEED
	DCA	DVT1	/IS DECREASED BY THE LENGTH OF THE SEARCH STRING.
	TAD	CSP	/RESET
	DCA	P	/TEXT POINTER
	PUSHJ		/INSERT
		CIL2	/STRING 2
CHKCLN,	DCA	REPFLG	/CLEAR REPLACE FLAG
	PUSHJ		/FORM NUMBER FROM "NMT"
		NNEW	/(APPLYING OPERATOR, IF NECESSARY)
	ISZ	CLNF	/WAS THERE A COLON ON THIS SEARCH?
	SKP		/NO
	JMP I	[IREST	/YES - GO AWAY REGARDLESS OF RESULTS
	DCA	CLNF	/RESET COLON FLAG TO 0
	ISZ	N	/DID WE SUCCEDD?
	JMP I	(CSEM	/NO - SIMULATE A SEMICOLON
	DCA	NFLG	/YES - HOWEVER, NO COLON MEANS NO RESULT
	JMP I	[IREST

CHBA,	CLA IAC		/_ COMMAND
CHRN,	DCA	CNXT	/N COMMAND - SET OUTPUT FLAG
	JMS	SEARCH	/DO A SEARCH
	TAD	REND
	CIA
	TAD	ZZ
CSNCL,	SNA CLA		/HAVE WE REACHED END-OF-FILE?
	JMP	CHKREP	/YES - STOP AND ASSIGN VALUE
	TAD	NMT
	SZA CLA		/HAVE WE SUCCEEDED?
	JMP	CHKREP	/YES - STOP AND ASSIGN VALUE
	TAD	CNXT
	JMS I	[NXTBUF	/GET NEXT BUFFER
	JMP	CSST	/KEEP SEARCHING - RETURN TO CHRN+2
CNXT,	0		/OUTPUT FLAG
CSP,	0		/TEMP P
CSN,	0
	PAGE
/NUMBER PROCESSORS:
/COMMANDS B,H,Z,. AND DIGITS


NMBR,	TAD	CHAR	/NUMBER FOUND IN COMMAND STRING
	TAD	[-60
	DCA	NMT
	NCHK		/CHECK NUMBER FLAG
	JMP	NNEW	/NOT UP, NEW OPERAND
	TAD	DOPR
	DCA	NOPR	/USE SAME OPERATOR AS FOR THE PREVIOUS DIGITS
	TAD	NP	/MULTIPLY PREV DIGITS BY 10
	CLL RTL
NMRBAS,	TAD	NP	/REPLACED BY "NOP" FOR OCTAL
	CLL RAL
NNEW,	TAD	NMT
NCOM,	DCA	NP	/CURRENT NUMBER
	CLL
	TAD	NP
NOPR,	SKP		/DISPATCH JUMP FOR OPERATOR
	CIA
	TAD	NACC	/CURRENT EXPRESSION VALUE
NRET,	DCA	N
	RAR
	DCA	NLINK	/SAVE LINK FOR POSSIBLE COMPARISON TEST
	TAD	NOPR
	DCA	DOPR
	TAD	NULLOP
	DCA	NOPR	/SET OPERATOR TO NULL OP
	STA
	JMP	DCPOPJ	/SET NUMBER FLAG AND EXIT

CHRH,	PUSHJ		/COMMAND H
		CCMA3	/SET M=0 AND COMMA FLAG ON AND FALL INTO "Z"
CHRZ,	TAD	ZZ	/COMMAND Z
CTLH,			/^H COMMAND - TIME OF DAY - NOT IMPLEMENTED
CHRB,	JMP	NCOM	/COMMAND B

CCPR,	CLA IAC
	POPL
		NOPR
		NACC
	TAD	N
	JMP	NCOM	/COMBINE OLD NUMBER AND PARENTHESIZED RESULT

COPR,	MTWO
	PUSHL
		NACC
		NOPR
	DCA	N
	JMP	CPLS	/CLEAN OUT INSIDE PARENS

CDOT,	TAD	P	/COMMAND .
	JMP	NCOM
	/COMMANDS &,#,/,*,-,+,(,)

CAMP,	MTWO				/*K* LOGICAL AND **
CNBS,	TAD	(NIOR-NDIV		/LOGICAL OR
CVIR,	TAD	[NDIV-NMPY		/DIVISION
CAST,	TAD	(NMPY&177+5200-7400	/MULTIPLICATION
CMIN,	TAD	[7400-SKP		/SUBTRACTION
CPLS,	TAD	NSKP			/ADDITION
	DCA	NOPR	/COMMON TO ALL NUMERIC OPERATORS
	TAD	N
	DCA	NACC
	DCA	NP
DCPOPJ,	DCA	NFLG	/CLEAR NUMBER FLAG
	POPJ

NAND,	AND	NACC	/BITWISE AND OF BINARY NUMBERS
	JMP	NRET	/** KEEP THESE TWO OPNS TOGETHER
NIOR,	CMA		/BITWISE OR OF BINARY VALUES
	AND	NACC
	TAD	NP
NULLOP,	JMP	NRET

NMPY,	CIA
	DCA	ND
	TAD	NACC
	ISZ	ND
	JMP	.-2
	JMP	NRET
NACC,	0		/VALUE OF EXPRESSION WITHOUT NP
NDIV,	DCA	ND
	TAD	NACC
	MQLDVI
ND,	0
	JMP	NRET

TSAVE,	TAD I	[QPNTR
	SZA CLA		/IF WE ARE NOT AT THE BEGINNING OF THE C.L.
	RESORT		/TREAT THIS LIKE ANY OTHER ^S
	MTWO		/DROP OFF THE TWO BELLS OR ALTMODES
	TAD	OCMDLN
	ADJQ		/SET COMMAND STRING LENGTH TO OLD VALUE
	TAD	(44
	QREF		/SET UP POINTERS TO Q-REG Z
	ADJQ		/KILL CONTENTS OF Q-REG Z
	TAD I	[QPNTR
	DCA I	(QPNTR-2
	DCA I	[QPNTR	/DO A QUICK SHUFFLE OF Q-REG LENGTHS
	JMP I	(TCTLU
/COMMANDS ^T,^F,^^,^Z,^E,^V, Q AND %

CTLT,	LISTEN		/^T COMMAND - VALUE OF NEXT CHAR FROM TTY
	TYPE		/ECHO THE CHARACTER
	TAD	SCHAR	/GET THE CHARACTER
	JMP	NCOM	/JUMP INTO NUMBER PROCESSOR

CTLF,	CLA OSR SKP	/^F COMMAND - VALUE OF CONSOLE SWITCHES
CTUA,	SCAN		/^^ COMMAND - VALUE OF NEXT CHAR IN COMMAND LINE
	JMP	NCOM	/GO INTO NUMBER PROCESSOR

CHRQ,	QREF		/COMMAND Q
	JMP	CQOA

CPCS,	QREF		/COMMAND %
	GETN
CQOA,	ISZ	QPTR	/POINT TO VALUE WORD
	TAD I	QPTR	/INCREMENT VALUE BY ARGUMENT
	DCA I	QPTR
	TAD I	QPTR
	JMP	NCOM	/MAKE A NUMBER

CTLE,	TAD	FFFLAG	/^E COMMAND - RETURNS FORM FEED FLAG
	JMP	NCOM	/RETURN -1 IF F.F., 0 OTHERWISE

CTLZ,	TAD	QZ	/COMMAND ^Z
NSKP,	SKP		/RETURN NUMBER OF CHARACTERS IN ALL Q-REGS.
CTLV,	TAD	(VERSN	/^V COMMAND - RETURNS THE CURRENT VERSION NUMBER
	JMP	NCOM

CTLD,	TAD	[4	/SET RADIX DECIMAL
CTLO,	TAD	(ORAD	/SET RADIX OCTAL
	DCA	RADIX
	TAD I	RADIX
	DCA	NMRBAS	/EITHER "NOP"(8) OR "TAD NP"(10)
	POPJ

DOPR,	0		/PREVIOUS OPERATOR
NP,	0		/VALUE OF CURRENT NUMBER
	PAGE
	/COMMANDS = AND \ - NUMERICAL OUTPUT

CEQL,	NCHK		/COMMAND =
	JMP	NERR	/NO NUMBER
	JMS	ZEROD
	TPUT
	CRLF
	POPJ
CBSL,	NCHK		/COMMAND \
	JMP	CBSN
	JMS	ZEROD
	UPOC
	POPJ

CBSN,	PUSHJ
		NMBR+2	/INITIALIZE RESULT TO 0
	JMS	PCHK	/*DSN JUNE 75
	GETCAR		/**WM**
	CDF 0
	TAD	(-55	/CHECK FOR MINUS SIGN
	SZA
	JMP	.+3	/NOT MINUS
	PUSHJ
		CMIN	/RECORD MINUS SIGN
	CIA
	CLL RTR
	SNA CLA		/CHECK FOR PLUS SIGN
CBSNP,	ISZ	P	/BUMP POINTER PAST SIGN
	JMS	PCHK	/*DSN JUNE 75
	GETCAR		/**WM**
	CDF 0
	TAD	(-72
	CLL
	TAD	CALF
	SNL		/IS IT A DIGIT?
	POPJ		/NO
	PUSHJ
		NMBR+2	/YES - ACCUMULATE IT
	JMP	CBSNP	/AND LOOP

TYCRLF,	0		/TYPE A CR AND LF
	TAD	CACR	/CR
XTYPE,	TYPE
	TAD	CALF	/LF
	TYPE
	JMP I	TYCRLF	/RETURN
/NUMERICAL OUTPUT ROUTINE

ZEROD,	0
	DCA	TYCRLF	/INITIALIZE "LEADING ZEROS" FLAG
	TAD I	ZEROD
	ISZ	ZEROD
	DCA	SORTB	/SAVE OUTPUT ROUTINE ADDRESS
	MTHREE
	DCA	ITCNT	/ITERATION COUNT
	TAD	RADIX
	DCA	XR
ZDIGIT,	TAD I	XR
	DCA	DIV1	/GET DIVISOR
	TAD	N
	MQLDVI		/DIVIDE BY A POWER OF THE BASE
DIV1,	0
	TAD	TYCRLF
	SNA
	JMP	LZ	/IGNORE LEADING ZEROS
	TAD	(60
	JMS I	SORTB
	STL RAR
	DCA	TYCRLF	/SET LEADING ZEROS FLAG
LZ,	TAD	DVT1	/GET REMAINDER
	DCA	N
	ISZ	ITCNT	/GO AROUND AGAIN?
	JMP	ZDIGIT	/WHY NOT?
	TAD	N
	TAD	(60
	JMS I	SORTB	/OUTPUT LAST DIGIT NO MATTER WHAT
	JMP I	ZEROD

CTLA,	TAD	XTYPE
CEXP,	DCA	WHERTO
	TAD	CHAR
	DCA	QUOTE	/TERMINATING CHAR SAME AS COMMAND CHAR
	DCA	NFLG	/KILL NUMBER IF PRESENT
CTLALP,	QUOTST
	JMP I	[IREST
WHERTO,	0		/TYPE OR IGNORE THE CHARACTER
	CLA
	JMP	CTLALP
SORTB,	0		/SORT AND BRANCH ROUTINE
	DCA	SCHAR	/SAVE SORT CHAR
	STA
	TAD I	SORTB	/GET POINTER TO LIST
	ISZ	SORTB
	DCA	XR
SORTA1,	TAD I	XR	/GET ITEM IN TEST LIST
	SPA		/END MARKED BY NEG VALUE
	JMP	SORTA2	/FELL OUT BOTTOM
	CIA STL
	TAD	SCHAR
	SZA CLA		/COMPARE SORT CHAR
	JMP	SORTA1	/NOT IT.
	TAD	XR	/GOT IT. NOW MAKE INDEX
	TAD I	SORTB	/TO JUMP TABLE
	DCA	ITCNT	/THIS IS TABLE POINTER
	TAD I	ITCNT	/GET JUMP ADDRESS FROM TABLE
	SPA		/IF IT IS NEGATIVE,
	JMP	SORTA3	/ITS NOT A JUMP ADDRESS - ITS A VALUE
	DCA	ITCNT
	CLA CLL
	JMP I	ITCNT
SORTA2,	CLA CLL		/FELL OUT BOTTOM
	TAD	SCHAR	/CARRY CHARACTER BACK TO
SORTA3,	ISZ	SORTB
	JMP I	SORTB	/DO SOMETHING ELSE

CSMC,	SCANUP		/GET NEXT CHARACTER IN UPPER CASE
	AND	[77	/MAKE IT A CONTROL CHARACTER
	DCA	SCHAR
	JMP	SORTA1	/SUBSTITUTE IT FOR THE UPARROW

CQSM,	TAD	TFLG
	CMA		/TFLG ALTERNATES BETWEEN 0 AND 7777
	DCA	TFLG
	POPJ

ITCNT,	-3		/**WM**

PCHK,	0		/*DSN JUNE 75; CHECK FOR OVERFLOW
	TAD	P
	STL CIA
	TAD	ZZ
	SPA SZL CLA
	POPJ		/RETURN VALUE OF ZERO
	JMP I	PCHK
	PAGE
	/COMMANDS P AND T

CHRP,	TAD	CFLG
	SPA CLA		/IS THIS COMMAND  M,NP?
	JMP	CHRW	/YES - TREAT LIKE M,NW
	GETN		/COMMAND P - GET # OF PAGES
	CIA
	DCA	CPCT
CPOA,	PUSHJ
		CPOC	/DO N<HPY>
	TAD	ZZ
	SNA CLA		/IF BUFFER WAS NOT EMPTY,
	JMP	.+3
	TAD	CAFF
	OUTPUT		/OUTPUT A FORM FEED BETWEEN BUFFERS
	TAD	SCANP
	TAD	QBASE
	GETQ		/LOOK AHEAD ONE COMMAND CHARACTER
	UPPERC		/**WM**
	TAD	(-127	/IS IT A W?
	SNA CLA		/IF SO, AND
	TAD	QLENGT	/IF WE HAVE NOT RUN OFF THE END OF THE COMMAND
	CIA CLL
	TAD	SCANP	/LINE, INHIBIT THE INPUT PART OF THIS
	SNL CLA		/OPERATION.
	JMP	.+3	/(WHOEVER THOUGHT OF THE "PW" COMMAND SHOULD BE SHOT)
	PUSHJ
		CHRY
	ISZ	CPCT
	JMP	CPOA
	POPJ
CPCT,	0
CPOC,	PUSHJ
		CHRH
CHRW,	CLA IAC		/*K* DEPENDS ON FACT THAT OUTPUT=TYPE+1 **
CHRT,	TAD	(TYPE	/W AND T COMMANDS - SAME THING, DIFFERENT DEVICES
	DCA	CWOUT
	JMS	NLINES	/CONVERT LINES TO CHARS
CWOA,	CMA
	DCA	NLINES	/SET CHARACTER COUNT
	TAD	NLINES
	CIA
	MQLDVI		/COMPUTE HOW MANY WORDS THIS OUTPUT WILL USE
	6		/(BY TAKING 2/3 OF THE NUMBER OF CHARACTERS,
	CLL CML RTL	/ BU THAT'S SLOW SO WE TAKE 4/6 AND ROUND)
	JMS I	(FITS	/DETERMINE WHETHER THE OUTPUT WILL FIT
ERR17,	ERR		/NO - TELL THE USER
	CLA		/CLEAR CRAP FROM AC
	JMP	CWOC
CWOB,	CDF 10
	TAD I	M
	AND	[177
	CDF 0
CWOUT,	0		/TYPE, OUTPUT, OR QPUT
	ISZ	M
CWOC,	ISZ	NLINES	/DONE?
	JMP	CWOB	/NO
	POPJ
/X COMMAND AND LINES-TO-CHARACTER CONVERTOR

CHRX,	QREF		/COMMAND X
	JMS	NLINES	/CONVERT LINES TO CHARS
	ADJQ		/ADJUST Q-REGISTERS AND SET UP NEW LENGTH.
	TAD	(QPUT
	DCA	CWOUT	/SET OUTPUT ROUTINE TO STORE INTO Q REG
	TAD	MQ	/LOAD THE CHARACTER COUNT
	JMP	CWOA	/GO TO TEXT OUTPUTTER

NLINES,	0		/CONVERT + OR - N LINES AROUND . TO CHARS M,N
	ISZ	CFLG	/WAS THERE A COMMA?
	SKP		/NO
	JMP	MFROMN	/YES - DON'T CONVERT LINES TO CHARS
	TAD	P
	DCA	M
	DCA	CFLG	/*DSN OCT 75
	PUSHJ		/CHRL DOES A "GETN"
		CHRL	/TO GET THE DEFAULT VALUES OF N
	TAD	P
	DCA	N
	TAD	M
	DCA	P
MFROMN,	DCA	NFLG	/CLEAR NFLG IN CASE COMMA FLAG WAS ON
	TAD	N
	BZCHK		/IS N OK?
	CMA CLL		/YES - COMPUTE N-M
	TAD	M	/BY COMPUTING M-N-1
	CMA		/AND COMPLEMENTING IT
	SNL		/IS M>N?
	JMP I	NLINES	/NO - RETURN N-M
	TAD	M	/N-M+M=N NOW IN AC.
	DCA	CPCT	/INTERCHANGE M AND N
	TAD	M
	DCA	N
	TAD	CPCT
	DCA	M
	JMP	MFROMN
/COMMANDS ; AND >

CSEM,	TAD	ITRST	/COMMAND ; - ALSO HERE ON FAILING NON-COLON SEARCH
	SNA CLA
ERR09,	ERR		/IF NOT IN ITERATION
	TAD	N
	SMA CLA
	NCHK
	JMP	ZRON	/NO NUMBER - IGNORE IT, WE DID IT ALREADY
	SKPSET		/NO, PLOD THROUGH
		76	/LOOKING FOR >
	ENTRCE		/ITS THE RIGHT ONE - TURN TRACE BACK ON
	JMP	CGSG

CHGT,	ISZ	ITRCNT	/LOOK FOR COUNT EXHAUSTED
	JMP	CGTC	/NO, CONTINUE
CGSG,	JMS	POPITR	/POP UP OLD ITERATION PARAMETERS
	JMP I	[IREST
CGTC,	TAD	ITRST
	SNA
ERR10,	ERR		/IF NOT IN ITERATION
ZROSPN,	DCA	SCANP	/RESET TO BEGINNING OF ITERATION
ZRON,	DCA	NFLG	/KILL NUMBER FLAG
	JMP I	[IREST

CATS,	STA		/@ COMMAND - FAKE OUT "IREST"
IREST,	DCA	QFLG	/RESET QUOTED STRING FLAG
	TAD	CAAM
	DCA	QUOTE	/RESET QUOTE CHAR TO ALTMODE
	POPJ		/RETURN

POPITR,	0
	CLA IAC		/** AC NOT NECESSARILY 0 ON ENTRY
	POPL
		ITRCNT
		ITRST
	JMP I	POPITR
	PAGE
/COMMANDS A AND Y

CHRA,	NCHK		/COMMAND A
	JMP	CHAA
	TAD	N
	TAD	P
	DCA	R
	CDF 10
	TAD	R
	CMA CLL
	TAD	ZZ	/RETURN 0 IF POINTER OUTSIDE RANGE [0,Z-1]
	SZL CLA		/OTHERWISE VALUE OF CHARACTER AT POINTER POSITION
	TAD I	R
	AND	[377
	CDF 0
	JMP I	(NCOM

CHRY,	DCA	NFLG	/COMMAND Y - IGNORE NUMERICAL ARG, IF ANY
	DCA	ZZ
	DCA	P	/WIPE OUT THE BUFFER
CHAA,	TAD	(ZMAX-1
	AND	REND
	CIA CLL
	TAD	ZZ	/IF WE HAVE ALREADY SEEN THE INPUT EOF,
	SZL CLA		/OR IF WE'RE ALREADY FULL(OR NEARLY SO)
	JMP	APLF	/GET OUT
DECGET,	ISZ	ICRCNT
	JMP	I2	/NO NEED TO READ
	CLL
	TAD	INRSIZ
	TAD	INRCNT
STECO1,	SNL		/"SKP!CLA" FOR SUPERTECO
	DCA	INRCNT	/UPDATE RECORD COUNT
	CDF 0		/**WM** 'NOP' IF 8K !RTS8!
	CLL CML CMA RTR	/IF WE OVERFLOWED THE END OF THE FILE,
	RTR
	RTR		/SHORTEN THE READ BY THE CORRECT AMOUNT
	TAD	INCTLW
	DCA	INCTRL	/SO THAT WE WILL NOT READ TOO FAR
	JMS I	INHND
I3,
INCTRL,	0400
BUFIN,	IN		/6200 **WM**
IBLK,	0
	SMA CLA
	SKP
	JMP	INER	/IGNORE END-OF-FILE ERRORS, WE'LL SEE THE ^Z.
	TAD	IBLK
	TAD	INRSIZ	/BUMP RECORD NUMBER BY THE MAXIMUM NUMBER
	DCA	IBLK	/(IF WE READ SHORT ITS THE LAST ONE ANYWAY)
	CLA CMA
	TAD	BUFIN
	DCA	INXR	/SET UP INPUT XR
	TAD	INPCNT
	DCA	ICRCNT
	MTHREE
	DCA	I3
I2,	CDF 20		/CDF 20 IF 12K, NOP IF 8K
	ISZ	I3
	JMP	I1	/NORMAL CHARACTER
	MTHREE		/WEIRD CHARACTER-RESET SWITCH
	DCA	I3
	MTWO
	TAD	INXR
	DCA	INXR	/MOVE INPUT XR BACK TO BEGINNING OF DBLWORD
	TAD I	INXR
	AND	[7400
	DCA	FFFLAG	/TEMP
	TAD I	INXR
	AND	[7400
	CLL RTR
	RTR
	TAD	FFFLAG
	CLL RTR
	RTR
	SKP
I1,	TAD I	INXR
			/**WM** MOVED CDF TO 'STECO1+2' !RTS8!
	AND	[177	/MASK OFF GARBAGE
	/INPUT CHARACTER IN AC

	SZA
	TAD	(-177
	SNA		/IGNORE BLANK TAPE AND RUBOUTS
	JMP	DECGET
	TAD	(177-32
STECO2,	SNA		/"SKP" FOR SUPERTECO
	JMP	APFS	/ITS A ^Z
	TAD	(16
	SNA
	JMP	APFF	/ITS A FORM FEED
	TAD	CAFF	/RESTORE CHAR
	CDF 10
	DCA	MQ	/SAVE CHAR
	TAD I	ZZ	/PROTECT HIGH-
	AND	[7400	/ORDER BITS
	TAD	MQ	/OF TARGET
	DCA I	ZZ	/STORE CHAR IN BUFFER
	TAD	MQ
			/**WM** REMOVED 'CDF 0' !RTS8!
	ISZ	ZZ
	TAD	[-12
	SNA CLA		/IF THE CHAR IS A LINE FEED,
	TAD	(-310	/CHECK THAT THE BUFFER IS NOT NEARLY FULL
	JMP	CHAA
APFS,	DCA	REND	/SIGNAL END OF FILE
	SKP
APFF,	STA
APLF,	DCA	FFFLAG	/SET FORM FEED FLAG
	CDF 0		/**WM** BE SURE TO SET FLD 0 !RTS8!
	POPJ

INER,	DCA	REND	/INHIBIT FUTURE INPUTS
ERR15,	ERR

INCTLW,	INCTL		/1021 IF 12K MACHINE 621 **WM**
INPCNT,	INCNT		/5000 IF 12K MACHINE -1400 **WM**
CCMA,	NCHK		/COMMAND ,
	JMP	NERR	/NUMBER FLAG NOT SET
	TAD	N	/MOVE N TO M
CCMA3,	DCA	M	/ENTERED HERE BY "H" COMMAND
	DCA	N	/AND CLEAR N
	STA
	DCA	CFLG	/SET COMMA FLAG
	POPJ

QTST,	0		/SUBROUTINE TO GET A CHAR AND TEST FOR ALTMODE
	SCAN
	SORT
		QUOTE
		QTST-QUOTE	/RETURN IF QUOTE FOUND
	ISZ	QTST
	JMP I	QTST	/SKIP-RETURN WITH AC INTACT IF NOT FOUND
	PAGE
/TELETYPE ROUTINES
TPUT,	0		/TELETYPE OUTPUT
	DCA	QADJ
TPUTX,	CTCCHK		/CHECK FOR ^C OR ^P
	TAD	(3-17	/INHIBIT PRINTING AS LONG AS THERE
	SNA CLA		/IS A ^O IN THE KEYBOARD BUFFER.
	JMP I	TPUT
	TSF		/WAIT FOR TELETYPE FLAG
TSFWT,	DISPLY /JMP .-1	/WHILE WAITING, DISPLAY TEXT ON SCOPE**WM**
	TAD	QADJ
	TLS
	CLA
	JMP I	TPUT

TYPCTV,	0		/TELETYPE STUFFER
	SORT
		CTLBEL
		CTLTAB-CTLBEL
	DCA	SCHAR	/STORE (POSSIBLY TRANSLATED) CHAR
	TAD	SCHAR
	ISZ	COLCT	/BUMP COLUMN COUNTER
	AND	[7740
	SZA CLA		/IS THE CHAR A CONTROL CHARACTER?
	JMP	OUTLF	/NO
	TAD	(136
	JMS	TPUT	/OUTPUT "^"
	ISZ	COLCT
	TAD	[100
OUTLF,	TAD	SCHAR
	JMS	TPUT
	JMP I	TYPCTV
COLCT,	0

OUTCR,	DCA	COLCT	/RESET CHAR COUNT
	JMP	OUTLF
OUTVT,	TAD	[4
OUTFF,	TAD	[7770	/FORM FEED IS 8 LINE FEEDS, VERT TAB IS 4
	DCA	COLCT
ASR33,	TAD	CALF	/SIMULATE FORMFEEDS AND VERT TABS WITH LINEFEEDS
	JMP	OUTCOM	/*K* 8 LOCS AT ASR33 OVERLAYED BY ASR35 CODE

OUTHT,	TAD	COLCT	/COLUMN COUNTER, MOD 8
	AND	[7
	TAD	[7770	/SIMULATE TABS WITH SPACES
	DCA	COLCT
	40		/TAKE UP SPACE SO ASR-35 ROUTINE WILL JUST FIT
	TAD	.-1	/USE SPACES FOR TABS
OUTCOM,	JMS	TPUT	/PUT ONE OUT THE
	ISZ	COLCT	/WINDOW
	JMP	TPUTX	/STILL MORE INSIDE
	JMP I	TYPCTV
	/ROUTINE TO MANIPULATE Q-REGISTER STORAGE

QADJ,	0
	DCA	MQ	/SAVE NEW LENGTH OF Q-REGISTER
	QSUM		/COMPUTE POINTER TO CURRENT Q-REGISTER
	TAD	QP
	TAD I	QPTR
	DCA	R
	TAD I	QPTR	/GET ITS CURRENT LENGTH
	CIA CLL
	TAD	MQ	/COMPUTE DIFFERENCE
	SNL		/ADJUST Q-REGS
	JMP	QDNN	/TO HOLD NEW STRING
	SNA		/CHECK FOR ZERO
	JMP	QADJDN	/NOTHING TO DO
	TAD	QZ	/MOVE Q-REGISTERS UP TO INSERT CHARS
	DCA	QP	/(LINK IS 1 FROM PREVIOUS SNL)
	TAD	QP
	TAD	MQMAX	/SEE IF OUT OF BOUNDS
	SNL CLA		/TWO PLACES TO TOGGLE LINK THERE
ERR12,	ERR		/GETTING TOO FULL
	TAD	QZ
	DCA	Q
	TAD	QP
	DCA	QZ
	ISZ	QP
QUPL,	TAD	Q
	CIA
	TAD	R
	SNA CLA
	JMP	QADJDN
	CMA
	TAD	Q
	DCA	Q
	MTWO
	TAD	QP
	DCA	QP
	TAD	Q
	GETQ
	QPUT
	JMP	QUPL
QDNN,	TAD	R	/MOVE Q-REGS DOWN TO ABSORB CHARACTERS
	DCA	QP
QDNN1,	TAD	QZ
	CIA
	TAD	R	/-NUMBER OF CHARS TO MOVE
	SNA CLA		/DONE?
	JMP	QDNNF	/YES
	TAD	R
	GETQ
	QPUT
	ISZ	R
	JMP	QDNN1	/LOOP AGAIN
QDNNF,	TAD	QP	/SET NEW VALUE
	DCA	QZ	/OF HIGHEST CHAR
QADJDN,	TAD	MQ
	DCA I	QPTR	/SAVE NEW LENGTH OF Q-REGISTER IN Q-REG TABLE
	TAD	QCMND	/SET UP COMMAND LINE AGAIN
	SETCMD		/AS IT MAY HAVE BEEN SHUFFLED.
	QSUM		/RECOMPUTE POINTER TO BEGINNING OF NEW Q-REG
	JMP I	QADJ

MQMAX,	-QMAX

QOVER,	0		/SUBROUTINE TO SKIP TO END OF STRING
	QCHK		/GET THE QUOTE CHARACTER (IF ANY)
	TAD	SCANP
	DCA	OSCANP	/SAVE BACKUP SCAN POINTER
QOVERL,	QUOTST
	JMP I	QOVER	/FOUND AN ALTM OR EQUIVALENT - RETURN
	JMP	QOVERL	/NOT END - SKIP ANOTHER CHAR

EXITGO,	PUSHJ		/EDIT AND GO - A CCL SPECIAL
		EXITC	/FIRST CLOSE OUT THE FILE
	JMS I	(7607	/CALL THE OS/8 SYSTEM HANDLER
	0200		/TO READ IN THE CCL OVERLAY
	CCLADR
	CCLOVL
	HLT		/ERROR ON SYSTEM DEVICE!
	JMP I	.+1	/GO TO THE OVERLAY
	CCLOST		/AT OUR "SPECIAL" LOCATION
	PAGE
	/Q-REGISTER SUBROUTINES

QSUMR,	0		/COMPUTE POINTER TO Q-REG
	SNA
	TAD	QNMBR	/NORMALLY USES QNMBR, BUT CAN BE OVERRIDDEN BY AC
	CIA
	DCA	QP
	TAD	(QARRAY	/BASE ADDR OF Q-REG POINTERS
	DCA	QPTR
	JMP	QSUMB
QSUML,	TAD I	QPTR	/ADD # OF CHARS IN LOWER REG
	ISZ	QPTR	/SKIP VALUE WORD
	ISZ	QPTR	/POINT TO NEXT Q-REG
QSUMB,	ISZ	QP	/REACHED OUR Q-REGISTER YET?
	JMP	QSUML	/NO - ADD IN ANOTHER
	DCA	QP	/SET Q-REGISTER POINTER TO BASE OF DESIRED REGISTER
	JMP I	QSUMR

SGET,	0		/SCAN COMMAND LINE OR MACRO
	CLA		/** CALLED WITH AC NON-ZERO **
	TAD	QLENGT
	CIA CLL
	TAD	SCANP
	SZL CLA		/CHECK THAT WE ARE STILL INSIDE THE COMMAND LINE
	JMP	SGOVFL	/NO - COMMAND DONE
	TAD	SCANP	/GET CHARACTER POSITION IN LINE
	TAD	QBASE	/ADD IT TO THE ADDRESS OF THE LINE
	GETQ		/AND GET THAT CHARACTER.
	DCA	QSUMR
	TAD	TFLG
	AND	QSUMR	/IF THE TRACE FLAG IS ON,
	SZA
	TYPE		/PRINT THE CHAR
	TAD	QSUMR
	ISZ	SCANP	/INCREMENT CHARACTER POINTER AFTER FETCH
	JMP I	SGET	/RETURN
SGOVFL,	TAD	MPDL	/"MPDL" IS THE PUSHDOWN POINTER ON ENTRY TO THIS
	SNA		/MACRO. IF IT IS 0, WE ARE NOT IN A MACRO
	JMP I	(T1	/SO RETURN TO THE USER
	TAD	PDLP	/CHECK THAT THE ENDING POINTER IS THE SAME
	IAC
	SZA CLA		/AS THE ENTRY ONE - OTHERWISE WE HAVE
ERR13,	ERR		/SCREWED UP SOMEHOW (EG WE ARE
	POP		/ IN THE MIDDLE OF A COMMAND)
	DCA	SCANP
	POP
	DCA	ITRST
	POP		/RESTORE THE PREVIOUS VALUES OF
	DCA	MPDL	/MPDL, THE SCAN POINTER AND THE COMMAND LINE
	POP		/POINTER FROM THE PUSHDOWN LIST
	SETCMD
	JMP	SGET+1	/AND FETCH A CHARACTER FROM THE UPPER LEVEL.
CMDSET,	0		/SUBROUTINE TO SET UP COMMAND LINE POINTERS
	DCA	QCMND	/STORE IN COMMAND LINE NUMBER
	TAD	QCMND
	QSUM
	TAD	QP	/GET FIRST LOCATION IN COMMAND LINE
	DCA	QBASE	/AND STORE IN "QBASE"
	TAD I	QPTR
	DCA	QLENGT	/STORE THE LINE LENGTH IN "QLENGT"
	JMP I	CMDSET	/RETURN

QREFER,	0		/SET UP POINTERS FOR Q-REG REFERENCE
	SZA
	JMP	QREFEX	/AHA - WE ALREADY HAVE THE Q-REGISTER
	SCANUP		/GET Q-REGISTER IDENTIFIER
	DCA	QNMBR
	TAD	QNMBR
	TSTSEP		/TEST FOR ALPHANUMERIC (LOWER CASE LEGAL)
ERR03,	ERR		/OOPS - BAD Q-REGISTER REFERENCE
	TAD	QNMBR
	TAD	[7700
	SPA		/NUMERIC?
	TAD	[7	/YES - FORCE NUMBERS UP TO ABUT LETTERS
	TAD	CALF	/FORCE IDENTIFIER INTO THE RANGE 1-44 (OCTAL)
QREFEX,	DCA	QNMBR	/STORE AWAY NUMBER FOR FURTHER REFERENCE
	QSUM		/COMPUTE QP AND QPTR
	JMP I	QREFER	/RETURN

	/SORT LIST FOR " COMMAND

CNDLST,	103		/C
	107		/G
	116		/N
	114		/L
	101		/A
	102		/B
	105		/E

CNDTAB,	TSTSEP		/LEGAL CONSTITUENT OF SYMBOL FOR ASSEMBLER
	SPA SNA CLA	/GT 0
	SNA CLA		/NE 0
	SMA CLA		/LT 0
	SNL CLA		/AFTER
	SZL CLA		/BEFORE
	SZA CLA		/EQ 0
	/COMMANDS " AND '

CDBQ,	NCHK		/COMMAND "
	JMP	NERR	/NO NUMBER TO TEST
	SCANUP
	SORT
		CNDLST
		CNDTAB-CNDLST
	SMA		/CHECK THAT CHAR WAS TRANSLATED
	JMP	SERR	/NO - NO SUCH TEST
	DCA	SKIP	/STORE TEST INSTRUCTION
	TAD	NLINK
	CLL RAL		/SET UP THE LINK
	TAD	N	/PERFORM TEST
SKIP,	HLT		/TEST SKIPS IF TRUE
	SKP CLA
	POPJ		/CONDITION SATISFIED
	STA		/NOT SATISFIED
	DCA	SKIP	/BEGINNING SKIPPING COMMANDS
	SKPSET		/CALL SKIPPING ROUTINE
		47	/FIND A '
	ISZ	SKIP	/FOUND A '
	RESORT		/NEED ANOTHER: BACK TO CSML
	ENTRCE		/RE-ENABLE TRACE
	JMP I	[IREST	/COMMAND ' NO ACTION TO TAKE

CNDI,	SCAN		/HIT ANOTHER "
	STA		/SO SKIP MATCHING '
	TAD	SKIP
	DCA	SKIP
	RESORT		/GO BACK TO CSML

CTLTAB,	OUTLF	/BELL
	OUTFF
	OUTLF	/**WM** DON'T CONVERT ^K FOR SOME TERMINALS
	OUTLF
	OUTCR
POUTHT,	OUTHT
	OUTLF	/**WM** ^F
	OUTLF	/**WM** BACKSPACE ^H
	4044		/$ WITH SIGH BIT ON

	/ALTTAB,4033		/**WM** KEEP LOWER CASE
	/	4033		/ALTMODE WITH SIGN BIT ON
	PAGE
/O COMMAND

CHRO,	TAD	SCANP	/O COMMAND
	DCA	COOQ	/SAVE CURRENT SCAN POINTER
	DCA	NFLG
	DCA	QFLG	/QUOTED "O" COMMAND NOT ALLOWED
	QSKP		/CHECK THAT THERE IS REALLY A STRING HERE
			/BECAUSE WE WILL NOT USE "SCAN" TO GET CHARACTERS
			/FROM THIS STRING IN THE SEARCH LOOP.
	TAD	ITRST	/"O" ONLY SCANS FROM THE BEGINNING OF THE
	DCA	SCANP	/CURRENT ITERATION LOOP.
			/(JUMPS BACKWARD OUT OF ITERATIONS ARE VERBOTEN)
	SKPSET
CS41,		41	/SEARCH FOR !
	TAD	CS41
	DCA	QUOTE	/SET QUOTE CHAR TO !
	TAD	COOQ
	TAD	QBASE
	DCA	QP	/SET UP PTR TO ACCESS GOTO STRING
COOC,	TAD	QP
	GETQ		/GET CHAR FROM GOTO STRING
	CIA
	DCA	MQ	/SAVE IT
	QUOTST		/GET CHAR FROM LABEL
	JMP	COOB	/LABEL EXHAUSTED
	TAD	MQ
	SZA CLA		/MATCH?
	JMP	CSMQ	/NO - REJOIN SEARCH ROUTINE FOR ANOTHER !
	ISZ	QP
	JMP	COOC
COOB,	TAD	MQ
	TAD	CAAM	/IS GOTO STRING EXHAUSTED TOO?
	SZA CLA
	JMP	CSMQ+1	/NO - REJOIN ! SEARCH ROUTINE
	ENTRCE		/RE-ENABLE TRACE
	JMP I	[IREST
COOQ,	0
/ROUTINE TO SKIP COMMANDS UP TO A CHARACTER

SETSKP,	0		/SET UP TO SKIP COMMANDS
	TAD I	SETSKP
	DCA	SKPLST	/CHAR TO TRAP ON
	NOTRCE		/DISABLE TRACE MODE
CSML1,	DCA	BRACKS	/INITIALIZE BRACKET LEVEL
CSML,	SCANUP		/GET A COMMAND CHAR
	SORT
		SKPLST
		SKPTAB-SKPLST
	JMP	CSML	/NOTHING SPECIAL - KEEP GOING
CSMD,	SCAN		/CLEAR OUT MODIFIER
	JMP	CSML

CSMU,	SCAN		/SKIP ^U COMMAND
	SKP CLA		/GET RID OF Q-REG NUMBER
	QSKP		/^R COMMAND - SKIP FIRST STRING
CSMQ,	QSKP		/SKIP OVER A QUOTED STRING
	PUSHJ
		IREST	/FIX UP QUOTE CHAR
	JMP	CSML	/KEEP GOING

CSMY,	TAD	SCHAR	/SKIP ROUTINE FOR ^A AND !
	DCA	QUOTE	/WE MUST SCAN UNTIL WE FIND
	JMP	CSMQ	/A COPY OF THE COMMAND CHARACTER.

CSME,	SCANUP		/FOUND E COMMAND
	SORT
		ESKLST		/LOOK FOR ER,EW, EB, ED **WM**
		ESKTAB-ESKLST	/USE CSMQ TO SKIP
	JMP	CSML	/NO STRING

CSMF,	SCAN		/F COMMAND - BETTER BE FOLLOWED BY S,N, OR _
	CLA
	JMP	CSMQ-1	/SCAN OFF TWO STRINGS

CSMI,	ISZ	BRACKS	/INCREMENT BRACKET LEVEL
	JMP	CSML

CSMO,	STA
	TAD	BRACKS	/DECREMENT BRACKET LEVEL
	SPA
	JMS I	(POPITR	/IF WE EXIT <> POP OFF ITERATION VALUES
	JMP	CSML1

SKPRTN,	TAD	BRACKS	/WE HAVE FOUND THE DESIRED CHARACTER
	SZA CLA		/BUT IF THE BRACKET LEVEL IS NON-ZERO,
	JMP I	(SORTA1	/WE CANNOT ACCEPT IT - KEEP SORTING
	JMP I	SETSKP	/EVERYTHING IS OK - RETURN

BRACKS,	0
/SORT LIST FOR SKIPPING OVER COMMANDS

SKPLST,	0	/TRAP CHAR
	41	/!
	76	/>
	74	/<
	42	/"
	136	/^
	100	/@
	1	/^A
	11	/TAB
	25	/^U
	36	/^^
	105	/E
	106	/F
	111	/I
	116	/N
	117	/O
		/	22	/^R	/**WM**
	123	/S
	137	/_
	22	/^R		/**WM**
	121	/Q
	125	/U
	130	/X
	107	/G
	115	/M
	45	/%

CSMA,	STA		/LIST TERMINATOR
	JMP	CSMQ+1	/FOUND @ - SET QUOTE FLAG AND CONTINUE

/DISPATCH TABLE FOR SKIPPING OVER COMMANDS:

SKPTAB,	SKPRTN	/DESIRED CHARACTER - RETURN
	CSMY	/!
	CSMO	/>
	CSMI	/<
	CNDI	/"
	CSMC	/^
	CSMA	/@
	CSMY	/^A
	CSMQ	/TAB
	CSMU	/^U
	CSMD	/^^
	CSME	/E
	CSMF	/F
ESKTAB,	CSMQ	/I OR ER
	CSMQ	/N OR EW
	CSMQ	/O OR EB
		/	CSMQ-1	/^R	/**WM**
	CSMQ	/S OR ED **WM**
	CSMQ	/_
	CSMQ-1	/^R		/**WM**
	CSMD	/Q
	CSMD	/U
	CSMD	/X
	CSMD	/G
	CSMD	/M
	CSMD	/%
	PAGE
	/COMMANDS ^U AND E - ALSO ERROR ROUTINE

CTLU,	QREF		/COMMAND ^U
	QSKP		/COUNT UP STRING
	TAD	OSCANP
	CMA
	TAD	SCANP	/LENGTH OF STRING
	ADJQ		/ADJUST Q-REGISTERS AND SET NEW LENGTH
	TAD	OSCANP	/RESET SCAN POINTER
	DCA	SCANP
	DCA	NFLG
	NOTRCE
CCUB,	QUOTST
	JMP	CTLUND
	QPUT
	JMP	CCUB
CTLUND,	ENTRCE
	JMP I	[IREST

ERRXX,	0		/ENTRY POINT ALSO SERVES AS A FLAG FOR "TQMK"
	CLA
	CDF 0		/JUST IN CASE
	PUSHJ
		CTLD	/SET RADIX TO DECIMAL (CTLD CLEARS AC)
	TAD	[77
	TYPE
	DCA	N
	TAD	(ERLIST-1
	DCA	XR
ERLOOP,	ISZ	N	/BUMP ERROR NUMBER
	TAD I	XR
	SZA		/END OF LIST?
	TAD	ERRXX	/NO - CHECK FOR MATCH
	SZA CLA		/FOUND WHAT WE WANTED?
	JMP	ERLOOP	/NO - KEEP LOOKING
	JMS I	(ZEROD
	TPUT		/PRINT ERROR NUMBER ON TELETYPE
	TAD I	ERRXX	/GET THE LOCATION AFTER THE CALL
	SNA CLA		/IF ITS ZERO AND WE WERE CHAINED TO,
CHOOPS,	NOP		/ITS A FATAL ERROR - JMP CTLC
FATALJ=	JMP I	(CTLC
CTRLP,	TAD	SCANP
	CIA
	DCA	ERRXX	/SET ERRXX TO CHAR POSITION OF ERROR CHAR.
	KCC		/ZAP KEYBOARD FLAG
	JMP I	(T0	/CONTINUE AS NORMAL UNLESS USER TYPES "?"

CHRE,	SCANUP		/COMMAND E
	SORT
		ENBLST
		ENBTAB-ENBLST
	JMP	SERR	/NO SUCH COMMAND
	/COMMANDS I AND <TAB>

CHRI,	NCHK		/I COMMAND
	JMP	CIL1
	TAD	N	/INSERT CHAR WHOSE VALUE IS N
	JMS	UPOC
	POPJ
CTLI,	DCA	QFLG	/CANNOT BE QUOTED
	CLA CMA		/FOR TAB INSERT
	TAD	SCANP
	DCA	SCANP	/BACK UP SCAN POINTER BY ONE
CIL1,	QSKP		/COUNT LENGTH OF INSERTION
	DCA	DVT1	/ZERO FUDGE USED BY "^R" COMMAND
CIL2,	TAD	OSCANP
	TAD	QBASE
	DCA	QP	/SET UP POINTER TO INSERTION STRING
	TAD	SCANP
	CIA CLL
	TAD	OSCANP
	DCA	MQ	/STORE CHAR COUNT TO INSERT (-1)
	TAD	MQ
	TAD	DVT1	/ADD "^R" FUDGE
	CMA
	SNL		/DID WE INSERT MORE THAN WE DELETED?
	JMP	EXPAND	/YES - IGNORE SIGN BIT OF COUNT
	PUSHJ
		ADJ	/COMPRESS OUT EXCESS DELETED STUFF
	JMP	CIL4
CIL3,	TAD	QP
	GETQ		/GET A CHAR
	DCA	TYI
	JMS	STOREC	/STORE A CHARACTER
	ISZ	QP
CIL4,	ISZ	MQ
	JMP	CIL3	/OF INSERTION
	JMP I	[IREST

STOREC,	0		/STORE CHAR IN "TYI" INTO TEXT BUFFER AT P
	CDF 10
	/	TAD I	P	/**WM** IF 8K
	/	AND	[7400
	TAD	TYI
	DCA I	P
	CDF 0
	ISZ	P
	JMP I	STOREC
/SEARCH STRING MODIFIERS:

SCHLST,	16	/^N - ANYTHING BUT
	21	/^Q - LITERALLY
	23	/^S - ANY SEPARATOR
	30	/^X - ANYTHING

/G COMMAND

CHRG,	QREF		/G COMMAND - GET Q-REGISTER NUMBER
	DCA	NFLG
	TAD I	QPTR	/GET COUNT OF CHARS IN REGISTER
	CMA
	DCA	MQ	/SAVE AS TRANSFER COUNT
	TAD I	QPTR
EXPAND,	PUSHJ		/COME HERE FROM INSERT LOGIC
		ADJ+2	/INCREASE TEXT BUFFER SIZE ( Q-REG LENGTH MAY
	JMP	CIL4	/BE NEGATIVE) AND GO TRANSFER THE CHARS

TYI,	0		/TELETYPE INPUT
	KSF		/WAIT FOR THE KEYBOARD FLAG
KSFWT,	DISPLY	/JMP .-1/WHILE WAITING, DISPLAY TEXT ON SCOPE**WM**
	CTCCHK		/CHECK FOR ^C
	KRB		/WATCH OUT - AC MAY NOT BE 0!
	AND	[177
	SNA
	JMP	TYI+1	/IGNORE NULL CHARS AND LEADER
	/	SORT	/**WM** WE USE ONLY ONE SORT
	/	ALTLST
	/	ALTTAB-ALTLST	/LOOK FOR NON-STANDARD ALTMODES
/	AND	[177	/IN CASE WE RETURNED A NEGATIVE VALUE
	JMP I	TYI

UPOC,	0		/MOVE TEXT BUFFER UP ONE CHAR
	AND	[177
	DCA	TYI
	CLA IAC
	PUSHJ
		ADJ
	JMS	STOREC	/STORE CHAR IN THE HOLE WE MADE
	JMP I	UPOC
	PAGE
	/FILE OPEN COMMMANDS:

EBAK,	CLA CMA		/"EDIT BACKUP" COMMAND
	PUSHJ		/USE 'ROPEN' TO SET POINTERS
		ROPEN	/WITHOUT KICKING OUT THE USR (AC=-1 ON ENTRY)
	TAD I	(DEVNO	/DEVICE #
	TAD	(OSDCBT-1
	DCA	R
	CDF 10
	TAD I	R	/GET DEVICE CODE FROM DCB TABLE
	CDF
	SMA CLA		/NEGATIVE IF FILE-STRUCTURED
	JMP I	(EBERR	/YOU CAN'T DO THAT!
	TAD	NAME+3	/EXTENSION
	DCA	R	/SAVE IT
	TAD	DOTBK	/.BK EXTENSION
	DCA	NAME+3
	CIF 10
	TAD I	(DEVNO	/DEVICE #
	JMS I	[200	/DELETE THE OLD BACKUP
	4
	NAME
	0
DOTBK,	213		/WHO CARES IF IT'S NOT THERE?
	TAD	R	/OLD EXTENSION
	DCA	NAME+3
	CLA CLL CML IAC	/SET EDIT BACKUP FLAG AND DO AN "ENTER"
WOPEN,	DCA	EBFLG
	CLA IAC		/OPEN OUTPUT FILE
	JMS I	(OPEN	/ENTER CODE IN AC
OUHNDL,	OUHAND+1	/HANDLER ADDRESS; +1 2-PAGE **WM**
	DCA	OUTHND	/HANDLER ENTRY
	TAD I	(DEVNO
	DCA	ODEV	/SAVE DEV #
	DCA I	(OCNT	/CLEAR BLOCK COUNT
	TAD I	(FLN
	DCA	OMAXLN	/MAXIMUM FILE LENGTH
	TAD	NAME
	DCA	OUNAM
	TAD	NAME+1
	DCA	OUNAM+1
	TAD	NAME+2
	DCA	OUNAM+2
	TAD	NAME+3
	DCA	OUNAM+3
	TAD	(DECPUT
	DCA	OUTR	/ENABLE CHARACTER OUTPUT ROUTINE
	TAD	(ECDISM
	DCA	DECPUT	/FAKE RETURN FROM CHAR I/O ROUTINE
	TAD I	(STBLK
	JMP	OSETP	/SET UP BLOCK NUMBER AND POINTERS
DECPUT,	0		/DEVICE INDEPENDENT I/O
	TAD	[200	/ADD ON PARITY BIT
	ISZ	O3	/3RD CHAR OF 3?
	JMP	O2	/NO
	JMS I	(RT	/YES, SPECIAL HANDLING
	TAD	DM	/TEMP STORAGE
	JMS I	(RT
SETO3,	MTHREE		/RESET SWITCH
	DCA	O3
	ISZ	OCRCNT	/END OF BUFFER?
	JMP I	DECPUT	/NO
	JMS	FITS	/CHECK FOR OUTPUT OVERFLOW
	JMP	OERR	/YUP
	DCA I	(OCNT	/NO - UPDATE OUTPUT COUNT
	JMS I	OUTHND	/OUTPUT THE BUFFER
OUCTRL,	4400
BUFOUT,	OUT
OBLK,	0
	JMP	OERR
	TAD	OBLK
	TAD	INRSIZ	/BUMP THE OUTPUT RECORD NUMBER BY THE MAXIMUM
OSETP,	DCA	OBLK	/SINCE ALL WRITES EXCEPT THE LAST ARE MAXIMAL
	TAD	BUFOUT	/BUFFER POINTERS
	DCA	OPTR1
	TAD	BUFOUT
	DCA	OPTR2
	TAD	OUTSIZ
	DCA	OCRCNT	/DOUBLEWORD COUNT (7377 IF 8K, 6777 IF 12K)
	JMP	SETO3	/SET BYTE COUNTER AND RETURN
OERR,	CLA
	TAD	ERROR
	DCA	OUTR	/INHIBIT FUTURE OUTPUT
ERR14,	ERR
O2,	DCA I	OPTR1	/NORMAL HANDLING
	ISZ	OPTR1	/BUMP POINTER
	JMP I	DECPUT
OPTR1,	0
OMAXLN,	0		/SIZE OF HOLE FOR OUTPUT
OUTSIZ,	OUSIZ		/6777; 7177 **WM**
O3,	0
FITS,	0		/SUBROUTINE TO CHECK FOR OUTPUT OVERFLOW
	TAD	OPTR1	/** AC MAY CONTAIN FUDGE ON INPUT **
	CIA
	TAD	BUFOUT	/COMPUTE NUMBER OF WORDS IN BUFFER
	AND	[7400	/ROUND "UP" TO NEXT BUFFERLOAD
	CIA		/MAKE POSITIVE
	CLL CML RAR
	DCA	OUCTRL	/AND SAVE IT AS A BUFFER CONTROL WORD
	TAD	OUCTRL
	CLL RAL
	CLL RTL		/ISOLATE THE BLOCK COUNT OF THE CONTROL WORD
	RTL		/IN THE LOW ORDER PART OF THE AC
	RAL
	TAD I	(OCNT	/ADD IT TO THE CURRENT OUTPUT COUNT
	CLL CML
	TAD	OMAXLN	/SEE THAT WE DIDN'T OVERFLOW
	SNL SZA		/THE ASSIGNED OUTPUT AREA
	JMP I	FITS	/OOPS - WE DID - ERROR RETURN
	CIA
	TAD	OMAXLN	/SUBTRACT OFF THE LIMIT
	CIA		/TO ARRIVE AT THE UPDATED BLOCK COUNT
	ISZ	FITS
	JMP I	FITS	/AND SKIP RETURN
OUNAM,	ZBLOCK	4	/NAME OF OPEN OUTPUT FILE GOES HERE
	PAGE
/FILE OPEN ROUTINE
ROPEN,	DCA	QPTR	/ENTERED WITH AC=-1 IF MONITOR IS TO BE KEPT
	JMS	OPEN	/LOOKUP CODE IN AC
INHNDL,	INHAND+1	/HANDLER ADDRESS; +1 2-PAGE **WM**
	DCA	INHND	/SAVE HANDLER ENTRY
	STA
	DCA	ICRCNT	/POINTER
	STA
	DCA	REND	/CLEAR END-OF-FILE FLAG
	TAD	STBLK
	DCA I	(IBLK	/FIRST BLOCK
	TAD	FLN
	DCA	INRCNT	/SET UP INPUT FILE LENGTH
	ISZ	QPTR	/SHOULD WE DISMISS THE MONITOR?
	JMP I	PECDSM	/YES - KICK THE USR OUT AND POPJ
	JMP I	[IREST	/EXIT

	/SUBROUTINE TO DO LOOKUPS AND ENTERS

OPEN,	0		/CALLED WITH MONITOR CODE - 2 IN AC
	DCA	RSTSW	/ENTER OR LOOKUP
	SZL CLA		/IF THIS IS THE OUTPUT SIDE OF AN "EB" COMMAND,
	JMP	DEVLOD	/SKIP THE STATEMENT SCAN
	TAD	DSKNAM	/PACKED SIXBIT FOR 'DSK:'
	DCA	DEVC
	TAD	(72	/RESTORE :
	DCA	DEVLST+1
NGO,	DCA	NAME	/CLEAR NAME
	DCA	NAME+1
	DCA	NAME+2
	MTWO
	DCA	PERDSW
	DCA	NAMCNT
NAMEC,	QUOTST		/GET CHAR AND TEST FOR ALTM
	JMP	DEVQOT	/ALTM - END OF NAME
	SORT		/NO - CHECK SPECIAL CHARS
		DEVLST	/([,:,., AND SPACE
		DEVTAB-DEVLST
	TSTSEP		/NO, SEE IF ALPHANUMERIC
ERR08,	ERR		/ILLEGAL CHAR
	TAD	NAMCNT
	TAD	[-10
	SMA CLA		/MORE THAN 6 CHARS?
	JMP	NAMEC	/YES, IGNORE
	TAD	NAMCNT	/NO, PACK IT
	CLL RAR
	DCA	TEMP1	/*K* NOTE ASSUMPTION NAME STARTS AT LOC 0!
	TAD	SCHAR
	UPPERC		/** "UPPERC" ALWAYS COMPLEMENTS LINK
	AND	[77
	SNL
	JMP	.+4
	CLL RTL
	RTL
	RTL
	TAD I	TEMP1
	DCA I	TEMP1
	ISZ	NAMCNT
	JMP	NAMEC

PERD,	ISZ	PERDSW	/FOUND A PERIOD
	TAD	NAME
	SNA CLA		/ERROR IF WE HAVE
	JMP	ERR08	/DOUBLE PERIODS OR NO FILE NAME
	DCA	DEVLST+1	/DEVICE NO LONGER LEGAL
	DCA	NAME+3	/ZERO EXTENSION OUT
	TAD	(6	/AND SET POINTER TO 6TH CHARACTER
	JMP	NAMEC-1

COLON,	TAD	NAME+1
	SNA		/WE MUST PACK THE NAME INTO ONE WORD OURSELVES
	JMP	.+5	/BECAUSE IF "OPEN" IS CALLED FROM THE OUTPUT
	TAD	NAME	/SIDE OF AN "EB" COMMAND, WE SKIP
	SMA CLA		/THE NAME COLLECTOR.(WITH GOOD REASON -
	CLL CML RAR	/THE USR OVERLAYS THE COMMAND LINE).
	TAD	NAME+1	/SINCE THE OS/8 "ASSIGN" CALL TO THE USR
	TAD	NAME	/REPLACES THE 2ND NAME WORD WITH THE DEVICE
	DCA	DEVC	/NUMBER, ALL NAME INFO MUST BE HELD IN WORD 1.
	JMP	NGO-1	/DEVICE NAME STORED - RESET FOR FILE NAME

DEVLST,	56		/.
	72		/:
DSKNAM,	5723		/=0423+1300+4000 - SERVES AS LIST TERMINATOR
DEVQOT,	ISZ	PERDSW	/IF WE NEVER SAW A PERIOD,
	DCA	NAME+3	/WIPE OUT THE EXTENSION
	JMS I	(GETUSR	/BRING USR INTO CORE

DEVLOD,	TAD I	OPEN	/MOVE HANDLER ADDRESS
	DCA	DEVHND
	ISZ	OPEN	/AND BUMP POINTER
	TWO
	TAD	RSTSW
	DCA	CODE	/ENTER OR LOOKUP
	CIF 10		/AND RESET TABLES
	JMS I	[200
	13
RSTSW,	0		/DON'T ZAP OPEN FILES ON INPUT
	DCA	DEVNO	/ZERO SECOND NAME WORD
	CIF 10
	JMS I	[200
	1		/ASSIGN HANDLER
DEVC,	0
DEVNO,	0
DEVHND,	0
	JMP	OPNERR	/ERROR - KICK USR OUT FIRST
	DCA	STBLK
	TAD	RSTSW	/GET LOOKUP-ENTER SWITCH
	TAD	NAME	/IF NAME IS NULL AND THIS IS A LOOKUP,
	SNA CLA
	JMP	OPSUCC	/IT JUST SUCCEEDED
	TAD	DEVNO	/DEVICE #
	CIF 10
	JMS I	[200
CODE,	0		/ENTER OR LOOKUP
STBLK,	0		/FILLED WITH STARTING BLOCK
TEMP1,
FLN,	0		/FILLED WITH -LENGTH
	JMP 	OPNERR	/ERROR
OPSUCC,	TAD	DEVHND	/HANDLER ADDRESS IN AC
	JMP I	OPEN
PERDSW,	7777		/FLIP FLOP FOR EXTENSION
NAMCNT,	0		/CHARACTER COUNT

OPNERR,	TAD	RSTSW	/WE SHOULD ONLY KILL THE OUTPUT FILE
	SNA CLA
	JMP	.+3	/IF THIS IS AN OUTPUT ERROR
EBERR,	TAD	ERROR
	DCA	OUTR
	PUSHJ
PECDSM,	ECDISM		/DISMISS THE USR
ERR16,	ERR
	0		/*K* TELLS ERR RTN TO EXIT IF WE WERE CHAINED TO
	PAGE
/ENDFILE PROCESSOR

ENDFIL,	TAD	OCRCNT
	CMA		/REDUCE THE OUTPUT DOUBLEWORD COUNT
	AND	[177	/TO REFLECT ONLY THOSE WORDS REMAINING
	CMA		/UNTIL THE NEXT BLOCK BOUNDARY
	DCA	OCRCNT
	TAD	DV7200
	DCA	MQ	/SET COUNTER FOR ONE BLOCK WORTH OF STUFF
	TAD	(32	/^Z END-OF-FILE
	OUTPUT
	ISZ	MQ
	JMP	.-2	/FILL AT LEAST THE CURRENT BUFFER AND OUTPUT IT
	TAD	ODEV	/MAKE SURE THE USR KNOWS THE HANDLER
	TAD	(OSHNDT-1	/*K* - POINTER INTO
	DCA	TY	/ OS/8 DEVICE RESIDENCY TABLE
	CDF 10
	TAD	OUTHND
	DCA I	TY	/MARK THE HANDLER AS IN CORE
	JMS I	(GETUSR	/LOCK THE USR INTO CORE
	TAD	EBFLG	/IS THIS AN EDIT BACKUP?
	SNA CLA
	JMP	NORMAL	/NO, JUST CLOSE FILE
	TAD	OCNT-1	/YES, LOOKUP OLD FILE TO CHANGE NAME
	DCA	TY-1
	CIF 10
	TAD	ODEV	/INPUT AND OUTPUT ARE ON SAME DEVICE
	JMS I	[200
	2
	OUNAM
TY,	0		/USELESS LENGTH--USE IT FOR TEMPORARY
	JMP	NORMAL	/ERROR-JUST CLOSE FILE AND DON'T TELL ANYBODY
	CDF 10		/ALL THAT WAS JUST TO GET THE DIRECTORY IN CORE
	STA		/SO WE COULD FIDDLE WITH IT
	TAD I	(17	/FORM POINTER TO DIRECTORY ENTRY
	TAD I	(1404
	DCA	TY
	TAD	(213	/CHANGE EXTENSION TO .BK
	DCA I	TY
	TAD I	[7	/DIRECTORY BLOCK IT CAME FROM
	AND	[7
	DCA	ACI
	CDF 0
	JMS I	OUTHND
	4210		/WRITE IT BACK OUT
	1400
ACI,	0
	JMP	.-4	/ERROR! KEEP TRYING-THIS CAN BLOW A DIRECTORY
NORMAL,	TAD	ODEV	/CLOSE FILE
	CIF 10
	JMS I	[200
	4
	OUNAM
OCNT,	0		/NUMBER OF BLOCKS
	HLT
	TAD	ERROR	/RESET OUTPUT SUBROUTINE POINTER
	DCA	OUTR	/TO ERROR
ECDISM,	CIF 10		/DISMISS PS/8 USR ROUTINE
	JMS I	[200
	11		/KICK USR OUT
	JMP I	[IREST

SCHSRT,	0		/SORT LETTERS AND NUMBERS
	UPPERC		/CONVERT TO UPPER CASE TO REDUCE CASES
	CLL		/THE LINK WILL ALTERNATE EACH TIME
	TAD	[-60	/WE ADD ONE OF OUR NEGATIVE CONSTANTS.
	SMA		/THE LINK AT THE END WILL TELL WHETHER
	TAD	[-12	/THE CHARACTER WAS ALPHANUMERIC
	SMA		/(I.E. BETWEEN 60-71,101-132 OR 140-172)
	TAD	(-7	/OR A SEPARATOR CHARACTER.
	SMA
	TAD	(-32
	SZL CLA		/WAS IT ALPHANUMERIC?
	ISZ	SCHSRT	/YES
	JMP I	SCHSRT	/SKIP RETURN IF ALPHANUMERIC

RT,	0		/ROUTINE TO PACK THIRD CHAR INTO OUTPUT BUFFER
	CLL RTL
	RTL
	DCA	DM	/CALLED TWICE - FIRST TIME WITH CHAR IN AC,
	TAD	DM	/SECOND TIME WITH "DM" IN AC
	AND	[7400
	TAD I	OPTR2
	DCA I	OPTR2
	ISZ	OPTR2
	JMP I	RT
DVIMQL,	0		/FAKE MQL DVI
	DCA	DVT1	/STORE DIVIDEND
	DCA	MQ	/INITIALIZE QUOTIENT
DV1,	TAD I	DVIMQL	/GET DIVISOR
	CIA
	CLL		/SET UP TO TAKE IMMEDIATE EXIT ON ZERODIVIDE
	TAD	DVT1	/SUBTRACT DIVISOR FROM DIVIDEND
	SNL		/OVERFLOWED YET?
	JMP	DV7200	/YES
	DCA	DVT1	/NO - STORE IT BACK
	ISZ	MQ	/BUMP QUOTIENT
	JMP	DV1	/AND LOOP
DV7200,	CLA
	TAD	MQ
	ISZ	DVIMQL	/SKIP PAST DIVISOR
	JMP I	DVIMQL	/RETURN WITH QUOTIENT IN AC

ERLIST,	-ERR01-1	/LIST OF POINTERS TO ALL POSSIBLE
	-ERR02-1	/CALLS TO THE ERROR ROUTINE.
	-ERR03-1
	-ERR04-1
	-ERR05-1
	-ERR06-1
	-ERR07-1
	-ERR08-1
	-ERR09-1
	-ERR10-1
	-ERR11-1
	-ERR12-1
	-ERR13-1
	-ERR14-1
	-ERR15-1
	-ERR16-1
	-ERR17-1
	0		/ERROR 18 - UNLABELED ERROR - NAMELY "JMS I OUTR"
	PAGE
/DISPLAY ROUTINE FOR A PDP-8 SCOPE **WM**

DSEXIT,	CDF 0		/RESET TO FEILD 0 !RTS8!
	JMP I	.+1
DSPLAY,	0		/TEXT DISPLAY ROUTINE FOR TECO
	MTHREE		/THIS ROUTINE DEPENDS ON THE FACT THAT THE
	TAD	DSPLAY	/HIGH ORDER BITS OF THE X-COORD ARE IGNORED
	DCA	DX	/BY THE VR12 HARDWARE
	TAD I	DX	/GET THE SKIP
	DCA	DLPTST	/PUT IT IN THE LOOP
	TAD	P
	DCA	DX
	TAD	NUMLNS
	CIA		/LOOK BACKWARD
	PUSHJ		/FOR BEGINNING OF DISPLAY AREA
		CHRL+1
	STA 
	TAD	P
	DCA	DM
	TAD	DX
	DCA	P	/RESTORE POSITION
	TAD	NUMLNS	/NOW SCAN FORWARD
	IAC
	PUSHJ		/FOR THE END OF THE DISPLAY AREA
		CHRL+1
	TAD	P
	CIA
	TAD	DM
	DCA	R	/*K* THIS NUMBER MUST GO IN R -
	TAD	DX	/THE ^W COMMAND NEEDS IT THERE
	DCA	P	/RESTORE ORIGINAL P
DSETUP,	TAD	P
	CIA
	TAD	DM
	DCA	DQ	/SAVE COUNT OF CHARS TO CURSOR POSITION
	TAD	DM
	DCA	DX
	TAD	R
	DCA	DR
	TAD	YSTRT
	DCA	YPOS
	CDF 10		/ONLY FIELD 1  INDIRECT REFS IN ROUTINE
	CLA CMA		/FORM FEED
DISCR,	TAD	CACR
	JMS I	(DISCHR
	TAD	[-100
	DCA	XPOS	/SET X POSITION/COLUMN COUNTER
	JMP	DLPTST
	/DISPLAY LOOP

DGETCH,	TAD I	DX	/GET THE CHARACTER FROM FIELD 1
	AND	[177	/AND OFF THE HIGH ORDER BITS
	UPPERC		/CONVERT LOWER CASE
	TAD	[-40
	SMA		/IF NOT A CONTROL CHARACTER
	JMP	DLOOP	/DISPLAY IT AND KEEP GOING
	TAD	(40-15
	SNA		/CR?
	JMP	DISCR	/YES - RESET X COORD
	CLL
	TAD	[4
	SNA		/TAB?
	JMP	DTAB	/YES
	SZL
	JMP	DISLF	/LINE FEED, VERTICAL TAB, OR FORM FEED
	TAD	(11-33
	SNA
	JMP	DSPALT	/ALTMODE
	TAD	(67
	DCA	WASTE	/SAVE CHAR
	TAD	(36
	JMS I	(DISCHR	/DISPLAY ^
	TAD	WASTE
DSPALT,	TAD	[4	/DISPLAY ALTMODE AS $
DLOOP,	TAD	(40
	JMS I	(DISCHR

DLPTST,	HLT		/EITHER KSF OR TSF OR "ISZ R"
	SKP
	JMP	DSEXIT	/EXIT IMMEDIATELY IF TEST SKIPS
	ISZ	DQ	/ARE WE AT THE CURRENT POINTER POSITION?
	JMP	TSTEDS	/NO
	TAD	DLPTST	/SEE IF IOT
	SPA CLA
	TAD	DN	/YES ;KEEP OLD BLINKER
	TAD	[100
	DCA	DN	/LOOPS IN 64
	TAD	DN
	SMA CLA		/32 ON;32 OFF
	JMS I	(BLINK
TSTEDS,	ISZ	DR	/ARE WE THROUGH?
	JMP	DGETCH	/NO
	JMP	DSETUP	/YES - START OVER
DTAB,	TAD	XPOS	/DISPLAY TAB
	AND	[7770
	TAD	[7
	DCA	XPOS
	TAD	CAHT
	JMP	DLOOP+1

DISLF,	DCA	WASTE	/.GT. THAN 1 IF VT. OR FF.
	TAD	YPOS
	AND	[-40	/MAYBE WE HAVE A HALF-LF
	TAD	(-20
	DCA	YPOS
	CMA
	TAD	XPOS
	DCA	XPOS	/DO NOT INC XPOS
	TAD	CALF	/FOR LINE FEED
	JMS I	(DISCHR
	TAD	WASTE
	CLL RAR		/LOOK IF CR IS NEEDED
	SNA CLA
	JMP	DLPTST	/NO
	JMP	DISCR

YSTRT,	760		/HALF A LINEFEED FROM TOP
DN,	0
DR,	0
DQ,	0
YPOS=	NAME		/USE SOME FREE PAGE ZERO LOCATIONS
XPOS=	NAME+1		/FOR OUR TEMPORARIES
WASTE=	NAME+2
DM=	NAME+3		/ *K* WM ALSO USED ELSEWHERE!
	PAGE
DISCHR,	0		/ROUTINE TO DISPLAY A CHARACTER
	DSCD		/SKIP ON CHAR DONE
	JMP	.-1
	DSC		/DISPLAY CHAR
	CLA CLL
	ISZ 	XPOS	/BUMP THE X COORDINATE/COLUMN COUNTER
	JMP I	DISCHR	/RETURN
	TAD	YPOS	/IT WAS AN OVERFLOW
	TAD	(-20	/HARDWARE HANDLES IT
	DCA	YPOS	/BY GENERATING CR, HALF-LF
	TAD	[-100	/RESET X-POSITION FOR CR
	DCA 	XPOS
	JMP I	DISCHR

BLINK,	0		/SUB TO DISPLAY CURSOR
	DSDF		/WAIT FOR CHAR
	JMP	.-1
	TAD	XPOS	/MAKE POS. FOR POINT PLOT
	TAD	[-40
	AND	[77
	CLL RTL		/CHARS ARE 16 WIDE
	RTL
	DLXB		/CLEARS AC
	TAD	[-10
	DCA	INCBLI
	TAD	YPOS
	DLYD		/LOAD Y AND INTENSIFY
	ISZ	INCBLI
	JMP	.-3
	DSPD		/WAIT AND CLEAR
	JMP	.-1
	JMP I BLINK
INCBLI,	0

	PAGE
STABLE,	ZBLOCK	40	/SEARCH BUFFER

CTLW,	NCHK		/^W COMMAND - IF THERE WAS A NUMBER BEFORE
	JMP	.+3	/THE ^W, SET THE NUMBER OF LINES TO DISPLAY
	TAD	N	/EQUAL TO THAT NUMBER.
	DCA	NUMLNS
	ISZ	R	/FAKE OUT!
	DISPLY		/IN ANY CASE, GO THROUGH ONE DISPLAY CYCLE
	POPJ		/THEN RETURN

SAVTRA,	0		/SAVE TRACE MODE
	TAD	TFLG
	DCA	TFGTMP
	DCA	TFLG
	JMP I	SAVTRA	/EXIT WITH TRACE OFF

RESTRA,	0		/RESTORE TRACE MODE
	TAD	TFGTMP
	DCA	TFLG
	JMP I	RESTRA
TFGTMP,	0

CHKQF,	0		/CHECK FOR EXPLICIT QUOTES
	ISZ	QFLG	/QUOTE FLAG SET?
	JMP	.+3	/NO
	SCAN		/GET QUOTING CHAR
	DCA	QUOTE	/PUT INTO SEARCH TABLE
	DCA	QFLG	/ZAP QUOTE FLAG
	JMP I	CHKQF	/RETURN
NXTBUF,	0
	SZA CLA
	JMP	NOWRIT	/READ-ONLY IF AC NOT 0 ON ENTRY
	PUSHJ
		CPOC	/HP
	ISZ	FFFLAG	/IF WE DIDN'T SEE A FORM FEED ON INPUT
	JMP	NOWRIT	/DON'T OUTPUT ONE
	TAD	CAFF
	OUTPUT
NOWRIT,	PUSHJ
		CHRY	/READ NEW BUFFER
	CTCCHK		/CHECK FOR ^C AND ^P
	CLA		/*K* CTCCHK LEAVES AC NON-ZERO!
	JMP I	NXTBUF

CHRU,	QREF		/COMMAND U
	ISZ	QPTR	/POINT TO SECOND WORD
	NCHK
	JMP	NERR	/U MUST BE PRECEDED BY A NUMBER
	TAD	N
	DCA I	QPTR
	POPJ

GETUSR,	0		/ROUTINE TO LOCK THE USR INTO CORE
	CDF 0
	TAD	ZZ	/IF THE TEXT BUFFER IS EMPTY AND
	SNA CLA		/WE HAVE 12K, SO Q-REGS IN FIELD 2,
NWRUSR,	TAD [4		/ 'NOP' IF 8K **WM**
	STL RTR		/THEN WE SHOULD NOT SAVE CORE ON A USR CALL.
	DCA I	(JSBITS	/THIS STORES A 2000 OR A 2001
	CIF 10
	JMS I	(7700	/OK - NOW LOAD THE USR IN
	10
	JMP I	GETUSR
/E COMMAND MODIFIERS

ENBLST,	130		/X: EXIT
	103		/C: CLOSE FILE
	106		/F: WRITE FILE MARK
ESKLST, 122		/R: OPEN INPUT FILE
	127		/W: OPEN OUTPUT FILE
	102		/B: EDIT BACKUP
	104		/D: EDIT DELETE **WM**
	107		/G: EXIT AND GO

/RADIX TABLES:

ORAD,	NOP
	1000
	100
	10
DRAD,	NP&177+1200	/"TAD NP"
	1750
	144
	12

/DISPATCH TABLE FOR E COMMAND

ENBTAB,	EXIT		/X
	EXITC		/C
	ENDFIL		/F
	ROPEN		/R
	WOPEN		/W
	EBAK		/B
	DELETE		/D
	EXITGO		/G

/DISPATCH TABLE FOR NAME PROCESSOR

DEVTAB,	PERD		/.
	COLON		/:

/DISPATCH TABLE FOR COMMAND INPUT

COMTAB,	TBEL		/^G
	TCRLF		/CR
	ROCMND		/RUBOUT
	TCTLU		/^U
	TALTM		/ALTMODE
	TQMK
	TSAVE		/^S
	PAGE
/COMMANDS M AND <
/AND Q-REGISTER STORAGE
COMLST,	7		/^G, COMMAND LINE EDIT LIST
	15		/CR, INSERT CR & LF
	177		/RUBOUT
	25		/^U - RUB OUT LINE
	33		/^[, ALT MODE
	77		/?
	23		/^S - SAVE OLD COMMAND LINE IN Q-REG Z

CHRM,	QREF		/COMMAND M
	TAD	(-4	/4 ITEMS PUSHED TO
	PUSHL		/SAVE CURRENT MACRO STATE
		QCMND
		MPDL
		ITRST	/SO THE "O" COMMAND WILL WORK IN MACROS
		SCANP	/ZEROED BY "PUSHL"
	TAD	PDLP	/MUST CHECK PDL AT END OF MACRO
	CIA
	DCA	MPDL
	TAD	QNMBR	/Q-REGISTER TO EXECUTE
	SETCMD		/SET COMMAND LINE TO THIS Q-REG
	POPJ		/LEAVE NUMBER FLAG ALONE AND EXIT

CHKBZ,	0		/SEE THAT B .LE. C(AC) .LE. ZZ
	CIA CLL
	TAD	ZZ
	SNL		/13-BIT ARITHMETIC
ERR11,	ERR		/C(AC)>ZZ
	CIA
	TAD	ZZ	/RESTORE ORIGINAL AC
	JMP I	CHKBZ

	/ALTLST,175	/ALT MODE **WM**
	/	176	/ANOTHER ALTMODE

CHLT,	MTWO		/COMMAND <
	PUSHL
		ITRST
		ITRCNT
	TAD	N
	CIA		/MAKE NEGATIVE
	DCA	ITRCNT	/SET UP TERMINATION
	TAD	SCANP	/SAVE CURRENT SCAN PNTR
	DCA	ITRST	/ALWAYS .GE. 1 IN ITERATION
	DCA	NFLG	/CLEAR NUMBER FLAG
POPK,	POPJ
NGET,	0		/SUBROUTINE TO GET LAST NUMBER, WITH
	NCHK		/DEFAULT VALUES OF +1 (NO NUMBER),
	JMP	.+3	/OR -1 (JUST A MINUS SIGN)
	TAD	N	/AHA - NO DIGITS SEEN
	JMP I	NGET	/DIGITS SEEN - RETURN THEM
	CLA IAC		/NO DIGITS SEEN
	PUSHJ		/MAKE BELIEVE WE SAW THE DIGIT "1"
		NCOM	/AND CREATE A NUMBER FROM IT (TAKING ANY
	JMP	NGET+1	/OPERATORS HNTO ACCOUNT) AND USE IT

SCUPPR,	0		/SCAN AND CONVERT TO UPPER CASE
	SCAN
	UPPERC
	JMP I	SCUPPR	/THATS ALL?

/Q-REGISTER STORAGE - EACH Q-REGISTER TAKES 2 WORDS.
/WD 1 CONTAINS THE LENGTH OF THE CHARACTER PART OF THE REGISTER (IF ANY)
/WD 2 CONTAINS THE VALUE  OF THE NUMERIC PART OF THE REGISTER (IF ANY)

QARRAY,	ZBLOCK	110	/36 Q-REGISTERS * 2 WORDS/REGISTER = 72 WORDS
QPNTR,	CHNSTR		/FAKE Q-REGISTER FOR INPUT LINE - LENGTH ONLY.
	PAGE
/COMMAND DISPATCH TABLE

CDSP,	POPK;CTLA;SERR;CTLC;CTLD;CTLE;CTLF;CTLC	/0-7
	CTLH;CTLI;POPK;POPK;POPK;POPK;SERR;CTLO	/10-17
	  T0;SERR;CTLR;SERR;CTLT;CTLU;CTLV;CTLW	/20-27 **WM** 'CTLW'
	SERR;SERR;CTLZ;ZRON;SERR;SERR;CTUA;SERR	/30-37
	POPK;CEXP;CDBQ;CNBS;SERR;CPCS;CAMP;ZRON	/40-47
	COPR;CCPR;CAST;CPLS;CCMA;CMIN;CDOT;CVIR	/50-57
	NMBR;NMBR;NMBR;NMBR;NMBR;NMBR;NMBR;NMBR	/60-67
	NMBR;NMBR;CCLN;CSEM;CHLT;CEQL;CHGT;CQSM	/70-77
	CATS;CHRA;CHRB;CHRC;CHRD;CHRE;CHRF;CHRG	/100-107
	CHRH;CHRI;CHRJ;CHRK;CHRL;CHRM;CHRN;CHRO	/110-117
	CHRP;CHRQ;CHRR;CHRS;CHRT;CHRU;SERR;POPK	/120-127
	CHRX;CHRY;CHRZ;SERR;CBSL;SERR;CHUA;CHBA	/130-137
	/END OF DISPATCH TABLE

PDLBEG,	ZBLOCK	11	/BEGINNING OF PUSHDOWN LIST
QPUT12,	ZBLOCK	16	/ROUTINES INSERTED LATER - USED IN
ASR35,	ZBLOCK	10	/INITIALIZATION, OVERLAYED BY PUSHDOWN LIST
PDLEND,	0		/END OF PUSHDOWN LIST
	PAGE
/	INITIALIZATION SECTION
/	ENTER HERE AT 5200 TO MODIFY TECO TO USE A MODEL 35 TELETYPE

TECO35,	ISZ	JTECO	/IF CALLED VIA "R" OR "RUN"
/	TAD I	XR	/MOVE ASR-35 PATCH (WHICH OUTPUTS TABS AND
/	DCA I	INXR	/ FORM FEEDS) OVER PRINT ROUTINE
/	ISZ	ASRCNT
/	JMP	.-3
/	TAD	(OUTHTX
/	DCA I	(POUTHT	/**WM** NO HARDWARE TABS
	TAD	[TECO
	DCA I	(7745	/CHANGE STARTING ADDRESS IN CASE WE'RE RESTARTED
			/AND FALL INTO INITIALIZATION ROUTINE

TCINIT,	TLS		/INITIALIZATION ROUTINE - INITIALIZE THE TTY
	TAD	.-1
	DCA I	[TECO
	TAD	(T0A&177+5200	/"JMP T0A"
	DCA I	PTECO1	/CHANGE THE ENTRY AT 200 SO WE'RE NOT CALLED AGAIN
/	CLA STL
/	6141		/ENTER LINC MODE (MAYBE)
/	4		/ESF - SET SMALL CHARACTERS FOR SCOPE
/	0261		/ROL I 1 - ROTATE LINK INTO AC11
/	0002		/BACK TO PDP-8 MODE
/	SNA CLA		/AC NON-ZERO IF WE ARE A PDP-12
/	JMP	NOTA12	/NO, JUST AN ORDINARY 8
/	TAD	(PDP12-1
/	JMS	CHANGE	/TRADE OFF TWO PAGE HANDLERS FOR A SCOPE
	DCSI		/CLEAR SCOPE
	DCHS		/SCOPE CHANNEL
	DSFF		/FAST MODE
	DLXD		/PLOT APOINT
	AND I	0	/SETS IN 2MMS
	AND I	0
	DSPD
	HLT		/**WM** SCOPE IS NOT THERE!
	TAD	CAFF
	DSC		/INIT FLAG WITH FF
	CLA CLL
NOTA12,	TAD I	(7777	/GET SOFTWARE CORE SIZE (IF ANY) FROM 07777
	AND	(70
	TAD	[7770	/CHECK FOR 8K
	SNA CLA
	HLT /**WM** JMP	JTECO	/YES - DON'T CHECK FOR MORE
	CLA STL RTR	/ANOTHER 2000
ICDF20,	CDF 20
	DCA I	(QFLG
	CLA
	TAD I	(QFLG
	NOP		/PDP-8 EXTENDED MEMORY BUG
ICDF0,	CDF 0
	TAD	QFLG
	TAD	(6000
	SZA CLA		/DO WE HAVE 12K?
	HLT /**WM**	JMP	JTECO	/NO
/	TAD	[QPUTS-1
/	JMS	MOV	/SUBSTITUTE THE 12K OUTPUT
/	TAD	(GETQX-1
/	JMS	MOV	/AND THE 12K GETQ
/	TAD	(TWLVEK-1
/	JMS	CHANGE	/AND CHANGE A WHOLE MESS OF LOCATIONS
JTECO,	JMP I	.+1	/INCREMENTED IF WE WERE'NT CHAINED TO
	CHINIL
PTECO1,	TECO+1
/CHAINED INIT CODE - MOVE 17600 INTO Q-REGISTER SPACE

CHINIL,	CDF 10
	TAD I	DX	/GET A COMMAND LINE CHAR
	CDF 0
	QPUT
	ISZ	INICT
	JMP	CHINIL
	TAD	(FATALJ	/SET UP THE FATAL ERROR EXIT
	DCA I	(CHOOPS	/IN THE ERROR ROUTINE
	JMP I	(CHTECO
INICT,	-CHNSTR
	IFNDEF WVDM	<
MOV,	0
	DCA	XR
	TAD	(-7
	DCA	INXR
	TAD I	SXR
	DCA I	XR	/MOVE CORE
	ISZ	INXR
	JMP	.-3
	JMP I	MOV
ASRCNT,	-10

CHANGE,	0		/ROUTINE TO CHANGE SPECIFIC LOCATIONS
	DCA	XR	/STORE TABLE POINTER
CHANGL,	TAD I	XR	/GET LOCATION
	SNA
	JMP I	CHANGE	/END OF LIST - RETURN
	DCA	MOV
	TAD I	XR	/GET CONTENTS
	DCA I	MOV	/ZAP!
	JMP	CHANGL
/LOCATIONS TO CHANGE IF WE'RE RUNNING ON A PDP-12

PDP12,	KSFWT;	DISPLY	/FIX KEYBOARD AND PRINTER WAITS
	TSFWT;	DISPLY	/SO THEY DISPLAY WHILE WAITING
	CDSP+27;CTLW	/ENABLE ^W COMMAND
	INHNDL;	7200	/ONE PAGE INPUT HANDLER ONLY
	OUHNDL;	7400	/DITTO OUTPUT HANDLER
	0

/LOCATIONS TO CHANGE IF WE HAVE 12K OF CORE

TWLVEK,	INRSIZ;	4	/INPUT BUFFER GROWS TO 4 BLOCKS LONG
	INCTLW;	1021	/AND LIVES IN FIELD 2
	INPCNT;	5000
	I2;	CDF 20
	IC;	CDF 0	/THIS WAS A NOP TO SPEED UP SRT-8 OPERATION
	L12K1;	J12K1	/SPEED UP TEXT MOVE ROUTINES,
	L12K2;	J12K2	/SINCE Q-REGISTERS DON'T SIT ON TOP OF TEXT.
	OUTSIZ;	6777	/OUTPUT BUFFER TAKES OVER OLD INPUT BUFFER SPACE
	BUFIN;	5600
	NWRUSR;	TAD [4	/LET USR BE CALLED WITHOUT SAVING CORE
	MQMAX;	-Q12MAX	/ALLOW MORE Q-REGISTER STORAGE
	QLIMIT;	12-Q12MAX
	0
	PAGE
	/ROUTINES TO BE (POSSIBLY) SWAPPED INTO TECO

	*QPUT12
	NOPUNCH
	*QPUTS
	ENPUNCH
QPUTS,	0		/12K Q-REGISTER PUT ROUTINE
	AND	[377
	CDF 20
	DCA I	QP
	CDF 0
	ISZ	QP
	JMP I	QPUTS

	NOPUNCH
	*GETQX
	ENPUNCH
GETQX,	0		/12K Q-REGISTER GET ROUTINE
	DCA	CHKCTC
	CDF 20
	TAD I	CHKCTC
	CDF 0
	AND	[377
	JMP I	GETQX

	NOPUNCH
	*ASR33
	ENPUNCH
	JMP	OUTCMX	/ FORM FEED/VERT. TAB - USE 8/4 FILLERS
OUTHTX,	TAD	COLCT	/GET COLUMN COUNTER
	RTR
	RAR
	CLA CMA RAL	/OUTPUT 2 FILLERS IF MORE THAN 4 CHARS TO TAB
	DCA	COLCT	/OTHERWISE 1 (COLCT IS A MODULO 8 COUNTER)
OUTCMX,	TAD	SCHAR	/GET CONTROL CHAR TO TYPE
	JMS	TPUT	/AND TYPE IT - WE WILL NOW FILL WITH NULLS

	>
	$