			; ****	LAM HANDLER
			.TITLE	LAMHD
;CHANNEL/EVENT DESCRIPTOR
;LIKE IN IOCS00
.CRT=	0
.FTN=	.CRT+2
.NA=	.FTN+2
.CSW=	.NA+2
.LNK=	.CSW+2
.SEM=	.LNK+2
.LRTN=	.SEM+2
.LVL=	.LRTN+2

	.GLOBL	$ACTIV,$LSQE,$ERRA
	.MCALL	.EXIT

	.IIF	NDF,$CCTYP,$CCTYP==106
	.IIF	NDF,$CCVEC,$CCVEC==274
	.IIF	NDF,$NCRAT,$NCRAT==1

	.ASECT
.=$CCVEC
	.IF	EQ,$CCTYP-106
	.REPT	8.*$NCRAT
	.WORD	$LAMHD		; SET VECTORS FOR 106 CRATE CONTROLLER
	.WORD	340
	.ENDR
	.IFF
	.IF	EQ,$CCTYP-109.
	.REPT	24.*$NCRAT	; SET VECTORS FOR 109 CRATE CONTROLLER
	.WORD	$LAMHD
	.WORD	340
	.ENDR
	.IFF
	.ERROR	; ILLEGAL CRATE CONTROLLER TYPE
	.ENDC
	.ENDC

	.PSECT	CASSHD,CON

$LAMHD::CMP	#500,SP
	BHIS	STAC$E
	MOV	R0,-(SP);	SAVE REGISTERS
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	R4,-(SP)
	MOV	#$LSQE,R3;		DUMMY LIST ELEMENT
	BR	2$

1$:	MOV	(SP)+,@R0;	RESTORE CSR

2$:	MOV	.LNK(R3),R3;	GET NEXT ELEMENT
	BEQ	LAM$ER;		UNDECLARED LAM
	MOV	@R3,R0;		GET CSR ADDR
	MOV	@R0,-(SP);	SAVE IT
	BIC	#37,@R0
	BIS	#8.,@R0;	SET F8
	TST	@.NA(R3);	TEST LAM
	BPL	1$
	BIS	#10.,@R0;	SET F10
	TST	@.NA(R3);	AND CLEAR LAM SOURCE
	BIS	#100,@SP;	ENABLE INTERRUPT FOR RETURN
	MOV	R0,-(SP);	SAVE POINTER TO CSR
	BIS	#100,@R0;	ENABLE INTERRUPT NOW

4$:	MOV	.LRTN(R3),R1;	DO NOW AS SET
	MOV	.LVL(R3),R2
	INC	.SEM(R3)
	CMP	-(R3),-(R3)
	JSR	R5,$ACTIV
	MOV	(SP)+,R0;	GET POINTER TO CSR
	MOV	(SP)+,@R0;	AND RESTORE IT
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	RTI

LAM$ER:	MOV	(PC)+,R0	; ERROR 13,1 - LAM ERR
	  .BYTE	13.,1
ER$E:	CLR	R5		; FORCE .EXIT
	JMP	$ERRA

STAC$E:	MOV	(PC)+,R0	; ERROR 15,0 - STACK OVERFLOW
	  .BYTE	15.,0
	BR	ER$E

	.END
                                                                                                                                                                                                                                                                                                                                                                   