File: TE.TK of Disk: Disks/MyPDP/m8-blue-rka1-rkb1
(Source file text) 

/TE.TK 21-MAR-79
/DECTAPE EMULATOR FOR BG

/NAME:	TE ("T^100+"E&3777)
/LENGTH:ONE PAGE
/FUNCTION:THIS MODULE DOES THE DECTAPE TRANSFERS FOR
/	THE OS8 BACKGROUND.
/	THIS TASK STARTS WITH A
/	SEARCH-ONLY IN ORDER TO REACH THE DESIRED BLOCK.
/	IN THIS TIME THE CURRENT BG IS INACTIVE AND
/	EVEN SWAPPED BACK TO THE DISK.
/	WHEN THE RIGHT BLOCK COMES UP, THE BG IS REQUESTED
/	IN CORE AGAIN, AND THE TRANSFER COMPLETED
/	IN A SINGLE RUSH. IN THIS TIME THE BG CANNOT BE
/	SWAPPED. (EMULATE)
/ERRORS:ERRORS ARE DEFERRED TO THE BACKGROUND BY TAKING THE
/	HANDLER ERROR-RETURN.
/USE:	TAD (BJOB	/POINTER TO BG REGISTERS
/	JMS MONITOR
/	   CALL
/	   "T^100+"E&3777
/	 BUSY RETURN	/AC UNCHANGED
/	NORMAL RETURN	/AC=0
	*200
DTUAC,	"T^100+"E&3777	/TE
	200		/ONE PAGE;NO CONNECTS
DTIDTV,	DTDTV		/RELOCATED POINTER
DTUSTAT,0		/PNTR TO STATUS REG. OF BG

/NOTE THAT DF POINTS TO FIELD 1 MOST OF THE TIME
TE,	DCA DTUSTAT
	TAD DTUSTAT	/SET UP SOME POINTERS
	TAD (UAC
	DCA DTUAC
/FETCH THE POINTER TO DTV
	TAD DTUSTAT
	TAD (UDTV-1
	DCA AUTO10
	TAD I AUTO10
	AND C7770
	DCA DTFUN
	TAD I DTUAC
IFDEF TC08 <AND C7	/GET UNIT NUMBER >
IFDEF TD8E <AND (1	/GET UNIT NUMBER >
	TAD DTFUN
	DCA DTFUN
	TAD I AUTO10
	DCA DTDTV+1	//
	TAD I AUTO10
	DCA DTBLK
IFNZRO BGMAX-1 <	/FOR MULTI-USER SYSTEMS:
/LOOK INTO THE TAPETABLE AND SEE HOW FAR WE HAVE TO GO. IF IT'S
/MORE THAN 50 BLOCKS, MAKE THE BG INACTIVE AND START A SEARCH-ONLY
/REQUEST UNTIL WE ARE QUITE NEARBY. IF IT'S ONLY A SHORT DISTANCE
/DO THE TRANSFER RIGHT AWAY, KEEPING THE BG IN EMULATE STATUS.

	AC3777
	AND DTBLK	/REMOVE SPECIAL MODE BIT
	DCA ZTEM1
	TAD DTFUN
	AND C7		/EXTRACT UNIT NUMBER
	TAD (TAPETB
	CDF 0		//
	JMS DEFER	//GET CURRENT POSITION
	CDF 10		/
	CLL RAR		/CONVERT TO OS/8 BLOCK #
	SNA		/IF ZERO THIS IS UNKNOWN:
	 JMP DTLONG	/THE TAPE HAS BEEN OFFLINE.
	CIA
	TAD ZTEM1	/MAKE DISTANCE
	SPA
	 CIA		/ABSOLUTE VALUE OF DISTANCE
	TAD (-50	/
DTLONG,	SPA CLA
	 JMP DTSHRT	/LUCKY BOY, NO SWAPS TODAY
/FIRST SEARCH FOR THE DESIRED BLOCK;LENGTH=0
/STOP THE TAPE 4 BLOCKS IN ADVANCE OF THE TARGET BLOCK,
/IF THE BLOCK # IS LESS THAN 4:SEARCH FOR BLK 0.
	TAD ZTEM1
	TAD M4
	SPA
	 CLA
	DCA DTDTV+2
	TAD DTFUN
	AND C7
	DCA DTDTV
	AC2000		/MAKE BG INACTIVE
	TAD I DTUSTAT	/
	AND (-LONG-1	/CLEAR HIS LONG-BIT
	DCA I DTUSTAT
	JMS TEKICK	/
	JMS DTDO
DTSHRT,			/NOW THE BLOCK IS NEAR-BY >
	TAD DTFUN
	AND C70		/GET VIRTUAL FIELD #
	TAD I DTUSTAT	/BG ACTIVE
	AND (-INACTIVE-1
	TAD (INCORE	/REQUEST IN CORE;LOCK IT THERE
	DCA I DTUSTAT
	JMS TEKICK	/
	TAD DTUSTAT	/NOW FIND THE SLOT-TO-WAIT-IN-CORE
	TAD (USLOT
	JMS DEFER
	DCA .+3
	JMS MONITOR	/AND WAIT FOR BG IN CORE
	   WAIT
	   0
	DCA ZTEM1	/=REAL FIELD #
	TAD DTFUN
	AND (7707
	TAD ZTEM1	/INSERT REAL FIELD # IN FUNCTION WORD
	DCA DTDTV	/FOR THE REAL TRANSFER
	TAD DTBLK
	DCA DTDTV+2	/REAL BLOCK
	JMS DTDO
	JMP DTRET2
DTRET1,	JMS TEKICK
	AC4000
DTRET2,	DCA I DTUAC	/CLEAR/SET AC FOR NORMAL/ERROR
	JMS MONITOR
	   EXIT RELEASE

/DO THE SEARCH OR TRANSFER.
/WAIT A LITTLE WHILE IF THE DRIVER TASK IS BUSY.
/THEN TRY AGAIN...AND AGAIN...AND AGIAN...
/DTDO RETURNS WITH AC=0 AND DF=10
DTDO,	.-.
DTTRY,	CDTOIF		/DTV IS IN THIS FIELD
	TAD DTIDTV
	JMS MONITOR
	   CALL
	   "D^100+"T&3777/DT
	 JMP DTSTALL	//TRY AND TRY
	DCA DTSLOT	//ACCEPTED;SAVE SLOT#
	JMS MONITOR	//WAIT FOR COMPLETION
	   WAIT
DTSLOT,	   0
	CDF 10
	SNA CLA
	  JMP I DTDO	/NO ERRORS
	JMP DTRET1	/BG ERROR ONLY

DTSTALL,JMS MONITOR	//
	   STALL
	   DGNTICK%5	/0.2 SECS
	 CLA		//
	JMP DTTRY	//

DTFUN,
IFNZRO BGMAX-1 <0	/FUNCTION WORD >
DTDTV,	0
	0
IFNZRO BGMAX-1 <0	>
DTBLK,	0

TEKICK,	0
	JMS MONITOR
	   SIGNAL
	   BSSLOT
	JMP I TEKICK

$$