Google
 

Trailing-Edge - PDP-10 Archives - cust_sup_cusp_bb-x130c-sb - 10,7/unscsp/soup/camio.mac
There are 3 other files named camio.mac in the archive. Click here to see a list.
TITLE	CAMIO	VERSION 3	
SUBTTL	SOUP I/O ROUTINES		CWRU/CAM

;EDIT==6

;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
	EXTERN	ZOP
	EXTERNAL	PRTOPT
	EXTERN	CMDSPC
	EXTERN	P6WORD
	ENTRY	EOFDIA,CMDLVL
	HISEG		;**********************
	EXTERN	NUMBUF,SAVAC2,SAVE16,SAVEPP,COMPOP,DIASW
	EXTERN	.JBFF,.JBREN
	ENTRY	MRGOUT

	EXTERN XSW,BPAGNO,BASCLN


	IFNDEF	BIGSW,<ENTRY	LOGOUT,LSTOUT>	;*********
						; NOT ASSEMBLED
						; FOR 10K COMPAR


	ENTRY IOERR,NOTAV.,SIXTO7,NOTFNDEOFDIA,PTEOF

	EXTERNAL	MRGDDB,LSTDDB,LOGDDB
	EXTERNAL FED,LOGTTY,LSTTY,INCOPT
	EXTERN MRGSPC,LOGSPC,LSTSPC
	EXTERN LSTBKS,BLOCKS,MRGOPT,MRGIPT,LSTOPT,LSTIPT
	EXTERN	LOGOPT,LOGIPT,LRET,PTRLG,MRET,PTRMRG
	EXTERN SIXBUF,SIXCNT,SCHAR,SFF1,SAVACS,LSTRET,PTRLST,LSTOP
	EXTERN	SIXPTR,SEVPTR,SQVE1,SQVE2,STATE.
	EXTERN	NUMLIN,CRPERR,LINCNT
	EXTERN	ID.,ID.CNT,CRLF,CRLFBF,NUMBUF,NUMBF2,SAVEPP





	; THIS ELEMENT HAS ALL COMMON I/O AND THE COMMAND
	; STRING SCANNER WHICH WILL BE REFERRED TO AS "CSS"
	; IN FURTHER DOCUMENTATION





	; REGISTER ASSIGNMENTS, PROBABLY RELEVANT MOSTLY TO CSS

PP=17				; FOR COMPAR, PUSH DOWN POINTER



CMDLVL:	PUSH	16,16	; ENTRY TO CSS - SAVE 16 ON STACK
	JRST	CMDPUR	; AND GO SCAN THE STRING



	IFDEF	BIGSW,<JOBTTY:JOBDDB:	POPJ	16,>



	; THE FOLLOWING THREE HERALDED CHARACTERS ARE THE
	; BREAK CHARACTERS THAT DEFINE THE END OF A LINE TO CAM & FED

FF=13	
LF=12
VT=14	



SIXCT=0			; HOLDS CONCATENATION COUNT
OPT=1			; POINTS TO OPTION BUFFER
REG6=2			;  POINTS TO SIXBYT
STOP=3			; HOLDS CHAR THAT STOPPED SCANNER
SIXBYT=4		; HOLDS CONCATENATED SIXBIT
LIST=5			; LOCAL PUSH DOWN POINTER FOR CSS
PDP=6			; ANOTHER PDP FOR PUSHJ'S
TEMP=7			; TEMP REG FOR ERR MSGS
TEMP.=7			; SPELLING CONVENIENCE 
XX=11			; HOLDS COMMAND STRING CHARS
CHAR=13			; RETURNS CHAR FROM INPUT ROUTINES
RETURN=14		; HOLDS PC TO RETURN FROM IO ROUTINES



	; SOFTWARE I/O CHANNEL ASSIGNMENTS
	; CHANNEL 7 IS GLOBALLY SACRED, DO NOT TOUCH!


MCCHAN=0		; CAM - MANU. CORR. -- FED - CORR. FILE INPUT
ATSGN="@"
LOGCHAN=1		; LOG OUTPUT
MRGCHAN=2		; CAM - MRGED CORR FILE -- FED - NEW SOURCE FILE 
LSTCHN=3		; LISTINGS OUTPUT
UCCHAN=4		; CAM - USER'S CORR. -- FED - OLD SOURCE FILE
BACHAN=5		; COMPAR ONLY, BASE FILE INPUT
USCHAN=6		; COMPAR ONLY, USER'S FILE INPUT
CMDCHAN=7		; ***   COMMANDS FROM HERE   ***
MRGCHN=MRGCHAN		; SPELLING CONVENIENCE
LOGCHN=LOGCHAN
LSTCHAN=LSTCHN
UCHAN=UCCHAN
DTAF=100		; FOR DEVCHR UUO

; MACRO TO CHECK FOR "EDIT10" SEQUENCE NUMBERS, DELETE THEM
DEFINE CHKLN (ROUT,HDR,FLG) <
	PUSH	16,TEMP		;NEED A REGISTER
	MOVE	TEMP,@HDR+1	;GET FULL WORD FROM WHICH BYTE WAS TAKEN
	TRZN	TEMP,1		;A SEQUENCE NUMBER?
	 JRST	 ROUT'9		; NO, CONTINUE
	MOVEM	TEMP,@HDR+1	;SEQNO BIT OFF NOW
 IFE FLG-1,<
	MOVEM	TEMP,BASCLN	;SAVE LINE #
>
	PUSH	16,RETURN	;WE WILL RECUR
	CAMN	TEMP,[ASCII /     /] ;ONE EXTRA CHAR FOR PAGE MARK
REPEAT 6,<
	JSP	RETURN,ROUT	;TOSS OUT REST OF LINE NO, TAB
>
	POP	16,RETURN	;GET RETURN ADDR BACK
	POP	16,TEMP		;AND OLD VALUE OF TEMP
	JRST	ROUT		;GO GET THE CHARACTER
ROUT'9:	POP	16,TEMP		;RESTORE VALUE
>


	;	ROUTINE TO OUTPUT LOG MESSAGES

	; FREQUENTLY USED ERROR MESSAGES

	ENTRY	IMPRSP		; USED BY FEDIT
	EXTERN	TSW		; T SWITCH
MRGOER:	ASCIZ/? MRG OUTPUT/
LSTOER:	ASCIZ/? LST OUTPUT/
IMPRSP:	ASCIZ/??? IMPROPER RESPONSE
/
RECIPR:	ASCIZ/NEW FILE ACCEPTED
/
DUPDEV:	ASCIZ/? DUP INPUT DEV
/

	IFNDEF	BIGSW,	<; **********************
JOBTTY:JOBDDB:	CALLI	CHAR,4		; DO DEVCHR UUO
	HLRZS	CHAR		; MAKE LH RH
	XORI	CHAR,10010	; MASK OFF UNDESIRED BITS
	ANDI	CHAR,10010	; AND SEE IF DEV HAS PROPER CHARACTERISTICS
	JUMPE	CHAR,[POPJ 16,]	; RETURN IF IT DOES
	MOVEI	CHAR,3
	ADDM	CHAR,(16)	; POP RETURN 3 IF IT IS NOT USER TTY
	POPJ	16,


	; GENERAL ROUTINE TO DO TTY OUTPUT.  CSS AND OUTPUT
	; ROUTINES DECIDE IF INFO IN DDB MEANS TO USE USER'S TTY.
	; IF SO, EVERYTHING IS SHOVELED OUT HERE TO AVOID
	; ASSIGNING TTY TO SEVERAL CHANNELS ( WITH DISASTEROUS
	; RESULTS!!!)

TTYOUT:	SKIPE	CHAR,@0(14)	; IS THE CHAR COUNT 0?
	JRST	TYTX		; NO, STRING OUTPUT
	MOVE	CHAR,@1(14)	; YES, GET CHAR
	TTCALL	1,CHAR		; OUTPUT FROM REG
	JRST	2(14)		; RETURN
TYTX:	HRRZM	14,LRET		; SAVE RETURN ADDR
	MOVEI	14,@1(14)	; GET STRING ADDR
	SOJ	14,		; FIX FOR BYTE POINTER
	HRLI	14,(POINT 7,0,35)
	MOVEM	14,PTRLG	; MAKE POINTER
	MOVE	14,@LRET
	MOVE	14,0(14)	; GET CHAR COUNT
TYXX:	ILDB	CHAR,PTRLG	; NOW GET FIRST  ONE
	TTCALL	1,CHAR		; AND TYPE IT OUT
	SOJG	14,TYXX		; DECR COUNT
	MOVEI	14,2		; WENT TO 0, NOW FIX FOR RETURN
	ADDM	14,LRET		; TO PC+2
	JRST	@LRET		; AND THEN GO BACK


	; ROUTINE TO OUTPUT LOG MESSAGES. ALL OTHER OUTPUT ROUTINES
	; WORK BASICALLY LIKE THIS ONE, EXCEPT WHEN INITIALIZING
 		; FILE RETRIEVAL INFORMATION FOR THE MONITOR.  THE USER CALLS
	; FOR ALL OUTPUT ROUTINES ARE AS FOLLOWS:


			; JSP	14,***OUT
			; ARG #1
			; ARG #2
			; RETURNS HERE


	; C(ADDR GIVEN AS ARG #1) IS:


			;0  INDICATING THAT A SINGLE CHARACTER
			;   RIGHT JUSTIFIED IN ADDRESS ARG #2 IS TO
;			;   BE OUTPUT

	;	OR:
			; GTR 0, INDICATING THAT A STRING OF
			;C(ADDR GIVEN BY ARG #2) CHARS IS TO BE OUTPUT



LOGOUT:	SKIPL	LOGDDB+6		; CHANNEL OPEN?
	JRST OPENLG		; NO, OPEN IT
	SKIPE	LOGTTY		; IS THIS A TTY?
	JRST	TTYOUT		; THEN USE TTCALL
LOGC:	SKIPE	CHAR,@0(14)	; GET  C(ARG #1)
	JRST	NXTX		; NON 0 MEANS STRING OUTPUT
	MOVE	CHAR,@1(14)	; SINGLE CHAR, LOAD IT
	SOSG	LOGOPT+2	; IO BUFFER FULL?
	OUTPUT	LOGCHAN,	; YES, OUTPUT IT
	IDPB	CHAR,LOGOPT+1	; PACK CHAR AWAY
	JRST	2(14)		; THEN RETURN
NXTX:	HRRZM	14,LRET		; SAVE RETURN ADDR
	MOVEI	14,@1(14)	; LOAD STRING ADDR
	SOJ	14,		; FIX FOR BYTE POINTER
	HRLI	14,(POINT 7,0,35)	; MAKE IT A POINTER
	MOVEM	14,PTRLG	; PUT IT IN CORE
	MOVE	14,@LRET	; NOW GET CHAR COUNT
	MOVE	14,0(14)	; IN REG 14
LOGX:	SOSG	LOGOPT+2	; BUFFER FULL?
	JRST 	MTLOG		; YES, EMPTY IT
LOGXX:	ILDB	CHAR,PTRLG	; FETCH SOMETHING
	IDPB	CHAR,LOGOPT+1	; PUT IN BUFFER
	SOJG	14,LOGX		; DECR COUNT
	MOVEI	14,2		; DONE, FIX RETURN
	ADDM	14,LRET		; TO CALLING PC+2
	JRST	@LRET		; GO HOME
MTLOG:	OUT	LOGCHAN,	;  OUTPUT BUFFER
	JRST	LOGXX		; DO MORE WORK IF NO ERRORS
	PUSHJ	16,IOERR	; TELL OPR AN IO ERROR HAS OCCURED
	XWD	[ASCIZ/?LOG OUTPUT/],LOGDDB
	JRST	MTLOG		; OPR DID SOMETHING, TRY AGAIN
OPENLG:	MOVE	CHAR,LOGDDB	; GET DEV NAME
	PUSHJ	16,JOBTTY	; IS IT A USER TTY?
	SETOM	LOGTTY		; YES, SET TTY FLAG
	SETOM	LOGDDB+6	; AND CHANNEL OPEN FLAG
	JRST	TTYOUT		; AND TYPE OUT STRING
	SKIPE	LOGDDB+6	; NEW FILE NAME?
	JRST	NEWLOG		; YES, DO NOT RE-INIT
	MOVE	CHAR,LOGDDB	; GET DEV NAME AGAIN
	MOVEM	CHAR,LOGSPC+1	; PUT WHERE MONITOR WILL SEE IT
INITLG:	OPEN	LOGCHAN,LOGSPC	; TRY TO OPEN CHANNEL
	JRST	.+2		; FAILURE
	JRST	LOGOK		; SUCCESS
	PUSHJ	16,NOTAV.	; TELL OPR DEV NOT AVAILABLE
	XWD	[ASCIZ/?LOG/],LOGDDB
	JRST	INITLG-1	; HE HAS FIXED THINGS
LOGOK:
NEWLOG:	SKIPN	LOGDDB+2	; IS THERE A FILE NAME?
	JRST	NOFILE		; NO, DO NO ENTER
	HRRZI	CHAR,SAVACS	; PREPARE TO SAVE REGS
	BLT	CHAR,SAVACS+3	; IN SAVAC REGION
	HRLZI	CHAR,LOGDDB+2	; THEN LOAD FILENAME.EXT[X,X]
	BLT	CHAR,3		; INTO REGS 0-3
	ENTER LOGCHAN,0		; AND ENTER NEW FILE
	JRST	LOGNF		; UNLESS DIRECTORY FULL
	HRLZI	CHAR,SAVACS	; NOW GET THE USER'S REGS
	BLT	CHAR,3		; BACK IN ORDER
NOFILE:	OUTPUT	LOGCHAN,		; NOW DO FIRST OUT
	SETOM	LOGDDB+6	; AND SET CHANNEL OPEN
	JRST	LOGC		; AND RETURN TO DO WORK
LOGNF:	PUSHJ	16,NOTFND	; TELL OPR FILE CANNOT BE WRITTEN
	XWD	[ASCIZ/?CANNOT ENTER LOG OUTPUT FILE /],LOGDDB
	JRST	NEWLOG		; OPR KNOWS BETTER, TRY AGAIN
	>



	; ROUTINE TO OUTPUT MERGED CORRECTION FILE
	; THIS ROUTINE IS NEARLY IDENTICAL TO LOGOUT, SO ONLY
	; DIFFERENCES WILL BE NOTED HERE.


MRGOUT:	SKIPL	MRGDDB+6	
	PUSHJ	16,OPNMRG	; OPEN CHAN AND COUNT FREE BLKS
MRGC:	SKIPE	CHAR,@0(14)
	JRST	NXTX1
	MOVE	CHAR,@1(14)
	SOSG	MRGOPT+2
	JRST	MTMRG2
PUTC:	IDPB	CHAR,MRGOPT+1
		JRST	2(14)
NXTX1:	HRRZM	14,MRET
	MOVEI	14,@1(14)
	HRLI	14,(POINT 7,0,35)
	SOJ	14,
	MOVEM	14,PTRMRG
	MOVE	14,@MRET
	MOVE	14,0(14)
MRGX:	SOSG	MRGOPT+2
	JRST	MTMRG
MRGXX:	ILDB	CHAR,PTRMRG
	IDPB	CHAR,MRGOPT+1
	SOJG	14,MRGX
	MOVEI	14,2
	ADDM	14,MRET
	JRST	@MRET
MTMRG:	SOSG	BLOCKS		; HERE WE MUST BOOKKEE BLOCKS USED
	PUSHJ	16,MTF.		; NONE LEFT, ASK OPR FOR MORE TAPE
	OUT	MRGCHAN,	; PLENTY LEFT, OUTPUT BUFFER
	JRST	MRGXX		; SUCCESS
	PUSHJ	16,IOERR	; INFORM OPR HE MAY NEED REPAIR MAN
	XWD	MRGOER,MRGDDB
	JRST	MTMRG		; REPAIR MAN CAME AND LEFT
MTMRG2:	MOVEM	CHAR,SCHAR	; SAVE CHAR TO BE OUTPUT
	SOSG	BLOCKS		; BEFORE CHECKING FOR FULL TAPE
	PUSHJ	16,MTF.		; TAPE FULL, COMPLAIN
	MOVE	CHAR,SCHAR	; PICK UP LAST CHAR
	OUT	MRGCHAN,	; NOW OUTPUT THE BLOCK
	JRST	PUTC		; AND GO BACK IF NO ERRORS
	PUSHJ	16,IOERR	; TROUBLE
	XWD	MRGOER,MRGDDB
	JRST	MTMRG2		; OPR WANTS TO TRY AGAIN

	;	ROUTINE TO COUNT BLOCKS AND INIT MRG DEVICE

OPNMRG:	SKIPE	MRGDDB+6	; NEW FILE NAME ONLY?
	JRST NEWMRG		; YES
	HRLOI	CHAR,377777	; NO, SET FREE BLOCKS TO MAX
	MOVEM	CHAR,BLOCKS
	MOVE	CHAR,MRGDDB	; NOW FIND OUT IF DTA OR DSK
	CALLI	CHAR,4
	TLNN	CHAR,DTAF
	JRST	OMITDI		; NOT A DECTAPE, DON'T COUNT BLOCKS
	MOVE	CHAR,.JBFF	; IT IS A DETAPE, SAVE OLD .JBFF
	MOVEM	CHAR,SFF1
	MOVEI	CHAR,14		; SET INPUT MODE TO BINARY
	MOVEM	CHAR,MRGSPC
	MOVE	CHAR,MRGDDB	; GET DEV NAME
	MOVEM	CHAR,MRGSPC+1
	MOVEI	CHAR,MRGIPT	; MAKE DEV DO INPUT
	HRRM	CHAR,MRGSPC+2
INMRG1:	OPEN	MRGCHAN,MRGSPC	; OPEN DEV
	PUSHJ	16,MRGNA	; OR COMPLAIN
	USETI	MRGCHAN,144	; READ DIRECTORY
	INPUT	MRGCHAN,
	SETZM	BLOCKS		; ZERO FREE BLOCKS
	HRLZI	CHAR,(POINT 5,0,35)	; MAKE POINTER COUNT SLOTS
	HLLM	CHAR,MRGIPT+1	; 5 BITS BIG (SEE MONITOR MANUAL)
	MOVEM	CHAR+1,SQVE1	; SAVE US AN EXTRA REGISTER
	MOVEI	CHAR+1,^D577	; WE WISH TO SEE WHICH BLOCKS NOT USED
NXSLOT:	ILDB	CHAR,MRGIPT+1	; IS THIS TAPE BLOCK USED?
	JUMPN	CHAR,.+2	; SKIP IF IT IS
	AOS	BLOCKS		; TOTAL NUMBER OF FREE BLOCKS
	SOJG	CHAR+1,NXSLOT	; BE SURE TO COUNT ONLY 577 BLOCKS
	MOVE	CHAR,BLOCKS	; GET THE TOTAL WHEN DONE
	SUBI	CHAR,24		; AND SUBTRACT A FEW FOR SAFETY
	MOVEM	CHAR,BLOCKS	; PUT BACK SAFE NUMBER OF FREE BLOCKS
	JUMPG	CHAR,TAPEOK	; IF >0 THE TAPE CAN BE USED
	TTCALL	3,[ASCIZ/?MRG TAPE TOO FULL
/]
	CALLI	1,12		; EXIT AND WAIT
	RELEAS	MRGCHAN,		; RELEASE AND
	JRST	INMRG1		; TRY AGAIN
TAPEOK:	MOVE	CHAR+1,SQVE1	; RESTORE THE REGISTER USED
	RELEAS	MRGCHN,		; DESTROY INPUT SIDE OF CHAN
	MOVE	CHAR,SFF1	; GET PREVIOUS .JBFF
	MOVEM	CHAR,.JBFF	; RESTORE .JBFF
OMITDI:	MOVE	CHAR,MRGDDB	; AND NOW IT LOOKS LIKE NOTHING HAPPENED
	MOVEM	CHAR,MRGSPC+1	; REINIT FOR OUTPUT ONLY
	SETZB	CHAR,MRGSPC	; IN ASCII MODE
	HRRM	CHAR,MRGSPC+2	; AND PREVENT INPUT SIDE FROM BEING OPENED
	OPEN	MRGCHAN,MRGSPC	; OPEN IT
	PUSHJ	16,MRGNA	; DEVICE NOT AVAILABLE
	SKIPE	FED
	OUTBUF	MRGCHAN,5	; ROOM FOR FED
NEWMRG:	SKIPN	MRGDDB+2	; NO FILE NAME
	JRST	NOFILM		; NO SKIP
	HRRZI	CHAR,SAVACS	
	BLT	CHAR,SAVACS+3	; SWAP REGS 0-3
				; WITH FILE RETRIEVAL INFO
	HRLZI	CHAR,MRGDDB+2
	BLT	CHAR,3
	ENTER	MRGCHAN,	; WITH FILE INFO AND DO ENTER
	JRST	MRGNOEN		; CAN'T WRITE
	HRLZI	CHAR,SAVACS	; EVERYTHING OK NOW, RESTORE REGS
	BLT	CHAR,3
NOFILM:	OUTPUT	MRGCHAN,	; NOW DO FIRST OUTPUT
	SETOM	MRGDDB+6
	POPJ	16,		; AND RETURN TO CALLER
MRGNA:	PUSHJ	16,NOTAV.	; TELL OPR DEV NOT AVAIL
	XWD	[ASCIZ/?MRG/],MRGDDB
	SOS	(16)
	SOS	(16)
	POPJ	16,		; RETURN TO PC-2 (OPEN UUO)
MRGNOEN:	PUSHJ	16,NOTFND	; TELL OPR WRITING NOT POSSIBLE
	XWD	[ASCIZ/?CANNOT ENTER MRG OUTPUT FILE /],MRGDDB
	JRST	NEWMRG		; RETRY
	IFNDEF	BIGSW,<




	; LSTOUT IS SO SIMILAR TO MRGOUT , IT COULD HAVE BEEN
	; GENERATED BY A MACRO.  HOWEVER, IT WORRIES ABOUT 
	; OUTPUTTING TO THE USER'S TTY TOO, LIKE LOGOUT

LSTOUT:	SKIPL	LSTDDB+6	
	PUSHJ	16,OPNLST
	SKIPE	LSTTY		; HAVE WE GOT A TTY?
	JRST	TTYOUT		; THEN USE TTCALL
LSTC:	SKIPE	CHAR,@0(14)
	JRST	NXTX2
	MOVE	CHAR,@1(14)
	SOSG	LSTOPT+2
	JRST	MTLST2
PUTL:	IDPB	CHAR,LSTOPT+1
	JRST	2(14)
NXTX2:	HRRZM	14,LSTRET
	MOVEI	14,@1(14)
	HRLI	14,(POINT 7,0,35)
	SOJ	14,
	MOVEM	14,PTRLST
	MOVE	14,@LSTRET
	MOVE	14,0(14)
LSTX:	SOSG	LSTOPT+2
	JRST	MTLST
LSTXX:	ILDB	CHAR,PTRLST
	IDPB	CHAR,LSTOPT+1
	SOJG	14,LSTX
	MOVEI	14,2
	ADDM	14,LSTRET
	JRST	@LSTRET
MTLST:	SOSG	LSTBKS
	PUSHJ	16,MTF2. 
	OUT	LSTCHAN,
	JRST	LSTXX
	PUSHJ	16,IOERR
	XWD	LSTOER,LSTDDB
	JRST	MTLST
MTLST2:	MOVEM	CHAR,SCHAR
	SOSG	LSTBKS
	PUSHJ	16,MTF2.
	MOVE	CHAR,SCHAR
	OUT	LSTCHAN,
	JRST	PUTL
	PUSHJ	16,IOERR
	XWD	LSTOER,LSTDDB
	JRST	MTLST2+2
CKFED:	SKIPN	FED
	JRST	CKFAIL
	POP	16,CHAR		; POP OLD RETURN PC OFF LIST
	JRST	2(14)		; IF FED IS RUNNING, AND LSTOP IS FALSE,
				; LSTOUT DOES NO I/O
OPNLST:	SKIPN	LSTOP
	JRST	CKFED
CKFAIL:	SKIPE	LSTDDB+6
	JRST	NEWLST
	HRLOI	CHAR,377777
	MOVEM	CHAR,LSTBKS
	MOVE	CHAR,LSTDDB
	CALLI	CHAR,4
	TLNN	CHAR,DTAF
	JRST	OMITD2
	MOVE	CHAR,.JBFF
	MOVEM	CHAR,SFF1
	MOVE	CHAR,LSTDDB
	MOVEM	CHAR,LSTSPC+1
	MOVEI	CHAR,14
	MOVEM	CHAR,LSTSPC
	MOVEI	CHAR,LSTIPT
	HRRM	CHAR,LSTSPC+2
NLST:	OPEN	LSTCHAN,LSTSPC
	PUSHJ	16,LSTNA
	USETI	LSTCHAN,144
	INPUT	LSTCHAN,
	SETZM	LSTBKS		; MAKE FREE BLOCKS APPEAR IN LSTBKS
	HRLZI	CHAR,(POINT 5,0,35)
	HLLM	CHAR,LSTIPT+1
	MOVEM	CHAR+1,SQVE2
	MOVEI	CHAR+1,^D577
NNXSLT1:	ILDB	CHAR,LSTIPT+1
	JUMPN	CHAR,.+2
	AOS	LSTBKS		; COUNT THE FREE BLOCKS
	SOJG	CHAR+1,NNXSLT1
	MOVE	CHAR,LSTBKS
	SUBI	CHAR,24
	MOVEM	CHAR,LSTBKS
	JUMPG	CHAR,TAPOK2	; ENOUGH LEFT, LET PROGRAM CONTINUE
	TTCALL	3,[ASCIZ/?LST TAPE TOO FULL
/]
	CALLI	1,12		; EXIT AND WAIT
	RELEASE	LSTCHAN,	; RELEASE AND
	JRST	NLST		; TRY AGAIN
TAPOK2:	MOVE	CHAR+1,SQVE2
	RELEAS	LSTCHN,
	MOVE	CHAR,SFF1
	MOVEM	CHAR,.JBFF
OMITD2:	MOVE	CHAR,LSTDDB
	PUSHJ	16,JOBDDB	; IS THIS A USER TTY?
	SETOM	LSTTY		; YES, SET LSTTY FLAG
	SETOM	LSTDDB+6	; AND STATUS
	POPJ	16,		; AND RETURN 
	MOVE	CHAR,LSTDDB
	MOVEM	CHAR,LSTSPC+1
	SETZB	CHAR,LSTSPC	; ERASE FOOTPRINTS FROM READING
	HRRM	CHAR,LSTSPC+2	; DIRECTORY
INLST1:	OPEN	LSTCHAN,LSTSPC
	PUSHJ	16,LSTNA
	SKIPE	FED
	OUTBUF	LSTCHAN,5	; MORE BUFFERS FOR FED
NEWLST:	SKIPN	LSTDDB+2
	JRST	NOFIL1
	HRRZI	CHAR,SAVACS
	BLT	CHAR,SAVACS+3
	HRLZI	CHAR,LSTDDB+2
	BLT	CHAR,3
	ENTER	LSTCHAN,	; DO ENTER WITH INFO IN REGS
	JRST	LSTNOEN
	HRLZI	CHAR,SAVACS
	BLT	CHAR,3
NOFIL1:	OUTPUT	LSTCHAN,	; DO FIRST OUTPUT HERE
	SETOM	LSTDDB+6	; SET STATUS TO FULL THROTTLE
	POPJ	16,
LSTNA:	PUSHJ	16,NOTAV.
	XWD	[ASCIZ/?LST/],LSTDDB
	SOS	0(16)
	SOS	(16)
	POPJ	16,
LSTNOEN:	PUSHJ	16,NOTFND
	XWD	[ASCIZ/?CANNOT ENTER LST OUTPUT FILE /],LSTDDB
	JRST	NEWLST
		>



	; SIXBIT TO ASCIZ CONVERSION ROUTINE.  PUSHJ TO SIXTO7
	; AND STORE INFO IN SPECIAL PARAMETER WORD P6WORD,
	; IN FOLLOWING FORMAT:

	;	LH		RH

	;	-1	ADDR OF SIXBIT	EDITS " " AT END
	;	0	ADDR OF SIXBIT	EDITS "." AT END OF ASCII
	;	1	ADDR OF SIXBIT	EDITS CR-LF AT END OF ASCII

	; NUMBER OF CHARACTERS CONVERTED STORED IN SIXCNT
	; ASCIZ IS FOUND IN SIXBUF


SIXTO7:	HRRZ	CHAR,P6WORD	; GET ADDR OF SIXBIT
	SOJ	CHAR,		; -1 TO MAKE POINTER WORK
	HRLI	CHAR,(POINT 6,0,35)
	MOVEM	CHAR,SIXPTR	; MAKE UP 6 BIT EXTRACTER
	SETZM	SIXCNT		; ZERO CHAR COUNT
	MOVE	CHAR,[POINT 7,SIXBUF-1,35]
	MOVEM	CHAR,SEVPTR	; MAKE UP 7 BIT CONCATENATOR
	SETZM	SIXBUF		
	SETZM	SIXBUF+1	; ZERO BUFFER FOR ASCIZ
CONV67:	ILDB	CHAR,SIXPTR	; GET SIXBIT CHAR 
		JUMPE	CHAR,CONVFI	; ZERO MEANS DONE
	ADDI	CHAR,40		; ADD 40 TO MAKE IT ASCII
	IDPB	CHAR,SEVPTR	; PUT IT IN BUFFER
	AOS	CHAR,SIXCNT	; AND INCR COUNT
	CAIG	CHAR,5		; DO NOT CONVERT MORE THAN 5
	JRST	CONV67
CONVFI:	HLRE	CHAR,P6WORD	; NOW FIND OUT WHAT TO EDIT
	JUMPE	CHAR,WANTS.	; 0 PUT OUT A "."
	JUMPL	CHAR,SPACE.	; -1 PUT OUT A " "
	MOVEI	CHAR,15		; DEFAULT, PUT OUT CR-LF
	IDPB	CHAR,SEVPTR
	MOVEI	CHAR,12
	IDPB	CHAR,SEVPTR
	MOVEI	CHAR,2
	ADDM	CHAR,SIXCNT	; MAKE CHAR COUNT AGREE
	POPJ	16,		; RETURN
POP.:	AOS	(16)		
	POPJ	16,		; GENERAL PURPOSE POP RETURN
WANTS.:	MOVEI	CHAR,"."
	IDPB	CHAR,SEVPTR
	AOS	SIXCNT
	POPJ	16,
SPACE.:	MOVEI	CHAR," "
	IDPB	CHAR,SEVPTR
	AOS	SIXCNT
	POPJ	16,

		


	; IOERR HANDLES IO ERRORS. ENTER WITH A PUSHJ 16,
	; FOLLOWED BY A PARAMETER WORD FORMULATED
	; THUS:

	;	XWD [ASCIZ/<TEXT TO BE PRINTED>/], ADDR OF DEV NAME

	; AND IOERR WILL RETURN UPON SUCCESSFUL DIALOGUE
	; WITH USER




IOERR:	PUSH	16,TEMP.		; SAVE TEMP 
	PUSH	16,TEMP.+1	; AND TEMP+1
	HRRZ	TEMP.,@-2(16)	; GET ADDR OF DEV NAME IN SIXBIT
	HLRZ	TEMP.+1,@-2(16)	; AND ADDR OF TEXT
	TTCALL	3,@TEMP.+1	; TYPE TEXT OUT
	TTCALL	3,[ASCIZ/ ERROR FROM /]
	HRROM	TEMP.,P6WORD
	PUSHJ	16,SIXTO7	; CONVERT DEV NAME TO ASCIZ
	TTCALL	3,SIXBUF	; TYPE IT
	ADDI	TEMP.,2		; GET FILE NAME
	HRRZM	TEMP,P6WORD
	PUSHJ	16,SIXTO7	; CONVERT TO ASCIZ
	TTCALL	3,SIXBUF	; AND TYPE
	AOJ	TEMP.,		; NOW MAKE EXT APPEAR
	TLO	TEMP.,1
	MOVEM	TEMP.,P6WORD
	PUSHJ	16,SIXTO7
	TTCALL	3,SIXBUF	; ON TTY
	PUSHJ	16,GPDIA	; DO DIALOGUE
	POP	16,TEMP.+1	; RETURN ON USER'S OK
	POP	16,TEMP.	; RESTORE TEMP,TEMP+1
	JRST	POP.		; GO BACK TO I/O ROUTINE



	; NOTAV. IS CALLED SIMILARLY, WHENEVER
	; A BAD DEVICE WAS SPECIFIED.  WHEN THE USER ASSIGNS THE
	; DEVICE, IT WILL RETURN TO CALLER



NOTAV.:	PUSH	16,TEMP.	
	PUSH	16,TEMP.+1	; SAVE TEMP AND TEMP+1
	HRRZ	TEMP.,@-2(16)	; GET DDB ADDR
	HLRZ	TEMP.+1,@-2(16)	; AND TEXT ADDR
	TTCALL	3,@TEMP.+1	; TYPE TEXT
	TTCALL	3,[ASCIZ/ DEV /]
	HRROM	TEMP.,P6WORD
	PUSHJ	16,SIXTO7
	TTCALL	3,SIXBUF	; TYPE NAME OF DEVICE
	TTCALL	3,[ASCIZ/NOT AVAILABLE
/]
	PUSHJ	16,GPDIA	; REQUEST RESPONSE FROM USER
	POP	16,TEMP+1
	POP	16,TEMP.	; RESTORE REGS
	JRST	POP.		; POP RETURN



	; NOTFND IS CALLED LIKE IOERR WHENEVER A FILE 
	; CANNOT BE FOUND OR CANNOT BE ENTERED.  THE
	; FORMAT OF THE ERROR MESSAGE IS A LITTLE FREER
	; AND CAN BE USED FOR OTHER PURPOSES, BESIDES



NOTFND:	HRRZ	TEMP.,@0(16)	; GET DDB ADDR
	HLRZ	TEMP.+1,@0(16)	; AND TEXT ADDR
	TTCALL	3,@TEMP.+1	; TYPE TEXT
	ADDI	TEMP.,2		; AND FILENAME.EXT (CR-LF)
	HRRZM	TEMP.,P6WORD
	PUSHJ	16,SIXTO7
	TTCALL	3,SIXBUF
	AOJ	TEMP.,
	TLO	TEMP.,1
	MOVEM	TEMP.,P6WORD
	PUSHJ	16,SIXTO7
	TTCALL	3,SIXBUF
	PUSHJ	16,GPDIA	; DIALOGUE
	JRST	POP.		; POP RETURN IF OK



	; PAPER TAPE READER EOF ROUTINE.  CONTROL GETS
	; TO HERE WHEN ANY INPUT ROUTNE USING PTR HITS
	; EOF, AT WHICH POINT MORE TAPE IS REQUESTED


PTEOF:	MOVEI	CHAR,0
	AOSGE	6(TEMP)
	JRST	RETN
	SOS	6(TEMP)
	TTCALL	3,[ASCIZ/*** END OF PAPER TAPE	
/]				; TYPE OUT MSG
	IFDEF REENT,<
	MOVEI CHAR,REENPT	; SET UP FOR REEN COMMAND
	MOVEM	CHAR,.JBREN	; ADJUST .JBDAT AREA
		>		; DO NOT TAMPER UNLESS SWITCH ON
	CALL 1,[SIXBIT/EXIT/]	; SPECIAL EXIT
REENPT:	TTCALL 3,[ASCIZ/*/]	; RETURN HERE FROM MONITOR MODE
	TTCALL	4,CHAR		; GET USER'S REPLY
	CAIN	CHAR,"D"
	JRST	RET.		; D MEANS MORE TO COME
	CAIN	CHAR,15
	JRST	RETX.		; CR MEANS PHYSICAL EOF
	TTCALL	11,0		; MEANINGLESS INPUT FLUSHED
	TTCALL	3,IMPRSP	; TYPE IMPROPER RESPONSE
	JRST REENPT		; TRY FOR SOMETHING SENSIBLE
RETN:	POP	16,CHAR
	POP	16,TEMP
	MOVEI	CHAR,0
	JRST	0(RETURN)
RET.:	TTCALL	11,0		; FLUSH ANYTHING ELSE TYPED
	TTCALL	3,RECIPR	; RECOVERY IN PROGRESS
	POPJ	16,		; GO BACK TO I/O
RETX.:	TTCALL	11,0		; FLUSH ANYTHING ELSE
	MOVEI	CHAR,0		; GIVE  BACK NULL
	SOS	6(TEMP)		; SET STATUS TO PEOF
	JRST	RETN		; WHICH SHOULD STOP EVERYTHING



	; MTF. AND MTF2. ARE CALLED WHEN MRG OR LST TAPES
	; RESPECTIVELY ARE FILLED.  MORE TAPE IS REQUESTED.


MTF.:	RELEAS	MRGCHAN,	; RELEASE ASSOCIATED CHANNEL
	PUSHJ	16,FTAPE.	; INFORM USER WHAT'S WHAT
	XWD	0,MRGDDB	; AND WHERE IT'S AT
	SETZM	MRGDDB+6	; RENEW VIRGIN STATUS
	PUSH	16,TEMP+1
	MOVEI	TEMP+1,MRGDDB+3	; WHERE???
	PUSHJ	16,INCEXT	; INCREMENT EXT. IF NUMERIC
	POP	16,TEMP+1	; RESTORE THE REG
	PUSHJ	16,OPNMRG	; OPEN NEW TAPE UP
	POPJ	16,		; PUT THINGS IN THE NEW FILE
	IFNDEF	BIGSW,<
MTF2.:	RELEAS	LSTCHAN,	; DITTO FOR LST DEVICE
	PUSHJ	16,FTAPE.
	XWD	0,LSTDDB
	SETZM	LSTDDB+6
	PUSH	16,TEMP+1
	MOVEI	TEMP+1,LSTDDB+3
	PUSHJ	16,INCEXT
	POP	16,TEMP+1
	PUSHJ	16,OPNLST
	POPJ	16,
		>


	; INCEXT INCREMENTS THE RIGHTMOST TERMINATING NUMERIC
	; IF FOUND IN THE EXTENSION IN THE DDB.  IT WILL 
	; NOT INCREMENT SIXBIT/9/


INCEXT:	SKIPE	INCOPT		; SHOULD WE INCREMENT?
	POPJ	16,		; NO
	HLLZ	CHAR,0(TEMP+1)	; TEMP+1 POINTS TO EXT IN DDB
	TLNE	CHAR,77		; LAST CHAR NULL?
	JRST	GETL.		; NO, SEE IF NUMERIC
	AOJ	CHAR,		; INCR. SCANNER COUNT
	TLNE	CHAR,7700	; SECOND LAST NULL?
	JRST	GETL.		; NO, EXAMINE FURTHER
	AOJ	CHAR,		; INCR. SCANNER COUNT
	TLNE	CHAR,770000	; THIRD (LEFTMOST) NULL?
	JRST	GETL.		; NO
	AOJ	CHAR,		; YES
	POPJ	16,		; SO NO POINT IN INCR NULL EXT
GETL.:	LDB	TEMP.,BTAB(CHAR); GET THE CHAR
	CAIG	TEMP.,17	; IS IT GTR SIXBIT/0/-1?
	POPJ	16,		; NOT NUMERIC
	CAIL	TEMP.,31	; HOW ABOUT LESS SIXBIT/9/?
	POPJ	16,		; NO
	AOJ	TEMP.,		; INCREMENT THE NUMERIC CHAR
	DPB	TEMP.,BTAB(CHAR); PUT IT BACK
	POPJ	16,		; AND RETURN
BTAB:	POINT	6,0(TEMP+1),17	; POINTS TO RIGHTMOST CHAR
	POINT	6,0(TEMP+1),11	; POINTS TO SECOND CHAR
	POINT	6,0(TEMP+1),5	; POINTS TO LEFT MOST



	; FTAPE. ASKS FOR MORE TAPE IN ENGLISH

FTAPE.:	HRRZ	CHAR,@0(16)	; LOAD DDB ADDR
	TLO	CHAR,1		; TERMINATE STRING WITH CR-LF
	MOVEM	CHAR,P6WORD	; MAKE DEV NAME ASCII
	PUSHJ	16,SIXTO7
	TTCALL	3,[ASCIZ/*** PUT FRESH TAPE ON /]	; ENGLISH
	TTCALL	3,SIXBUF	; DEV NAME TYPED OUT
	IFDEF	REENT,<	;****** ONLY IF DESIRED!!
	MOVEI	CHAR,RENPT1	; SETUP FOR REEN
	MOVEM	CHAR,.JBREN
		>		; OPTIONAL CODE
	CALL	1,[SIXBIT/EXIT/]; SPECIAL EXIT
RENPT1:	TTCALL	3,[ASCIZ/*/]	; MY WISH
	TTCALL	4,CHAR		; IS YOUR COMMAND
	CAIN	CHAR,"D"
	JRST	DONE.		; GET THE NEXT TAPE READY
	CAIN	CHAR,15
	JRST	ALLOV.		; ABORT JOB
	TTCALL	11,0		; EH?
	TTCALL	3,IMPRSP
	JRST	RENPT1		; TRY AGN
DONE.:	TTCALL	11,0		; FLUSH COMMENT
	JRST	POP.		; RETURN TO PC+1
ALLOV.:	CALL	[SIXBIT/EXIT/]	; BYE BYE, SEE YOU SOON



	; GENERAL EOF DIALOGUE, CALLED WHENEVER ANY INPUT
	; ROUTINE SEES EOF ON A DIRECTORY DEVICE, AND IT
	; IS PROBABLE THAT USER WANTS TO CONCATENATE FILES


EOFDIA:	MOVE	CHAR,@0(16)
	MOVE	CHAR,6(CHAR)
	AOJL	CHAR,RETS
	TTCALL	3,[ASCIZ/*** END OF CORRECTION FILE /]	
	HRRZ	CHAR,@0(16)	; GET ADDR OF DDB
	ADDI	CHAR,2		; FIND FILENAME
	HRRZM	CHAR,P6WORD
	PUSHJ	16,SIXTO7
	TTCALL	3,SIXBUF	; TELL TTY
	MOVE	CHAR,P6WORD
	AOJ	CHAR,
	HRROM	CHAR,P6WORD
	PUSHJ	16,SIXTO7
	TTCALL	3,SIXBUF	
	TTCALL	3,[ASCIZ/ ON /]
	HRRZ	CHAR,P6WORD
	SUBI	CHAR,3
	TLO	CHAR,1
	MOVEM	CHAR,P6WORD
	PUSHJ	16,SIXTO7
	TTCALL	3,SIXBUF	; SAY WHERE
	IFDEF	REENT,<	;****** CONDITIONAL
	MOVEI	CHAR,RENPT3	; SET UP FOR REENTER
	MOVEM	CHAR,.JBREN
		>		; OPTIONAL
	CALLI	1,12		; EXIT FOR A WHILE
RENPT3:	TTCALL	3,[ASCIZ/*/]	; YES MASTER?
	TTCALL 	4,CHAR		; VERY GOOD, SIR
	CAIN	CHAR,"D"	; D FOR CONCATENATE
	JRST	RET1
	CAIN	CHAR,15		; CR FOR NO MORE
	JRST	RET2
	TTCALL	11,0		; EH?
	TTCALL	3,IMPRSP
	JRST	RENPT3
RETS:	POP	16,CHAR
	MOVEI	CHAR,0
	JRST	0(14)
RET1:	TTCALL	11,0
	TTCALL	3,RECIPR	; LET USER KNOW SOMETHING'S DOING
	JRST	POP.		; RETURN PAST PARAMETER WORD
RET2:	HRRZ	CHAR,@0(16)	; GET DDB ADDR
	TTCALL	11,0
	SOS	6(CHAR)		; MAKE STATUS -2 FOR PEOF
	POP	16,CHAR
	MOVEI	CHAR,0		; AND GIVE EOF NULL
	JRST	0(RETURN)



	; GENERAL PURPOSE DIALOGUE. RETURNS IF D IS TYPED,
	; OTHERWISE IT SEREPTITIOUSLY RESTARTS PROGRAM.


GPDIA:	SKIPE	DIASW		; DIASW SET SOMETIMES TO PREVENT 
	POPJ	16,		; DIALOGUE
	IFDEF	REENT,<		;****** OPTIONAL
	MOVEI	TEMP,REP3	; SETUP FOR REEN
	MOVEM	TEMP,.JBREN	; THUS
		>
	CALLI	1,12		; SPECIAL EXIT
REP3:	TTCALL	3,[ASCIZ/*/]	; WHAT?
	TTCALL	4,CHAR		; I HEAR YOU NOW
	TTCALL	11,0		; FLUSH
	CAIN	CHAR,15
	JRST	GETCMD		; CR - RESTART
	CAIN	CHAR,"D"
	POPJ	16,		; RETURN IF DESIRED
	TTCALL	3,IMPRSP
	JRST	REP3
GETCMD:	EXTERN	.JBSA
	HRRZ	CHAR,.JBSA
	JRST	0(CHAR)		; NO MATTER WHAT, THIS WILL RESTART PRGM
	ENTRY	ACTAB
	IFNDEF	BIGSW,<ENTRY	MCIN,UCIN>
	EXTERN	MCSPEC,UCSPEC
	EXTERN	UCIPT
	EXTERN	USEDDB
	EXTERN	BASDDB
	EXTERN	CRPERR
	EXTERN	UCIPTF
	EXTERN	ATFLAG
	EXTERN	BADDB
	EXTERN	BASIPT
	EXTERN	CAMOPT
	EXTERN	CMDDDB
	EXTERN	CMDIPT
	EXTERN	COMBUF
	EXTERN	COMCNT
	EXTERN	CONFLA
	EXTERN	CRLF
	EXTERN	FED
	EXTERN	FIRST.
	EXTERN	ID.
	EXTERN	ID.CNT
	EXTERN	INCOPT
	EXTERN	LAST.
	EXTERN	LISTB
	EXTERN	LOGDDB
	EXTERN	LOGOPT
	EXTERN	LSTDDB
	EXTERN	LSTIPT
	EXTERN	LSTOP
	EXTERN	LSTOPT
	EXTERN	MATQUO
	EXTERN	MCDDB
	EXTERN	MCIPT
	EXTERN	MRGDDB
	EXTERN	MRGIPT
	EXTERN	MRGOPT
	EXTERN	NUMLIN
	EXTERN	OLDCNT
	EXTERN	OPTION
	EXTERN	PDL
	EXTERN	PPROGW
	EXTERN	SAVACS
	EXTERN	SAVEXX
	EXTERN	SFMODE
	EXTERN	UCDDB
	EXTERN	UCIPTF
	EXTERN	USDDB
	EXTERN	USEIPT
	IFNDEF	BIGSW,	<		;**************************




	; MCIN AND UCIN ARE QUITE THE SAME.  THEY ARE CALLED BY
	; A JSP	RETURN,**IN.  A NULL IS RETURNED AT PHYSICAL EOF 
	; ONLY, ALL OTHERS ARE FLUSHED.  THE CHARACTER THEY EVENTUALLY
	; FIND WILL BE IN REGISTER CHAR


MCIN:	SKIPL	MCDDB+6		; CHANNEL OPEN?
	JRST	OPENMC		; NO, OPEN IT
MCX:	SOSG	MCIPT+2		; YES, IS BUFFER EMPTY?
	JRST	FILLMC		; THEN GO FILL IT
MCXX:	ILDB	CHAR,MCIPT+1	; PICK UP THE CHARACTER
	CHKLN	(MCIN,MCIPT,0) ;DELETE "EDIT10" SEQUENCE NUMBERS
	JUMPE	CHAR,MCX	; DUMP THE NULLS
	CAIN	CHAR,32		; ^Z??
	JRST	CTRLZ		; GO HANDLE IT
	JRST	0(RETURN)	; GO BACK TO CALLER
CTRLZ:	SKIPN	ZOP		; Z OPTION?
	JRST	0(RETURN)	; NOPE
	IN	MCCHAN,
	JRST	.-1
	JRST	FILLMC+2
FILLMC:	IN	MCCHAN,		; TRY TO FILL BUFFER	
	JRST	MCXX		; GOT DATA, SO FIRE AWAY
	GETSTS	MCCHAN,CHAR	; SOMETHING FISHY
	TRNE	CHAR,20000	; AN ERROR?
	JRST	NULLMC		; PHEW! ONLY EOF
	PUSHJ	16,IOERR	; I AM SICK
	XWD	[ASCIZ/?M.C. READ/],MCDDB
	JRST	FILLMC		; I AM WELL AGAIN
NULLMC:	MOVEI	CHAR,0		; GET A NULL
	SKIPE	FED		; IF THIS IS FED, QUIT
	JRST	0(RETURN)
	MOVE	CHAR,MCDDB	; WHAT DEVICE?
	CALLI	CHAR,4		; WHAT IS IT?
	TLNE	CHAR,200
	JRST	PTAPE1		; PAPER TAPE READER
	PUSHJ	16,EOFDIA	; TELL OPR TANK IS EMPTY
	XWD	0,MCDDB
	RELEAS	MCCHAN,		; RELEAS THE CHAN
	SETZM	MCDDB+6		; ZERO STATUS
	JRST	MCIN		; MORE TO BUSY OURSELVES WITH
PTAPE1:	PUSH	16,TEMP
	MOVEI	TEMP,MCDDB
	PUSHJ	16,PTEOF	; TELL OPR
	POP	16,TEMP		; RESTORE TEMP
	RELEAS	MCCHAN,		; RELEAS IT
	SETZM	MCDDB+6
	JRST	MCIN		; MORE TAPES READIED


	; TINY SBRT TO INITIALIZE INPUT CHANNEL


OPENMC:	MOVE CHAR,MCDDB		; GET DEV NAME
INITMC:	MOVEM	CHAR,MCSPEC+1	; PUT IN PLAIN VIEW OF MONITOR
	OPEN	MCCHAN,MCSPEC	; OPEN IF POSSIBLE
	JRST	MCERR1
NEWMC:	HRRZI	CHAR,SAVACS	; SWAP REGS 0-3
	BLT	CHAR,SAVACS+3
	HRLZI	CHAR,MCDDB+2	; WITH RETRIEVAL INFORMATION
	BLT	CHAR,3
	LOOKUP 	MCCHAN,0	; LOOKUP WITH STUFF IN REGS
	JRST	MCERR2		; IT AIN'T OUT THERE
	HRLZI	CHAR,SAVACS
	BLT	CHAR,3		; RESTORE REGS
	SETOM	MCDDB+6		; SET STATUS TO FULL THROTTLE
	INPUT	MCCHAN,		; GET FIRST BUFFER
	JRST	MCXX		; GO CRAWL OVER DATA
MCERR1:	PUSHJ	16,NOTAV.	; TELL SOMEONE DEVICE NOT AV.
	XWD	[ASCIZ/?M.C./],MCDDB
	JRST	INITMC-1	; AND TRY AGAIN
MCERR2:	PUSHJ	16,NOTFND	; NO SUCH FILE
	XWD	[ASCIZ/?CANNOT FIND M.C. FILE /],MCDDB
	JRST	NEWMC		; MAYBE THERE IS NOW



	; UCIN WORKS SAME AS MCIN, BUT INPUT FROM DIFF FILE


UCIN:	SKIPL	UCDDB+6	
	JRST	OPENUC
UCX:	SOSG	UCIPTF+2
	JRST	FILLUC
UCXX:	ILDB	CHAR,UCIPTF+1
	CHKLN	(UCIN,UCIPTF,1) ;DELETE "EDIT10" SEQUENCE NUMBERS
	JUMPE	CHAR,UCX
	CAIN	CHAR,32
	JRST	CTRLZ1
	CAIN	CHAR,14		;FORM FEED?
	AOS	BPAGNO		; YES, COUNT PAGES
	JRST	0(RETURN)
CTRLZ1:	SKIPN	ZOP

	JRST	0(RETURN)
	IN	UCCHAN,
	JRST	.-1
	JRST	FILLUC+2
FILLUC:	IN	UCCHAN,
	JRST	UCXX
	GETSTS	UCCHAN,CHAR
	TRNE	CHAR,20000
	JRST	NULLUC
	PUSHJ	16,IOERR
	XWD	[ASCIZ/?U.C. READ/],UCDDB
	JRST	FILLUC
NULLUC:	MOVEI	CHAR,0
	SKIPE	FED
	JRST	0(RETURN)
	MOVE	CHAR,UCDDB
	CALLI	CHAR,4
	TLNE	CHAR,200
	JRST	PTAPE2
	PUSHJ	16,EOFDIA	
	XWD	0,UCDDB
	RELEAS	UCCHAN,
	SETZM	UCDDB+6
	JRST	UCIN
PTAPE2:	PUSH	16,TEMP
	MOVEI	TEMP,UCDDB
	PUSHJ	16,PTEOF
	POP	16,TEMP		; RESTOR TEMP
	SETZM	UCDDB+6
	RELEAS	UCCHAN,
	JRST	UCIN
OPENUC:	SKIPE	UCDDB+6
	JRST 	NEWUC
	MOVE CHAR,UCDDB
INITUC:	MOVEM	CHAR,UCSPEC+1
	OPEN	UCCHAN,UCSPEC
	JRST	UCERR1
	SKIPE	FED
	INBUF	UCCHAN,5		; MORE ROOM FOR FED
NEWUC:	HRRZI	CHAR,SAVACS
	BLT	CHAR,SAVACS+3
	HRLZI	CHAR,UCDDB+2
	BLT	CHAR,3
	LOOKUP 	UCCHAN,0
	JRST	UCERR2
	HRLZI	CHAR,SAVACS
	BLT	CHAR,3
	SETOM	UCDDB+6
	INPUT	UCCHAN,
	JRST	UCXX
UCERR1:	PUSHJ	16,NOTAV.
	XWD	[ASCIZ/?U.C./],UCDDB
	JRST	INITUC-1
UCERR2:	PUSHJ	16,NOTFND
	XWD	[ASCIZ/?CANNOT FIND U.C. INPUT FILE /],UCDDB
	JRST	NEWUC
	>
PERIOD="."
COLON=":"



	; FCBUF PLACES ONE COMMAND STRING IN COMBUF IN ASCIZ
	; FORM, ALWAYS WITH A CR AT THE END OF THE STRING
	; THE COMMAND STRING IS C(COMCNT) CHARACTERS LONG.
	; FCBUF ALSO DOES SOME PREPROCESSING, LIKE FINDING
	; @'S AND ;'S AND MAPPING TABS TO SPACES.


BUFUL:	TTCALL	3,[ASCIZ/?GAG? TTY BUFFER FULL/]
	TTCALL	3,CRLF
	JRST	CMDPUR
FCBUF:	MOVEM	XX,SAVEXX			; SAVE REG XX
	MOVE	XX+1,[POINT 7,COMBUF-1,35]	; POINTER TO COMBUF
	MOVE	XX,[XWD COMBUF,COMBUF+1]	; TO ZERO COMBUF
	SETZM	COMBUF		; FIRST ZERO
	BLT	XX,COMBUF+30	; NOW ALL ARE ZEROES
	SETZM	COMCNT		; AND SO IS COMCNT
	AOS	COMCNT		; THERE WILL BE AT LEAST 1
	SKIPE	ATFLAG		; READING FROM DSK OR DTA?
	JRST	OTHDEV		; YES
	TTCALL 3,[ASCIZ/*/]	; NO, TYPE * AND WAIT FOR INPUT
NXCHAR:	TTCALL	4,XX		; GET A CHAR
	CAIN	XX,";"		; START OF COMMENT?
	JRST	FLUSH1		; FLUSH INPUT LINE
	AOS	COMCNT		; BOOKKEEP CHAR COUNT
	CAIN	XX,11		; TABS
	MOVEI	XX,40		; ARE CONVERTED TO SPACES
	IDPB	XX,XX+1		; PUT CHAR IN BUFFER
	SKIPE	COMBUF+30	; OVERFLOW YET?
	JRST	BUFUL		; YEP!!
	CAIN	XX,ATSGN	; WAS THAT AN @?
	JRST	ATPROC		; PROCEED TO GET COMMAND FILE
	HLRZ	XX,ACTAB(XX)	; WAS IT A BREAK CHAR? 
	JUMPE	XX,NXCHAR	; LOOP IF NOT
	MOVEI	XX,15		; IT WAS, SO PLACE CR TO STOP SCAN
	DPB	XX,XX+1
	MOVE	XX+1,[POINT 7,COMBUF-1,35]	; RESET POINTER
	TTCALL	11,0	; 
	MOVE	XX,COMCNT	; GET NUMBERS
	MOVEM	XX,OLDCNT	; FOR FLOATING ^ ROUTINE
	MOVE	XX,SAVEXX	; RESTORE XX
	POPJ	PDP,		; RETURN
FLUSH1:	TTCALL	11,0		; GET RID OF TYPED LINE
	JRST	NXCHAR-1	; AND ASK FOR MORE
ATPROC:	MOVEI	15		; REPLACE @ WITH CR
	DPB	XX+1
	MOVE	XX+1,[POINT 7,COMBUF-1,35]	; RESET POINTER
	PUSHJ	PDP,ELT		; SCAN OFF FIRST ELT
	CAIE	STOP,15		; ENDED WITH A CR?
	JRST	CMDERR		; NO, NOT LEGAL
	MOVEI	TEMP,CMDDDB	; LEGAL COMMAND RECEIVED
	PUSHJ	PDP,XFER	; TRANSFER INFO INTO DDB
	SETOM	MRGDDB		;  FUDGE SO NO ERROR REPORTED
	PUSHJ	PDP,OPSCAN	; SCAN OPTIONS
	SETZM	MRGDDB		; MAKE THE FUDGE GO AWAY
	SETOM	ATFLAG		; SET THIS SWITCH FOREVER
	MOVE	XX+1,[POINT 7,COMBUF-1,35]	; POINT TO BEGINNNING
	SETZM	COMCNT		; SET COUNT TO 0
	TTCALL	11,0		; FLUSH TTY INPUT BUFFER
OTHDEV:	JSP	RETURN,CMDIN	; GET A CHARACTER FROM CMD FILE
FLSH:	CAIN	CHAR,";"	; FLUSH COMMENTS
	JRST	FLUSH2
	CAIN	CHAR,11
	MOVEI	CHAR,40		; CONVERT TABS TO SPACES
	IDPB	CHAR,XX+1	; PACK CHARS AWAY
	AOS	COMCNT		; BOOKKEEP PROPERLY
	SKIPE	COMBUF+30
	JRST	BUFUL		; BUFFER OVERFLOW
	CAIN	CHAR,ATSGN	; DO NOT ALLOW NESTED FILES
	JRST	CMDERR
	HLRZ	CHAR,ACTAB(CHAR); FEED?
	JUMPE	CHAR,OTHDEV
	MOVEI	CHAR,15		; REPLACE WITH CR
	DPB	CHAR,XX+1
	TTCALL	11,0		; FLUSH AGAIN
	MOVE	XX,COMCNT
	MOVEM	XX,OLDCNT	; SAVE ORIGINAL CHAR COUNT FOR ^
	MOVE	XX+1,[POINT 7,COMBUF-1,35]	; RESET POINTER
	MOVE	XX,PRTOPT	; SHOULD WE PRINT NEW COMMAND?
	JUMPE	XX,.+3
	TTCALL	3,COMBUF	; PRINT IT
	TTCALL	3,CRLF		; FOLLOWED BY CRLF TO BE NEAT
	POPJ	PDP,		; RETURN TO SCANNER WITH COMMAND
FLUSH2:	JSP	RETURN,CMDIN	; FLUSH CHARACTERS
	HLRZ	CHAR,ACTAB(CHAR)
	JUMPE	CHAR,FLUSH2
	JRST	OTHDEV		; UNTIL A FEED SHOWS UP



	; STUFF IS THE HEART OF THE SCANNER. IT LOOKS AT
	; THE CHARACTERS IN COMBUF AND WHEN IT HEARS A
	; STOPPING CHARACTER LIKE :,.[] OR CR, IT STOPS
	; LEAVING A CONCATENATED IDENTIFIER IN SIXBIT FORM
	; IN REGISTER SIXBYT, AND THE STOPPING CHARACTER IN
	; REGISTER STOP.  IF A PROJ, PROG IS FOUND, IT IS 
	; STORED IN OCTAL FORM IN PPWORD. IF OPTION LETTERS 
	; ARE FOUND, THEY ARE BUFFERED UP IN OPTION AND
	; SCANNED LATER BY OPSCAN.


STUFF:		
	MOVE	REG6,[POINT 6,SIXBYT-1,35]	; SET POINTER
	MOVEI	SIXCT,6		; ONLY SIX CHARS CAN FIT 
	MOVEI	SIXBYT,0	; BLANK OUT ID HOLDER
NX1:	SOSG	COMCNT		; BUFFER EMPTY
	PUSHJ	PDP,FCBUF	; THEN FILL IT (SHOULD NEVER HAPPEN)
	ILDB	STOP,XX+1	; LOAD THE CHAR
	JRST	@ACTAB(STOP)	; DISPATCH TO PROPER ROUTINE
LETTR:	SOJL	SIXCT,NX1	; CHAR A LETTER OR DIGIT, CONCATENATE
	SUBI	STOP,40		; MAKE ASCII SIXBIT
	CAIL	STOP,100	; WORRY ABOUT LOWER CASE, TOO
	SUBI	STOP,40
	IDPB	STOP,REG6	; STUFF BYTE INTO IDENTIFIER
	JRST	NX1		; GET THE NEXT ONE
SLASH:	SOSG	COMCNT		; GET ONE OPTION CHARACTER
	PUSHJ	PDP,FCBUF
	ILDB	STOP,XX+1
	CAIGE	STOP,"0"	; IF NUMERIC,
	JRST	CMDERR
	CAILE	STOP,"9"
	JRST	STORIT		; IT SHOULD BE CONVERTED
	SUBI	STOP,60
	SOJ	STOP,
	MOVEM	STOP,NUMLIN	; AND STORED AS NUMBER OF LINES FOR MATCH
	JRST	NX1
STORIT:	CAILE	STOP,140	; OTHERWISE, IF ALPHABETIC
	SUBI	STOP,40
	IDPB	STOP,OPT	; PUT IT IN OPTION BUFFER
	JRST	NX1		; AND GET OTHER DATA
LPAR:	SOSG	COMCNT		; ( MEANS GET MANY OPTIONS
	PUSHJ	PDP,FCBUF
	ILDB	STOP,XX+1
	CAIN	STOP,")"	; AND KEEP STORING THEM UNTIL ) APPEARS
	JRST	NX1
	IDPB	STOP,OPT
	JRST	LPAR
LBRACK:	MOVEI	XX,","		; TELL OCTAL ROUTINE WHAT TO LOOK FOR
	PUSHJ	PDP,OCTAL	; SCAN AND CONVERT PROJ NO.
	HRLZM	TEMP+1,PPROGW	; PUT IN RIGHT PLACE
	MOVEI	XX,"]"		; TELL OCTAL WHAT TO EXPECT
	PUSHJ	PDP,OCTAL	; SCAN AND CONVERT PROG NO.
		HRRM	TEMP+1,PPROGW	; AND PUT IT AWAY
	JRST	STOPP		; ] ENDS ELEMENT, SO STOP SCAN
STOPP:	POPJ	PDP,		; RETURN ON RECEIPT OF STOP CHAR



	; ASCII TO OCTAL INTEGER ROUTINE.  OCTAL SCANS
	; UNTIL IT FINDS THE CHARACTER SPECIFIED IN REGISTER
	; TEMP.  THE NUMBER IT FINDS IS LEFT IN TEMP+1
	; IT WILL NOT ACCEPT ANYTHING BUT 0-7.


OCTAL:	MOVEI	TEMP+1,0	; ZERO INTEGER HOLDER
	SOSG	COMCNT
	PUSHJ	PDP,FCBUF
	ILDB	STOP,XX+1	; LOAD THE NEXT 
	CAIN	STOP,0(XX)	; IS IT THE STOPPING CHAR?
	POPJ	PDP,		; THEN RETURN
	SUBI	STOP,60		; CONVERT TO INTEGER
	JUMPL	STOP,CMDERR	; ANNOYED WITH NON-NUMERICS
	CAIL	STOP,10
	JRST	CMDERR		; OR 7,8, OR 9
	LSH	TEMP+1,3	; MULTIPLY OLD INTEGER BY 8
	ADD	TEMP+1,STOP	; ADD NEW INTEGER
	JRST	OCTAL+1		; LOOK FOR MORE



	; FLOATING ^ ROUTINE. THE ^ WILL POINT TO THE ILLEGAL
	; CHARACTER OR TO THE INCORRECT STOPPING CHARACTER FOUND
	; LATER ON.


CMDERR:	TTCALL	3,[ASCIZ/? COMMAND STRING ERROR/]	
	MOVE	TEMP,OLDCNT
	SUB	TEMP,COMCNT
	SUBI	TEMP,2		; FIND OUT HOW MANY SPACES NEEDED 
	TTCALL	3,CRLF		; SEND OUT CR-LF
	TTCALL	3,COMBUF	; THEN COMMAND
	TTCALL	3,CRLF		; THEN MORE CR-LF
	JUMPL	TEMP,.+3	; NO SPACES?
	TTCALL 1,[" "]		; SEND SPACES ONE AT A TIME
	SOJGE	TEMP,.-1	; TO BE IRRITABLE
	TTCALL 1,["^"]		; NOW THE ^
	TTCALL	3,CRLF		; AND A CR-LF
	TTCALL	11,0		; FLUSH INPUT BUFFER
	SETZM	COMCNT		; ZERO  COUNT
	SETZM	OLDCNT
	JRST	CMDPUR	; TRY FOR A GOOD COMMAND



	; ACTAB IS A DISPATCH TABLE INDEXED BY ASCII
	; VALUE OF CHARACTER.  THE RH OF EACH WORD
	; IS AN ADDRESS TO GO TO, AND THE LH IS
	; NON-ZERO IF THE CHARACTER IS ALSO A 
	; BREAK CHARACTER.  THIS TABLE IS USED BY FED
	; AND IN MANY OTHER PLACES TO FIND BREAK CHARS


ACTAB:	REPEAT	12,<NX1>	
	REPEAT	3,<XWD 100000,NX1>
	STOPP
	REPEAT	16,<NX1>
	REPEAT	4,<XWD 0,NX1>
	XWD	0,NX1
	REPEAT	7,<XWD 0,CMDERR>
	XWD	0,LPAR
	CMDERR
	LETTR
	CMDERR
	STOPP
	CMDERR
	STOPP
	SLASH
	REPEAT 12,<LETTR>
	STOPP
	CMDERR
	CMDERR
	REPEAT	3,<CMDERR>
	STOPP
	REPEAT	^D26,<LETTR>
	LBRACK
	REPEAT	3,<CMDERR>
	STOPP
	NX1
	REPEAT	^D26,<LETTR>
	REPEAT	10,<CMDERR>



	; ELT IS A HIGH LEVEL SCANNER THAT FINDS AND
	; PROCESSES ONE ELEMENT OF THE FORM
	; UNIT:FILENAME.EXT[PROJ,PROG]
	; PLACING ALL SUCH DATA IN THE PROPER FORM
	; IN LISTB, AND DOING ALL SYNTAX CHECKS AS WELL


ELT:	MOVE	LIST,[IOWD	5,LISTB]	
	SETZM	LISTB		; ZERO LISTB AND LOCAL STORAGE
	MOVE	TEMP,[XWD LISTB,LISTB+1]
	BLT	TEMP,LISTB+3
	SETZM	PPROGW
	PUSHJ	PDP,STUFF	; GET FIRST IDENTIFIER
	SKIPE	PPROGW
	JRST	ELT1
	JUMPN	SIXBYT,ELT1	; IF THERE IS ONE, IT MUST END WITH :
	CAIN	STOP,","	; IF NULL, 
	JRST	POP4		; A COMMA MEANS ELEMENT IS NULL
	CAIN	STOP,"_"
	JRST	POP4		; SAME FOR _
	CAIN	STOP,15
	JRST	POP4		; AND ALSO A CR
ELT1:
	CAIE	STOP,":"
	JRST	DEFDEV		;USE DSK AS DEFAULT
	JUMPE	SIXBYT,CMDERR	; IF ENDED BY A : BUT ID NULL, COMPLAIN
	PUSH	LIST,SIXBYT	; EVIDENTLY A DEV NAME HAS BEEN FOUND
	CALLI	SIXBYT,4	; FIND OUT IF DEV HAS DIR
	TLNN	SIXBYT,4
	JRST	NODIR		; NO DIR IMPLIES NO FILE NAME OR EXT
	PUSHJ	PDP,STUFF	; LOOK FOR FILENAME
ELT2:	CAIN	STOP,","
	JRST	POP3		; A , MEANS THAT EXT AND PROJ,PROG MISSING
	CAIN	STOP,15		; SO DOES A CR
	JRST	POP3
	CAIN	STOP,"_"	; EVEN MORESO FOR A _
	JRST	POP3
	CAIN	STOP,"]"	; THIS MEANS NO NAME.EXT, BUT P.PROG
	JRST	POP2
	CAIE	STOP,"."	; THIS INDICATES EXT FOLLOWS
	JRST	CMDERR		; ANYTHING ELSE REEKS
	JUMPE	SIXBYT,CMDERR	; A NULL FILENAME IS NO GOOD
	PUSH	LIST,SIXBYT	; BUT ANYTHING ELSE WILL DO
	PUSHJ	PDP,STUFF	; TRY FOR EXT
	CAIN	STOP,15
	JRST	POP1		; CR MEANS NO EXT OR P,PROG
	CAIN	STOP,","	; COMMA IS END OF ELT TOO
	JRST	POP1
	CAIN	STOP,"_"	 ; SO IS _
	JRST	POP1
	CAIE	STOP,"]"	; P.PROG IS ONLY THING LEFT
	JRST	CMDERR
	JUMPE	SIXBYT,CMDERR	; IF INFO IS NULL, IT HURTS
	PUSH	LIST,SIXBYT	; OTHERWISE LET IT PASS
	PUSH	LIST,PPROGW	; AND PUSH THIS ON FOR GOOD MEASURE
	PUSHJ	PDP,STUFF	; WE FOUND EVERYTHING XCPT TERMINATOR
	CAIN	STOP,"_"	; _ WILL DO
	POPJ	PDP,
	CAIN	STOP,54		; SO WILL ,
	POPJ	PDP,
	CAIE	STOP,15		; AND EVEN CR
	JRST	CMDERR		; BUT NOTHING ELSE
	POPJ	PDP,
POP1:
POP4:
POP3:	PUSH	LIST,SIXBYT	; PUT ID INTO BUFFER
	POPJ	PDP,
POP2:	PUSH	LIST,SIXBYT	; STORE ID
	AOBJN	LIST,.+1	; POINT IT PAST MISSING EXT
	PUSH	LIST,PPROGW	; PUT IN P,PROG
	PUSHJ	PDP,STUFF	; LOOK FOR ELEMENT TERMINATOR
	CAIN	STOP,"_"
	POPJ	PDP,
	CAIN	STOP,","
	POPJ	PDP,
	CAIE	STOP,15		; AS ABOVE
	JRST	CMDERR
	POPJ	PDP,
NODIR:	PUSHJ	PDP,STUFF	; IF NO DIRECTORY,
	CAIN	STOP,15
	POPJ	PDP,
	CAIN	STOP,"_"
	POPJ	PDP,
	CAIE	STOP,","	; LOOK FOR TERMINATOR
	JRST	CMDERR
	POPJ	PDP,

DEFDEV:	PUSH	LIST,[SIXBIT /DSK/]
	JRST	ELT2		;ALWAYS DSK DEFAULT AT STANFORD


	; CMDIN READS CHARACTERS FROM THE DEVICE SPECIFIED BY 
	; THE @ CONSTRUCTION. IT WORKS EXACTLY LIKE MCIN AND UCIN,
	; BUT TAKES SPECIAL ACTION ON EOF


CMDIN:	SKIPL	CMDDDB+6	
	JRST	OPENCMD
CMDX:	SOSG	CMDIPTF+2
	JRST	FILLCMD
CMDXX:	ILDB	CHAR,CMDIPTF+1
	CHKLN	(CMDIN,CMDIPTF,0);DELETE "EDIT10" SEQUENCE NUMBERS
	JUMPE	CHAR,CMDX
	JRST	0(RETURN)
FILLCMD:	IN	CMDCHAN,
	JRST	CMDXX
	GETSTS	CMDCHAN,CHAR
	TRNE	CHAR,20000
	JRST	NULLCMD
	PUSHJ	16,IOERR
	XWD	[ASCIZ/?CMD READ/],CMDDDB
	JRST	FILLCMD
NULLCMD:	MOVEI	CHAR,0
	TTCALL	3,[ASCIZ/COMMAND FILE EXHAUSTED
/]				; TELL USER EVERYTHING DONE
	SETZM	PRTOPT
	SETZM	ATFLAG
	MOVE	[XWD	CMDDDB,CMDDDB+1]
	SETZM	CMDDDB		; ZERO LOCAL OPTIONS
	BLT	CMDDDB+6	; AND PREPARE
	CALLI			; FOR TTY INPUT
	JRST	CMDPUR	; GO READ NEXT COMMAND
OPENCMD:	SKIPE	CMDDDB+6
	JRST 	NEWCMD
	MOVE CHAR,CMDDDB
INITCMD:	MOVEM	CHAR,CMDSPC+1
	OPEN	CMDCHAN,CMDSPC
	JRST 	CMDER1
	AOS CMDDDB+6
NEWCMD:	HRRZI	CHAR,SAVACS
	BLT	CHAR,SAVACS+3
	HRLZI	CHAR,CMDDDB+2
	BLT	CHAR,3
	LOOKUP 	CMDCHAN,0
	JRST	CMDER2
	HRLZI	CHAR,SAVACS
	BLT	CHAR,3
	SETOM	CMDDDB+6
	INBUF	CMDCHAN,2
	INPUT	CMDCHAN,
	MOVE	.JBFF		
	EXTERN	SAVFF
	MOVEM	SAVFF		; SAVE AND RESTORE .JBFF
	EXTERNAL .JBFF,.JBREL
	JRST	CMDXX
CMDER1:	SETOM	DIASW
	EXTERN	DIASW
	PUSHJ	16,NOTAV.
	XWD	[ASCIZ/?CMD/],CMDDDB
	SETZM	DIASW
	SETZM	ATFLAG
	SETZM	CMDDDB+6
	JRST	CMDPUR
CMDER2:	SETOM	DIASW
	PUSHJ	16,NOTFND
	XWD	[ASCIZ/?CANNOT FIND CMD FILE /],CMDDDB
	SETZM	DIASW
	SETZM	ATFLAG
	SETZM	CMDDDB+6
	JRST	CMDPUR



	; XFER TRANSFERS INFORMATION IN LISTB INTO 
	; DDB WHOSE ADDRESS IS IN REF TEMP


XFER:	MOVE	TEMP+1,LISTB		; PICK UP DEV NAME
	MOVEM	TEMP+1,0(TEMP)	; PUT IN FIRST WORD OF DDB
	HRLZI	TEMP+1,LISTB+1
	HRRI	TEMP+1,2(TEMP)
	BLT	TEMP+1,3(TEMP)	; PUT FILENAME AND EXT IN WRDS 3&4
	MOVE	TEMP+1,LISTB+3	; PUT PROJ,PROG IN WORD 5
	MOVEM	TEMP+1,5(TEMP)
	SETZM	6(TEMP)		; SET STATUS TO 0
	POPJ	PDP,		; THEN RETURN



	; GENERAL RETURN FROM THE COMMAND STRING SCANNER


CMDRTN:	POP	16,16		; RESTORE REG 16
	POPJ	16,		; GO TO CALLER




	; ACTUAL COMMAND STRING SCANNER STARTS
	; HERE.  WHEN THIS ROUTINE IS ENTERED AT CMDLVL, IT
	; WILL NOT RETURN UNTIL IT HAS ACCEPTED A SYNTACTICALLY
	; LEGAL COMMAND STRING FROM SOME SOURCE.  ENTRY SHOULD
	; BE MADE BY A PUSHJ 16,CMDLVL.  ALL DDB'S WILL BE FILLED
	; WITH THE FOLLOWING INFORMATION IF SUPPLIED:

	;	WORD		CONTENTS

	;	  1	DEVICE NAME IN SIXBIT, ZERO FILLED
	;	  2	XWD	<INPUT BUFF HDR>,<OUTPUT BUFF HDR>
	;	  3	FILENAME IN SIXBIT, ZERO FILLED
	;	  4	EXTENSION IN SIXBIT
	;	  5	XWD	<PROJECT>,<PROGRAMMER>
	;	  6	STATUS - 0  -DEVICE HAS NOT BEEN USED YET
	;			-1  -DEVICE IS READY FOR IO
	;			-2  -PHYSICAL EOF

	; A ZERO IN ANY WORD EXCEPT 2 AND 6 INDICATE THAT THE
	; INFORMATION WAS NOT SPECIFIED NOR WERE ANY
	; ASSUMPTIONS TO BE MADE


CMDPUR:	MOVE	OPT,[POINT 7,OPTION-1,35]	; INITIALIZE OPTION POINTER
	MOVE	PDP,[IOWD 5,PDL]; AND LOCAL PDP
	SETZM	COMCNT
	SETZM	OLDCNT
	MOVE	[XWD FIRST.,FIRST.+1]
	SETZM	FIRST.
	BLT	LAST.		; ZERO LOCAL STORAGE
	PUSHJ	PDP,FCBUF	; FILL COMMAND BUFFER
	SKIPN	SAVFF		; HAS .JBFF BEEN SAVED YET?
	JRST	CORSV		; THEN GO SAVE IT
	MOVE	SAVFF
	MOVEM	.JBFF
CORSV:
	MOVSI	TEMP+1,-9
	MOVE	TEMP,TAB2(TEMP+1)	; INITIALIZE DDB'S
	MOVEM	TEMP,@TAB1(TEMP+1)	; FROM DATA TABLES
	AOBJN	TEMP+1,.-2
	IFNDEF	BIGSW,<	; DON'T NEED WHOLE THING FOR COMP10!!!
	PUSHJ	PDP,ELT		; LOCAL INITIALIZATION DONE, SCAN
	CAIN	STOP,"_"	; ELT ENDED WITH _
	JRST	FUDGE3		; THEREFORE MAKE 3 ASSUMPTIONS
	CAIN	STOP,15		; CR?
	JRST	CMDERR		; VERY UNFORTUNATE
	CAIE	STOP,","	; COMMA MEANS MORE FOLLOWS
	JRST	CMDERR		; ANYTHING ELSE IS $%&*!
	MOVSI	TEMP+1,-3	; REPLACE ALL ZEROES IN LISTB
	SKIPN	LISTB+2		; NULL MRG EXT?
	SETOM	LISTB+2		; SET TO -1 FOR FUDGE
TST1:	SKIPE	LISTB(TEMP+1)
	JRST	CKFIN1
	MOVE	TEMP,MRGFDG(TEMP+1)	; WITH ASSUMED VALUES
	MOVEM	TEMP,LISTB(TEMP+1)	; AS THE SPECS REQUIRE
CKFIN1:	AOBJN	TEMP+1,TST1
	MOVEI	TEMP,MRGDDB	; LEFTMOST ELEMENT ALWAYS
	PUSHJ	PDP,XFER	; SPECIFIES INFO FOR MRGDDB
	PUSHJ	PDP,ELT		; GET NEXT ELEMENT
	CAIN	STOP,"_"	; NO LIST OR LOG DESIRED
	JRST	FUDGE2
	CAIN	STOP,15
	JRST	CMDERR		; NOT ENOUGH TO PLAY WITH
	CAIE	STOP,","	; LIST DEV SPECIFIED?
	JRST	CMDERR
	MOVSI	TEMP+1,-3
TST2:	SKIPE	LISTB(TEMP+1)
	JRST	CKFIN2
	MOVE	TEMP,LSTFDG(TEMP+1)
	MOVEM	TEMP,LISTB(TEMP+1)	; MAKE ASSUMPTIONS
CKFIN2:	AOBJN	TEMP+1,TST2
	MOVEI	TEMP,LSTDDB	; TRANSFER INFO TO LSTDDB
	PUSHJ	PDP,XFER
	PUSHJ	PDP,ELT		; AND LOOK FOR LOG SPECS
	CAIN	STOP,15
	JRST	CMDERR		; STILL NOT ENOUGH INFO
	CAIE	STOP,"_"	; MORE THAN 3 DEV ON LEFT OF _?
	JRST	CMDERR		; THAT'S A NO NO
	MOVSI	TEMP+1,-3
TST3:	SKIPE	LISTB(TEMP+1)
	JRST	CKFIN3
	MOVE	TEMP,LOGFDG(TEMP+1)
	MOVEM	TEMP,LISTB(TEMP+1)	; MAKE ASSUMPTIONS FOR LOG DEV
	CKFIN3:	AOBJN	TEMP+1,TST3
	MOVEI	TEMP,LOGDDB	; AND TRANSFER INFO
	PUSHJ	PDP,XFER	; TO LOGDDB
	JRST	RTSIDE		; PROCESS THE RIGHT SIDE OF _
FUDGE3:	SKIPN	LISTB+2
	SETOM	LISTB+2		; FUDGE NULL MRG EXT
	MOVSI	TEMP+1,-3
TST4:	SKIPE	LISTB(TEMP+1)
	JRST	CKFIN4
	MOVE	TEMP,MRGFDG(TEMP+1)	; FUDGE SPECS FOR MRGDDB
	MOVEM	TEMP,LISTB(TEMP+1)
CKFIN4:	AOBJN	TEMP+1,TST4
	MOVEI	TEMP,MRGDDB
	PUSHJ	PDP,XFER
	MOVE	TEMP,[XWD LSTFDG,LISTB]
	BLT	TEMP,LISTB+3
	MOVEI	TEMP,LSTDDB
	PUSHJ	PDP,XFER		; DITTO FOR LSTDDB
FDGLST:	MOVE	TEMP,[XWD LOGFDG,LISTB]	; AND LOGDDB
	BLT	TEMP,LISTB+3
	MOVEI	TEMP,LOGDDB
	PUSHJ	PDP,XFER
	JRST	RTSIDE		; GO DO RIGHT SIDE 
FUDGE2:	MOVSI	TEMP+1,-3
TST5:	SKIPE	LISTB(TEMP+1)
	JRST	CKFIN5
	MOVE	TEMP,LSTFDG(TEMP+1)
	MOVEM	TEMP,LISTB(TEMP+1)	; FUDGE LIST SPECS
CKFIN5:	AOBJN	TEMP+1,TST5
	MOVEI	TEMP,LSTDDB
	PUSHJ	PDP,XFER
	JRST	FDGLST>



	; PREVIOUS CODING NEEDED ONLY FOR CAM. THE 
	; FOLLOWING CODING IS USEFUL ONLY FOR 10K
	; VERSION OF COMPAR WITH BIG BUFFERS, ETC.

	IFDEF	BIGSW,<

	PUSHJ	PDP,ELT		; SCAN FIRST THING
	CAIE	STOP,"_"	; MUST BE ALONE ON THE LEFT
	JRST	CMDERR		; ELSE I AM ANNOYED
	MOVEI	TEMP,MRGDDB	; WHERE TO PUT INFO
	PUSHJ	PDP,XFER	; HERE IT GOES
	PUSHJ	PDP,ELT		; GET MORE
	CAIE	STOP,","	; MUST BE MORE
	JRST	CMDERR		; ELSE STRING IS FOR BIRDS
	MOVEI	TEMP,BASDDB	; HERE'S WHERE IT GOES
	PUSHJ	PDP,XFER	; AUF WEIDER SEHEN
	PUSHJ	PDP,ELT		; MORE OF SAME
	CAIE	STOP,15		; MUST BE LAST ON LINE
	JRST	CMDERR		; OR OPR IS DIZZY
	MOVEI	TEMP,USDDB
	PUSHJ	PDP,XFER
	PUSHJ	PDP,OPSCAN	; PICK OFF OPTIONS
	MOVE	TEMP,BASDDB
	CAME	TEMP,USDDB	; MAKE SURE SOME NUT DOES NOT
				; TRY TO READ TWO FILES OFF 
				; THE SAME TAPE
	JRST	CMDRTN		; APPARENTLY NOT
	CALLI	TEMP,4		; DSK CAN PERFORM THE FEAT
	TLNE	TEMP,200000	; WHAT  IS IT?
	JRST	CMDRTN		; OK IT'S A DSK
	TTCALL	3,[ASCIZ/? TWO INPUT FILES FROM SAME UNIT
DOESN'T MAKE IT WITH THE MONITOR
/]
	JRST	CMDPUR		; DUMBELL>

TAB1:	MCDDB+1			; THINGS IN THIS TABLE
	UCDDB+1
	USEDDB+1
	BASDDB+1
	MRGDDB+1
	LOGDDB+1
	LSTDDB+1
	CMDDDB+1
	NUMLIN
	CRPERR
TAB2:	MCIPT			; ARE SET TO THE VALUES IN THIS TABLE
	UCIPT
	USEIPT
	BASIPT
	XWD	MRGOPT,MRGIPT
	XWD	LOGOPT,0
	XWD	LSTOPT,LSTIPT
	CMDIPT
	2
		5
	IFNDEF	BIGSW,<
DEFINE	X(A)
<	SIXBIT/A/	>
MRGFDG:	0			; HERE ARE THE ASSUMPTIONS
	X(MERCOR)		; FOR ANY MISSING INFORMATION
	X(C01)
	0
LSTFDG:	0
	X(LIST)
	X(L01)
	0
LOGFDG:	X(TTY)
	X(LOG)
	X(L01)
	0
RTSIDE:	SKIPE	FED
	JRST	CRGNLY		; IF FED IS RUNNING, DISPATCH HERE
	PUSHJ	PDP,ELT		; GET AN ELEMENT
	CAIE	STOP,","	; IT MUST NOT BE THE LAST
	JRST	CMDERR
	SKIPN	LISTB		; IF DEV NOT SPECIFIED
	JRST	CRGNLY		; ELEMENT MUST BE NULL
	SKIPN	LISTB+1		; IF FILENAME NOT SPECIFIED,
	SETOM	SFMODE		; WE ARE NOT IN SINGLE FILE MODE
	MOVEI	TEMP,BADDB	; IF THE FIRST ELT NOT NULL
	PUSHJ	PDP,XFER	; THE SPECS GO INTO BASDDB
	PUSHJ	PDP,ELT		; GET USDDB SPECS
	CAIN	STOP,15		; IF COMMAND TERMINATED
	JRST	COMNLY		; COMPAR ONLY IS TO BE RUN
	CAIE	STOP,","	; IF NOT, CAM IS RUNNING
	JRST	CMDERR
	PUSHJ	PDP,CKMODE	; CHECK IF SINGLE OR MULTIFILE MODE
	MOVEI	TEMP,USDDB	; OK
	PUSHJ	PDP,XFER	; TRANSFER INFO TO DDB
	AOS	CAMOPT		; SET CAMOPT TO CAM TOGETHER
GTMCOR:	PUSHJ	PDP,ELT		; NOW GET MANUF. CORR. SPECS
	CAIE	STOP,15		; WHICH MUST TERMINATE STRING
	JRST	CMDERR
	SKIPN	LISTB+1
	JRST	.+3
	SKIPN	LISTB+2
	SETOM	LISTB+2
	MOVSI	TEMP+1,-3
TST6:	SKIPE	LISTB(TEMP+1)
	JRST	CKFIN6
	MOVE	TEMP,MCFDG(TEMP+1)
	MOVEM	TEMP,LISTB(TEMP+1); MAKE ASSUMPTIONS
CKFIN6:	AOBJN	TEMP+1,TST6
	MOVEI	TEMP,MCDDB
	PUSHJ	PDP,XFER
	SKIPE	SFMODE
	JRST	.+5
	SKIPG	CAMOPT		; IF CAM RUNNING AND SINGLE FILE TRUE
	JRST	.+3
	TTCALL	3,[ASCIZ/? WRONG MODE FOR CAM
/]
	JRST	CMDERR
	PUSHJ	PDP,OPSCAN	; SCAN OPTIONS
	MOVE	XX,MCDDB
	SKIPE	FED
	JRST	UCOMP		; IF FED, SEE THAT UCIN&MCIN
	SKIPGE	CAMOPT		; USE DIFFERENT DEVICES
	JRST	UCOMP		; TO PREVENT READING 2 FILES FROM
	CAMN	XX,USDDB	; SAME DECTAPE
	JSP	XX+1,DUPCHK	; WITH DISASTEROUS RESULTS!
	CAMN	XX,BADDB	; PERFORM CHECK ON ALL INPUTS
	JSP	XX+1,DUPCHK	; IF THE NAME IS THE SAME
	MOVE	XX,USDDB	; AND THE DEVICE IS NOT
	CAMN	XX,BADDB	; DSK, THE STRING IS IN ERROR
	JSP	XX+1,DUPCHK
	JRST	.+3
UCOMP:	CAMN	XX,UCDDB
	JSP	XX+1,DUPCHK
 	JRST	CMDRTN
DUPCHK:	CALLI	XX,4
	TLNE	XX,200000
	JRST	(XX+1)
	TTCALL	3,DUPDEV
	JRST	CMDPUR	; IS NOT LEGAL FOR INPUT UNITS
DUP1:	CALLI	TEMP,4
	TLNE	TEMP,200000
	JRST	DUPOK1
	TTCALL	3,DUPDEV
	JRST	CMDPUR
COMNLY:	PUSHJ	PDP,CKMODE	; COMPAR ONLY
	MOVE	TEMP,LISTB
	CAMN	TEMP,BADDB
	JRST	DUP1
DUPOK1:	MOVEI	TEMP,USDDB
	PUSHJ	PDP,XFER
	PUSHJ	PDP,OPSCAN	; SCAN OPTIONS
	JRST	CMDRTN		; RETURN
CRGNLY:	PUSHJ	PDP,ELT		; COMERGE ONLY
	CAIE	STOP,","
	JRST	CMDERR
	SKIPN	LISTB
	JRST	CMDERR
	SKIPN	LISTB+1
	SETOM	SFMODE		; SET MULTIFILE MODE
	MOVEI	TEMP,UCDDB
	SETOM	CAMOPT		; SET CAMOPT TO COMERGE ONLY
	PUSHJ	PDP,XFER
	JRST	GTMCOR		; GET MANU. CORR. DEV
MCFDG:	X(PTR)			; OTHER ASSUMPTIONS TO BE MADE
	X(DECCOR)
	X(C01)
	0
			>	; PREVIOUS CODE NOT NECESSARY
				; FOR 10K COMPAR


	; OPSCAN SCANS THE CHARACTERS DEPOSITED
	; BY STUFF IN OPTION.  IT PICKS UP THE ID FOR
	; CORRECTION LINES FOR COMPAR AND SETS SWITCHES
	; AND PERFORMS MISCELLANEOUS CLEANUP OPERATIONS


OPSCAN:	MOVE	[BYTE (7)11,11,11,11,11]	
	MOVEM	ID.-1		; PUT TABS IN THE ID BUFFER
	SETZM	LSTTY		; CLEAR THIS
	SETZM	LOGTTY		; AND THAT
	AOS	MRGDDB+3	; FIND OUT IF MRG EXT NUL
	SKIPE	MRGDDB+3	; ZERO MEANS YES
	SOS	MRGDDB+3	; RE DECREMENT BY 1
	AOS	MCDDB+3
	SKIPE	MCDDB+3
	SOS	MCDDB+3
	SETZM	OLDCNT
	SKIPN	MRGDDB		; IF NO MRG DEV SPEC, FATAL ERR
	JRST	CMDERR
	SKIPE	LSTDDB
	SETOM	LSTOP		; FIND OUT OF LST DEV SPECIFIED
	MOVE	[SIXBIT/TTY/]
	SKIPN	LSTDDB
	MOVEM	LSTDDB		; ENSURE TTY OUTPUT IF IT WASN'T
	MOVE	CHAR,LOGDDB
	PUSHJ	16,JOBTTY	; IS LOG DEV TTY?
	SETOM	LOGTTY
	JFCL
	JFCL
	MOVE	CHAR,LSTDDB
	PUSHJ	16,JOBTTY	; IS LST DEV A USER TTY?
	SETOM	LSTTY
	JFCL
	JFCL
	MOVE	TEMP,[POINT 7,OPTION-1,35]	; INIT POINTER TO OPTIONS
	EXTERNAL	ASTRFL
	MOVE	CHAR,LSTDDB+2
	CAMN	CHAR,[SIXBIT/*     /]
	SETOM	ASTRFL		; SET SPECIAL SWITCH
OPCHR:	ILDB	CHAR,TEMP	; LOAD FIRST CHAR
	JUMPE	CHAR,[POPJ	PDP,]	; NULL MEANS NONE LEFT
	SKIPE	MATQUO		; LOOKING FOR MATCHING QUOTES?
	JRST	ID.PUT		; YES, STORE ID AWAY
	CAIN	CHAR,"H"
	SETOM	HEADSW
	EXTERN	HEADSW
	CAIN	CHAR,"I"
	SETOM	INCOPT		; NO INCREMENTING EXTENSIONS
	CAIN	CHAR,"Z"
	SETOM	ZOP
	CAIN	CHAR,"P"
	SETOM	PRTOPT		; PRINT COMMANDS AS THEY ARE READ
	CAIN	CHAR,"T"	; TIME MSG FOR FED?
	SETOM	TSW		; SET FLAG
	CAIN	CHAR,"X"	; PRINT EXCEPTIONS ONLY IN FED?
	SETOM	XSW		;YES, INDEEDY
	CAIE	CHAR,42
	JRST	OPCHR
	SETOM	MATQUO		;  " FOUND, SO LOOK FOR MATCHING

	MOVE	TEMP+1,[POINT 7,ID.-1,35]
	MOVEI	CHAR,11		; PUT A TAB IN THE ID
	IDPB	CHAR,TEMP+1
	JRST	OPCHR		; LOOK FOR MORE TO PACK AWAY
ID.PUT:	CAIE	CHAR,42
	JRST	PUTIT
	SETZM	MATQUO
	JRST	OPCHR		; IF THE MATCHING QUOTE FOUND, SCAN ANEW
PUTIT:	AOS	XX,ID.CNT
	CAIG	XX,3		; ENSURE ONLY 3 CHARACTERS IN ID
	IDPB	CHAR,TEMP+1
	JRST	OPCHR		; GET MORE



	; CHECKS THAT USER DOES NOT CONFUSE SINGLE AND
	; MULTIFILE MODES


CKMODE:	SKIPE	LISTB+1	
	JRST	TMODE1
	SKIPL	SFMODE
	JRST	CMDERR
	POPJ	PDP,
TMODE1:	SKIPE	SFMODE
	JRST	CMDERR
	POPJ	PDP,
	END;			THAT'S ALL