File: PIP.PA of Tape: OS8/OS8-V3/dec-s8-osysb-a-ua1
(Source file text) 

/PIP FOR OS/8 MONITOR
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1970,1971,1972,1973,1974 BY DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
/CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
/DIGITAL.
/
/
/
/
/
/
/
/
/
/
/10 DECEMBER 1973	VERSION 9  FILE PIP.PA
/RL/EF/ET.AL.



/ABSTRACT----
/PIP (PERIPHERAL INTERCHANGE PROGRAM) IS A GENERAL FILE
/MANIPULATION PROGRAM FOR THE OS/8 PROGRAMMING SYSTEM.
/PIP ACCOMPLISHES DATA TRANSFERS BETWEEN ANY DEVICES IN THE OS/8
/CONFIGURATION.


/VERSION 3 MODS:

/FIXED PROBLEM WITH ONE-PAGE WRITE
/IN /S OR /Z, =OPTION IS TAKEN MODULO 100 (OCTAL)
/	WITH 100, 200, ETC. MEANING USE 0 ADDITIONAL WDS.
/DATES STILL DON'T LINE UP
/'0 FREE BLOCKS'
/ALLOW FILLING UP DEVICE TO VERY LAST BLOCK
/ALLOW 7-BIT ^C
/ALTMODE ON CD LINE RETURNS TO MONITOR WHEN DONE
/NO HALT ON /L IF NO TTY HANDLER (ACTS AS NOP)
/ /V PRINTS VERSION NUMBER FIRST TIME CALLED
/ /O AFFIRMS /Y ON ZERO SYS OR ARE YOU SURE
/=NNNN ON /I OPTION SPECIFIES LENGTH TO CLOSE FILE
/DETAILS OF PIP:

/PIP RUNS WITH THE USR (USER SERVICE ROUTINES) ALWAYS IN CORE.
/THIS ELIMINATES SWAPPING THE MONITOR. IF ANY CHANGES ARE MADE
/TO PIP, CARE SHOULD BE TAKEN IN USING PAGE ZERO LOCATIONS, AS
/THEY MUST NOT DESTROY ANY MONITOR LOCATIONS.

/CORE USED:
/FIELD 0

/00000-02777-	OUTPUT BUFFER
/03000-06377-	INPUT BUFFER
/06400-06577-	CURRENTLY UNUSED *****
/06600-07177-	INPUT HANDLER
/07200-07577-	OUTPUT HANDLER

/FIELD 1

/10000-11777-	OS/8 I/O MONITOR
/12000-16577-	EXECUTABLE CODE
/16600-17177-	HOLDS NEW DIRECTORY SEGMENT FOR /S OPTION
/17200-17577-	HOLDS OLD DIRECTORY SEGMENT IN /S OPTION


/MAJOR PIECES OF CODE AND THEIR FUNCTION (BRIEFLY).
/THIS IS A LIST OF ROUTINES AS THEY APPEAR PHYSICALLY, AND
/NOT AS THEY ARE LOGICALLY CONNECTED.

/ICHAR-		GENERAL CHARACTER INPUT ROUTINE. ASSIGNS NEW
/		DEVICE HANDLERS AS NEEDED.

/OOPEN-		ENTERS A FILE ON A SPECIFIED DEVICE.

/OUTDMP-	WRITES OUTPUT BUFFER TO OUTPUT DEVICE.

/OCLOSE-	CLOSES FILE CREATED BY OOPEN

/OCHAR-		CHARACTER OUTPUT ROUTINE. WRITES CHARACTERS
/		TO OUTPUT BUFFER, CALLING OUTDMP WHEN FULL.

/OTYPE-	USES DEVICE NUMBER IN OUTPUT AREA OF CD TO
/		INSPECT THE DEVICE CONTROL BLOCK WORD. THIS
/		GIVES A CODE FOR THE TYPE OF DEVICE.

/SLASHG-	HANDLES I/O ERRORS. IF /G IS SET, HARD I/O
/		ERRORS ARE IGNORED. IF /S AND /G ARE ON, A
/		SPECIAL RETURN IS TAKEN.

/IMAGE-		IMAGE MODE PROCESSOR FOR PIP.

/SQTRA-		MAIN SUBROUTINE OF IMAGE MODE, AND /S OPTION.

/PIP, PIP+1-	MAIN ENTRANCES TO PIP. THE CODE ON THIS PAGE
/		INSPECTS CD OPTION WORDS AND BRANCHES TO PROPER
/		ROUTINES.

/ASCII-		THE DEFAULT TRANSFER MODE IN PIP IS ASCII.

/DELETE-	DELETES FILES ON OUTPUT SIDE OF CD LIST.

/DZERO-		ZEROES DIRECTORY OF FIRST OUTPUT DEVICE.

/PIPERR-	ERROR ROUTINR FOR PIP.

/DIRPRE-	DIRECTORY PRINTING ROUTINE.

/BINARY-	BINARY MODE PROCESSOR. HANDLES ABSOLUTE AND
/		RELOCATABLE BINARY FILES.

/ERPRNT-	ERROR PRINTOUT.

/SQUISH-	FILE COMPRESSION PROCESSOR. ELIMINATES 'HOLES'
/		IN DIRECTORY OF INPUT DEVICE.

/SYSCOP-	SYSTEM COPY PROCESSOR. ALLOWS TRANSFER OF THE
/		OS/8 SYSTEM AREA.
/OPTIONS AVAILABLE IN PIP:

/A-	ASCII TRANSFER; DEFAULT MODE
/B-	BINARY MODE TANSFER
/C-	DELETE TRAILING BLANKS. (ASCII MODE)
/D-	DELETE FIRST OUTPUT FILE BEFORE PROCEEDING
/E-	LIST INPUT DIRECTORY INCLUDING EMPTY FILES
/F-	LIST INPUT DIRECTORY; ONLY FILE NAMES
/G-	IGNORE ERRORS WHILE TRANSFERING
/I-	IMAGE MODE TRANSFER
/L-	LIST INPUT DIRECTORY; EXCLUDE EMPTY FILES
/O-	OK TO PERFORM A SQUISH OR ZERO WITHOUT ASKING
/S-	COMPRESS INPUT DEVICE ONTO OUTPUT DEVICE. ELIMINATES
/	'HOLES' ON INPUT DEVICE.
/T-	PROVIDE SIMPLE TTY FORMATTING. (ASCII ONLY)
/Y-	COPY OS/8 SYSTEM AREA
/Z-	ZERO OUTPUT DEVICE DIRECTORY BEFORE PROCEEDING
/=N-	LEAVE N WORDS EXTRA PER DIRECTORY ENTR. VALID
/	ONLY WITH /S OR /Z.
/=N-	WITH /I OPTION CLOSES OUTPUT FILE WITH THIS LENGTH
/V	PRINTS VERSION # (FIRST TIME ONLY)

/COMMENTS ON THE PROGRAM:

	/SINCE PIP RUNS WITH USR IN CORE, NO PAGE ZERO LITERALS
	/CAN BE USED. THE LOCATIONS CURRENTLY USED IN
	/FIELD 1 ON PAGE ZERO ARE:

	OUTXR=10
	INXR=11
	TEMP1=12
	IHNDLR=24	/HOLDS INPUT HANDLER ADDRESS
	OHNDLR=25	/OUTPUT HANDLER ADDRESS
	SQFLAG=26	/'SQUISH INDICATOR
	OUWAST=27	/# WASTE WORDS ON OUTPUT
	OUTBLK=30
	OUDLEN=31
	SAME=32
	INBLK=33
	RECCNT=34

/CONSTANTS USED BY THE DIRECTORY PRINTOUT ROUTINE (OVERLAPPING) ARE:

	FLENGT=24
	BLOKNO=25
	DTYPE=27
	DCOUNT=30
	DLINK=31
	WASTE=32
	DDATE=33
	ECOUNT=35
	/PIP FOR OS/8 MONITOR
	/EQUIVALENCES FOR GENERAL CHARACTER I/O ROUTINES

	OUBUF=0	/MUST BE LOWER THAN INBUF
	OUCTL=5400	/OUTPUT BUFFER OF 3000 WORDS
	OUDEVH=7200	/PROVIDE ROOM FOR TWO-PAGE HANDLERS
	INBUF=3000
	INCTL=1600	/INPUT BUFFER OF 3400 WORDS
	INRECS=7
	INDEVH=6600

			/PAGE 6400 IS FREE

	/EQUIVALENCES NECESSARY TO INTERFACE WITH MONITOR
	DCB=7760
	MPARAM=7643	/CD PARAMETER AREA
	OLDDIR=7		/POINTER TO MONITOR VARIABLE "OLDT9"
	MTEMP=27	/MONITOR SCRATCH AREA ON "SYS" - ***VOLATILE***
	PTP=20	/INTERNAL TYPE CODE FOR PAPER TAPE PUNCH
	XR=10
	TEMP=20
	CHAR=21
	INFPTR=22
	INEOF=23

	ABUF=6601	/LINE BUFFER - 150 CHARACTERS LONG
	SQBUF1=6600	/DIRECTORY BUFFER FOR "SQUISH" OPTION
	SQBUF2=7200	/""

	FIELD 1
	/GENERAL CHARACTER I/O ROUTINES FOR BLEEP
	/CALLED AS FOLLOWS:

	/JMS I (IOPEN		INITIALIZES THE INPUT ROUTINE

	/JMS I (ICHAR		READS A CHARACTER
	/ERROR RETURN		/AC>0 IF END OF FILE, AC<0 IF READ ERROR

	/JMS I (OOPEN		INITIALIZES THE OUTPUT ROUTINE
	/ERROR RETURN		AC>0 IF NO OUTPUT DEVICE/FILE, AC<0 IF ERROR

	/JMS I (OCHAR		OUTPUTS A CHARACTER
	/ERROR RETURN		OUTPUT ERROR OR TOO MUCH OUTPUT

	/JMS I (OCLOSE		CLOSES THE OUTPUT FILE
	/ERROR RETURN		FILE TOO LARGE TO BE CLOSED OR OUTPUT ERROR

	/JMS I (OTYPE		RETURNS DCB WORD OF OUTPUT DEVICE IN AC



	/PARAMETERS NEEDED:

	/INBUF=		ADDRESS OF INPUT BUFFER
	/INCTL=		INPUT BUFFER CONTROL WORD
	/OUBUF=		ADDRESS OF OUTPUT BUFFER
	/OUCTL=		OUTPUT BUFFER CONTROL WORD (MUST BE NEGATIVE)
	/INRECS=	[INCTL/256]
	/INDEVH=	ADDRESS OF PAGE FOR INPUT HANDLER
	/OUDEVH=	ADDRESS OF PAGE FOR OUTPUT HANDLER

	/ASSUMES I/O MONITOR IS RESIDENT IN CORE.
	/CAN BE CALLED FROM ANY FIELD WITH BUFFERS IN ANY FIELD.
	INFLD=INCTL&70	/GET FIELD OF INPUT BUFFER
	OUFLD=OUCTL&70	/DITTO OUTPUT BUFFER

	*2000

IN7400,	7400
IOPEN,	0
	CLA CMA
	DCA INCHCT	/SET INCHCT TO FORCE A READ
	ISZ INEOF	/SET END-OF-FILE FLAG TO FORCE A NEW FILE
	TAD (7617
	DCA INFPTR	/RESET FILE POINTER
	RDF
	TAD INCDIF
	DCA .+1
INPTR,	HLT		/RESTORE CALLING FIELDS
	JMP I IOPEN

ICHAR,	0
IN7600,	7600
	RDF
	TAD INCDIF
	DCA INRTRN	/SAVE CALLING FIELDS
INCHAR,	CDF INFLD
	ISZ INJMP	/BUMP THREE-WAY UNPACK SWITCH
	ISZ INCHCT
INJMPP,	JMP INJMP
	TAD INEOF
	SNA CLA		/DID LAST READ YIELD END-OF-FILE?
	JMP INGBUF	/NO - DO ANOTHER
GETNEW,	JMS INNEWF	/OPEN A NEW INPUT FILE
	JMP EOFERR	/NO FILE TO OPEN
INGBUF,	TAD INCTR
	CLL
	TAD (INRECS
	SNL
	DCA INCTR	/RESTORE INCTR IF IT HASN'T OVERFLOWED
	SZL		/IS THIS THE LAST READ?
	ISZ INEOF	/YES - SET END-OF-FILE FLAG
			/NOT END-OF-FILE IF INPUT DEVICE
			/IS NON-FILE STRUCTURED!
	CLL CML CMA RTR	/CONSTRUCT A CONTROL WORD FOR THE READ
	RTR		/FROM THE AMOUNT OF THE OVERFLOW
	RTR		/(IF ANY) AND THE STANDARD CONTROL WORD
	TAD (INCTL+1
	DCA INCTLW
INCDIF,	CDF CIF 0
	CDF 10
	JMS I INHNDL	/CALL THE DEVICE HANDLER
INCTLW,	0
INBUFP,	INBUF
INREC,	0
	JMS I (SLASHG	/A HANDLER ERROR - SHOULD WE IGNORE?
	INERRX-.	/ADDRESS IF NOT
INBREC,	TAD INREC
	TAD (INRECS
	DCA INREC	/UPDATE THE RECORD NUMBER
	TAD INCTLW
	AND IN7600
	CLL RAL
	TAD INCTLW
	AND IN7600
	CMA
	DCA INCHCT	/COMPUTE THE NEW CHARACTER COUNT
	TAD INJMPP
	DCA INJMP	/RESET THE CHARACTER SWITCH
	TAD INBUFP
	DCA INPTR	/AND THE WORD POINTER
	JMP INCHAR	/GO BACK AND MAKE BELIEVE THIS NEVER HAPPENED
INERRX,	ISZ INEOF	/EITHER AN END-OF-FILE OR A BADDIE
	SMA CLA		/WHICH TYPE WAS IT?
	JMP INBREC	/END OF FILE - RESUME THY PROCESSING
INERR,	CLA CLL CML RAR	/BADDIE - GIVE ERROR RETURN WITH NEGATIVE AC
EOFERR,	JMP INRTRN
INJMP,	HLT		/THIS IS THE THREE - WAY CHARACTER SWITCH
	JMP ICHAR1
	JMP ICHAR2
ICHAR3,	TAD INJMPP
	DCA INJMP
	TAD I INPTR
IN200,	AND IN7400
	CLL RTR
	RTR		/COMBINE THE HIGH-ORDER FOUR BITS OF
	TAD INCTLW
	RTR		/THE TWO WORD TO FORM THE THIRD CHARACTER
	RTR
	ISZ INPTR
	JMP INCOMN
ICHAR2,	TAD I INPTR
	AND IN7400
	DCA INCTLW	/SAVE THE HIGH-ORDER BITS FOR THE THIRD CHAR
	ISZ INPTR	/BUMP THE WORD POINTER
ICHAR1,	TAD I INPTR
INCOMN,	AND (377
	TAD (-232
INCTZF,	SNA		/IS THE CHARACTER A ^Z?
	JMP GETNEW	/YES - GET A NEW FILE
	TAD (232	/RESTORE THE CHARACTER
	ISZ ICHAR	/BUMP RETURN TO NORMAL RETURN
INRTRN,	0		/RESTORE CALLING FIELDS
	JMP I ICHAR	/AND RETURN
			/IOPEN IS UNNECESSARY.
INNEWF,	-1		/ROUTINE TO OPEN NEW INPUT FILE
	INCHCT=INNEWF
	CDF 10
	TAD (INDEVH+1
	DCA INHNDL	/INITIALIZE HANDLER ADDRESS
	TAD I INFPTR	/GET NEXT CD INPUT FILE ENTRY
	SNA		/ANY MORE?
	JMP I INNEWF	/NO - OUT OF INPUT
	JMS I IN200
	1		/ASSIGN, FETCH HANDLER
INHNDL,	0
	HLT		/HUH?
	TAD I INFPTR
	AND (7760	/GET LENGTH PART OF WORD
	SZA		/LENGTH OF 0 MEANS LENGTH >=256
	TAD (17		/ADD HIGH-ORDER BITS
	CLL CML RTR
	RTR
	DCA INCTR	/STORE LENGTH OF FILE
	ISZ INFPTR
	TAD I INFPTR
	DCA INREC	/STORE STARTING RECORD NUMBER OF FILE
	ISZ INFPTR
	DCA INEOF	/ZERO END-OF-FILE FLAG
	ISZ INNEWF
	JMP I INNEWF
	INCTR=IOPEN
	PAGE
OOPEN,	0		/OPEN OUTPUT FILE
OU7600,	7600
/	RDF
/	TAD OUCDIF
/	DCA OORETN
	TAD OU7601
	DCA OUBLK
	TAD (OUDEVH+1
	DCA OUHNDL
	CDF 10
	TAD I OU7600	/GET DEVICE NUMBER WORD OF OUTPUT FILE ENTRY
	AND (17		/STRIP OFF ANY LENGTH INFO
	SNA		/IS THERE AN OUTPUT DEVICE?
	JMP ONOFIL	/NO - INHIBIT OUTPUT
	JMS I (200
	1		/ASSIGN, FETCH HANDLER
OUHNDL,	0		/OUTPUT DEVICE HANDLER ENTRY
	HLT		/HUH?
OUENTR,	TAD I OU7600
	JMS I (200
	3		/ENTER OUTPUT FILE
OUBLK,	7601		/REPLACED WITH STARTING BLOCK
OUELEN,	0		/REPLACED WITH LENGTH OF HOLE
	JMP OEFAIL	/FAILED - MAYBE WE ASKED TOO MUCH
	DCA OUCCNT
	DCA I (OUTINH	/ZERO OUTPUT INHIBIT FLAG
	JMS I (OUSETP
	ISZ OOPEN
OORETN,	CDF CIF 10	/RESTORE CALLING FIELDS
	JMP I OOPEN
OEFAIL,	TAD I OU7600
	AND (7760	/GET REQUESTED LENGTH
	SNA CLA		/WAS IT AN INDEFINITE REQUEST
	JMP ONTERR	/YES - CANNOT ENTER THE FILE
	TAD I OU7600
	AND (17		/MAKE THE REQUESTED LENGTH ZERO
	DCA I OU7600
	JMP OUENTR	/TRY, TRY AGAIN
ONTERR,	CLA CLL CML RAR
	JMP OORETN	/TAKE THE ERROR RETURN WITH AC<0
ONOFIL,	ISZ I (OUTINH
	JMP OORETN	/TAKE THE ERROR RETURN WITH AC=0
OUTDMP,	0
	DCA OUCTLW	/STORE THE CONTROL WORD
	CDF 10
	TAD I (OUTINH
	SZA CLA
	JMP OUNOWR
	TAD OUCCNT
	SNA
	ISZ OUCTLW
	TAD OUBLK
	DCA OUREC	/COMPUTE THE STARTING BLOCK NUMBER OF THIS TRANSFER
	TAD OUCTLW
	CLL RTL
	RTL
	RTL
	AND (17		/COMPUTE THE NUMBER OF RECORDS
	TAD OUCCNT	/UPDATE THE NUMBER OF BLOCKS IN THE FILE
	DCA OUCCNT
	TAD OUCCNT
	CLL CML
	TAD OUELEN
	SNL SZA CLA	/DOES THE LENGTH EXCEED THE GIVEN LENGTH?
	JMP I OUTDMP	/YES - SIGNAL OUTPUT ERROR
OUCDIF,	CDF CIF 0
	CDF 10
	JMS I OUHNDL
OUCTLW,	0
	OUBUF
OUREC,	0
	JMS I (SLASHG
	.+2-.
OUNOWR,	ISZ OUTDMP	/BUMP OUTDMP TO NORMAL RETURN
	JMP I OUTDMP
OCLOSE,	0
	CDF 10
	TAD I (OUTINH
	SZA CLA		/IS OUTPUT INHIBITED?
	JMP OCISZ	/YES - CLOSE IS A NOP
	JMS I (OTYPE
	AND (770
	TAD (-PTP	/CHECK FOR PAPER TAPE PUNCH OUTPUT
	SZA CLA		/AND SKIP ^Z OUTPUT IF TRUE
	TAD (232	/OUTPUT A ^Z
	JMS I (OCHAR
	JMP OCRET
	JMS I (OCHAR
	JMP OCRET
FILLLP,	JMS I (OCHAR
	JMP OCRET
	JMS I (OTYPE	/GET TYPE OF OUTPUT DEVICE
	SPA CLA
	TAD (100	/IF ITS A DIRECTORY DEVICE FORCE A RECORD
	TAD (77		/BOUNDARY - OTHERWISE A HALF-RECORD
	AND I (OUDWCT
	SZA CLA		/UP TO THE BOUNDARY YET?
	JMP FILLLP	/NO - FILL WITH ZEROS
	TAD I (OUDWCT	/GET DOUBLEWORD COUNT LEFT
	TAD (OUCTL&3700
	SNA		/A FULL WRITE LEFT?
	JMP NODUMP	/YES - DON'T DO IT - THE ^Z IS ALREADY OUT
	TAD (4000+OUFLD	/PUT IN THE FIELD BITS AND THE WRITE BIT
	JMS OUTDMP
	JMP OCRET	/AN ERROR OCCURRED WHILE DUMPING THE BUFFER
NODUMP,	TAD I OU7600	/GET THE DEVICE NUMBER
	JMS I (200
	4		/CLOSE THE OUTPUT FILE
OU7601,	7601		/POINTER TO THE OUTPUT FILE NAME
OUCCNT,	0
	SKP		/ERROR WHILE CLOSING THE FILE - BAD!
OCISZ,	ISZ OCLOSE
OCRET,	CDF CIF 10	/RESTORE CALLING FIELDS
	JMP I OCLOSE
	PAGE
OUSETP,	0		/ROUTINE TO INITIALIZE CHARACTER POINTERS
	TAD (OUCTL&3700	/GET SIZE OF BUFFER IN DOUBLEWORDS
	CIA		/PAL10 IS DEFINITELY NOT NICE
	DCA OUDWCT
/	TAD (OUBUF
	IFNZRO OUBUF <ERROR!>	/V3
	DCA OUPTR	/INITIALIZE WORD POINTER
	TAD OUJMPE
	DCA OUJMP	/INITIALIZE THREE-WAY CHARACTER SWITCH
	JMP I OUSETP

OCHAR,	0
	AND (377
	DCA OUTEMP
	RDF
	TAD (CDF CIF 0
	DCA OUCRET
	TAD OUTINH
	SZA CLA		/IS THERE AN OUTPUT FILE?
	JMP OUCOMN	/NO - EXIT
OUCHAR,	CDF OUFLD	/SET DATA FIELD TO BUFFER'S FIELD
	ISZ OUJMP	/BUMP THE CHARACTER SWITCH
OUJMP,	HLT		/THREE WAY CHARACTER SWITCH
	JMP OCHAR1
	JMP OCHAR2
OCHAR3,	TAD OUTEMP
	CLL RTL
	RTL
	AND (7400
	TAD I OUPOLD
	DCA I OUPOLD	/UPDATE FIRST WORD OF TWO WITH HIGH
			/ORDER 4 BITS OF THIRD CHAR
	TAD OUTEMP
	CLL RTR
	RTR
	RAR
	AND (7400
	TAD I OUPTR
	DCA I OUPTR	/UPDATE SECOND WORD FROM LOW ORDER 4 BITS
	TAD OUJMPE
	DCA OUJMP	/RESET SWITCH
	ISZ OUPTR
	ISZ OUDWCT	/BUMP DOUBLEWORD COUNTER EVERY 3 CHARS
	JMP OUCOMN
	TAD (OUCTL	/LOAD CONTROL WORD FOR A FULL WRITE
	JMS I (OUTDMP	/DUMP THE BUFFER
	JMP OUCRET	/OUTPUT ERROR - GIVE ERROR RETURN
	JMS OUSETP	/RE-INITIALIZE THE POINTERS
	JMP OUCOMN
OCHAR2,	TAD OUPTR
	DCA OUPOLD	/SAVE POINTER TO FIRST WORD OF TWO
	ISZ OUPTR	/BUMP WORD POINTER TO SECOND WORD
OCHAR1,	TAD OUTEMP
	DCA I OUPTR
OUCOMN,	ISZ OCHAR
OUCRET,	HLT		/RESTORE CALLING FIELDS
	JMP I OCHAR
OUTEMP,	0
OUPOLD,	0
OUPTR,	0
OUJMPE,	JMP OUJMP
OUDWCT,	0
OUTINH,	0
OTYPE,	0
	RDF
	TAD (CDF CIF 0
	DCA OTRTN
	CDF 10
	TAD I (7600
	AND (17
	TAD (DCB-1
	DCA OUTEMP
	TAD I OUTEMP
OTRTN,	HLT
	JMP I OTYPE
CTCTST,	0
	TAD (200	/V3
	KRS
	TAD (-203
	SNA CLA		/IS THE TELETYPE BUFFER A ^C
	KSF		/WITH THE TELETYPE FLAG ON?
	JMP I CTCTST	/NO
LEAVE,	CDF CIF 0	/YES - GO TO MONITOR
	JMP I (7600	/THROUGH THE "SAVE CORE" RETURN

SLASHG,	0
	DCA CTCTST
	TAD SQFLAG
	SZA CLA		/ARE WE SQUISHING?
	JMP I (SQIOER	/YES
	TAD CTCTST
	SPA CLA		/ONLY IGNORE HARD ERRORS
	TAD I (MPARAM
	AND (40
	SZA CLA		/ "G" SWITCH
SLGRET,	JMP I SLASHG	/IGNORED!
	TAD I SLASHG
	TAD SLASHG
	DCA SLASHG	/SET UP NON-IGNORE ADDRESS
	TAD CTCTST
	JMP I SLASHG	/RETURN WITH AC RESTORED

DIR,	DCA DTYPE	/SAVE TYPE OF REQUEST
	TAD I (7600
	SZA CLA		/IS THERE AN OUTPUT FILE?
	JMP I (DIRPRE	/YES
	DCA TTYDEV+1
	JMS I (200
	12		/ASSIGN WITHOUT FETCH
TTYDEV,	5524		/COMPRESSED CODE FOR "TTY"
	0
	0
	JMP I (PIP	/V3 WHAT - NO TELETYPE!
	TAD TTYDEV+1
	DCA I (7600
	JMP I (DIRPRE
	PAGE
	/PIP PROPER BEGINS HERE
	/**********************

	/IMAGE MODE PROCESSOR FOR PIP

IMAGE,	JMS I (FIXLEN
	JMS I (OUTOPN
	JMS IMTRA
IMCLOS,	TAD I (OUTINH
	SZA CLA		/WAS THERE AN OUTPUT FILE?
	JMP I (PIPCLR	/NO - DON'T CLOSE IT
	JMS I (OUK	/GET THE LENGTH OF THE OUTPUT FILE
	DCA IMCCNT
	TAD I IM7600
	JMS I (200
	4		/CLOSE
	7601		/FILE NAME
IMCCNT,	0
	JMP I (AOUERR
	JMP I (PIPCLR

ENDFUJ,	0		/PART OF DIRECTORY PRINTING ROUTINE
	JMS I (PRNUM
	TAD (-6
	JMS I (PRWD	/PRINT SIX WORDS
	0006		/ F
	2205		/RE
	0500		/E 
	0214		/BL
	1703		/OC
	1323		/KS
	JMS I (PCRLF
	JMS I (PCRLF	/LEAVE A SPACE BETWEEN DIRECTORIES
	ISZ INEOF	/SIMULATE "END OF FILE" FOR INPUT ROUTINE
	CLA CMA
	DCA I (INCHCT	/AS WELL AS "END OF BUFFER"
	JMP I ENDFUJ
IMHNDL,			/V3
SQTRA,	0
	TAD SQTRA
	DCA IMTRA	/FAKE A CALL TO "IMTRA"
	TAD RECCNT	/SETTING UP THE ARGS TO DO THE SQUISHING FOR US
	DCA I (INCTR
	TAD IHNDLR
	DCA IMHNDL
	TAD INBLK
	DCA IMREC
	TAD OUTBLK
	DCA I (OUCCNT
	DCA INEOF
	JMP IMRCLP

IMTRA,	0
	JMS I (IOPEN	/INITIALIZE INPUT ROUTINE
AGAIN,	TAD INEOF	/IOPEN ALWAYS SETS INEOF
	SNA CLA		/KEEP READING?
	JMP IMRCLP	/YES
			/NO, OPEN NEXT FILE
IMFILP,	JMS I (INNEWF	/SET UP PARAMS FOR NEXT FILE
	JMP I IMTRA	/NO NEXT FILE
	TAD I (INHNDL
	DCA IMHNDL	/GET DEVICE HANDLER ENTRY
	TAD I (INREC
	DCA IMREC	/AND STARTING BLOCK NUMBER
IMRCLP,	TAD I (INCTR
	CLL
	TAD (15
	SNL		/IF LINK IS ON, THERE ARE LESS THAN 16 BLOCKS LEFT
	DCA I (INCTR
	SZL
	ISZ INEOF
	CLL CML CMA RTR
	RTR
	RTR
	TAD (3201	/FORM A FULL OR PARTIAL READ CONTROL WORD
	DCA IMCTLW
	JMS I (CTCTST	/CHECK FOR ^C
	CIF 0
	JMS I IMHNDL
IMCTLW,	0
	OUBUF
IMREC,	0
	JMS I (SLASHG
	IMERRX-.
	TAD IMREC
	TAD (15
	DCA IMREC	/UPDATE BLOCK NUMBER
	CLA CLL CML RAR
	TAD IMCTLW
IMOUT,	JMS I (OUTDMP	/WRITE OUT WHAT WE JUST READ IN
	JMP I (AOUERR	/WRITE ERROR - BAD!
	JMP AGAIN	/V3
IMERRX,	ISZ INEOF	/SIGNAL EOF OR WORSE
	SPA CLA		/WHICH ONE IS IT?
	JMP IM7600
	TAD (6377	/MARCH DOWN THROUGH CORE
IMEFLP,	DCA CHAR	/LOOKING FOR THE FIRST NON-ZERO WORD
	CDF 0
	TAD I CHAR
	SZA CLA
	JMP IMNZRO
	CLA CMA CLL
	TAD CHAR
	SZL		/IF WE GO THROUGH THE BUFFER WITHOUT A NON-ZERO WORD
	JMP IMEFLP
IM7600,	7600
	JMS I (PIPERR	/SOMETHING IS WRONG (HANDLER SHOULD HAVE INSERTED
	4		/A ^Z AT LEAST)
IMNZRO,	CDF 10
	TAD CHAR
	CLL CML RAR
	AND IM7600
	TAD (200	/GET THE LENGTH OF THE USEFUL PART OF THE BUFFER
	JMP IMOUT	/AS AN OUTPUT CONTROL WORD AND GO OUTPUT IT
	PAGE
/** PIP STARTS HERE (OR HERE+1 IF CHAINED TO) **

PIPSA,	JMP PIPCD	/NORMAL ENTRY/RE-ENTRY - CALL CD
	JMP NOPCD	/ENTRY FROM CHAIN COMMAND - ASSUME CD AREA SET UP
	/PART OF ASCII PROCESSOR - CLEAN UP AT END OF LINE AND END OF FILE

LFEED,	TAD CHAR
	DCA I XR	/PUT THE LINE FEED IN THE LINE BUFFER
EOL,	DCA I XR	/MARK THE END OF USEFUL INFO
	JMS I (CTCTST
	TAD (ABUF-1
	DCA XR		/RESET BUFFER POINTER
EOLLP,	TAD I XR	/GET A CHARACTER FROM THE LINE BUFFER
PIPSNA,	SNA		/ZERO MEANS NO MORE CHARS
	JMP EOFTST
	JMS I (OCHAR	/OUTPUT THE CHARACTER
	JMP I (AOUERR
	JMP EOLLP
EOFTST,	TAD AEOFFG
	SNA CLA		/END OF INPUT ENCOUNTERED?
	JMP I (ASCIGO	/NO - GET NEXT LINE
ACLOSE,	JMS I (OCLOSE	/YES - CLOSE THE OUTPUT FILE
	JMP I (AOUERR	/ERROR ON CLOSE
PIP,	TAD I (MPARAM-1	/V3
	SMA CLA		/ALTMODE TERMINATE LAST COMMAND STRING?
	JMP PIPCD	/NO
	CDF CIF 0	/YES
	JMP I (7605	/EXIT TO OS/8 WITHOUT SAVING CORE
PIPCD,	JMS I (200	/OF COURSE THE MONITOR IS IN CORE!
	5		/COMMAND DECODE
	0		/NO ASSUMED EXTENSIONS ON INPUT
L20,			/V3
NOPCD,	JMS I (ONCE	/REPLACED BY '20' BY ONCE-ONLY CODE
	JMS I (SRSTOR	/CLEAR /S OR /Y;READ MONITOR
	DCA SQFLAG	/CLEAR /S INDICATOR
	TAD PIPSNA
	DCA I (INCTZF	/RESET INPUT SWITCH TO DETECT "^Z"'S
	TAD I (MPARAM+1
	AND (40		/"S" SWITCH
	SZA CLA
	JMP I (SQUISH	/IT WAS ON - COMPRESS THE INDICATED DEVICES
	TAD I (MPARAM+2
	RTL
	SZL CLA		/"Z" SWITCH IN THE LINK
	JMS I (DZERO	/ZERO DIRECTORY BEFORE PROCEEDING
	TAD I (MPARAM
	AND (400	/"D" SWITCH
	SZA CLA
	JMS I (DELETE	/DELETE OUTPUT FILE
	TAD I (MPARAM+2	/IS /Y ON?
	SPA CLA
	JMP I (SYSCOP	/YEP..TRANSFER SYSTEM HEAD
	TAD I (MPARAM
	AND (301	/"E","F" AND "L" SWITCHES
	SZA		/ANY ONE OF THEM ON?
	JMP I (DIR	/YES - LIST A DIRECTORY
	TAD I (MPARAM
	RTL
	AND (40		/"I" SWITCH ROTATED TWO LEFT
	SZA CLA
	JMP I (IMAGE	/IMAGE MODE TRANSFER
	TAD I (7617	/MUST PRESERVE THE LINK
	SNA CLA		/V3 IMAGE MODE ALLOWS NO INPUT FILE
	JMP PIP		/TERMINATE HERE IF NO INPUT SIDE
	SZL CLA		/"B" SWITCH IN LINK
	JMP I (BINARY	/BINARY MODE TRANSFER

	/DEFAULT MODE OF TRANSFER IS ASCII

ASCII,	TAD I (MPARAM+1
	AND L20
	DCA COPTSW
	TAD COPTSW
	JMS I (ASCI2	/TEST FOR OUTPUT DEVICE
	JMS I (OUTOPN
	JMS I (IOPEN	/OPEN THE INPUT FILES
	DCA AEOFFG	/ZERO THE END-OF-FILE FLAG
	JMS I (LEADER
	JMP I (ASCIGO

	/ENTRY ON END OF INPUT
ASCEOF,	SPA CLA		/WAS IT END OF INPUT OR AN INPUT ERROR?
PER4,	JMS I (PIPERR
	4
	ISZ AEOFFG	/SET END-OF-INPUT FLAG
	JMP EOL		/PROCESS LAST LINE (IF ANY)
AEOFFG,	0
	/SUBROUTINE TO OUTPUT RUBOUTS AFTER FORM CONTROL CHARACTERS
RUBOUT,	0		/UNLESS OUTPUT IS TO A DIRECTORY DEVICE
	DCA TEMP	/STORE COUNT
	JMS I (OTYPE	/GET TYPE OF OUTPUT DEVICE
	SPA CLA
	JMP I RUBOUT	/DIRECTORY DEVICE - DON'T BOTHER
RBTLP,	TAD CHAR
	TAD (-214
	SNA CLA		/IS THE FORM CONTROL CHAR A FORM-FEED?
	IAC		/YES - OUTPUT BLANK TAPE INSTEAD
	TAD (377
	DCA I XR	/PUT IN BUFFER
	ISZ TEMP
	JMP RBTLP		/LOOP FOR THE REQUISITE COUNT
	JMP I RUBOUT
COPTSW,	0

DEND,	SPA CLA
	JMP PER4
	JMP ACLOSE
	PAGE
	*3200
	/ASCII PROCESSOR CONTINUED

ASCIGO,	TAD (ABUF-2
	DCA XR
	DCA I XR	/PROTECT AGAINST NULL LINE WITH "T" OPTION
	DCA COLCT	/ZERO COLUMN COUNTER FOR TAB CONVERSION
ACHLP,	JMS I (ICHAR	/GET A CHARACTER
	JMP I (ASCEOF	/END OF INPUT OR WORSE
	AND (177	/MASK OUT PARITY BIT
	SZA		/IGNORE BLANK TAPE AND LEADER/TRAILER
	TAD (-177
	SNA
	JMP ACHLP	/DITTO RUBOUTS
	TAD (377	/FORCE COLUMN 8 ON
	DCA CHAR
	TAD CHAR
	TAD (-216
	CLL
	TAD ASCI5
	SNL		/IS THE CHARACTER A FORM CONTROL CHARACTER?
	JMP CINSRT	/NO
	TAD ASCJMP	/YES - GO TO APPROPRIATE ROUTINE
	DCA .+1
	HLT
ASCJMP,	JMP I .+1
	TAB
	LFEED
	VTAB
	FFEED
	CARRET
CINSRT,	7600		/GRP 2 CLA
	TAD CHAR
ADCAXR,	DCA I XR	/STORE THE CHARACTER IN THE LINE BUFFER
	ISZ COLCT	/ALWAYS BUMP THE COLUMN POINTER
TESTXR,	TAD XR
	TAD (-ABUF-226
	SPA CLA		/HAS THE BUFFER OVERFLOWED?
	JMP ACHLP	/NO - GET NEXT CHARACTER
	JMS I (PIPERR
	1
TAB,	TAD I (COPTSW
	SNA CLA		/DO WE WANT TO CONVERT?
	JMP TABRBT	/NO
TABLP,	TAD (240
	DCA I XR	/OUTPUT A SPACE
	ISZ COLCT
	TAD COLCT
	AND (7
	SZA CLA		/IS THE COLUMN COUNTER A MULTIPLE OF 8?
	JMP TABLP	/NOT YET
	JMP TESTXR	/YES - CHECK BUFFER OVERFLOW
TABRBT,	TAD CHAR
	DCA I XR
	CLA CMA
	JMS I (RUBOUT	/TWO RUBOUTS FOLLOW A TAB
	JMP TESTXR	/CHECK FOR BUFFER OVERFLOW
VTAB,	TAD I (COPTSW
	SZA CLA		/SHOULD WE CONVERT?
	JMP VTLF	/YES
	TAD CHAR
	DCA I XR
	TAD (-4
	JMS I (RUBOUT	/FOUR RUBOUTS AFTER A VERTICAL TAB
	JMP I (EOL
FFLF,	TAD (-4		/NINE LINE FEED SIMULATE A FORM FEED
VTLF,	TAD (-5		/FIVE LINE FEEDS SIMULATE A VERTICAL TAB
	DCA TEMP
	TAD (212
	DCA I XR
	ISZ TEMP
	JMP .-3
	JMP I (EOL	/FORM FEED AND VERTICAL TAB ARE LINE ENDERS
FFEED,	TAD I (COPTSW
	SZA CLA		/SHOULD WE CONVERT?
	JMP FFLF	/YES
	TAD CHAR
	DCA I XR
	TAD (-11	/NINE RUBOUTS AFTER A FORM FEED
	JMS I (RUBOUT
	JMP I (EOL
CARRET,	TAD I (MPARAM
	RTL
	SMA CLA		/"C" SWITCH MEANS DELETE TRAILING BLANKS FROM CARDS
	JMP NOTOPT	/IT WASN'T ON
TOPT,	TAD XR
	DCA TEMP
	TAD I TEMP
	TAD (-240
	SZA CLA		/WAS THE LAST CHAR ON THE LINE A SPACE?
	JMP NOTOPT	/NO
	CLA CMA
	TAD XR		/YES - BACK UP THE LINE POINTER
	DCA XR
	JMP TOPT
NOTOPT,	TAD CHAR
	DCA I XR	/STORE THE CARRIAGE RETURN IN THE BUFFER
	JMP TESTXR	/CARRIAGE RETURN IS NOT A LINE TERMINATOR
COLCT,	0

OUTOPN,	0
	JMS I (OOPEN
	SMA CLA
	JMP I OUTOPN
	JMS I (PIPERR
ASCI5,	5
	PAGE
	/SUBROUTINES CALLED BY THE REST OF PIP

K770,	770		/** DON'T MOVE THIS CONSTANT
DELETE,	0
	TAD P7600
	DCA DPFILE
	CLA CLL CMA RTL
	DCA CHAR	/MAXIMUM OF THREE OUTPUT FILES
DELOOP,	TAD (7201
	DCA DLHNDL
	TAD I DPFILE
	SNA		/DOES THIS FILE EXIST?
	JMP I DELETE	/THAT'S ALL
	JMS I C200
	1		/ASSIGN HANDLER FOR THE DELETION
DLHNDL,	0
	HLT
	TAD I DPFILE	/RELOAD DEVICE NUMBER FOR DELETE
	ISZ DPFILE	/BUMP DPFILE TO POINT TO THE FILE NAME
	JMS I C200	/DEVICE NUMBER IN AC
DP4,	4		/CLOSE - USED AS DELETE IN THIS CASE
DPFILE,	0		/POINTER TO FILE NAME
	0		/ZERO LENGTH FOR DELETE
	JMS I (PIPERR	/FILE WASN'T THERE TO BE DELETED
	3
	TAD DPFILE
	TAD DP4
	DCA DPFILE
	ISZ CHAR
	JMP DELOOP	/DELETE AS MANY FILES AS HE LISTED(UP TO 3)
	JMP I DELETE
DZERO,	0		/SUBROUTINE TO ZERO THE DIRECTORY OF THE
			/FIRST OUTPUT DEVICE
	JMS I (OTYPE
	CLL RTL
	SZL		/IS DEVICE READ-ONLY?
	JMP OZERR	/YES - ERROR
	RTR
	AND K770	/MASK OUT DEVICE TYPE
	CLL RTR
	RAR
	TAD (DEVLEN	/USE IT TO INDEX A TABLE OF DEVICE LENGTHS
	DCA PIPERR
	TAD I PIPERR
	SNA
	JMP I DZERO	/DEVICE LENGTH ZERO MEANS NON-DIRECTORY DEVICE
	DCA PIPERR	/STORE LENGTH
	TAD (OUDEVH+1
	DCA OZHNDL
	TAD I P7600
	JMS I C200
	1		/ASSIGN DEVICE, FETCH HANDLER
OZHNDL,	0
	HLT
	TAD I (MPARAM+2	/IF /Y ON, DO SYSTEM ZERO
	SPA CLA
	JMP ZRO70
	TAD OZHNDL	/BUT IF NOT, CHECK FOR SYSTEM ZERO
	TAD (-7607
	SZA CLA
	JMP ZRO70+1	/NOT SYSTEM FILES BEGIN AT 7
	JMS I (CONFRM	/ASK IF HE'S SURE
	SYSZRO		/V3
ZRO70,	TAD (61
	TAD (7
	DCA I (DFORG
	DCA I (SQFLAG	/AND CLEAR OUT SQUISHES
	TAD PIPERR
	TAD I (DFORG
	DCA I (DLENGT
	JMS I (GETEQ
	DCA I (DWASTE	/DEFINE # OF WASTE WORDS
	DCA I (MPARAM+3	/KILL = OPTION FOR FUTURE /I TRANSFERS
	CIF 0
	JMS I OZHNDL
	5410		/V3 OUTPUT 6 BLOCKS FROM FIELD 1
	DIRECT
	1		/ALL DIRECTORIES ARE IN RECORD 1
OZERR,	JMS I (PIPERR	/ERROR WHILE ZEROING DIRECTORY
	2
	DCA OLDDIR	/ZERO DIRECTORY POINTER TO FORCE A NEW READ
	JMP I DZERO
PIPERR,	0
P7600,	7600		/V3 CLA
	JMS I (SRSTOR	/RESET 07600!
	CDF 10		/JUST IN CASE
	TAD I PIPERR	/GET ARG
	TAD (ERRTBL
	DCA TEMP
	TAD I TEMP
	JMS I (ERPRNT
	JMP I (PIP	/RESTART PIP

LEADER,	0
	JMS I (OTYPE
C200,	AND K770	/GET THE TYPE OF THE OUTPUT DEVICE
	TAD (-PTP	/IS IT A PAPER TAPE PUNCH?
	SZA CLA
	JMP I LEADER	/NO
	TAD P7600
	DCA TEMP
	JMS I (OCHAR	/PUT OUT SOME LEADER
	JMP I (AOUERR
	ISZ TEMP
	JMP .-3
	JMP I LEADER
	PAGE
	/TABLE OF DEVICE LENGTHS FOR /Z OPTION

DEVLEN,	0;0;0;0;0;1520	/RK08 (1520= - DECIMAL 3248)
	6000;4000;2000;0001	/RF08 IN VARIOUS SIZES
			/(CHEATS A BLOCK ON LARGEST TO KEEP IT NON-ZERO)
	7601;7401;7201;7001	/DF32 IN VARIOUS SIZES
				/(CHEATS A BLOCK TO AVOID HARDWARE TROUBLE)
	6437;6437		/DECTAPE AND LINCTAPE
	ZBLOCK 1	/MAGTAPE WILL BE 20
	6437		/TD8E WILL BE 21
	0
	1520		/ 1/2 OF AN RK8E IS 23
	ZBLOCK 54	/ALL THE REST


FIXLEN,	0		/ROUTINE TO ESTIMATE OUTPUT FILE LENGTH
	TAD I (7600
	AND (7760
	SZA CLA		/DID THE USER PROVIDE AN ESTIMATE?
	JMP I FIXLEN	/YES - USE IT
	DCA CHAR
	TAD (7617
	DCA TEMP
FIXLP,	TAD I TEMP	/GET NEXT INPUT FILE
	SNA
	JMP FIXOVR	/NO MORE INPUT FILES
	AND (7760
	CIA CLL		/GET LENGTH AS A POSITIVE NUMBER
			/(LENGTH OF ZERO TURNS LINK ON)
	TAD CHAR
	DCA CHAR	/UPDATE CUMULATIVE LENGTH
	SZL CLA		/DID CUMULATIVE LENGTH OVERFLOW 256 BLOCKS?
	JMP I FIXLEN	/YES - CAN'T ESTIMATE IT
	ISZ TEMP
	ISZ TEMP
	JMP FIXLP
FIXOVR,	TAD CHAR
	TAD I (7600
	DCA I (7600	/STICK LENGTH IN OUTPUT FILE DESCRIPTOR
	JMP I FIXLEN
NOYES,	TEXT	/NO/
	TEXT	/YES/

CONFRM,	0
	TAD I (MPARAM+1
	RTL		/'O' BIT TO SIGN
	SPA CLA
	JMP GOTCON	/V3 'O' MEANS OK, ASSUME 'YES'
	TAD I CONFRM	/V3
	JMS I (ERPRNT
	KSF
	JMP .-1
	JMS I (CTCTST
	KRB		/LOOK AT HIS REPLY
	AND (177	/IGNORE PARITY TTY
	TAD (-"Y!7600	/V3
	SNA CLA		/IS IT YES?
	ISZ SQFLAG	/SET SQFLAG TO 1 (NEEDED 1 LATER)
	TAD SQFLAG	/USE SQFLAG AS INDEX FOR MESSAGE
	CLL RAL
	TAD (NOYES
	JMS I (ERPRNT
	TAD SQFLAG
	SNA CLA
	JMP I (PIP
CNFMXT,	ISZ CONFRM
	JMP I CONFRM

GOTCON,	ISZ SQFLAG	/SET SQFLAG
	JMP CNFMXT	/AND TAKE SKIP EXIT
	PAGE
	/DIRECTORY PRINTER FOR PIP
	MDATE=7666

DIRPRE,	JMS I (OUTOPN	/OPEN THE OUTPUT FILE
	TAD (ABUF
	DCA CHAR	/ABUF WILL BE A TEMPORARY ARRAY OF STARTING FILES
	TAD (7617
	DCA TEMP
	TAD I (7617
	SNA
	JMS I (DSKNUM
	DCA I (7617	/DEFAULT DIRECTORY IS DSK:
DFUJLP,	TAD I TEMP
	SNA		/ARE WE THROUGH WITH THE INPUT DEVICES?
	JMP GETDIR	/YES
	AND (17
	DCA I TEMP	/ONLY THE DEVICE NUMBER IS IMPORTANT
	TAD I TEMP
	TAD (DCB-1
	DCA PRWD
	CLA CLL CML RTL
	TAD TEMP
	DCA INFPTR	/THIS SERVES NO FUNCTION EXCEPT IMPROVING ERROR MESSAGES
	TAD I PRWD
	SMA CLA		/IS THE DEVICE A DIRECTORY DEVICE?
	JMS I (PIPERR	/NO
	6
	ISZ TEMP
	TAD I TEMP
	DCA I CHAR	/SAVE THE STARTING BLOCK NUMBER
	CLA IAC
	DCA I TEMP	/READ FROM THE DIRECTORY
	ISZ TEMP
	ISZ CHAR
	JMP DFUJLP
GETDIR,	TAD (ABUF
	DCA CHAR
	JMS PCRLF
	TAD I (MDATE
	JMS I (PDATE
	JMS PCRLF
	JMS I (IOPEN	/RESET POINTERS - WERE GONNA FAKE OUT THOSE "GENERAL"
			/ROUTINES
	JMP I (NXTDIR
PRWD,	0		/ROUTINE TO PRINT SIXBIT TEXT
	SNA		/IS COUNT ZERO?
	CMA		/MAKE IT ONE
	DCA PRCT	/STORE COUNT
PRWDLP,	TAD I PRWD
PR212,	RTR
	RTR
	RTR
	JMS PR6BIT
	TAD I PRWD
	JMS PR6BIT
	ISZ PRWD
	ISZ PRCT
	JMP PRWDLP
	JMP I PRWD
PRCT,	0
PR6BIT,	0
	AND (77
	SZA
	TAD (240	/V3
	AND (77		/V3
	TAD (240	/V3
	JMS I (OCHAR
	JMP I (AOUERR
	JMP I PR6BIT
PRNUM,	0
	DCA PRWD
	DCA TEMP
	TAD (PWRTEN
	DCA PCRLF
PRNMLP,	DCA PR6BIT
	TAD I PCRLF
	SNA
	JMP PRLAST	/V3
	CLL
	TAD PRWD
	SNL
	JMP .+4
	DCA PRWD
	ISZ PR6BIT
	JMP PRNMLP+1
	CLA
	TAD PR6BIT
	TAD TEMP
	SNA
PBLJMP,	JMP PRBLNK	/INCREMENTED BY PDATE TO KILL LEADING BLANKS
	TAD (260
	JMS PR6BIT
	CLA CLL CML RAR
	DCA TEMP
	ISZ PCRLF
	JMP PRNMLP
PRBLNK,	JMS PR6BIT
	JMP .-3
PRLAST,	TAD PRWD	/V3
	TAD (260	/V3
	JMS PR6BIT	/V3
	JMP I PRNUM	/V3
PCRLF,	0
	TAD (215
	JMS I (OCHAR
	JMP I (AOUERR
	TAD PR212
	JMS I (OCHAR
	JMP I (AOUERR
	JMP I PCRLF

PWRTEN,	-1750;-144;-12;0	/V3
	PAGE
	/MAIN DIRECTORY PRINTING LOOP

NXTDIR,	JMS I (ICHAR	/FAKE, FAKE
	JMP I (DEND
	CLA		/WE DON'T WANT THE CHARACTER
	DCA ECOUNT
	TAD (INBUF-1	/WE WANT THE BUFFER!
NEWSEG,	DCA XR
	CDF 0
	TAD I XR
	DCA DCOUNT	/NUMBER OF ENTRIES
	TAD DCOUNT
	CLL
	TAD (100
	SNL CLA
	JMS I (PIPERR
	11
	TAD I XR
	DCA BLOKNO	/FIRST BLOCK OF FILE STORAGE
	TAD I XR
	DCA DLINK	/LINK TO NEXT SEGMENT
	ISZ XR		/BUMP XR PAST FLAG WORD
	TAD I XR
	DCA WASTE
NAMELP,	CDF 0
	TAD I XR
	SNA		/WHAT TYPE OF ENTRY IS IT?
	JMP DEMPTY	/A FREE FILE
	DCA NAME1	/A PERMENANT OR TENTATIVE FILE
	TAD I XR
	DCA NAME2
	TAD I XR
	DCA NAME3
	TAD I XR
	DCA NAME4
	TAD I XR
	DCA DDATE
	TAD WASTE	/COMPENSATE FOR THE DATE INCREMENT
	CMA		/AND THE WASTE WORDS
	TAD XR
	DCA XR
	TAD I XR
	SNA		/IS IT A TENTATIVE FILE?
	JMP ADDLEN+1	/YES - TENTATIVE FILES ARE ALWAYS IGNORED
	CIA
	DCA FLENGT	/NO - STORE THE LENGTH
	CDF 10
	TAD I CHAR	/GET THE STARTING FILE FOR THIS LISTING
	CIA CLL
	TAD BLOKNO
	SNL CLA		/ARE WE THERE YET?
	JMP ADDLEN	/NO - KEEP GOING
	CLA CLL CMA RTL
	JMS I (PRWD	/PRINT THREE WORDS
NAME1,	0
NAME2,	0
NAME3,	0
	TAD NAME4
	SNA CLA		/IS THERE AN EXTENSION?
	TAD (-16	/NO - PRINT A BLANK
	TAD (56		/YES - PRINT A PERIOD
	JMS I (PR6BIT
	JMS I (PRWD
NAME4,	0		/ZERO PRINTS AS TWO MORE BLANKS
PRLNGT,	TAD DTYPE
	AND (100
	SZA CLA		/WAS THE LISTING SWITCH /F?
	JMP PRTCRL	/YES - DON'T PRINT LENGTH
	TAD FLENGT
	JMS I (PRNUM
	TAD WASTE
	SZA CLA
	TAD DDATE
	JMS I (PDATE	/PRINT THE CREATION DATE OF THE FILE
PRTCRL,	JMS I (PCRLF
ADDLEN,	TAD FLENGT
	TAD BLOKNO
	DCA BLOKNO	/UPDATE BLOCK NUMBER
	ISZ DCOUNT
	JMP NAMELP	/LOOP UNTIL ALL FILES ARE PROCESSED
	TAD DLINK
	SNA CLA		/MULTI-SEGMENT DIRECTORY?
	JMP ENDDIR	/NO - FINISH UP
	TAD XR
	AND (7400
	TAD (377	/BUMP XR TO NEXT BLOCK
	JMP NEWSEG	/PROCESS NEXT LINK
DEMPTY,	TAD I XR
	CIA
	DCA FLENGT	/STORE LENGTH OF FREE ENTRY
	CDF 10
	TAD FLENGT
	TAD ECOUNT
	DCA ECOUNT	/BUMP COUNT OF FREE BLOCKS
	TAD DTYPE
	AND (200
	SNA CLA		/IS THE /E SWITCH ON?
	JMP ADDLEN	/NO - DON'T LIST FREE FILES
	TAD (-4
	JMS I (PRWD
	TEXT	/<EMPTY>/
	JMS I (PR6BIT
	TAD FLENGT
	JMS I (PRNUM
	JMP PRTCRL
ENDDIR,	ISZ CHAR	/BUMP TEMP ARRAY TO NEXT ENTRY
	TAD ECOUNT
	JMS I (ENDFUJ
	JMP NXTDIR
	PAGE
/BINARY MODE PROCESSOR FOR PIP

BIN360,	360
BINARY,	JMS I (FIXLEN
	JMS I (OUTOPN
	JMS I (IOPEN
	JMS I (LEADER	/PUT OUT BLANK TAPE IF HS PUNCH OUTPUT
	JMS LTCODE
NEWTAP,	JMS I (ICHAR
	JMP BEOF		/END OF FILE ON INPUT
	SNA
	JMP NEWTAP	/BLANK TAPE - KEEP GOING
	TAD BN7600
	SZA CLA
	JMP NEWTAP
	JMS I (ICHAR
	JMP BEOF
	TAD BN7600
	SNA
	JMP .-4
	TAD BIN200
	DCA CHAR
	TAD CHAR
BIN200,	AND BIN360
	TAD (-240	/CHECK TYPE OF TAPE
	SNA		/IS IT RELOCATABLE?
	JMP RELBIN	/YES
	TAD (-40	/IF A FIELD SETTING, IT'S ABSOLUTE
	AND (7700
	SNA
	JMP ABSLUT
	TAD BIN200	/CHECK FOR ORIGIN ALSO
	SZA CLA
	JMP NEWTAP	/NOTHING..NEXT FRAME
ABSLUT,	CLA CMA
	JMS LTCODE
ABSBIN,	JMS RCOPY1	/COPY THIS FRAME AND READ NEXT
	TAD BN7600
BNM140,	SZA CLA		/IS IT TRAILER?
	JMP ABSBIN	/NO - KEEP GOING
BEOT,	CLA CMA		/END OF TAPE
	JMS LTCODE	/PUT OUT SHORT LEADER/TRAILER
	JMP NEWTAP	/GET NEXT TAPE
LTCODE,	0		/SUBROUTINE TO PUNCH 200 CODE
	SMA		/SHORT LEADER/TRAILER?
	JMS I (OTYPE
	SPA CLA		/DIRECTORY DEVICE?
	TAD (70	/YES
	TAD (-100
	DCA TEMP
LTLOOP,	TAD BIN200
	JMS I (OCHAR	/OUTPUT 64 OR 8 FRAMES OF L/T CODE
	JMP I (AOUERR
	ISZ TEMP
	JMP LTLOOP
	JMP I LTCODE

RELBIN,	TAD (SKP
	DCA I (INCTZF	/DISABLE CONTROL-Z CHECKING ON INPUT
	CLA CMA
	JMS LTCODE	/PUT OUT SHORT LEADER/TRAILER
RELLP,	TAD CHAR
	RTR
	RTR
	AND (17
	TAD (RELTBL
	DCA TEMP
	TAD I TEMP	/GET DATA WORD FOR THIS FRAME
	SMA SZA		/POSITIVE MEANS SPECIAL OR ERROR
	JMP RELERR
RELSNA,	SNA
	JMP RELEND	/ZERO MEANS CHECKSUM FRAME
	DCA TEMP	/NEGATIVE MEANS COUNT OF NUMBER OF SLAVE FRAMES
	JMS RCOPY1
BN7600,	7600
	ISZ TEMP
	JMP .-3	/COPY THIS FRAME AND ALL SLAVE FRAMES
	JMP RELLP	/GET NEXT CONTROL FRAME
RELEND,	JMS RCOPY1	/COPY THE FIRST FRAME OF THE CHECKSUM
	JMS I (OCHAR
	JMP I (AOUERR	/OUTPUT THE SECOND FRAME
	JMP BEOT	/END TAPE - START NEXT ONE
BEOF,	JMS LTCODE
	JMS I (OCLOSE
	JMP I (AOUERR
	JMP I (PIP
RCOPY1,	0		/ROUTINE TO ADVANCE "CHAR" TO NEXT INPUT CHARACTER
	TAD CHAR
	JMS I (OCHAR
	JMP I (AOUERR
	JMS I (ICHAR
	JMP INEFER
	DCA CHAR
	TAD CHAR
	JMP I RCOPY1
INEFER,	SMA CLA		/DETECT FATALITIES
	JMS I (PIPERR
	7
	JMS I (PIPERR		/A REAL BAD READ
	4

RELERR,	CLL RAR
	SZA CLA		/CODE OF 1 MEANS SPECIAL
	JMS I (PIPERR	/ILLEGAL RELOCATABLE INPUT
	10
	JMS RCOPY1
	CLL CML CMA RTL	/MULTIPLY NAME COUNT BY -6 (APPROXIMATELY)
	TAD CHAR
	CLL CML RAL	/(ACTUALLY THIS PRODUCES -6X-1 WHICH IS WHAT WE WANT)
	JMP RELSNA
	PAGE
ERPRNT,	0		/ERROR MESSAGE PRINTOUT ROUTINE
	DCA TEMP
ERLP,	TAD I TEMP
	RTR
	RTR
	RTR
	JMS ERPCH	/PRINT HIGH-ORDER CHARACTER
	TAD I TEMP
	JMS ERPCH	/PRINT LOW-ORDER CHARACTER
	ISZ TEMP
	JMP ERLP

ERPCH,	0
	AND (77
	SNA
	JMP ERCRLF	/0 CHARACTER TERMINATES
	JMS CHPRNT
	JMP I ERPCH
FILENR,	TAD ("#
	JMS I (TTYOUT
	TAD INFPTR	/GET PTR TO CURRENT INPUT FILE
	TAD (321	/MAGIC NUMBER
	CLL RAR
	JMP FILENR-2

CHPRNT,	0
	TAD (-37	/IS IT A _?
	SNA
	JMP FILENR	/YES..PRINT FILE NUMBER
	IAC
	SNA 		/MAYBE ^?
	JMP I (SQFILE	/YEP..PRINT FILE NAME
	SPA
	TAD (100
	TAD (236
	JMS I (TTYOUT
	JMP I CHPRNT

ERCRLF,	TAD (215
	JMS I (TTYOUT
	TAD (212
	JMS I (TTYOUT
	JMP I ERPRNT
PDATE,	0		/PRINTS THE DATE
	SNA
	JMP I PDATE	/NO DATE TO PRINT
	DCA ERPRNT
	ISZ I (PBLJMP
	JMS I (PR6BIT
	TAD ERPRNT
	CLL RTL
	RTL
	RAL
	AND (17
	JMS I (PRNUM
	TAD (57
	JMS I (PR6BIT
	TAD ERPRNT
	RTR
	RAR
	AND (37
	JMS I (PRNUM
	TAD (57
	JMS I (PR6BIT
	TAD ERPRNT
	AND (7
	TAD (106
	JMS I (PRNUM
	CLA CMA
	TAD I (PBLJMP
	DCA I (PBLJMP	/RESET PRNUM TO PRINT LEADING SPACES
	JMP I PDATE

DSKNUM,	0
	DCA DSKNAM+1
	JMS I (200
	12
DSKNAM,	5723
	0
	0
	HLT
	TAD DSKNAM+1
	JMP I DSKNUM
RELTBL,	-2;-2;2;-10;-2;-2;-2;2;0;2;-2;2;2;2;2;1

ERRTBL,	ERR0
	ERR1
	ERR2
	ERR3
	ERR4
	ERR5
	ERR6
	ERR7
	ERR8
	ERR9
	ERR10
	ERR11
	PAGE
/ERROR MESSAGE TEXT GOES HERE


ERR0,	TEXT	/NO ROOM FOR OUTPUT FILE/
ERR1,	TEXT	/LINE TOO LONG IN FILE_/
ERR3,	TEXT	/ERROR DELETING FILE/
ERR4,	TEXT	/INPUT ERROR, FILE_/
ERR5,	TEXT	/CAN'T OPEN OUTPUT FILE/
ERR6,	TEXT	/DEVICE_ NOT A DIRECTORY DEVICE/
ERR7,	TEXT	/PREMATURE END OF FILE, FILE_/
ERR8,	TEXT	/ILLEGAL BINARY INPUT, FILE_/
ERR9,	TEXT	/BAD DIRECTORY ON DEVICE_/
ERR10,	TEXT	/DIRECTORY ERROR/


TTYOUT,	0
	TLS
	TSF
	JMP .-1
	CLA
	JMP I TTYOUT
	PAGE
/SQUISH PROCESSOR

SQUISH,	JMS I (CONFRM
	SURE		/V3
SQUISX,	DCA I (OUELEN	/INITIALIZE PARAMS TO FAKE OUT "IMTRA"
	DCA I (OUBLK
	DCA I (7621	/ZERO SECOND FILE FOR "INNEWF"
	DCA I (CTCFLG
	JMS I (IOPEN
	JMS I (INNEWF
	JMP I (PIP	/NO INPUT
	TAD (OUDEVH+1
	DCA SOHND
	TAD I SQ7600
	SNA
	JMP I (PIP	/NO OUTPUTEE, NO SQUISHEE
	JMS I (200
	1
SOHND,	0
	HLT
	JMS INTEST
	JMS I (OTYPE
	CLL RTR
	RAR
	AND (77
	TAD (DEVLEN
	DCA TEMP
	TAD I TEMP	/GET ENTRY FROM DEVICE LENGTH TABLE
	DCA OUDLEN	/SAVE OUTPUT DEVICE LENGTH
	JMS GETEQ
	DCA OUWAST
	TAD SOHND
	DCA OHNDLR
	TAD OHNDLR
	DCA I (OUHNDL
	TAD I (INHNDL
	DCA IHNDLR
	JMS SETCTC
	JMS I (CTCFLG
	CIF 0
	JMS I IHNDLR
	1400
	0
	1
	JMP I (SQIDER+1
	CIF 0
	JMS I (7607
	5400
	0
	MTEMP		/MOVE THE INPUT DIRECTORY TO SYS:
	JMP I (SQIDER+1
	CLA IAC
	DCA I (SQBUF2+2
	DCA I (CTCFLG
	TAD SOHND	/SETUP DIRECTORY START
	JMS I (SQDTST
	JMS I (SETSAM	/IF IHNDLR=OHNDLR, SAME=1
	CLA CMA
	DCA I (SQBUF2
	DCA I (OUTSEG
	JMP I (NEWOUT

GETEQ,	0		/V3
	TAD I (MPARAM+3
	SNA
	IAC
	AND (77		/CONVERT 0 TO 1 AND 100 TO 0
	CIA
	JMP I GETEQ

INTEST,	0		/TEST IF INPUT IS DIRECTORY
	TAD I (7617
	AND (17
	TAD (DCB-1
	DCA TEMP
	TAD I TEMP
	SMA CLA
	JMS I (PIPERR
	6
	JMP I INTEST

SETCTC,	0		/MODIFY 07600 TO RETURN TO SQCTLC
	TAD CDIF10
	CDF 0
	DCA I SQ7600
	TAD (5602	/JMP I .+1
	DCA I (7601
	TAD (SQCTLC
	DCA I (7602
CDIF10,	CIF CDF 10
	JMP I SETCTC
OUK,	0		/V3 ON IMAGE MODE TRANSFER
			/CLOSE OUT FILE WITH = OPTION
			/IF NOT TOO SMALL
	TAD I (OUCCNT
	CLL CIA
	TAD I (MPARAM+3
	SNL		/IS = OPTION LARGER?
SQ7600,	7600		/RETURN OUCCNT IF IT'S LARGER
	TAD I (OUCCNT	/RETURN LOW ORDER = OPTION IF IT'S LARGER
	JMP I OUK
	PAGE
NEWIN,	TAD (MTEMP-1
	DCA INSEG
	JMS I (CTCFLG
	CIF 0
	JMS I (7607
	0210
S7200,	SQBUF2
INSEG,	0
	JMP I (SQIDER
	DCA I (CTCFLG
	TAD I (SQBUF2+1
	DCA INBLK
	TAD (SQBUF2+4
	DCA INXR
SGETIN,	TAD I INXR
	SNA
	JMP SEMPTY
	DCA I OUTXR
	TAD OUTXR
	DCA OUSAVE
	JMS I (CYWAST	/COPY WASTE WORDS
	TAD I INXR
	DCA RECCNT
	TAD RECCNT
	SNA
	JMP SNULL
	CMA CLL		/V3
	TAD OUTBLK
	TAD OUDLEN
	SZL CLA
	JMP SNULER
	TAD RECCNT
	DCA I OUTXR
	CLA CMA
	TAD I (SQBUF1
	DCA I (SQBUF1
	TAD INBLK
	CIA
	TAD OUTBLK
	SNA CLA
	TAD SAME
	SNA CLA
MOVFIL,	JMS I (SQTRA	/MOVE THE FILE DOWN
	TAD RECCNT
	CIA
	TAD OUTBLK
	DCA OUTBLK
	TAD RECCNT
DMTX,	CIA
	TAD INBLK
	DCA INBLK
	TAD OUTXR
	CIA
	TAD OUWAST
	TAD OUWAST
	TAD (SQBUF1+365
	SMA CLA		/DO WE HAVE ROOM FOR TWO MORE ENTRIES?
	JMP NEXTIN

	/DIRECTORY SEGMENT OVERFLOW ON OUTPUT...

	ISZ I (OUTSEG
	TAD I (OUTSEG
	IAC
	DCA I (SQBUF1+2	/STORE LINK TO NEXT SEGMENT
	TAD I (SQBUF1+2
	TAD (-7
	SMA CLA
	JMP I (SQIDER-1	/TOO MANY SEGMENTS
	JMS I (OUTDIR	/OUTPUT THIS SEGMENT
NEWOUT,	TAD (SQBUF1-1
	DCA OUTXR	/INITIALIZE XR FOR NEXT OUTPUT SEGMENT
	DCA I (OUTINH	/ZAP ANY OLD OUTPUT INHIBIT FLAG
	DCA I OUTXR
	TAD OUTBLK
	DCA I OUTXR
	DCA I OUTXR
	DCA I OUTXR
	TAD OUWAST
	DCA I OUTXR
NEXTIN,	ISZ I S7200
	JMP SGETIN
	TAD I (SQBUF2+2
	SNA		/ANY MORE INPUT SEGMENTS?
	JMP I (SQOVER
	JMP NEWIN
SNULER,	TAD (NOROOM
	JMS I (ERPRNT
SNULL,	CLA CMA
	TAD OUSAVE
	DCA OUTXR
	JMP DMTX-1
SEMPTY,	TAD I INXR
	JMP DMTX
OUSAVE,	0
SURE,	TEXT	/ARE YOU SURE?/

SETSAM,	0
	TAD IHNDLR
	CIA
	TAD OHNDLR
	SNA CLA
	IAC
	DCA SAME
	JMP I SETSAM
	PAGE
SQOVER,	DCA I OUTXR
	TAD OUDLEN
	TAD OUTBLK
	SNA
	JMP CKZERO
	DCA I OUTXR
	CLA CMA
	TAD I (SQBUF1
	DCA I (SQBUF1
CKZERO,	TAD I (SQBUF1
	SZA CLA
	JMP ZEROK
	CLA CLL CML RAR
	JMS OUTDIR	/READ IN LAST DIRECTORY
	DCA I (SQBUF1+2	/ZERO OUT LINK WORD
	SKP
ZEROK,	ISZ OUTSEG
	JMS OUTDIR
ZEROKS,	JMS SRSTOR
	JMP I (PIP

	DCA I (SQBUF1+2
SQIDER,	JMS OUTDIR
	JMS SRSTOR
	JMS I (PIPERR
	12
OUTDIR,	0
	TAD (4210
	DCA .+4
	JMS CTCFLG
	CIF 0
	JMS I OHNDLR
	0
	SQBUF1
OUTSEG,	0
	JMP SQIDER+1
	DCA CTCFLG
	JMP I OUTDIR

SQIOER,	TAD (IOMSG
	JMS I (ERPRNT
	JMP I (SLGRET
SQCTLC,	KCC		/JUMPED TO BY CODE AT 07600
	JMS I (TSTSAM	/TEST IF OPERATION IS TO ITSELF 
	TAD (CTCMSG
	JMS I (ERPRNT
	TAD CTCFLG
	SZA CLA
	JMP I CTCFLG
	TAD I (MPARAM+1	/IS IT /S?
	AND (40
	SNA CLA
	JMP I (SYSCPY	/NO../Y
	JMP I (MOVFIL

SRSTOR,	0
	JMS I (7700	/MAKE SURE MONITOR IS IN CORE
	10
	DCA .-2		/AND WIPE THE CALL AWAY
	TAD (4207
	CDF 0
	DCA I (7600
	TAD (5000
	DCA I (7601
	DCA I (7602
	CDF 10
	JMP I SRSTOR

CTCFLG,	0
	JMP I CTCFLG
CTCMSG,	TEXT	/SORRY - NO INTERRUPTIONS/
IOMSG,	TEXT	/I-O ERROR IN ^ - CONTINUING/
NOROOM,	TEXT	/NO ROOM IN ^ - CONTINUING/
	PAGE
K7760,	7760
SYSCOP,	TAD K7622		/SET INFPTR IN CASE OF /Y ERROR
	DCA INFPTR	/WILL FILE #1
	JMS I (SETCTC	/KLUDGE UP 07600
SYSCPY,	TAD (INDEVH+1
	DCA YIHAND	/SET TO ASSIGN INPUT HANDLER
	TAD (OUDEVH+1
	DCA YOHAND
	TAD (1600
	DCA K1600	/THIS MAY GET CLOBBERED READING IN DIRECT.
	TAD (7
	DCA OFSET
	TAD I K7617
	SNA CLA		/IS THERE AN INPUT DEVICE?
	ISZ I K7617	/MAKE INPUT =SYS
	JMS I (INTEST	/SEE IF OPERATIONS ARE TO SAME DEVICE
	TAD I K7617
	JMS I K200	/ASSIGN HANDLER
	1
YIHAND,	0
K7622,	7622	/THINLY DISGUISED HALT
	TAD I K7617
K200,	AND K7760	/CHECK INPUT FILE LENGTH
	SNA		/IF BLANK,INPUT SYSTEM HEAD
	JMP I (YTSOUT
	TAD (-6340	/CHECK FOR PROPER LENGTH
	SZA CLA
	JMP PER13	/ERROR..NOT SYSTEM HEAD
	TAD I (7601	/IS THERE OUTPUT DEVICE?
	SZA CLA		/IF YES..WE CAN DO IMAGE XFER
	JMP I (IMGTST
	TAD I (7620
YOUSYS,	DCA YINREC	/PICK UP STARTING RECORD
	CIF 0
	JMS I YIHAND	/READ IN FIRST INPUT RECORDS
K1600,	1600
	OUBUF
YINREC,	0
	JMP I (PER4	/INPUT ERROR
	TAD I (7620	/IF INPUT FROM A FILE, OPEN
	SZA CLA		/A HOLE FOR OUTPUT DIRECTORY
	JMS I (MOVE	/DO A CORE MOVE
	JMS I (TSTHED	/TEST FOR VALID SYSTEM HEAD
	TAD YINREC
	TAD OFSET	/BUMP TO NEXT RECORD
	DCA NXTRD
	TAD I (7600	/IF NO OUTPUT, FORGET IT
	SNA
	JMP PIPCLR	/RESET AND GO TO PIP
	JMS I K200
	1
YOHAND,	0
	HLT		/V3
	JMS I (FAKE
	JMS I (SETSAM
	JMS I (TSTIO	/TEST OUTPUT. SEE IF DIRECT. DEV.
	CIF 0
	JMS I YOHAND	/READ OUTPUT DIRECTORY INTO PLACE
	1400
	400
	1
	JMP I (PER4
	CDF 0
	TAD I (401	/NOW TEST FOR VALID OUTPUT DEVICE
	CDF 10
	TAD (-10	/IF LESS THAN 10, DON'T XFER
	SPA CLA
	JMS I (PIPERR
	11
	TAD (-4
	DCA YINREC	/XFER COUNTER

YDUMP,	TAD (7200	/CONTROL WORD FOR OUTDMP
	JMS I (OUTDMP	/WRITE THE BUFFER
	JMP I (AOUERR
	CIF 0
	JMS I YIHAND	/READ NEXT
K3200,	3200
	OUBUF
NXTRD,	0
	JMP I (PER4
	TAD NXTRD
	TAD (15
	DCA NXTRD
	ISZ YINREC	/DONE YET?
	JMP YDUMP	/NOT YET..LOOP
	TAD (5000
	JMS I (OUTDMP	/WRITE ONLY PARTIAL BUFFER
	JMP I (AOUERR
PIPCLR,	JMS I (SRSTOR	/CLEAR OUT 07600
	JMP I (PIP
YNOOUT,	TAD K3200	/SET TO READ IN DIRECTORY
	DCA K1600	/PLUS FIRST 7 RECORDS
	TAD (15		/AND RESTART READ AT RECORD 15
	DCA OFSET
	JMP YOUSYS
OFSET,	0

PER13,	JMS I (PIPERR
	13
K7617,	7617		/V3
	PAGE
DIRECT,	-1
DFORG,	0		/FILE STORAGE
	0
	0
DWASTE,	0		/#WASTE WORDS
	0
DLENGT,	0

MOVE,	0
	TAD (5000	/MOVES CORE TO OPEN DIRECTORY HOLE
	DCA TEMP
	TAD (377
	DCA INXR
	TAD (3377
	DCA OUTXR
	CDF 0
	TAD I INXR
	DCA I OUTXR
	ISZ TEMP
	JMP .-3
	CDF 10
	JMP I MOVE

ERR11,	TEXT	/BAD SYSTEM HEAD/

YTSOUT,	TAD I (7601	/IS THERE AN OUTPUT FILE?
	SNA CLA		/IF NO, XFER TO 0-70
	JMP I (YNOOUT
	TAD I (7617	/O.K. SETUP CD AREA FOR IMAGE XFER
	TAD (7760	/FROM SYSTEM AREA OF INPUT DEVICE
	DCA I (7617
	TAD I (7617
	AND (17
	TAD (6360
	DCA I (7621
	TAD K7
	DCA I (7622
IMGTST,	DCA SAME	/ALLOW ^C IF TO OUTPUT FILE
	TAD I (YIHAND	/TEST FOT VALID SYSTEM
	DCA IHNDLR
	CIF 0
	JMS I IHNDLR
	0200
	3400
K7,	7
	JMP I (PER4
	JMS I (TSTHED
	JMP I (IMAGE
TSTSAM,	0
	TAD SAME	/IF /Y IS TO SAME DEVICE AS INPUT (SYS)
	SNA CLA		/^C GIVES MESSAGE AND RETRIES OPERATION
	JMP I (ZEROKS
	JMP I TSTSAM

ERR2,	TEXT	/OUTPUT ERROR/

SQFILE,	DCA MWAST
	TAD I (OUSAVE
	DCA TSTSAM	/IF ERROR DURING /S
	DCA DWASTE
	CLA CLL CMA RTL
	DCA MOVE	/-3 FOR FILE NAME
SQFIL3,	TAD I TSTSAM	/FIRST 2 CHARS. IN NAME
	CLL RTR
	RTR
	RTR
SQFIL5,	AND (77
	SZA		/IF ZERO, DON'T BOTHER
	JMS I (CHPRNT
	ISZ DWASTE	/RIGHT HALF OR NEW WORD?
	JMP SQFIL4	/RIGHT HALF
	ISZ TSTSAM
	ISZ MOVE	/EXHAUSTED ALL?
	JMP SQFIL3	/NOPE
	TAD MWAST	/DONE WITH IT YET?
	SZA CLA
	JMP I (FILENR-1	/YES
	TAD I TSTSAM	/IS THERE AN EXTENSION?
	SNA CLA
	JMP I (FILENR-1	/NO..CONTINUE ORIGINAL MSG
	TAD (256
	JMS I (TTYOUT
	ISZ MWAST	/SIGNAL END
	CLA CMA
	JMP SQFIL3-1
SQFIL4,	CLA CMA
	DCA DWASTE
	TAD I TSTSAM	/GET RIGHT HALF
	JMP SQFIL5
MWAST,	0
	DCA TEMP
	TAD I INXR
	DCA I OUTXR	/ROUTINE TO COPY WASTE WORDS
	ISZ TEMP
	JMP .-3
	JMP I MWAST
	PAGE
FAKE,	0
	TAD I (YIHAND
	DCA IHNDLR
	TAD I (YOHAND
	DCA OHNDLR
	DCA I (OUCCNT
	DCA I (OUBLK
	DCA I (OUELEN
	TAD I (YOHAND
	DCA I (OUHNDL
	JMP I FAKE

CYWAST,	0		/ROUTINE TO COPY WASTE WORDS
	CLA CLL CMA RTL	/THREE MORE FOR FILE NAME
	JMS I (MWAST	/COPY THEM
	TAD I (SQBUF2+4	/NOW ADJUST I/O WASTE WORDS
	CIA
	TAD OUWAST	/DIFF. BETWEEN OUT AND IN WORDS
	SMA		/IF <0, MORE OUT THAN IN
	JMP CGEWST	/POS. MORE IN THAN OUT (OR SAME)
	DCA TEMP1
	TAD I (SQBUF2+4
	SZA
	JMS I (MWAST	/COPY ALL INPUT WORDS
	DCA I OUTXR	/AND 0 ALL EXTRA OUTPUT WORDS
	ISZ TEMP1
	JMP .-2
	JMP I CYWAST
CGEWST,	DCA TEMP1
	TAD OUWAST	/XFER ONLY ENOUGH OUTPUT WDS.
	SZA
	JMS I (MWAST
	TAD INXR
	TAD TEMP1	/POINT INPUT TO NEXT FILE
	DCA INXR
	JMP I CYWAST

TSTHED,	0		/TESTS FOR KEYBOARD MONITOR
	CDF 0
	TAD I (3401
	CDF 10
	TAD (-7200
	SZA CLA
	JMP I (PER13	/IF NOT CLA, NOT VALID
	JMP I TSTHED
TSTIO,	0		/SEE IF OUTPUT IS DIRECTORY DEVICE
	JMS I (OTYPE	/GET DCB WORD FOR OUTPUT
	SMA CLA		/IF NOT NEG., NOT DIRECT DEVICE
	JMS I (PIPERR
	5
	TAD OHNDLR	/IF OUTPUT=SYS, SET NO INTERRUPT
	TAD (171
	SNA CLA
	ISZ SAME
	JMP I TSTIO

ASCI2,	0		/SEE IF VALID ASCII OUTPUT
	DCA TSTIO
	TAD I (7600
	SNA CLA
	JMP I (PIP	/NO..BACK TO PIP
	TAD TSTIO	/SEE IF /C IS ON
	SNA CLA
	JMS I (FIXLEN	/NO..TRY TO ESTIMATE OUTPUT
	JMP I ASCI2

SQDTST,	0		/ROUTINE TO CHECK /S DIRECTORIES
	DCA NOHND	/PRESERVE POSSIBLE SYS ON OUTPUT
	TAD (7		/DEFAULT TO BLOCK 7
	DCA OUTBLK	/INITIAL GUESS
	CDF 10		/NOW TRY TO READ DIRECTORY OF OUTPUT
	JMS I (OTYPE	/IF NON-FILE, DON'T READ IT
	SMA CLA
	JMP P1A
	CIF 0		/COULD BE NON-FILE, HOWEVER.
	JMS I NOHND
	0210
	1400
P1,	1
	JMP I (SQIDER+1	/ERROR IN READ
P1A,	DCA OLDDIR	/WIPES ANY DIRECT. SEGMENT
	TAD I (1401
	TAD (-70	/IS OUTPUT A SYS DEVICE?
	SNA CLA
	JMP SYSDIR	/YES.
	TAD NOHND	/IS OUTPUT THE SYSTEM DEVICE?
	TAD (171
	SZA CLA
	JMP .+3
SYSDIR,	TAD (70
	DCA OUTBLK
	JMP I SQDTST

NOHND=FAKE

SYSZRO,	TEXT /ZERO SYS?/
AOUERR,	SMA CLA		/WAS IT A DEVICE ERROR OR ARE WE OUT OF SPACE?
	JMP BOUERR	/OUT OF SPACE
PER2,	JMS I (PIPERR
	2
BOUERR,	JMS I (PIPERR
	0
	PAGE
/THIS IS ONCE-ONLY CODE

ONCE,	0
	STA
	TAD ONCE
	DCA ONCENF
	TAD (20
	DCA I ONCENF	/RESTORE L20, DON'T ALLOW REENTRY
	TAD I (MPARAM+1
	AND (7
	SNA CLA		/IS /V SET?
	JMP I ONCE	/NO, RETURN
	TAD (VER	/YES
	JMS I (ERPRNT	/PRINT VERSION NUMBER
	JMP I ONCE	/RETURN

VER,	TEXT	\OS/8 PIP V9 \
ONCENF,	0
	PAGE
	$