Google
 

Trailing-Edge - PDP-10 Archives - BB-F493Z-DD_1986 - 10,7/fedit.mac
There are 3 other files named fedit.mac in the archive. Click here to see a list.
TITLE	FEDIT	VERSION 3	
SUBTTL	SOURCE INPUT PROCESSOR FOR FED		CWRU/CAM

;EDIT==6

;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
EXTERN	BASCLN,BPAGNO,XSW
	EXTERN TSW,FIRST1
	EXTERN	IMPRSP
	EXTERN	LSTTY,LOGTTY
	EXTERN	CMDCN
 	EXTERNAL	MCBUF
	EXTERN	FIRST,LAST,CMDBUF,CMDCNT,BUF,BUFFCT
	EXTERN	LINEN0,COPYCT,PEOFLG,TAG,PDLIST,M,N,LASNUM
	EXTERN	CHARS,ID,MCSAV,MCSAV2,BOLX,CLINEN,DELCT,FLUSHT,COPYCT
	EXTERN	SAVEAC
	ENTRY	COMPAR
	HISEG


	EXTERNAL	MCIN
	EXTERNAL	UCDDB,MRGDDB,LOGDDB,LSTDDB
	ENTRY	FEDIT
	EXTERNAL	MANCOR,UCIN,CMDLVL,ACTAB,LSTOUT,LOGOUT
	EXTERNAL	LSTOP,FED,MRGOUT


C=1			; REGS C - C+3 FOR INTEGER TO STRING
TEMP=5			; TEMP,TEMP+1 HOLD CHAR FOR STRING TEST
BUPT=7			; POINTS TO BASE CHECK LINE
CMD=10			; POINTS TO COMMAND TEXT
CHX=11			; ONE COMMAND CHAR FOR PROCESSING
PDP=12			; FOR PUSH DOWN LIST
CHAR=13			; ONE CHAR FROM IO
RETURN=14		; GENERAL RETURN FROM IO
TAC=15		; TEMPORARY AC (CLOBBERED FREQUENTLY)



	EXTERNAL	LSTOP


PRBIT==400		;LH TAC BIT MEANING PRINT THINGS IN UPDATE
FLBIT==1000		;LH TAC BIT TELLING UPDATE WE'RE FLUSHING
INSBIT==2000		;LH TAC BIT TELLING UPDATE WE'RE INSERTING NEW
	; FEDIT IS THE FINAL EDITOR FOR SOUP
	; IT ACCEPTS THE FOLLOWING EDITING COMMANDS:

		; -N	INSERT THE TEXT WHICH FOLLOWS AFTER
		; 	THE NTH LINE OF THE ORIGINAL FILE

		; -N,M	DELETE LINES N THROUGH M INCLUSIVE AND INSERT
		; 	FOLLOWING TEXT IN THE RESULTANT HOLE

	; COMMANDS AND 'TEXT THAT FOLLOWS' COMES FROM MANCOR
	; BASE FILE INPUT FROM UCIN, NEW FILE OUTPUTTED VIA MRGOUT





FEDIT:	MOVEM	17,SAVEAC+17	; PREPARE TO RESTORE CALLERS REGS
	MOVEI	17,SAVEAC
	MOVEM	JFFSAV
	SETZM	LINEN0		; SET LINE COUNTER TO 0
	SETOM	FED		; FED HAS BEEN ENTERED
	BLT	17,SAVEAC+16	; DONE
	MOVE	PDP,[IOWD 20,PDLIST]
	MOVE	[XWD FIRST,FIRST+1]
	SETZM	FIRST
	BLT	LAST
	SKIPN	TSW		; TIME MSG?
	JRST	NOTIM		; NOT REQUIRED
	PUSHJ	PDP,TIMEIS
	JSP	14,LOGOUT
	TIMCNT
	TIMBUF
NOTIM:	MOVE	.JBFF
	MOVEM	JFFSAV		; NOW SAVE USER'S .JBFF
	SETZM	TIMCNT		; ZERO TIME COUNT
	SKIPE	LSTOP
	PUSHJ	PDP,THINK
	MOVE	17,MCBUF	; WHAT SHOULD FEDIT DO?
	JRST	.+2(17)
	JRST	COPYVR		; COPY VERBATIM
	JRST	.+2		; FULL BLOWN	EDIT
	JRST	NICHTS		; DELETE FROM COMPLEX
	SETOM	FED		; TELL CSS WE ARE RUNNING FED
	SETZM	LINEN0		; MAKE SURE LISTING IS RIGHT
	SKIPN	LSTTY
	JRST	.+4
	SKIPN	LOGTTY
	JRST	.+2
	SETOM	FIRST		; IF LST&LOG ARE TTY, DUP ER MSGS NO GOOD
	AOS	LASNUM		; LASNUM IS FIRST NUMBER THAT CAN
				; BE EDITED;  INITIALLY SET TO ONE
	PUSHJ	PDP,MCINX	; GET THE FIRST CHAR FROM CORRECTION FILE
	CAIE	CHAR,"-"	; IT MUST BE A '-' TO PLAY BALL
	JRST	ILCOM1		; IT WASN'T COMPLAIN




	; AT THIS POINT, THE FIRST - IS REMOVED FROM THE COMMAND
	; LINE, AND SCANIT WILL SCANIT FROM THERE, SUPPLYING THE
	; TWO INTEGERS N AND M AND FINDING THE ID IF IT EXISTS





PROC:	PUSHJ	PDP,SCANIT	; SCAN THE COMMAND



	; THE VARIABLE TAG IS SET TO 0 WHEN A TAG
	; (<ID>*NEW*-NNN> IS NOT DESIRED AT THE END
	; OF THE LISTING LINE  SEE UPDATE FOR MORE DETAILS



	SETOM	FIRST1		; FIRST COMMAND RECEIVED
	SETZM	TAG		; NO TAG DESIRED
	MOVE	TEMP,M
	JUMPE	TEMP,TESTN	; IF M IS 0 IT IS AN INSERTION ONLY
	CAMGE	TEMP,N		; IF NOT 0 IT MUST BE GTR N
	JRST	ILCOM1		; IF IT ISN'T, COMPLAIN
TESTN:	MOVE	TEMP,N
	JUMPE	TEMP,SKIPIT	; IF N IS 0 TOO, THIS IS A -0 COMMAND
	CAMGE	TEMP,LASNUM	; N MUST BE GE FIRST LINE LEGALLY EDITABLE
	JRST	ILCOM1		; OR ELSE FEDIT IS ANNOYED
SKIPIT:	SKIPE	M		; IF M IS 0 DO AN INSERTION ONLY
	JRST	FIXNUM		; NOT 0, DO INSERTION DELETION
	SUB	TEMP,LASNUM
	AOJ	TEMP,
	MOVEM	TEMP,COPYCT	; COPY N-LASNUM+1 LINES
	MOVE	TEMP,N		; MAKE LASNUM
	AOJ	TEMP,
	MOVEM	TEMP,LASNUM	; BE N+1
	PUSHJ	PDP,COPY	; DO THE COPY
	PUSHJ	PDP,WHERE	; IF EXCEPTIONS MODE, TYPE LOCATING MESSAGE
	SETOM	TAG		; NEW LINES NEED THE TAG
	PUSHJ	PDP,INSERT	; NOW DO THE INSERT
	SETZM	TAG		; NOW MAKE THE TAG DISAPPEAR
	JRST	PROC		; GO TRY FOR ANOTHER COMMAND
FIXNUM:	MOVE	TEMP,N
	SUB	TEMP,LASNUM
	MOVEM	TEMP,COPYCT	; INSERTION DELETION REQUIRES
				; THAT N-LASNUM LINES SHOULD BE COPIED
	MOVE	TEMP,M
	SUB	TEMP,N
	AOJ	TEMP,
	MOVEM	TEMP,FLUSHT	; AND M-N+1 LINES DELETED
	MOVEM	TEMP,CMDCN	; CMDCNT HOLDS IT FOR LIST ROUTINE
	AOS	TEMP,M
	MOVEM	TEMP,LASNUM	; LASNUM SET TO M+1
	SETZM	TAG		; NO TAG YET
	PUSHJ	PDP,COPY	;  COPY THE INDICATED LINES
	PUSHJ	PDP,WHERE
	PUSHJ	PDP,FLUSH	; FLUSH THE OLD LINES
	MOVE	TEMP,CMDCN	; GET THE NUMBER OF LINES DELETED
	ADDM	TEMP,DELCT	; TO TELL LIST ROUTINE
	SETOM	TAG		; NEW LINES NEED TAG
	PUSHJ	PDP,INSERT	; INSERT THE NEW ONES
	SETZM	TAG		; RESET THE FLAG
	JRST	PROC		; READ NEXT COMMAND
ILCOM1:	JSP	14,LOGOUT	; COMPLAINTS ARE REGISTERED HERE
				; REMEMBER THAT THE OFFENSIVE COMMAND
				; IS IN THE CMDBUF
	[^D25]
	[ASCII/*** IMPROPER SEQUENCING
/]
	SKIPE	FIRST
	JRST	.+4
	JSP	14,LSTOUT
	[^D25]
	[ASCII/*** IMPROPER SEQUENCING
/]
	PUSHJ	PDP,CLINEO	; CALL COMMAND LINE OUT ROUTINE
	PUSHJ	PDP,FLUSH2	; FLUSH CORR. FILE TO NEXT COMMAND
	JRST	PROC		; THEN SEE IF USER DOES ANY BETTER


	; WHERE PRINTS AN IDENTIFYING MESSAGE IN EXCEPTIONS (/X) MODE
	; TELLING WHERE THE DIFFERENCES OCCURRED IN THE BASE FILE.

WHERE:
	SKIPN	XSW		;LISTING ONLY EXCEPTIONS?
	 POPJ	 PDP,		; NO, DONE
XINS:	PUSH	PDP,CHAR	; SAFETY -- DCS
	MOVNI	14,3
	ADDB	14,LINCTR	;CHECK OVERFLOW
	JUMPG	14,NOHD
	SKIPN	HEADSW
	JRST	NOHD		;NO HEADING DESIRED
	PUSHJ	PDP,THINK	;PRINT HEADING IF NECC.
	SOS	LINCTR		;ACCOUNT FOR 1 LINE ONLY
	JRST	NOSPP
NOHD:	JSP	14,LSTOUT
	[2]
	[BYTE (7)12,12]		;TWO EXTRA SPACES
NOSPP:
	JSP	14,LSTOUT	; GET PAGE NUMBER IN
	[13]
	[ASCII .AFTER PAGE .]
	MOVE	C+1,BPAGNO	; ASCII
	AOJ	C+1,		;ALWAYS ONE BEHIND
	PUSHJ	PDP,NCON
	JSP	14,LSTOUT
	C+3
	C+2
	JSP	14,LSTOUT	;NOW LINE NUMBER
	[7]
	[ASCII	/, LINE /]
	SKIPN	BASCLN		;USE "EDIT10" SEQUENCE # IF PRESENT
	 JRST	 NONASC		; NONE, USE OTHER
	JSP	14,LSTOUT
	[5]
	BASCLN
	JRST	FINL
NONASC:	MOVE	C+1,LINEN0
	PUSHJ	PDP,NCON
	JSP	14,LSTOUT
	C+3
	C+2
FINL:	JSP	14,LSTOUT
	[2]
	[BYTE (7) 15,12]
	POP	PDP,CHAR	;UNSAFETY -- DCS
	POPJ	PDP,		;DONE
	; COPY IS A ROUTINE THAT COPIES LINES FROM THE BASE FILE 

	; INTO THE NEW FILE VERBATIM.  THE NUMBER OF LINES TO BE

	; COPIED IS STORED IN COPYCT




COPY:	SKIPN	COPYCT		; ANY LINES TO BE COPIED
	POPJ	PDP,		; NO SO RETURN
	PUSHJ	PDP,UCINX	; GET A CHAR FROM OLD FILE
	JUMPE	CHAR,RELES0	; ZERO MEANS EOF
	MOVE	TEMP,CHAR	; SAVE IT IN TEMP
	MOVSI	TAC,0		; PRINT (WILL BE INVERTED), NO
				;  FLUSH, NOT INSERTING FROM NEW
	PUSHJ	PDP,UPDATE	; MAKE IT APPEAR IN LISTING
	CAIL	TEMP,15		; FEED CHAR?
	JRST	COPY		; NO
	HLRZ	TEMP,ACTAB(TEMP)
	JUMPE	TEMP,COPY
	SOSLE	COPYCT		; YES, ONE LINE COPIED
	JRST	COPY
	POPJ	PDP,		; NOTHING LEFT FOR ME TO DO




	; INSERT IS A ROUTINE THAT INSERTS TEXT FOUND IN THE

	; CORRECTION FILE INTO THE NEW FILE. IT QUITS WHEN

	; IT FINDS THE NEXT COMMAND


INSERT:	PUSHJ	PDP,MCINX	; GET A CHAR FROM CORR. FILE
	CAIN	CHAR,55		; - MEANS DONE ALREADY
	POPJ	PDP,
	MOVE	TEMP,CHAR
	HLRZ	CHAR,ACTAB(TEMP)
	JUMPE	CHAR,INSRT0
INSRT9:	
	MOVSI	TAC,INSBIT	;INSERT, NO FLUSH, PRINT
	SETZM	BOLX		; BREAK CHAR RESETS END OF LINE
	PUSHJ	PDP,UPDATE	; AS FAR AS UPDATE IS CONCERNED
	PUSHJ	PDP,MCINX	; GET ONE MORE
	CAIN	CHAR,55		; - AFTER FEED MEANS COMMAND
	POPJ	PDP,		; AND THAT MEANS TO STOP
	MOVE	TEMP,CHAR	; NOT A - THEREFORE OUTPUT IT
	HLRZ	CHAR,ACTAB(CHAR); A FEED??
	JUMPN	CHAR,INSRT9	; OUTPUT TILL - SHOWS UP!!
INSRT0:	
	MOVSI	TAC,INSBIT	;INSERT, NO FLUSH, PRINT
	PUSHJ	PDP,UPDATE
INSRT1:	PUSHJ	PDP,MCINX	; SPECIAL CASES ALL DONE
	MOVE	TEMP,CHAR
INSRT2:	
	MOVSI	TAC,INSBIT
	PUSHJ	PDP,UPDATE	; COPY EVERYTHING UNTIL A FEED SHOWS UP
	CAIL	TEMP,15
	JRST	INSRT1
	HLRZ	TEMP,ACTAB(CHAR)
	JUMPE	TEMP,INSRT1
	PUSHJ	PDP,MCINX	; FEED CHAR APPEARS
	MOVE	TEMP,CHAR
	CAIE	TEMP,55		; IS IT FOLLOWED BY A -?
	JRST	INSRT2
	SETZM	TAG		; YES
	POPJ	PDP,		; GWAN BACK




	; FLUSH DELETES LINES BY NOT OUTPUTTING ANYTHING

	; THE NUMBER OF LINES TO BE FLUSHED IS STORED

	; IN FLUSHT


FLUSH:	SKIPG	FLUSHT		; ANY LINES TO BE FLUSHED?
	POPJ	PDP,		; NOPE
	PUSHJ	PDP,UCINX	; GET OLD FILE CHAR
	PUSH	PDP,CHAR	;SAFETY -- DCS
	MOVE	TEMP,CHAR	;WOW
	MOVSI	TAC,FLBIT!PRBIT ;FLUSH, NO PRINT, NO INSERT
	 PUSHJ	 PDP,UPDATE	; IN EXCEPTIONS MODE
	POP	PDP,CHAR
	CAIL	CHAR,15
	JRST	FLUSH
	HLRZ	CHAR,ACTAB(CHAR)
	JUMPE	CHAR,FLUSH
	SOSLE	FLUSHT		; FEED CHAR, DECR COUNT
	JRST	FLUSH
	POPJ	PDP,		; ALL DONE




	; CMDLIN BUFFERS UP THE EDITING COMMAND SO IT CAN

	; BE DUMPED SOMEWHERE IF IT IS ILLEGAL.  IT IS

	; STORED IN ASCIZ FORM IN CMDBUF, AND IT IS C(CMDCNT)

	; CHARACTERS LONG.




CMDLIN:	MOVE	[XWD	CMDBUF,CMDBUF+1]		; PREPARE TO ZERO BUFFER AREA
	SETZM	CMDBUF
	BLT	CMDBUF+30
	MOVE	CMD,[POINT 7,CMDBUF-1,35]	; INIT BYTE POINTER
	SETZM	CMDCNT
CMDCH:	PUSHJ	PDP,MCINX	; GET A CHAR
	IDPB	CHAR,CMD	; MAKE A DEPOSIT
	SKIPE	CMDBUF+30	; OVERFLOW?
	JRST	BUFUL		; OUCH
	AOS	CMDCNT		; BOOKKEEP
	HLRZ	TEMP,ACTAB(CHAR)
	JUMPE	TEMP,CMDCH
SETIT:	MOVE	CMD,[POINT 7,CMDBUF-1,35]	; FEED ENCOUNTERED, RESET POINTER
	POPJ	PDP,		; COMMAND CAN NOW BE CRAWLED OVER BY SCANNER
BUFUL:	TTCALL	3,[ASCIZ/?GAG? LINE TOO LONG TRUNCATED TO /]
	TTCALL	3,CMDBUF
	TTCALL	3,[ASCIZ/
/]
	MOVEI	CHAR,15
	DPB	CHAR,CMD
	MOVEI	CHAR,12
	IDPB	CHAR,CMD
	JRST	SETIT



	; GETNUM CONVERTS STRING TO INTEGER. IT IS ENTERED WITH
	; THE FIRST CHARACTER TO BE CONVERTED IN CHX.
	; IT HALTS WHEN IT FINDS A NON-NUMERIC CHARACTER, WHICH
	; IT LEAVES IN REG CHX, WITH 60 SUBTRACTED FROM IT


GETNUM:	SUBI	CHX,60		; MAKE THE ASCII AN INTEGER
	JUMPL	CHX,CPOPJ	; NOT NUMERIC, RETURN
	CAIL	CHX,12
	POPJ	PDP,
	MOVE	TEMP+1,CHX	;  MOVE INTEGER TO TEMP+1
NUMCH:	ILDB	CHX,CMD		; GET NEXT ONE FROM BUFFER
	SUBI	CHX,60		; MAKE IT INTEGER
	JUMPL	CHX,CPOPJ	; NOT NUMERIC, RETURN
	CAIL	CHX,12
	POPJ	PDP,
	IMULI	TEMP+1,12	; MULTIPLY DIGIT BY 10
	ADD	TEMP+1,CHX	; ADD NEW DIGIT
	JRST	NUMCH		; NOW LOOK FOR MORE




	; SCANIT IS ENTERED WITH THE BYTE POINTER IN CMD

	; POINTING JUST PAST THE FIRST '-' IN THE COMMAND.

	; IT WILL NOT RETURN UNTIL IT HAS SCANNED A SYNTACTICALLY 

	; KOSHER COMMAND




SCANIT:	PUSHJ	PDP,CMDLIN	; GET A COMMAND INTO THE BUFFER
	SETZM	ID		; SET ID TO 0
	ILDB	CHX,CMD		; LOAD THE FIRST CHARACTER
	CAIE	CHX,40		; BLANKS
	CAIN	CHX,11		; OR TABS
	JRST	IGNOR		; ARE IGNORED
	CAIN	CHX,55		; A - MEANS
	JRST	INSRT3		; INSERT THE COMMAND VERBATIM
	CAIGE	CHX,"0"
	JSP	14,ILLCOM
	CAILE	CHX,"9"
	JSP	14,ILLCOM		; ANYTHING NOT NUMERIC IS DISCARDED
FIRSTN:	PUSHJ	PDP,GETNUM	; NUMERICS FALL THROUGH HERE
	ADDI	CHX,60		; FIND OUT WHY GETNUM STOPPED
	MOVEM	TEMP+1,N	; PUT THE NUMBER FOUND IN N
	SETZM	M		; ZERO M TO DISTINGUISH INSERTION ONLY 
	CAIN	CHX,15		; CR TERMINATING MEANS END OF LINE
	POPJ	PDP,
	CAIN	CHX,","		; COMMA TERMINATING MEANS ID OR 2ND #
	JRST	SECOND
	CAIN	CHX,":"		; : MEANS REDUNDANCY CHECK IMMENENT
	JRST	REDUN
	CAIE	CHX,40		; BLANKS
	CAIN	CHX,11		; OR TABS
	POPJ	PDP,		; ALSO MEAN END OF LINE
	JSP	14,ILLCOM		; ANYTHING ELSE IS AN ERROR





SECOND:	MOVEI	TEMP+1,0	; ZERO INTEGER RETURN REG
	ILDB	CHX,CMD		; GET NEXT CHAR
	PUSHJ	PDP,GETNUM	; SEE IF THERE IS ANOTHER NUMBER
	MOVEM	TEMP+1,M	; STORE IT IN M
	JUMPE	TEMP+1,GETID	; IF IT WAS ZERO, THE ID FIELD EXISTS
	ADDI	CHX,60		; A NUMBER WAS ON THE LINE 
	CAIN	CHX,15		; CR MEANS DONE
	POPJ	PDP, 
	CAIN	CHX,54		; COMMA MEANS SCAN THE ID TOO
	JRST	GETID
	CAIE	CHX,40		; SPACES
	CAIN	CHX,11		; AND TABS
	POPJ	PDP,		; SIGNIFY FIN




	; ILLEGAL (SYNTACTICALLY) COMMANDS ARE DUMPED AND 

	; EDITED HERE

ILLCML:	JSP	14,ILLCOM
	JFCL
ILLCME:	JSP	14,ILLCOM
	JFCL

ILLCOM:	JSP	14,LOGOUT
	[^D22]
	[ASCII/*** IMPROPER COMMAND
/]
	SETZM	TAG
	SKIPE	FIRST
	JRST	.+4
	JSP	14,LSTOUT
	[^D22]
	[ASCII/*** IMPROPER COMMAND
/]
	PUSHJ	PDP,CLINEO	; NUMBER THE CORRECTION LINE
	PUSHJ	PDP,FLUSH2	; FLUSH UP TO NEXT COMMAND
	JRST	SCANIT		; TRY THIS NEW ONE






	; A REDUNDANCY CHECK IMPLIES FURTHER THAT SOME LINES MUST BE

	; COPIED


REDUN:	SUB	TEMP+1,LASNUM
	JUMPL	TEMP+1,ILLCOM	; N-LASNUM LINES MUST BE COPIED
	MOVEM	TEMP+1,COPYCT
	MOVE	TEMP+1,N
	MOVEM	TEMP+1,LASNUM
	AOS	LASNUM		; AND LASNUM MUST BE N+1 
	PUSHJ	PDP,COPY	; COPY THE LINES
	PUSHJ	PDP,BUFFER	; GET THE BASE LINE INTO THE BUFFER
	PUSHJ	PDP,COMPAR	; DO THE STRING COMPAR
	SKIPA			; RETURN HERE IF THEY MATCH
	JRST	NOMATC		; OTHERWISE TROUBLE
	PUSHJ	PDP,MCINX	; SEE IF NEXT LINE IS A COMMAND
	CAIE	CHAR,55
	JSP	14,ILLCOM		; IT WASN'T
	JRST	SCANIT		; GET A REAL COMMAND

 


	; AT THIS POINT, THE CHECK LINES DO NOT MATCH

	; AND A DIALOG WITH THE USER IS NECESSARY


NOMATC:	MOVE	TEMP,[POINT 7,CMDBUF-1,35]
	TTCALL	3,[ASCIZ/		*** UNMATCHING SYNC LINES:
BASE FILE WAS:
	/]
	ILDB	CHX,TEMP
	CAIE	CHX,":"		; FLUSH THE LINE UNTIL THE : SHOWS UP
	JRST	.-2
	MOVE	C+1,CLINEN
	PUSHJ	PDP,NCON	; GET NUMBER OF UNMATCHING LINE
	TTCALL	3,C+2		; TYPE IT OUT
	TTCALL	3,[ASCIZ/.	/]
	ILDB	CHX,TEMP
	TTCALL	1,CHX
	JUMPN	CHX,.-2		; TYPE EACH CHAR OUT ONE BY ONE
	TTCALL	3,[ASCIZ/
USER'S FILE IS: 
	/]
	MOVE	C+1,LASNUM
	SOJ	C+1,
	PUSHJ	PDP,NCON	; GET AND CONVERT BASE LINE NUMBER
	TTCALL	3,C+2		; TYPE IT OUT
	TTCALL	3,[ASCIZ/.	/]
	TTCALL	3,BUF		; AND FEED HIM THE BUFFER
	TTCALL	1,[12]		; AND A LINE FEED TO BE NEAT
	TTCALL	3,[ASCIZ/*/]	; THEN A * TO FORCE A REPLY
RETRY:	TTCALL	4,TEMP		; LISTEN FOR A LINE TO BE TYPED
	TTCALL	11,0		; CLEAR INPUT BUFFER
	CAIN	TEMP,"K"	; A  K
	JRST	GNEXT		; MEANS KEEP THIS FILE
	CAIN	TEMP,15		; A CR MEANS
	JRST	COPY1		; COPY IT WITH NO MORE ALTERATIONS 
	TTCALL	3,IMPRSP	; IMPROPER RESPONSE
	JRST	RETRY		; ANYTHING ELSE IS NOT 'MEANINGFUL DIALOG'
GNEXT:	PUSHJ	PDP,MCINX	; USER WANTS TO LIVE DANGEROUSLY
	CAIE	CHAR,55		; NEXT COMMAND MUST BE FOR REAL
	JSP	14,ILLCOM		; LEST WE COMPLAIN
	JRST	SCANIT		; SCAN THE NEW COMMAND




	; BUFFER PUTS THE LINE FROM THE BASE FILE TO BE CHECKED

	; IN ASCIZ FORM WITH THE FEED CHAR ERASED INTO BUF.

	; IT ALSO COPIES THE LINE IT BUFFERS UP INTO THE NEW FILE


BUFFER:	MOVE	BUPT,[POINT 7,BUF-1,35]	; SET UP THE POINTER TO THE BUFFER
	SETZM	BUFFCT		; ZERO THE CHAR COUNT
BCH:	PUSHJ	PDP,UCINX	; GET SOMETHING
	IDPB	CHAR,BUPT	; AND PUT IT AWAY
	MOVE	TEMP,CHAR	;  AND THEN COPY THE CHAR
	MOVSI	TAC,0		;PRINT, NO FLUSH, NO INSERT
	PUSHJ	PDP,UPDATE	; VIA UPDATE
	AOS	BUFFCT		; BOOK KEEP
	CAIL	CHAR,15
	JRST	BCH
	HLRZ	TEMP,ACTAB(CHAR)
	JUMPE	TEMP,BCH
	MOVEI	TEMP,0		; FEED?
	DPB	TEMP,BUPT	; YES,REPLACE WITH NULL
	MOVE	BUPT,[POINT 7,BUF-1,35]	; RESET POINTER
	POPJ	PDP,		; GO BACK




	; COMPAR TESTS IF THE STRINGS IN CMDBUF AND BUF ARE

	; THE SAME. IT GIVES A SKIP RETURN IF THEY ARE DIFFERENT.

	 ; CHECK LINES  CAN CONTAIN A CR-CR-LF MEANING THAT THE 

	; ORIGINAL LINE WAS ONLY A CR-LF. IF A CHECK LINE HAS ONLY

	; A CR-LF AT THE END, THE ORIGINAL LINE WAS A FEED CHAR

	; THIS ROUTINE MUST TRY TO MAKE SENSE OUT OF THESE OCCURENCES


COMPAR:	SETZM	MCSAV		; ZERO A FLAG
	ILDB	TEMP,CMD	; LOAD CMD CAR 
	ILDB	TEMP+1,BUPT	; LOAD OLD FILE CHAR
	CAIN	TEMP,15		; A CR IN CMD LINE REQUIRES SPEC. CONSIDERATION
	JRST	BUFMT
	JUMPE	TEMP+1,CPOPJ1	; A NULL MEANS ALL DONE
	CAME	TEMP,TEMP+1	; TEST THEM
	JRST	CPOPJ1		; NO MATCH, SKIP RETURN
	JUMPE	TEMP,CPOPJ	; COMPARING NULLS MEANS SUCCESS
	JRST	COMPAR		; TEST THE REST
BUFMT:	JUMPE	TEMP+1,NOFEED	; NULL LINE MEANS LINE WAS FEED ONLY
	SKIPE	MCSAV		; BEEN HERE BEFORE?
	JRST	CPOPJ1		; YES, AND NO MATCH
	AOS	MCSAV		; NO, LEAVE FOOTPRINTS
	CAMN	TEMP+1,TEMP	; TEST CHARS
	JRST	CPOPJ		; SAME, RETURN
CPOPJ1:	AOS	(PDP)		; DIFFERENT,POP RETURN
CPOPJ:	POPJ	PDP,		; GENERAL RETURN, FROM OTHER PLACES TOO
NOFEED:	ILDB	TEMP,CMD	; THE NEXT CHAR SHOULD BE A LINE FEED
	CAIN	TEMP,12
	JRST	CPOPJ		; IT WAS
	JRST	CPOPJ1		; IT WASN'T




	; INTEGER TO STRING -- ENTER WITH NUMBER IN C+1

	; RETURNS WITH ASCII IN C+2 AND CHARACTER COUNT 

	; IN C+3


NCON:	SETZB	C,C+2		; ZERO SOME REGISTERS
	MOVEI	C+3,0
	DIVI	C,12		; DIVIDE NUMBER BY 10
	ADDI	C+1,60		; MAKE REMAINDER ASCII
	ROTC	C+1,-7		; SHIFT INTO C+2
	MOVE	C+1,C		; SWAP QUOTIENT AND REMAINDER
	MOVEI	C,0	 	; ZERO C TO MAKE DIVI WORK
	AOJ	C+3,		; BOOKKEEP CHAR COUNT				
	JUMPN	C+1,.-6		; LOOP UNTIL REMAINDER IS ZERO
	POPJ	PDP,		; AND WHEN THAT HAPPENS, RETURN




	; MCINX GETS CHARACTERS ONE BY ONE FROM THE CORRECTION

	; FILE USING MANCOR. THE LAST CHAR READ MAY

	; BE SAVED IN MCSAV2 TO BE USED TWICE UNDER CERTAIN

	; CONDITIONS, SUCH AS LOOKING FOR THE

	; SEQUENCE <FEED>-'-' - '-' WHEN THE CORRECTION FILE

	; IS BEING FLUSHED




MCINX:	SKIPE	MCSAV2		; HAS A CHAR BEEN SAVED?
	JRST	MCPOP		; YES
	PUSHJ	16,MANCOR	; CALL MANCOR
	CHAR			; PUT  CHARACTER INTO CHAR
	JRST	COPY1		; EOF RETURN
	JUMPE	CHAR,COPY1	; NULL MEANS  EOF
CKCHAR:	CAIL	CHAR,15
	POPJ	PDP,
	HLRZ	TEMP,ACTAB(CHAR)
	JUMPE	TEMP,CPOPJ
	AOS	CLINEN		; A FEED CHAR FORCES LINE COUNT
	POPJ	PDP,		; TO BE INCREMENTED
MCPOP:	MOVE	CHAR,MCSAV2	; LOAD SAVED CHAR
	SETZM	MCSAV2		; UNSTORE IT
	JRST	CKCHAR		; SEE IF IT WAS A FEED






	; UPDATE MAKES THE NEW FILE AS WELL AS A LISTING

	; IF ORIGINALLY REQUESTED. ENTER WITH

	 ; THE CHARACTER TO BE OUTPUT IN REGISTER TEMP




UPDATE:	
	TLNN	TAC,INSBIT	; IF INSERTING OR IF
	SKIPN	XSW		;  NOT IN EXCEPTIONS MODE,
	 TLC	TAC,PRBIT	;  CORRECT THE PRINT BIT
	TLNE	TAC,FLBIT	; IF FLUSHING, DO NOT
	 JRST	 UPDATF		;  PUT CHARACTER IN OUTPUT FILE
	JSP	14,MRGOUT	; OUTPUT THE GIVEN CHARACTER
	[0]
	TEMP
UPDATF:	SKIPN	LSTOP		; SKIP IF LIST DESIRED
	POPJ	PDP,
	CAIL	TEMP,15		; FEED CHAR?
	JRST	CPY1
	CAIG	TEMP,11
	JRST	CPY1
	CAIN	TEMP,14
	MLON
	JRST	[ SKIPN	XSW
		  JRST	.+1	;IF INSERTING AND A FF AND EXCEPTIONS,
		  JRST	CPY1	; GO HANDLE ELSEWHERE
		]
	SKIPN	BOLX		; YES - SKIP IF BEGINNING OF LINE
	PUSHJ	PDP,LINUM	; HAS ALREADY BEEN EDITED WITH NUMBERS
FIXEND:
	TLNN	TAC,PRBIT	;PRINTING?
	JRST	NOTG1		; NOT THIS LINE, RETURN
	TLNE	TAC,INSBIT	;(IF NOT INSRTNG, DON'T PRINT #DELETED YET)
	SKIPN	DELCT
	JRST	NUTHIN
	SKIPN	ID
	JRST	NOID
	PUSHJ	PDP,SPACES
	TLO	TAC,100
	JSP	14,LSTOUT
	[3]
	ID
	TLO	TAC,200
NOID:	TLON	TAC,100
	PUSHJ	PDP,SPACES
	MOVE	C+1,DELCT
	PUSHJ	PDP,NCON
	JSP	14,LSTOUT
	[2]
	[ASCII/*-/]
	JSP	14,LSTOUT
	C+3
	C+2
	SETZM	DELCT
NUTHIN:	
	TLNN	TAC,FLBIT!INSBIT
	JRST	NOTAG		;TAG IF INSERTING, OR FLUSHING & PRINTING
TAGIT:	TLON	TAC,100
	PUSHJ	PDP,SPACES
	SKIPN	ID
	JRST	NOID1
	TLOE	TAC,200
	JRST	NOID1
	JSP	14,LSTOUT
	[3]
	ID
NOID1:	
	MOVEI	C+1,[ASCII /*NEW*/] ;ASSUME NEW
	TLNN	TAC,INSBIT	    ;*OLD* IF FLUSHING
	MOVEI	C+1,[ASCII /*OLD*/] ;WRONG ASSUMPTION
	JSP	14,LSTOUT
	[5]
	XWD	20,C+1		;WOW, INDIRECT BIT
NOTAG:	JSP	14,LSTOUT
	[0]
	[15]			; OUTPUT A CR
	JSP	14,LSTOUT
	[0]
	TEMP			; OUTPUT ORIGINAL FEED CHAR
NOTG1:	SETZM	BOLX		; SET BOL TO 0
	SETZM	CHARS		; SET CHARS TO 0
	TLNN	TAC,PRBIT	; PRINTING THIS TIME?
	 POPJ	 PDP,		;  NO
	CAIN	TEMP,14		; FORM FEED?
	JRST	THINK2		; SEE IF HEADING NEEDED
	SOSN	LINCTR		; TIME FOR HEADING
	JRST	THINK		; MAYBE
	SETZM	BOLX		; TELL LINUM IT'S OK TO NUMBER NXT LINE
	POPJ	PDP,		; ALL DONE
THINK:	SKIPN	HEADSW		; HEADING?
	POPJ	PDP,
	JSP	14,LSTOUT
	[0]
	[14]			;FORM FEED
	JRST	HEADNG		; DO HEADING
THINK2:	SKIPE	HEADSW
	SKIPE	XSW		; NO HEADING ON FF IF IN EXCEPTION MODE
	POPJ	PDP,
	JRST	HEADNG		; DO HEADING (LIKE PUSHJ-POPJ)
 
SIXOUT:	JSP	14,LSTOUT
	SIXCNT
	SIXBUF
	POPJ	PDP,
	EXTERN	HEADSW,LINCTR,PAGCNT,SIXTO7,SIXBUF,SIXCNT
DUMP6:	HRRZM	TAC,P6WORD
	PUSHJ	16,SIXTO7
	PUSHJ	PDP,SIXOUT
	MOVE	TAC,P6WORD
	AOJ	TAC,
	HRROM	TAC,P6WORD
	PUSHJ	16,SIXTO7
	PUSHJ	PDP,SIXOUT
	POPJ	PDP,
	EXTERN	P6WORD
	EXTERN	MCDDB
HEADNG:	MOVEI	^D49
	PUSH	PDP,TAC		;SAVE IT
	MOVEM	LINCTR
	MOVEI	TAC,MRGDDB+2
	PUSHJ	PDP,DUMP6
	JSP	14,LSTOUT
	[20]
	[ASCII/ PREPARED FROM  /]
	MOVEI	TAC,UCDDB+2
	PUSHJ	PDP,DUMP6
	JSP	14,LSTOUT
	[6]
	[ASCII/ AND  /]
	MOVEI	TAC,MCDDB+2
	PUSHJ	PDP,DUMP6
	EXTERN	ID.
	SKIPN	ID.
	JRST	OVER1
	JSP	14,LSTOUT
	[4]
	[ASCII/ BY /]
	JSP	14,LSTOUT
	[4]
	ID.
	JSP	14,LSTOUT
	[0]
	[11]
OVER1:	PUSHJ	PDP,TODAY
	AOS	C+1,PAGCNT
	JSP	14,LSTOUT
	[11]
	[ASCII/		PAGE:  /]
	PUSHJ	PDP,NCON
	JSP	14,LSTOUT
	C+3
	C+2
	JSP	14,LSTOUT
	[14]
	[BYTE (7) 15,12,"F","R","O","M"," ","P","A","G","E"," "]
	MOVE	C+1,BPAGNO
	AOJ	C+1,		;ALWAYS ONE BEHIND
	PUSHJ	PDP,NCON	;MAKE ASCII
	JSP	14,LSTOUT
	C+3
	C+2
NOSOS:	JSP	14,LSTOUT
	[4]
	[BYTE	(7) 15,12,12,12]
	POP	PDP,TAC		;GET IT BACK
DIDID:	POPJ	PDP,
	EXTERNAL DATCNT,DATBUF,TIMCNT,TIMBUF
TODAY:	SKIPE	DATCNT		; DATE EDITED?
	JRST	OUT1		; YES
	CALLI	C+1,14		; GET DATE
	MOVEI	C,0
	DIVI	C,37		; DIV BY 31
	AOJ	C+1,
	PUSH	16,C+1		; SAVE FOR LATER
	MOVE	C+1,C		; GET QUOTIENT
	MOVEI	C,0
	DIVI	C,14		; DIV BY 12
	AOJ	C+1,
	PUSH	PDP,C		; SAVE QUOTIENT FOR LATER
	MOVE	TAC,[POINT 7,DATBUF-1,35]
	MOVEI	C+3,"-"		; FOR DATE
	PUSHJ	PDP,NPUT	; EDIT
	ADDM	C+2,DATCNT	; SAVE CHAR CNT
	POP	16,C+1		; GET OLD QUOTIENT
	PUSHJ	PDP,NPUT	; NOW EDIT DAY
	ADDM	C+2,DATCNT	; COUNT
	MOVEI	C+3,"	"		; EDIT TAB
	POP	PDP,C+1		; GET YEAR
	ADDI	C+1,^D64	; RELOCATE (!)
	PUSHJ	PDP,NPUT	; EDIT
	ADDM	C+2,DATCNT	; COUNT
	PUSHJ	PDP,TIMEIS
OUT1:	JSP	14,LSTOUT
	DATCNT
	DATBUF
	JSP	14,LSTOUT	; GIVE THE TIME
	TIMCNT
	TIMBUF
	POPJ	PDP,		; RETURN






TIMEIS:	MOVE	TAC,[POINT 7,TIMBUF-1,35]
	MOVEI	C+3,":"
	CALLI	C+1,22		; TIME OF DAY
	MOVEI	C+2,3		; SETUP FOR BABYLONIAN ARITHMETIC
	MOVEI	C,0
	DIVI	C,^D60		; MOD 60
	PUSH	16,C+1		; SAVE REMAINDERS
	MOVE	C+1,C		; EXCHANGE
	SOJG	C+2,.-4		; INSCRIBE IN CLAY LUMP 4 TIMES
	PUSHJ	PDP,NPUT	; EDIT HOURS
	ADDM	C+2,TIMCNT
	POP	16,C+1		; MINUTES
	PUSHJ	PDP,NPUT
	ADDM	C+2,TIMCNT
	POP	16,C+1
	MOVEI	C+3,40		; SPACE
	PUSHJ	PDP,NPUT	; EDIT SECONDS
	ADDM	3,TIMCNT	; COUNT CORRECTLY
	POP	16,14		; THROW AWAY TICKS
	POPJ	PDP,		; RETURN

;N.B. -- THE FAMOUS DEC RECURSIVE NUMBER PRINTER!
NPUT:	MOVEI	C,0		;WILL BE CHARACTER COUNT
	PUSHJ	PDP,FRNP	;CALL THE RECURSIVE NUMBER PRINTER
	IDPB	C+3,TAC		;TACKON SPECIAL CHAR N C+3
	MOVEI	C+2,1(C)	;FINAL CHAR COUNT
	POPJ	PDP,		;DONE
FRNP:	IDIVI	C+1,12		;DIVIDE BY 10
	IORI	C+2,"0"		;REMAINDER IS LOW ORDER DIGIT
	HRLM	C+2,(PDP)	;SAVE IN LH OF RETURN ADDR
	JUMPE	C+1,.+2		;ALL DONE? (LEADING ZERO FOR FREE)
	PUSHJ	PDP,FRNP	;NO, RECUR UNTIL DONE
	HLRZ	C+1,(PDP)	;GET NEXT HIGH DIGIT BACK
	IDPB	C+1,TAC		;DEPOSIT
	ADDI	C,1		;COUNT
	POPJ	PDP,		;DONE THIS LEVEL

LINUM:	
	MOVEI	C+3,0		;IN CASE NO LINE NUMBER (FLUSHING)
	TLNE	TAC,FLBIT	;FLUSHING?
	 JRST	 NOS1		;RIGHT, NO NUMBER
	AOS	C+1,LINEN0	; GET NUMBER OF THIS LINE
	PUSHJ	PDP,NCON	; AND MAKE IT ASCII
NOS1:	
	TLNN	TAC,PRBIT	;PRINTING THIS TIME?
	 JRST	 LNDON		; NO, JUST QUIT
	TLNN	TAC,INSBIT	; IF NOT INSERTING AND THERE IS  AN "EDIT10"
	SKIPN	BASCLN		; SEQUENCE NUMBER, USE IT STATT LINE #
	 JRST	 LINENN		; USE BLANK, OR LINEN0
	JSP	14,LSTOUT
	[5]
	BASCLN			;THE LINE NUMBER IN ASCII
	JSP	14,LSTOUT
	[0]
	[11]			;JUST A TAB
	JRST	LNDON		; NOW QUIT
LINENN:
	MOVEI	5
	SUB	C+3
	JUMPLE	NOSPAC		; PUT OUT 5-C(C+3) SPACES TO RT JUSTIFY
	JSP	14,LSTOUT
	0
	[ASCII/     /]
	JUMPE	C+3,NONUM	;IF NONE WAS PROFERRED
NOSPAC:	JSP	14,LSTOUT
	C+3
	C+2			; NOW THE ASCII
NONUM:	JSP	14,LSTOUT
	[2]
	[ASCII/.	/]	; AND SOMETHING TO MAKE IT LOOK NICE
LNDON:
	MOVE	CHAR,TEMP
	SETOM	BOLX		; MAKE NOTE OF THE FACT WE ARE DONE
	POPJ	PDP,		; AND RETURN


CPY1:	CAIN	TEMP,15
	POPJ	PDP,		; PREVENT CR'S FROM COMING IN MIDDLE OF LINE
	SKIPN	BOLX		; NUMBER IF YOU MUST
	PUSHJ	PDP,LINUM
	TLNN	TAC,PRBIT	; PRINTING THIS TIME?
	 POPJ	 PDP,		; NO, QUIT
	AOS	C,CHARS		; INCREMENT COUNT OF CHARS ON TIS LINE
	CAIN	TEMP,14		;IF FF,
	 JRST	 [JSP 14,LSTOUT ;PUT OUT INDICATION
		  [12]
		  [ASCII .<NEW PAGE>.]
		  ADDI C,11
		  MOVEM C,CHARS
		  MOVEI TEMP,12  ;NOW SIMULATE LF
		  JRST UPDATF	;IN LISTING FILE
		]
	CAIN	TEMP,11
	PUSHJ	PDP,ADD7	; TABS NEED SPECIAL TREATMENT
	JSP	14,LSTOUT
	[0]
	TEMP			; MAKE THE ORIGINAL CHAR APPEAR ON LISTING
	MOVE	CHAR,TEMP	; RESTORE THINGS 
	POPJ	PDP,		; AND RETURN






	; WHEN CONTROL GETS TO HERE, THE CORRECTION SUBFILE HAS

	; HIT EOF.  THE FILE IS THEN TO BE COPIED VERBATIM, WITH

	; NO TAGS AT THE END OF THE LINE




COPY1:	SETZM	TAG
	JUMPL	CHAR,.+2
	SETOM	PEOFLG		; SET A FLAG TO RETURN PROPER VALUE
COPY1A:	JSP	RETURN,UCIN
	MOVE	TEMP,CHAR
	JUMPE	CHAR,RELESE
	MOVSI	TAC,0
	PUSHJ	PDP,UPDATE	; COPY CHARS AS IS
	JRST	COPY1A
RELESE:	RELEAS	2,		; AT THIS POINT GAME IS OVER
	RELEAS	4,		; CLEAN UP IO
	RELEAS	3,
	SKIPN	TSW
	JRST	NOTIM1
	SETZM	TIMCNT
	PUSHJ	PDP,TIMEIS
	JSP	14,LOGOUT
	TIMCNT
	TIMBUF
NOTIM1:	MOVE	[XWD	SAVEAC,0]
	BLT	16		; RESTORE USER'S REGS
	MOVE	17,SAVEAC+17
	SETZM	@(17)
	SKIPE	PEOFLG		; ADJUST PARAMETERS TO FEDCTL
	SOS	@(17)
	SETZM	MRGDDB+6
	SETZM	UCDDB+6		; CLEAN UP DDB'S
	SETZM	LSTDDB+6
	MOVE	JFFSAV		;  RESTORE .JBFF
	MOVEM	.JBFF
	EXTERNAL	.JBFF,JFFSAV
	JRST	1(17)		; RETURN




	; HERE THE BASE FILE RAN OUT BEFORE THE CORRECTION FILE DID.

	; THIS MEANS THAT COMMANDS TRIED TO ALTER LINES OF GREATER NUMBERS

	; THAN THE NUMBER OF LINES IN THE FILE.  THE RIDICULOUS CORRECTIONS,

	; AS WELL AS AN ERROR MESSAGE, ARE GIVEN TO THE USER IN THE LOG AND ON

	; THE LISTING.




TUMUCH:	JSP	14,LOGOUT
	[^D25]
	[ASCII/*** FILE TOO SHORT FOR
-/]
	SKIPE	FIRST
	JRST	.+4
	JSP	14,LSTOUT
	[^D25]
	[ASCII/*** FILE TOO SHORT FOR
-/]
	JSP	14,LOGOUT
	CMDCNT
	CMDBUF
	SKIPE	FIRST
	JRST	.+4
	JSP	14,LSTOUT
	CMDCNT
	CMDBUF
	JSP	14,LOGOUT
	[0]
	TEMP
	SKIPE	FIRST
	JRST	.+4
	JSP	14,LSTOUT
	[0]
	TEMP
COPY2A:	PUSHJ	PDP,MCINX
	MOVE	TEMP,CHAR
	JUMPE	CHAR,RELES0
	JSP	14,LOGOUT
	[0]
	TEMP
	SKIPE	FIRST
	JRST	.+4
	JSP	14,LSTOUT
	[0]
	TEMP
	JRST	COPY2A






	; ADD7 ADJUSTS THE CHARACTER COUNT FOR THE LISTING LINE

	; SO THAT THINGS WORK OUT PROPERLY WHEN TABS ARE ENCOUNTERED,

	; SO THAT THE ID IS SPACED OVER PROPERLY.


ADD7:	MOVE	C,CHARS		; GET CURRENT CHARACTER COUNT
	ROTC	C,-3		; DIVIDE BY 8
	TLNE	C+1,700000	; NO REMAINDER MEANS ALREADY AT TAB STOP
	AOJ	C,		;  ADD 1 TO QUOTIENT
	LSH	C,3		; MULTIPLY BY 8
	MOVEM	C,CHARS		; PUT RESULT BACK AS CHARACTER COUNT
	POPJ	PDP,		; THEN RETURN
	; SPACES SPACES OUT TO THE PROPER TAB STOP TO LINE UP ALL THE

	; ID'S AND TAGS AT THE END OF THE LINE.  IF THERE ALREADY ARE

	; TOO MANY CHARACTERS ON THE LINE, NOTHING IS DONE




SPACES:	MOVE	C,CHARS		; GET CURRENT CHAR COUNT
	LSH	C,-3		; DIVIDE BY 8
	AOJ	C,		; MOVE TO NEXT STOP
	MOVEI			; ZERO 0
	SKIPN	LSTTY		; LST DEV TTY?
	MOVEI	3		; GIVE 3 MORE TABS
	ADDI	7		; BUT AT LEAST 7
	SUB	C		; GIVE 7-C TABS TO LINE
	JUMPLE	CPOPJ		; IF TOO MANY ALREADY, JUST RETURN
	JSP	14,LSTOUT
	0
	[ASCII/										/]				; HERE ARE THE TABS
	POPJ	PDP,		; RETURN
INSRT3:	SKIPN	FIRST1		; NOT FIRST COMMAND?
	JSP	14,ILLCOM		; IT WAS AND IS WRONG
	SETOM	TAG		; JUMP HERE TO INSERT -- LINE
	MOVEI	TEMP,55		; SCANNER HAS RIPPED OFF BOTH '-'S
	MOVSI	TAC,INSBIT	;INSERT
	PUSHJ	PDP,UPDATE	; BUT ONLY ONE IS NEEDED
PUTIN:	ILDB	CHX,CMD
	MOVE	TEMP,CHX
	MOVSI	TAC,INSBIT
	PUSHJ	PDP,UPDATE	; OUTPUT CHARACTERS ONE AT A TIME
	CAIG	CHX,11
	JRST	PUTIN
	CAIL	CHX,15
	JRST	PUTIN 
	SETOM	TAG
	PUSHJ	PDP,INSERT	; WHEN A FEED HAS BEEN INSERTED, INSERT
	SETZM	TAG		; LINES THAT FOLLOW
	JRST	SCANIT		; MUST HAVE A COMMAND HERE NOW!
IGNOR:	SKIPE	FIRST1		; FIRST COMMAND?
	JRST	.+3		; NO
	PUSHJ	PDP,MCINX	; GET NEXT CHARACTER
	JRST	SCANIT		; IT BETTER BE A COMMAND
	PUSHJ	PDP,INSERT	; COME HERE TO IGNORE COMMENT LINES
	JRST	SCANIT		; FLUSH AND GET THE NEXT COMMAND






	; FLUSH2 FLUSHES CORRECTION FILE UNTIL IT ENCOUNTERS

	; A COMMAND WHICH IS NOT A -- COMMAND, WHENEVER AN

	; ERROR IN SYNTAX SHOWS UP




FLUSH2:	PUSHJ	PDP,MCINX
	CAIN	CHAR,55		; IF ITS A '-'
	JRST	CK1		; CHECK FURTHER
FLUSH3:	PUSHJ	PDP,MCINX	; GET SOME MORE
	CAIL	CHAR,15
	JRST	FLUSH3
	HLRZ	TEMP,ACTAB(CHAR)
	JUMPE	TEMP,FLUSH3
	PUSHJ	PDP,MCINX
	CAIE	CHAR,55		; CHECK FOR '-' AFTER FEEDS
	JRST	FLUSH3
CK1:	PUSHJ	PDP,MCINX
	MOVEM	CHAR,MCSAV2	; SAVE THIS ONE IN CASE IT ISN'T A -
	CAIN	CHAR,55
	JRST	FLUSH3
	CAIN	CHAR,40		; SPACE?
	JRST	FLUSH3		; NOPE
	CAIN	CHAR,11		; TAB?
	JRST	FLUSH3		; GUESS AGAIN
	POPJ	PDP,		; IT WASN'T, SO RETURN






	; GETID SCANS THE ID FIELD STORING ID IN 'ID'




GETID:	MOVE	TEMP,[POINT 7,ID-1,35]
	SETZB	C,ID		; ZERO ID
	ILDB	CHX,CMD		; GET NEXT CHAR
	CAIE	CHX,40	
	CAIN	CHX,11
	JRST	.-3		; FLUSH SPACES,TABS
	CAIN	CHX,15
	JRST	.-5		; AND STRAY CR'S
	CAIG	CHX,40
	JSP	14,ILLCOM		; NON PRINTING CHARS ILLEGAL
	IDPB	CHX,TEMP	; FIRST CHAR IS STORED IN ID
NXCH1:	ILDB	CHX,CMD
	JUMPE	CHX,ILLCME	; IF FEED CHAR NOT ENCOUNTERED,ERROR
	CAIE	CHX,40		; SPACES MEAN ALL DONE HERE TOO
	CAIN	CHX,11
	POPJ	PDP,
	CAIN	CHX,15
	POPJ	PDP,
	AOJ	C,
	CAIG	C,3		; ONLY STORE 3 CHARS
	IDPB	CHX,TEMP
	JRST	NXCH1






	; UCINX READS BASE FILE TAKING ACTION ON EOF


UCINX:	JSP	RETURN,UCIN
	JUMPE	CHAR,RELES0
	POPJ	PDP,






	; CLINEO DUMPS CORRECTION LINE AND NUMBER INTO

	; LOG AND LIST WHEN ERRORS ARE MADE



CLINEO:	PUSH	PDP,TAC		;SAVE IT
	MOVEI	TAC,LOGOUT	; ALWAYS TO LOG DEV
	PUSHJ	PDP,CLINEB	; SEND A COPY
	MOVEI	TAC,LSTOUT	; IS LST DEV DIFFERENT?
	SKIPN	FIRST		; LETS SEE
	PUSHJ	PDP,CLINEB	; IT IS
	POP	PDP,TAC		; GET IT BACK
	POPJ	PDP,		; RETURN HOME


CLINEB:	MOVE	C+1,CLINEN	; NUMBER OF BAD LINE
	PUSHJ	PDP,NCON
	MOVEI	5
	SUB	C+3
	JUMPLE	NOSPC1		; SEND PROPER NUMBER OF SPACES
	JSP	14,0(15)	; JUMP TO OUTPUT ROUTINE
	0
	[ASCII/     /]
NOSPC1:	JSP	14,0(15)
	C+3
	C+2
	JSP	14,0(15)
	[3]
	[ASCII/.	-/]	; EDITING CHARS
	JSP	14,0(15)
	CMDCNT
	CMDBUF			; COMMAND BUFFER
	JSP	14,0(15)
	[12]
	[ASCII/********
/]
	POPJ	PDP,		; ALL OVER




RELES0:	SKIPG	FLUSHT		; LAST DELETE A SUCCESS?
	JRST	SUCESS		; YES
	JSP	14,LOGOUT	; NO -- FILE TOO SHORT
	[^D31]
	[ASCII/*** FILE TOO SHORT FOR DELETE
/]
	SKIPE	FIRST
	JRST	.+4
	JSP	14,LSTOUT
	[^D31]
	[ASCII/*** FILE TOO SHORT FOR DELETE
/]
	PUSHJ	PDP,CLINEO	; GIVE BAD LINE
SUCESS:	PUSHJ	16,MANCOR	; COME HERE TO CHECK IF MANCOR AT EOF
	TEMP
	JRST	COPY1
	JRST	TUMUCH
COPYVR:	PUSHJ	16,MANCOR
	TEMP
	JRST RELES2
	MOVSI	TAC,INSBIT	; INSERT
	PUSHJ	PDP,UPDATE
	JRST	COPYVR
RELES2:	JUMPL	TEMP,.+2
	SETOM	PEOFLG
	JRST	RELESE
NICHTS:	MOVE	17,SAVEAC+17
	PUSHJ	16,MANCOR
		TEMP
	SKIPA
	JFCL
	JUMPL	TEMP,.+2
	SETOM	PEOFLG
	SETZM	@(17)
	SKIPE	PEOFLG
	SOS	@(17)
	JRST	1(17)
	END;