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

/MR.TK 1-OCT-79 WVDM
/THIS IS A MARKSENSE READER BLOCKDRIVER FOR MULTI8 V7A
/ITS STRUCTURE MIGHT REMIND YOU OF THE OS/8 CARDERADER HANDLER
/THE 12-BIT IN-OUT INTERFACE (DR8-EA) IS USED
/THE INPUT REGISTER LOOKS AS FOLLOWS:
/
/ \ E / C / S \ H / D / D \ D / D / D \ D / D / D \
/
/ WHERE: E = END OF CARD H		HIGH TRANS TO FF AND SKIP LINE
/	 C = CARD UNDER PHOTOCELL H
/	 S = MARK STROBE L		HIGH TRANS TO FF AND SKIP LINE
/	 H = HOPPER EMPTY H
/	 D = 8 BITS OF DATA
/
/THE OUTPUT REGISTER LOOKS AS FOLLOWS:
/
/ \ C / S / 0 \ 0 / 0 / 0 \ 0 / 0 / 0 \ 0 / D / M \
/
/ WHERE: C = CARD FEED
/	 S = STROBE RESET
/	 D = DATA RESET
/	 M = MOTOR ENABLE

MRDI=6540	/DISABLE INTERRUPT
MREI=6541	/ENABLE INTERRUPT
MRSS=6542	/SKIP ON COMPOSITE FLAG
MRCI=6543	/AC CLEARS INPUT BITS
MRRI=6544	/JAM INPUT IN AC
MRCO=6545	/AC CLEARS OUTPUT BITS
MRSO=6546	/AC SETS OUTPUT BITS
MRRO=6547	/JAM OUTPUT IN AC

	*200

/TASK HEADER:
	"M^100+"R&3777	/NAME IS 'MR'. NORMALLY CALLED BY 'KE'
	401		/A TWO PAGE TASK CONNECTED TO ONE INTERRUPT
	CRD		/CONNECT TO INTERRUPTS FROM THE CARDREADER
	MDRINT		/INTERRUPT ENTRYPOINT

/PAGE HEADER:
MDRIN4,	MDRGCH		/GET CHARACTER ROUTINE
MDRCA,	0		/BUFFER POINTER
/TASK CODE:
MR,	SNA		//CLOSE CALL ?
	 JMP MRCLOSE	//YES, QUIT
	JMS DEFER	//GET FUNCTION WORD
	AND C70		//GET BUFFER FIELD BITS
	TAD C6201	//MAKE A "CDF N"
	DCA MDBCDF	//SAVE IT IN THE GET CHAR LOOP
	TAD I X		//GET FUNCTION WORD AGAIN
	ISZ X
	SPA		//IS IT A WRITE FUNCTION?
	 JMP MDRERR	//YES - HARD ERROR
	AND C7700	//GET COUNT BITS
	CMA
	DCA MDRWC	//SAVE WORD COUNT (DIVIDED BY 2) - 1
	TAD I X		//GET BUFFER ADDRESS
	DCA MDRCA	//AND SAVE IT
CALMON,	JMP MDRBUF	/JMS MONITOR	/NOW RESERVE AN EVENT
	   RESERV RETURN CONTINUE
	DCA MREVNT	/THAT'S WHERE W'LL SIGNAL COMPLETION
	DCA CTRLZ	/CLEAR E-O-F FLAG
	JMP MDRISZ	/TEST IF NO TRANSFER
MDRLP,	JMS I MDRIN4	/GET A CHARACTER
	DCA MDRTM1	/DATA FIELD STILL CURRENT ON RETURN!
	JMS I MDRIN4	/GET NEXT CHARACTER
	DCA MDRTM2	/AND SAVE IT
	JMS I MDRIN4	/GET NEXT CHARACTER
	RTL
	RTL		/GET THE FIRST FOUR BITS OF IT
	DCA MDRTM3	/SAVE THE REST FOR LATER
	TAD MDRTM3
	AND C7400	/ONLY 4 BITS
	TAD MDRTM1	/ADD THOSE BITS TO THE 1ST CHAR
MDBCDF,	HLT		//CDF TO BUFFER FIELD
	DCA I MDRCA	//STORE 1ST CHARACTER
	ISZ MDRCA	//BUMP POINTER TO BUFFER
CTRLZ,	NOP		//PROTECT THE ISZ AGAINST BAD BUFFER LOC'S
	TAD MDRTM3
	RTL
	RTL		//NOW GET LOW ORDER 4 BITS
	AND C7400	//AND ONLY 4 BITS
	TAD MDRTM2	//ADD IN THE 2ND CHARACTER
	DCA I MDRCA	//AND STORE THE WORD
	ISZ MDRCA	//BUMP POINTER AGAIN
	NOP		//PROTECT THE ISZ
MDRISZ,	CDTOIF		/RESET TO CURRENT FIELD
	ISZ MDRWC	/DONE?
	 JMP MDRLP	/NO - LOOP
	TAD CTRLZ	/GETS ZERO OR EOMERR
MONCON,	JMS MONITOR
	   SIGNAL HALT
MREVNT,	   0		/COMPLETION EVENT #
MDRWC,	0		/WORDCOUNT DIVIDED BY 2
MDRERR,	AC0004		//RETURN FATAL ERROR
MRCLOSE,CMA		//EVENT -1 GIVES IMMEDIATE OK
	JMS MONITOR
	   EXIT SWPOUT

MDRTM1,	0
MDRTM2,	0
MDRTM3,	0

MDRBUF,	MRDI		//DISABLE MARKREADER INTERRUPTS
	STA		//
	MRCI		//CLEAR INPUT FLAGS
	MRCO		//AND CLEAR OUTPUT (YOU NEVER KNOW)
	IOF		//TURN OFF INTERRUPTS
	AC0001		//
	MRSO		//AND WARM UP MOTOR
	ISZ ZERO	//WAIT FOR NOISE
	JMP .-1
	STA
	MRCI		//CLEAR AGAIN
	MRDI		//?
	CLA
	ION		//DON'T FORGET
	TAD MTCK	//WAIT FOR 2 SECONDS TO CLEAR EVENT
	JMS MONITOR	//AND GET MOTOR UTS
	   WAIT		//
	   CRD		//
	CLA		//
	STA
	MRCI		//NOW CLEAR INPUTS AGAIN (NOISY MACHINE)
	CLA
	TAD MONCON	//GET 'JMS MONITOR"
	DCA CALMON	//AND PUT IT IN TASK CODE
	JMP CALMON	//AND CALL MONITOR
MTCK,	-DGNTICK^2
ZERO,	0

	ZBLOCK 400-.	/CARD BUFFER

PAGE
/PAGE HEADER:
/THE CARDBUFFER RUNS INTO THIS PAGE BY INSERTING
/SUFFICIENT NON-ZERO LOCATIONS HERE:
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
	.
IFNZRO .-MDRBUF-120&4000 <ADD SOME MORE DOTS!>
MDRABF,	MDRBUF-1
XCTRLZ,	CTRLZ

/SECOND PAGE CODE SECTION:
MDRGCH,	0		/GET A CHARACTER ROUTINE - ENTER WITH DF=CURRENT
MDRJMP,	0		/THIS IS "JMP MDRDAT" AFTER A ^Z
	ISZ MDRCNT	/MORE CHARACTERS IN THE INTERNAL BUFFER?
	 JMP MDRGET	/YES - GET ONE
MDRGE4,	ISZ MDRCT2	/GIVE A 215, 212 FOR EVERY CARD
	 JMP MDRCLF	/215, 212 ROUTINE
	ACM3
	DCA MDRCT2	/RESET COUNT TO -3
IFNZRO .&177-32 < LOCERR, _ >
MDR400,	400		/MAKES CONSTANT 232
	TAD MDRM40
	DCA MDROFF	/RESET FINAL TIMOUT
MDRGE7,	MRRI		/SEE IF HOPPER FULL
MDR232,	AND MDR400	/TEST HOPPER BIT
MDRMBA,	SZA CLA		/ALSO '_' TEST  (7640 = -137-1)
	 JMP MDRGE0	/NO GO - TRY AGAIN AFTER WAIT
	TAD MDRABF	/
	DCA MDRPT	/INITIALIZE BUFFER POINTER
	STA
	MRCI		/CLEAR ODD FLAGS
	MRSO		/RESET STROBE AND DATA, FEED CARD
	MREI		/SET INTERRUPT ENABLE - AC=-1 SO WHAT?
	TAD (-DGNTICK	/TIMEOUT 1 SECOND
	JMS MONITOR	/WAIT FOR CARD COMPLETION
	   WAIT
CCRD,	   CRD
MDRM40,	SMA SZA CLA		/TIMEOUT ?
	 JMP TMOUT	/YES, TRY AGAIN
MDRGE3,	TAD I MDRPT	/GET LAST CHARACTER
	TAD MDRM40	/TEST FOR SPACE
	SZA CLA		/WAS IT?
	 JMP MDRGE5	/NO
	ACM1
	TAD MDRPT	/YES,
	DCA MDRPT	/BACK UP POINTER ONE
	ISZ MDRCNT	/AND TAKE COUNT DOWN BY 1
	 JMP MDRGE3	/TEST AGAIN OR...
	JMP MDRGE4	/IF COUNT IS ZERO THEN A BLANK CARD

MDRGE5,	TAD I MDRPT	/GET LAST NON-SPACE
	TAD MDRMBA	/THIS FORMS 7777 IF WORD CONTAINS "_"
	AND MDRCNT	/THIS MAINTAINS 7777 IF MDRCNT IS -1
	CMA
	SNA CLA		/ARE BOTH CONDITIONS TRUE?
	 JMP MDRGEZ	/YES - MUST BE END OF FILE
MDRGE6,	TAD MDRABF	/SET POINTER TO BUFFER
	DCA MDRPT
MDRGET,	ISZ MDRPT	/BUMP POINTER
	TAD I MDRPT	/GET A CHARACTER
MDRDAT,	TAD C200	/MAKE IT ASCII
	JMP I MDRGCH

MDRCLF,	ACM1
	DCA MDRCNT	/SET MAIN COUNT TO SKIP
	TAD MDRCT2
	CLL CMA RTL	/ALL THIS DOES IS...
	TAD MDRCT2	/MAKE A 2 OR -1
	TAD MDR13	/SO THIS MAKES A 15 OR 12
MDRMOD,	JMP MDRDAT

/HERE IF TIMEOUT:
MDRGE0,	JMS MONITOR	/HERE IF HOPPER NOT FULL
	   STALL	/STALL A WHILE
MDR13,	   13
	SKP CLA		/ABANDON IF UNATTENDED
TMOUT,	DCA MDRCNT	/CLEAR COUNT IN CASE PARTIAL CARD READ (E.G. JAM)
	ISZ MDROFF	/TEST IF NOTHING COMING
	JMP MDRGE7	/TIMED OUT - RESTART CARD
MDRGEZ,	ACM1		/HERE IF E-O-F CARD OR INACTIVE
	DCA MDRCNT	/RESET COUNTS TO SKIP
	ACM1
	DCA MDRCT2
	TAD MDRMOD
	DCA MDRJMP	/SET TO GIVE 0'S
	TAD (EOMERR
	DCA I XCTRLZ	/AND A SOFT ERROR
	TAD MDR232	/^Z
	JMP I MDRGCH	/EXIT
/INTERRUPT ROUTINES:	INTERRUPT ENABLE CLEARED IN SKIP CHAIN
/
MDRINT,	MRRI		///CARD DONE?
	SMA
	 JMP MDRGE2	///NO - TRY FOR DATA READY
	AC4000		///SET BIT FOR CARD FEED
	MRCO		///DISABLE CARD FEED NOW
	STA		///
	MRCI		///CLEAR CARD DONE FLAG
	MRDI		///EOC, END OF INTERRUPT
	CLA		///LEIDER
	TAD CCRD	///
	CIF 0		///SIGNAL EVENT TO TASK LEVEL
	JMS I ZSOFINT	///
	   0		///

MDRGE2,	CLL RTL		///DATA READY?
	SMA CLA
	 JMP IGNORE	///NO - GHOST INTERRUPT
	ACM1		///YES, STORE IN BUFFER
	TAD MDRCNT	///
	DCA MDRCNT	///COUNT THE CHARACTERS
	ISZ MDRPT	///BUMP POINTER
	MRRI		///GET 8-BIT
	AND C177
	DCA I MDRPT	///STORE CHARACTER
IGNORE,	STA
	MRCI		///CLEAR OLD FLAGS
	MREI		///MORE DATA, MORE INTERRUPTS
	CLA		///LEIDER
	CIF CDF 0	///
	JMP I ZFSTEXT	///RETURN FROM INTERRUPT

MDRCNT,	-1		/MAIN COUNT
MDRCT2,	-1		/215, 212 COUNT
MDRPT,	0		/BUFFER POINTER
MDROFF,	-40		/FOR FINAL TIMOUT

	$