File: LTA.PA of Tape: Sources/RTS/dec-s8-ortsa-b-uc
(Source file text) 

/2 RTS-8 LINCTAPE HANDLER
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1975 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.
/
/
/
/
/
/
/
/
/
/
/	FIXED BUG ON 18-JUN-75 RE USING DOUBLE BLOCKS IN OS/8 MODE
	TASK=LTA
	INIWT=0
	CUR=10

	LOC=5000	/LOAD ADDRESS

/	SR

/	MESSAGE FORMAT:

/LTMESG,ZBLOCK 3	/RTS-8 OVERHEAD
/	MODE+UNIT
/	RW+PAGES+FIELD
/	BUFADD
/	BLOKNO
/	STATUS

/MODE=	0	LINCTAPE CONTAINS 200 OR 201 WORDS PER BLOCK
/	4000	LINCTAPE CONTAINS 400 WORDS PER BLOCK

/UNIT=		UNIT NUMBER (0-7)

/RW=	0	READ
/	4000	WRITE

/PAGES=		NUMBER OF PAGES TO TRANSFER (BITS 1-5) 0 MEANS 40
/		MUST BE EVEN IF 400 WORD PER BLOCK MODE

/FIELD=		FIELD OF BUFFER (BITS 6-8)

/BUFADD=	ADDRESS OF BUFFER
/		WORD AFTER END OF BUFFER IS VOLATILE

/BLOKNO=	LINCTAPE BLOCK NUMBER IF 400 WORD PER BLOCK MODE
/		OS/8 LOGICAL BLOCK NUMBER IF 201 WORD PER BLOCK MODE
/		(ONE OS/8 BLOCK = 2 LINCTAPE BLOCKS IN THIS CASE)

/STATUS		ONES COMPLEMENT OF TAPE CHECKSUM LEFT HERE
/		0 MEANS NO ERRORS

/***********************/
/			/	IN 201 WORD PER BLOCK MODE
/	WARNING!  -->	/	WORD AFTER END OF BUFFER GETS
/			/	TEMPORARILY DESTROYED BY THIS TASK.
/***********************/

	LINC=6141	/ENTER LINC MODE
	AXO=1		/AC TO EXTENDED TAPE OPERATIONS BUFFER
	PDP=2		/ENTER PDP-8/I MODE
	TAC=3		/TAPE ACCUMULATOR BUFFER TO AC
	TMA=23		/AC TO TAPE MEMORY ADDRESS SETUP REGISTER
	LMR=6151	/LOAD LINCTAPE MAINTENANCE REGISTER
	FIELD CUR%10

	*LOC

	IFNDEF PDP12 <ERROR *****>

BPTR,			/POINTS TO BUFFER
START,	CAL		/INSERT INTERRUPT SKIP IN SKIP CHAIN
UNIT,	SKPINS		/UNIT WORD (BIT 0=1 MEANS SPECIAL 400 WORD PER BLOCK MODE)
FNWORD,	INTRPT		/BITS 1-5 CONTAIN # OF PAGES LEFT TO XFER
LOOP,	CAL
	RECEIVE		/GET A MESSAGE
MADDR,	0		/ADDRESS OF MESSAGE LEFT HERE
	DCA MSGFLD	/CDF TO FIELD OF MSG LEFT IN AC
	STA
	TAD MADDR
	DCA MADDR	/BUMP BACK MADDR
	JMS GET		/GET UNIT AND SPECIAL FUNCTIONS BIT
	DCA UNIT
	JMS GET		/GET FUNCTION WORD
	DCA FNWORD
	JMS GET		/GET BUFFER ADDRESS
	DCA BPTR
	TAD UNIT
	RAL
	CLA
	JMS GET		/GET BLOCK NUMBER
	SNL
	CLL RAL
	DCA BLOCK
	CDF CUR
	JMS I (PAGE2	/STUFF ON 2ND PAGE
	TAD FNWORD
	RTL
	AND L3		/ISOLATE LOW ORDER UNIT AND R/W BIT
	CLL RTL		/UNIT TO BIT 8 (OF COURSE)
	TAD (702	/702=READ ONE BLOCK;  706=WRITE ONE BLOCK
	DCA LTINST	/SAVE NEWLY FORMED LINCTAPE INSTRUCTION
GLOOP,	AC7775		/CAN'T HURT TO RETRY 3 TIMES
	DCA TRYCNT
RETRY,	TAD BPTR	/KLUDGE:  SAVE 201ST WORD
	TAD (200	/CAUTION USER ABOUT THIS
	DCA TEMP	/THIS IS A REAL TIME SYSTEM
	JMS BUFC
	TAD I TEMP	/SAVE VOLATILE LOCATION
	CDF CUR		/BACK TO OUR FIELD
	DCA LOCSAV
	TAD BPTR
	IOF		/ANOTHER UNAVOIDABLE EXCURSION INTO THE REALMS OF
	LINC		/LINC MODE!
	TMA		/PERFORM READ OR WRITE OF ONE BLOCK
LTINST,	0		/LINCTAPE INSTRUCTION (702=READ, 706=WRITE)
BLOCK,	0		/BLOCK NUMBER
	PDP		/BACK TO CIVILISATION
	ISZ DFLAG	/NOTE THAT LINCTAPE IS NOW BUSY
	ION		/A TYPE OF CHARGED ATOM
	CAL
	WAITE		/WAIT FOR DONE FLAG TO COME UP
	DFLAG
	IOF		/STAVE OFF POSSIBLE CATASTROPHE
	LINC		/WHO KNOWS WHERE EVIL LURKS?
L3,	TAC		/GET TAPE CHECK (7777 IS GOOD)
	PDP		/GOODNESS
	ION		/PERMIT INTERRUTS, WE'RE SAFE NOW
	CMA		/USE 1'S COMPLEMENT SINCE 0 MEANS GOOD TO RTS-8
	DCA STATUS	/SAVE RESULTING STATUS WORD
	TAD UNIT
	SPA CLA
	JMP NOREST	/NOTHING TO RESTORE IN 400 WORD/BLCK MODE
	TAD LOCSAV
	JMS BUFC
	DCA I TEMP	/RESTORE 201ST WORD
	CDF CUR
NOREST,	TAD LTINST
	AND (4
	SZA CLA		/READ OR WRITE?
	DCA STATUS	/WRITES CAN'T FAIL
	TAD STATUS
	SNA CLA
	JMP OK		/NO RETRIES IF WRITE WAS BAD
	ISZ TRYCNT	/READ ERROR
	JMP RETRY	/GO TRY AGAIN
EXIT,	JMS GET		/AC MIGHT BE NON-ZERO
	CLA		/DATA FIELD IS NOW RIGHT
	TAD STATUS
	DCA I MADDR
	TAD MSGFLD
	DCA EFCDF
	TAD MADDR
	TAD (-7
	CAL
	POST
STATUS,			/ONES COMPLEMENT OF TAPE CHECK
EFCDF,	HLT
	JMP LOOP	/GET ANOTHER MESSAGE

BUFC,	0
BUFCDF,	HLT
	JMP I BUFC
OK,	TAD UNIT
	RAL
	CLA
	TAD FNWORD
	AND (3700
	SNA
	TAD (4000	/DON'T UPSET LINK BUT 0 MEANS 40
	SZL
	TAD (-100	/READ 2 PAGES IN SPECIAL MODE
	TAD (-100	/READ ONE PAGE IN REGULAR MODE
	SPA SNA		/ANY MORE PAGES TO READ?
	JMP EXIT	/NO (IGNORE LAST ODD-PAGE IF IN 400 WRD MODE)
	DCA FNWORD	/YES, PUT # BACK IN 'FNWORD'
	TAD UNIT
	SPA CLA
	TAD (200	/ADVANCE BUFFER PTR 400 IF 400 WD MODE
	TAD (200	/OR 200 IF 200/201 WD MODE
	TAD BPTR
	DCA BPTR
	ISZ BLOCK	/POINT TO NEXT BLOCK
	JMP GLOOP

TEMP,			/SHORT FOR TEMPORARY
GET,	0		/DON'T TOUCH LINK

MSGFLD,	HLT
	ISZ MADDR
	TAD I MADDR
	JMP I GET

LOCSAV,	0
TRYCNT,	-3
DFLAG,	0		/TAPE DONE FLAG (0=DONE, 1=BUSY)
	PAGE
INTRPT,	ZBLOCK 2	/RTS-8 OVERHEAD
	TAD (100	/SKIP IF TAPE DONE FLAG=1
	LMR
	SKP CLA		/NOT DONE, CLEAR AC AND BRANCH BUT NOT JUMP
	SKP CLA		/DONE
	JMP I INTRPT	/NOT DONE, GO ON TO NEXT SKIP
	CDF CUR
	TAD (200	/CLEAR TAPE DONE FLAG
	LMR
	CLA		/PLAY SAFE
	TAD (DFLAG
	CIF 0		/POST DONE FLAG
	POSTDS		/DISMISS INTERRUPT

PAGE2,	0
	TAD I (FNWORD
	AND (70
	TAD (CDF
	DCA I (BUFCDF
	TAD I (FNWORD
	AND (70		/ISOLATE FIELD OF BUFFER
	CLL RTL
	RTL
	RTL		/FIELD TO BITS 0-2
	DCA TEM
	TAD I (UNIT
	AND (7		/ISOLATE UNIT NUMBER FROM UNIT WORD
	CLL RAR		/HIGH-ORDER UNIT BITS TO AC 10,11
	TAD TEM		/COMBINE AND ALSO PUT LOW-ORDER UNIT # IN LINK
	TAD (130	/ENABLE INTERRUPTS, EXTENDED MODE, NO PAUSE
	IOF		/DISASTER IF GET INTERRUPT WHILE IN DREADED
	LINC		/LINC MODE!
	AXO		/SEND FUNCTION TO CONTROLLER
	PDP		/BACK TO SAFE PDP-8 MODE
	ION		/THAT WASN'T TOO BAD NOW WAS IT?
	CLA
	JMP I PAGE2

TEM,	0
$