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

/CR.TK 9-SEP-79
/TWOPAGE EMULATOR FOR CARDREADER. ONE PAGE CODE, ONE PAGE
/BUFFER.  EMULATES THE FOLLOWING IOT'S:

/6672	READ ONE CARD AND SKIP. IF CARDREADER NOT READY,
/	DON'T SKIP. ONE CARD IS READ INTO INTERNAL BUFFER.
/
/6671	SKIP WHEN BUFFER IS EMTIED, DON'T SKIP IF MORE CHAR
/	IN BUFFER.
/
/6631	SKIP IF DATA FLAG. PATCHED WITH A SKP.
/
/6632	ONE CHARACTER FROM THE BUFFER GOES INTO UAC.
/
/PUT NAME IN EMTAB:
	*0
	CDF 10	/EMTAB IS IN FIELD 1
	EMTAB+63
	"C^100+"R&3777
	*0
	CDF 10		/EMTAB IS IN FIELD 1
	EMTAB+67
	"C^100+"R&3777
	*0
	CDF BGFLD	/KILL 'DEVICE CDR...' IN M5.PA
	CDRPAT
	0000
	*200

	"C^100+"R&3777	/TASK NAME IS CR
	401 		/TWO PAGES, ONE CONNECT.
CCRD,	CRD 		/THE CARDREADER EVENT
	CRINT		/INTERRUPT ENTRY POINT
CRBUF,	CRBBEG		/BEGIN OF BUFFER
XINIT,	INIT
CRPATCH,	0

CR,	JMS I XINIT	/'CHANGED TO:
	/SZL	 	/DID HE QUIT ?
	 JMP CRCLR	/YES, RELEASE DEVICE
	TAD C3		/(UPC
	DCA CRUPC
	TAD CRUPC
	IAC
	JMS DEFER	/GET HIS VIRTUAL FIELDS
	AND C70		/INSTRUCTION FIELD
	TAD CRUPC
	TAD (UFLD0-UPC	/GET REAL FIELD
	JMS DEFER
	TAD C6201	/MAKE A CDF
	DCA CRCDF+1
	ACM1
	TAD I CRUPC	/ADDRESS OF USERS INSTRUCTION
	DCA CRPNT
	TAD CRUPC
	TAD C2
	DCA CRUAC	/POINTER TO UAC
	TAD CRUAC
	IAC
	JMS DEFER	/GET INSTRUCTION
	TAD (-6672
	SNA	 	/SELET CARDREADER ?
	  JMP CRREAD	/YES, READCARD
	TAD (6672-6671
	SNA	 	/SKIP IF DONE ?
	 JMP SKDONE
	TAD (6671-6632
	SNA 		/READ COLLUM ?
	 JMP CRDAT
	TAD (6632-6631
	SZA CLA		/SKIP IF DATA READY?
	 JMP CRRET	/NO, DO NOTHING
	JMS EQUAL	/POINTERS EQUAL ?
CRSKP,	 SKP 		/NO
	 JMP CRRET	/YES, DO NOTHING
	TAD CRPNT
	DCA CRTPNT	/REMEMBER THIS POINT
	TAD CRSKP
	JMS CRCDF
	DCA I CRPNT	/RESTORE SKIP INSTRUCTION
CRSRET,	CDF 10
	 ISZ I CRUPC	/LET HIM SKIP
CRRET,	CLA CLL
	JMS MONITOR
	   RETURN

CRREAD,	AC0001		/ENABLE INTERRUPTS
	6635
	6672		/SELECT CARDREADER
	 JMP CRRET	/NOT READY, RETURN
	CLA CLL
	DCA CRDONE	/CLEAR SOFTWARE DONE
	TAD CRBUF
	DCA CRADRI	/INITIALISE INPUT POINTER
	TAD CRADRI
	DCA CRADRO	/INITIALISE OUTPUT POINTER
	JMP CRSRET	/TAKE SKIP-RETURN

CRDAT,	AC0001
	TAD CRADRO
	AND C177
	TAD CRBUF
	DCA CRADRO	/BUMP WITH WRAP-AROUND FOR SAFETY
	CDTOIF		//TO FIELD OF BUFFER
	TAD I CRADRO	//GET NEXT CHAR
	CDF 10
	DCA I CRUAC	/DROP IN USERS AC
	JMS EQUAL	/POINTERS EQUAL?
	 JMP CRRET	/NO, JUST RETURN
	TAD CRINT	/YES, RESTORE SKIP-ON-DATA
	JMS CRCDF
	DCA I CRTPNT	/RESTORE INSTRUCTION
	JMP CRRET

SKDONE,	JMS EQUAL
	 JMP CRRET
	TAD CRDONE
	SZA CLA		/REALY FINISHED ?
	 JMP CRSRET	/YES
	JMP CRRET	/NO

CRCLR,	CLA
	DCA I CRPATCH	/REMOVE MYSELF FROM ASEMTB
	JMS MONITOR
	   EXIT SWPOUT

/INTERRUPT ROUTINES:

CRINT,	6631		///DATA FLAG UP ?
	 JMP CREND	///MUST BE END OF CARD
	AC0001		///
	TAD CRADRI	///
	AND C177	///
	TAD CRBUF	///
	DCA CRADRI	///BUMP WITH WRAP AROUND FOR SAFETY
	6632		///READ COLLUM ALFA, CLEARS FLAG
	DCA I CRADRI	///PUT CHAR IN BUFFER
INTEXT,	CDF CIF 00	///
	JMP I ZFSTEXT	///INTERRUPT EXIT

CREND,	6671		///DONE FLAG UP ?
	 JMP INTEXT	///GHOST INTERRUPT
	6674		///CLEAR DONE FLAG
	CLA CMA		///
	DCA CRDONE	///
	JMP INTEXT	///

EQUAL,	0
	TAD CRADRO
	CIA
	TAD CRADRI
	SNA CLA
	 ISZ EQUAL
	JMP I EQUAL

CRCDF,	0		/CDF TO USERS REAL INSTRUCTION FIELD
	CDF
	JMP I CRCDF

CRUPC,	0
CRDONE,	0
CRTPNT,	0
CRUAC,	0
CRPNT,	0
CRADRI,	0
CRADRO,	0

PAGE

CRBBEG,	CRPATCH
INIT,	0
	DCA ZTEM1	/REMEMBER AC
	TAD (ASEMTB-1
	DCA AUTO10
	TAD I AUTO10
	SZA CLA		/LOOK FOR FREE ENTRY IN ASEMTB
	 JMP .-2
	TAD AUTO10
	DCA ZTEM2
	CDF 0		//
	TAD I (CURTSK	//
	CDF 10		/
	DCA I ZTEM2
	TAD ZTEM2
	CDTOIF
	DCA I CRBBEG	/STORE ASEMTB ENTRY IN CRPATCH
	ACM1
	TAD INIT
	DCA INIT
	TAD (SZL	/
	DCA I INIT	/REMOVE CALL TO INIT
	CDF 10		/RESTORE ORIGINAL DATAFIELD
	CLL		/LINK MUST BE ZERO HERE
	TAD ZTEM1	/RESTORE AC
	JMP I INIT	/RETURN TO MAIN LINE