	.TITLE DPE.
/COPYRIGHT 1969, 1970, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
	/9--27--70	(EDIT 14) 
/RP09/15 ADAPTATION 8-17-70 (W.A.DESIMONE)
/M. SIFNAS
/9-16-69 (TIMING BUG, REMOVAL OF XX ON IOPS15)
/P OLYNK (.MTAPE DELETE 7-28-69)
/ 4-9-68 (IOPS 23 5-8-68)(56 FILES 5-8-68)
/(EOF 5-22-68) (PARITY 6-3-68)
/DPE.=IOPS DECTAPE-DISK HANDLER-READ, WRITE, ALL MODES
/ALL FUNCTIONS EXCEPT .MTAPE
/1-256 WD. BUF.
/1 FILE BIT MAP (32 WDS) + 1 DIRECTORY BIT MAP (32 WDS)
/1 FILE ACTIVE AT ANY GIVEN TIME
/CALLING SEQUENCE
/CAL+.DAT SLOT(9-17)+I(7-8)/.INIT
/UNIT (0-2)+1
/RESTART ADDR. (ONLY MEANINGFUL FOR TTY HANDLER)
/BUF SIZE (255)
/CAL+X(6-8)+.DAT SLOT (9-17) /.OPER	(X=1=.DLETE)
/UNIT (0-2)+2		(X=2=.RENAM)
/			(X=3=.FSTAT)
/DIR TYPE(0-2)=1+CORE ADDR. (3-17)
/CAL+.DAT SLOT (9-17)  /.SEEK
/UNIT (0-2)+3
/USER DIRECTORY ENTRY POINTER
/SAME AS .SEEK(FUNCTION=4) /.ENTER
/CAL+.DAT SLOT (9-17)  /.CLEAR
/UNIT(0-2)+5
/CAL+.DAT SLOT(9-17)  /.CLOSE
/UNIT(0-2)+6
/CAL+SUBFUNCTION(5-8)+.DAT SLOT /.MTAPE (0=REWIND)            (ILLEGAL FUNCTION)
/UNIT(0-2)+7			(2=BACKSPACE RECORD)  (ILLEGAL FUNCTION)
/CAL+D.M.(6-8)+.DATSLOT(9-17)  /.READ
/UNIT (0-2)+10
/LINE BUF ADDR
/-WC OF L.B. (2'S COMP)
/SAME AS .READ(FUNCTION=11)  /.WRITE
/CAL+.DAT SLOT(9-17)	/.WAIT
/UNIT(0-2)+12
/CAL+1000+.DAT SLOT(9-17)		/.WAITR
/UNIT(0-2)+12
/15BIT BUSY ADDR
/CAL+Y(7)+X(8)+.DAT SLOT (9-17) /.TRAN	(X=0=READ)(Y=0=FORWARD)
/UNIT (0-2)+13			(X=1=WRITE) (Y=1=REVERSE)
/BLOCK#
/CORE ADDRESS
/-WC
/
	.EJECT
	.GLOBL	DPE.
IDX=ISZ
/IOT ASSIGNMENTS
DPCS=706324		/CLEAR ST. (BITS 13,17,18 OF ST A)
		/(BITS 9-15 OF ST B)
DPLF=706464	/LOAD ST A  BITS 0-8
DPLA=706304	/LOAD CYLA,HA,SA FROM AC
DPCA=706344	/LOAD CA REG. FROM AC (3-17)
DPWC=706364	/LOAD WC REG. FROM AC
DPRSA=706312	/READ ST A INTO AC
DPRU=706412	/READ CA REG. INTO AC (BITS 10-17)
DPSJ=706341	/SKIP ON JOB DONE FLAG
DPSE=706361	/SKIP ON ERROR FLAG
DPCN=706454	/EXECUTE FUNC. REG.  AC CLEARED
DPRA=706432	/READ CYA,HA,SA INTO AC
DPRC=706452	/READ CA REG. INTO AC (3-17)
DPRW=706472	/READ WC REG. INTO AC
DPRSB=706332	/READ ST B INTO AC
DPLO=706444	/LOAD AC ONES INTO ST. A (BITS 0-8)
DPSA=706321	/SKIP ON ATTENTION FLAG
	.IFUND	DELTA
DELTA=5
	.ENDC
DPE.	DAC	DTCALP		/CAL POINTER
	DAC	DTARGP		/ARG. POINTER
	LAW	7000
	AND*	DTCALP		/(6-8) TO (15-17)
	RAR!CLL
	RTR
	RTR
	RTR
	RTR
	DAC	DTCT		/T STORE DATA MODE OR SUBFUNCTION
	ISZ	DTARGP		/INDEX TO FUNCTION (AND UNIT#)
	LAC*	DTARGP
	AND	DTUMSK
	DAC	DTUNIT		/T. SAVE UNIT# (BITS 0-2).
	LAC*	DTARGP		/FUNCTION (3-17)=1-13
	ISZ	DTARGP		/INDEX TO ARG.3
	AND	DLIT77
	TAD	(JMP DTTABL
	DAC	DTTABL
	CLA			/AC MUST=0 FOR DISPATCH
DTTABL	XX
	JMP	DTIN	/1=.INIT
	JMP	DTOPER	/2=.OPER
	JMP	DTSEEK	/3=.SEEK
	JMP	DTENTR	/4=.ENTER
	JMP	DTCLER	/5=.CLEAR
	JMP	DTCLOS	/6=.CLOSE
	JMP	DTER6	/7=.MTAPE
	JMP	DTREAD	/10=.READ
	JMP	DTWRIT	/11=.WRITE
	JMP	DTWAIT	/12=.WAIT,.WAITR
	JMP	DTAPE	/13=.TRAN
DTBUSY	LAC	DTCALP		/BUSY-DTA I/O GOING ON
	DAC	DTARGP		/RETURN TO USER CAL
	JMP	DTDBK
/I/O UNDERWAY CHECK SUBR.
DTIOU	0
	LAC	DTUND		/I/O UNDERWAY
	SZA			/NO
DTBUSB	JMP	DTBUSY		/WAIT
	LAC	DTWRWT		/CONTINUE MORE I/O
	SZA!CMA
	JMP*	DTWRWT		/YES
	JMP*	DTIOU		/OK-EXIT
/
/DTA-DISK-INTERRUPT SERVICE
/
DTPIC	DAC	DTAC		/SAVE AC
	LAC*	(0
	DAC	DOUT		/SAVE PC, LINK, EXT, MODE, MEM, PTCT.
	LAC	DTION
	JMP	DTSTON
DTINT	JMP	DTPIC		/PIC ENTRY
	DAC	DTAC		/API ENTRY, SAVE AC
	LAC	DTINT		/SAVE PC, ETC.
	DAC	DOUT
	IORS			/CHECK PIC STATUS
	SMA!CLA			/FOR RESTORATION AT DISMISSAL
	LAW	17740		/PIC OFF, BUILD IOF
	TAD	DTION		/PIC ON, BUILD ION
DTSTON	DAC	DTDVSW
/RP15 DISK STATUS REGISTER "A" BIT ASSIGNMENTS
/	0-2=SELECTED UNIT
/	3-5=FUNCTION
/	0=IDLE,1=READ,2=WRITE,3=RECALIBRATE
/	4=SEEK,5=READ ALL,6=WRITE ALL, 7=READ COMPARA
/	6=DONE AND ERROR FLAG INTERRUPT ENABLED
/	7=ATTENTION FLAG INTERRUPT ENABLED
/	8=GO
/	9=WRITE PROTECT ERROR
/	10=NON-EXISTENT CYLINDER ADDRESS
/	11=NON-EXISTENT SURFACE ADDRESS
/	12=NON-EXISTENT SECTOR ADDRESS
/	13=HEADER NOT FOUND
/	14=SELECTED UNIT IS WRITE PROTECTED
/	15=SELECTED UNIT IS SEEK INCOMPLETE
/	16=JOB DONE FLAG
/	17=ERROR FLAG
/RP15 DISK STATUS REGISTER "B" BIT ASSIGNMENTS
/	0-7=ATTENTION UNITS 0-7
/	8=SELECTED UNIT IS UNSAFE
/	9=PROGRAM ERROR
/	10=END OF PACK
/	11=TIMING ERROR
/	12=FORMAT ERROR
/	13=WRITE CHECK ERROR
/	14=WORD PARITY ERROR
/	15=LONGITUDINAL PARITY ERROR
/	16=SELECTED UNIT SEEK UNDERWAY
/	17=SLECTED UNIT NOT READY
/
/
	DPRSA			/READ DISK STATUS
	DAC	DKSET		/TEMP STORAGE OF STATUS WORD.
	RAR!CLL
	SZL
	JMP	DTERT		/ERR. FLAG
RFRDWT	DPCS	/CLEAR STATUS
	LAC DKSET	/GET ST A FOR RP UNIT#
	AND (700000)		/MASK AND ISSUE AND IDLE TO CLEAR
	DPLF	/JOB DONE AND ERR INTERR. ENABLE
DTION	ION			/ION TO ALLOW OTHER INTERRUPTS.
	DZM	DTUND		/CLEAR I/O UNDERWAY
DTUMSK	LAW	-400
	DAC	DWORD
	LAC RPCABS	/BASE CYL. ADDR. FROM INIT
	DAC RPCACK	/INIT CYL. ADDR. FRO BLK 100 TEST
RPCM10	LAW -10		/SET COUNTER
	DAC RPCT1
	LAC DTBLC
	AND RPHSMK	/MASK HA,SA
	SAD RPA100	/IS HA,SA = 6,4?
	SKP
	JMP DTION1
DTION3	LAC DTBLC
	AND RPL776	/(776000
	SAD RPCACK
	JMP DTION2	/LOG. BLK# 100 TRANSFERRED
	LAC RPCACK	/ADD 3 CYLA TO CHK ANOTHER LOG UNIT#
	TAD (6000
	DAC RPCACK
	ISZ RPCT1	/BUMP CNT - CHECK ONLY 8 UNITS
	JMP DTION3
DTION1	CLC
	JMP DTDISM
DTION2	LAC DTDRGT	/CHECK DIR. REQ. SWITCH
	SZA!CLC
	JMP DTDISM
	DAC	DTDRGT		/CLEAR
	LAC	DTUNIT
	DAC	DTNCOR		/SET DIRIN CORE SW
	JMP	DTDISM		/DATA OK, DISMISS
DTERT	LAC DKSET	/RELOAD ST. A
	AND (24
	SZA	/AC NON-0 IF SEEK INCOMP. OR HEADER 
	JMP RPRCL	/NOT FOUND-RECALIBRATE AND RETRY
	LAC DKSET
	AND (340	/AC>0 IF NON-EXIST. DISK ADDR.
	SZA
	JMP DTER21
	LAC DKSET
	AND (400)	/TEST WRITE PROT. ERR
	SZA
	JMP DKIPS4	/IOPS4
	DPRSB	/LOAD ST. B
	DAC RPSTB
	AND (34)	/AC >0 IF LONG.,WORD PARITY,WRITE CHK.,
	SZA		/WRITE CHK. SHOULD NEVER HAPPEN
	JMP DPARIT	/RETRY AND PASS DATA ANYWAY
	LAC RPSTB
	AND (140)	/IF AC>0 FORMAT ERROR OR TIMING ERR.
	SZA		/RETRY.  IF FAILS, IOPS 12 PLUS STATUS B
	JMP RP12RT
	LAC RPSTB
	AND (200)	/END OF PACK IF AC>0
	SZA
	JMP DTER21	/IOPS 21- ILLEGAL DISK ADDRESS
RPER12	LAC RPSTB	/PRINT OUT ST B. FALLS THROUGH HERE ON
	DAC* DLIT3	/PROGRAM ERR. OR SELECTED UNIT UNSAFE.  IOPS 12
	CLA
	JMP DTER12
DKER20	LAC	DKSET		/DISK STATUS.
	DAC*	DLIT3		/(.MED
	LAW	20
	JMP	DTM4		/DISK FAILURE.
RPRCL	LAC (30000	/LOAD RECAL. FUNCT.AND RETRY
	XOR RPUNIT
	DPLF
	DPRSB		/2 INSTRUCS. FOR 4 MICROS DELAY
	DPRSB
	DPSA	/TEST ATTENTION FLAG
	JMP .-1
	ISZ DTERCT
	JMP DRETRY	/GO RETRY
	JMP DKER20	/DISK FAILURE
DKIPS4	LAC (DRETRY
	DAC* DLIT3
	LAC DLIT4
	JMP DTM4
DTER21	LAC DKSET
DTR21A	DAC* DLIT3
	LAW	21		/ILLEGAL DISK ADDRESS.
	JMP	DTM4
RP12RT	ISZ DTERCT	/RETRY ROUT. FOR FORMAT OR TIMING ERROR
	JMP DRETRY
	JMP RPER12	/IOPS 12
DPARIT	ISZ	DTERCT		/IF OVERFLOW, TAKE DATA ANYWAY
	SKP
	JMP	RFRDWT		/TAKE DATA ANYWAY.
DRETRY	JMS	DKSET		/REISSUE DISK READ (TRY 10 TIMES).
	LAC	DTERCT		/0 IF RETRY COUNT OVERFLOWS
	DAC	DTUND		/I/O UNDERWAY SW.
DTDISM	LAC	(JMP DTPIC	/RESTORE PIC INTERR. ENTRY
	DAC	DTINT
	LAC	DTAC		/RESTORE AC
DTDVSW	XX			/ION IF PIC, LAC DTAC IF API
	DBR
	XCT .+1
	XCT .+1
	JMP*	DOUT		/INTERR. EXIT
/
/INIT DTA ROUTINE - MAINSTREAM
DTIN	ISZ	DTARGP		/INDEX TO BUF. SIZE ARG.
	LAC	(377		/RETURN 255 AS BUF. SIZE
	DAC*	DTARGP
	LAC	DTCT		/I OR O
	DAC	DTIOSW		/OUTPUT=1, INPUT=0
	ISZ	DTARGP		/INDEX TO NORM. EXIT
	LAC	DLMBIT		/(DTMBIT) = FILE BIT MAP POINTER
	JMS	DTBFC2		/CLEAR FILE BIT MAP (L=0)
DTONCE	CAL	64		/API CORE ADDR.-MODIFIED
/DTONCE+1 TO DTSTOP EXCLUSIVE USED FOR TEMP. STORE. AFTER 1ST .INIT
/EXCEPT FOR CONSTANTS
/INDICATED IN RP ADAPTATION
/DTAC=AC STORAGE CELL DURING INTERRUPT
/DOUT=INTERRUPTED RETURN ADDRESS
/DTERCT=PARITY COUNTER (INIT. TO-10)
/DTBLC=BL# BEING SEARCHED FOR
/DTNXBK=BL.# TO BE TRANSFERRED
/RPAC1- TEMP LOC
/DTDTR=TRANSFER DIRECTION SWITCH, 0=F,-1=R
/DTCCA= CURRENT ADDRESS (CA) POINTER FOR TRANSFER
/DTCNBK= DATA LINK (NEXT BLOCK NUMBER).
/DTCURE= DIRECTORY PNTR TO CURRENT FILE ENTRY EXAMINED.
/DTDMOD= DATA MODE (15-17)
/DTEOF= EOF SWITCH: -0=EOF.
/DTFPCT= FILE POSITION COUNTER.
/DTFILE= FILE ORIENTATION SWITCH: 0=FILE, -0=NON-FILE.
/DTHPT= DTA BUFFER LINE HEADER PNTR(INDEXED).
/DTHPTS= DTA BUFFER LINE HEADER PNTR (INDEXED).
/DTMTRX= CURRENT BIT MAP WORD POINTER.
/DTPONT= CURRENT FILE BIT MAP WORD POINTER.
/DTWREX= 0=NO WRITE EXECUTED, NON-0=EXECUTED.
/DTCKSM= LINE CHECKSUM
/DTMPAS= PASS COUNT (0-4) ,MTAPE.
/DTSBIT= -(MATRIX WORD).
/DTWMCT= BIT MAP WORD COUNT.
/DKNUM= DISK NUMBER.
/DKUNIT= NUMBER PLATTERS ON SYSTEM.
/DTWRWT= CONTINUED I/O SWITCH (0=DONE, NON-0=CONTINUE).
/DTWC= 2'S COMP TRANSFER WORD COUNT.
/DBLKLC= 24 OR 56 FILE SWITCH (50=24,1=56).
DTAC	16			/.SETUP
DOUT	DPSJ	/SKIP ON JOB DONE FLAG
DTCCA	DTINT			/DTA INT. SERV. ADDR.
RPCABS	CAL 64
RPUNIT	16
	DPSE		/SKIP ON ERROR FLAG
RPCACK	DTINT
DTCNBK	JMP	DTDMOD
DTERCT	0
DTBLC	0
DTCURE	0
/	REGS. FOR RP ADAPTATION
/	USED AS CONSTANTS AND SHOULD NOT BE MODIFIED
RPL776	776000	/CYK ADDR. MASK
RPL770	770
RPL700	700
RPL070	70
RPCABP	2000	/BUMP CYLA CONST.  ALSO USED IN DTSET ROUT.
RPHABP	40	/BUMP HA CONST.  ALSO USED IN DTDRIN ROUT.
RPA100	304	/HA=6,SA=4
RPHSMK	1777		/MASK HA,SA
/
DTDMOD	LAC	DJSTOP
DTDTR	DAC	DTONCE
DTNXBK	LAS		/READ AC SWITCHES
RPAC1	AND RPL770	/DRIVE #(9-11) SUPER UNIT# (12-14)
DTWRWT	DAC RPAC1	/MASK BITS 9-14 AND STORE
DKNUM	AND RPL700	/MASK BITS 9-11
DTEOF	JMS DTMPAS	/AND SET UP RP UNIT#
DKUNIT	RTL	/TOTAL ROT LEFT 9
DTFPCT	DAC RPUNIT
DTWC	LAC RPAC1
DTFILE	AND RPL070	/MASK BITS 12-14
DTHPT	DAC RPAC1	/STR. SUPUNT# TIMES 10(8)
DTHPTS	RAL!CLL	/NOW TIMES 20(8)
DTMTRX	TAD RPAC1	/NOW TIMES 30(8)- THAT IS
DTPONT	JMS DTMPAS	/30(8)XSUPUNT#=20(8)XSUPUNT#+10(8)SUPUNT#
DBLKLC	RTL	/TOTAL OF 10 SHFTS
RPCT1	RAL
DTWREX	DAC RPCABS	/STORE BASE CYL. ADDR.
DTCKSM	JMP DTSTOP
DTMPAS	0
DTSBIT	RAL!CLL
DTWMCT	RTL
RPTEMP	RTL
	RTL
RPSTB	JMP* DTMPAS
DTBMIN=DTFAKE			/BIT MAP BLOCK IN SWITCH (NON0=IN)
DTBMOT=DTFAKE+1			/BIT MAP BLOCK OUT SWITCH (NON0=OUT)
/STOP DTA ROUTINE
DTSTOP	DZM	DTWRWT		/CLEAR OUTPUT WAIT SWITCH
	DZM	DTEOF		/CLEAR EOF SWITCH
	DZM	DTCLSS		/SET CLOSE SWITCH
	DZM	DTSKNT		/CLEAR .SEEK, ENTER SWITCH
	DZM	DTWREX		/CLEAR WRITE  EXECUTED SWITCH
	DZM	DTBMIN		/BIT MAP IN SWITCH (FOR CLOSE)
	DZM	DTBMOT		/BIT MAP OUT SWITCH (FOR CLOSE)
	LAC	DTMTP4		/JMP DTAPE1
	DAC	DTOUT
	DAC	DTNCOR		/CLEAR DIR. IN CORE SWITCH
	LAC	DTWRCL		/INIT DUMP MODE WRITE
	DAC	DTDUMX		/TO CLEAR OUT BUF (JMS DTBUFC)
	JMP DTDBK-1
/WAIT DTA ROUTINE
DTWAIT	SAD DTCT			/1 IF .WAITR
	JMP DTDBK-1		/0 IF .WAIT
	LAC (700000		/LINK,ETC
	AND DTCALP
	DAC DTCALP
	LAC* DTARGP		/15 BIT BUSY ADDR
	AND (77777
	XOR DTCALP
	ISZ DTARGP
	DAC DTCALP
	JMS	DTIOU		/CHECK I/O UNDERWAY
DTDBK	DBR
	XCT .+1
	XCT .+1
	JMP*	DTARGP		/NORM. EXIT
	.EJECT
/.OPER ROUTINE INTERPRETS
/.DLETE (SUBFUNCTION 1)
/.RENAME (SUBFUNCTION 2)
/.FSTAT (SUBFUNCTION 3)
DTOPER	LAC	DTDLUN		/DELETE OR RENAM UNDERWAY
	SZA			/NO, IF 1ST PASS THRU
	JMP	DTLET3		/YES
	JMS	DTCKCL		/CHECK DIRECTORY FOR THIS FILE
	DAC	DTNXBK		/SAVE FOR 0 AC WHEN NOT FOUND
	SNA
	JMP	DTFST		/NOT FOUND-RETURN WITH AC=0
	XCT	DTSK5		/PICK UP 1ST BLK# OF FILE
	XOR	(400000		/CLEAR FILE COMPLETE BIT
	DAC	DTNXBK		/1ST BLK# OF FILE
	LAC	DTCT		/SET UP SUBFUNCTION DISPATCH
	TAD	(JMP DTOPTB
	DZM	DTESAV		/SETUP FOR DELETE
	DZM	DTESAV+1
	DZM	DTESAV+2
	DZM	DTESAV+3
	DAC	DTOPTB-1
	LAW	-4
	TAD	DTCT		/CHECK SUBFUNCTION
	SPA!CLA			/1-3 LEGAL ONLY
	XX			/DISPATCH TO SUBFUNCTION
DTOPTB	JMP	DTER6		/ILL. HANDLER FUNCTION
	JMP	DTLET		/1= .DLETE
	JMP	DTREN		/2=.RENAM
DTFST	LAC*	DTARGP		/3=.FSTAT
	XOR	(100000		/RETURN TYPE (1 IN 0-2)
	DAC*	DTARGP 		/TO USER
	LAC	DTNXBK		/PICK UP BL#, RETURN TO USER IN  AC
	DZM	DTCLSS
	JMP	DTAPE1
/.RENAM ROUTINE
DTREN	JMS	DTNTRZ		/NEW NAME INTO DTESAV
	XCT	DTSK5		/GET 4TH WD OF OLD ENTRY
	XCT	DTNTR3		/SAVE IN DTESAV+3
	DAC	DTBMIN		/NO NEED TO RERECORD
	DAC	DTBMOT		/FILE BIT MAPS
	.EJECT
/.DELETE ROUTINE
DTLET	CLC
	DAC	DTNCOR
	DAC	DTDLUN		/SET DELETE UNDERWAY SWITCH
	DAC	DTIOSW		/SIMULATE WRITE
	DAC	DTWREX		/USE .CLOSE TO MODIFY
DTLET3	ISZ	DTARGP		/INDEX ENTRANCE ARG. POINTER
	JMP	DTCLOS		/FILE BIT MAP+DIRECTORY
/CHECK DIRECT. IN CORE SUBR.
DTDRCK	0
	JMS	DTIOU		/I/O UNDERWAY
	LAC	DTNCOR		/D IN 
	SAD	DTUNIT		/NO
	JMP	DTDRC1		/YES - CHECK PARITY
DTDRC2	LAC	(13000		/READ PARAM
	JMS	DTDRIN		/BRING IN DIRECTORY
	JMP	DTDRCK+1		/WAIT FOR DIRECTORY
DTDRC1	LAC	DTERCT		/DIRECTORY UNACCEPTABLE WITH PARITY ERR.
	SZA
	JMP*	DTDRCK
DTER61	LAW	61		/DIRECTORY OR FILE BIT MAP PARITY ERROR
	JMP	DTM4
/CALL IN DIRECTORY SUBR.
DTDRIN	0
	DAC	DTTR		/TRANSFER DIRECTION SWITCH
	LAC	DLT100		/(100
	DAC	DTNXBK		/BL# TO TRANSFER
	DZM	DTDTR		/TRANSFER FORWARD
	DZM	DTDRGT
	LAC	DTCLSS		/0 IF SEEK, ENTER
	SZA
	LAC	RPHABP		/NOT 0 IF CLOSE (DTBUF-1
	TAD	DLTDIR		/(DTRDIR-1
	JMS	DTWCS		/SETUP WC,CA
	JMP*	DTDRIN
DTDRGT	777777			/GET DIR INDIC. (+0=GET)
/DIRECTORY SEARCH SUBR.
DTSK1	0
	DAC	DTUDRR		/USER DIR. ENTRY POINTER
	DZM	DTDTR		/SET TRANSF. DIRECTION=FORWARD
	CLC			/SYSTEM TAPE?
	XOR* DLTSYS		/WD3 0F SYS BIT MAP
	SNA!CLA			/NO, 56 FILES
	LAW -30			/YES, 24 FILES MAX
	SMA
	LAW -70
	DAC	DTFPCT
	XOR (777700			/777700
	DAC DBLKLC		/50 IF 24;10 IF 56
	LAC	DLTBUF		/DIR. POINTER=DTDIR+40=DTBUF
DTSK3	DAC	DTDES		/ENTRY SECTION POINTER
	DAC	DTCURE		/CURR. ENTRY, WD0, POINTER
	.EJECT
/NEXT FILE NAME ENTRY
	LAC	DTUDRR		/USER DIR. ENTRY POINTER
	DAC	DTUDRP
	LAW	-4
	DAC	DTCT1S		/MATCH COUNT
	DAC	DTCTS		/COUNT OF ENTRY WDS TO CHECK
	ISZ	DTCTS
/NEXT WORD OF CURRENT ENTRY
DTSK5	LAC*	DTDES		/DTA DIR. ENTRY (D.E.)
	SAD*	DTUDRP		/USER D.E.
	ISZ	DTCT1S		/WD N OF ENTRY MATCHES
	ISZ	DTDES		/NEXT WD OF DTA ENTRY
	ISZ	DTUDRP		/NEXT WD OF USER ENTRY
	ISZ	DTCTS		/ENTRY WD COUNT
	JMP	DTSK5		/CONT. MATCH CHECK
DTSK6	LAC	DTCURE
	ISZ	DTCT1S		/MATCH
	SKP			/N
	JMP*	DTSK1		/YES-1ST BL# IN AC
	TAD	DLIT4		/INDEX TO NEXT ENTRY
	ISZ	DTFPCT		/INDEX FILE ENTRY CT.
	JMP	DTSK3		/NEXT ENTRY
	CLA
	JMP*	DTSK1		/YES-CAN'T FIND FILE NAME
/
/CLOSE FILE SUBR
DTCLOS	JMS	DTIOU		/I/O UNDERWAY WAIT
	LAC	DTIOSW		/I OR O
	SNA
	JMP	DTSTOP		/INPUT-CLEAR SWITCHES EXIT
	LAC	DTWREX		/ANYWRITE EXECUTED AFTER .ENTER
	SZA
	JMP	DTCLS2		/YES
	JMS	DTCBIT		/NO-CLEAR BIT FROM MAPS
	JMP	DTSTOP
DTCLS2	LAC	DTEOF		/EOF BUF IS OUT
	SPA!CLC
	JMP	DTCLS3
	DAC	DTEOF		/SET EOF SWITCH
	DZM	DTCT		/FAKE DATA MODE=IOPS BIN
	LAC	(15000		/OUTPUT
	JMS	DTMCK
	LAC	DLEOFH		/EOF HEADER POINTER (DTEOFH
DTROOM	377			/DUMP MODE BUF SIZE(INIT=377)
/PRECEDING LINE=FAKE ARG,USED AS VARIABLE
	JMP	DTWRT1
	.EJECT
DTCLS3	LAC	DTBMIN		/CHECK IF FILE BIT MAP IS IN
	SZA!CLC
	JMP	DTCLS4
	DAC	DTBMIN		/SET BIT MAP IN SWITCH
	LAW -50			/START WITH BLK 77 IF 56 FILES,73 IF 24
	TAD DBLKLC		/50 IF 24;10 IF 56
	SNA!CLA			/56
	LAW -4			/24
	TAD DLIT77
DTCLT	DAC	DTNXBK		/BIT MAP BLOCK #
	LAC	DTFPCT		/FILE COUNT
	TAD	(10
	DAC	DTFPCT
	SMA!CLC
	JMP	DTCLQ		/IN THIS BLOCK
				/DECR. BIT MAP BLOCK # BY 1
	TAD	DTNXBK
	JMP	DTCLT
DTCLQ	LAC	DTBUSB
	DAC	DTOUT
	DZM	DTDTR		/SET TRANSF. DIRECT. SWITCH TO FORW.
	LAC	(13000
DTCLQ1	DAC	DTTR
	JMP	DTCOUB		/READ BIT MAP BLOCK INTO BUF. AREA
DTCLS4	LAC	DTBMOT		/FILE BIT MAP BLOCK OUT
	SZA!CLA
	JMP	DTCLS6
	SAD	DTERCT		/SET BIT MAP OUT SWITCH
	JMP	DTER61		/PARITY ERR ON FILL BIT MAP
	LAC	DTFPCT		/REL. BIT MAP POINTER
	CLL!RAL			/X 40
	RTL
	RTL
	TAD	DLTBUF		/(DTBUF
	DAC	DTBMOT		/SET BIT MAP OUT SWITCH
DTOLBM=DTOBCK			/REL. BIT MAP ADDRESS
DTXROL=DTMPS			/OLD BIT MAP POINTER
	DAC	DTOLBM
	DAC	DTXROL		/OLD BIT MAP ADDR.
	LAC	DLTDIR		/DIR. BIT MAP ADDR. 
	JMS	DTXOR		/XOR OLD FILE BIT MAP INTO DIR. BIT MAP
	LAC	DLMBIT		/NEW FILE BIT MAP ADDR.
	DAC	DTXROL
	LAC	DTOLBM		/OLD BIT MAP ADDR
	JMS	DTXOR		/XOR NEW INTO OLD BIT MAP
	LAC	(15000
	JMP	DTCLQ1		/OUTPUT BIT MAP BLOCK
/
	.EJECT
/SUBR. TO XOR BIT MAP 1 INTO BIT MAP 2
/ALSO CLEARS BIT MAP 1
DTXOR	0
DTXRNW=DTMPP			/NEW BIT MAP POINTER
	DAC	DTXRNW		/BIT MAP 2 ADDR
	LAW	-40
	DAC	DTCTS
DTXOR1	LAC*	DTXROL		/BIT MAP 1 POINTER
	XOR*	DTXRNW		/BIT MAP 2 POINTER
	DAC*	DTXRNW
	DZM*	DTXROL		/CLEAR BIT MAP 1
	ISZ	DTXROL
	ISZ	DTXRNW
	ISZ	DTCTS
	JMP	DTXOR1
	JMP*	DTXOR
/
DTCLS6	SAD	DTCLSS		/AC=0 ON ENTRY
	JMP	DTSTOP
	JMS	DTDRCK		/LOAD DIRECTORY INTO DTBUF
	LAC	DTLB40		/(DTBUF+40
	DAC	DTCLCT		/INIT. DIR ENTRY SECT. POINTER
	LAW	-340		/DIR. ENTRY SECTION COUNT
	DAC	DTCT
	LAC	DLTBUF		/(DTDIR+40=DTBUF)
	DAC	DTCT1
DTCLS5	LAC*	DTCLCT		/TRANSF. DIR ENTRY SECTION (+200)
	DAC*	DTCT1		/UP TO BIT MAP
	ISZ	DTCLCT
	ISZ	DTCT1
	ISZ	DTCT
	JMP	DTCLS5
	LAC	DLSAV		/(DTESAV
DTFIN=DTBFC2			/DTESAV POINTER
	DAC	DTFIN
	LAW	-4
	DAC	DTCT
DTCLS7	LAC*	DTFIN		/NEW FILE NAME (4 WDS)
	DAC*	DTCURE		/INTO DIRECTORY ENTRY SECTION
	ISZ	DTFIN
	ISZ	DTCURE
	ISZ	DTCT
	JMP	DTCLS7
	DZM	DTCLSS		/CLEAR CLOSE IND.
	LAC	(15000		/REWRITE DIRECTORY
	JMS	DTDRIN
	JMP	DTCLOS
/
	.EJECT
/.TRAN ROUTINE
DTAPE	JMS	DTIOU		/I/O UNDERWAY
	LAC*	DTARGP		/BL#
	JMS	DTSET		/SETUP BL#, ETC R/W, FOR/REV
	ISZ	DTARGP
	LAC* DTARGP		/CORE ADDR.
	IDX DTARGP
	DAC DTNCOR
	LAC* DTARGP
	DAC DWORD			/WC
	LAC DTNCOR
	JMS	DTWCS		/SETUP CA AND START TRAN.
DTAPE1	ISZ	DTARGP
	JMP	DTDBK		/INDEX TO NORM EXIT
/SUBROUTINE TO SET UP BLOCK #, TRANSFER DIRECTION
DTSET	0
	DAC	DTNXBK
	LAC	DTCT		/TRANSFER DIRECTION
	RTR
	SMA!CLC			/OUTPUT
	LAC	(11000		/INPUT
	XOR	RPCABP	/RPCABP=2000
	AND	(17000
	DAC	DTTR		/WRITE (15000) OR READ (13000)
	DZM	DTDTR		/TRANSFER DIRECTION SWITCH(ALWAYS FOREWARD)
	JMP*	DTSET
/SUBR. TO SET UP CA, WC, AND TRANSFER
DTWCS	0
	DAC	DTCCA		/ADDR.-1(BIT 0-2 DO NOT MATTER)
	LAW	-5
	DAC	DTERCT		/PARITY ERROR RETRY COUNT
	DAC	DTUND		/SET I/O UNDERWAY
	LAC	DTUNIT		/CONVERT UNIT TO DISK NUMBER.
	CLL
	AND (700000		/MASK BITS 0-2
	RTR
	RTR		/STORE 2*UNIT# IN BITS 0-7
	DAC RPTEMP
	RAR
	TAD RPTEMP	/NOW 3*UNIT# IN BITS 0-7
	TAD RPCABS	/ADD BASE CYL ADDR. FROM .INIT
	DAC DTBLC	/ABSOLUTE CYL ADDR. IN 0-7
	LAC DTNXBK	/LOG. BLK# TO BE SEARCHED FOR
	TAD (-1100	/CHK. FOR ILLEGAL BLK#
	SPA
	JMP DTWCS1	/CONT. CONVERSION
	LAC DTNXBK	/ILLEG. BLK#
	JMP DTR21A	/OUTPUT ERR MESSG.
DTWCS1	LAC DTNXBK	/CONVERT LOG. BLK# TO ABS. PACK ADDR.
	DAC RPTEMP
DTWCS2	TAD (-310
	SPA		/BLK#<310 (8)?
	JMP DTWCS3	/GO GET HA
	DAC RPTEMP	/STORE REMAINDER
	LAC DTBLC
	TAD RPCABP	/ADD ONE TO CYL ADDR.
	DAC DTBLC
	LAC RPTEMP
	JMP DTWCS2
DTWCS3	LAC RPTEMP
DTWCS4	TAD (-12	/BLK#< 12(8)?
	SPA
	JMP DTWCS5	/SA=BLK#
	DAC RPTEMP
	LAC DTBLC
	TAD RPHABP	/BUMP HA
	DAC DTBLC
	LAC RPTEMP
	JMP DTWCS4	/RECYCLE
DTWCS5	LAC DTBLC
	TAD RPTEMP	/INCLUDE SA
	DAC DTBLC
	JMS DKSET			/SET UP DISK I/O + EXECUTE IOT'S.
	JMP* DTWCS		/EXIT SUBR.
/
/SUBR TO SET UP DISK I/O AND EXECUTE IOT'S
/
DKSET	0
DKSET2	LAC	DTCCA
	DPCA		/LOAD CA
	LAC	DWORD
	DPWC		/LOAD WC
	LAC	DTBLC
	DPLA		/LOAD CYL. ADDR,HA,SA
	LAC RPUNIT	/DESELECT CURRENTLY ACTIVE DRIVE
	TAD (400000	/TO ALLOW  READ ONLY SWITCHES
	DPLF	/TO BE ACTIVATED
	LAC	DTTR
	XOR	(13000
	SZA			/ZERO IF INPUT
	LAC	(10000		/OUTPUT.
	TAD (10000	/INPUT
	XOR RPUNIT	/LOAD PACK PHYS. UNIT#
	DPCS	/CLEAR STATUS
	DPLF	/LOAD FUNTC. LESS GO BIT TO TEST UNIT READY
	DPRSB	/READ STATUS B
	NOP	/ADDED INSTRUCTION FOR 4 MICRS. DELAY
	DPRSB	/ADDED INSTRUCTION FOR 4 MICRS. DELAY
	RAR
	SZL
	JMP RPUOFL	/IOPS4
	LAC (5000	/JAM GO BIT,JB DONE AND ERR. INTERR.
	DPCS	/CLEAR STATUS
	DPLO	/LOAD GO BIT
	ION	/ALLOW OTHER INTERUPTS IN
	JMP* DKSET
	.EJECT
RPUOFL	LAC (DKSET1	/IOPS4 ON UNIT OFF LINE
	DAC* DLIT3
	LAC DLIT4
	JMP DTM4
DKSET1	LAC DTERCT
	DAC DTUND		/RESET I/O UNDERWAY SWITCH
	JMP DKSET2
/.READ, .WRITE COMMON SETUP SUBR.
DTMCK	0
	DAC	DTTR		/READ (13000) OR WRITE (15000)
	DAC	DTNCOR		/.SEEK, .ENTER  NOT EXECUTED
	XCT*	DTMCK		/L.B. OR DTA BUF. L.B. ADDR.
	DAC	DTUHP		/HEADER POINTER
	DAC	DTUDP		/DATA POINTER
	ISZ	DTARGP
	LAC*	DTARGP		/USER WC
	DAC	DTUWC
	LAC	DTCT		/DATA MODE
	DAC	DTDMOD
	ISZ	DTMCK		/INDEX TO DUMP EXIT
	SAD	DLIT4
	JMP	DTMCK2		/DUMP EXIT
	LAC*	DTUHP		/COMPUTE W.C. FROM L.B.H. W.P.C
	JMS	DTGWPC
	ISZ	DTMCK		/INDEX TO IOPS OR IMAGE EXIT
	JMP*	DTMCK		/IOPS OR IMAGE EXIT
DTMCK2	LAC	DTUWC		/SAVE USERWC
	DAC	DTWCSV
	DZM	DTWPC
	XCT*	DTMCK		/JMP DTRDUM OR JMP DTWDUM
/SUBR. TO TRANSF. WPC FROM HEADER TO DTWPC
DTGWPC	0
	RTR
	RTR
	RTR
	RTR
	AND	(776
	DAC	DTWPC		/T. STORE L.B.W.P.C.
	SNA			/ILLEG. WPC (0 OR GREATER THAN 177)
	JMP DTER23
	AND (400
	SNA!CLA
	JMP*	DTGWPC		/L.B.W.C. INAC
DTER23	TAD	(5		/IOPS 23
	JMP	DTER16
/
	.EJECT
/SUBR. TO CHECK ACTIVE FILE
DTCKCL	0
	LAC	DTCLSS		/PREVIOUS FILE CLOSED
	SZA!CLA
	JMP	DTER10		/NO-FILE STILL ACTIVE
	JMS	DTDRCK		/CHECK FOR DIRECTORY IN CORE
	LAC*	DTARGP		/USER D.E. POINTER
	JMS	DTSK1		/DIR. SEARCH FOR FILE
	DAC	DTCLSS		/CLEAR OR SET CLOSE SWITCH
	JMP*	DTCKCL
/.SEEK ROUTINE
DTSEEK	LAC	DTIOSW
	SZA!CLC
	JMP	DTER10		/ILL. DATA MODE (.SEEK ON OUTPUT FILE) (DTER7)
	JMS	DTCKCL		/CHECK DIRECTORY FOR THIS FILE
	SNA!CLC			/DTA DIR. ENTRY POINTER IN AC
	JMP	DTER14		/FILE NOT FOUND (DTER13)
	XCT	DTSK5		/PICK UP 1ST BLK # OF FILE
	XOR	(400000		/CLEAR FILE COMPLETE BIT
	DAC	DTNXBK		/1ST BLK # TO READ
	DAC	DTSKNT		/SET .SEEK, .ENTER EXECUTED SWITCH
	LAC	(13000
	DAC	DTTR		/INPUT
	DAC	DTNCOR		/CLEAR DIRECTORY IN CORE SWITCH
	DZM	DTDMOD		/CLEAR DATA MODE TO BYPASS DUMP CHECK
	JMP	DTRNX1		/TRANSFER 1ST BLOCK
/
	.EJECT
/L.B. TO DTA BUF (.WRITE) OR DTABUF TO L.B. (.READ)
DTRWT	0
DTWT2	LAC*	DTUDP		/USER L.B.
	DAC*	DTHPT		/TO DTA BUFOR VICE VERSA
	JMS	DTUPTR		/ADD TO CKSUM, INDEX CTS, ETC
	ISZ	DTDATC		/DATA WORD COUNT
	ISZ	DTHPT
	ISZ	DTUWC		/DONE
	JMP	DTWT2
	JMP*	DTRWT
/.WRITE ROUTINE
DTWRIT	JMS	DTIOU		/I/O UNDERWAY
	LAC	DTMTP4		/SET EXIT TO
	DAC	DTOUT		/JMP DTAPE1
	DAC	DTWREX		/SET WRITE EXECUTED SWITCH
	LAC	(15000
	JMS	DTMCK		/READ/WRITE COMMON SETUP
	LAC*	DTARGP
	JMP	DTWDUM		/DUMP
/RETURN HERE FOR IOPS OR IMAGE MODES
DTWRT1	CLC
	TAD	DTWPC		/REMAINING BUF. AREA SIZE
	TAD	DTBFCT		/REMAINING BUF. AREA SIZE
	SMA!CLA
	JMP	DTCOUT		/NO ROOM FOR THIS LINE
	DAC	DTWRWT		/OUTPUT WAIT SWITCH-CLEAR
	LAC*	DTUHP
	AND	(7
	SAD	(5
	JMP	DTWRT4
	LAC*	DTUHP		/USER LBH., WD0
	AND	(377000
	XOR	DTDMOD		/DATA MODE
	DAC*	DTUHP
DTWRT4	ISZ	DTUHP		/CLEAR USER CKSM
	DZM*	DTUHP
	DZM	DTCKSM		/INIT CHECKSUM
	LAW	-377
	JMS	DTOBCK		/OUTPUT BUF. SIZE CHECK
	CLC			/EXCLUDE L.B.H.; WD0
	TAD	DTWPC		/FROM COUNT
	CMA
DTWT1	DAC	DTUWC		/ACTUAL WC (2'S COMP)
	LAC	DTHPT		/SETUP CKSM POINTER
	DAC	DTUCKP		/FOR .WRITE
	ISZ	DTUCKP
	JMS	DTRWT
	LAC	DTDMOD
	SAD	DLIT4
	JMP	DTDUMK		/DUMP MODE - CHECK FULL BUFF
/
	.EJECT
	CLC
	TAD	DTCKSM
	CMA
	DAC*	DTUCKP		/STORE 2'S COMP CKSUM IN DTABUF
DTWT5	LAC	DTEOF		/EOF?
	SZA
	JMP DTCOUY		/YES, ALWAYS OUTPUT BLOCK
DTMTP4	JMP	DTAPE1		/IOPS WRITE COMPLETE
DTWRCL	JMS	DTBUFC		/CLEAR DTA BUF
	ISZ	DTARGP		/INDEX TO WC
	JMP	DTWRT1		/PUT LINE IN DTA BUF
/
/OUTPUT BUFFER SIZE CHECK
DTOBCK	0
	TAD	DTWPC		/L.B. W.C.
	SPA!CLA			/OUTPUT BUF OVERFLOW
	JMP*	DTOBCK
DTER16	TAD	DLIT1	/OUTPUT BUFFER OVERFLOW
DTER15	TAD DLIT1		/DISK UNIT FULL.
DTER14	TAD	DLIT2	/DTA DIRECTORY FULL
			/FILE NOT FOUND
DTER12	TAD	DLIT2	/IRREC. DTA ERR. MK. TK., EOT DURING TRANSFER
			/.SEEK, .ENTER NOT EXECUTED
DTER10	TAD	DLIT2	/FILE STILL ACTIVE
			/ILL. DATA MODE
DTER6	TAD	(6		/ILL. HANDLER FUNCTION
DTM4	DZM DTUND	/CLEAR I/O SWIT. IN CASE OF ^P
	JMP* DLIT4
/
/CLEAR I/O BUF. SUBR., POINTERS
DTBUFC	0
	LAC	(377		/INIT DUMP MODE
	DAC	DTROOM		/BUF SIZE
	LAC DTIOSW
	RAR			/INPUT: L=0; OUTPUT: L=1
	LAC	DLTBUF		/BUF. (WD0) POINTER (DTBUF
	SZL!STL			/DO NOT MODIFY DTHPT ON INPUT
	/ALSO SET LINK TO CLEAR 400 CELLS
	DAC	DTHPT		/DTA BUF HEADER POINTER
	DAC	DTRHPT		/FOR READ
	JMS	DTBFC2		/CLEAR BUF
	JMP*	DTBUFC
/
	.EJECT
/CLEAR SPECIFIED AREA SUBR.
DTBFC3=DDIRAL
DTBFC2	0
	DAC	DTBFC3
	LAW	-40
	SZL			/CLEAR 40
	AND	DTUMSK		/CLEAR 400, DTUMSK=777400
	DAC	DTCLCT		/DZM COUNT
	DAC	DTBFCT		/INIT BUF SIZE CT.
	ISZ	DTBFCT
DTBFC1	DZM* DTBFC3
	ISZ	DTBFC3
	ISZ	DTCLCT
	JMP	DTBFC1
	JMP*	DTBFC2
/
/OUTPUT CURR. IOPS BUFFER
DTCOUT	LAC	(DTWRCL		/SET RETURN FROM INT.
	DAC	DTWRWT		/SET OUTPUT WAIT SWITCH
DTCOUY	LAC	DTBUSB
	DAC	DTOUT
DTCOUZ	LAC	DTCNBK		/CURR. BL# TO WRITE
	DAC	DTNXBK
	SPA!CLC
	JMP	DTER16		/DECTAPE FULL (DTER15)
	LAC	DTWRWT		/IF DTWRWT NON 0,ALWAYS GET NEXT BLK #
	SNA!CLA
	LAC DTEOF
	JMS	DTMAP		/FIND NEXT FREE BLOCK
	DAC	DTBUF+377		/DATA LINK
DTCOUB	LAC	DLTBUF		/(DTBUF
	JMS	DTWCS		/SETUP WC,CA AND BEGIN TRAN.
DTOUT	JMP	DTAPE1
	.EJECT
/
/DUMP MODE OUPUT
DTWDUM	JMS	DTDUMB
DTDUMX	XX			/JMS DTBUFC OR NOP
	JMP	DTWT1
/
DTDUMB	0
	XCT*	DTDUMB		/JMS DTBUFC (WRITE) OR NOP (READ)
	ISZ	DTDUMB
	LAC	DTWRCL		/SET SWITCH TO CLEAR
	DAC DTDUMX		/OUTPUT BUFF (JMS DTBUFC)
	LAC	DTROOM
	TAD	DTWCSV
	SMA			/MORE THAN 377 TO TRANSFER
	JMP	DTDUMZ		/LAST ELEMENT OF TRANSFER
	DAC	DTWCSV		/SAVE REMAINDER
	LAW	-2
	TAD	DTDUMB		/RET. ADDR. FOR TRANS. COMP
	DAC	DTWRWT		/=I/O WAIT SWITCH
	LAC	DTBUSB		/JMP DTBUSY
	DAC	DTOUT
	CLC
	TAD	DTROOM		/FILL IN BUFF
	CMA
DTDUMY	XCT*	DTDUMB		/JMP DTWT1(WRITE) OR JMP DTNSH1
DTDUMZ	DZM	DTWRWT		/CLEAR I/O WAIT SWITCH
	DAC	DTROOM		/SPACE LEFT FOR NEXT DUMP
	SNA
	JMP .+3			/FULL BUFF, DO NOT NOP CLEAR BUFF
	LAC DTLNOP		/SET SWITCH NOT TO CLEAR OUTPUT BUFF
	DAC DTDUMX
	LAC	DTMTP4
	DAC	DTOUT
	LAC	DTWCSV		/REMAINDER
	JMP	DTDUMY
DTDUMK	LAC DTROOM		/IF DTROOM=0, BUFF FULL
	SZA!CMA
	LAC DTWRWT		/IF DTWRWT=0,  BUFF NOT FULL
	SZA			/NO
	JMP	DTCOUZ		/YES - OUTPUT
	JMP	DTWT5		/CHECK EOF
/
	.EJECT
/.READ ROUTINE
DTREAD	LAC	DTEOF		/EOF SWITCH SET?
	SZA
	JMP	DTEFX		/YES - IGNORE CALL (AC MUST BE NON-0)
	JMS	DTIOU		/I/O UNDERWAY CHECK
	LAC*	DTARGP		/USER L.B. POINTER
	DAC	DTHPT
	DAC	DTHPTS
	LAC	DTMTP4		/JMP DTAPE1
	DAC	DTOUT
	LAC	(13000
	JMS	DTMCK		/READ/WRITE COMMON SETUP
	LAC	DTRHPT		/DTA BUF HEADER POINTER
	JMP	DTRDUM		/DUMP
/RETURN HERE FOR IOPS OR IMAGE MODES
	CLC
	TAD	DTWPC		/IOPS ASCII OR BIN
	TAD	DTUWC
	DZM	DTDVS		/CLEAR SHORT LINE FLAG
	SMA!CLC			/WPC INTO WC, NO SHORT LINE
	DAC	DTDVS		/SET SHORT LINE FLAG
	TAD	DTWPC
	CMA			/2'S COMP HEADER W.C.
	DAC	DTWPC
DTRD2	DZM	DTDATC		/DATA COUNT
	DZM	DTCKSM		/CLEAR CHECKSUM
	JMS	DTRWT		/TRANSFER LINE TO USER L.B.
	LAC	DTDMOD
	SAD	DLIT4
	JMP	DTRDM1		/DUMP
	LAC*	DTUDP		
	JMS	DTUPTR		/BYPASS EXCESS DATA
	JMP	.-2		/MORE
DTRDM1	LAC	DTROOM		/DUMP MODE BUF SIZE
	SZA!CMA			/IF DTROOM=0 OR DTWRWT = NON 0,
	LAC DTWRWT
	SZA!CLC
	JMP	DTRNEX		/GET NEXT DUMP BLOCK
	JMP	DTAPE1		/NORM EXIT
/
/SUBR. TO ADD TO CHKSUM AND INDEX COUNTS
DTUPTR	0
	TAD	DTCKSM		/ADD DATA WD TO CKSM.
	DAC	DTCKSM
	ISZ	DTUDP		/INDEX AREA POINTERS
	ISZ	DTRHPT
	ISZ	DTBFCT		/INCR DTA BUF COUNT
	ISZ	DTWPC		/GO TO DRDE ON OVERFLOW-DONE
	JMP*	DTUPTR
/
	.EJECT
/END INPUT LINE ROUTINE
	LAC*	DTHPTS		/HEADER WD 0-IOPS
	AND	(7
	SAD	(5		/EOF?
	JMP	DTREOF		/YES
	ISZ	DTDVS		/SHORT LINE FLAG SET
	JMP	DTRDE1		/NO
	LAC	(60
	JMS	DTDVS		/SET D.V. FOR  SHORT LINE
DTRDE1	LAC	DTERCT		/PARITY RETRY COUNT	
	SMA!CLA
	JMP	DTRDP		/SET D.V. BITS=PARITY
	LAC	DTCKSM
	SNA			/SET D.V. BITS=CKSUM ERROR
	JMP	DTRDN
	LAC	(20		/CHECKSUM ERR. IN LINE, 12,13=10
DTRDP	TAD	(20		/PARITY ERROR IN DTA BLOCK, 12,13=01
	JMS	DTDVS		/12,13=10
DTRDN	LAC*	DTUDP		/NEXT WORD IN DTA BUF
	SNA!CLC			/IF NOT 0, OK
	JMP	DTRNEX		/NO MORE DATA-GET NEXT BL.
	ISZ	DTBFCT		/DATA BUF. CT = GET NEXT BL.
	JMP	DTRNOR		/NORM EXIT, AC=777777
DTRNEX	SAD	DTBUF+377		/DATA LINK=-0?
	JMP	DTREOF		/LAST BLOCK -SET EOF SWITCH
	LAC	DTNXBK
	CMA
	TAD	DTBUF+377
	SPA!CLA			/READ FORW
	CLC			/READ REV.
	DAC	DTDTR		/TRANSF. DIRECTION SWITCH
	LAC	DTBUF+377
	DAC	DTNXBK		/DATA LINK INTO NEXT BLOCK
	DAC	DTCNBK		/SET UP FOR .WRITE AFTER BACKSPACE
DTRNX1	JMS	DTBUFC		/INIT. BUFFER
	LAC	DTDMOD		/DUMP?
	XOR DLIT4
	SZA
	JMP DTCOUB		/NO
	LAC DTRHPT		/RESET BUFF POINTER
	DAC DTUDP
	JMP DTCOUB
/
	.EJECT
/
/SUBR. TO SET DATA VALIDITY BITS
DTDVS	0
	DAC	DTDVSM		/SAVE MASK
	LAW	17717		/MASK ALL BUT BITS 0,12,13
	AND*	DTUHP
	XOR	DTDVSM
	DAC*	DTHPTS		/HEADER, WD0
	JMP*	DTDVS
DTEFX	ISZ	DTARGP
DTREOF	DAC	DTEOF		/SET EOF SWITCH
	JMP	DTAPE1		/EXIT
DTRNOR	TAD	DTBFCT		/DECR. (BY 1) DTFCT
	DAC	DTBFCT		/BUF COUNT
	JMP	DTAPE1		/NORM EXIT
DTNSH1	DAC	DTUWC
	JMP	DTRD2		/TRANSFER LINE
/
/DUMP MODE INPUT
DTRDUM	JMS	DTDUMB		/SET UP FOR DUMP INPUT
DTLNOP	NOP
	JMP	DTNSH1
/
/SUBROUTINE TO SAVE NEW D.E. IN DTESAV AREA
DTNTRZ	0
	LAC	DLSAV		/(DTESAV
	DAC	DTFIN		/DTFIN=DTBFC2
	LAW	-3		/SET DTA D.E.
	DAC	DTCT		/TRANSFER COUNTER
DTNTR2	LAC*	DTUDRP		/SAVE USER D.E. (4 WORD ENTRY)
DTNTR3	DAC*	DTFIN
	ISZ	DTFIN
	ISZ	DTUDRP
	ISZ	DTCT
	JMP	DTNTR2
	JMP*	DTNTRZ
/
	.EJECT
/DTA ENTER FILE ROUTINE
DTENTR	LAC	DTIOSW		/I/O SWITCH
	SNA!CLC
	JMP	DTER10		/ILL. DATA MODE (.ENTER ON INN PUT FILE) (DTER7)
	JMS	DTCKCL		/CHECK DIRECTORY FOR THIS FILE
	SZA			/NOT FOUND UNDER THIS FILE NAME
	JMP	DTNTR1		/FOUND-WILL BE MODIFIED ON .CLOSE
	LAC	DLFAKE		/INIT FOR EMPTY SLOT SEARCH (DTFAKE
	JMS	DTSK1		/D SEARCH FOR EMPTY FILE ENTRY
	DAC	DTCLSS		/CLEAR OR SET CLOSE SWITCH
	SNA			/EMPTY SLOT FOUND
	JMP	DTER14		/DIRECTORY FULL
DTNTR1	LAC*	DTARGP		/USER D.E. POINTER
	DAC	DTUDRP
	JMS	DTNTRZ		/SAVE USER D.E. IN DTESAV
	LAW -40			/INIT BIT MAP SEARCH
	DAC DTWMCT		/BIT MAP WORD COUNT
	LAC DLTDIR		/DIRECTORY BIT MAP POINTER
	DAC DTMTRX		/CURR DIR BIT MAP WORD POINTER
	LAC DLMBIT		/FILE BIT MAP POINTER
	DAC DTPONT		/CURR FILE BIT MAP WORD POINTER
	DZM DTRELB		/BLOCK NUMBER FOUND
	LAW -1100
	DAC DTBLOK		/BLOCK COUNT
DLITM1	LAW -1			/INIT BIT MAP SEARCH TO PICK UP
	DAC DTREM			/FIRST EMPTY BLOCK
	DAC DTSKNT		/SET SEEK,ENTER EXECUTED SWITCH
	LAC DLIT1			/SET BIT MAP DIRECTION SWITCH
	DAC DTDIRA
	DAC DTDIRL		/TO FORWARD (+1)
	JMS DTMPS			/SET UP TO EXAMINE WD 0 OF MAP
	JMS DTMAP			/FIND FREE BLOCK #
	SNA			/DO NOT ALLOW FIRST BLOCK OF FILE TO BE ZERO.
	JMP DTER15		/DISK UNIT FULL.
	XOR	(400000
	XCT	DTNTR3		/STORE BL#+COMPLETION BIT IN DTESAV+3
	SMA!CLC
	JMP	DTER16		/DECTAPE FULL (DTER15)
	JMS	DTBUFC
	JMP	DTAPE1		/NORM EXIT
DTESAV	0			/NEW FILE ENTRY
	0
	0
	0
DTFAKE	0			/EMPTY SLOT FOR ENTER SEARCH (LAST WD. UNUSED)
	0
	0
DTEOFH	1005			/EOF HEADER FOR CLOSE
/
	.EJECT
/SUBR TO SET UP FOR EXAM OF NEXT BIT MAP WORD
DTMPS	0
	LAW	-22
	DAC	DTRBIT		/18 BIT COUNT
	LAC*	DTMTRX		/NEXT BIT MAP WD
	CMA!STL
	DAC	DTSBIT
	LAC	DTDIRA		/BIT MAP DIRECTION SWITCH
	SMA!CLA!RAL			/REVERSE-SEARCH BIT 18-0
	RTR			/FORWARD-SEARCH BIT 0-18
	DAC	DTTBIT		/FORWARD(0=1); REVERSE (18=1)
	JMP*	DTMPS
/
/END OF CURRENT BIT MAP WORD SUBR.
DTMPP	0
DTMPP1	LAC	DTDIRA		/INCR. (IF FORWARD) OR
	TAD	DTMTRX		/DECR. (IF REV) BY 1
	DAC	DTMTRX		/CURR. DIR BIT MAP WD. POINTER
	LAC	DTDIRA
	TAD	DTPONT
	DAC	DTPONT
	JMS	DTMPS		/SETUP FOR NEXT WD
	ISZ	DTWMCT		/BIT MAP WORD CT
	JMP*	DTMPP		/EXIT
	LAW	-1100		/LIT.
	DAC	DTBLOK		/DECTAPE FULL?
	DZM DTBMCT		/CLEAR BIT MAP SEARCH COUNT
	JMS DDIRAL		/FLIP DTDIRA,NEW DTDIRA IN AC ON RETURN
	TAD DTRELB		/REINIT
	DAC DTRELB
/ROUTINE TO SET DTREM FOR TURN AROUND CASE
	LAC DTDIRA
	RAL			/L=1=REV.,L=0=FORW.
	LAC DTNXBK		/LAST BL # RECORDED FOR THIS FILE
	SNL!CMA			/REV
	JMP DTMPP3
	TAD (1100
	CMA
DTMPP3	DAC DTREM			/LAW TO CHECK ENOUGH SPACE BETW. BL
	LAW -41
	DAC	DTWMCT		/MATRIX COUNT
	JMP	DTMPP1		/START REV. SEARCH
/SUBR TO FLIP DTDIRA AT DECTAPE TURNAROUND
DDIRAL	0
	CLA
	ISZ DTDIRA		/1 OR -1
	LAW -2			/SET TO REVERSE
	TAD DLIT1			/SET TO FORW
	DAC DTDIRA		/NEW DTDIRA MUST BE IN AC ON EXIT
	JMP* DDIRAL
	.EJECT
/BLOCK AVAILABILITY BIT MAP SEARCH
DTMAP	0
	DAC DTCLR2		/SAVE AC FOR -1 CASE
	DZM	DTBMCT		/BIT MAP SEARCH COUNT
DTMAP1	LAC	DTTBIT		/TEST BIT
DTMAP2	AND	DTSBIT		/MATRIX WORX
	SZA!CLC
DTMAP3	JMP	DTREM		/BLOCK AVAILABLE
	ISZ	DTBLOK		/INCREMENT DT BLOCK COUNT
	JMP DTMAP4
	DAC DTBLOK
	JMP DTREM5
DTMAP4	ISZ	DTBMCT
	LAC	DTDIRA		/IF FORW, INCR. BL#
	TAD	DTRELB		/IF REV., DECR. BL.# BY1
	DAC	DTRELB
	LAC	DTDIRA
	RAL			/L=0=FORW; L=1=REV.
	LAC	DTTBIT		/SHIFT TEST BIT RIGHT IF FORW,
	SNL!CLL!RAL			/LEFT IF REV.
	RTR
	DAC	DTTBIT
	ISZ	DTRBIT		/INDEX-18 BIT COUNT
	JMP	DTMAP2		/NEXT BIT
	JMS	DTMPP		/END OF MATRIX WD. SUBR.
	JMP	DTMAP1		/NEXT WORD
DTREM	XX			/DELTA BLOCKS IN BETWEEN
	TAD	DTBMCT
	SPA!CLC			/OK-DELTA BLOCKS IN BETWEEN
	JMP	DTMAP4		/CHECK BIT MAP AGAIN
	SAD DTCLR2		/IF ENTRY AC = -1, NO DTCBIT
	JMP DTREM6
	JMS	DTCBIT		/SET BIT IN MAPS.
	CMA
	DAC	DTSBIT
DTREM6	LAW -DELTA		/RESTORE BLOCK DISTANCE TO DELTA
	DAC DTREM
	LAC	DTDIRL		/SET TRANSF DIRECTION  SWITCH
	SPA!CLA
	CMA
	DAC	DTDTR
	LAC	DTDIRA		/UPDATE DTDIRL
	DAC	DTDIRL
	LAC	DTRELB		/T. STORE BL# TO BE  USED
DTREM5	DAC	DTCNBK		/EXIT
	LAW -1			/WAS AC = -1 ON ENTRY?
	SAD DTCLR2
	SKP			/YES, USE - 1 (EOF)
	LAC DTCNBK
	JMP*	DTMAP		/EXIT -BL ! FOUND(777777=DTA FULL)
	.EJECT
/CHANGE BIT IN MAPS SUBR.
DTCBIT	0
	LAC	DTTBIT		/SET BIT IN FILE BIT MAP
	XOR*	DTPONT
	DAC*	DTPONT
	LAC DTTBIT		/SET BIT IN DIRECTORY BIT MAP
	XOR*	DTMTRX
	DAC*	DTMTRX
	JMP*	DTCBIT		/C(*DTMTRX) MUST BE IN AC ON EXIT
/CLEAR DIRECTORY ROUTINE
DTCLR2	XX			/LAC DTBLBT = BLOCK TABLE
	DZM	DTCT
	ISZ	DTCT		/WRITE FORWARD
	JMS	DTSET		/SET BL# ETC
	LAC DLTBUF
	JMS	DTWCS		/SET UP CA,WC+BEGIN TRANSFER
	ISZ	DTCLR2		/INDEX FOR NEXT TRANSFER
DTCLER	JMS	DTIOU		/WAIT FOR I/O TO FINISH
	LAC	DTCLSS		/CLOSE SWITCH CLEAR?
	SZA!CLA			/YES
	JMP	DTER10		/FILE STILL ACTIVE
	LAC	(DTCLR1		/SET RETURN AND
	DAC	DTWRWT		/I/O WAIT SWITCH
	DAC	DTNCOR		/CLEAR DIR IN CORE SWITCH
	LAC	(LAC DTBLBT
	DAC	DTCLR2		/INIT TABLE REF
	JMS DTBUFC		/CLEAR BUFFER TO ZERO BLK 71-77
	LAW -10
	DAC DTREM			/COUNT FOR FILE BIT MAP BLOCKS
	LAW	-11
	DAC	DTCLCT		/COUNT OF BLOCKS TO CLEAR+1
DTCLR1	ISZ DTREM			/FILE BIT MAP BLOCKS CLEARED?
	JMP DTCLR4
	LAC (77600		/YES, INIT DIRECTORY TO 8 SYS BLKS
	DAC DTBUF+3
	DAC DTBUF+203		/BASIC DIRECTORY BIT MAP
DTCLR4	ISZ	DTCLCT		/DONE
	JMP	DTCLR2
	DZM	DTWRWT		/YES-CLEAR I/O WAIT SWITCH
	JMP	DTDBK
/DTCLER BLOCK TABLE
DTBLBT	71			/BLOCKS 71-73 CONTAIN
	72			/24 BIT MAPS ORDERED ACCORDING
	73			/TO THE FILE NAMES IN THE DIR. ENTRY SECTION
	74
	75
	76
DLIT77	77
DLT100	100			/BLOCK 100 = DIRECTORY
	.EJECT
/DTMBIT=FILE BIT MAP, MUST INITIALLY = 0
DTMBIT	0
	.LOC	DTMBIT+40
DTDIR	0			/DTA DIRECTORY
	.LOC	DTDIR+40
DTBUF	0			/DTA BUFFER
	.LOC	DTBUF+400
DJSTOP	JMP	DTSTOP
DLTDIR	DTDIR			/DIRECTORY POINTER
DLTSYS	DTDIR+203			/WD 3 OF SYS BIT MAP
DLTBUF	DTBUF			/DTA BUF. POINTER
DLEOFH	DTEOFH			/EOF HEADER POINTER (FOR .CLOSE)
DTLB40	DTBUF+40			/DIR. ENTRY POINTER (.CLOSE)
DLSAV	DTESAV			/POINTER TO 1ST CELL OF NEW DIR. ENTRY
DLFAKE	DTFAKE			/POINTER TO EMPTY FILE NAME
DLMBIT	DTMBIT			/FILE BIT MAP ADDR. POINTER
DTARGP	0			/ENTRANCE ARG. POINTER
DTCALP	0			/USER CAL POINTER
DTDIRA	0			/BIT MAP DIRECTION SWITCH (CURR. BL.)+1=F,-1=R
DTDIRL	0			/BIT MAP DIRECTION SWITCH (LAST.BL.),+1=F,-1=R
DTIOSW	0			/I/O SWITCH, 0=INPUT, 1=OUTPUT
DTNCOR	077777			/DIRECTORY IN CORE SWITCH, (0-2)=UNIT=IN
DTRBIT	0			/18 BIT (2'S COMP) COUNTER FOR BIT MAP SEARCH
DTRELB	0			/FREE BL.# AFTER BIT MAP SEARCH
DTRHPT	0			/DTA BUF. LINE HEADER POINTER (.READ)
DTSKNT	0			/.SEEK,.ENTER EXECUTED SWITCH (NON 0=EXECUTED)
DTTBIT	0			/TEST BIT FOR BIT MAP SEARCH
DTTR	0			/DTA SEARCH-READ(13000) OR SEARCH-WRITE(15000)CONVERSION FACTOR
DTUCKP	0			/USER LINE BUF. CHECKSUM POINTER
DTUDP	0			/USER LINE BUF DATA POINTER (MODIFIED)
DTUND	0			/I/O UNDERWAY SWITCH,-=BUSY,0=NOT BUSY
DTUNIT	0			/(0-2)=DTA UNIT# FOR TRANSFER
DTCLSS	0			/FILE OPEN, CLOSE SWITCH(NON-0=OPEN,0=CLOSED)
DTCT	0			/GEN. PURPOSE COUNTER=T.STORE
DTBFCT	0			/BUFFER COUNT (INIT=-377)
DWORD	LAW -400			/WORD COUNT, MODIFIED BY TRAN.
DTBLOK	0
DLIT1	1
DLIT2	2
DLIT3	3
DLIT4	4
DTUDRR=DTDVS			/USER DIR. ENTRY POINTER (FIXED)
DTUDRP=DTCKSM			/USER DIR. ENTRY POINTER (INDEXED)
DTCTS=DTCCA			/ENTRY COUNT (-3)
DTCT1=DTUPTR			/GEN. PURP. COUNTER AND T. STOR.
DTDATC=DTTABL			/LINE DATA COUNT
DTUHP=DTDRIN			/USER LINE BUF. HEADER POINTER
DTCT1S=DTWC			/MATCH COUNT (-4)
DTDES=DTWCS			/DTA DIR. ENTRY SECTION POINTER (INDEXED)
DTUWC=DTCCA			/USER 2'S COMP WC FOR ARG. LIST
DTDVSM=DTCALP			/DATA VALIDITY BIT MASK
DTBMCT=DTOBCK			/BIT MAP SEARCH COUNT (MUST BE 5 OR MORE TO EXIT)
DTCLCT=DTMPP			/CLEAR COUNT (INIT=-200)
DTWCSV=DTGWPC
DTWPC=DTSET			/WORD PR. COUNT FROM HEADER
DTDLUN=DTEOF			/RENAME OR DELETE UNDERWAY
	.END
