File: KR.TK of Tape: Sources/Multi8/multi8-1
(Source file text) 

/KR.TK 23-JUL-79
/THIS IS A CARDREADER BLOCKDRIVER FOR MULTI8 V7A
/ITS STRUCTURE MIGHT REMIND YOU OF THE OS/8 CARDERADER HANDLER

RCSF=6631
RCRA=6632
RCNO=6635
RCSP=6671
RCSE=6672
RCRD=6674

	*200

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

/PAGE HEADER:
CDRIN2,	CDRJMP
CDRIN4,	CDRGCH
CDRTMP,	0

/TASK CODE:
KR,	JMP CDRBUF	//INITIALIZE, BECOMES:
/	SNA		//CLOSE CALL ?
	 JMP KRCLOSE	//YES, QUIT
	JMS DEFER	//GET FUNCTION WORD
	AND C70		//GET BUFFER FIELD BITS
	TAD C6201	//MAKE A "CDF N"
	DCA CDBCDF	//SAVE IT IN THE GET CHAR LOOP
	TAD I X		//GET FUNCTION WORD AGAIN
	ISZ X
	SPA		//IS IT A WRITE FUNCTION?
	 JMP CDRERR	//YES - HARD ERROR
	AND C7700	//GET COUNT BITS
	CIA
	DCA CDRWC	//SAVE WORD COUNT (DIVIDED BY 2)
	TAD I X		//GET BUFFER ADDRESS
	DCA CDRCA	//AND SAVE IT
	JMS MONITOR	//NOW RESERVE AN EVENT
	   RESERV RETURN CONTINUE
	DCA KREVNT	//THAT'S WHERE W'LL SIGNAL COMPLETION
	DCA CTRLZ	//CLEAR E-O-F FLAG
CDRLP,	CDTOIF		/
	JMS I CDRIN4	/GET A CHARACTER
	DCA CDRTM1	/DATA FIELD STILL CURRENT ON RETURN!
	JMS I CDRIN4	/GET NEXT CHARACTER
	DCA CDRTMP	/AND SAVE IT
	JMS I CDRIN4	/GET NEXT CHARACTER
	RTL
	RTL		/GET THE FIRST FOUR BITS OF IT
	DCA CDRTM2	/SAVE THE REST FOR LATER
	TAD CDRTM2
	AND C7400	/ONLY 4 BITS
	TAD CDRTM1	/ADD THOSE BITS TO THE 1ST CHAR
CDBCDF,	HLT		//CDF TO BUFFER FIELD
	DCA I CDRCA	//STORE 1ST CHARACTER
	ISZ CDRCA	//BUMP POINTER TO BUFFER
CTRLZ,	NOP		//PROTECT THE ISZ AGAINST BAD BUFFER LOC'S
	TAD CDRTM2
	RTL
	RTL		//NOW GET LOW ORDER 4 BITS
	AND C7400	//AND ONLY 4 BITS
	TAD CDRTMP	//ADD IN THE 2ND CHARACTER
	DCA I CDRCA	//AND STORE THE WORD
	ISZ CDRCA	//BUMP POINTER AGAIN
CDRTM1,	NOP		//PROTECT THE ISZ
	ISZ CDRWC	//DONE?
	 JMP CDRLP	//NO - LOOP
	TAD CTRLZ	//GETS ZERO OR EOMERR
	JMS MONITOR
	   SIGNAL HALT
KREVNT,	   0		//COMPLETION EVENT #

CDRERR,	AC0004		//RETURN FATAL ERROR
KRCLOSE,CMA		//EVENT -1 GIVES IMMEDIATE OK
	JMS MONITOR
	   EXIT SWPOUT

CDRCA,	0		/BUFFER POINTER
CDRWC,	0		/WORD COUNT DIVIDED BY 2
CDRTM2,	0		/SPLIT WORD TEMPORARY

/THE TRANSLATION TABLE:
CDRTBL,	0021;2223;2425;2627;3031;3203;4007;3502
	2017;6364;6566;6770;7172;7514;0577;3637
	1552;5354;5556;5760;6162;0104;1211;3374
	0641;4243;4445;4647;5051;7316;3410;1376

/DO NOT INSERT ANYTHING BETWEEN "CDRTBL" AND "CDRBUF"!!

CDRBUF,	DCA AC		//SAVE USER AC TEMPORARILY
	RCNO		//DISABLE CARDREADER INTERRUPTS
	RCRA		//CLEAR COLLUM FLAG
	ACM1		//CLEAR EVENT BY WAITING WITH SMALL
	JMS MONITOR	//TIMEOUT
	   WAIT		//
	   CRD		//
	CLA		//
	TAD CSNA	//
	DCA KR		//PUT 'SNA' IN TASK CODE
	TAD AC		//RESTORE AC
	JMP KR		//AND START TASK

AC,	0
CSNA,	SNA

	ZBLOCK 400-.	/CARD BUFFER

PAGE
/PAGE HEADER:
/THE CARDBUFFER RUNS INTO THIS PAGE BY INSERTING
/SUFFICIENT NON-ZERO LOCATIONS HERE:
	.
	.
	.
	.
	.
	.
	.
	.
IFZERO CDRBUF+50-.&4000 <ADD SOME MORE DOTS!>
CDRABF,	CDRBUF-1
CDRTAD,	CDRTBL
XCTRLZ,	CTRLZ
	/0

/SECOND PAGE CODE SECTION:
CDRGCH,	0		/GET A CHARACTER ROUTINE - ENTER WITH DF=CURRENT
CDRJMP,	0		/THIS IS "JMP I CDRGCH" AFTER A ^Z
	ISZ CDRCNT	/MORE CHARACTERS IN THE INTERNAL BUFFER?
	 JMP CDRGET	/YES - GET ONE
CDRGE4,	ISZ CDRCT2	/GIVE A 215, 212 FOR EVERY CARD
	 JMP CDRCLF	/215, 212 ROUTINE
	ACM3
	DCA CDRCT2	/RESET COUNT TO -3
CDRGE7,	RCSE		/SELECT A CARD
	 JMP CDRGE0	/NO GO - TRY AGAIN
	DCA CDRSW	/SET PACKING SWITCH
	TAD CDRABF	/
	DCA CDRPT	/INITIALIZE BUFFER POINTER
	RCRA		/CLEAR DATA FLAG
	AC0001		/SET INTERRUPT ENABLE
	RCNO		/
	TAD (-DGNTICK	/TIMEOUT 1 SECOND
	JMS MONITOR	/WAIT FOR CARD COMPLETION
	   WAIT
CCRD,	   CRD
	SZA CLA		/TIMEOUT ?
	 JMP TMOUT	/YES, TRY AGAIN
CDRGE3,	TAD I CDRPT	/GET LAST TWO CHARACTERS
	SZA		/BOTH SPACES?
	 JMP CDRGE5	/NO
	ACM1
	TAD CDRPT
	DCA CDRPT	/BACK UP POINTER ONE
	ISZ CDRCNT
	ISZ CDRCNT	/AND TAKE COUNT DOWN BY 2
	 JMP CDRGE3	/TEST AGAIN OR...
	JMP CDRGE4	/IF COUNT IS ZERO THEN A BLANK CARD

CDRGE5,	AND C77		/IS RIGHT HAND CHARACTER A SPACE?
	SNA CLA
	 ISZ CDRCNT	/YES A SPACE - REDUCE COUNT
	TAD I CDRPT	/GET LAST NON-SPACE
	TAD C77		/THIS FORMS 7777 IFF WORD CONTAINS "_"
	AND CDRCNT	/THIS MAINTAINS 7777 IFF CDRCNT IS -1
	CMA
	SNA CLA		/ARE BOTH CONDITIONS TRUE?
	 JMP CDRGEZ	/YES - MUST BE END OF FILE
CDRGE6,	TAD C77
	DCA CDRSW	/SET OFFSET FROM "CDRTBL"
CDRGET,	ISZ CDRSW	/BUMP OFFSET
	TAD CDRSW	/OFFSET INTO AC
	JMS CDRGE8	/GET A CHARACTER
	TAD C240	/MAKE IT ASCII
CDRMOD,	JMP I CDRGCH

CDRCLF,	ACM1
	DCA CDRCNT	/SET MAIN COUNT TO SKIP
	TAD CDRCT2
	CLL CMA RTL	/ALL THIS DOES IS...
	TAD CDRCT2	/MAKE A 2 OR -1
	TAD (213	/SO THIS MAKES A 215 OR 212
	JMP I CDRGCH

/HERE IF E-O-F CARD
CDRGEZ,	ACM1
	DCA CDRCNT	/RESET COUNTS TO SKIP
	ACM1
	DCA CDRCT2
	TAD CDRMOD
	DCA CDRJMP	/SET TO GIVE 0'S
	TAD (EOMERR
	DCA I XCTRLZ	/AND A SOFT ERROR
	TAD (232	/^Z
	JMP I CDRGCH	/EXIT

/HERE IF RCSE DID NOT SKIP
CDRGE0,	JMS MONITOR	/STALL A WHILE
	   STALL
	   5
	JMP CDRGE7	/TRY AGAIN (AC=2!)

/THE NEXT ROUTINE IS USED TO FETCH BYTES, BOTH
/FROM THE CARD BUFFER AND FROM THE TRANSLATION TABLE
CDRGE8,	0		/GET FROM BUFFER ROUTINE
	CLL RAR		/DIVIDE BY 2 - AND INTO LINK IS INDICATOR
	TAD CDRTAD	/ADDRESS OF "CDRTBL"
	DCA CDRTM3	/SET POINTER
	TAD I CDRTM3	/GET WORD
	SNL		/SHIFT?
	 BSW		/YES
	AND C77		/GET 6 BITS
	JMP I CDRGE8

/HERE IF TIMEOUT:
TMOUT,	DCA CDRCNT	/CLEAR COUNT IN CASE PARTIAL CARD READ (E.G. JAM)
	JMP CDRGE7	/TIMED OUT - RESTART CARD

/INTERRUPT ROUTINES:
CDRINT,	RCSP		///CARD DONE?
	 JMP CDRGE2	///NO - TRY FOR DATA READY
	RCRD		///CLEAR CARD DONE FLAG
	RCNO		///CLEAR INTERRUPT ENABLE
	TAD CCRD	///
	CIF 0		///SIGNAL EVENT TO TASK LEVEL
	JMS I ZSOFINT	///
	   0		///

CDRGE2,	RCSF		///DATA READY?
	 JMP IGNORE	///NO - GHOST INTERRUPT
	RCRA		///READ ALPHA
	JMS CDRGE8	///GET TABLE ENTRY
	ISZ CDRSW	///WHICH SIDE?
	 JMP CDRGE9	///LEFT SIDE
	TAD I CDRPT	///
	DCA I CDRPT	///FORM RIGHT SIDE
	JMP IGNORE	///CONTINUE

CDRGE9,	BSW		///SHIFT LEFT
	ISZ CDRPT	///BUMP POINTER
	DCA I CDRPT	///STORE LEFT SIDE
	ACM2		///-2 V3 FROM SIS BULLETING JAN  73
	TAD CDRCNT	///
	DCA CDRCNT	///COUNT THE CHARACTERS
	ACM1		///RESET SWITCH
	DCA CDRSW	///
IGNORE,	CIF CDF 0	///
	JMP I ZFSTEXT	///RETURN FROM INTERRUPT

CDRTM3,	0
CDRM27,	-27		/-27-3=-32 ^Z TEST
CDRCNT,	-1		/MAIN COUNT
CDRCT2,	-1		/215, 212 COUNT
CDRPT,	0		/BUFFER POINTER
CDRSW,	0		/SWITCH

	$