.TITLE	TEXT EDITOR - V8A (EDIT 5: 5-6-70)
/COPYRIGHT 1970, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
/PDP9/15 TEXT EDITOR, VERSION 8A FOR BACKGROUND/FOREGROUND OR BACKGROUND ONLY.
/ASSEMBLY PARAMETER ASSIGNMENTS:
/   I.  PDP9/15 BULK STORAGE SYSTEMS --
/	PDP9 MUST BE DEFINED FOR PDP9 ASSEMBLY
/  II.  PDP-7 RETROFIT DECTAPE SYSTEMS --
/       THE SYMBOL "PDP7" MUST BE DEFINED. THIS 
/       ASSIGNMENT SETS UP THE .LOC PROPERLY FOR THE PDP-7
/       BOOTSTRAP.
/ III.  PDP9/15/7 PAPER TAPE SYSTEMS --
/       A. THE SYMBOL "PTP" MUST BE DEFINED.
/       B. THE SYMBOL "BANK" MUST BE EQUATED TO THE TOTAL
/          NUMBER OF 8K MEMORY BANKS (UP TO FOUR) AVAILABLE IN
/          THE OBJECT SYSTEM, THUS:
/	   FOR  8K SYSTEMS, ASSIGN "BANK=0"
/	   FOR 16K SYSTEMS, ASSIGN "BANK=1"
/	   FOR 24K SYSTEMS, ASSIGN "BANK=2"
/	   FOR 32K SYSTEMS, ASSIGN "BANK=3"
/ IV   BACKGROUND/FOREGROUND SYSTEM
/	THE SYMBOL "BF" MUST BE DEFINED.
/       NO OTHER PARAMETER ASSIGNMENTS ARE ALLOWED.
	.ABS
/EDITOR ORIGIN ASSIGNMENTS.
	.IFUND	PDP7
	.IFUND	PDP9
PDP15=0
	.ENDC
	.ENDC
EDSTRT=12577		/NORMAL PDP9/15 ORIGIN.
ESTRT7=EDSTRT-142	/PDP-7 ORIGIN.
PTSTRT=EDSTRT+72		/PAPER TAPE ORIGIN.
	.IFDEF PTP
	.IFUND BANK
BANK=0
	.ENDC
EDSTRT=PTSTRT
	.ENDC
	.IFUND PTP
	.IFDEF PDP7
EDSTRT=ESTRT7
	.ENDC
BANK=0
BULKST=0
	.ENDC
	.LOC BANK*20000+EDSTRT
TTICAL=2776		/DAT SLOT -2: KEYBOARD INPUT
TTOCAL=2775		/DAT SLOT -3: TELEPRINTER OUTPUT
INPCAL=2764		/DAT SLOT -14: EDIT FILE INPUT
OUTCAL=2763		/DAT SLOT -15: EDIT FILE OUTPUT
IN2CAL=2770		/DAT SLOT -10: AUXILIARY INPUT
OPOCAL=1763		/DAT SLOT -15: OPEN OUTPUT FILE
OPICAL=0764		/DAT SLOT -14: OPEN INPUT FILE
.SCOM=100			/SYSTEM COMMUNICATION AREA.
BUFLEN=46			/READ-WRITE LINE BUFFER SIZE.
	.IFUND	.DAT
	.IFUND	PTP
	.IFDEF	PDP15
.DAT=141
	.ENDC
	.IFUND	PDP15
.DAT=135
	.ENDC
	.ENDC
	.IFDEF	PTP
	.IFUND	PDP15
.DAT=135
	.ENDC
	.IFDEF	PDP15
.DAT=136
	.ENDC
	.ENDC
	.ENDC
	.IFUND	BF
DATM14=.DAT-14		/ABSOLUTE DAT -14
DATM15=.DAT-15		/ABSOLUTE DAT -15
	.ENDC
LINSIZ=BUFLEN-2/2*5+1	/MAXIMUM CHARACTERS PER LINE.
QUESMK=77			/QUESTION MARK.
TYLINE	.BLOCK	133
WRBUF1	.BLOCK	BUFLEN
BEGIN	JMP SETBNK	/SET EPC BITS FOR CURRENT BANK.
	TTOCAL		/INITIALIZE TELETYPE.
ONE	1		/..
ADR001	RECOUP		/RETURN FROM CONTROL P.
LOOPCT	0		/TEMPORARY STORAGE.
POINTR=LOOPCT		/..
	DZM BUFEMP
	DZM OUTPSW	/SET OUTPUT AND
	DZM VERISW	/VERIFY TO "ON".
ALTMOD	175\777777	/1'S COMPLEMENT ALT MODE TERMINATOR.
	DAC PBLKSW	/TURN OFF BLOCK MODE.
	DAC GBLKSW	/..
	DAC BRFSW		/SET BRIEF TO OFF.
	DAC OPEN		/ALLOW USE OF OPEN AND
	DAC CALL		/CALL SEQUENCES.
	DAC SAVESW	/TURN OFF SAVE OPTION.
	DAC OUTSW1	/INDICATE NOTHING IN OUTPUT FILE.
	DZM RLFACT	/ZERO CURRENT RELOCATION FACTOR FOR PA AND PL.
	LAW -67		/55(10).
	DAC BUFSIZ	/DEFAULT BLOCK-BUFFER SIZE.
	DAC NAMSW		/INDICATE NO NAME PRESENT.
	LAC JMSCLS	/PERMIT CLOSE SEQUENCE TO USE
	DAC CLOSE1	/SUBROUTINE CLSOUT.
	LAW OUTCAL	/DAT SLOT -15.
	AND ADRMSK	/THROW AWAY JUNK.
	DAC OUTPCL	/INITIAL OUTPUT DAT SLOT IS -15.
	DAC INPTCL	/SET UP INPUT DAT SLOT.
	ISZ INPTCL	/INITIAL INPUT DAT SLOT IS -14.
	DZM DIRSW		/INITIAL TRANSFER DIRECTION (READ -14, WRITE -15).
	LAC TFILE1	/SET UP DEFAULT EDIT FILE NAME (.TFIL2 EDT).
	DAC INNAME	/..
	LAC TFILE1+1	/..
	DAC INNAME+1	/..
	ISZ INNAME+1	/MAKE IT .TFIL2.
	LAC EDNAM		/"EDT"
	DAC INNAME+2	/EXTENSION FOR DEFAULT FILE NAME.
FSTFL1	JMS IOINIT
	JMS FSTAT		/GO SEE IF .TFIL1 EDT IS PRESENT.
	XCT TFILE1	/BIT 0 = 1 MEANS CHECK THE OUTPUT DEVICE.
	DAC LOOPCT	/SAVE RESULTS OF FSTAT.
	LAW EDTMES
	JMS TYPOUT
	LAC LOOPCT	/PICK UP RESULTS OF PREVIOUS FSTAT.
	SNA		/FILE MAY BE PRESENT.
	JMP FND6		/NOT FOUND, OK.
TFIFND	SAD FENCE		/TEMP FILE FOUND, IS OUTPUT DEVICE FILE-STRUCTURED?
	JMP FND6		/NO, THEN GO START UP AS USUAL.
	LAW TFILE1	/YES, INFORM USER OF DIFFICULTY.
	JMS TYNAME	/"FILE .TFIL1 EDT"
	LAW TWOFIL	/COMPLETE THE COMMENT.
	JMS TYPOUT	/"IS PRESENT ON OUTPUT DEVICE."
	LAW TWOFL0	/TYPE NEXT LINE OF COMMENT.
	JMS TYPOUT	/"PLEASE DELETE OR RENAME IT."
	JMP FND6		/GO READ A CONTROL REQUEST (SHOULD BE DELETE OR RENAME).
MOVE	JMP ILLCWD	/MOVE IS NOT IMPLEMENTED.
/TURN ON INPUT MODE.
INPUT	LAW INPTM		/TYPE CONTROL MODE NOW IN EFFECT.
	JMS TYPOUT	/"INPUT"
/MAIN PROCESSING LOOP FOR INPUT MODE.
RDNPUT	LAW TYLINE	/PUT LINE TO BE TYPED IN TYLINE.
	DAC QUIT		/INDICATE PROCESSING IS IN PROGRESS.
	JMS TYPEIN	/THEN GO READ THE KEYBOARD.
	CLA		/WAS CONTROL P STRUCK DURING TYPEIN?
	SAD QUIT		/SKIP IF NOT.
	JMP TTRS		/IF SO, GO RETURN CARRIAGE, CHANGE MODES.
	JMS UNPACK	/NORMAL INPUT LINE, GO UNPACK IT.
EDLAD1	TYLINE		/FROM TYLINE...
EDLADR	EDLIN		/TO EDLIN.
	SNA		/LENGTH COMES BACK IN AC.
	JMP EDIT		/LINE IS EMPTY (JUST CR ISSUED), CHANGE MODES.
	ADD EDLADR	/START OF LINE PLUS LENGTH.
	DAC QUIT		/ADDRESS OF TERMINATOR.
	LAC* QUIT		/GET TERMINATOR TYPED.
	SAD ALTMOD	/ALT MODE?
	JMS TYPRTN	/YES, GO RETURN CARRIAGE.
	JMS PUTLIN	/PUT AWAY THE PREVIOUS CURRENT LINE.
	JMP FULBUF	/FULL BUFFER RETURN.
	LAC EDLADR	/NORMAL RETURN; GET ADDRESS OF CURRENT-LINE BUFFER.
	DAC NXTPTR	/SET UP NEXT-CHARACTER POINTER.
	DZM LENGTH	/ZERO TOTAL CHARACTERS IN CURRENT LINE.
	JMS APPEND	/THEN GO MOVE TYPED INPUT LINE TO INLINE ARRAY.
	JMP RDNPUT	/READ ANOTHER INPUT LINE.
/TURN ON EDIT MODE.
EDIT	LAW EDTM		/TYPE CONTROL-MODE INDICATION.
	JMS TYPOUT	/"EDIT"
	JMP FND6		/GO TYPE A RIGHT ANGLE BRACKET.
/MAIN PROCESSING LOOP FOR EDIT MODE.
RDLIN	DZM QUIT		/INDICATE NO FILE PROCESSING GOING ON NOW.
	LAW TYLINE	/READ NEXT REQUEST FROM TELETYPE.
	JMS TYPEIN	/INPUT-LINE AREA.
	JMS UNPACK	/UNPACK THE TYPED LINE.
ADR002	TYLINE		/FROM TYLINE...
	EDLIN		/...TO EDLIN.
	SNA		/SKIP IF TOTAL CHARS IN LINE .G. 0.
	JMP INPUT		/CARRIAGE RETURN ONLY, CHANGE MODE.
	LAC EDLADR	/EDLADR POINTS TO EDLIN (WHERE TYPED LINE IS).
	DAC NXTPTR	/SET INITIAL POINTER IN NXTCHR.
	JMS GETCOM	/GO EXTRACT CONTROL WORD FROM INPUT LINE.
  
/DECODE WHAT IS PRESUMED TO BE AN EDITING CONTROL WORD (IN CWD ARRAY)
/AND TAKE ACTION IF LEGAL. IF NOT, IGNORE INPUT LINE, COMPLAIN ON
/TELEPRINTER, AND REENTER EDIT MODE READ SEQUENCE AT FND6.
  
DECODE	LAW CWDTBL-TABEND	/TOTAL ENTRIES IN CWD TABLE (2'S COMPLEMENT).
	DAC LOOPCT	/SET UP COUNT OF CONTROL WORDS TO EXAMINE.
	LAC CWDTOP	/GET BEGINNING OF CONTROL WORD TABLE.
CWDLP1	DAC SCN1		/SET UP NEXT CALL TO UNPACK.
	JMS UNPACK	/UNPACK NEXT CONTROL WORD.
SCN1	0		/MODIFIED EACH TIME TO POINT TO NEW ENTRY.
ADR003	TYLINE		/USE TYLINE AS OUTPUT ARRAY.
	JMS SCAN		/COMPARE INPUT COMMAND WITH CURRENT ENTRY.
CWDLIT	CWD		/TYPED COMMAND IS IN CWD...CWD+7.
	TYLINE		/CURRENT TABLE ENTRY HAS JUST BEEN UNPACKED INTO TYLINE.
SKPLIT	SKP		/NO MATCH.
	SKP		/END STRING 1.
	JMP CWDLP2	/FAILED COMPARE, GET NEXT TABLE ENTRY.
	LAC* STR2		/POSSIBLE MATCH, GET NEXT WORD FROM TYLINE.
	SMA!CLL!CML	/MATCH IF NEXT WORD IN TYLINE IS NEGATIVE...
	SKP!CLA!RAL	/...OR IF TOTAL CHARS IN CWD .E. 1.
	JMP CWDISP	/FULL CONTROL WORD, GO DISPATCH.
	SAD NCHARS	/CHECK FOR ABBREVIATION (AC .E. 1 NOW).
	JMP CWDISP	/NCHARS .E. 1, GO DISPATCH.
CWDLP2	LAW -1		/MATCH FAILED, SET UP NEW ARG TO UNPACK...
	TAD* C12		/...USING A POINTER INTERNAL TO UNPACK.
	ISZ LOOPCT	/COUNT ENTRIES IN CONTROL WORD TABLE.
	JMP CWDLP1	/MORE TO DO, CONSIDER NEXT ENTRY.
/UNRECOGNIZED CONTROL WORD COMES HERE.
ILLCWD	LAC BRFSW		/IS BRIEF MODE IN EFFECT?
	SMA		/NOT IF BRFSW IS NEGATIVE.
	JMP TYQUES	/BRIEF MODE ON, JUST PRINT A QUESTION MARK.
	LAW ERREQM	/BRIEF MODE IS OFF, PRINT FULL ERROR MESSAGE.
	JMS TYPOUT	/"NOT A REQUEST:"
	LAW 40		/PRINT A LEADING
	JMS TYONCH	/BLANK CHARACTER.
	JMS PACK		/REPACK INPUT LINE.
ADR004	EDLIN		/FROM HERE.
	TYLINE		/TO HERE.
	LAW TYLINE	/PRINT OFFENDING INPUT LINE.
	JMS TYPOUT	/..
	JMP FND6		/GO BACK TO READ SOME MORE.
TYQUES	LAW QUESMK	/BRIEF IS ON, GET QUESTION MARK.
	JMS TYONCH	/GO TYPE IT OUT.
	JMS TYPRTN	/PRINT CARRIAGE RETURN, LINE FEED.
	JMP FND6		/READ NEXT COMMAND.
CWDISP	LAC TABEND	/GET END OF DISPATCH TABLE.
	TAD LOOPCT	/CALCULATE OUR CURRENT POSITION IN IT.
	ADD XCTZRO	/INSERT AN XCT AS TABLE REFERENCE.
	DAC CWDXCT	/GIVE TO DISPATCHER.
/GO TO SERVICE SECTION FOR THIS CONTROL WORD.
CWDXCT	XX		/RESULTS IN XCT OF PROPER TABLE ENTRY (JMP OR JMS).
QUIT=CWDXCT		/QUIT .NE. 0, COMMAND PROCESSING IS IN PROGRESS.
	JMP FND4		/IN CASE TABLE ENTRY WAS A JMS.
	.EJECT
/TABLE OF CONTROL WORDS FOR COMPARE AGAINST TYPED EDIT COMMANDS.
/CONTROL WORDS ARE LIMITED TO SEVEN CHARACTERS IN LENGTH.
CWDTOP	.-1
	.ASCII 'PRINT'<15>
	.LOC .-1
C104	104
	.ASCII 'NEXT'<15>
	.ASCII 'FIND'<15>
	.ASCII 'LOCATE'<15>
	.LOC .-1
C122	122
	.ASCII 'GET'<15>
	.ASCII 'INSERT'<15>
	.LOC .-1
C111	111
	.ASCII 'DELETE'<15>
NAMSW=.-1		/0, FILE NAME GIVEN IN OPEN REQUEST; -1, NO NAME GIVEN.
	.ASCII 'SIZE'<15>
	.ASCII 'OVERLAY'<15>
	.ASCII 'CHANGE'<15>
NAMSW1=.-1
	.ASCII 'VERIFY'<15>
STR1=.-1
	.ASCII 'TOP'<15>
	.ASCII 'TV'<15>
	.ASCII 'BOTTOM'<15>
STR2=.-1		/POINTER FOR CHANGE REQUEST.
	.ASCII 'BRIEF'<15>
PBLKSW=.-1		/OUTPUT BLOCK BUFFER: 0, WRITE BUFFER. -1, WRITE FILE.
	.ASCII 'RETYPE'<15>
GBLKSW=.-1
	.ASCII 'APPEND'<15>
CURPUT=.-1
	.ASCII 'KEEP'<15>
	.ASCII 'RENEW'<15>
	.LOC .-1
C77	77
	.ASCII 'READ'<15>
	.ASCII 'WRITE'<15>
CURGET=.-1
	.ASCII 'MOVE'<15>
	.ASCII 'PL'<15>
	.ASCII 'PA'<15>
	.ASCII 'CALL'<15>
	.ASCII 'FORM'<15>
	.ASCII 'BLOCK'<15>
DIRSW=.-1
	.ASCII 'OUTPUT'<15>
ERRSW=.-1
	.ASCII 'EXIT'<15>
	.ASCII 'OPEN'<15>
	.ASCII 'CLOSE'<15>
BTEMP=.-1		/GETNUM: TEMPORARY STORAGE.
	.ASCII 'ICLOSE'<15>
BUFEND=.-1
	.ASCII 'SCLOSE'<15>
FBUFSW=.-1
/TABLE OF DISPATCHERS TO CONTROL-WORD SERVICE SECTIONS. ENTRIES ARE
/EITHER "JMP"S OR "JMS"S AND ARE REFERENCED BY AN XCT (AT CWDXCT)
/OF THE APPLICABLE TABLE LOCATION AFTER COMMAND DECODING. NOTE THAT
/ENTRIES ARE SO ORDERED AS TO CORRESPOND WITH ASCII ENTRIES IN TABLE
/OF CONTROL WORDS ABOVE. FOR BOTH TABLES, NOTE THAT ANY CONTROL WORD
/WHICH CAN LEGALLY BE ABBREVIATED MUST PRECEDE ANY OTHER CONTROL WORD
/HAVING THE SAME INITIAL CHARACTER (THUS "BOTTOM" PRECEDES "BRIEF").
		/MAY COMMAND BE ABBREVIATED?
CWDTBL	JMP PRINT		/YES -- "P"
	JMP NEXT		/YES -- "N"
	JMP FIND		/YES -- "F"
	JMP LOCATE	/YES -- "L"
	JMP GET		/YES -- "G"
	JMP INSERT	/YES -- "I"
	JMP DELETE	/YES -- "D"
	JMP SIZE		/YES -- "S"
	JMP OVRLAY	/YES -- "O"
	JMP CHANGE	/YES -- "C"
	JMP VERIFY	/YES -- "V"
	JMP TOP		/YES -- "T"
	JMP TV		/NO!
	JMP BOTTOM	/YES -- "B"
	JMP BRIEF		/NO!
	JMP RETYPE	/YES -- "R"
	JMS APPEND	/YES -- "A"
	JMP KEEP		/YES -- "K"
	JMP RENEW		/NO!
	JMS READ		/NO!
	JMS WRITE		/COULD BE, BUT THIS FACT IS NOT ADVERTISED.
	JMP MOVE		/NOT IMPLEMENTED 10/25/67.
	JMP PRTLOC	/NOT ADVERTISED -- PRINT CONTENTS OF CORE LOCATION.
	JMP PATLOC	/NOT ADVERTISED -- PATCH CORE LOCATION.
	JMP CALL		/NO!
	JMP FORM		/NO!
	JMP BLOCK		/NO!
	JMP OUTPUT	/NO!
	JMP EXIT		/COULD BE, BUT NOT ADVERTISED.
	JMP OPEN		/NO!
	JMP CLOSE		/NO!
	JMP ICLOSE	/NOT ADVERTISED -- CLOSE INPUT FILE, LEAVE OUT FILE OPEN.
	JMP SCLOSE	/NOT ADVERTISED -- CLOSE LEAVING OUT FILE ON SCRATCH DEVICE.
TABEND	CAL TABEND	/13-BIT END-OF-TABLE DEFINITION.
	.EJECT
/PRINT N LINES FROM EDIT FILE.
PRINT	JMS GETNUM	/GET ARGUMENT.
	DAC LOOPCT	/N LINES TO PRINT.
PRLIN	LAC LENGTH	/GET TOTAL CHARS IN CURRENT LINE.
	SNA		/PRINT ONLY IF LINE IS NON-EMPTY.
	JMP PRT1		/OTHERWISE IGNORE IT.
	JMS PACK		/PACK THE CURRENT LINE.
ADR005	INLINE		/FROM INLINE...
	TYLINE		/TO TYLINE.
	LAW TYLINE	/THEN PRINT THIS DATA LINE.
	JMS TYPOUT	/..
PRT1	ISZ LOOPCT	/COUNT LINES TO BE PRINTED.
	SKP		/MORE TO DO.
	JMP FND4		/ALL DONE, RETURN TO COMMAND READER.
	JMS PUTLIN	/WRITE OUT THIS LINE.
	JMP FULBUF	/NO MORE ROOM.
	JMS GETLIN	/GET NEXT LINE.
	INLINE
	JMP EOF		/RETURN IF EOF ENCOUNTERED.
	JMP PRLIN		/GO PRINT NEW CURRENT LINE.
/DELETE N OR 1 LINES.
DELETE	CLA		/SET DELSW TO ZERO.
/MOVE POINTER DOWN N OR 1.
NEXT	DAC DELSW		/SET DELSW. AC IS GUARANTEED NON-ZERO.
	JMS GETNUM	/GET ARGUMENT.
	DAC LOOPCT	/N LINES TO SKIP OVER.
NXTLIN	LAC DELSW		/GET DELETE-NEXT INDICATOR.
	SNA		/DELSW .E. 0, OPERATION IS "DELETE."
	DAC LENGTH	/DELETE, FORESTALL WRITE OF THIS LINE.
	JMS PUTLIN	/NEXT, SAVE CURRENT LINE.
	JMP FULBUF	/..
	JMS GETLIN	/GET NEXT LINE.
	INLINE		/..
	JMP EOF		/..
	ISZ LOOPCT	/COUNT LINES CONSIDERED.
	JMP NXTLIN	/MORE LINES TO SKIP.
	JMP FND4		/ALL FINISHED, RETURN TO MAIN LINE.
/FIND A LINE.
FIND	LAC NXTPTR	/GET POINTER TO CURRENT CHAR IN COMMAND LINE.
	DAC FND2  	/INSERT IN ARGUMENT LIST.
FND1	JMS PUTLIN	/OUTPUT CURRENT LINE.
	JMP FULBUF	/..
	JMS GETLIN	/GET NEXT LINE.
	INLINE		/..
	JMP EOF		/IF END-OF-FILE.
	JMS SCAN		/CALL STRING COMPARER.
FND2	0		/SEARCH FOR THIS STRING...
	INLINE		/...IN THIS LINE.
	SKP		/NOT FOUND.
	SKP		/EOL, STRING 1.
	JMP FND1		/GO BACK TO SEARCH SOME MORE.
/DESIRED LINE HAS BEEN LOCATED. ASCERTAIN WHETHER OR NOT CONFIRMATORY
/PRINT SHOULD BE UNDERTAKEN.
FND3	LAC LENGTH
	SNA
	JMP FND6
	LAC INLADR
	DAC NXTPTR
	ADD LENGTH
	DAC APPEND
	LAC* APPEND
	DAC LOC2
	LAW -3
	DAC TABCT
	LAC BRFSW
	SMA
FNDLP1	JMS NXTCHR
	JMP FND5
	SAD BLANK
	JMP TABFND
	SAD TAB
	JMP TABFND
	SAD SLASH
	JMP FND5-2
	LAC NXTPTR
	DAC APPEND
	LAC* APPEND
	DAC LOC2
	JMP FNDLP1
TABFND	ISZ TABCT
	JMP FNDLP1
	CLA!CMA
	DAC* APPEND
FND5	LAC VERISW
	SPA
	JMP FNDRS
	JMS PACK
ADR006	INLINE
	TYLINE
	LAW TYLINE
	JMS TYPOUT
FNDRS	LAC LOC2
	DAC* APPEND
FND4	LAC QUIT
	SNA
	JMP TTRS
FND6	LAW 76
	JMS TYONCH
	JMP RDLIN
/COME HERE ON BUFFER OVERFLOW
FULBUF	LAW BOVFLM
	JMS TYPOUT
	JMS PACK
ADR011	INLINE
	TYLINE
	LAW TYLINE
	JMS TYPOUT
	JMP FND4
/LOCATE A LINE.
LOCATE	LAC NXTPTR	/GET ADDRESS OF NEXT CHAR IN COMMAND LINE.
	DAC LOC2		/GIVE TO SCAN ARGUMENT LIST.
LOC5	JMS PUTLIN	/WRITE THE CURRENT LINE.
	JMP FULBUF	/FULL-BUFFER RETURN.
	JMS GETLIN	/READ THE NEXT LINE.
	INLINE		/TO CURRENT-LINE AREA.
	JMP EOF		/END-OF-FILE RETURN.
	LAC INLADR 	/GET START ADDRESS OF NEW LINE.
	DAC LOC4		/INSERT AS SCAN ARGUMENT #2.
LOC1	JMS SCAN		/CALL SCAN.
LOC2	0		/STRING TO LOOK FOR.
LOC4	0		/WHERE TO LOOK FOR IT.
TABCT=LOC4		/COUNT OF TABS AND BLANKS FOR BRIEF MODE SERVICER.
	JMP LOC3		/NOT FOUND THIS TRY.
	JMP FND3		/FOUND.
	JMP LOC5		/NOT FOUND ANYWHERE IN THIS LINE.
LOC3	ISZ LOC4		/BUMP SCAN ARG TO NEW STRING IN CURRENT LINE.
	JMP LOC1		/THEN GO SEARCH THE NEW STRING.
/SET VERIFY SWITCH
VERIFY	JMS DCODSW	/GO INTERPRET NEXT WORD IN LINE.
VERISW	0		/VERIFY ON-OFF SWITCH.
	JMP FND4
/SET BLOCK-MODE INDICATOR.
BLOCK	JMS DCODSW	/"ON" OR "OFF"?
BLOKSW	-1		/BLOCK MODE ON-OFF SWITCH.
	SNA
	JMP SETPBL-1
	LAC BUFEMP
	SZA!CLA!CMA
	JMP BLOK01
	DAC GBLKSW
SETPBL	DAC PBLKSW
	JMP FND4
BLOK01	LAW BFNEMM
	JMS TYPOUT
	JMP FND4
/SET BRIEF MODE SWITCH.
BRIEF	JMS DCODSW	/INTERPRET NEXT CONTROL WORD.
BRFSW	-1		/BRIEF IS OFF INITIALLY.
	JMP FND4
/SET OUTPUT-SUPPRESSION INDICATOR.
OUTPUT	JMS DCODSW	/CHECK ARGUMENT.
OUTPSW	0		/OUTPUT IS "ON" IF ZERO.
	JMP FND4
/SET DISPLAY-WANTED INDICATOR.
TV	JMS DCODSW	/GET ARGUMENT.
TVSW	-1		/TV IS OFF INITALLY.
	JMP FND4
/INSERT A LINE AFTER CURRENT LINE.
INSERT	JMS PUTLIN	/WRITE CURRENT LINE.
	JMP FULBUF	/RETURN HERE IF NO MORE ROOM.
	DZM LENGTH	/ZERO TOTAL CHARACTERS.
	JMS APPEND	/CALL APPEND.
	LAC LENGTH	/GET CALCULATED LENGTH.
	SNA		/WAS THERE ANY STUFF AFTER THE COMMAND?
	JMP INPUT		/NO, CHANGE TO INPUT MODE.
	JMP FND4		/YES, GET NEXT COMMAND. LINE INSERTED IS NOW THE CURRENT LINE.
/REPLACE CURRENT INLINE WITH CONTENTS OF EDLIN.
RETYPE	DZM LENGTH	/ZERO TOTAL CHARACTERS PRESENTLY IN CURRENT LINE,
	JMS APPEND	/...THEN PERFORM A NORMAL APPEND.
	JMP FND4		/GO GET NEXT COMMAND.
/ADD SOME DATA TO THE CURRENT LINE.
APPEND	0		/APPEND IS REACHED VIA JMS.
	LAC INLADR	/GET START OF CURRENT LINE.
	ADD LENGTH	/BUMP BY TOTAL DATA CHARACTERS.
	DAC POINTR	/GIVE TO NEXT-CHARACTER INDICATOR
	LAW -2		/ENSURE THAT THIS CHAR WILL FIT.
	TAD MAXLEN	/MAXLEN=(LINSIZ.
	CMA
	TAD LENGTH
	SPA!CLA!CMA	/AC POSITIVE IF LENGTH .GE. MAXLEN-1.
	JMS NXTCHR	/GET NEXT CHARACTER FROM INPUT STREAM
NOPLIT	NOP		/IGNORE NXTCHR END-OF-LINE RETURN.
	DAC* POINTR	/INSERT IN LINE.
	SPA		/END-OF-LINE?
	JMP* APPEND	/YES, RETURN TO CALLER.
	ISZ LENGTH	/NO, BUMP TOTAL CHARACTERS.
	JMP APPEND+1	/GO GET ANOTHER CHARACTER.
/REPLACE STRING 1 WITH STRING 2.
CHANGE	DZM LOOPCT
	JMS NXTCHR	/GET NEXT CHARACTER FROM COMMAND LINE.
	JMP FND3		/NO MORE CHARACTERS, IGNORE CHANGE REQUEST.
	DAC QUOTE		/USE AS QUOTE CHARACTER.
	LAC NXTPTR	/GET POINTER TO NEXT CHARACTER.
	DAC CHSCN1	/USE AS ARG1 TO SCAN.
CHLP1	JMS NXTCHR	/GET NEXT CHARACTER IN STRING 1.
	JMP FND3		/NO MORE CHARACTERS, NO CHANGE POSSIBLE.
	SAD QUOTE		/SECOND APPEARANCE OF QUOTE CHARACTER?
	JMP CHGE1		/YES, ENTER SEARCH LOOP FOR STRING 1.
	ISZ LOOPCT	/NO, COUNT ANOTHER CHARACTER IN STRING 1.
	JMP CHLP1		/GO CHECK MORE CHARS FOR QUOTE.
CHGE1	LAC CHSCN1
	ADD LOOPCT
	DAC STR1
	CLA!CMA
	DAC* STR1
	LAC INLADR
	DAC CHSCN2
CHSCN	JMS SCAN
CHSCN1	0
CHSCN2	0
	JMP RESCAN
	SKP!CLA!CMA
	JMP FND3
	TAD LOOPCT
	CMA
	TAD STR2
	DAC STR1
	LAC EDLAD1
	DAC POINTR
CHLP2	LAC* STR2
	DAC* POINTR
	ISZ STR2
	ISZ POINTR
	SMA
	JMP CHLP2
CHLP3	JMS NXTCHR
	JMP CHDON
	SAD QUOTE
	JMP CHDON
	DAC* STR1
	ISZ STR1
	JMP CHLP3
CHDON	LAC EDLAD1
	DAC STR2
	LAC STR1
	DAC APPEND
CHLP4	LAC* STR2
	DAC* STR1
	ISZ STR2
	ISZ STR1
	SMA!CLA!CMA
	JMP CHLP4
	XOR INLADR	/FORM 1'S COMPLEMENT OF START ADDRESS OF LINE.
	TAD STR1		/LESS ADDRESS+1 OF LAST CHARACTER IN LINE.
	DAC LENGTH	/GIVES NEW TOTAL DATA CHARACTERS.
	LAC* APPEND
	DAC LOC2
	LAC BRFSW
	SMA!CLA!CMA
	DAC* APPEND
	JMP FND5
RESCAN	ISZ CHSCN2
	JMP CHSCN
/SET N LINES IN BLOCK BUFFER.
SIZE	JMS GETNUM	/GET DECIMAL ARGUMENT.
	SAD FENCE		/-1?
	JMP ILLCWD	/ILLEGAL IF SO.
	DAC BUFSIZ	/ARG .G. 1, SAVE NEW SIZE.
	JMP FND4		/GET NEXT COMMAND.
/CHANGE N LINES.
OVRLAY	JMS GETNUM	/GET TOTAL LINES TO REPLACE.
	DAC LOOPCT	/SAVE AS COUNTER.
OVRLP1	DZM LENGTH	/FORESTALL WRITE OF FINAL LINE SKIPPED OVER.
	ISZ LOOPCT	/COUNT CURRENT LINE.
	SKP		/MORE TO DO, GET NEXT LINE.
	JMP INPUT		/DONE, GO CHANGE TO INPUT MODE.
	JMS GETLIN	/READ NEXT LINE FROM FILE OR INPUT BUFFER.
	INLINE		/..
	JMP EOF		/END-OF-FILE RETURN FROM GETLIN.
	JMP OVRLP1	/READ WAS SUCCESSFUL, PROCESS THIS LINE.
/PRINT CONTENTS OF SPECIFIED CORE LOCATION.
PRTLOC	JMS GETOCT	/GET ADDRESS OF LOCATION TO DUMP.
	ADD RLFACT	/ADD RELOCATION FACTOR.
	DAC OCTNUM	/SAVE AS POINTER.
	LAW -6		/SET UP TO PRINT SIX CHARACTERS.
	DAC LOOPCT	/..
	LAC* OCTNUM	/GET CELL TO DUMP.
	DAC OCTNUM	/AND SAVE.
PRTLP1	LAC OCTNUM	/GET NEXT DIGIT, PICK UP CURRENT NUMBER.
	RTL		/..
	RAL
	DAC OCTNUM	/SAVE NEXT NUMBER.
	RAL		/GET THIRD BIT.
	AND C7		/MASK OFF JUNK.
	ADD C60		/INSERT ZONE BITS.
	JMS TYONCH	/GO TYPE THIS DIGIT.
	ISZ LOOPCT	/COUNT SIX CHARACTERS TYPED.
	JMP PRTLP1	/MORE TO DO, GET NEXT DIGIT.
	JMS TYPRTN	/ALL DONE, GO RETURN CARRIAGE.
	JMP FND6		/THEN RETURN TO MAIN LINE.
/PATCH SPECIFIED CORE LOCATION.
PATLOC	JMS GETOCT	/GET ADDRESS OF LOCATION TO PATCH.
	ADD RLFACT	/PLUS RELOCATION FACTOR.
	DAC POINTR	/SAVE ABSOLUTE ADDRESS.
	JMS GETOCT	/THEN GET NEW CONTENTS.
	DAC* POINTR	/PATCH CELL SPECIFIED.
	JMP FND6		/AND RETURN.
/SERVICE CALL REQUEST.
CALL	NOP
	JMS GETCOM
	LAC CWD
	SAD C104
	JMP CDEL
	SAD C122
	JMP CREN
	JMP ILLCWD
CDEL	JMS GETDAT
	JMS GETCOM
	SNA
	JMP ILLCWD
	LAW -2
	JMS PK6BT
	CWD
CALLDB	CALDB1
	LAC SRCNAM
	DAC CALDB1+2
	JMS GETCOM
	SNA!CLA!CMA
	JMP CDEL1
	JMS PK6BT
	CWD
	CALDB1+2
CDEL1	LAC CALLDB
	ADD CALDAT
	DAC CDEL2+1
CDEL2	JMS DELFIL
	0
	JMP IOSET
/CALL RENAME..
CREN	JMS GETDAT
	JMS GETCOM
	SNA
	JMP ILLCWD
	LAW -2
	JMS PK6BT
	CWD
	CALDB1
	JMS GETCOM
	SNA!CLA!CMA
	JMP ILLCWD
	JMS PK6BT
	CWD
	CALDB1+2
	JMS GETCOM
	SNA
	JMP ILLCWD
	LAW -2
	JMS PK6BT
	CWD
	CALDB2
	LAC CALDB1+2
	DAC CALDB2+2
	JMS GETCOM
	SNA!CLA!CMA
	JMP CREN2
	JMS PK6BT
	CWD
	CALDB2+2
CREN2	LAC CALLDB
	ADD CALDAT
	DAC CREN1
	JMS RENAME
CREN1	0
	CALDB2
IOSET	JMS IOINIT
	JMP FND6
/GETDAT...
GETDAT	0
	JMS GETCOM
	LAC CWD
	SAD OFF
	JMP COUT
	SAD C111
	JMP CIN
	JMP ILLCWD
CIN	CLA!SKP
COUT	LAC XCTZRO
	DAC CALDAT
	JMP* GETDAT
/PRODUCE A FORM FEED ON PAPER TAPE TO KEEP THE PDP7
/EDITOR HAPPY.
FORM	LAC OUTDEV
	SMA
	JMP FND6
	OUTCAL
	11		/WRITE
FEED	FORMFD
	-4
	JMP FND4
FORMFD	002002
BLANK	40		/CHECKSUM -- IGNORED BY PUNCH HANDLER.
BNKMSK	.ASCII <14>
RECOUP=.
	.IFDEF	BF
RECOUP	DAC SAVEAC	/SAVE AC
	.ENDC
	LAC QUIT
	SNA
	JMP BEGIN
	DZM QUIT
	.IFUND	BF
	LAC*	SCOM16	/RESTORE LINK
	.ENDC
	.IFDEF	BF
	LAC* SCOM10	/RESTORE LINK.
	.ENDC
	DAC QRETN		/SAVE RETURN.
	RAL		/..
	.IFUND	BF
	LAC*	SCOM17	/RESTORE AC.
	.ENDC
	.IFDEF	BF
	LAC SAVEAC	/RESTORE AC.
	.ENDC
	JMP* QRETN	/REENTER INTERRUPTED SEGMENT.
	.IFDEF	BF
SAVEAC	0
	.ENDC
TTRS	JMS TYPRTN
	JMP EDIT
/OPEN AN INPUT FILE FOR EDITING.
OPEN	NOP		/OR JMP ILLCWD, IF OPEN SEQUENCE ALREADY EXECUTED.
	LAC INDEV		/IS INPUT DEVICE FILE-STRUCTURED?
	SPA		/INDEV IS POSITIVE IF SO.
	JMP FND4		/NON-FILE-STRUCTURED, IGNORE OPEN REQUEST.
	JMS GETCOM	/GET FILE NAME FROM COMMAND STRING.
	SNA		/SKIP IF A NAME WAS IN FACT TYPED.
	JMP NONAM1	/NO NAME FURNISHED, PUBLISH ERROR.
	LAW -2		/FILE NAME GIVEN, PACK INTO FIRST
	JMS PK6BT		/TWO WORDS OF DEB.
	CWD		/..
INNADR	INNAME		/..
	LAC SRCNAM	/USE "SRC" AS DEFAULT EXTENSION.
	DAC INNAME+2	/..
	JMS GETCOM	/THEN GO GET TYPED EXTENSION, IF PRESENT.
	SNA!CLA!CMA	/SKIP IF AN EXTENSION WAS TYPED.
	JMP DZMNAM	/OTHERWISE, ASSUME "SRC" IS WANTED.
	JMS PK6BT		/NOW PACK UP THE EXTENSION TYPED.
	CWD		/..
	INNAME+2		/INTO THIRD WORD OF DEB.
DZMNAM	DZM NAMSW		/INDICATE THAT A FILE NAME HAS BEEN FURNISHED.
	JMS IOINIT	/INIT INPUT AND OUTPUT DEVICE
	JMS FSTAT		/NOW GO LOOK FOR THE NAMED FILE.
	INNAME		/FILE NAME IS IN INNAME...INNAME+2.
	SNA		/SKIP IF FILE IS PRESENT ON INPUT DEVICE.
	JMP NTFND		/FILE NOT FOUND, COMMENT.
	DZM INFILE	/INDICATE THAT AN INPUT FILE IS PRESENT.
	JMS SEEK		/GO OPEN THE INPUT FILE FOR READING.
	INNAME		/..
	LAC BADARG	/GET A TRANSFER TO ILLCWD
	DAC OPEN		/AND SHUT OUT FURTHER ACCESS TO OPEN
	DAC CALL		/AND CALL SEQUENCES.
	JMP EDIT		/THEN GO PREPARE TO EDIT THE FILE JUST OPENED.
INNAME	.BLOCK 3
NONAM1	LAW NOFLNM
	JMS TYPOUT
	JMP FND4
NTFND	LAW INNAME	/ADDR OF NAME OF ABSENT FILE.
	JMS TYNAME	/TYPE OUT FILE NAME.
	LAW FILN1		/COMPLETE THE COMMENT.
	JMS TYPOUT	/"NOT FOUND."
	JMP INPUT		/ACCEPT SOME INPUT.
/SERVICE KEEP REQUEST.
KEEP	LAC DIRSW		/ARE WE GOING FROM -14 TO -15?
	SMA		/IF NOT, SKIP; COULD BE TROUBLE.
	JMP KEEP1		/YES, OK.
	LAC* INPDAT	/SEE IF SAME UNIT AND DEVICE FOR -14 AND -15.
	XOR* OUTDAT	/..
	SNA		/SKIP IF NOT SAME UNIT.
	JMP KEEP1		/SAME UNIT FOR BOTH DAT SLOTS, OK. HONOR REQUEST.
	LAW TOPRQM	/TWO UNITS AND GOING WRONG WAY, COMMENT.
	JMS TYPOUT	/"TOP REQUEST NEEDED."
	JMP FND6		/GET NEXT COMMAND.
KEEP1	JMS GETCOM	/GET FILE NAME WANTED.
	SNA		/SKIP IF A FILE NAME WAS GIVEN.
	JMP NONAM1	/IF NOT, GO COMPLAIN.
	LAW -2		/PACK 2-WORD FILE NAME.
	JMS PK6BT		/..
	CWD		/FILE NAME IS IN CWD.
SVADR	SAVNAM		/PUT IT IN SAVNAM.
	LAC SRCNAM	/GET DEFAULT EXTENSION.
	DAC SAVNAM+2	/SAVE IN DIRECTORY ENTRY.
	JMS GETCOM	/THEN GO SEE IF AN EXTENSION WAS TYPED, TOO.
	SNA!CLA!CMA	/SKIP IF AN EXTENSION IS THERE.
	JMP SETSAV	/NO EXTENSION.
	JMS PK6BT		/PACK A ONE-WORD EXTENSION.
	CWD		/TYPED EXTENSION IS IN CWD.
	SAVNAM+2		/EXTENSION WORD IN DEB.
SETSAV	DZM SAVESW	/INDICATE A SAVE IS WANTED.
	JMP FND6		/THEN REENTER MAIN LINE.
/CLOSE INPUT FILE ONLY.
ICLOSE	CLA		/INDICATE CURRENT INPUT DAT SLOT IS TO BE REFERENCED.
	JMS CLSFIL	/GO CLOSE THE INPUT FILE.
	LAC NOPLIT	/GET A NOP CODE.
	DAC OPEN		/ALLOW ENTRY TO "OPEN" SEQUENCE.
	DAC RDFNOP	/AND SET UP TO FILL BOTH INPUT BUFFERS ON NEXT READ.
	DAC NAMSW		/INDICATE NO FILE NAME HAS BEEN PROVIDED.
	LAC INDEV		/IS INPUT DEVICE FILE-STRUCTURED?
	SPA!CMA		/INDEV .G. 0, YES; SET AC NEGATIVE.
	CLA		/INDEV .L. 0, NO; SET AC POSITIVE.
	DAC INFILE	/INFILE NEGATIVE MEANS NO INPUT FILE PRESENT.
	JMP FND4		/GO READ NEXT COMMAND.
SCLOSE	LAW -1
	DAC DIRSW
CLOSE	LAC OUTDEV
	SMA
	JMP CLOSE2
JMSCLS	JMS CLSOUT
	JMP BEGIN
CLOSE2	JMS GETCOM
	DZM NAMSW1
	SZA!CLA		/SKIP IF NO NAME TYPED IN CLOSE REQUEST.
	JMP NAMEIN	/A NAME WAS TYPED.
	SAD NAMSW		/SKIP IF NO NAME GIVEN IN OPEN REQUEST.
	JMP CLOSE1	/AT LEAST ONE NAME HAS BEEN PROVIDED.
	LAW NOFLNM
	JMS TYPOUT
	JMP FND4
NAMEIN	LAW -2		/PACK TWO WORDS...
	JMS PK6BT		/...IN SIX-BIT FORMAT.
	CWD		/FROM CWD.
	NEWNAM		/TO NEWNAM.
	LAC SRCNAM	/GET "SRC".
	DAC NEWNAM+2	/USE AS DEFAULT EXTENSION.
	DAC NAMSW1	/INDICATE A NAME WAS GIVEN IN THIS CLOSE REQUEST.
	JMS GETCOM	/SEE IF AN EXTENSION WAS TYPED.
	SNA!CLA!CMA	/SKIP IF AN EXTENSION WAS IN FACT TYPED.
	JMP CLOSE1	/NO EXTENSION, USE "SRC".
	JMS PK6BT		/EXTENSION GIVEN, GO PACK IT UP (AC = 777777 NOW).
	CWD		/EXTENSION IS IN CWD.
	NEWNAM+2		/PUT IT IN DEB.
CLOSE1	JMS CLSOUT
	LAC INDEV
	SPA
	JMP GETNM2
	.IFDEF BF
	LAW -15
	TAD* SCOM17	/.DATB
	DAC OUTDAT	/BGRD DAT -15
	DAC INPDAT
	ISZ INPDAT	/BGRD DAT -14
	.ENDC
	LAC* INPDAT
	XOR* OUTDAT
	SNA
	JMP GETNM2
	LAC DIRSW
	SMA
	JMP GETNM2
	JMS SEEK
	INNAME
	JMP CLOSE1
GETNM2	LAC NAMSW1
	SNA
	JMP BEGIN
CKNAM	LAC INDEV
	RAL
	LAC CKNM1
	AND CL0777
	SZL
	ADD XCTZRO
	DAC CKNM1
	LAC CKNM2
	AND CL0777
	SZL
	ADD XCTZRO
	DAC CKNM2
	LAC NAMSW
	SNA!CLA!CMA
	JMP CKNM3
CKNM0	JMS FSTAT
CKNM1	NEWNAM
	SZA
	JMP NMERR2
RNM2	JMS RENAME
CKNM2	INNAME
	NEWNAM
	JMP BEGIN
NMERR2	LAW BADNAM
	JMS TYPOUT
	LAC NOPLIT
	DAC CLOSE1
	JMP FND4
/NAMES GIVEN BOTH IN OPEN AND CLOSE REQUESTS. FIND OUT IF TWO
/NAMES ARE IDENTICAL. IF SO, ACCEPT CLOSE REQUEST.
CKNM3	TAD CKNM1
	DAC* C12
	CLA!CMA
	TAD CKNM2
	DAC* C15
	LAW -3
	DAC WRITE
CKNM4	LAC* 12
	SAD* 15
	SKP
	JMP CKNM0
	ISZ WRITE
	JMP CKNM4
	JMP BEGIN
NEWNAM	.BLOCK 3
/SERVICE TOP COMMAND.
TOP	LAC PBLKSW
	SZA
	JMP TOPFIL
	JMS RSBUFF
	JMS CHBUFF
	JMP FND4
TOPFIL	LAC FILSTR
	SPA
	JMP ILLCWD
	LAC RDFNOP
	SAD RDFJMP
	JMP TOPFL1
	AND OUTSW1
	SPA
	JMP FND4
TOPFL1	JMS CLSOUT
	JMS SEEK
	INNAME
	JMP FND4
/MOVE POINTER TO LAST LINE OF FILE OR BUFFER.
BOTTOM	LAC LENGTH
	DAC LEN1
	JMS GETLIN	/GET NEXT LINE.
	EDLIN		/SAVE TEMPORARILY IN EDLIN ARRAY.
	JMP FND3		/ALL DONE IF END OF FILE.
	LAC LEN1
	DAC LENGTH
	JMS PUTLIN	/NOT YET, OUTPUT CURRENT LINE.
	JMP FULBUF
	DZM LENGTH	/MOVE EDLIN TO INLINE.
	LAC EDLADR
	DAC NXTPTR
	JMS APPEND
	JMP BOTTOM
/READ SOME LINES FROM SUBSIDIARY DEVICE.
GET	JMS GETNUM
	DAC LOOPCT
SBREAD	IN2CAL
	10
SBADR	SBUFF
	-BUFLEN
	IN2CAL
	12
	LAC SBUFF
	AND C7
	SAD C5
	SKP
	SAD C6
	JMP GETEOF
	JMS PUTLIN
	JMP FULBUF
	JMS UNPACK
ADR008	SBUFF
	INLINE
	DAC LENGTH
	ISZ LOOPCT
	JMP SBREAD
	JMP FND4
GETEOF	LAW EOMRM
	JMS TYPOUT
	JMP EOFCOM
SBUFF	.BLOCK BUFLEN
/SERVICE RENEW REQUEST.
RENEW	JMS WRITE		/FIRST WRITE OUT THE CURRENT BUFFER.
	JMS READ		/THEN FILL UP THE BUFFER FROM THE INPUT FILE.
	JMP FND4		/AND GO READ ANOTHER REQUEST.
/SERVICE WRITE REQUEST.
WRITE	0		/ENTRY TO WRITE BLOCK BUFFER INTO OUTPUT FILE.
	LAC PBLKSW	/IS BLOCK MODE ON?
	SZA		/SKIP IF IT IS.
	JMP ILLCWD	/IF BLOCK MODE IS OFF, DON'T ACCEPT WRITE REQUEST.
	JMS RSBUFF	/GO FILL UP OUTPUT BUFFER FROM INPUT BUFFER.
	JMS CHBUFF	/THEN CHANGE THE BUFFERS AROUND.
	LAC BLOKSW	/SAVE THE CURRENT STATUS OF BLOKSW.
	DAC LOOPCT	/..
FENCE	LAW -1		/THEN TURN BLOCK MODE OFF.
	DAC PBLKSW	/..
	DAC BLOKSW	/..
	JMS RSBUFF	/NOW GO EMPTY THE INPUT BUFFER, AND THIS TIME WRITE OUTPUT FILE.
	LAC LOOPCT
	DAC BLOKSW
	DZM PBLKSW
	JMS CHBUFF
	DZM BUFEMP
	JMP* WRITE	/RETURN TO CALLER.
/SERVICE READ REQUEST.
READ	0		/ENTRY TO FILL INPUT BUFFER.
	LAC BUFEMP
	SZA
	JMP NEMPBF
	LAC BUFSIZ
	DAC LOOPCT
	LAC BLOKSW
	SZA!CLA!CMA	/SKIP IF BLOCK ON,-1 TO AC
	JMP ILLCWD	/ILLEGAL COMMAND IF NOT.
	DAC PBLKSW	/OFF PUTLIN BLOCK SWITCH.
	JMS PUTLIN	/OUTPUT CURRENT LINE IF ANY.
	JMP FULBUF
	DZM PBLKSW	/RESET PUTLIN BLOCK SWITCH ON.
	JMS CHBUFF
	LAW -1
	DAC GBLKSW
READ1	JMS GETLIN
	INLINE
	JMP EOF
	JMS PUTLIN
	JMP FULBUF
	ISZ LOOPCT
	JMP READ1
	JMS CHBUFF
	JMP* READ
NEMPBF	LAW BFNEMM
	JMS TYPOUT
	JMP* READ
/SUBROUTINE RSBUFF; EMPTY INPUT BUFFER, FILL OUTPUT BUFFER.
RSBUFF	0
NCHARS=RSBUFF		/GETCOM: TOTAL TYPED CHARACTERS IN CURRENT COMMAND.
RSB01	JMS PUTLIN
	JMP FULBUF
	LAC GBLKSW
	SZA
	JMP* RSBUFF
	JMS GETLIN
	INLINE
	JMP* RSBUFF
	JMP RSB01
/SUBROUTINE CHBUFF, EXCHANGE INPUT AND OUTPUT BUFFERS; SET GET
/AND PUT POINTERS TO BUFFER TOPS.
CHBUFF	0
	LAC BBUF1		/GET TOP OF BUFFER 1.
	DAC NXTPUT	/GIVE TO OUTPUT POINTERS.
	DAC CURPUT	/..
	TAD FENCE
	ADD BBUFX
	DAC BUFEND
	LAC BBUF2		/GET TOP OF BUFFER 2.
	DAC CURGET	/GIVE TO INPUT POINTER.
	DAC BBUF1		/SWITCH BUFFERS.
	LAC NXTPUT	/..
	DAC BBUF2		/..
	LAC PBLKSW
	DAC GBLKSW
	LAC BFPTSW	/ANYTHING IN OLD OUTPUT BUFFER?
	SNA		/SKIP IF SO
	DZM CURGET
	DZM BFPTSW	/NOW INDICATE NOTHING IN NEW OUTPUT BUFFER.
	JMP* CHBUFF	/RETURN TO CALLER.
C5	5
C777	777
C175	175
BFPTSW	0
/SUBROUTINE RDFILE, DOUBLE-BUFFERED READ-INPUT-FILE. BEFORE
/FIRST CALL, RDFNOP MUST CONTAIN SOME INSTRUCTION PERMITTING
/CONTROL TO FALL THROUGH TO RDFNOP+1.
/CALL:	JMS RDFILE
/	LINE BUFFER ADDRESS
/	RETURN IF NO MORE LINES (EOF CODE IN AC)
/	NORMAL RETURN
RDFILE	0
	LAC INFILE	/IS THERE AN INPUT FILE PRESENT?
	SMA		/THERE IS NOT IF INFILE IS NON-ZERO.
	JMP .+4		/IF INFILE .E. ZERO, THERE IS AN INPUT FILE.
	LAW NOFIL1	/NO FILE, COMPLAIN.
	JMS TYPOUT	/"NO INPUT FILE PRESENT."
	JMP FND4		/GO READ NEXT COMMAND.
	LAC* RDFILE	/GET LINE OUTPUT ADDRESS.
	ISZ RDFILE	/BUMP TO RETURN.
	JMS GETBNK	/INSERT BANK BITS.
	DAC RDUP02	/GIVE OUT ADDRESS TO UNPACKER.
RDFUPD	LAC RDCAL2	/GET LAST BUFFER READ.
	DAC RDUP01	/UNPACK THAT BUFFER.
	LAC RDALTB	/READ INTO THE OTHER BUFFER.
	DAC RDCAL2	/..
	LAC RDUP01	/UPDATE OTHER-BUFFER POINTER.
	DAC RDALTB	/..
INPTCL	INPCAL		/ISSUE READ.
	10
RDCAL2	RDBUF2		/MODIFIED AT EACH CALL.
	-BUFLEN
RDFNOP	NOP		/MODIFIED AFTER FIRST TIME THROUGH.
	LAC RDFJMP	/ONE-TIME SECTION TO PRIME READ BUFFERS.
	DAC RDFNOP
	JMP RDFUPD	/READ AGAIN FIRST TIME ONLY.
RDFJMP	JMP .+1
	LAC* RDUP01	/GET BUFF HEADER.
	AND C7		/THROW AWAY JUNK.
	SAD C5		/END OF FILE?
	SKP		/YES, SO INDICATE.
	SAD C6		/OR END OF MEDIUM?
	JMP RDFEOF	/YES, TAKE EOM RETURN.
	LAC* RDUP01	/CHECK FOR READ AND LONG-LINE ERRORS, GET BUFFER HEADER.
	AND C60		/EXTRACT ERROR BITS.
	DAC ERRSW		/SAVE AS ERROR-PRESENT INDICATOR.
	JMS UNPACK	/CALL UNPACK.
RDUP01	0		/CURRENT READ BUFFER ADDRESS.
RDUP02	0		/CALLER'S LINE BUFFER AREA.
	ISZ RDFILE	/INDEX TO RETURN.
	JMP* RDFILE	/RETURN TO CALLER.
RDFEOF	LAC NOPLIT
	DAC RDFNOP
	JMP* RDFILE	/RETURN TO CALLER.
RDALTB	RDBUF1
/SUBROUTINE WRFILE, DOUBLE-BUFFERED WRITE-OUTPUT-FILE.
/CALL:	JMS WRFILE
/	RETURN
WRFILE	0
	LAC OUTPSW	/IS OUTPUT WANTED? (OUTPSW SET BY OUTPUT ON/OFF COMMAND.
	SZA		/SKIP IF OUTPUT IS ON.
	JMP* WRFILE	/OTHERWISE IGNORE THIS CALL.
	LAC WRPAK2	/EXCHANGE BUFFER ADDRESSES. GET BUFFER USED LAST.
	DAC RDFILE	/SAVE THAT ADDRESS TEMPORARILY.
	LAC WRALTB	/GET START OF ALTERNATE BUFFER.
	DAC WRPAK2	/USE THAT BUFFER FOR PACKING THIS LINE.
	DAC WRCAL2	/WRITE FROM THAT BUFFER ALSO.
	LAC RDFILE	/NOW GET THE FIRST BUFFER AGAIN.
	DAC WRALTB	/AND SAVE AS ALT BUFFER FOR NEXT TIME.
	JMS PACK		/GO PACK THE OUTPUT LINE.
INLADR	INLINE		/LINE TO BE PACKED IS ALWAYS IN INLINE.
WRPAK2	WRBUF2		/MODIFIED EACH TIME TO POINT TO "CURRENT" BUFFER.
	LAC OUTSW1
	SNA
	JMP OUTPCL
	JMS ENTER
	TFILE1
OUTPCL	OUTCAL		/WRITE THE LINE JUST PACKED.
	11
WRCAL2	0		/UPDATED EACH TIME TO CORRESPOND TO WRPAK2.
C1000	1000		/WORD COUNT -- IGNORED BY DEVICE HANDLERS.
	DZM OUTSW1	/INDICATE SOMETHING WRITTEN INTO OUTPUT FILE.
	JMP* WRFILE	/NO WAIT REQUIRED AFTER WRITING.
WRALTB	WRBUF1		/MODIFIED EACH TIME TO POINT TO "OTHER" BUFFER.
EDLIN	.BLOCK LINSIZ	/CURRENT COMMAND STRING ARRAY.
INLINE	.BLOCK LINSIZ	/CURRENT INPUT LINE FROM FILE OR KEYBOARD.
/DEFINE TEMPORARY STORAGE REGISTERS RESIDING IN TYLINE AREA.
RNMFIL=TYLINE
RENMCT=RNMFIL+6
RNMWRD=RENMCT+1
CALDB1=RNMWRD+1
CALDB2=CALDB1+3
CALDAT=CALDB2+3
RDBUF1	.BLOCK BUFLEN	/READ BUFFERS.
RDBUF2	.BLOCK .-RDBUF1	/..
WRBUF2	.BLOCK BUFLEN
	.EJECT
/SUBROUTINE DCODSW, DECODE CONTROL WORDS "OFF" AND "ON". ON EXIT,
/C(C(DCODSW)) .E. 0 IF ON, -1 IF OFF. IF NO ARGUMENT IS PRESENT, APPROPRIATE
/SWITCH IS SET TO "ON" (0). 
DCODSW	0
	JMS GETCOM	/GET PARAMETER TYPED.
	SNA!CLA		/SKIP IF A PARAMETER WAS PRESENT.
	JMP SETSW 	/IF NO PARAMETER GIVEN, GO TREAT AS "ON".
	JMS SCAN		/CALL STRING COMPARER.
	CWD		/TYPED PARAMETER IS HERE.
	OFF		/COMPARE WITH "OFF".
	JMP DCOD01	/NO MATCH THIS TIME.
	SKP		/POSSIBLE MATCH.
	JMP ILLCWD	/ILLEGAL PARAMETER.
	LAC* STR2		/END OF STRING 2 FOUND?
	SPA!CLA!CMA	/NO, SKIP.
	JMP SETSW		/YES, SET SWITCH TO "OFF" (-1).
DCOD01	JMS SCAN		/COMPARE AGAIN.
	CWD		/PARAMETER IS STILL HERE.
	ON		/THIS TIME, TRY "ON".
	SKP		/NOT FOUND.
	SKP		/POSSIBLE HIT.
	JMP ILLCWD	/NO MATCH, GO COMPLAIN.
	LAC* STR2		/ENSURE END OF STRING 2 REACHED.
	SMA!CLA		/SKIP IF SO.
	JMP ILLCWD	/IF NOT, COMPLAIN.
SETSW	DAC* DCODSW	/AC IS EITHER 0 OR 777777 HERE.
	ISZ DCODSW
	JMP* DCODSW
OFF	117		/"O"
	106		/"F"
	106		/"F"
XCTZRO	XCT 0		/BIT 0 = 1 TO TURN OFF STRING COMPARE IN SCAN.
ON	117		/"O"
SCOM17=ON			/.SCOM+17: AC ON TTY INTERRUPTS.
	116		/"N"
CL7770	777000
/SCAN, ATTEMPT TO MATCH TWO CHARACTER STRINGS.
/CALL:	JMS SCAN
/	ADDRESS OF STRING TO SEARCH FOR.
/	ADDRESS OF STRING UPON WHICH SEARCH IS TO BE PERFORMED.
/	RETURN IF STRING NOT FOUND.
/	RETURN IF END OF STRING1 FOUND.
/	RETURN IF END OF STRING2 FOUND.
SCAN	0
	LAC* SCAN
	JMS GETBNK
	DAC STR1
	ISZ SCAN
	LAC* SCAN
	JMS GETBNK
	DAC STR2
	ISZ SCAN
SLOOP1	LAC* STR1
	SPA
	JMP SLP1
	LAC* STR2
	SPA
	JMP SLP2
	SAD* STR1
	SKP
	JMP* SCAN
	ISZ STR1
	ISZ STR2
	JMP SLOOP1
SLP2	ISZ SCAN
SLP1	ISZ SCAN
	JMP* SCAN
/SUBROUTINE PUTLIN, INSERT A LINE EITHER IN THE CURRENT OUT BUFFER
/OR IN THE OUTPUT FILE ITSELF.
/CALL:	JMS PUTLIN
/	RETURN IF BUFFER FULL (LINE NOT INSERTED)
/	NORMAL RETURN.
PUTLIN	0
	LAC LENGTH
	DAC BTEMP
	SNA!CLA!CLL!CML
	JMP PTOFLO-2
	SAD QUIT
	JMP TTRS
	SAD PBLKSW	/SKIP IF BLOCK MODE IS OFF.
	SKP!RAL		/BLOCK MODE ON. SET AC = 1.
	JMP WRCAL		/BLOCK MODE OFF, GO OUTPUT LINE.
	DAC NPAIRS	/SET INITIAL WORD-PAIR COUNTER.
	ISZ BTEMP		/ACCOUNT FOR A CARRIAGE RETURN.
COUNT1	ISZ NPAIRS	/COUNT A PAIR.
	LAW -5		/5 CHARS PER PAIR.
	TAD BTEMP		/ADJUST CHARACTER COUNT.
	DAC BTEMP		/SAVE NEW ONE.
	SZA!SMA		/DONE IF ZERO OR MINUS.
	JMP COUNT1	/MORE TO DO.
	LAC NPAIRS	/ALL DONE, GET TOTAL PAIRS REQUIRED BY THIS LINE.
	CLL!RAL		/NPAIRS * 2 TO GIVE TOTAL WORDS THIS LINE.
	ADD NXTPUT	/FORM CURRENT ADDRESS + WORDS THIS LINE.
	DAC BTEMP		/SAVE TEMPORARILY.
	CMA		/2'S COMPLEMENT LAST ADDR REQUIRED.
	TAD BUFEND	/COMPARE WITH LAST ADDRESS AVAILABLE.
	SPA!SNA		/LAST NEEDED .L. LAST AVAILABLE, OK.
	JMP PTOFLO	/ERROR OTHERWISE.
PKCAL	JMS PACK
ADR009	INLINE
NXTPUT	0		/WHERE TO BEGIN WRITING NEXT LINE.
	LAC NXTPUT
	SAD CURPUT
	SKP
	DAC* CURPUT
	ADD ONE
	DAC CURPUT
	DZM* CURPUT
	LAC BTEMP
	DAC NXTPUT
	DAC BUFEMP
	DAC BFPTSW
PUTRTN	ISZ PUTLIN	/..
	DZM LENGTH
PTOFLO	JMP* PUTLIN
WRCAL	LAC PBLKSW
	SZA
	JMP WRCAL1
	DZM PBLKSW
	JMP PUTLIN+1
WRCAL1	JMS WRFILE
	JMP PUTRTN
/GETLIN, RETURN NEXT LINE FROM CURRENT BUFFER OR FROM INPUT FILE.
/CALL:	JMS GETLIN
/	.DSA BUFF
/	RETURN IF NO MORE LINES TO GET.
/	NORMAL RETURN
GETLIN	0
	LAC QUIT
	SNA
	JMP TTRS
	LAC* GETLIN	/GET LINE ADDRESS.
	JMS GETBNK	/INSERT HIGH-ORDER BITS.
	DAC UPKCAL+2	/GIVE TO UNPACKER.
	DAC RDCAL+1	/AND TO FILE READER.
	LAC GBLKSW	/GET BLOCK MODE.
	SZA		/SKIP IF BLOCK IS ON.
	JMP RDCAL		/READ FROM FILE IF NOT.
	LAC BUFEMP
	SNA
	JMP EMPBUF
	LAC CURGET	/GET POINTER TO NEXT LINE
	SNA		/SKIP IF THERE IS ANOTHER LINE TO GET.
	JMP EMPBUF	/NO MORE LINES.
	DAC UPKCAL+1	/GIVE TO UNPACKER.
UPKCAL	JMS UNPACK	/CALL UNPACK.
PWRD1	0		/FROM.
PWRD2	0		/TO.
	DAC LENGTH
	ISZ CURGET
	LAC* CURGET
	DAC CURGET
	ISZ GETLIN	/BUMP TO RETURN.
EMPBUF	ISZ GETLIN	/..
	JMP* GETLIN
RDCAL	JMS RDFILE
PWRD3	0
	JMP EMPBUF
	DAC LENGTH
	LAC ERRSW
	SAD C60
	JMP TYTRN
	SNA
	JMP EMPBUF-1
TYPAR	LAW PRTYMS
	JMS TYPOUT
	JMP FND3
TYTRN	LAW TRNMES
	JMS TYPOUT
	JMP FND3
	.EJECT
/CLOSED SUBROUTINES FOR CHARACTER PACKING AND UNPACKING.
  
  
/SUBROUTINE UNPACK, IOPS ASCII TO ONE CHAR PER WORD. ON RETURN,
/IOPS LINE IS UNPACKED IN "TO" ARRAY AS 7-BIT CHARACTERS, ONE PER
/WORD, RIGHT-ADJUSTED WITH LEADING ZEROES. INITIAL LINE FEED (IF
/ANY) AND TERMINATING CARRIAGE RETURN (OR ALT MODE) ARE DELETED. IN PLACE
/OF THE TERMINATING CHARACTER IS INSERTED ITS 1'S COMPLEMENT (I.E.,
/000015 BECOMES 777762). THE ACCUMULATOR AND REGISTER "TOTCHR" HOLD POSITIVE
/TOTAL NUMBER OF DATA CHARACTERS UNPACKED, EXCLUSIVE OF THE TERMINATOR.
/NOTA BENE: UNPACK USES AUTOINDEX REGISTERS 3 AND 6 (LOCATIONS 12 AND 15)
/AS INPUT AND OUTPUT POINTERS.
/CALL:	JMS UNPACK	/GO TO UNPACK.
/	FROM		/15-BIT ADDRESS OF WORD 0 OF LINE BUFFER HEADER.
/	TO		/15-BIT ADDRESS OF FIRST CHAR OF OUTPUT LINE.
UNPACK	0		/ENTRY TO UNPACK.
PKFROM=UNPACK		/PACK, PK6BT: POINTER TO NEXT CHARACTER IN INPUT ARRAY.
	LAC* UNPACK	/GET ADDRESS OF INPUT LINE.
	DAC* C12		/SAVE AS INPUT POINTER (IN LOC 12).
	ISZ* C12		/ADJUST TO POINT TO FIRST DATA PAIR.
	ISZ UNPACK	/BUMP TO SECOND ARGUMENT.
	LAC* UNPACK	/ARG 2 IS ADDRESS OF OUTPUT LINE.
	TAD FENCE		/DECREMENT BY ONE.
	DAC* C15		/SAVE AS POINTER TO OUTPUT ARRAY (IN LOC 15).
	ISZ UNPACK	/BUMP TO RETURN.
	DZM TOTCHR	/ZERO TOTAL CHARACTERS IN LINE.
	DZM FSTSW		/INDICATE NO DATA ENCOUNTERED YET.
/ENTER MAJOR LOOP TO GET NEW WORD PAIR FROM INPUT LINE AND
/RESET CHARACTER COUNTER (PK5CHR) TO 5.
UNPLP1	LAC* 12		/GET NEXT WORD FROM LINE BUFFER.
	DAC PWRD2		/SAVE AS FIRST WORD OF PAIR.
	LAC* 12		/PICK UP NEXT WORD.
	DAC PWRD3		/SECOND WORD OF NEW CURRENT PAIR.
	LAW -5		/SET UP TO EXTRACT 5 CHARACTERS FROM THIS PAIR.
	DAC PK5CHR	/..
/ENTER INNER LOOP TO GET NEXT CHARACTER FROM CURRENT WORD PAIR,
/STORE IT IN OUTPUT ARRAY, AND CHECK FOR COMPLETION.
UNPLP2	JMS PRAL7		/GET NEXT CHAR FROM CURRENT PAIR.
	AND C177		/TAKE ONLY RIGHTMOST SEVEN BITS.
	SNA		/ACCEPT ONLY IF NON-NULL.
	JMP UNPB5C	/NULL CHARACTER, IGNORE.
	SAD C12		/LINE FEED?
	JMP UNPLNF	/YES, GO IGNORE ONLY IF FIRST CHARACTER IN LINE.
	SAD C175		/ALT MODE TYPE TERMINATOR?
	JMP UNPCR		/YES, TREAT JUST LIKE CARRIAGE RETURN.
	SAD C15		/CARRIAGE RETURN?
	JMP UNPCR		/YES, LINE IS COMPLETE.
UNPDAC	DAC* 15		/REAL ASCII CHAR, DEPOSIT IN OUTPUT ARRAY.
	DAC FSTSW		/INDICATE SOME DATA ENCOUNTERED.
	ISZ TOTCHR	/BUMP TOTAL DATA CHARACTERS SEEN.
	LAC TOTCHR	/GET TOTAL CHARACTERS SEEN.
	ADD ONE		/WILL WE OVERFLOW NEXT TIME?
	SAD MAXLEN	/SKIP IF NOT.
	JMP UNPOFL	/OTHERWISE, STOP NOW.
UNPB5C	ISZ PK5CHR	/COUNT 5 CHARACTERS FROM CURRENT PAIR.
	JMP UNPLP2	/NOT FINISHED WITH THIS PAIR, GET NEXT CHARACTER.
	JMP UNPLP1	/CURRENT PAIR EXHAUSTED, GET NEXT ONE.
UNPOFL	LAC C15		/TOO MANY CHARS, GET CARRIAGE RETURN.
UNPCR	CMA		/LINE FINISHED, GET TERMINATOR.
	DAC* 15		/INSERT AS LAST WORD OF OUTPUT LINE.
	LAC TOTCHR	/PICK UP TOTAL DATA CHARACTERS PROCESSED.
	JMP* UNPACK	/RETURN TO CALLER.
UNPLNF	LAC FSTSW		/LINE FEED FOUND. HAVE WE SEEN ANY BEFORE?
	SNA		/SKIP IF NOT.
	JMP UNPB5C	/YES, SO TREAT AS NORMAL DATA CHARACTER.
	LAC C12		/NO, SET TO ACCEPT LATER ONES.
	JMP UNPDAC	/THEN GO IGNORE THIS ONE.
  
/SUBROUTINE PACK, RIGHT-ADJUSTED 7-BIT CHARACTER ARRAY TO HEADERED
/IOPS ASCII. TERMINATES ON NEGATIVE WORD IN INPUT ARRAY.
/NOTE: USES AUTOINDEX REGISTER 3 (LOCATION 12) AS POINTER TO
/OUTPUT LINE.
/CALL:	JMS PACK		/GO TO PACK.
/	FROM		/15-BIT ADDRESS OF FIRST CHAR OF INPUT ARRAY.
/	TO		/15-BIT ADDRESS OF FIRST WORD OF OUTPUT LINE.
PACK	0		/ENTRY TO PACK.
	LAC* PACK		/PICK UP START OF INPUT ARRAY.
	DAC PKFROM	/GIVE TO INPUT POINTER.
	ISZ PACK		/BUMP ENTRY TO ARG 2.
	LAC* PACK		/GET ADDRESS OF LINE BUFFER TO FILL.
	DAC PLBH		/SAVE AS ADDRESS OF WORD 0 OF HEADER.
	DAC* C12		/AND ALSO IN OUTPUT POINTER.
	ISZ* C12		/SET LOC 12 TO POINT TO CHECKSUM.
	DZM* PLBH		/SET INITIAL VALUE OF HEADER WORD 0.
	DZM LSTSW		/INDICATE TERMINATOR NOT SEEN YET.
	ISZ PACK		/BUMP TO RETURN.
/ENTER MAJOR LOOP TO UPDATE WORD-PAIR COUNT IN LINE BUFFER HEADER
/(LOCATION POINTED TO BY "PLBH") FOR WORD-PAIR JUST CONSTRUCTED
/(OR FOR HEADER PAIR ON FIRST TIME THROUGH) AND TO RESET CHARACTER
/COUNTER (PK5CHR) TO -5.
PLOOP1	LAC C1000		/TURN ON BIT 8.
	ADD* PLBH		/ADD IN WORD PAIR COUNT DEVELOPED SO FAR.
	DAC* PLBH		/NEW WORD 0.
	LAW -5		/SET UP TO PUT 5 CHARACTERS IN THE NEW PAIR.
	DAC PK5CHR	/..
/ENTER INNER LOOP TO GET NEXT CHARACTER FROM INPUT LINE, CHECK FOR
/COMPLETION, AND INSERT IN CURRENT PAIR.
PLOOP2	LAC* PKFROM	/GET NEXT CHARACTER FROM INPUT ARRAY.
	SPA		/TERMINATOR? (NEGATIVE IF SO.)
	JMP PCLOSE	/YES, GO TRY TO CLOSE THE OUTPUT LINE.
	ISZ PKFROM	/NO, BUMP POINTER TO NEXT CHARACTER.
PLOOP6	RTR		/SHIFT THIS CHARACTER TO BITS 0-6.
	RTR		/..
	RTR		/..
	RTR		/..
	DAC PWRD3		/ADD TO RIGHT-HAND END OF EMERGING PAIR.
PLOOP7	JMS PRAL7		/GO ROTATE THIS CHARACTER INTO THE PAIR.
	ISZ PK5CHR	/COUNT 5 CHARACTERS PER PAIR.
	JMP PLOOP2	/NOT FINISHED WITH THIS PAIR, GET NEXT CHARACTER.
	LAC PWRD2		/PAIR IS COMPLETE, BUT STILL OFF BY ONE BIT.
	CLL!RAL		/CLEAR PAIR BIT 35.
	DAC PWRD2		/PAIR BIT 17 IS NOW IN LINK.
	LAC PWRD1		/GET FIRST WORD OF PAIR...
	RAL		/...AND MOVE PAIR BIT 17 IN.
	DAC* 12		/PAIR IN PROPER FORMAT; DEPOSIT WORD 1 IN LINE BUFF.
	LAC PWRD2		/PICK UP WORD 2.
	DAC* 12		/STORE IT IN LINE BUFFER ALSO.
	JMP PLOOP1	/GO REINITIALIZE FOR NEXT PAIR.
/COME HERE ON TERMINATOR FOUND IN INPUT ARRAY.
PCLOSE	SAD LSTSW		/HAVE WE BEEN HERE BEFORE? (LSTSW = 0 IF NOT.)
	JMP PKNULL	/YES, GO FILL CURRENT PAIR WITH NULLS.
	DAC LSTSW		/NO, SET LSTSW TO ENABLE BYPASS NEXT TIME THROUGH.
	CMA		/INVERT TERMINATOR.
	SNA		/IS IT NOW A NULL CHARACTER?
	LAC C15		/IF SO, GET CARRIAGE RETURN.
	JMP PLOOP6	/GO PUT CARRIAGE RETURN OR ALT MODE AWAY.
/COME HERE TO PAD WORD-PAIR WITH NULLS AFTER TERMINATING CHARACTER
/HAS BEEN INSERTED.
PKNULL	LAW -5		/FIRST, SEE IF PAIR IS ALREADY FULL.
	XOR PK5CHR	/..
	SZA!CLA!CLL!CML	/PAIR IS FULL IF PK5CHR .E. -5.
	JMP PLOOP6	/PAIR IS NON-FULL, INSERT NULL JUST GENERATED.
	RTL		/FULL, SET IOPS ASCII INDICATOR (AC = 2).
	ADD* PLBH		/INSERT MODE IN HEADER.
	DAC* PLBH		/RESTORE HEADER IN LINE BUFFER AREA.
	JMP* PACK		/ALL DONE, EXIT.
  
/SUBROUTINE PRAL7, ROTATE IOPS ASCII WORD PAIR SEVEN BITS TO THE LEFT.
/DURING UNPACKING, THE WORD PAIR BEING TREATED MUST BE STORED IN REGISTERS
/PWRD2 AND PWRD3; THE NET EFFECT OF PRAL7 IS TO PLACE "THIS" CHARACTER FROM
/THE PAIR IN THE RIGHTMOST SEVEN BITS OF REGISTER PWRD1 AND TO LEAVE THE
/"NEXT" CHARACTER IN THE LEFTMOST SEVEN BITS OF REGISTER PWRD2. DURING PACKING,
/THE CHARACTER TO BE ADDED MUST BE STORED IN THE LEFTMOST SEVEN BITS OF 
/REGISTER PWRD3; THE CHARACTER IS ADDED TO THE RIGHT-HAND END OF THE WORD
/PAIR BEING DEVELOPED. AFTER FIVE CALLS TO PRAL7, THE 5-CHARACTER PAIR,
/SHIFTED ONE BIT TO THE RIGHT, APPEARS IN REGISTERS PWRD1 AND PWRD2.
PRAL7	0
	LAW -7		/SET UP SEVEN-BIT COUNTER.
	DAC PK7BTS	/..
PRALL7	LAC PWRD3		/ROTATE A SINGLE BIT
	RAL		/FROM PWRD3 TO PWRD1.
	DAC PWRD3
	LAC PWRD2
	RAL
	DAC PWRD2
	LAC PWRD1
	RAL
	DAC PWRD1
	ISZ PK7BTS	/COUNT SEVEN BITS TO GET.
	JMP PRALL7	/NOT FINISHED, ROTATE OUT ONE MORE BIT.
	JMP* PRAL7	/ALL DONE, RETURN TO CALLER.
  
/SUBROUTINE PK6BT, RIGHT-ADJUSTED 7-BIT CHARACTERS TO 3-6 TRIMMED
/ASCII, ZERO-FILLED. TERMINATES ON END CODE (BIT 0 = 1) IN INPUT ARRAY
/OR WORD COUNT OVERFLOW (COUNT -- 2'S COMPLEMENT -- IN AC AT CALL).
/CALL:	LAW -MAXWDS	/2'S COMPLEMENT WORDS TO FILL.
/	JMS PK6BT		/CALL PK6BT.
/	FROM		/START OF INPUT ARRAY.
/	TO		/START OF OUTPUT ARRAY.
PK6BT	0		/ENTRY TO PK6BT.
TOTCHR=PK6BT		/UNPACK: TOTAL CHARS IN OUTPUT LINE.
	DAC PK6WDC	/SAVE COUNT OF  TOTAL WORDS TO FILL.
	LAC* PK6BT	/GET START OF INPUT ARRAY.
	JMS GETBNK	/MAKE IT A 15-BIT ADDRESS.
	DAC PKFROM	/GIVE TO INPUT POINTER.
	ISZ PK6BT		/BUMP TO OUTPUT ADDRESS.
	LAC* PK6BT	/GET START OF OUTPUT ARRAY.
	JMS GETBNK	/MAKE IT 15 BITS LONG ALSO.
	DAC PK6TO		/GIVE TO OUTPUT POINTER.
	ISZ PK6BT		/BUMP TO RETURN.
PK6LP1	LAW -3		/THREE CHARS PER WORD.
	DAC PK6CT1	/SET UP 3-CHARACTER COUNTER.
	DZM* PK6TO	/ZERO NEW OUTPUT WORD.
PK6LP2	LAC* PKFROM	/GET NEXT CHARACTER FROM INPUT ARRAY.
	SPA!CLL		/IS THIS THE ARRAY TERMINATOR? (NEGATIVE IF SO.)?
	JMP PK6CLS	/YES, GO GENERATE A NULL CHARACTER.
	AND C77		/NO, EXTRACT RIGHTMOST SIX BITS.
	DAC PK6CHR	/THEN SAVE AS CURRENT CHARACTER.
	ISZ PKFROM	/BUMP INPUT POINTER FOR NEXT TIME.
PK6LP3	LAC* PK6TO	/GET 3-6 WORD GENERATED SO FAR.
	RTL		/SHIFT IT SIX BITS LEFT TO MAKE ROOM FOR CURRENT CHAR.
	RTL		/..
	RTL		/..
	ADD PK6CHR	/THEN INSERT CURRENT CHARACTER.
	DAC* PK6TO	/SAVE NEW 3-6 WORD.
	ISZ PK6CT1	/COUNT 3 CHARACTERS PACKED IN THIS WORD.
	JMP PK6LP2	/MORE TO DO, GET NEXT CHARACTER.
	ISZ PK6TO		/ALL DONE WITH THIS WORD, BUMP OUTPUT POINTER.
	ISZ PK6WDC	/COUNT MAXIMUM WORDS IN OUTPUT ARRAY.
	JMP PK6LP1	/MORE ROOM IN OUTPUT ARRAY, SET UP NEW WORD.
PK6RET	JMP* PK6BT	/OUTPUT ARRAY IS FULL, RETURN TO CALLER.
/COME HERE ON TERMINATOR FOUND IN INPUT ARRAY. FILL REMAINDER OF OUTPUT
/ARRAY WITH NULL (00) CHARACTERS.
PK6CLS	DZM PK6CHR	/MAKE CURRENT CHAR A NULL.
	JMP PK6LP3	/AND PUT IT AWAY. NEXT INPUT CHAR WILL BE SAME TERMINATOR
	.EJECT
/EXECUTE SEEK ON NAMED FILE.
/	JMS SEEK
/	POINTER TO DEB
/	RETURN
SEEK	0
PK7BTS=SEEK
PK6WDC=SEEK
	LAC INPTCL
	AND C777
	DAC SKCAL
	LAC* SEEK
	JMS GETBNK
	DAC SKCAL+2
	ISZ SEEK
	DZM INFILE
SKCAL	0
PK6CHR=SKCAL
LSTSW=SKCAL
FSTSW=SKCAL
	3
	0
PK6TO=SKCAL+2
	JMP* SEEK
/EXECUTE ENTER ON NAMED FILE.
/	JMS ENTER
/	POINTER TO DEB
/	RETURN
ENTER	0
	LAC OUTPCL
	AND C777
	ADD C1000
	DAC ENTCAL
	LAC* ENTER
	JMS GETBNK
	DAC ENTCAL+2
	ISZ ENTER
ENTCAL	0
	4
	0
	JMP* ENTER
/EXECUTE FSTAT ON NAMED FILE.
/	JMS FSTAT
/	DEB POINTER	(BIT 0 .E. 0, INPUT FILE.
/			(BIT 0 .E. 1, OUTPUT FILE.)
/	RETURN		(AC .E. -1, NON-FILE-ORIENTED.
/			(AC .E. 0, NOT FOUND)
FSTAT	0
	LAC* FSTAT
	RAL
	LAC OUTPCL
	SNL
	LAC INPTCL
	AND C777
	ADD C3000
	DAC FSTCAL
	LAC* FSTAT
	JMS GETBNK
	DAC FSTCAL+2
	ISZ FSTAT
FSTCAL	0
	2
DTYP1	0		/DIRECTORY TYPE CODE IN BITS 0-3.
	DAC FSTCAL
	LAC DTYP1
	AND CL7000
	SZA!CLA!CMA
	LAC FSTCAL
	JMP* FSTAT
/EXECUTE CLOSE ON IN OR OUT FILE.
/	JMS CLSFIL	(AC .E. 0 IF INPUT, AC BIT 0 .E. 1 IF OUTPUT.)
/	RETURN
CLSFIL	0
	RAL
	LAC INPTCL
	SZL
	LAC OUTPCL
	AND C777
	DAC CLSCAL
CLSCAL	0
	6
	JMP* CLSFIL
/RENAME A FILE.
/	JMS RENAME
/	DEB1		(BIT 0 .E. 0, INPUT; BIT 0 .E. 1, OUTPUT.)
/	DEB2
/	RETURN
RENAME	0
	LAW -2
	DAC RENMCT
	LAC* RENAME
	RAL
	LAC INPTCL
	SZL
	LAC OUTPCL
	AND C777
	ADD C2000
	DAC RNMCAL
	LAW RNMFIL-1
	JMS GETBNK
	DAC* C15
RNMLP1	LAW -3
	DAC RNMWRD
	CLA!CMA
	TAD* RENAME
	ISZ RENAME
	JMS GETBNK
	DAC* C12
RNMLP2	LAC* 12
	DAC* 15
	ISZ RNMWRD
	JMP RNMLP2
	ISZ RENMCT
	JMP RNMLP1
RNMCAL	0
	2
DEB1	RNMFIL
	JMP* RENAME
/EXECUTE DELETE ON NAMED FILE.
DELFIL	0
	LAC* DELFIL
	JMS GETBNK
	DAC DELNAM
	LAC* DELFIL
	RAL
	LAC OUTPCL
	SNL
	LAC INPTCL
	AND C777
	ADD C1000
	DAC DELCAL
DELCAL	0
	2
DELNAM	0
	ISZ DELFIL
	JMP* DELFIL
/SUBROUTINE CLSOUT, CLOSE INPUT AND OUTPUT FILES.
CLSOUT	0
	JMS PUTLIN
	JMP FULBUF
	LAW -1
	DAC BLOKSW
	JMS RSBUFF
	LAC PBLKSW
	SZA
	JMP CLS01
	JMS CHBUFF
	LAW -1
	DAC PBLKSW
	JMS RSBUFF
	JMS CHBUFF
	DZM BUFEMP
CLS01	LAC INFILE	/IS THERE AN INPUT FILE PRESENT?
	SPA		/SKIP IF SO.
	JMP CLS01A	/IF NOT, GO TRY TO CLOSE OUTPUT FILE.
CLS01B	JMS PUTLIN	/WRITE OUT THE CURRENT LINE.
	NOP		/..
	JMS GETLIN
	INLINE
	SKP!CLA
	JMP CLS01B	/MORE TO DO, GO WRITE THIS LINE.
	JMS CLSFIL	/CLOSE THE INPUT FILE.
CLS01A	LAC OUTSW1	/HAS ANYTHING BEEN PUT INTO THE OUTPUT FILE?
	SPA!CLA!CMA	/SKIP IF SO.
	JMP EMPFIL	/NOTHING IN FILE, GO COMMENT.
	JMS CLSFIL
	LAC INFILE	/IS THERE AN INPUT FILE PRESENT?
	SPA		/SKIP IF SO.
	JMP CLS03		/IF NOT, GO DEAL WITH OUTPUT FILE.
	LAC OUTDEV	/IS THE OUTPUT DEVICE FILE-STRUCTURED?
	SPA		/SKIP IF SO.
	JMP* CLSOUT	/OTHERWISE, RETURN TO CALLER.
	LAC SAVESW	/IS A SAVE WANTED?
	SZA		/SKIP IF SO.
	JMP CLS02		/IF NOT, GO CLOSE AS USUAL.
	JMS FSTAT		/CHECK FOR PRESENCE OF SAVNAM.
	SAVNAM		/..
	SZA		/NOT FOUND, SKIP.
	JMP SAVERR	/SAVNAM IS IN USE, COMPLAIN.
	JMS RENAME	/NAME IS OK, RENAME THE INPUT FILE.
	INNAME		/..
	SAVNAM		/..
	LAW -1		/TURN OFF SAVESW.
	DAC SAVESW	/..
	JMP CLS03
CLS02	JMS DELFIL
	INNAME
CLS03	JMS FSTAT
	XCT INNAME
	SZA
	JMP CLSERR
	JMS RENAME
	XCT TFILE1
	INNAME
	LAC FILSTR
	SMA		/SKIP IF NON-FILE-ORIENTED.
	JMS CHDAT		/FILE-ORIENTED, GO EXCHANGE DAT ASSIGNMENTS.
	JMP* CLSOUT	/AND RETURN TO CALLER.
/COME HERE ON FILE-NAME DIFFICULTIES DURING CLOSE SEQUENCE.
CLSERR	LAC OUTPCL-1	/ADDRESS OF .TFIL1 EDT DIR ENTRY BLOCK.
	DAC CLSENT	/SET UP TO USE THAT NAME.
	LAC FILSTR	/BOTH DEVICES FILE-STRUCTURED?
	SPA		/SKIP IF SO.
	JMP SETF1		/IF NOT, SKIP ALL THIS STUFF.
	LAC* INPDAT	/FILES ON SAME UNIT AND DEVICE?
	XOR* OUTDAT	/..
	SNA		/SKIP IF FILES ON DIFFERENT UNITS OR DEVICES.
	JMP SETF1		/SAME UNIT, DON'T BOTHER SWITCHING.
	LAC DIRSW		/WHICH DIRECTION ARE WE GOING?
	SPA		/SKIP IF GOING FROM -14 TO -15.
	JMP SETF1		/GOING BACK TO -14, EVERYTHING OK.
/COME HERE ON TROUBLE TRYING TO CLOSE ON -15.
	JMS CHDAT		/GO CHANGE DAT SLOTS AROUND.
	JMS FSTAT		/IS THERE A .TFIL1 EDT ON -14?
	XCT TFILE1	/-14 IS NOW THE OUTPUT DAT SLOT.
	SZA		/SKIP IF .TFIL1 EDT IS NOT PRESENT.
	JMP SETF1		/.TFIL1 EDT IS THERE, GO COMMENT.
	JMS FSTAT		/MAYBE ORIGINAL FILE NAME IS THERE.
CLSINN	XCT INNAME	/..
	SZA		/SKIP IF INNAME IS OK FOR -14.
	JMP CLSSK		/NOT OK, USE .TFIL1 EDT.
	LAC CLSINN	/USE INNAME.
	DAC CLSENT	/..
CLSSK	JMS SEEK		/SEEK THE INPUT FILE.
	TFILE1
	JMS ENTER		/OPEN UP THE OUTPUT FILE.
CLSENT	0		/INNAME OR .TFIL1
	DZM OUTSW1	/FORESTALL ANOTHER ENTER.
CLSRD	JMS RDFILE	/READ A LINE.
	INLINE
	JMP CLSCLS	/IF EOF ENCOUNTERED.
	JMS WRFILE	/WRITE THE LINE READ.
	JMP CLSRD		/GO FOR MORE.
/COME HERE ON COMPLETE FILE TRANSFERRED.
CLSCLS	CLA!CMA
	JMS CLSFIL	/CLOSE THE OUTPUT FILE.
	CLA
	JMS CLSFIL	/CLOSE THE INPUT FILE, TOO.
	JMS DELFIL	/THEN DELETE THE INPUT FILE.
	TFILE1		/..
SETF1	LAW INNAME
	JMS TYNAME
	LAW TWOFIL
	JMS TYPOUT
	LAW NUFIL1
	JMS TYPOUT
	LAC OUTPCL
	RTR
	LAW 64
	SZL
	ADD ONE
	JMS TYONCH
	LAW NUFIL2
	JMS TYPOUT
	LAC CLSENT
	JMS TYNAME
	JMS TYPRTN
	LAW OLDEL
	JMS TYPOUT
	JMP BEGIN
SAVERR	JMS RENAME
	INNAME
	SAVNM2
	LAW SAVNAM
	JMS TYNAME
	LAW TWOFL1
	JMS TYPOUT
	LAW SVNMES
	JMS TYPOUT
	JMP CLS03
EMPFIL	LAW EMPFLM
	JMS TYPOUT
	JMP BEGIN		/START AGAIN.
SAVNAM	.BLOCK 3
SAVNM2	.SIXBT 'SAVFILEDT'
/COMMON EXIT ROUTINE.
EXIT	NOP		/ASSEMBLE NOP FOR ALL SYSTEMS.
	.IFUND BULKST
	.LOC EXIT
	JMP ILLCWD	/IF PAPER TAPE SYSTEM, DON'T ALLOW EXIT.
	.ENDC
EXIT1	CAL
C15	15
	.EJECT
/CLOSED SUBROUTINES FOR TYPEWRITER INPUT AND OUTPUT.
  
  
/SUBROUTINE TYPOUT, SET UP AND ISSUE CAL FOR IOPS ASCII OUTPUT MESSAGE.
/CALL:	LAW OUTMSG	/START ADDRESS (HEADER WORD 0) OF MESSAGE TO PRINT.
/	JMS TYPOUT	/GO TO TYPOUT.
TYPOUT	0		/ENTRY TO TYPOUT.
	JMS GETBNK	/GET SOME EPC BITS.
	DAC TTOUT		/INSERT 15-BIT ADDRESS IN CAL SEQUENCE.
	TTOCAL		/IOPS MODE WRITE TO TTY.
TAB	11		/..
TTOUT	0		/START OF LINE BUFFER.
SRCNAM	.SIXBT 'SRC'	/WORD COUNT -- IGNORED BY TELETYPE HANDLER.
	TTOCAL		/WAIT FOR PRINTING TO FINISH.
C12	12		/..
	JMP* TYPOUT	/RETURN TO CALLER.
  
/SUBROUTINE TYPEIN, SET UP AND ISSUE CAL FOR IOPS ASCII INPUT LINE.
/CALL:	LAW INBUFF	/WHERE TO PUT INCOMING LINE.
/	JMS TYPEIN	/GO TO TTY READER.
TYPEIN	0		/ENTRY TO TYPEIN.
	JMS GETBNK	/INSERT EXTENDED-MEMORY BITS.
	DAC TTIN		/GIVE TRUE (15-BIT) ADDRESS TO CAL SEQUENCE.
	TTICAL		/ISSUE CAL.
	10		/READ.
TTIN	0		/ADDRESS OF LINE BUFFER.
	-BUFLEN		/DON'T OVERFLOW BUFFER.
	TTICAL		/WAIT FOR USER TO FINISH.
	12		/..
	JMP* TYPEIN	/RETURN TO CALLER.
  
/SUBROUTINE TYNAME, TYPE OUT FILE NAME STORED IN DEB FORMAT.
/CALL:	LAW DEBADR	/START ADDRESS OF DEB TO TYPE OUT.
/	JMS TYNAME	/GO PRINT IT.
TYNAME	0		/ENTRY TO TYNAME.
STARSW=TYNAME			/GETOCT: INDIRECTION-WANTED INDICATOR.
	JMS GETBNK	/13-BIT ADDRESS OF DEB IS IN AC AT CALL.
	DAC ERNAME	/SAVE 15-BIT ADJUSTED ADDRESS.
	LAW FILMES	/TYPE "FILE".
	JMS TYPOUT	/..
	JMP LAWBLK	/THEN PRINT OUT A BLANK.
TYNSW1	LAW -3		/WILL BE -2 WHEN CONTROL FIRST COMES HERE.
	DAC LOOPCT	/COUNT TWO WORDS (FILE NAME) OR ONE WORD (EXT).
TYNLP1	LAW -3		/COUNT THREE CHARACTERS EACH WORD.
	DAC CHRCT		/..
	LAC* ERNAME	/GET NEXT WORD FROM DIRECTORY ENTRY BLOCK.
	DAC ERWORD	/SAVE AS CURRENT WORD.
TYNLP2	LAC ERWORD	/GET CURRENT WORD. NEXT CHAR IS IN BITS 0-5.
	RTL		/SHIFT OUT SIX BITS.
	RTL		/..
	RTL		/..
	DAC ERWORD	/SAVE REMAINDER FOR NEXT TIME.
	RAL		/GET SIXTH BIT FROM LINK.
	AND C77		/THROW AWAY JUNK.
	XOR C77		/COMPLEMENT RIGHT SIX BITS ONLY.
	SAD C77		/NULL CHARACTER?
	JMP TYNLP3	/YES, IGNORE.
	TAD LAWBLK	/GENERATE SEVENTH (LEFTMOST) BIT.
	XOR C77		/RESTORE RIGHTMOST FIVE BITS.
	XOR LAWBLK	/RESTORE SIXTH BIT.
	JMS TYONCH	/GO TYPE OUT THIS CHARACTER.
TYNLP3	ISZ CHRCT		/COUNT CHARS PER WORD.
	JMP TYNLP2	/MORE CHARS IN THIS WORD, GO GET NEXT ONE.
	ISZ ERNAME	/CURRENT WORD EMPTY, SERVICE NEXT ONE.
	ISZ LOOPCT	/COUNT WORDS IN THIS PORTION OF DEB.
	JMP TYNLP1	/ANOTHER WORD TO TREAT, DO SO.
LAWBLK	LAW 40		/FILE NAME OR EXT FINISHED, GET BLANK.
	JMS TYONCH	/TYPE IT OUT.
	ISZ TYNSW1	/COUNT THREE BLANK CHARS TYPED.
	JMP TYNSW1	/ANOTHER GROUP TO DO.
	LAW -3		/ALL DONE, RESET TYNSW1 FOR NEXT TIME.
	DAC TYNSW1	/..
	JMP* TYNAME	/RETURN TO CALLER.
FILMES	002002		/HEADER WORD 1: 2 PAIRS, IOPS ASCII.
C2000	2000		/CHECKSUM -- IGNORED BY TELETYPE HANDLER.
	.ASCII 'FILE'<175>
/SUBROUTINE TYONCH, OUTPUT SINGLE CHARACTER IN AC.
/NO WAIT REQUIRED BEFORE STORING C(AC) IN SINGCH.
/CALL:	LAW CHAR  	/CHARACTER TO BE TYPED IN AC(11-17).
/	JMS TYONCH	/GO TO TYONCH.
TYONCH	0		/ENTRY TO TYONCH.
	DAC SINGCH	/STORE CHAR TO TYPE IN IMAGE ASCII LINE BUFFER.
	TTOCAL+1000	/IMAGE MODE WRITE TO TTY.
	11		/..
ADR000	CHRMS		/ADDRESS OF OUTPUT MESSAGE.
CHRCT	0		/WORD COUNT -- IGNORED BY TELETYPE HANDLER.
	JMP* TYONCH	/RETURN TO CALLER.
CHRMS	002003		/HEADER WORD 0: 2 PAIRS, IMAGE ASCII.
C3000	3000		/CHECKSUM -- IGNORED BY TELETYPE HANDLER.
SINGCH	0		/CHARACTER TO BE TYPED IN BITS 11-17.
C177	177		/RUBOUT WILL TURN OFF TYPING.
  
/SUBROUTINE TYPRTN, PRODUCE CARRIAGE-RETURN AND LINE-FEED ON TELETYPE.
/CALL:	JMS TYPRTN
TYPRTN	0		/ENTRY TO TYPRTN.
OCTNUM=TYPRTN		/GETOCT: RESULTS REGISTER.
	TTOCAL		/OUTPUT CAL TO TELETYPE HANDLER.
C6	6		/.CLOSE WILL GENERATE CR/LF.
	JMP* TYPRTN	/RETURN TO CALLER.
	.EJECT
/SUBROUTINE GETBNK, ADD EXTENDED MEMORY BITS REFERENCING CURRENT
/BANK TO 13-BIT ADDRESS IN AC.
/CALL:	LAW ADDR		/GET ADDRESS TO BE MODIFIED.
/	JMS GETBNK	/CALL GETBNK.
GETBNK	0		/ENTRY TO GETBNK.
CWCHRC=GETBNK		/GETCOM: MAXIMUM CHARACTERS POSSIBLE IN LEGAL COMMAND WORD.
	AND ADRMSK	/EXTRACT 13-BIT ADDRESS FROM AC. (ADRMSK=017777)
	DAC GBADR		/SAVE TEMPORARILY.
	LAC GETBNK	/GET ENTRY.
	AND BNKMSK	/EXTRACT EPC BITS. (BNKMSK=060000)
	ADD GBADR		/NOW RETRIEVE 13-BIT ADDRESS.
	JMP* GETBNK	/EXIT WITH 15-BIT ADDRESS IN AC.
/MESSAGES OUT.
EDTMES	ENDED1-.*400+2
BUFSIZ	-67	/LINES PER BLOCK MODE BUFFER LOAD (INITALLY 55(10)).
	.IFUND BF
	.ASCII ' EDITOR V8A'<15>
	.ENDC
	.IFDEF BF
	.ASCII ' EDITOR BF8A'<15>
	.ENDC
ENDED1=.
ERREQM	ENDERQ-.*400+2
BNUM	0	/PARTIAL RESULT DURING RADIX CONVERT OF NUMERIC ARGS.
PK5CHR=BNUM	/5-CHARACTER COUNTER FOR PACK-UNPACK.
PK6CT1=BNUM
	.ASCII 'NOT A REQUEST:'<15>
ENDERQ=.
INPTM	ENDINM-.*400+2
FINDSW	0	/INDICATOR FOR FIND AND LOCATE SEQUENCES.
	.ASCII 'INPUT'<15>
OUTSW1=.-1		/-1 IF OUTPUT FILE IS EMPTY, 0 OTHERWISE.
ENDINM=.
EOFRM	ENDEFM-.*400+2
NUMPTR	0	/POINTER TO CURRENT DIGIT IN ARGUMENT STRING.
PLBH=NUMPTR	/POINTER TO LINE BUFFER HEADER, WORD 0.
	.ASCII 'END OF FILE REACHED BY:'<15>
ENDEFM=.
EOMRM	ENDEMM-.*400+2
MAXLEN	LINSIZ
	.ASCII 'END OF MEDIUM REACHED BY:'<15>
ENDEMM=.
EOBRM	ENDEBM-.*400+2
NXTPTR	0	/POINTER TO NEXT CHARACTER IN CONTROL WORD STRING.
	.ASCII 'END OF BUFFER REACHED BY:'<15>
ENDEBM=.
BOVFLM	ENDBOM-.*400+2
	.IFUND BF
SCOM16	.SCOM+16
	.ENDC
	.IFDEF BF
SCOM10	.SCOM+10
	.ENDC
	.ASCII 'BUFFER CAPACITY EXCEEDED BY:'<15>
ENDBOM=.
NOFIL1	ENDNF1-.*400+2
BUFEMP	0
	.ASCII 'NO INPUT FILE PRESENT.'<15>
ENDNF1=.
NOFLNM	ENDNFN-.*400+2
QRETN	0	/QRETN MAY NEVER BE USED EXCEPT FOR ^P PC STORAGE.
	.ASCII 'NO FILE NAME GIVEN.'<15>
ENDNFN=.
TOPRQM	ENDTRQ-.*400+2
RLFACT	0	/RELOCATION AUGMENT FOR PA AND PL.
	.ASCII 'TOP REQUEST NEEDED.'<15>
ENDTRQ=.
TWOFIL	ENDTF-.*400+2
GBADR	0
	.ASCII 'IS PRESENT ON OUTPUT DEVICE.'<15>
ENDTF=.
TWOFL0	ENDTF0-.*400+2
STAR	52	/GETOCT: ASTERISK.
	.ASCII 'PLEASE RENAME IT OR IT WILL BE DELETED.'<15>
ENDTF0=.
TWOFL1	ENDTF1-.*400+2
SAVESW	-1
	.ASCII 'IS PRESENT ON INPUT DEVICE.'<15>
ENDTF1=.
BADNAM	ENDBDN-.*400+2
QUOTE	0		/QUOTE CHARACTER FOR CHANGE REQUEST.
	.ASCII 'PLEASE USE ANOTHER NAME.'<15>
ERWORD=QUOTE
ENDBDN=.
FILN1	ENDFN1-.*400+2
DELSW	0		/INDICATOR FOR NEXT AND DELETE SEQUENCES.
ERNAME=DELSW
	.ASCII 'NOT FOUND.'<15>
	.LOC .-1
C7	7
ENDFN1=.
EMPFLM	ENDEMF-.*400+2
LEN1	0
	.ASCII 'NOTHING IN FILE.'<15>
	.LOC .-1
C17	17
ENDEMF=.
PRTYMS	ENDPMS-.*400+2
	0
	.ASCII 'READ ERROR:'<15>
	.LOC .-1
ADRMSK	17777
ENDPMS=.
TRNMES	ENDTRN-.*400+2
CL0777	077777
	.ASCII 'TRUNCATED:'<15>
	.LOC .-1
C60	60
ENDTRN=.
BFNEMM	ENDBNM-.*400+2
CL7000	700000
	.ASCII 'BUFFER NON-EMPTY.'<15>
ENDBNM=.
NUFIL1	ENDNF1-.*400+2
	0
	.ASCII 'YOUR EDITED FILE IS ON .DAT -1'<175>
ENDNF1=.
OLDEL	ENDOLD-.*400+2
	0
	.ASCII 'ORIGINAL FILE DELETED.'<15>
ENDOLD=.
NUFIL2	ENDNF2-.*400+2
	0
	.ASCII ' AS '<175>
ENDNF2=.
SVNMES	ENDSVM-.*400+2
SLASH	57	/SLASH (/) FOR BRIEF MODE SERVICER.
	.ASCII 'DATA PRESERVED IN SAVFIL EDT.'<15>
ENDSVM=.
TFILE1	.SIXBT '.TFIL1'
EDNAM	.SIXBT 'EDT'
EDTM	002002
LENGTH	0	/TOTAL DATA CHARACTERS IN CURRENT LINE.
	.ASCII 'EDIT'<15>
/SUBROUTINE GETCOM, EXTRACT CONTROL WORD FROM TYPED INPUT LINE.
/IGNORES LEADING BLANKS IN STRING AND TERMINATES ON FIRST FOLLOWING
/BLANK OR END-OF-LINE. IF STRING BEING EXTRACTED EXCEEDS SEVEN CHARACTERS
/IN LENGTH, THE RIGHTMOST OVERFLOW CHARACTERS ARE THROWN AWAY. TOTAL
/CHARACTERS IN STRING EXTRACTED IS RETURNED TO THE CALLER IN THE AC.
GETCOM	0		/ENTRY TO GETCOM.
NPAIRS=GETCOM		/PUTLIN: TEMPORARY STORAGE.
	LAC CWDLIT	/POINTER TO START OF CONTROL-WORD ARRAY.
	DAC CWDPTR	/SAVE AS CURRENT-CHARACTER POINTER.
FIVE70	LAW -10		/LENGTH OF CONTROL-WORD ARRAY (CWD).
	DAC CWCHRC	/SAVE AS MAXIMUM-CHARACTERS COUNTER.
	DZM NCHARS	/ZERO TOTAL CHARACTERS IN CONTROL-WORD STRING.
	CLL!CML		/INDICATE NO CHARACTERS ENCOUNTERED YET.
GTNXT	JMS NXTCHR	/GET NEXT CHARACTER FROM INPUT LINE.
	JMP GTCLOS	/NO MORE CHARACTERS, CLOSE OUT ARRAY.
	SAD BLANK		/SUCCESS. IS CHARACTER A BLANK?
	JMP BLKFND	/YES, MAKE SURE SOME DATA PRECEDED IT.
	CLL		/NO, INDICATE SOME NON-BLANK CHARACACTER HAS BEEN FOUND.
	ISZ CWCHRC	/BUMP MAXIMUM-CHARACTERS-ALLOWED.
	JMP GTCPUT	/NO OVERFLOW YET, PUT CHARACTER AWAY.
	CLC		/SEVEN CHARACTERS INSERTED, DON'T ALLOW ANY MORE.
	DAC CWCHRC	/RESET CWCHRC TO -1.
	JMP GTNXT		/THEN GO LOOK FOR BLANK OR TERMINATOR.
/COME HERE TO INSERT DATA CHARACTER IN CWD ARRAY.
GTCPUT	DAC* CWDPTR	/PUT CHARACTER AWAY.
	ISZ CWDPTR	/BUMP POINTER FOR NEXT TIME.
	ISZ NCHARS	/AND BUMP CHARACTERS PROCESSED.
	JMP GTNXT		/THEN GO FOR NEXT CHARACTER.
/COME HERE ON BLANK FOUND IN INPUT LINE.
BLKFND	SZL!CLA!CMA	/SKIP IF THIS  S NOT A LEADING BLANK.
	JMP GTNXT		/LEADING BLANK, IGNORE IT.
GTCLOS	DAC* CWDPTR	/NOT LEADING BLANK, THEN TERMINATE STRING (AC = -1 NOW).
	LAC NCHARS		/PICK UP TOTAL CHARACTERS IN STRING.
	JMP* GETCOM	/AND RETURN TO CALLER.
CWD	.BLOCK 10	/ROOM FOR LONGEST LEGAL CONTROL WORD AND TERMINATOR.
/SUBROUTINE NXTCHR, RETURN NEXT 7-BIT CHARACTER FROM UNPACKED INPUT
/ARRAY. NXTPTR MUST BE SET TO BEGINNING OF ARRAY BEFORE FIRST CALL.
/CALL:	JMS NXTCHR	/GO TO NXTCHR.
/	JMP DONE		/RETURN HERE IF END-OF-LINE ENCOUNTERED.
/	DAC CHAR		/RETURN HERE WITH CHARACTER IN AC.
NXTCHR	0		/ENTRY TO NXTCHR.
TNUM=NXTCHR		/GETNUM: TEMPORARY STORAGE.
	LAC* NXTPTR	/GET NEXT CHARACTER.
	SPA		/TERMINATOR?
	JMP* NXTCHR	/YES, RETURN IMMEDIATELY.
	ISZ NXTPTR	/OTHERWISE BUMP POINTER FOR NEXT TIME.
	ISZ NXTCHR	/AND BUMP RETURN ADDRESS.
	JMP* NXTCHR	/THEN RETURN TO CALLER WITH CHARACTER IN AC 11-17.
/SUBROUTINE GETNUM, RETURN BINARY VALUE IN AC OF THE DECIMAL
/ARGUMENT IN THE CONTROL WORD STRING. NUMBER IS RETURNED IN NEGATIVE (2'S
/COMPLEMENT) FORM. IF NO PARAMETER IS PRESENT, AC = 777777. THE
/APPEARANCE OF ANY NON-NUMERIC IN THE PARAMETER STRING CAUSES
/TRANSFER OF CONTROL TO ILLCWD AND SUBSEQUENT DISREGARD OF THE
/ENTIRE COMMAND.
GETNUM	0		/ENTRY TO GETNUM.
	JMS GETCOM	/GET NEXT CONTROL-WORD STRING.
	LAC CWDLIT	/SET DIGIT POINTER TO
	DAC NUMPTR	/BEGINNING OF CONTROL-WORD STRING.
	DZM BNUM		/SET INITIAL RESULT TO ZERO.
GTNLP	LAC* NUMPTR	/ENTER MAIN LOOP, GET NEXT DIGIT FROM INPUT STREAM.
	SPA		/TERMINATOR CHARACTER?
	JMP GTNRTN	/YES, GO TO RETURN.
	AND C17		/NO, MASK OFF NUMERICS.
	DAC TNUM		/SAVE NUMERICS.
	XOR* NUMPTR	/ZERO NUMERICS, REINSERT ZONE BITS.
	XOR C60		/THEN ZERO ZONE BITS. THIS ONLY SEEMS TEDIOUS.
	SZA		/BITS 2 AND 3 ON, BIT 1 OFF: NUMBER PRESENT.
BADARG	JMP ILLCWD	/NON-NUMBER OTHERWISE. GO COMMENT.
	LAC BNUM		/GET VALUE COMPUTED SO FAR, THEN MULTIPLY BY 100.
	CLL!RAL		/FORM BNUM * 2.
	RTL		/BNUM * 8.
	ADD BNUM		/BNUM * 9.
	ADD BNUM		/BNUM * 10.
	ADD TNUM		/BNUM PLUS CURRENT DIGIT.
	DAC BNUM		/NEW VALUE.
	ISZ NUMPTR	/BUMP POINTER TO NEXT DIGIT.
	JMP GTNLP		/LOOP TILL DONE.
GTNRTN	LAC BNUM		/ALL FINISHED, GET FINAL VALUE.
	SZA!CMA		/IF BNUM .E. 0, BNUM = 1.
	TAD ONE		/IF BNUM .G. 0, FORM 2'S COMPLEMENT.
	JMP* GETNUM	/RETURN TO CALLER WITH RESULT IN AC.
/SUBROUTINE GETOCT, RETURN BINARY VALUE OF OCTAL ARGUMENT IN CONTROL WORD
/STRING. BINARY NUMBER IS RETURNED IN AC.
GETOCT	0		/ENTRY TO GETOCT.
	DZM OCTNUM	/ZERO RESULTS REGISTER.
	DZM STARSW	/ZERO INDIRECT INDICATOR.
GETOC1	JMS GETCOM	/MOVE ARGUMENT TO CWD.
	LAC CWD		/GET ARGUMENT.
	SAD STAR		/IS IT AN ASTERISK?
	SKP		/YES, SKIP.
	JMP GETOC2	/NO, ARGUMENT IS DIRECT ADDRESS.
	DAC STARSW	/INDIRECTION WANTED, SO INDICATE.
	JMP GETOC1	/THEN GET THE NEXT STRING.
GETOC2	LAC CWDLIT	/GET START OF CWD ARRAY.
	DAC NUMPTR	/USE AS INPUT POINTER.
GETOC3	LAC* NUMPTR	/GET NEXT DIGIT.
	SPA		/SKIP IF NOT TERMINATOR.
	JMP GETOCR	/TERMINATOR, GO TO RETURN.
	AND C7		/DATA CHARACTER, EXTRACT NUMERICS.
	DAC* NUMPTR	/AND SAVE.
	LAC OCTNUM	/GET RESULTS SO FAR.
	CLL!RAL		/MAKE ROOM FOR THIS DIGIT.
	RTL		/..
	ADD* NUMPTR	/AND INSERT IT.
	DAC OCTNUM	/SAVE NEW RESULT.
	ISZ NUMPTR	/BUMP INPUT POINTER.
	JMP GETOC3	/AND GO FOR NEXT DIGIT.
GETOCR	LAC STARSW	/ALL DONE, WAS INDIRECTION WANTED?
	SZA		/SKIP IF NOT.
	JMP .+3		/IF SO, GO GET RIGHT WORD.
	LAC OCTNUM	/GET NUMBER WANTED.
	JMP* GETOCT	/AND RETURN TO CALLER.
	LAC* OCTNUM	/WORD WANTED IS SPECIFIED BY OCTNUM.
	JMP* GETOCT	/RETURN.
/COME HERE ON EOF ENCOUNTERED IN INPUT FILE.
EOF	LAC GBLKSW
	SZA
	JMP PRTEOF
	LAC BFPTSW
	DAC BUFEMP
	LAW EOBRM
	SKP
PRTEOF	LAW EOFRM
	JMS TYPOUT
EOFCOM	JMS PACK
ADR010	EDLIN
	TYLINE
	LAW TYLINE
	JMS TYPOUT
	JMP FND4
IOINIT	0
CWDPTR=IOINIT
	LAC INPTCL
	AND C777
	DAC .+1
	OPICAL		/INPUT DEVICE.
UNIT1	1
	0
INDEV	0
	DZM LENGTH
	LAC OUTPCL
	AND C777
	ADD C1000
	DAC .+1
	OPOCAL		/SCRATCH DEVICE.
UNIT2	1
	0
OUTDEV	0
	LAW -1
	DAC RDFNOP
	DAC INFILE
	DAC OWFLSW
	DAC OUTSW1	/INDICATE NOTHING WRITTEN YET IN OUTPUT FILE.
	LAW -377
	TAD INDEV
	DAC INDEV
	SPA
	DZM INFILE
	LAW -377
	TAD OUTDEV
	SPA
	DZM OWFLSW
	DAC OUTDEV
	LAC INFILE
	TAD OWFLSW
	SAD NAMEIN
	SKP!CLA
	CLA!CMA
	DAC FILSTR
	CMA
	DAC BLOKSW
	DAC PBLKSW
	DZM BFPTSW
	JMS CHBUFF
	JMP* IOINIT
INFILE	-1
OWFLSW	-1
FILSTR	0
BBUF1	0		/START OF BLOCK BUFFER 1.
BBUF2	0		/START OF BLOCK BUFFER 2.
BBUFX	0		/LENGTH OF EACH BLOCK BUFFER.
	.IFUND BF
	.IFDEF	PTP
INPDAT	DATM14
	.ENDC
	.IFUND	PTP
	.IFUND	PDP15
INPDAT	DATM14
	.ENDC
	.IFDEF	PDP15
INPDAT	.SCOM+23
	.ENDC
	.ENDC
OUTDAT	DATM15
	.ENDC
	.IFDEF BF
INPDAT	0
OUTDAT	0
	.ENDC
/SUBROUTINE CHDAT, CHANGE DAT SLOTS AROUND.
CHDAT	0
	LAC DIRSW
	CMA
	DAC DIRSW
	LAC OUTPCL
	DAC RENAME
	LAC INPTCL
	DAC OUTPCL
	LAC RENAME
	DAC INPTCL
	DZM OUTPSW
	JMS IOINIT
	JMP* CHDAT
	.EJECT
	.LOC EDLIN
/ONE-TIME SECTION TO SET UP CONSTANT ADDRESSES WITH EPC BITS
/TO REFERENCE PROPER (CURRENT) BANK; CALCULATE START OF BLOCK
/BUFFERS. CODING RESIDES IN READ-WRITE LINE BUFFER AREAS AND SETS "BEGIN"
/TO NOP TO AVOID FURTHER CALLS.
SETBNK	LAC NOPLIT
	DAC BEGIN
	.IFUND	BF
	.IFUND	PTP
	.IFDEF	PDP15
	LAW	-15
	TAD*	INPDAT
	DAC	OUTDAT
	DAC	INPDAT
	ISZ	INPDAT
	.ENDC
	.ENDC
	.ENDC
	LAW ADRTBL
	JMS GETBNK
	DAC* C12
ADRLP1	LAC* 12
	JMS GETBNK
	DAC POINTR
	LAC* POINTR
	JMS GETBNK
	DAC* POINTR
	ISZ ACOUNT
	JMP ADRLP1
	LAC* SCOM2
	DAC BBUF1
	LAW TYLINE-1
	JMS GETBNK
	CMA
	TAD BBUF1
	CMA
	RAR!CLL
	DAC BBUFX
	TAD BBUF1
	DAC BBUF2
	DZM BFPTSW
	.IFUND BF
	LAW TYLINE-1	/EDITOR OUTPUTS
	JMS GETBNK	/ITS OWN MEMORY
	CMA		/OVERFLOW MESSAGE
	TAD* SCOM2	/IN KEYBOARD MONITOR
	SPA!SNA		/SYSTEMS.
	JMP OK
	LAW LOAD1
	JMS TYPOUT
	JMP EXIT1
LOAD1	ENDLD1-.*400+2
	0
	.ASCII '.SYSLD 1'<15>
ENDLD1=.
	.ENDC
OK	JMS CHBUFF
	TTICAL
	1
ADR012	RECOUP
	0
	IN2CAL
	1
	0
SBSIZ	0
	LAW -377
	TAD SBSIZ
	SPA
	JMP BEGIN+1
	LAW FSDERM
	JMS TYPOUT
	LAW FSDER1
	JMS TYPOUT
	LAW TYLINE
	JMS TYPEIN
	LAC TYLINE+2
	XOR YES
	SNA
	JMP BEGIN+5
	JMP EXIT1
FSDERM	ENDFSD-.*400+2
	0
	.ASCII '.DAT -10 IS FILE-ORIENTED.'<15>
ENDFSD=.
FSDER1	ENDFR1-.*400+2
	0
	.ASCII 'DO YOU WISH TO CONTINUE'<77><15>
ENDFR1=.
YES	.ASCII 'YES'
	.LOC .-1
SCOM2	.SCOM+2
ADRTBL=.-1
	CWDLIT
	CWDTOP
	INLADR
	EDLADR
	EDLAD1
	FEED
	SBADR
	RDCAL2
	RDALTB
	WRPAK2
	WRALTB
	DEB1
	CKNM1
	CKNM2
	CKNM2+1
	ADR000
	ADR001
	ADR002
	ADR002+1
	ADR003
	ADR004
	ADR004+1
	ADR005
	ADR005+1
	ADR006
	ADR006+1
	ADR008
	ADR008+1
	ADR009
	ADR010
	ADR010+1
	ADR011
	ADR011+1
	ADR012
ACOUNT	ADRTBL-.+1
	.IFUND BULKST
	.END BANK*20000+17720
	.ENDC
	.END