File: SDA.PA of Tape: Sources/RTS/s3
(Source file text) 

/SDA "REAL-TIME" HANDLER
/ACCEPTS STANDARD MASS STORAGE TASK MESSAGE FORMAT
/THIS HANDLER DRIVES UNITS 0,2,4,6 & 1,3,5,7
/PARAMETER 'DRIVE' WILL SELECT WHICH GROUP IS ACTIVE
/DEFAULT: DRIVE=0:SELECTS SDA0 AND SDA1 
/BLOCKS LARGER THAN 2047 GIVE IMMEDIATE FATAL ERROR
/NUMBER OF ERROR TRIES CAN BE CHANGED.
/THE MQ IS USED FOR CHECKSUM COMPUTATION
/AND IT WILL HOLD A TC08 COMPATIBLE STATUS
/AT THE END OF A DECTAPE TRANSFER.
/THE SYSTEM CLOCK WILL LOSE SOME TICKS
/DURING THE ACTUAL DATA TRANSFER DUE TO
/SWITCHING OFF OF THE INTERRUPT ENABLE.
/THIS SWITCHING OFF WILL LAST AT MOST 17MSECS.

/W.VAN DER MARK, ETH, ZUERICH 10/1/76

	IFNDEF DRIVE <DRIVE=0>
	UNITNO=DRIVE^10

/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

TASK=	SDA
INIWT=	0
CUR=	0

	SDTICS=	SHERTZ%100	/BLOCK TIME= 15 MSECS
	IFZERO	SDTICS <TAPERR,	-ERROR->   /WRONG CLOCK RATE
	SDTICS=SDTICS+1	/THE REAL-TIME CLOCK IS ASYNCHRONOUS
	UTSTIM=	SHERTZ%6-SDTICS	/UP-TO-SPEED TIME = 170 MS

	FIELD	CUR%10
	*3600

/MAIN HANDLER LOOP

START,	IFDEF	PWRF<
	CAL
	SEND
	PWRF
	DRLADR
	>
LOOP,	CAL
	RECEIV		/GET A MESSAGE
SADDR,	0
	DCA	FLD
DTREDO,	TAD	SADDR
	DCA	ADDR
	TAD	TRIES
	DCA I	(ERCNT	/TRY X TIMES
	JMS	GET
	AND	C1	/ALLOW ONLY 2 UNITS.
	SDLD
	TAD	(260
	DCA	MUNIT	/STORE UNIT IN MESSAGE
	SDRD
	CLL RTR
	DCA	UNIT
	TAD	UNIT
	DCA I	(WUNIT
	JMS	GET
	SDLD		/PUT FUNCTION IN REG.
	AND	C70
	TAD	C6201
	DCA I	(XFIELD
	SDRD		/GET FUNCTION
	CLL RAL
	AND	CM200
	DCA I	(PGCT
	JMS	GET
	DCA I	(BUFF	/GET OS/8 STYLE ARGS
	JMS	GET
	CLL RAL
	DCA I	(TBLOCK	/DOUBLE BLOCK NUMBER
	SZL
	JMP	FATAL	/BLOCK # TOO BIG. ERROR: 0000
	TAD	UNIT	/TRANSFER UNIT AND FUNCTION
	JMS I	(SELECT	/TO THIRD PAGE
	JMP I	(STARTS	/OK LETS SEARCH
	/** FALL INTO NEXT PAGE	/SELECT ERROR: 400


FATAL,	CLL CML RAR	/SET ERROR BIT AND SHIFT IN POSITION
EXIT,	DCA	STATUS	/NORMAL RETURN
	TAD	UNIT	/STOP TAPE FIRST
	SDLC
	TAD	FLD	/THIS JUST SETS THE DF
	DCA	.+1
	HLT
	TAD	STATUS
	DCA I	ADDR
	TAD	FLD
	DCA	PFLD
	AC7775
	TAD	SADDR	/GET POINTER TO MESSAGE EVENT FLAG
	CAL
	POST
STATUS,
PFLD,	HLT
	JMP	LOOP	/GET ANOTHER MESSAGE

GET,	0
FLD,	HLT
	TAD I	ADDR
	ISZ	ADDR
	CDF CUR
	JMP I	GET

DERSDA,	0		/DERAIL SUBROUTINE
	TAD	.-1	/IF WE WERE WAITING: WAIT
	TAD	(-LOOP	/IF EXECUTING: RESTART ALL
	SNA CLA
	JMP	LOOP
	JMP	DTREDO


UNIT,	0
ADDR,	0
CM200,	-200
C70,	70
C1,	1
C6201,	CDF 0
TRIES,	-3

ANSWER,	ZBLOCK 2

DRLADR,	ZBLOCK 3
	DERSDA

READYM,	ZBLOCK 3
	6001
	ANSWER
	"R;"E;"A;"D;"Y;" ;"S;"D;"A;
MUNIT,	0;0

	PAGE

C374,	374		/KEEP THIS CONSTANT HERE!
TC3,	3
M20,	-20
CLKMES,	ZBLOCK 5	/CLOCK MESSAGE
CLRATE,	SDTICS
BLKTAB,	ZBLOCK 2	/TAPES START REWOUND

			/FRW:TAR.GT.READ:L=1 - .LT.:L=0
NTFOUN,	SZL		/REV:TAR.GT.READ:L=0 - .LT.:L=1
	JMP	TSRCL	/RIGHT DIRECTION - GO WAIT
REVRS,	SPA		/IF TAR.GT.READ
	CLL CML		/FORCE FORWARD MOTION
GO,	CLA CML RTR	/PUT IN DIRECTION BIT
	TAD	C12XX
	TAD	WUNIT
	SDLC		/INITIATE THE MOTION
	TAD	(UTSTIM	/WAIT FOR UTS TO CLEAR (+-170MS)
	SKP
TSRCL,	CLA CLL
	TAD	(SDTICS
	DCA	CLRATE
	CAL		/WAIT FOR ONE BLOCK
	SENDW		/AND HOPE TO CATCH NEXT ONE
	CLOCK
	CLKMES
TSRCH,	IOF
	SDRC		/CLEAR FLAGS
	SDSS
	JMP	.-1	/SYNCHRONIZE WITH DTP1
	SDRC		/LOOK FOR BLOCK MARK OR END ZONE
	ION		/ION...BUT
	CIF CDF CUR	/TURN OFF INT. IN SKIP CHAIN
	CLL RTL		/DIRECTION TO LINK, DATA TO AC 4-9
			/FORWARD:LNK=0
C200,	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 #?
	DCA I	RBLOCK	/REMEMBER BLOCK #'S
	TAD I	RBLOCK	/FOR NEXT MESSAGE
	SZL		/IF IN REVERSE, LOOK FOR 3 BEFORE
C12XX,	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
	/**	FALL INTO NEXT PAGE

	IOF		/IOF NOW TO PREVENT MORE TIMING ERRS
	TAD	BUFF	/CLOCK WILL LOSE SOME TICKS
XFIELD,	HLT		/GETS CDF N
	JMS I	(RDWRT	/LETS TRANSFER DATA
	SDST		/TIME OR CHECK SUM ERROR?
	SKP
	TAD	C200	/TIMING ERROR. ERROR 100
	MQL		/SAVE STATUS FOR DISPLAY IN MQ
	SDRC
	AND	(7000	/BE SURE TO CLEAR WRITE BIT
	SDLC
	ION		/NEXT WILL EXECUTE
	MQA CLA		/GET STATUS BACK INTO AC
	SZA		/LNK OFF AT TRWCOM
	JMP	TRY3	/YES TRY UP TO X TIMES
	TAD	PGCT	/NO.. IS PAGE COUNT EXHAUSTED?
	TAD	(-200	/TURNS LINK ON
	SNA
	JMP I	(EXIT	/YES.. DONE THIS TRANSFER
	DCA	PGCT	/NEW PAGE COUNT
	ISZ	TBLOCK
	TAD	BUFF
	TAD	C200	/GET NEW BUFFER ADDRESS
	DCA	BUFF
	JMP	TSRCH

ENDZ,	CML IAC		/MAKE FORWARD: LNK=0
M110,	CLA SNA SZL	/IAC ALLOWS 'SNA'
	JMP	GO	/EXECUTE TURN AROUND AND SEARCH
	CML RTR		/END ZONE FORWARD - ERROR 1000
TRY3,	ISZ	ERCNT	/TRIED 3 TIMES?
	JMP	GO	/LINK IS ZERO
	JMP I	(FATAL

STARTS,	TAD	WUNIT	/GET UNIT FROM MESSAGE
	CLL RTL
	TAD	(BLKTAB
	DCA	RBLOCK	/SET INDIRECT POINTER
	TAD I	RBLOCK	/MEMORY OF TAPE POSITION.
	TAD	(12	/START FORWARD IF 'TBLOCK' POSITIONED
	CMA CLL		/MORE THAN 10 BLOCKS IN
	TAD	TBLOCK	/FRONT OF 'RBLOCK'
	JMP	GO	/LINK SET MEANS FORWARD

BUFF,	0
TBLOCK,	0
PGCT,	0
WUNIT,	0
RBLOCK,	0
ERCNT,	0
	PAGE

XBUFF,	0		/KEEP XBUFF  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
	SDRC		/CLEAR FLAGS-GET UNIT,FORWARD,GO
	SDLC		/CLEAR RESIDUAL TIMING ERRORS
RGRD,	SDSS		/40MMS FROM DTP1
	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 RAL		/SETUP TO RETRY IF WRITE LOCK
	SZA		/KEEP AC ON FOR ERROR 200 + (100)
	JMP I	RDWRT	/IF LOCKED OUT, ERROR
	JMS	R4LINE	/SKIP A WORD;LOCK MARK
C7600,	7600		/NEXT QUADFLAG SET AFTER
	TAD	WRTLP	/START OF CHECKSUM
	TAD	XUNIT	/35MMS FROM QUAD-LINE FLAG
	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
	SDSQ		/LET CHECK SUM FINISH
	JMP	.-1
	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
	SZA CLA
	TAD	(400	/PARITY ERROR: 200
	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	/AND INITIALIZES
	TAD	XUNIT	
	SDLC
	SDRD		/5MMSEC SETTLE
	DCA	XFUNCT
	SDRC		/SEE IF SELECT ERROR ON
	AND	C100
	SNA CLA
	JMP I	SELECT	/OK-YOU ARE VERY SELECTIVE
	CAL
	SENDW
	TTY
	READYM		/TELL HIM TO BE NARROW-MINDED
	SDRC
	AND	C100	/MAYBE HE DIDN'T LIKE THIS!
	CLL RTL
	RAL		
	SZA
	ISZ	SELECT	/SELECT ERROR: 400
	JMP I	SELECT	/HE DID LIKE IT

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

	$$$$