File: UDCICS.PA of Tape: Sources/RTS/dec-s8-ortsa-b-uc
(Source file text) 

/ICS/UDC HANDLER V2 FOR RTS-8 V2
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1974, 1975 BY DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
/CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
/DIGITAL.
/
/
/
/
/
/
/
/
/
/
IFDEF UDC <CONASB=1>
IFDEF ICS <CONASB=1>
IFDEF CONASB <
	CUR=10
IFDEF UDC < TASK=UDC >
IFDEF ICS < TASK=ICS >
	INIWT=0		/START RUNNING

//DEFINE HARDWARE PARAMETERS FOR ICS/UDC HANDLER TASK
DECIMAL

	FAD=0		/ADDR OF FIRST A/D CHANNEL
			/MUST BE CONTIGUOUS CHANNELS (UDC)
	NAD=2		/NO. OF A/D CHANNELS
IFDEF UDC <NMPLX=0>	/DEFAULT OF ZERO FOR UDC
	NMPLX=7		/NO. OF ICS MULTIPLEXOR MODULES PER CONVERTER
DELTA=NMPLX+1
DELTA=DELTA^NAD
	FCTR=14		/ADDR OF FIRST COUNTER
			/MUST BE CONTIGUOUS CHANNELS
	NCNTR=1		/NO. OF COUNTERS
	FCT=0		/ADDR OF FIRST CONTACT
			/MUST BE CONTIGUOUS CHANNELS
	NCNTC=2		/NO. OF CONTACTS

OCTAL
//DEFINE SOFTWARE PARMETERS FOR ICS/UDC HANDLER TASK

	OPCODE=12	/NO. OF OP CODES IN HANDLER
	RINGBF=12	/NO. OF INTERRUPTS IN RING BUFFER


/11 POSSIBLE OPERATIONS:
/EACH CALL IS 10 WORDS LONG (INCL HEADER)
/WORD 10 IS SET TO CONTAIN ERROR FLAGS

/ANALOG OUTPUT		OP CODE
/			MAJOR CHANNEL
/			CHANNEL(0,1) + VALUE(2-11)
/DIGITAL OUTPUT		OP CODE
/			CHANNEL
/			VALUE
/DIGITAL INPUT		OP CODE
/			CHANNEL
/			0 FOR ANSWER
/GET GENERIC CODE	OP CODE
/			CHANNEL NUMBER
/			0 FOR ANSWER
/ENABLE CONTACT		OP CODE
/			BIT+CHANNEL NUMBERS
/			ACTION CODE(0,1,2), ONCE FLAG(3)
/			TASK NO.(4-11):
/			0=SET EVENT FLAG(NO TASK NO LEEDED)
/			  NO ASSOC. INFO (0)
/			1=RUN TASK
/			  NO ASSOC. INFO (0)
/			2=DERAIL THE TASK TO
/			  ADDRESS(SAME FIELD AS MESSAGE)
/			3=1=DO ACTION JUST ONCE
/			3=0=FOR EACH INTERRUPT
/DISABLE CONTACT	OP CODE
/			BIT + CHANNEL NUMBER
/ENABLE COUNTER		OP CODE
/			CHANNEL NUMBER
/			INIT VALUE
/			RELOAD VALUE(0=DON'T RELOAD)
/			ACTION CODE, ONCE FLAG + TASK(4-11):
/			0=SET EVENT FLAG
/			  NO ASSOC. INFO(0)
/			1=RUN TASK
/			  NO ASSOC. INFO (0)
/			2=DERAIL THE TASK TO
/			  ADDRESS(SAME FIELD AS MESSAGE)
/			3=1=DO ACTION JUST ONCE
/			3=0=FOR EACH INTERRUPT
/DISABLE COUNTER	OP CODE
/			CHANNEL NUMBER
/READ COS		OP CODE
/			CHANNEL NUMBER
/			0 FOR ANSWER
/ANALOG INPUT		OP CODE
/		/**** ICS **** 
/			MAJOR CHANNEL // LESS THEN 17(10)
/			ENABLE,GAIN,SUBCHANNEL // 0-120(10)
/			0 FOR ANSWER
/		/**** UDC ****
/			MAJOR CHANNEL
/			ENABLE,GAIN,SUBCHANNEL
/			0 FOR ANSWER
/READ COUNTER		OP CODE
/			CHANNEL NUMBER
/			0 FOR ANSWER

/ERROR CONDITIONS RETURNED
/
/  1 -- INVALID GENERIC CODE FOR THE OPERATION
/  2 -- INVALID CHANNEL OR SUBCHANNEL
/  3 -- OP CODE OUT OF RANGE
/  5 -- ICS/UDC NOT RESPONDING CORRECTLY (POWERED OFF OR HARD ERROR)

/DEFINITIONS OF IOTS
	UDSF=6361
	UDEI=6364
	UDDI=6365
	UDLA=6363
	UDRD=6366
	UDLD=6367
	UDSS=6351
	UDSC=6353
	UDRA=6356
	UDLS=6357
	UDRS=6355
	FIELD CUR%10
	*130
T1,	0		/GEN TEMP
T2,	0		/"
AT2,	0		/ADDRESS PTR
RINGCT,	0		/COUNT OF FULLNESS OF RING BUFFER
ENDOP,	END		/AFTER PROCCESSING A COMMAND
TBLPTR,	0		/FOR POINTING TO ALL INTERNAL TABLES
ADDRUP,	0
MOREIO,	UDCMOR
RINGDN,	RNGEND
ERRNMB,	0	/ERROR NUMBER (IF ZERO NO ERROR)

CDFMSG,	0
MSGCDF,	0
	JMP I	CDFMSG

	*600
GOTMAL,	CAL
	RECEIV
CALADR,	0
	DCA	MSGCDF
	DCA	ERRNMB	/CLEAR ERROR NUMBER
	TAD	CALADR
	DCA	SAVADR
	TAD	CALADR
	DCA	ADDRUP	/ADDRESS FOR LOOKING AT ARGS
	JMS	CDFMSG
	TAD I	CALADR	/GET OP CODE
	CDF	CUR
	SPA		/0-12
	JMP I	(BADOP
	TAD	(-OPCODE	/UPPER LIMIT OF OP CODES
	SZA SMA
	JMP I	(BADOP
	TAD	(OPTBL+OPCODE
	DCA	T1
	TAD I	T1
	DCA	T1
	JMP I	T1	/DISPATCH TO TASK
OPTBL,	AOOP
	DOOP
	DIOP
	GCOP
	ECNTR
	RDCNTR
	DCNTR
	ECAOP
	RDCOS
	DCAOP
	AIOP
SAVADR,	0
UDCMOR,	CIF CDF CUR
	TAD 	RINGCT	/0=EMPTY,-10=FULL
	SZA CLA
	JMP I	(DORING	/HANDLE THE RING BUFFER
	CDF	0	/BUFFER EMPTY
	TAD I	(TASK^2+MSGTBL
	SZA CLA
	JMP	GOTMAL	/MESSAGE WAITING
	TAD	(4000+TASK
	DCA	UDCEV
	CDF CUR
	CIF 0
	IOF
	WAITM		/RTS8 SUBROUTINE TO BLOCK
	EORMWT		/CURRENT TASK
	JMP	UDCMOR

UDCEV,	0

START,
IFDEF	PWRF<
	CAL
	SEND
	PWRF
	DRLADR
	>
	CAL
	SKPINS
DERINT,	UDCINT		/DERAIL ENTRY POINT FOR POWER RECOVERY
	CLA CLL
	TAD	(-NCNTC
	SNA
	JMP	GENERL
	DCA	T2
	TAD	(DCOSTB
	DCA	T1
	TAD	(FCT	/GET ADDRESS OF FIRST CONTACT
	DCA	AT2
INITLP,	TAD	AT2
	UDLA
	UDRD
	DCA I	T1	/LOAD UP TBL WITH INIT VALUES
	ISZ	AT2
	ISZ	T1
	ISZ	T2
	JMP	INITLP
GENERL,	DCA 	RINGCT	/STARTS OUT EMPTY
			/RINGCT: -RINGBF = FULL;0 = EMPTY
	TAD	(RINGBT
	DCA I	(RINGPT
	TAD	(RINGBT
	DCA I	(TBLOUT
	TAD	(-DCOSTB+CNTCTB
	DCA	T2
	TAD	(CNTCTB	/FROM A SAFE DISTANCE
	DCA	T1	/START TO FILL TABLES
NEGIT,	CLA CMA		/WITH 7777
	DCA I	T1
	ISZ	T1
	ISZ	T2
	JMP	NEGIT
	UDEI
	JMP 	UDCMOR

ANIEXT,	DCA	MSGCDF
	AC7775
	TAD	AT2
	DCA	SAVADR

END,	CLA CLL		/NO ERRORS RETURN
	TAD 	SAVADR
	TAD	(6
	DCA	T1	/7TH WORD IS STATUS
	TAD 	ERRNMB
	JMS	CDFMSG
	DCA I	T1
	CDF	CUR
	TAD	MSGCDF	/WHEN ALL DONE, POST EV FLG
	DCA	POSCDF
	AC7775
	TAD	SAVADR
	CAL
	POST
POSCDF,	0
	JMP	UDCMOR


	PAGE
UDCINT,	ZBLOCK	2	/UDC INTERRUPT LEVEL CODE
			/WD 1 - ADDR NEXT SKIP CHAIN ENTRY
			/WD 2 - SET TO ITS CDF CIF
UDCSKP,	UDSF		/SKIP IF FLAG SET
	JMP I	UDCINT	/EXIT FOR OTHER INTERRUPTS
	CDF CIF CUR
	TAD	(RINGBF
	TAD 	RINGCT
	SNA CLA
	JMP	NOMORE	/IF FULL MUST WAIT
	TAD 	RINGCT	/ROOM FOR AT LEAST 1 MORE
	DCA	OLDCT	/SAVE FOR BUFFER WAS EMPTY CHECK
	UDEI		/NEEDED BEC. UDSF TURNS INTS OFF
MORCHK,	UDRS
	SNA
	JMP	OKPTR	/NO INTERRUPT PENDING-DONE
	UDSC
	UDSS
	JMP	.-1	/ONLY A SHORT WAIT
	UDRA		/GET VALUE
	DCA I	RINGPT	/GC+ADDR INTO BUFFER
	CLA CMA
	TAD 	RINGCT	/NOW THAT WE'VE GOT A VALUE
	DCA 	RINGCT	/BUMP COUNTER
	TAD I	RINGPT	/DECODE TIME
	CLL RTL
	SZL
	JMP	NOCNTC	/G.T. OR EQ. 4
	SMA CLA		/0,1,2, OR 3
	JMP	ONEZER	/BAD NEWS
	TAD I	RINGPT	/CONTACT INTERRUPT
	AND	(377	/ADDRESS MASK
	TAD	(DCOSTB-FCT
	DCA	INT1
	TAD I	INT1
	DCA	INT2	/TEMP. SAVE PREVIOUS COS
	UDRD
	DCA I	INT1	/REPLACE WITH LATEST COS
	TAD	INT2
	UDLS		/GET PREV COS FOR CONTACTS
SAVEWD,	ISZ	RINGPT
	DCA I	RINGPT
	CLL
	ISZ	RINGPT
	TAD	RINGPT
	TAD	(-RINGTP	/AVOID OVERFLO
	SNL CLA
	JMP	MORCHK
	CLL
	TAD	(RINGBT	/POINT TO BOTTOM AGAIN
			/BUFFER FILLED BY 2S.
	DCA	RINGPT
	JMP	MORCHK
OKPTR,	TAD	OLDCT
	SNA CLA
	TAD 	RINGCT	/BUFFER WAS EMPTY
			/SEE IF NOW HAS AN ENTRY
	SZA CLA		/IF NO, POSTDS WITH AC=0
	TAD	(UDCEV	/POST UDC EVENT FLAG
			/BUFFER BECAME NON-EMPTY
			/SO WAKE UDC UP
	CIF	0
	POSTDS
OLDCT,	0

/IF NO MORE ROOM, REMOVE UDSF
/LEAVE UDC DISABLDED, SET FLAG, + POSTDS WITH AC=0
NOMORE,	ISZ I	(REENAB
	DCA	UDCSKP	/0 THE SKIP
	CIF	0
	POSTDS		/AC=0
NOCNTC,	CLL
	TAD	(2000
	SNL CLA
	JMP	SAVEWD	/A 0 FOR COUNTERS
	TAD I	RINGPT
IFDEF ICS <
	AND	(17	/ADDR PART FOR SUBCH GET
	>
IFDEF UDC <
	AND	(377	/ADDR PART FOR SUBCH GET
	>
	DCA	INT1
	UDRD		/GET SUBCHANNEL.PREV ADDR IN
			/ADDR REG MUST BE FOR THIS CHAN
IFDEF ICS <
	AND	(177
	TAD	(-10	/REMOVE BIAS !!!
	CLL RTL
	RTL; RAL	/SUBCHANNEL INTO BITS 1-7
	>
IFDEF UDC <
	AND	(7
	CLL RTR
	RTR		/INTO BITS 1-3
	>
	STL RAR		/AND NOW WHEN BIT 0=1=A/D INT
	TAD	INT1
	DCA I	RINGPT	/REPLACE WITH REARRANGED VALUE
			/REARRANGED VALUE:
			/BIT 0=A/D
			/**** UDC ****
			/BITS 1-3=SUBCHANNEL (0=1ST)
			/BITS 4-11=ADDR
			/**** ICS ****
			/BITS 1-7=SUBCHANNEL (0=1ST)
			/BITS 8-11=ADDR
	UDLD		/LOAD A 0 BEFORE READ(BIT 8)
	UDRD		
	JMP	SAVEWD	

RINGPT,	0
INT1,	0
INT2,	0

ONEZER,	ISZ	RINGCT	/IGNORE BAD VALUES (OVERWRITE)
K7000,	NOP
	JMP	MORCHK
ADINT,
IFDEF ICS <
	AND (17
	>
	JMS I	(ADCHK	/GC, SUBCH + ADDR IN AC
	TAD I	(TBLWD1
IFDEF UDC <
	AND	(3400	/GET SUBCHANNEL 0-7
	CLL RTL
	RTL
	RTL		/SUBCH*2
	>
IFDEF ICS <
	AND	(3760	/GET SUBCHANNEL 0-120
	CLL RTR
	RAR		/SUBCH*2
	>

	TAD	AT2	/NOW PTR WILL INCLUDE SUBCH
	DCA	AT2	/TABLE INDEX, INCL SUBCH
	TAD I	AT2	
	DCA	ADFLD	
	ISZ	AT2
	TAD I	AT2	/ADDR
	DCA	AT2
	TAD I	(TBLWD2
ADFLD,	0		/SET TO CDF
	DCA I	AT2	/PASS VALUE BACK
	CDF	CUR
	DCA I	(RGORCM
	TAD	ADFLD
	JMP I	(ANIEXT

	PAGE
REENAB,	0		/MUST BE WORD 0 OF PAGE
TBLOUT,	0

/NON-INTERRUPT CODE FOR UDC SERVICE
DORING,	CLA CLL
	ISZ I	(RGORCM	/IN CASE OF ERRORS
	TAD I	TBLOUT	/GC+ADDR WORD	
	DCA	TBLWD1	/GC+ADDR
	ISZ	TBLOUT
	TAD I	TBLOUT	/WORD 2
	DCA	TBLWD2
	ISZ	TBLOUT
	CLA CLL
	TAD	(-RINGTP
	TAD	TBLOUT
	SNL CLA		/CHECK FOR OVERFLOW
	JMP	OKOUT
	TAD	(RINGBT
	DCA	TBLOUT
OKOUT,	ISZ	RINGCT	/ROOM FOR 1 MORE
	NOP
	CIF	CUR	/GOES WITH NOMORE CODE
	TAD	REENAB	/SEE IF ROOM NOW
	SNA CLA
	JMP	NOTRUB	/NO PROBLEM
	DCA	REENAB	/NOW THERE'LL BE ROOM
	TAD	(UDSF	/SO FIX IT ALL UP
	DCA I	(UDCSKP
	UDEI
NOTRUB,	TAD	TBLWD1	/DET. GENERIC TYPE
	SPA
	JMP I	(ADINT	/LO BIT SET =A/D
	CLL RTL
	SNL
	JMP I	(CONTAC
/JUMPING ON THRU
COUNTR,	CLA CLL
	TAD 	TBLWD1
	JMS I	(COUNCK	/TEST FOR VALIDITY
	DCA	TBLPTR	/CNTTBL PTR
	TAD I	TBLPTR	/CHECK FOR RELOAD
	DCA	T1
	ISZ	TBLPTR
	TAD I	TBLPTR
	IAC
	SNA CLA
	JMP I	MOREIO	/THIS COUNTER NOT CURRENTLY ENABLED
	TAD	TBLWD1
	AND	(377	/ADDR
	IOF
	UDLA
	TAD 	T1
	SZA
	UDLD		/RESET TO FETCHED VALUE
	UDLA		/BACK TO ADDR 0
	ION
	JMS	DISPTH
RNGEND,	DCA I	(RGORCM	/CLEAR IT
	JMP I	MOREIO
TBLWD1,	0
TBLWD2,	0

DISPTH,	0
	TAD	TBLPTR
	DCA I	(DFLG
	TAD I	TBLPTR
	AND	(177
	DCA	T1	/ACTION + TASK NO.
	TAD I	TBLPTR
	ISZ	TBLPTR	/DETERMINE ACTION
	CLL RTL
	SNL
	JMP	ZROTWO
	CLA CLL
	TAD 	T1	/1=RUN
	CAL
	RUN
	JMP I	(ENDDIS
ZROTWO,	SMA CLA		/LO 3=0 FOR E.F;BIT 2=1 FOR E.A.
	JMP I	(SEVFLG
	TAD I	TBLPTR	/GET ADDR FOR DERAIL
	DCA	EADDR
	TAD	T1
	CAL
	DERAIL
EADDR,	0
	JMP I	(ENDDIS
DDSPTH,	JMP I	DISPTH

RDCNTR,	JMS I	(ARG2
	JMS	(COUNCK
	IOF
	CLA
	TAD I	(CHANNO
	UDLA
	JMP I	(READCH
	IFZERO RINGBF+RINGBF+.-REENAB-160&4000<
	PAGE>
/LEAVE ROOM FOR CODE+LITERALS
/TRY TO PREVENT PAGE OVERFLOWS

/RING BUFFER HAS 2 WORDS/INTERRUPT
/WORD 1 = GC+ADDR;4NNN=A/D
/WORD 2 = XOR FOR CONTACTS,0 FOR COUNTERS,A/D VALUE FOR AI
RINGBT,	ZBLOCK 2^RINGBF-1
RINGTP,	0
/IF IT'S IN THE RING BUFFER, IT AT LEAST HAD A
/VALID GENERIC CODE (NOT 0 OR 1) AT INTERRUPT TIME
	PAGE
SEVFLG,	TAD	(6200	/6200 TO FORM CDF
	TAD	T1	/WITH SAVED HI 6 BITS
	DCA	EFCDF
	AC7775
	TAD I	TBLPTR	/ADDR IN TBL
	CAL
	POST
EFCDF,	0
			/SET USER'S MESSAGE EV FLAG IMMED
			/WHEN CALLED IF TASK NO OR DERAIL
			/IF EVENT FLAG, WAIT TIL VERY END
ENDDIS,	TAD I	DFLG
	AND	(400
	SNA CLA
	JMP I	(DDSPTH	/MORE THAN ONCE
	CLA CMA
	DCA I	DFLG	/ONCE ONLY. 7777 BACK IN TABLE
	ISZ	DFLG
	CLA CMA
	DCA I	DFLG
	JMP I	(DDSPTH
DFLG,	0

CONTAC,	SMA	CLA
	JMP I	RINGDN
	TAD I	(TBLWD1
	JMS I	(CNTCCK	/CHECK FOR ALL LEGAL
	TAD	T1
	DCA	CCHNO	/CHANNEL NO. STRIPPED
	TAD I	(TBLWD2
	DCA	ROTWD	/COS VALUE
	DCA	BITCNT	/WILL COUNT BITS
NOTSET,	TAD	ROTWD	/ROTATED ALREADY FOR BIT TO EXAM
	SNA
	JMP  I	RINGDN	/ALL BITS CHECKED
	SMA	CLA	/CHECK FOR SET BITS
	JMP	ROTATE
/IF BIT SET,DO ITS ACTION. CHECK ALL 12 BITS
/IF BIT = 0, MOVE ON
	TAD	BITCNT
	DCA	T2
	TAD	CCHNO
	DCA	T1
	JMS I	(CINDEX	
	TAD I	TBLPTR
	IAC
	SZA CLA
	JMS I	(DISPTH	/DO WHAT HE SAYS
ROTATE,	ISZ	BITCNT
	TAD	ROTWD
	RAL CLL
	DCA	ROTWD
	JMP	NOTSET
ROTWD,	0
BITCNT,	0
CCHNO,	0
DIOP,	JMS	GC0	/CHECK GENERIC CODE
READCH,	ISZ	ADDRUP
	UDRD
	ION
	JMS	CDFMSG
	DCA I	ADDRUP	/RETURN VALUE
	CDF	CUR
	UDLA		/RESET TO 0 FOR READ COUNTER
	JMP I	ENDOP

AOOP,			
DOOP,	JMS	GC0
	JMS	ARG2
	UDLD		/LOAD THE DIGITAL(ANALOG) OUTPUT
	ION
	JMP I	ENDOP

GC0,	0
	JMS	ARG2
	JMS	CHNLCK
	SZA	CLA
	JMP	BADGC	/MUST BE 0
	JMP I	GC0

ARG2,	0		/GET NEXT ARG
	ISZ	ADDRUP
	JMS	CDFMSG
	TAD I	ADDRUP
	CDF CUR
	JMP I	ARG2

	ISZ	ERRNMB	/ADD ONE TO ERROR NUMBER (#=6)
DVCERR,	ISZ	ERRNMB	/ADD ONE TO ERROR NUMBER (#=5)
	ISZ	ERRNMB	/ADD ONE TO ERROR NUMBER (#=4)
BADOP,	ISZ	ERRNMB	/ADD ONE TO ERROR NUMBER (#=3)
CHNNG,	ISZ	ERRNMB	/ADD ONE TO ERROR NUMBER (#=2)
BADGC,	ISZ	ERRNMB	/ADD ONE TO ERROR NUMBER (#=1)
	ION		/LEFT OFF IN CHNLCK
	CLA CLL
	TAD	RGORCM
	SZA CLA
	JMP I	RINGDN	/OCCURRED AT DORING TIME
	JMP I	ENDOP
RGORCM,	0


CHNLCK,	0
	SPA
	JMP	CHNNG
	DCA	CHANNO	/MUST BE 0-377
	TAD	CHANNO
	TAD	(-377
	SMA SZA CLA
	JMP	CHNNG
	IOF
	TAD	CHANNO
	UDLA
	CLA CMA		/CHECK FOR OPERATIONAL UDC-DH
	UDRA
	AND	(377
	CIA
	TAD	CHANNO
	SZA CLA
	JMP	DVCERR	/DEVICE (ICS OR UDC) NOT RESPONDING !!!
			/ MAY NOT EXIST OR POWERED DOWN OR "DOWN"
	UDRA
	AND	(7400
	JMP I	CHNLCK	/RETURN WITH GENERIC CODE
CHANNO,	0

DRLADR,	ZBLOCK 3
	DERINT		/POWER RECOVERY "DERAIL" ADDRESS

	PAGE
ECAOP,	JMS	DECAST
	JMP I	(GETFLG

DECAST,	0		/DISABLE+ENABLE CONTACTS
	JMS I	(ARG2
	DCA	T1	/GET BIT NO. + CHAN NO.
	TAD	T1
	AND	(7400
	DCA	T2	/BIT NO.
	TAD	T2
	CLL
	TAD	(2000	/MUST BE L.T. 14
	SZL CLA
	JMP I	(BADGC
	TAD	T2	/BIT NUM
	RTL
	RTL
	RAL
	DCA	T2	/INTO LO 4 BITS
	TAD	T1
	JMS	CNTCCK
	JMS	CINDEX
	TAD 	TBLPTR
	DCA	AT2
	JMP I	DECAST

CNTCCK,	0		/ADDR IN AC;RETURN WITH GC
	JMS	MASCHK
	RTL
	SZL 		/2 OR 3 ONLY
	JMP I	(BADGC	
	SMA CLA
	JMP I	(BADGC
	JMS	LIMCHK
	-FCT-NCNTC
	NCNTC
	JMP I	CNTCCK

LIMCHK,	0
	TAD I	LIMCHK
	ISZ	LIMCHK
	TAD	T1	/COMPARE UPPER TABLE LIMIT
	SMA
	JMP I	(CHNNG
	TAD I	LIMCHK	/AND LOWER LIMIT
	ISZ	LIMCHK
	SPA
	JMP I	(CHNNG
	DCA	T1	/CHANNEL NO. (0-N)
	JMP I	LIMCHK
MASCHK,	0		/ADDR IN AC
	AND	(377
	DCA	T1
	TAD	T1
	JMS I	(CHNLCK
	ION
	JMP I	MASCHK

CINDEX,	0		/BIT NO. IN T2, CH. NO. IN T1
	TAD	T1
	CLL RTL
	DCA	TBLPTR	/USING IT AS A TEMP
	TAD	T1
	RAL
	TAD	TBLPTR	/NOW *6
	RTL		/*30
	DCA	T1
	TAD	T2	/BIT NO.
	RAL CLL		/*2
	TAD	T1
	TAD	(CNTCTB
	DCA 	TBLPTR
	JMP I	CINDEX

DCAOP,	JMS 	DECAST
	JMP	TWOFIL

MINUS1,	0		/MOVE POINTER BACK BY 1
	CLA CMA
	DCA I	AT2
	ISZ	AT2
	JMP I	MINUS1

DCNTR,	JMS I	(CNTRST
	JMS	MINUS1	/MUST DISABLE ALL WORDS
			/WORD 2 ACTUALLY CHECKED
TWOFIL,	JMS	MINUS1
	JMS	MINUS1
	JMP I	ENDOP

RDCOS,	JMS I	(ARG2
	JMS 	CNTCCK
	TAD 	T1
	TAD	(DCOSTB
	DCA	T2
	TAD I	T2	/GET LAST VALUE
	JMP	SENDIT
GCOP,	JMS I	(ARG2
	IOF
	UDLA
	UDRA
	ION
	AND	(7400	/RETURN GC
	CLL RTL
	RTL
	RAL
SENDIT, ISZ	ADDRUP
	JMS	CDFMSG
	DCA I	ADDRUP
	CDF	CUR
	JMP I	ENDOP



	PAGE
ECNTR,	JMS	CNTRST
	IOF
	DCA	T2
	TAD I	(CHANNO
	UDLA
	TAD	T2	/INIT VALUE
	UDLD
	UDLA		/REENABLE COUNTER
	ION
	JMS I	(ARG2	/GET RELOAD INFO
	DCA I	AT2
	ISZ	AT2
GETFLG,	JMS I	(ARG2	/GET TASK NO.
	DCA I	AT2
	TAD I	AT2
	SPA CLA
	JMP	EVFLGQ
	ISZ	AT2	/RUN OR DERAIL
	JMS I	(ARG2
	DCA I	AT2	/ADDRESS
	JMP I	ENDOP

EVFLGQ,	TAD I	AT2	/CHECK FOR ONCE ONLY
	AND	(400
	DCA I	AT2
	TAD I	(MSGCDF	/NEED FIELD AT DISPATCH TIME
	AND	(77	/MUST PRESERVE LO 3 BITS AS 0
	TAD I	AT2
	DCA I	AT2	/HI 6=PART OF CDF
	ISZ	AT2
	TAD I	(SAVADR	/NEED PTR TO EVENT FLAG
	DCA I	AT2
	JMP I	MOREIO

CNTRST,	0
	JMS I	(ARG2
	JMS	COUNCK
	DCA	AT2
	JMS I	(ARG2	/INIT VALUE
	JMP I	CNTRST

COUNCK,	0		/ADDR IN AC, RETURNS W COUNTER TBL PTR
	JMS I	(MASCHK
	CLL RTL
	SNL
	JMP I	(BADGC
	CLL
	TAD	(2000
	SZL CLA		/4-6 ONLY
	JMP I	(BADGC
	JMS I	(LIMCHK
	-FCTR-NCNTR
	NCNTR
	TAD	T1
	RAL CLL
	TAD	T1	/*3
	TAD	(CNTTBL
	JMP I	COUNCK

AIOP,	JMS I	(ARG2
	JMS	ADCHK
	JMS I	(ARG2	/SUBCHANNEL WORD PASSED AS:
			/BIT 0=ENABLE;1-3=GAIN
			/**** UDC ****
			/9-11=SUBCHAN;7=READ CNTRL REG
			/**** ICS ****
			/5-11=SUBCHAN;4=READ CNTRL REG
	DCA	T2
	TAD	T2
IFDEF ICS <
	AND	(177	/GET SUBCHANNEL
	>
IFDEF UDC <
	AND	(7	/GET SUBCHANNEL
	>
	RAL CLL
	TAD	AT2	/ADD SUBCH*2 INTO TBL PTR
	DCA	AT2
	ISZ	ADDRUP
	TAD I	(MSGCDF
	DCA I	AT2	/FLD
	ISZ	AT2
	TAD	ADDRUP
	DCA I	AT2	/ADDR
	IOF
	TAD I	(CHANNO	/MAJOR CHANNEL
	UDLA
	TAD	T2	/GAIN,SUBCHANNEL WORD
IFDEF ICS <
	TAD	(10	/BIAS ADU02 CONVERTER MULTIPLEXOR
	AND	(3577
	TAD	(4200	/FORCE ENABLE+READ CNTRL REG BITS
	>
IFDEF UDC <
	AND	(3757
	TAD	(4020	/FORCE ENABLE+READ CNTRL REG BITS
	>
	UDLD		/NO TIME TO WAIT TIL DONE SO LOAD
			/SUBCHAN + CATCH IT THRU INTERRUPTS
	ION
/****** START MODULE TIME-OUT ******
	JMP I	MOREIO

ADCHK,	0
	JMS I	(MASCHK
	CLL RAL
	TAD	(1000	/CHECK GC
	SNL	CLA
	JMP I	(BADGC	/ONLY 7
/*************** A/D MAY BE NON-CONTIGUOUS ********
/*************** BUT MUST BE "ADJACENT"    ********
	JMS I	(LIMCHK
	-FAD-DELTA
	DELTA
IFDEF ICS <
	DCA	AT2	/CLEAR FOR CHANNEL CONV.
	TAD	T1	/"CHANNEL #"
	TAD	(-NMPLX-1
	SPA
	JMP	.+3
	ISZ	AT2
	JMP .-4
	CLA CLL
	>
IFDEF UDC <
	TAD	T1
	DCA	AT2
	>
/***************
/***************
	TAD	AT2	/CHANNEL DISPLACEMENT INTO ANALOG INPUT TABLE
	CMA		/SET UP LOOP COUNTER
	DCA	AT2	/SCRATCH AREA
	ISZ	AT2	/TEST COUNT
	SKP		/ NO -EXIT YET
	JMP	.+3	/ YES - EXIT NOW
	TAD	ADTBLD	/ADD TABLE DISPLACEMENT
	JMP	.-4
	TAD	(ADTBL	/ADD BASE OF TABLE
	DCA	AT2
	JMP I	ADCHK
ADTBLD,	NMPLX^40+20
	PAGE
CNTCTB,
/CONTACT TABLE
/30 WORDS/CHANNEL IN PAIRS. ORDERED FROM HI TO LO BIT
/WORD 1 = ACTION + TASK NO.; BIT 3=REPEAT FLAG
/	  FOR EV. FLAG, LO 3 =0,HI 6=PART OF CDF
/WORD 2 = ADDRESS
/7777 = DISABLED OR NEVER ENABLED

	CNTTBL=NCNTC^30+CNTCTB
/COUNTER TABLE. 3 WORDS/CHANNEL
/WORD 1 = RELOAD VALUE
/WORD 2 = ACTION + TASK
/WORD 3 = ADDRESS

	ADTBL=NCNTR^3+CNTTBL
/A/D TABLE. 16 WORDS/CHANNEL
/2 WORDS/SUBCHANNEL
/ UDC
/   8 SUBCHANNELS/UDC CHANNEL
/ ICS
/   8 SUBCHANNELS/ICS CONVERTER MODULE
/   16 SUBCHANNELS/ICS MULTIPLEXOR MODULE
/WORD 1= FIELD 
/WORD 2= ADDRESS TO PASS ANS TO

ADRCAL=NMPLX^40+20
ADRCAL=ADRCAL^NAD
	DCOSTB=ADRCAL+ADTBL
/CHANGE OF STATE TABLE
/1 WORD/CONTACT CHANNEL
/INITIALIZED AT MORINT

	ENDUDC=DCOSTB+NCNTC
	IFZERO ENDUDC-.&4000<
	ZBLOCK ENDUDC-.>
>
	$