.TITLE *** TDV FUNCTION "DIRECTORY" FOR DECTAPE
/ 
/ 
/                   FIRST PRINTING, FEBRUARY 1974
/ 
/ 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 RESPON-
/ SIBILITY FOR ANY ERRORS THAT MAY APPEAR IN THIS
/ DOCUMENT.
/ 
/ THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FUR-
/ NISHED 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 PRO-
/ VIDED IN WRITING BY DIGITAL.
/ 
/ DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/ FOR THE USE OR RELIABILITY OF ITS SOFTWARE ON EQUIP-
/ MENT THAT IS NOT SUPPLIED BY DIGITAL.
/ 
/ COPYRIGHT (C) 1974, BY DIGITAL EQUIPMENT CORPORATION
/ 
/ 
        .EJECT
/
/	EDIT #15	6 FEB 72	C. PROTEAU
/			28 APR 72	W.A. DESIMONE
/
/ COPYRIGHT 1971, 1972 DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/ TDV (TASK DEVELOPMENT) FUNCTION, CALLED "DTD...", USED TO LIST INFORMATION
/ ABOUT THE FILES THAT EXIST ON A DECTAPE.
/
/////////////////////////////////////////////////
/						/
/ CALL:	TDV>DTD					/
/						/
/ SAMPLE DIRECTORY PRINTOUT:			/
/						/
/	DECTAPE UNIT 4				/
/	    31-DEC-71				/
/	  1004 FREE BLKS			/
/	     3 USER FILES			/
/	    10 SYSTEM BLKS			/
/	FILNAM EXT      1     15		/
/	TABLE  BIN      2     23		/
/	DTD.1  SRC      3     24		/
/						/
/////////////////////////////////////////////////
/
/ THERE ARE 1100 OCTAL BLOCKS ON A DECTAPE, AT LEAST 8 OF WHICH ARE
/ SYSTEM BLOCKS (BLOCKS 71 THRU 100 OCTAL, USED FOR FILE DIRECTORY
/ INFORMATION).
/
/ ALL NUMBERS, EXCEPT THE DATE, ARE PRINTED IN OCTAL.
/
/ IN THE PRINTOUT, EACH LINE ENTRY FOR A FILE CONSISTS OF FILE NAME,
/ FILE NAME EXTENSION, FIRST BLOCK NUMBER, AND THE FILE SIZE.
/
/ THERE ARE 2 TYPES OF DIRECTORY FORMAT. THE NORMAL FORMAT FOR BLOCK
/ 100 IS THAT THE FIRST 40 OCTAL WORDS IS THE MASTER BIT MAP FOR THE
/ TAPE FOLLOWED BY 340 OCTAL WORDS OF FILE ENTRIES. EACH FILE ENTRY
/ CONSISTS OF 4 WORDS, SO ON A NORMAL TAPE ONE CAN HAVE UP TO 70
/ OCTAL (56 DECIMAL) FILES. EACH FILE HAS A FILE BIT MAP OF 40 OCTAL
/ WORDS LOCATED IN A CORRESPONDING POSITION IN BLOCKS 71 THRU 77.
/ BLOCK 71 CONTAINS THE FIRST 8 FILE BIT MAPS, AND SO ON. A 1-BIT IN
/ THE BIT MAP INDICATES AN OCCUPIED BLOCK.
/
/ EACH FILE ENTRY OF 4 WORDS IS FORMATTED AS FOLLOWS:
/
/	WORD 0 -- .SIXBT "FIL"
/	WORD 1 -- .SIXBT "NAM"
/	WORD 2 -- .SIXBT "EXT"
/	WORD 3 -- STARTING BLOCK NUMBER IN BITS 8-17
/		  (BIT 0=1 FOR SYSTEM FILE ENTRIES (SEE BELOW))
/
/
/ THE SECOND FORMAT IS FOR A SYSTEM TAPE, ONE USED IN PDP-9/15 SYSTEMS
/ IN WHICH THE OPERATING SYSTEM PROGRAMS RESIDE ON THE DECTAPE IN CORE
/ IMAGE FORM. ON SUCH A TAPE, THE MASTER BIT MAP STILL OCCUPIES THE FIRST
/ 40 OCTAL WORDS OF BLOCK 100. THE NUMBER OF USER FILE ENTRIES IS CUT
/ DOWN TO 30 OCTAL (24 DECIMAL). THE SECOND HALF OF BLOCK 100 STARTS
/ WITH A 40 OCTAL WORD SYSTEM BIT MAP, CORRESPONDING TO THE BLOCKS
/ OCCUPIED BY ALL THE SYSTEM PROGRAMS.
/
/ THERE MAY BE UP TO 30 OCTAL SYSTEM FILE ENTRIES, EACH 4 WORDS LONG.
/ THERE IS NO CORRESPONDING FILE BIT MAP IN BLOCKS 71 THRU 77 FOR
/ SYSTEM FILE ENTRIES.
/
/ ******************** MASTER DIRECTORY BLOCK 100 **********************
/
/	NORMAL TAPE				SYSTEM TAPE
/	-----------				-----------
/
/	*****************			*****************
/	*		*			*		*
/	* 40 OCTAL WORD *			* 40 OCTAL WORD *
/	* MASTER BITMAP *			* MASTER BITMAP *
/	*		*			*		*
/	*****************			*****************
/	*		*			*		*
/	* 70 OCTAL	*			* 30 OCTAL	*
/	* 4-WORD USER	*			* 4-WORD USER	*
/	* FILE ENTRIES	*			* FILE ENTRIES	*
/	*		*			*		*
/	*		*			*****************
/	*		*			*		*
/	*		*			* 40 OCTAL WORD *
/	*		*			* SYSTEM BITMAP *
/	*		*			*		*
/	*		*			*****************
/	*		*			*		*
/	*		*			* 30 OCTAL	*
/	*		*			* 4-WORD SYSTEM *
/	*		*			* FILE ENTRIES	*
/	*		*			*		*
/	*****************			*****************
/
/	WORD 203 OCTAL CORRESPONDS		WORD 203 OCTAL IS PART OF
/	TO THE LAST WORD IN THE			THE SYSTEM BIT MAP. BIT 3
/	31ST FILE ENTRY. BIT 3 MUST		IN THE WORD CORRESPONDS
/	BE 0.					TO BLOCK 71, WHICH IS AL-
/						WAYS OCCUPIED. BIT 3 MUST
/						BE 1.
/
	.EJECT
/ AT COMPLETION OF THE DIRECTORY LISTING, THE TERMINATING CHARACTER OF THE
/ COMMAND LINE IS EXAMINED. IF IT IS A CARRIAGE RETURN, THE RESIDENT TDV
/ TASK IS 'REQUESTED' AND THIS TASK EXITS. IF THE LINE IS TERMINATED BY AN
/ ALTMODE, THIS TASK EXITS WITHOUT 'REQUESTING' 'TDV...'. A CTRL T TYPEIN
/ IS THEN NECESSARY TO RE-ESTABLISH TDV DIALOGUE.
/
IDX=ISZ				/USED WHEN THE SKIP IS NOT INTENDED.
X10=10				/AUTOINCREMENT REGISTER 10.
X11=11				/AUTOINCREMENT REGISTER 11.
X12=12				/AUTOINCREMENT REGISTER 12.
	.DEC
DTPLUN=19			/DECTAPE INPUT LUN.
TDVTTY=13			/TDV TTY ERROR LUN.
TDVOUT=13			/TDV PRINTOUT LUN.
	.OCT
/
	.EJECT
DTD	CAL	XFER		/TRANSFER THE COMMAND LINE READ BY 'TDV...'.
	CAL	WAITFR
	LAC	EV		/SAVE THE EVENT VARIABLE FOR REFERENCE AT
	DAC	XFEREV		/EXIT TIME.
/
/ ATTACH THE "PRINTER".
/
	CAL	ATCHLP
	CAL	WAITFR
	LAC	EV
	SAD	(-6)
	JMP	DOHINF		/"ATTACH" UNIMPLEMENTED.
	SPA
	JMP	ERR1		/"ATTACH" ERROR.
/
/ MAKE SURE THAT THE LISTING DEVICE IN FACT CAN PERFORM OUTPUT AND
/ THAT IT DOES NOT HAVE A DIRECTORY.
/
DOHINF	CAL	HINFLP
	CAL	WAITFR
	LAC	EV
	RTL
	SPA!RAL
	SPA
	JMP	ERR2		/NOT A LISTING DEVICE -- CAN'T DO OUTPUT.
				/NOT A LISTING DEVICE -- HAS A DIRECTORY.
/
/ ATTACH THE DECTAPE.
/
	CAL	ATCHDT
	CAL	WAITFR
	LAC	EV
	SPA
	JMP	ERR1A		/"ATTACH" ERROR -- PERHAPS THIS ISN'T A DECTAPE.
/
/ MAKE SURE THAT THE INPUT DEVICE IS INDEED DECTAPE.
/
	CAL	HINFDT
	CAL	WAITFR
	LAC	EV
	AND	(77)		/CHECK THE DEVICE CODE.
	SAD	(4)
	SKP
	JMP	ERR2A		/NOT DECTAPE.
	LAC	EV
	LRS	6
	AND	(7)
	DAC	UNIT		/SAVE THE DECTAPE UNIT #.
/
	.EJECT
/ READ IN DECTAPE BLOCKS 71-100. THE ORDER AND DIRECTION IN WHICH
/ BLOCKS ARE READ IS CHOSEN TO MINIMIZE TAPE MOTION.
/
	LAC	(FSZTAB+37)	/SET UP AUTOINDEX REGISTER 12 AS AN INDEX
	DAC	AX12		/TO THE FILE SIZE TABLE.
	LAC	(400075)	/READ IN FILE BIT MAP BLOCKS, SOME IN THE
	JMS	READ		/REVERSE DIRECTION (400000 + NUMBERS) AND SOME
	LAC	(FSZTAB-1)	/FORWARD. THOSE READ IN REVERSE WILL BE
	DAC	AX12		/TURNED INTO THEIR COMPLEMENT OBVERSE
	LAC	(400071)	/PATTERN. FOR THE 7 FILE BIT MAP BLOCKS,
	JMS	READ		/THE FILE SIZES ARE COMPUTED AND STORED
	LAC	(FSZTAB+7)	/IN A FILE SIZE TABLE. THE SAME IS DONE
	DAC	AX12		/FOR BLOCK 100 IN ORDER TO GET A COUNT
	LAC	(+72)		/FOR THE MASTER FILE BIT MAP AND (IN CASE
	JMS	READ		/THIS IS A SYSTEM TAPE) A COUNT OF THE
	LAC	(FSZTAB+47)	/SYSTEM FILE BIT MAP.
	DAC	AX12
	LAC	(+76)
	JMS	READ
	LAC	(FSZTAB+57)
	DAC	AX12
	LAC	(400077)
	JMS	READ
	LAC	(FSZTAB+17)
	DAC	AX12
	LAC	(400073)
	JMS	READ
	LAC	(FSZTAB+27)
	DAC	AX12
	LAC	(+74)
	JMS	READ
	LAC	(FSZTAB+67)
	DAC	AX12
	LAC	(+100)
	JMS	READ
/
/ DETACH THE DECTAPE.
/
	CAL	DTCHDT
	CAL	WAITFR
	LAC	EV
	SPA
	JMP	ERR5A		/"DETACH" ERROR.
/
	.EJECT
/ CHECK WORD 203, BIT 3, TO SEE IF THIS IS A "NORMAL" RATHER THAN A
/ "SYSTEM" TAPE.
/
	DZM	SYSTAP		/0 MEANS NOT A SYSTEM TAPE.
	LAC	(BUF)
	AND	(7777)
	PAX			/BUFFER ADDRESS WITHOUT THE PAGE BITS.
	LAC	203,X
	AND	(040000)
	DAC	SYSTAP		/NON-0 MEANS IT IS A SYSTEM TAPE.
/
/ SETUP A COUNTER OF THE MAXIMUM NUMBER OF USER FILE ENTRIES ON THE TAPE.
/
	LAW	-70		/MAX. COUNT FOR A "NORMAL" TAPE.
	DAC	NTRIES
	LAC	SYSTAP		/IS THIS A SYSTEM TAPE?
	SNA
	JMP	.+3		/NO.
	LAW	-30		/YES -- MAX. COUNT FOR A "SYSTEM" TAPE.
	DAC	NTRIES
	LAC	NTRIES		/SAVE COUNTER FOR FILE ENTRY LOOP.
	DAC	ENTRYS
/
/ COUNT THE NUMBER OF BLOCKS OCCUPIED BY USER FILES. AS A PRECAUTION IN
/ CASE THE FILE BIT MAP IS NOT CLEARED WHEN THE FILE ENTRY IS FREED
/ AFTER A FILE HAS BEEN DELETED, DON'T ADD THE FILE BIT MAP COUNT UNLESS
/ THE FILE ENTRY EXISTS. ALSO, COUNT THE NUMBER OF USER FILES.
/
	LAC	(FSZTAB-1)	/SET UP AUTOINCREMENT REGISTER 10 TO PICK
	DAC*	(X10)		/UP THE FILE SIZES.
	DZM	USRTTL		/INITIALIZE THE COUNT OF THE TOTAL NUMBER
				/OF USER FILE BLOCKS.
	DZM	FILCNT		/INITIALIZE THE NUMBER OF USER FILES.
CTLOOP	LAC	43,X		/IS THE "FILE ACTIVE" BIT SET?
	SMA
	JMP	NOTSET		/NO -- EMPTY FILE ENTRY.
	LAC*	X10		/YES -- ADD THE FILE SIZE TO THE TOTAL.
	TAD	USRTTL
	DAC	USRTTL
	IDX	FILCNT
	SKP
NOTSET	LAC*	X10		/INCREMENT THE INDEX.
	AXR	+4
	ISZ	NTRIES
	JMP	CTLOOP
/
/ FIRST LINE -- PRINT THE DECTAPE UNIT NUMBER.
/
	LAC	(PRTBUF+1)	/INITIALIZE THE STORAGE POINTER TO THE
	DAC*	(X10)		/BEGINNING OF THE PRINT BUFFER.
	LAC	(011003)	/SET UP HEADER WORD 0 IN THE PRINT BUFFER.
	DAC	PRTBUF
	LAC	(040503)	/.SIXBT "DEC".
	JMS	SIXBIT		/CONVERT FROM .SIXBT AND STORE IN BUFFER.
	LAC	(240120)	/.SIXBT "TAP".
	JMS	SIXBIT
	LAC	(050025)	/.SIXBT "E U".
	JMS	SIXBIT
	LAC	(161124)	/.SIXBT "NIT".
	JMS	SIXBIT
	JMS	SPACE
	LAC	UNIT		/CONVERT THE UNIT # TO ASCII AND
	AAC	+60		/STORE IT IN THE BUFFER.
	DAC*	X10
	JMS	PRTOUT
/
/ SECOND LINE -- PRINT THE CURRENT DATE.
/
	CAL	DATE		/GET THE DATE & TIME FROM THE EXECUTIVE.
	LAC	(PRTBUF+1)	/RESET THE BUFFER STORAGE POINTER.
	DAC*	(X10)
	CLA			/STORE 4 SPACES.
	JMS	SIXBIT
	JMS	SPACE
	LAC	DAY		/CONVERT AND STORE THE DAY.
	JMS	TWODIG
	LAC	(55)		/- (HYPHEN).
	DAC*	X10
	LAC	MONTH		/LOOK UP THE MONTH IN A TABLE.
	TAD	(MONTAB-1)
	DAC*	(X11)
	LAC*	X11
	JMS	SIXBIT		/CONVERT AND STORE THE MONTH.
	LAC	(55)		/- (HYPHEN).
	DAC*	X10
	LAC	YEAR		/CONVERT AND STORE THE YEAR.
	JMS	TWODIG
	JMS	SPACE
	JMS	PRTOUT
/
/ THIRD LINE -- PRINT THE NUMBER OF FREE BLOCKS.
/
	LAC	(012003)	/SET UP HEADER WORD 0 IN THE PRINT BUFFER.
	DAC	PRTBUF
	LAC	FSZTAB+70	/# OF USED BLOCKS.
	TCA
	TAD	(1100)		/AC NOW HAS THE # OF FREE BLOCKS.
	JMS	OCTAL		/CONVERT AND STORE THE NUMBER.
	JMS	SPACE
	LAC	(062205)	/.SIXBT "FRE".
	JMS	SIXBIT
	LAC	(050002)	/.SIXBT "E B".
	JMS	SIXBIT
	LAC	(141323)	/.SIXBT "LKS".
	JMS	SIXBIT
	JMS	PRTOUT
/
/ FOURTH LINE -- PRINT THE NUMBER OF USER FILES.
/
	LAC	(013003)	/SET UP HEADER WORD 0 IN THE PRINT BUFFER.
	DAC	PRTBUF
	LAC	FILCNT		/# OF USER FILES.
	JMS	OCTAL		/CONVERT AND STORE IN THE PRINT BUFFER.
	LAC	(002523)	/.SIXBT " US".
	JMS	SIXBIT
	LAC	(052200)	/.SIXBT "ER ".
	JMS	SIXBIT
	LAC	(061114)	/.SIXBT "FIL".
	JMS	SIXBIT
	LAC	(052300)	/.SIXBT "ES ".
	JMS	SIXBIT
	JMS	PRTOUT
/
/ FIFTH LINE -- PRINT THE NUMBER OF SYSTEM BLOCKS.
/
	LAC	USRTTL		/THE NUMBER OF SYSTEM
	TCA			/BLOCKS = THE TOTAL NUMBER OF BLOCKS USED
	TAD	FSZTAB+70	/(FROM THE MASTER BIT MAP) MINUS THE
				/NUMBER OF USER FILE BLOCKS.
	JMS	OCTAL
	LAC	(002331)	/.SIXBT " SY".
	JMS	SIXBIT
	LAC	(232405)	/.SIXBT "STE".
	JMS	SIXBIT
	LAC	(150002)	/.SIXBT "M B".
	JMS	SIXBIT
	LAC	(141323)	/.SIXBT "LKS".
	JMS	SIXBIT
	JMS	PRTOUT
/
/ CONVERT THE FILE ENTRY INFORMATION AND PACK IT IN IMAGE ASCII FORM IN THE
/ PRINT BUFFER.
/
	LAC	(016003)	/SET UP HEADER WORD 0 IN THE PRINT BUFFER.
	DAC	PRTBUF
	LAC	(FSZTAB-1)	/SET UP AUTOINDEX REGISTER 12 FOR PICKING
	DAC*	(X12)		/UP FILE SIZES.
	LAC	(BUF+40)	/FIRST ENTRY FOLLOWS 40-WORD MASTER BITMAP.
	AND	(7777)
NXNTRY	PAX
	DAC	XRVAL
/
/ CHECK FOR AN EMPTY FILE ENTRY, I.E., A NULL FILE NAME.
/
	LAC	0,X
	SNA
	JMP	EMPTY		/EMPTY SLOT.
/
/ CONVERT THE FILE ENTRY INFORMATION.
/
	LAC	0,X		/FIL
	JMS	SIXBIT
	LAC	1,X		/NAM
	JMS	SIXBIT
	JMS	SPACE
	LAC	2,X		/EXT
	JMS	SIXBIT
	JMS	SPACE
	LAC	3,X		/FILE'S 1ST BLOCK #.
	AND	(1777)
	JMS	OCTAL		/CONVERT TO 6 DIGITS -- SUPPRESS LEADING 0'S.
	JMS	SPACE
	LAC	SYSTAP		/IF NOW PRINTING THE SYSTEM FILES FROM
	SMA!CLA			/THE SECOND HALF OF A SYSTEM TAPE DIRECT-
				/ORY, THE FILE SIZE IN THE FILE BIT MAP
				/IS MEANINGLESS. PRINT 0 INSTEAD.
	LAC*	X12		/NUMBER OF BLOCKS IN THE FILE.
	JMS	OCTAL
	LAC*	(X12)		/SAVE AUTOINDEX 12.
	DAC	AX12
	JMS	PRTOUT
	LAC	AX12		/RESTORE AUTOINDEX 12.
	DAC*	(X12)
	SKP
/
/ MOVE ON TO THE NEXT ENTRY.
/
EMPTY	LAC*	X12		/ADD 1 TO AUTOINDEX REGISTER 12.
	LAC	XRVAL
	AAC	+4
	ISZ	ENTRYS
	JMP	NXNTRY
/
/ IF THIS IS A SYSTEM TAPE AND THE SYSTEM FILES HAVEN'T YET BEEN LISTED, DO SO.
/
	LAC	SYSTAP		/SYSTEM TAPE AND NOT FINISHED?
	SPA!SNA
	JMP	DONE		/NO.
	CLC			/YES -- SET FLAG NEGATIVE SO THAT NEXT
	DAC	SYSTAP		/TIME THROUGH HERE IT WILL BE FINISHED.
	LAW	-30		/SET COUNT OF THE # OF SYS FILE ENTRIES.
	DAC	ENTRYS
	LAC*	(X12)		/MOVE POINTER AHEAD TO BYPASS SYSTEM BITMAP.
	AAC	+10
	DAC*	(X12)
	LAC	XRVAL		/MOVE XR PAST LAST ENTRY AND SYSTEM BITMAP.
	AAC	+44
	JMP	NXNTRY
/
/ DETACH THE "PRINTER".
/
DONE	CAL	DTCHLP
	CAL	WAITFR
	LAC	EV
	SAD	(-6)
	CLA			/"DETACH" UNIMPLEMENTED.
	SPA
	JMP	ERR5		/"DETACH" ERROR.
/
/ DIRECTORY PRINTOUT COMPLETED. EXAMINE THE EVENT VARIABLE VALUE RETURNED
/ BY THE TRANSFER-COMMAND-LINE DIRECTIVE TO SEE IF THE LINE WAS TERMINATED
/ BY CARRIAGE RETURN (+2), ALTMODE (+1), OR IF THE LINE BUFFER IS TOO
/ SMALL (-16). REQUEST 'TDV...' UNLESS THE TERMINATOR WAS ALTMODE.
/
	LAC	XFEREV
	SAD	(1)
	SKP
EXIT	CAL	REQTDV		/REQUEST 'TDV...'.
	CAL	(10)		/EXIT.
/
	.EJECT
/ ERROR EXIT.
/
ERR1A	LAC	(MES1)		/"ATTACH" ERROR.
	SKP
ERR2	LAC	(MES2)		/NOT A LISTING DEVICE.
	SKP
ERR4	LAC	(MES4)		/PRINTOUT ERROR.
	SKP
ERR5A	LAC	(MES5)		/"DETACH" ERROR.
	DAC	TYPE+4
	LAC	EV		/SAVE EV VALUE SO THAT SOMEONE MAY EXAMINE
	DAC	ERRCOD		/IT USING THE "OPEN" MCR FUNCTION.
	JMP	DTLP
ERR2A	LAC	(MES2A)		/NOT DECTAPE.
	SKP
ERR3	LAC	(MES3)		/DECTAPE ERROR.
	DAC	TYPE+4
	LAC	EV
	DAC	ERRCOD
	CAL	DTCHDT		/DETACH THE DECTAPE.
	CAL	WAITFR
DTLP	CAL	DTCHLP		/DETACH THE "PRINTER".
	CAL	WAITFR
	JMP	TYPEIT
ERR1	LAC	(MES1)		/"ATTACH" ERROR.
	SKP
ERR5	LAC	(MES5)		/"DETACH" ERROR.
	DAC	TYPE+4
	LAC	EV		/SAVE EV VALUE SO THAT SOMEONE MAY EXAMINE
	DAC	ERRCOD		/IT USING THE "OPEN" MCR FUNCTION.
TYPEIT	CAL	TYPE
	CAL	WAITFR
	JMP	EXIT
/
	.EJECT
MES1	004002; 0; .ASCII "DTD-ATTACH ERR"<15>
MES2	006002; 0; .ASCII "DTD-NOT A LISTING DEV"<15>
MES2A	005002; 0; .ASCII "DTD-NOT DECTAPE"<15>
MES3	005002; 0; .ASCII "DTD-DECTAPE ERR"<15>
MES4	005002; 0; .ASCII "DTD-PRINTOUT ERR"<15>
MES5	004002; 0; .ASCII "DTD-DETACH ERR"<15>
/
/ SUBROUTINE READ -- READ IN THE INDICATED DECTAPE BLOCK IN THE INDICATED
/ DIRECTION. COMPLEMENT OBVERSE THE DATA IF THE BLOCK WAS READ IN THE
/ REVERSE DIRECTION. COMPUTE THE FILE SIZES FROM THE FILE BIT MAPS AND
/ STORE THE RESULTS IN THE FILE SIZE TABLE. THIS IS ALSO DONE FOR BLOCK
/ 100 IN ORDER TO COUNT THE NUMBER OF BLOCKS USED (FROM THE MASTER BIT
/ MAP) AND (IF THIS IS A SYSTEM TAPE) THE NUMBER OF SYSTEM BLOCKS (FROM
/ THE SYSTEM BIT MAP).
/
/ CALLING SEQUENCE:
/
/	AX12 SET UP FOR STORING FILE SIZES
/	+ OR - BLOCK # IN THE AC (+ = FORWARD; - = REVERSE)
/	JMS	READ
/	(RETURN IF NO READ ERROR OCCURRED)
/
/ ALTERED REGISTERS:
/
/	EFFECTIVELY ALL (DUE TO THE CAL)
/
READ	0
	DAC	DTGET+3		/STORE THE BLOCK NUMBER AND DIRECTION
				/INDICATOR IN THE "GET" CPB.
	CAL	DTGET		/READ IN THE TAPE BLOCK.
	CAL	WAITFR
	LAC	EV
	SPA
	JMP	ERR3		/DECTAPE ERROR.
	LAC	AX12
	DAC*	(X12)
/
/ IF THE TAPE WAS READ IN THE REVERSE DIRECTION, PERFORM THE COMPLEMENT
/ OBVERSE ON THE DATA.
/
	LAC	DTGET+3
	SMA
	JMP	FORWRD		/BLOCK READ FORWARD -- DATA O.K.
/
	.EJECT
	LAW	-200		/INTERCHANGE WORDS IN THE BLOCK, SO LOOP
	DAC	COUNT		/FOR ONLY HALF THE BLOCK SIZE.
	LAC	(BUF-1)		/SET UP POINTERS TO GET/PUT FROM THE
	DAC*	(X10)		/FRONT END OF THE BLOCK.
	DAC*	(X11)
	CLX			/SET UP THE XR TO GET/PUT FROM THE TAIL
				/END OF THE BLOCK WORKING BACKWARDS.
COBVLP	LAC*	X10		/PICK UP FRONT END DATA WORD, TURN IT INTO
	JMS	OBVERS		/ITS ONES COMPLEMENT OBVERSE, AND
	DAC	TEMP		/SAVE IT.
	LAC	BUF+377,X	/PICK UP TAIL END DATA WORD, TURN IT INTO
	JMS	OBVERS		/ITS ONES COMPLEMENT OBVERSE, AND
	DAC*	X11		/STORE IT.
	LAC	TEMP		/REPLACE THE TAIL END WORD.
	DAC	BUF+377,X
	AXR	-1		/BACK UP THE TAIL END INDEX.
	ISZ	COUNT
	JMP	COBVLP
	JMP	FORWRD		/DONE.
/
/ SUBROUTINE OBVERS -- UNSCRAMBLE THE WORD IN THE AC WHOSE BITS ARE
/ COMPLEMENTED AND ARRANGED IN THE FOLLOWING WAY:
/
/	15-16-17  12-13-14  9-10-11  6-7-8  3-4-5  0-1-2
/
/	F	  E	    D	     C	    B	   A
/
OBVERS	0
	CMA			/ F   E   D   C   B   A
	SWHA
	DAC	OBV1		/ C   B   A   F   E   D
	ALS	6		/ A   F   E   D   ?   ?
	XOR	OBV1
	AND	(700700)	/ A\C 0   0   D\F 0   0
	DAC	OBV2
	CLL
	LRS	6		/ 0   0   A\C 0   0   D\F
	XOR	OBV1		/ C   B   C   F   E   F
	XOR	OBV2		/ A   B   C   D   E   F
	JMP*	OBVERS
/
OBV1	0			/ C   B   A   F   E   D
OBV2	0			/ A\C 0   0   D\F 0   0
/
	.EJECT
/ COMPUTE THE SIZES OF THE 8 FILES REPRESENTED BY THE FILE BIT MAPS IN
/ THE BLOCK JUST READ.
/
FORWRD	LAW	-10		/8 FILES PER BLOCK.
	DAC	FILCNT
	LAC	(BUF-1)		/SET UP AUTOINDEX REGISTER 10 TO GET
	DAC*	(X10)		/WORDS FROM THE BLOCK.
/
FLLOOP	DZM	SIZE		/INITIALIZE THE FILE SIZE.
	LAW	-40		/40 OCTAL WORDS PER BIT MAP.
	DAC	MAPCNT
/
MAPLP	LAW	-22		/18 BITS PER WORD.
	DAC	WDCNT
	LAC*	X10		/GET BIT MAP WORD.
WDLOOP	RAL
	SZL			/SKIP ON A ZERO BIT.
	IDX	SIZE		/ADD 1 TO FILE SIZE.
	ISZ	WDCNT		/END OF WORD?
	JMP	WDLOOP		/NO.
	ISZ	MAPCNT		/END OF FILE BIT MAP?
	JMP	MAPLP		/NO.
	LAC	SIZE		/STORE THE SIZE IN THE FILE SIZE TABLE.
	DAC*	X12
	ISZ	FILCNT		/END OF THIS DECTAPE BLOCK?
	JMP	FLLOOP		/NO.
	JMP*	READ
/
	.EJECT
/ SUBROUTINE PRTOUT -- STORE CARRIAGE RETURN LINE FEED IN THE PRINT BUFFER,
/ PRINT THE LINE, AND THEN RESET THE POINTER TO THE BEGINNING OF THE
/ PRINT BUFFER.
/
/ CALLING SEQUENCE:
/
/	JMS	PRTOUT
/
/ ALTERED REGISTERS:
/
/	EFFECTIVELY ALL (DUE TO THE CAL)
/
PRTOUT	0
	LAC	(15)		/CARRIAGE RETURN.
	DAC*	X10
	LAC	(12)		/LINE FEED.
	DAC*	X10
	CAL	PRINT
	CAL	WAITFR
	LAC	EV
	SPA
	JMP	ERR4		/PRINT ERROR.
	LAC	(PRTBUF+1)	/RESET THE STORAGE POINTER.
	DAC*	(X10)
	JMP*	PRTOUT
/
	.EJECT
/ SUBROUTINE SIXBIT -- UNPACK THE 3 .SIXBT CHARACTERS IN THE AC, CONVERT
/ THEM TO ASCII, AND STORE THEM IN THE PRINT BUFFER.
/
/ CALLING SEQUENCE:
/
/	.SIXBT WORD IN THE AC
/	JMS	SIXBIT
/	(UNCONDITIONAL RETURN)
/
/ ALTERED REGISTERS:
/
/	AC, MQ & X10
/
SIXBIT	0
	LMQ
	JMS	BYTE
	JMS	BYTE
	JMS	BYTE
	JMP*	SIXBIT
/
BYTE	0			/SUBROUTINE USED BY "SIXBIT".
	CLA!CLL
	LLS	6		/GET NEXT .SIXBT CHARACTER FROM THE MQ.
	SZA			/CONVERT TO ASCII.
	AAC	40
	AND	(77)
	AAC	40
	DAC*	X10
	JMP*	BYTE
/
/ SUBROUTINE SPACE -- STORE A "SPACE" CHARACTER IN THE PRINT BUFFER.
/
/ CALLING SEQUENCE:
/
/	JMS	SPACE
/	(UNCONDITIONAL RETURN)
/
/ ALTERED REGISTERS:
/
/	AC & X10
/
SPACE	0
	LAC	(40)		/A "SPACE".
	DAC*	X10
	JMP*	SPACE
/
	.EJECT
/ SUBROUTINE OCTAL -- CONVERT THE NUMBER IN THE AC INTO 6 OCTAL DIGITS IN
/ ASCII, SUBSTITUTING SPACES FOR LEADING ZEROS. STORE THEM IN THE PRINT BUFFER.
/
/ CALLING SEQUENCE:
/
/	NUMBER IN THE AC
/	JMS	OCTAL
/	(UNCONDITIONAL RETURN)
/
/ ALTERED REGISTERS:
/
/	AC, MQ & X10
/
OCTAL	0
	LMQ
	LAW	-6		/SET COUNT FOR 6 DIGITS.
	DAC	DIGCNT
	DZM	ZFLAG		/INITIALIZE THE "LEADING ZERO SUPPRESS" FLAG.
AGAIN	CLA!CLL
	LLS	3		/GET NEXT DIGIT.
	SZA			/IS IT A 0?
	IDX	ZFLAG		/NO -- INDICATE SIGNIFICANT DIGIT ENCOUNTERED.
	SZA
	JMP	NONZER
	LAW	-1		/IS THIS THE LAST DIGIT?
	SAD	DIGCNT
	JMP	LAST0		/YES -- ALWAYS PRINT IT.
	LAC	ZFLAG		/NO -- SUPPRESS LEADING 0 IF ZFLAG=0.
LAST0	SZA!CLA
NONZER	AAC	20		/CONVERT TO ASCII.
	AAC	40
	DAC*	X10
	ISZ	DIGCNT
	JMP	AGAIN
	JMP*	OCTAL
/
	.EJECT
/ SUBROUTINE TWODIG -- CONVERT THE NUMBER IN THE AC INTO 2 DECIMAL DIGITS
/ IN ASCII, SUBSTITUTING A SPACE FOR A LEADING ZERO. STORE THEM IN THE
/ PRINT BUFFER.
/
/ CALLING SEQUENCE:
/
/	NUMBER IN THE AC
/	JMS	TWODIG
/	(UNCONDITIONAL RETURN)
/
/ ALTERED REGISTERS:
/
/	AC, LR, MQ & X10
/
TWODIG	0
	CLL
	IDIV			/DIVIDE NUMBER BY 10.
	.DEC
	10
	.OCT
	PAL			/SAVE REMAINDER IN LR.
	LACQ			/CONVERT AND STORE DIGIT 1.
	AAC	60
	DAC*	X10
	PLA			/CONVERT AND STORE DIGIT 2.
	AAC	60
	DAC*	X10
	JMP*	TWODIG
/
MONTAB=.-1			/TABLE OF MONTHS.
	.SIXBT	/JAN/
	.SIXBT	/FEB/
	.SIXBT	/MAR/
	.SIXBT	/APR/
	.SIXBT	/MAY/
	.SIXBT	/JUN/
	.SIXBT	/JUL/
	.SIXBT	/AUG/
	.SIXBT	/SEP/
	.SIXBT	/OCT/
	.SIXBT	/NOV/
	.SIXBT	/DEC/
/
	.EJECT
WAITFR	20			/"WAITFOR" CPB.
	EV
/
HINFLP	3600			/"HINF" CPB.
	EV
	TDVOUT			/TDV LISTING OUTPUT LUN.
/
HINFDT	3600			/"HINF" CPB.
	EV
	DTPLUN			/DECTAPE INPUT LUN.
/
ATCHLP	2400			/"ATTACH" CPB.
	EV
	TDVOUT			/TDV LISTING OUTPUT LUN.
/
ATCHDT	2400			/"ATTACH" CPB.
	EV
	DTPLUN			/DECTAPE INPUT LUN.
/
DTCHLP	2500			/"DETACH" CPB.
	EV
	TDVOUT			/TDV LISTING OUTPUT LUN.
/
DTCHDT	2500			/"DETACH" CPB.
	EV
	DTPLUN			/DECTAPE INPUT LUN.
/
DTGET	3000			/"GET DECTAPE BLOCK" CPB.
	EV
	DTPLUN			/DECTAPE INPUT LUN.
	XX			/BLOCK NUMBER FORWARD.  +400000(8) REVERSE.
	BUF			/CORE ADDRESS.
	400			/WORD COUNT.
/
PRINT	2700			/"WRITE" CPB.
	EV
	TDVOUT			/TDV LISTING OUTPUT LUN.
	3			/IMAGE ASCII DATA MODE.
	PRTBUF
/
PRTBUF	016003			/IMAGE ASCII PRINT LINE BUFFER.
	0			/HEADER WORD 0 WILL VARY AS THE WORD
	.BLOCK	30		/PAIR COUNT IS ALTERED.
	15			/CARRIAGE RETURN.
	12			/LINE FEED.
/
TYPE	2700			/"WRITE" CPB.
	EV
	TDVTTY			/TDV TTY ERROR LUN.
	2			/IOPS ASCII DATA MODE.
	XX			/MESSAGE ADDRESS.
/
/
REQTDV	1			/"REQUEST" CPB.
	0
	.SIXBT	"TDV"
	.SIXBT	"..."
	0			/USE THE DEFAULT PRIORITY.
/
XFER	37			/"TRANSFER TDV COMMAND LINE" CPB.
	EV
	BUF			/BUFFER ADDRESS.
	401			/BUFFER SIZE.
/
DATE	24			/"DATE & TIME" CPB.
	EV
MONTH	XX			/(1 - 12).
DAY	XX			/(1 - 31).
YEAR	XX			/(0 - 99).
HOURS	XX
MINS	XX
SECS	XX
/
/ VARIABLES.
/
XFEREV	0			/EVENT VARIABLE VALUE RETURNED BY THE
				/"XFER" DIRECTIVE.
EV	0			/EVENT VARIABLE.
NTRIES	0			/COUNTER -- NUMBER OF FILE ENTRIES.
ENTRYS	0			/COUNTER -- NUMBER OF FILE ENTRIES.
SYSTAP	0			/0 = NORMAL TAPE; NON-0 = SYSTEM TAPE.
				/+ NON-0 WHILE PRINTING USER FILES ON SYS TAPE.
				/- NON-0 WHILE PRINTING SYSTEM FILES.
USRTTL	0			/COUNT -- TOTAL NUMBER OF USER FILE BLOCKS.
XRVAL	0			/SAVED LOOP VALUE OF THE XR.
DIGCNT	0			/DIGIT COUNTER.
ZFLAG	0			/"LEADING ZERO SUPPRESS" FLAG -- SET NON-0
				/WHEN A SIGNIFICANT DIGIT IS ENCOUNTERED.
ERRCOD	0			/EV VALUE SAVED BEFORE ERROR PRINTOUT IN
				/CASE SOMEONE WANTS TO EXAMINE IT USING
				/THE "OPEN" MCR FUNCTION.
FILCNT	0			/COUNTER -- 8 FILE BIT MAPS PER BLOCK.
				/ALSO -- NUMBER OF USER FILES.
SIZE	0			/TEMPORARY COUNTER FOR FILE SIZE.
MAPCNT	0			/COUNTER -- 40 OCTAL WORDS PER BIT MAP.
WDCNT	0			/COUNTER -- 18 BITS PER WORD.
UNIT	0			/DECTAPE UNIT #.
COUNT	0			/COUNTER.
TEMP	0			/TEMPORARY STORAGE.
AX12	0			/TEMP STORAGE FOR X12 VALUE.
/
FSZTAB	.BLOCK	100		/FILE SIZE TABLE.
/
BUF	.BLOCK	401		/EXTRA WORD IS TO GUARD AGAINST POSSIBLE
				/HARDWARE TIMING ERROR WHEREIN DECTAPE
				/TRANSFERS AN EXTRA WORD.
/
	.END	DTD