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

/RX.TK 15-MAR-80
/THIS IS THE NEW FLOPPY DISK HANDLER FOR MULTI8.
/IT HANDLES RX01, RX02 AND RX03 DRIVES
/IN SINGLE AND DOUBLE DENSITY MODES.
/THE MAIN LOGIC IS FROM THE DEC OS8 HANDLER
/TAKEN FROM THE OS8 V3X PACKAGE.
IFDEF RX01 <RXDEVC=RX01>
IFDEF RX02 <RXDEVC=RX02>

LCD=RXDEVC+6001
XDR=RXDEVC+6002
STR=RXDEVC+6003
SER=RXDEVC+6004
SDN=RXDEVC+6005
INTR=RXDEVC+6006
INIT=RXDEVC+6007

/TASK HEADER:
RXDTV,	"R^100+"X&3777	/NAME IS RX
	400	 	/A TWO PAGE TASK

/PAGE HEADER:
XTRYCN,	TRYCNT
XBLOCK,	BLOCK
XSECTR,	SECTR
XRFUNC,	RFUNC
XCOUNT,	COUNT
XTRAN,	TRANSF
XSLOT,	RXSLOT
XCLOSE,	RXCLOSE
XWAIT,	RXWAIT
UNIT,	0

/TASK BODY
RX,	SNA 		/CLOSE CALL ?
	 JMP I XCLOSE	/YES, QUIT
	DCA RXDTV	/NO, STORE POINTER TO PARAMETERS
	TAD I ZMYCDF	/GET CDF TO PARAMETER FIELD
	DCA RXCDF	/AND SETUP FOR PARAMETER FETCHING
	AC0001
	AND I RXDTV	/GET FUNCTION WORD
	SNA CLA		/IF UNIT 1 SKIP
RXA0,	JMS RXINIT	/COMMON ENTRY ROUTINE
	   0402		/UNIT 0, 402 FOR CONVENIENCE
	   NOP		/MINUS SAYS WE STILL HAVE TO INIT

RXA1,	JMS RXINIT
C422,	   0422		/20 SAYS UNIT 1, 402 FOR CONVENIENCE
	   -1
RXINIT,	0
 	CDTOIF
	ACM3		/CLEAR AC
	DCA I XTRYCN	/SET RETRY COUNTER FOR THREE TIMES
	JMS MONITOR
	   RESERV RETURN CONTINUE
	DCA I XSLOT	/THE SLOT THE USER IS WAITING FOR
	TAD I RXINIT	/GET UNIT #*20+402
	DCA UNIT	/SAVE IT
	ISZ RXINIT
	TAD I RXINIT
	SMA CLA		/DO WE KNOW THIS FLOPPY ?
	JMP DENSOK	/YES, NO NEED TO TEST DENSITY
RXRSTR,	JMS I XWAIT	/CLEAR LAST EVENT IF ANY AND AC
	TAD UNIT	/PICK UP UNIT , DOUBLE DENSITY+2
	TAD C10		/MAKE READ STATUS ON PROPER UNIT
	LCD		/IT WILL CHECK THE DENSITY
	JMS I XWAIT	/WAIT FOR DONE (SECTOR TIME)
	XDR		/GET STATUS WORD
	AND C33		/KEEP DENSITY ERROR, RX02, QUAD
	TAD C10		/SNGL=10, SNGL/DBL=40, DBL=20, QUAD=22
	AND C422	/SNGL=0, SNGL/DBL=0, DBL=20, QUAD=22
	DCA I RXINIT	/TYPE CODE FOR EACH DRIVE
	SER
C10,	10		/IGNORE ERRORS WE PROBABLY GET
	TAD (416
	LCD		/RESET FLAG
DENSOK,	TAD I RXINIT	/GET TYPE CODE AGAIN
	SZA CLA 	/SKIP IF SNGL
	 TAD M100
	TAD M100	/SNGL=-100, DBL=-200
	DCA I XCOUNT	/PLACE FOR LOOP CONTROL
	TAD I RXINIT
	CLL RTR 	/PUT QUAD BIT IN LINK
	SNA CLA 	/SKIP IF DOUBLE OR QUAD
	TAD SNGLMD	/SNGL: 6044-4110
	TAD DBLQUA	/DBL&QUAD=4110
	SNL 		/WAS IT QUAD?
	 STL RAR 	/NO, SNGL=7022, DBL=6044
	MQL		/YES, QUAD=4110 (STORE IN MQ A WHILE)
	TAD I XCOUNT	/WAS IT DOUBLE DENSITY?
	CLL CMA RTL 	/SNGL=375, DBL=775
	AND UNIT	/MAKES 400*DBL + 20*UNIT
	DCA I XRFUNC	/TO FUNCTION WORD
	TAD RXDTV	/GET POINTER TO USER PARAMETERS
RXCDF,	HLT 		/AND SET FIELD
	JMP I XTRAN
CALC,	0000		/SETUP TRACK, SECTOR FROM LOG. RECORD
	TAD C7700
	MQL		/CLEAR DIVIDE QUOTIENT, SET COUNTER MASK
	TAD I RXINIT	/IS IT RX03?
	RTR
	SNL CLA
	 JMP SINGLE	/NO, ONLY 1 HEAD
	TAD I XBLOCK	/WHICH LOGICAL RECORD DO WE WANT?
	TAD DBLQUA	/IS IT ON FIRST SIDE?
	SZL CLA
	 JMP SINGLE	/NO, AS IF 1 HEAD
	TAD I XRFUNC	/GET FUNCTION BACK
	AND C422	/KEEP DBL, UNIT ,R/W
	TAD C7000	/FORCE HEAD ON (USE ONLY 1000 OF 7000)
	DCA I XRFUNC
	TAD DBLQUA	/AND DECREASE LOGICAL RECORD
SINGLE,	TAD I XBLOCK	/MAIN DIVIDE LOOP
	DCA RXREMD	/SET INITIAL DIVIDEND
	TAD RX1400	/FALL IN LOOP WITH INITIAL DIVISOR/2
	DCA RXDIVS
RXDLUP,	TAD RXDIVS	/MAIN DIVIDE LOOP
	STL RAR		/NEXT DIVISOR
	DCA RXDIVS
	TAD RXDIVS	/LINK IS NOW = 0
	TAD RXREMD
	SZL		/OVERFLOW
	DCA RXREMD	/YES UPDATE REMAINDER
	CLA MQA		/GET QUOTIENT WITH COUNT MASK
	RAL		/SHIFT IN DIVIDE BIT
	MQL		/SHIFT BUSY BIT OUT AND RELOAD
	SZL		/SKIP IF DONE
	JMP RXDLUP
	TAD I RXINIT	/WAS IT DBL DENSITY?
	SZA CLA
	 TAD RXREMD	/YES, INTERLEAVE 3
	TAD RXREMD
	TAD RXREMD	/NO, INTERLEAVE 2
	TAD RXDIVS	/SHIFT AT -26, SO WE CAN
	SMA		/REDUCE AGAIN MODULO TRACK
	 JMP .-2
	TAD C33		/FIRST TRACK IS 1
	DCA I XSECTR	/THAT'S IT (ALMOST)
	RAL		/IF L=0, SECOND INTERLEAVE
	TAD I RXINIT	/=0 IF SNGL
	SNA CLA		/WAS IT BOTH?	
	ISZ I XSECTR	/YES, MAKE 2,4,6,8,.. SERIES
	MQA		/GET TRACK IN AC (TRACK-1 THAT IS)
	JMP I CALC
/CONSTANTS:
RX1400,	1400
C33,	33
SNGLMD,	6044-4110
DBLQUA,	4110
RXREMD,	0
RXDIVS,	0
PAGE
/PAGE HEADER:
XRSTR,	RXRSTR
XCALC,	CALC
TEMP2,	0

TRANSF,			/MAIN TRANSFER ROUTINE
	DCA RXARGS	/POINTER TO TV
	MQA
	DCA LENGTH	/KEEP FOR ERROR
	AC4000 
	TAD I RXARGS	/CARRY R/W TO LINK
	AND C70
	TAD C6201
	DCA CDFBUF	/PLACE CDF BUFFER IN I/O LOOP
	CML RTL
	TAD RFUNC	/ADD READ=2 TO FUNCTION
	DCA RFUNC
	TAD I RXARGS	/MAKE LOOP CONTROL COUNT
	RAL
	AND C7600
	CIA
	DCA RXWC	/0 FOR WHOLE FIELD
	ISZ RXARGS
	TAD I RXARGS
	DCA RXCA	/SET BUFFER ADDRESS
	ISZ RXARGS
	TAD C100	/NOW CONVERT BLOCK# TO LOG. SECTOR
	TAD COUNT	/WAS IT SINGLE DENSITY?
	SMA CLA
	 TAD I RXARGS	/YES, MULTIPLY BY 4
	SMA		/NEG. BLOCK #: FORCE LINK ON
	 TAD I RXARGS	/IF DOUBLE MULTIPLY BY 2
	CLL RAL
	DCA BLOCK	/SAVE LOGICAL SECTOR
	SZL		/LEGAL BLOCK #?
			/NO, SET STATUS TO LENGTH FOR PIP
	 JMP RXTPIP	/TRY 3 TIMES IF FLOPPIES HAVE CHANGED
	CDTOIF
	JMS I XCALC	/DIVIDE A FIRST TIME
	DCA RXTRCK	/TRACK FROM AC
	TAD RFUNC
	RTR		/IS IT READ?
	SZL CLA
	 JMP READ	/YES, TO MIDDLE OF LOOP
TOP,	TAD RFUNC	/GET SILO TO LOAD-UNLOAD
	JMS RXCOMM
	TAD COUNT
	DCA RXWAIT
CDFBUF,	HLT
SILOOP,	TAD I RXCA	/FOR WRITE FETCH WORD
	STR
	 JMP .-1	/WAIT FOR INTERFACE READY
	XDR		/TO OR FROM AC
	DCA I RXCA	/PLACE FOR READ, REPLACE FOR WRITE
	ISZ RXCA
SECTR,	0
	ISZ RXWAIT	/SILO FULL/EMPTY?
	 JMP SILOOP
	TAD COUNT
	CMA		/ADD 77 (SNGL), 177 (DOUBLE)
	TAD RXWC
	SNA
	JMP RXDONE	/DONE FOR READ
	DCA RXWC	/REPLACE AND GO ON
READ,	AC0004		/TURN SILO- INTO READ/WRITE COMMAND
	TAD RFUNC
	JMS RXCOMM
	TAD SECTR	/LOAD SECTOR #
	STR
	JMP .-1
	XDR
	AC0001		/START AT TRACK 1!
	TAD RXTRCK
	STR
	JMP .-1
	XDR
	CLA
	ISZ BLOCK	/NEXT LOGICAL RECORD
	JMS I XCALC	/CALC TRACK/SECTOR
	DCA RXTRCK	/TRACK FROM AC
	TAD (16		/READ STATUS
	JMS RXCOMM	/FOR WAIT
	ISZ RXWC	/IS WRITE FINISHED?
	JMP TOP		/NO
RXDONE,	AND (3777	/SAFETY FIRST, EMULATOR WILL RESTORE 4000
	JMS MONITOR
	   SIGNAL HALT CLEAR RELEASE
RXSLOT,	   0
RXCOMM,	0
	DCA TEMP2	/KEEP COMMAND A WHILE
	JMS RXWAIT	/SYNC WITH FLAG
	TAD TEMP2
	LCD		/LOAD COMMAND NOW
	SER		/ANY ERRORS?
	JMP I RXCOMM	/NO, OK
RXEROR,	ACM1		/YES, SIGNAL ERROR WITH -1
	SKP
RXTPIP,	TAD LENGTH	/COME HERE FOR ILLEGAL BLOCK (PIP)
	ISZ TRYCNT	/MORE TRIES?
	JMP I XRSTR	/YES, RESTART ALL
	JMP RXDONE	/NO, FATAL ERROR

RXCLOSE,ACM1		/-1 FOR NULL WAIT
	JMS MONITOR
	   EXIT SWPOUT	/SOMEBODY MAY CHANGE FLOPPIES, NOT REALLY
			/NECESSARY: SEE COMMENT ELSEWHERE
RXWAIT,	0
	CDTOIF
	CLA		/CLEAR RANDOM AC
	INTR		/INTERRUPT OFF FOR SDN TEST
	SDN		/QUICK FLAG?
	SKP		/NO, GO WAIT
	JMP I RXWAIT	/YES, RETURN
	AC0001
	INTR		/ENABLE INTERRUPT FOR SECTOR WAIT
	TAD (-DGNTICK^12/10 SECONDS TIMOUT
	JMS MONITOR
	   WAIT
	   RXA
	CLA
	INTR		/TURN INTERRUPT OFF
	JMP I RXWAIT

RXCA,	0
TRYCNT,	0
LENGTH,	0
RXARGS,	0
BLOCK,	0
RXWC,	0
RFUNC,	0
COUNT,	0
RXTRCK,	0
	PAGE
	$-$-$