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

/FE.TK 12-JUN-80
/**UASEM VERSION**
/THIS IS THE EMULATOR FOR FLOPPY DISKS.
/THESE DEVICES ARE USED MORE OR LESS AS THE DECTAPES ARE, WITH 
/THE MAIN DIFFERENCE BEING THAT ONLY ONE USER AT A TIME
/MAY ACCESS EACH DISK TO PREVENT DIRECTORY PROBLEMS.
/

/THIS TASK IS CALLED THROUGH THE FAKE-HANDLER MECHANISM.
/FOR DEVICE RXA0: AND RXA1: (UNIT 0,1) IT WILL CALL RX
/FOR DEVICE RBA0: AND RBA1: (UNIT 2,3) IT WILL CALL RB

/IT TAKES THE USERS PARAMETERS FROM HIS DATA-AREA AND
/PASSES THE REQUEST ON TO THE FLOPPY DRIVER.

	*200

FENAME,	"F^100+"E&3777	/NAME IS FE
	200		/ONE PAGE SHOULD BE SUFFICIENT
FELOCK,	LOCKS		/UNITS LOCK TABLE
FEBASE,	0

FE,	DCA FEBASE	/THIS IS OUR HOLY CUSTOMER
	TAD FEBASE
	TAD (UAC
	DCA FEUAC	/MAKE SURE FEUAC NON-ZERO
	SZL		/IS THIS THE END ?
	 JMP FEEXIT	/YES, RELEASE THIS TASK
	TAD I FEUAC	/GET HIS ACCUMULATOR (UNIT NUMBER)
	CLL RTR		/IS IT UNIT 2,3?
	SZL CLA
	TAD ("R^100+"B&3777	/YES BYTE MODE FLOPPY
	SNL
	TAD ("R^100+"X&3777	/NO NORMAL FLOPPY
	DCA RNAME	/USE FOR CALL TO RX OR RB
	AC0001		/LEFT OR RIGHT FLOPPY
	AND I FEUAC	/UNIT NUMBER AGAIN
	DCA ZTEM1	/UNIT 0,2 OR 1,3
	TAD FEUAC
	TAD (UDTV-UAC	/SAME LITERAL
	DCA FESLOT	/DTV POINTER
	TAD ZTEM1	/GET UNIT AGAIN
	TAD FELOCK	/INDEX IN LOCK TABLE
	CDTOIF
	JMS DEFER	//GET TABLE ENTRY
	SNA		//ANY LOCK ACTIVATED ?
	 JMP FEFREE	//NO, UNIT WAS FREE YET
	TAD FEBASE	//COMPARE LOCK WITH USER ID
	SZA CLA		//SAME USER ?
	 JMP FEERR	//FATAL!, BOTH WANT ACCESS
FEFREE,	TAD FEBASE	//OK
	CIA		//
	DCA I X		//PUT IN MY REQUEST
	CDF 10		/BACK TO EMULATOR FIELD
	TAD I FESLOT	/GET HIS REQUEST FUNCTION WORD
	AND C7770	/ZERO THE UNIT NUMBER FIELD
	TAD ZTEM1	/ADD THE TRUE UNIT NUMBER
	DCA I FESLOT	/THIS IS THE COMPLETED FUNCTION WORD
	TAD I FESLOT	/
	AND C70		/GET VIRTUAL FIELD NUMBER
	TAD I FEBASE
	TAD (-EMULATE+INCORE
	DCA I FEBASE	/MAKE INCORE REQUEST
	JMS MONITOR
	   SIGNAL
	   BSSLOT
	TAD FEBASE
	TAD (USLOT	/BS SLOT
	JMS DEFER
	DCA .+3
	JMS MONITOR
	   WAIT
	   0
	MQL		/SAVE REAL FIELD
	TAD I FESLOT
	AND (7707	/STRIP VIRTUAL FIELD #
	MQA		/INSERT REAL FIELD #
	DCA I FESLOT
	TAD FESLOT	/POINTER TO DTV !
	JMS MONITOR
	   CALL
RNAME,	   "R^100+"X&3777	/OR "R^100+"B&3777
	 JMP .-3	/HANG ON
	DCA FESLOT	/THE SLOT WHERE WE WILL GET COMPLETION
	JMS MONITOR
	   WAIT
FESLOT,	   0
	SZA		//
	 TAD (4000	//MAKE A FATAL ERROR (OR NEG LENGTH)
	CDF 10		/BE SURE !
	DCA I FEUAC	/PUT THE COMPLETION CODE IN HIS ACCUMULATOR
	TAD FEBASE
	TAD (UASEM-1	/SETUP POINTER TO UASEM
	DCA FESLOT	/IN OUR BG TABLE
FEASLP,	ISZ FESLOT
	TAD I FESLOT	/LOOK AT ENTRY
	SNA		/IS IT FREE ?
	 JMP FEASFR	/YES, GO PUT IN MY NAME
	CIA
	TAD FENAME	/WAS IT ALREADY USED BY ME ?
	SZA CLA
	 JMP FEASLP	/NO, SOME OTHER TASK, LOOK FOR MORE
FEASFR,	TAD FENAME
	DCA I FESLOT	/OK, PUT MY NAME IN UASEM TABLE
	SKP
FEERR,	AC0002		/RETURN SPECIAL OCCUPIED ERROR CODE
FERTRN,	JMS MONITOR
	   EXIT
/NO CLOSE CALL POSSIBLE WITH MULTIPLE DRIVERS!
FEEXIT,	TAD FELOCK	/SET POINTER TO
	DCA ZTEM1	/LOCK TABLE
	ACM2
	DCA ZTEM2	/SET UNITS COUNTER
	CDTOIF		//LOCKS IN THIS TASK
FECLLP,	TAD I ZTEM1	//GET A LOCK
	SNA		//
	 JMP FECLNX	//IF ZERO GO ON
	TAD FEBASE	//IS IT MY LOCK ?
	SNA		//
	 DCA I ZTEM1	//YES, CLEAR IT
	SZA CLA		//WAS IT ANOTHER USER ?
	 DCA FEUAC	//YES, SIGNAL NOT ALL CLEARED (WAS NON-ZERO)
FECLNX,	ISZ ZTEM1	//NEXT LOCK LOC
	ISZ ZTEM2	//MORE SLOTS ?
	 JMP FECLLP	//YES
	CDF 10		/
	TAD FEUAC	/ALL LOCKS ZEROED ?
	SNA CLA		/
	 JMP FERTRN	/NO, WAIT FOR OTHER RELEASE
	JMS MONITOR	/YES, FORGET EVERYTHING (SWPOUT OR RELEASE)
	   EXIT SWPOUT

FEUAC,	1234		/ALWAYS NON-ZERO
LOCKS,	ZBLOCK 2
	PAGE
	$-$-$