File: SD8X.PA of Tape: Various/System-Tapes/s5
(Source file text) 

/SD8X NON-RESIDENT DECTAPE HANDLER

/TWO PAGE, PAGE RELOCATABLE HANDLER FOR THE TD8E DECTAPE.
/THIS HANDLER DRIVES UNITS 0,2,4,6 & 1,3,5,7
/AND HAS ENTRY POINTS AT LOCATIONS 10,11,12,13
/AND 14,15,16,17 RELATIVE TO THE LOAD POINT.
/PARAMETER 'DRIVE' WILL SELECT WHICH GROUP IS ACTIVE
/DEFAULT: DRIVE=0:SELECTS SDA0 AND SDA1 (E.P. 10 & 14)
/THIS HANDLER CAN BE USED WITH ION SYSTEMS AND WILL
/TURN THE INTERRUPT OFF FOR AT MOST 17MSECS AND THIS
/ONLY DURING THE ACTUAL READ/WRITES.EXTRA FEATURES:
/^C CHECKED IMMEDIATELY BEFORE READ/WRITE
/BLOCKS LARGER THAN 2047 GIVE IMMEDIATE FATAL ERROR
/NUMBER OF ERROR TRIES CAN BE CHANGED BY THE FOLLOWING: 
/$ALTER SD8A (TO SD8D),  1
/7775/-NUMBER OF TRIES

/W.VAN DER MARK, ETH, ZUERICH 10/28/74
/VERSION G: 23-OCT-78 (DTA0 NAMES.
/VERSION F: 11/23/77

	IFNDEF DRIVE <DRIVE=0>
	UNITNO=DRIVE^10
	VERSION="G-300

/THE IOT'S ARE:

	SDSS=6771-UNITNO/SKIP ON SINGLE LINE FLAG
	SDST=6772-UNITNO/SKIP ON TIME ERROR
	SDSQ=6773-UNITNO/SKIP ON QUAD LINE FLAG
	SDLC=6774-UNITNO/LOAD TAPE COMMAND REGISTER
	SDLD=6775-UNITNO/LOAD DATA REGISTER
	SDRC=6776-UNITNO/READ COMMAND REGISTER
	SDRD=6777-UNITNO/READ DATA REGISTER
	/DESCRIPTOR BLOCK

	*0
	-2		/TWO DEVICES
	IFZERO DRIVE <
DEVICE SD8A;DEVICE DTA0;4210;SDA0-200+4000;ZBLOCK 2
DEVICE SD8A;DEVICE DTA1;4210;SDA1-200+4000;ZBLOCK 2
>
	IFZERO DRIVE-1 <
DEVICE SD8B;DEVICE DTA2;4210;SDA0-200+4000;ZBLOCK 2
DEVICE SD8B;DEVICE DTA3;4210;SDA1-200+4000;ZBLOCK 2
>
	IFZERO DRIVE-2 <
DEVICE SD8C;DEVICE DTA4;4210;SDA0-200+4000;ZBLOCK 2
DEVICE SD8C;DEVICE DTA5;4210;SDA1-200+4000;ZBLOCK 2
>
	IFZERO DRIVE-3 <
DEVICE SD8D;DEVICE DTA6;4210;SDA0-200+4000;ZBLOCK 2
DEVICE SD8D;DEVICE DTA7;4210;SDA1-200+4000;ZBLOCK 2
>

	*200		/UN1\REV\GO/WR\WLO\SELTIM/

C70,	70		/KEEP HERE!
TRIES,	-3		/OR SOME OTHER NUMBER
	IFNZRO DRIVE   <
TC3,	3
	IFNZRO DRIVE-1 <
C6201,	CDF 0
	IFNZRO DRIVE-2 <
CION,	ION
	>>>
CTC8LN,	CTCLN8-BASE
CSELCT,	SELECT-BASE
CRDW,	RDWRT-BASE
			/FRW:TAR.GT.READ:L=1 - .LT.:L=0
NTFOUN,	SZL		/REV:TAR.GT.READ:L=0 - .LT.:L=1
	JMP TSRCH	/RIGHT DIRECTION - GO ON
	JMP REVRS	/WRONG - SIGN SHOWS THE WAY

SDA0,	VERSION		/ENTRY FOR UNIT 0
	CLA CLL
	JMP SDA1X
M20,	-20		/FILLER WORD
SDA1,	VERSION		/ENTRY FOR UNIT 1
	CLA CLL CML
C1000,	TAD SDA1	/ALSO CONSTANT 1000
	DCA SDA0	/PICK UP ARGS AT SDA0
SDA1X,	RAR
	DCA UNIT	/UNIT # FROM LINK
	RDF
	TAD C6203
	DCA LEAVE	/SET UP EXIT FROM HANDLER
REENTR,	JMS INIT	/BECOMES 'TAD I SDA0'
BASE,	SDLD		/SAVE FUNCTION WORD IN REG.
C200,	AND C70		/ISOLATE FIELD OF TRANSFER
	TAD C6201
	DCA XFIELD
	SDRD		/GET FUNC. AGAIN
	CLL RAL
C374,	AND CM200	/GET A PAGE COUNT
	DCA PGCT
	ISZ SDA0	/POINT TO BUFFER
CTADI,	TAD I SDA0
	DCA BUFF
	ISZ SDA0	/POINT TO RECORD
	TAD I SDA0
	CLL RAL		/CONVERT TO DECTAPE BLOCKS
	DCA TBLOCK
	ISZ SDA0	/POINT TO ERROR RET.
	SZL		/SHOULD SKIP FOR LEGAL BLOCK
	JMP FATAL
	TAD TRIES
	DCA ERCNT	/X ERROR TRIES
	TAD UNIT	/INITIALIZE AND
	JMS I CSELCT	/CHECK FOR SELEC ERROR
	JMP .-2		/LOOPS IF NO ^C AND SELECT ERROR
	JMP GO		/OK,START THE SEARCH - LNK IS SET

TRWCOM,	IOF		/OR 'ION' - NEXT WILL EXECUTE
	SDST		/TIME OR CHECK SUM ERROR?
	SZA CLA		/LNK OFF AT TRWCOM
	JMP TRY3	/YES TRY UP TO 3 TIMES
	TAD PGCT	/NO.. IS PAGE COUNT EXHAUSTED?
	TAD CM200	/TURNS LINK ON
	SNA
	JMP EXIT	/YES.. DONE THIS TRANSFER
	DCA PGCT	/NEW PAGE COUNT
	ISZ TBLOCK
	TAD BUFF
	TAD C200	/GET NEW BUFFER ADDRESS
	DCA BUFF
REVRS,	SPA		/IF TAR.GT.READ
	CLL CML		/FORCE FORWARD MOTION
GO,	CLA CML RTR	/PUT IN DIRECTION BIT
	TAD C1000
	TAD UNIT
	SDLC		/INITIATE THE MOTION
	JMS I CTC8LN	/WAIT FOR 8 LINES TO PASS
			/AND CHECK FOR CTRL/C
TSRCH,	CIF CDF 0	/TURN OFF INT. IN SKIP CHAIN
	SDSS		/WAIT FOR BLOCK MARK OR END ZONE
	JMP TSRCH
	SDRC		/FORWARD:LNK=0
	CLL RTL		/DIRECTION TO LINK, DATA TO AC 4-9
	AND C374	/ISOLATE M.T BITS
	TAD M110	/IS IT END ZONE?
	SNA		/FORWARD:LNK=1
	JMP ENDZ	/YES..DO SOMETHING REASONABLE
	TAD M20		/HOW ABOUT BLOCK MARK?
	SZA CLA		/FORWARD:LNK=0
	JMP TSRCH	/NEITHER..KEEP LOOKING
	SDRD		/WHAT IS THIS BLOCK'S #?
	SZL		/IF IN REVERSE, LOOK FOR 3 BEFORE
	TAD TC3		/THE ACTUAL TARGET BLOCK
	CMA		/-READ(-3)-1
	TAD TBLOCK	/CML IF TAR.GT.READ(+3)
	CMA		/READ(+3)-TAR 
	SZA		/IS THIS THE BLOCK?
	JMP NTFOUN	/NO - GO CHECK LNK AND SIGN
	SZL CLA		/FOUND BLOCK - DIRECTION?
	JMP GO		/WRONG - TURN AROUND
	TAD CION	/LOAD 'ION' INST.
	SKON		/IF INT. ON - TURN OFF AND SKIP
	IAC		/=IOF
	DCA TRWCOM	/SAVE INSTR.
	SDRC		/CLEAR FLAGS-GET UNIT,FORWARD,GO
	SDLC		/CLEAR RESIDUAL TIMING ERRORS
	TAD BUFF
XFIELD,	HLT		/GETS CDF N
	JMS I CRDW	/LETS TRANSFER DATA
	JMP TRWCOM

ENDZ,	CML IAC		/MAKE FORWARD: LNK=0
M110,	CLA SNA SZL	/IAC ALLOWS 'SNA'
	JMP GO		/EXECUTE TURN AROUND AND SEARCH
			/END ZONE FORWARD - ERROR
TRY3,	ISZ ERCNT	/TRIED 3 TIMES?
	JMP GO		/LINK IS ZERO
FATAL,	CLL		/YES.. TAKE FATAL RETURN
	SKP CLA
EXIT,	ISZ SDA0	/NORMAL RETURN
	TAD UNIT	/STOP TAPE FIRST
	SDLC
	CLA CML RAR	/EITHER 0 OR 4000 IN AC
LEAVE,	HLT		/GETS CIF CDF N
	JMP I SDA0

INIT,	HLT		/FIND OUT WHERE WE GOT LOADED
INITAD,	TAD CTC8LN
	SPA		/MINUS ENDS LIST
BUFF,	JMP CM200
TBLOCK,	TAD INIT
PGCT,	DCA CTC8LN
ERCNT,	ISZ .-1
	ISZ INITAD
	JMP INITAD

	IFNZRO DRIVE-3 <
CION,	ION
	IFNZRO DRIVE-2 <
C6201,	CDF 0
	IFNZRO DRIVE-1 <
TC3,	3
	>>>

	*374		/KEEP CM200 HERE!
CM200,	7600		/CLA!
	TAD CTADI	/RESTORE
	DCA REENTR
	JMP REENTR

UNIT=SDA1
C6203=TSRCH

	PAGE
XBUFF,	0	/KEEP XBUFF AND EFUN HERE!

EFUN,	0	/EQUIVALENCE CHECKSUM
	DCA ETMP/ORIGINAL WORD IS KEPT
	TAD ETMP/19MMSEC SUB
	MQA	/X.OR.C
	CMA CLL	/.NOT.(X.OR.C) - LNK TO TRWCOM
	SWP	/C IN AC-(.NOT.X).AND.(.NOT.C) IN MQ
	AND ETMP/X.AND.C
	MQA	/(X.AND.C).OR.((.NOT.X).AND.(.NOT.C))
	MQL	/CLEAR AC AND RELOAD CHECKSUM
	JMP I EFUN

RDWRT,	0
	DCA XBUFF
	JMS CTCCHK	/WE CAN STILL PREVENT A WRITE
RGRD,	SDSS
	JMP .-1		/LOOK FOR REVERSE GUARD PATTERN
	SDRC	/IT TAKES AT MOST 25MMSEC TO GET HERE
	AND K77
	TAD CM32
	SZA CLA		/IF NOT REV. GUARD, KEEP LOOKING
	JMP RGRD
	TAD C7600
	DCA WORDS	/128 WORDS/BLOCK
	TAD XFUNCT
K7700,	SMA CLA		/IS IT READ OR WRITE?
	JMP TREAD
	SDRC		/CHECK FOR WRITE LOCKOUT
	AND TC300	/17MMSEC TO HERE
	CLL		/SETUP TO RETRY IF WRITE LOCK
	SZA		/KEEP AC ON FOR ERROR
	JMP I RDWRT	/IF LOCKED OUT, ERROR
	JMS R4LINE	/SKIP A WORD;LOCK MARK
	CLA		/NEXT QUADFLAG SET AFTER
	TAD WRTLP	/START OF CHECKSUM
	TAD XUNIT
	SDLC		/TURN ON WRITE HEAD
	MQL		/ZERO TO CHECKSUM
	TAD K77		/0077 IN REV. CHECKSUM
	JMS W4LINE	/GIVES 7700 CK:.NOT.EQU OF ALL
WRTLP,	TAD I XBUFF
	JMS W4LINE
	ISZ XBUFF	/INCREMENT BUFF. ADD.
K77,	77		/38MMSEC LOOP
	ISZ WORDS	/DONE A BLOCK?
	JMP WRTLP
	JMS W4LINE	/A 129 TH WORD OF 0
	JMS GCHK	/GET 6 BIT CHECKSUM
	AND K7700
	JMS W4LINE	/WRITE IT TO TAPE
	STA		/FOR TC08 DATA FORMAT
	JMS W4LINE	/LET CHECK SUM FINISH
	JMP I RDWRT	/SEE IF WE ARE FINISHED

TREAD,	JMS R4LINE	/LOCK MARK
	JMS R4LINE	/END LOCK,START CHECKS.
	JMS R4LINE	/SKIP CONTROL WORDS
	AND K77		/.NOT. CK
	MQL
RDLP,	JMS R4LINE
	DCA I XBUFF
	ISZ XBUFF
TC300,	300		/39MMSEC LOOP
	ISZ WORDS	/DONE BLOCK?
	JMP RDLP
	JMS R4LINE	/CHECK SUM 129 TH WORD
	JMS R4LINE	/READ CHECKS. AND HALF NONSNS
	AND K77		/.NOT.CK,ELIMINATES SECOND HALF
	JMS EFUN
	JMS GCHK	/COMPARE TAPE AND OUR CHECKSUM
	JMP I RDWRT	/80MMSEC TO SDST

W4LINE,	0		/ADD TO CHECKSUM, WRITE A 12 BIT
	SDSQ		/WORD
	JMP .-1		/SKIP ON QUAD LINE FLAG
	SDLD		/25MMSEC SUB
	JMS EFUN
	JMP I W4LINE

R4LINE,	0		/WAIT FOR QUAD FLAG AND READ
	SDSQ
	JMP .-1
	SDRD		/27MMSEC SUB
	JMS EFUN
	TAD ETMP
	JMP I R4LINE
GCHK,	0		/FORM 6 BIT CHECKSUM
	MQA CLA
	BSW
	JMS EFUN	/28MMSEC SUB
	MQA
	JMP I GCHK


SELECT,	0		/THIS ROUTINE CHECKS FOR SELECT
	DCA XUNIT	/INITIALIZES
	TAD XUNIT	/AND CHECKS FOR ^C TYPED
	SDLC
	SDRD		/5MMSEC SETTLE
	DCA XFUNCT
	SDRC		/SEE IF SELECT ERROR ON
	AND C100
	SNA CLA
	ISZ SELECT	/NOPE .TAKE NORMAL OUT
	JMS CTCCHK
SELEX,	SDRD
	RAR		/INITIAL DIR. TO LNK
C7600,	7600		/CLA
	JMP I SELECT

CTCCHK,	0
	KSF		/SEE IF FLAG IS UP
	JMP I CTCCHK	/NO..EXIT
	TAD C7600
	KRS
	TAD M7603	/IS IT A ^C?
	SZA CLA
	JMP I CTCCHK
	CDF 0
	IOF
	TAD XUNIT
	SDLC		/MAKE SURE TAPE IS STOPPED
	JMP I C7600	/YES - BACK TO KM.

C100,	100
M7603,	-7603
CM32,	-32
XFUNCT,	0
WORDS,	0
ETMP,	0
XUNIT,	0

CTCLN8,	0	/WAIT FOR 8 LINES AND CHECK CTRL/C
	JMS R4LINE
	JMS R4LINE
	JMS CTCCHK
	JMP I CTCLN8

	$$$$