@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                ÅÙÔÁ×@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                åÖÓñÁôñðùó@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@æ                                                ÈÄÙñ@ÄÁãÁ@@@@@@@@@@@@@@@ðøð@ðñððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ðñððñ@                                                ÄÄÙñ@ÄÁãÁðù@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁñð@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁññ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁñò@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁñó@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁñô@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁñõ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁñö@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁñ÷@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁñø@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁñù@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁòð@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁòñ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁòò@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁòó@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁòô@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁòõ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                ÄÄÙñ@ÄÁãÁòö@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@                                                åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå                                                                                                                                åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå                                                                                                                                åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå                                                                                                                                åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå                                                                                        RSTS70                  DECRT11A        åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå     
  Î,kQ   C%                      »¸8 Rˆ,kQ   C%                      »¸8 á	T~kQ/   C%                      »åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå¸8 õZhMkQ   C%                      »¸8 áyhkQ"   C%                      »¸8 R~E	kQ   C%                      »¸8 „:‚Låååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå	IF DF THE EXTENDED INSTRUCTION SET IS AVAILABLE(KE-11E)
;BAMLT$ IF DF, THE ROUTINES TO GET(BAGTM) AND RELEASE(BARLM)
;	MULTIPååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååLE CONTIGUOUS BUFFERS WILL BE INCLUDED.

.SBTTL	MACROS & GLOBALS
	.MCALL .SETTOP,.REGDE,$SOB,$DIV,$SPL
	.REGDE

;GLOBALS DååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååEFINED LOCALLY
.GLOBL BAINT,BAGET,BAREL,BAWDS,BALL,BAAHL,BASIZ,BACNT,BBASIZ,BAEROR
.IIF DF BAMLT$	.GLOBL BAGTM,BARLM

;GLOBAkQ2   C%                      »¸8 • }kQ   C%                      »¸8 &õvkQx   C%                      »¸8 ÉdÀDkQ5   C%åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå                      »¸8 ]zÀ!kQ=   C%                      »¸8 {3XkQ   C%                      »¸8 zòGkQ   C%        .TITLE BUFALL  BUFFER ALLOCATION
;LAB APPLICATIONS-11
;DEC-11-SLABA-C-LA
;FILENAME BUFALL.MAC
;FILE ID BUFALL.6
.CSECT	BUFA              »¸8                                                                                                           LL

;COPYRIGHT (C) 1975
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE                                                                                                                                 ONLY ON A
;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR                                                                                                                                 ANY OTHER COPIES
;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM                                                                                                                                 AND TO ONE WHO AGREES
;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE
;SHALL AT ALL TIMES REMAIN IN DEC.

;ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååTHE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
;COMMITMENT BY DIGITAL ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååEQUIPMENT CORPORATION.

;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååSUPPLIED BY DEC.

;LDP SOFTWARE DEVELOPMENT,	FEB. 1975
;	CARL RALSTON

;THE BUFFER ALLOCATION MODULE IS USED TO DYNAMICALLYåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå CONTROL
;THE USE OF THE FREE CORE AREA AS DISCRETE UNITS(BUFFERS).
.SBTTL	CONDITIONAL ASSEMBLY PARAMETERS EXPLANATIONS
;EISP OF FREE CORE.
;6. PLACE THE BUFFER ADDRESSES IN THE BUFFER USE TBL AS FREE.
;7. ABS. LOC. 50 WILL CONTAIN THIS JOB'S HIGH COUF THAN TBL LENGTH
	MOV	R0,BACT		;# OF BUFFERS
	BLE	BAERR		;NO BUFFERS?
	ASL	R2		;# OF BYTES NEEDED
	MOV	#BAAHL,R5	;R5-> BAARE LIMIT.
;8. IF BUFFERSIZE IS .LT. 256 THEN BACNT IS THE # OF BUFFERS IT
;    TAKES TO MAKE 256. OTHERWISE = 0.
;CALL VIA	JSHL
	SUB	R2,@R5		;NEW ACTIVE HIGH LIMIT
	MOV	@R5,R1		;R1 -> TBL
	MOV	R1,ADRTBL	;ADR OF THE BUFFER USE TBL
	ROR	R3		;C=0, SO BR	PC,BAINT

BAINT:	JSR	PC,SAVARG	;SAV REGS
	CLR	BAEROR		;ZERO RUNTIME ERROR COUNTER
	MOV	R0,R4		;SAV BUF SIZE TEMP
	MOV	R0,IT 15 =0, WD ADDR
10$:	MOV	R3,(R1)+	;SETUP BUFFER USE TBL ENTRIES
	ADD	R4,R3		;UP BY BASIZ
	$SOB	R0,10$		;LOOP FOR ALL BUFFER(PC)+	;TUCK IT AWAY
BASIZ:	256.			;BUFFER SIZE IN WORDS
	ASL	R0		;TIMES 2
	MOV	R0,(PC)+	;BUFFER SIZE IN BYTES
BBASIZ:	512.
S
	CLR	@R1		;0 ENDS THE TBL & C=0
12$:	JSR	PC,RSTARG
	RTS	PC
BAERR:	SEC			;INDICATE ERROR
	BR	12$		;AND RTN
	.DSABL	LSB
B	.SETTOP	#-2		;HOW MUCH FREE CORE?
	MOV	R0,BAAHL	;INIT ACTIVE HIGH TO ABS HIGH.
	MOV	R0,R1		;ALSO AT ABS LOC 50
	MOV	BALL,R3	ALIM:	.LIMIT		;1ST WD IS LOW ADDR.
BALL	=BALIM+2	;2ND WD IS HIGH ADDR OF CODE
.SBTTL BAGET - GET A BUFFER
;BAGET STORES THE 	;TOP OF CODE
	SUB	R3,R1		;DIFF IS FREE CORE
	ROR	R1		;FREE CORE IN WDS, C WAS 0
	CLR	BACNT		;=0 IF BASIZ IS 256 OR GREATER
ADDRESS OF A FREE BUFFER IN THE LOCATION
;POINTED TO BY R0. IF NO BUFFERS ARE FREE
;THE C BIT IS SET ON RETURN.
;CALL VIA	JSRLS DEFINED EXTERNALLY
	.GLOBL	SAVARG,RSTARG

.SBTTL	LOCAL DEFINITIONS
PS=177776		;ADDR OF PROGRAM STATUS WORD
B15=100000		;	CMP	R4,#512.	;IF .GT. 512 DOES NOT NEED
	.ENABL	LSB
	BGT	4$		;TO BE A POWER OF 2.
	MOV	R4,R5
	MOV	R5,-(SP)	;TEST IF BUF SIZBUFFER USE BIT FOR CLEARING & SETTING
;THE BUFFER USE TABLE POINTED TO BY 'ADRTBL' IS A TABLE
;OF THE BUFFER ADDRESSES DIVIDEDE IS
	NEG	@SP		;A POWER OF 2, FORM MASK
	BIC	(SP)+,R5	;Z=1 IF POWER OF 2
	BNE	BAERR		;HAD MORE THAN 1 BIT ON
	CMP	R4,#256.	; BY 2 SO THE SIGN BIT CAN BE
;USED AS AN INDICATION IF THE BUFFER IS IN USE OR NOT.
;THE BUFFER IS FREE IF BIT 15 =0, AND IN UDO WE NEED TO SETUP BACNT
	BGE	4$		;BR IF NO, ALREADY 0
2$:	ADD	R4,R5		;BUFSIZE TO R5
	INC	(PC)+
BACNT:	0			;# OF BUFFERS = SE IF BIT 15 =1.
;THE TABLE IS TERMANIATED WITH A 0 ENTRY.

.SBTTL BAINT - SUBR.
;R0 CONTAINS THE SIZE IN WORDS OF AN INDIVI256
	CMP	#256.,R5	;LOOP UNTIL R5=256
	BGT	2$
;NOW GET SOME SPACE FOR THE BUFFER ADDR USE TBL.
4$:	CLR	R0		;FREECORE/BASIZ
	DUAL BUFFER ON ENTRY.
;BUFFER ALLOCATION INITIALIZE ROUTINE DOES THE FOLLOWING:
;1. DETERMINES HOW MUCH FREE CORE AVAILABLE
;$DIV	R4,R0		;R0=QUOT, R1=REM
	INC	R0		;ROUND UP, FOR TBL LENGTH
6$:	CMP	R1,R0		;WDSFRE MUST BE .GE. # NEEDED FOR TBL
	BHIS	8$2. IF BUFFER SIZE IS .LE. 512 SEE IF A POWER OF 2, IF NOT GIVE ERROR.
;3. SET VALUE IN BAAHL. BALL IS SET BY .LIMIT
;4. NUMBER		;BR IF ENOUGH ROOM FOR TBL
	DEC	R0		;1 LESS BUFFER
	ADD	R4,R1		;INCREASE WDSFRE BY BASIZ
	BR	6$		;TRY AGAIN
8$:	SUB	R0,R1	 OF BUFFERS WE HAVE AND ANY WORDS LEFT OVER WILL
;   GO TO THE WORDS ROUTINE.
;5. GET SPACE FOR THE BUFFER USE TBL FROM THE TO	;WDSFRE-TBL LENGTH=WDSFRE
	MOV	R1,WDSFRE	;# OF WDS REMAINING FOR BAWDS
	MOV	R0,R2		;MAKE A COPY OF LENGTH
	DEC	R0		;1 LESS BSO C=0
	RTS	PC
4$:	MOV	(SP)+,@#PS
	BR	2$		;TRY AGAIN

.SBTTL BAREL - RELEASE A BUFFER
;BAREL RELEASES(FREES) A BUFFER WHOSSPACE
	BR	2$		;TEST AGAIN
10$:	SUB	@SP,WDSFRE	;REMOVE SOME FREE WDS
	ASL	@SP		;BY 2 FOR ADDR
	SUB	@SP,BAAHL	;ACT HIGH-# NEEDE ADDR IS
;PASSED IN R0.  THIS ADDR IS USED TO CLEAR THE
;APPROPERIATE BIT IN THE BITMAP.  IF THE BUF WAS ALREADY FREE,
;NO EED=NEW ACT HIGH
	MOV	(PC)+,@SP	;RESULT ADDR & C=0
BAAHL:	0			;ACTIVE HIGH LIMIT
12$:	MOV	(SP)+,R0	;RST REG
	RTS	PC
	.DSABL	RROR IS RETURNED.  THE ADDR MUST BE IN THE BUFFER AREA
;(OBTAINED FROM BAGET) SINCE NO ERROR CHECKING IS DONE.
;CALL VIA	JSR	PLSB

.SBTTL BAGTM - GET MULTIPLE CONTIGUOUS BUFFERS
;BAGTM STORES THE ADDR OF THE FIRST FREE BUFFER IN A LOC
;POINTED TO BY C,BAREL

BAREL:	SEC		;WE ARE LOOKING FOR A BUF IN USE
	ROR	R0	;SO SIGN BIT WILL BE SET.
	MOV	R1,-(SP)	;SAV REG
	MOV	ADRTBL,R0. THE NUMBER OF CONTIGUOUS BUFFERS REQUIRED IS
;PASSED IN R1. IF NO FREE CONTIGUOUS SPACE IS FOUND
;THE C BIT WILL BE SET.
R1	;R1 -> TABLE
2$:	TST	@R1		;ARE WE AT END OF TBL?
	BEQ	4$		;BR IF YES
	CMP	(R1)+,R0	;IF = THEN FREE THIS BUF
	BNE	2$		;KEE;CALL VIA	JSR	PC,BAGTM

	.IF DF BAMLT$
BAGTM:	MOV	R0,-(SP)	;SAV PTR
	MOV	R1,-(SP)	;SAV # OF BUF NEEDED
1$:	MOV	ADRTBL,R0	;RP LOOKING
	BIC	#B15,-(R1)	;MAKE IT FREE
4$:	MOV	(SP)+,R1	;RST REG
	RTS	PC

.SBTTL BAWDS - GET SPACE FOR # OF WORDS
;BAWDS 0 -> TABLE
2$:	MOV	@SP,R1		;# REQUIRED FOR CTR
4$:	TST	(R0)+		;TEST TBL ENTRY FOR,
	BLT	4$		;NEG THEN IN USE
	BGT	10$		;0 THSUPPLIES THE STARTING ADDR OF SPACE FOR A
;GIVEN NUMBER OF WORDS.  THE SIZE OF THE AREA
;NEEDED IS IN R0 AND ON RETURN R0 CONTEN END OF TBL
	BR	8$		;NONE FREE, ERROR
6$:	TST	(R0)+		;ARE NEXT N-1 FREE
	BGT	10$		;BR IF FREE
	BNE	2$		;BR IF IN USE
8$:	AINS THE ST ADDR
;OF THAT AREA. THIS AREA STARTS AT HIGH CORE AND
;WORKS DOWN. THIS ROUTINE IS NOT REENTERANT.
;CARRY SET IF MOV	(SP)+,R1	;POP BEFORE ERROR RTN
	BR	ERRRTN		;ERROR RTN
10$:	$SOB	R1,6$		;IF WE FALL THRU LOOP, THEN WE
	MOV	@SP,R1		;HAVE NO SPACE AVAILABLE.
;CALL VIA	JSR	PC,BAWDS

	.ENABL	LSB
BAWDS:	MOV	R0,-(SP)	;SAV # REQUESTED
2$:	CMP	(PC)+,@SP	;ENOUGH SPACFOUND ENOUGH FREE BUFFERS.
	MOV	@#PS,-(SP)	;SAVE STATUS
	$SPL	7		;NO INTERRUPTS WHILE WE SET BITS
12$:	TST	-(R0)		;IS BUFR ST	PC,BAGET

BAGET:	MOV	R0,-(SP)	;SAV PTR
	MOV	(PC)+,R0	;R0 -> BUF ADDR TBL
ADRTBL:	0			;ADDR OF BUFFER USE TBL
2$:	TST	(R0)+E CURRENTLY?
WDSFRE:	0			;# OF WDS FREE TO BE USED
	BHI	10$		;BR IF YES
	MOV	(PC)+,R0	;# OF BUFFERS
BACT:	0
	BLE	ERRRTN		;N		;CHECK TBL ENTRY
	BLT	2$		;IF<0 THEN IN USE
	BEQ	ERRRTN		;IF>0 THEN FREE, 0 ENDS TBL
	MOV	@#PS,-(SP)	;FOUND IT!, SAVE CURREO BUFFERS TO GET SPACE FROM
	DEC	BACT		;ONE LESS BUFFER
	ASL	R0		;BY 2 FOR ADDR
	ADD	ADRTBL,R0	;R0 -> END OF TBL
	TST	-(R0)	NT STATUS
	$SPL	7		;DISABLE INTR WHILE SET BUFR IN USE
	TST	-(R0)		;IS BUFR STILL FREE?
	BLT	4$		;NO, RESTORE PS & TRY AGAIN	;IS LAST BUFFER FREE?
	BGT	6$		;YES IF >0
ERRRTN:	INC	(PC)+		;BUMP ERROR CTR ON EACH ERROR
BAEROR:	0			;# OF BUFR REQUESTS U
	MOV	@R0,@2(SP)	;GET TBL ENTRY
	BIS	#B15,@R0	;SET IN USE BIT
	MOV	(SP)+,@#PS	;RESTORE IT
	ASL	@(SP)+		;BIT 15=0 BEFORE ASL, NABLE TO FILL
	SEC			;C=1 IF NO ROOM
	BR	12$		;ERROR RTN
6$:	CLR	@R0		;NEW END OF TBL
	ADD	BASIZ,WDSFRE	;BUF TO THE FREE WD D
	MOV	(SP)+,@#PS	;RESTORE STATUS
	MOV	@R0,R0		;ADDR FROM TBL
	ASL	R0		;BY 2 FOR ADDR
	CLC			;NO ERROR
	MOV	(SP)+,R1	;RST #MPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER COPIES
;TH REQUIRED
	MOV	R0,@(SP)+	;ADDR OF 1ST BUFFER
	RTS	PC
16$:	MOV	(SP)+,@#PS
	BR	1$

.SBTTL BARLM - RELEASE MULTIPLE CONTIGUOUEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREESS BUFFERS
;BARLM RELEASES(FREES) MULTIPLE CONTIGUOUS BUFFERS WHOSE STARTING
;ADDR IS PASSED IN R0.  R1 CONTAINS THE NUMBER OF 
;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE
;SHALL AT ALL TIMES REMAIN IN DEC.

;THE INFORMATION IN THIBUFFERS TO FREE.
;THIS ROUTINE DOES NO ERROR CHECKING
;SO THE ADDRESSES MUST BE LEGAL(COME FROM BAGTM).
;R0 & R1 ARE CHANGED,S DOCUMENT IS SUBJECT TO CHANGE
;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
;COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ALL OTHERS REG ARE SAVED.
;CALL VIA	JSR	PC,BARLM

BARLM:	SEC
	ROR	R0		;NOW SIGN BIT IS ON
	MOV	R2,-(SP)	;SAV REG
	MOV	ADR

;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.

;LTBL,R2	;R2 -> TABLE
2$:	TST	@R2		;0 ENDS THE TBL
	BEQ	6$		;BR IF AT END
	CMP	(R2)+,R0	;IF = THEN AT RIGHT PLACE
	BNE	2$
	TSDP SOFTWARE DEVELOPMENT,	MARCH 1975
;	CARL RALSTON

;THE MERGE MODULE TAKES BUFFERS SMALLER THAN 256 WORDS AND
;COMBINES THET	-(R2)		;BACKUP 1 WD
4$:	BIC	#B15,(R2)+	;MAKE N BUFFERS FREE
	$SOB	R1,4$
6$:	MOV	(SP)+,R2	;RST REG
	RTS	PC		;RTN
	.ENDC
.M INTO A 256 WORD BUFFER.
	.MCALL	.REGDEF,$SOB
	.REGDEF

;GLOBALS DEFINED LOCALLY
	.GLOBL	MERGE

;GLOBALS DEFINED EXTERNEND
                                                                                                                          ALLY
	.GLOBL	BAGTM,BACNT,CTOBUF
	.IIF NDF CTREL$ .GLOBL BAREL

;THE SOLE FUNCTION OF THIS ROUTINE IS TO TAKE  BUFFERS
;SMAL                                                                                                                                LER THAN 256 WORDS BUT A POWER OF 2 IN SIZE AND COMBINE THEM
;INTO A 256 WORD BUFFER.  THIS OUTPUT BUFFER IS NORMALLY PASSED TO                                                                                                                                
;THE THROUGHPUT ROUTINE BECAUSE THE THROUGHPUT ROUTINE REQUIRES
;INPUT BUFFERS THAT ARE A WHOLE NUMBER MULTIPLE OF 256 WORDS.                                                                                                                                

;THE MERGE MODULE IS JUST ANOTHER PROCESS IN THE CONTROL MODULE
;SCHEME. AS SUCH, R0 AND R1 POINT TO WORD PAIRS OF INFO:
;.TITLE MERGE
;LAB APPLICATIONS-11
;DEC-11-SLABA-C-LA
;FILENAME MERGE.MAC
;FILE ID MERGE.5
.CSECT	MERGER

;COPYRIGHT (C) 1	R0 => OUTPUT BUFFER ADDR. OR 0 FOR NON-YET
;	      INDEX INTO BUFFER OR LAST BUFFER INDICATOR (LBI)
;	R1 => ADDR OF INPUT BUFILL FREE?
	BLT	16$		;NO, RST PS & TRY AGAIN
	BIS	#B15,@R0	;BACKUP N SETTING THEM IN USE
	$SOB	R1,12$		;LOOP UNTIL ALL SET USE975
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
;SINGLE CONOT LAST BUF, LBI IS -
	CMP	#256.,R0	;IS THE OUTPUT BUFFER FULL?
	BGT	16$		;BR IF NOT FULL
12$:	JSR	PC,CTOBUF	;PASS OUTPUT BUDED BY CONTROL MODULE
	.IF	DF,FG$
.GLOBL	CTRUN
	.ENDC
.GLOBL SAVRG,RSTRG,SAVARG,RSTARG;PROVIDED BY GENERAL SUBROUTINES MODULF TO CTRL MODULE
	BCS	18$		;ERROR, CTRL MOD ALREADY KNOWS!
16$:	NEG	@R4		;MAKE INDEX POSITIVE IF NOT A FULL BUF,
18$:	.IF NDFE
	
	;INTERNAL GLOBALS
	
.GLOBL ATINIT,ATSAMP,ATIDIG,ATEROR
	


	;CONDITIONAL ASSEMBLY PARAMETERS
;LPS11$ OR AR11$	ONE FER
;	      LBI (NON-NEGATIVE IS THE LAST BUFFER)

;THE OUTPUT INDEX IS ASSUMED TO BE 0 ON THE 1ST CALL AND IS
;ZEROED BY CT CTREL$
	MOV	(SP)+,R0
	JSR	PC,BAREL
	.ENDC
	CLC			;OTHERS DO NOT MATTER.
	RTS	PC
	.END
                                  OBUF EACH TIME CTOBUF IS CALLED
;TO PASS THE OUTPUT BUFFER. THE OUTPUT ADDR. IS ALSO
;ZEROED BY CTOBUF.

;	***	NOTE	***
;TH.TITLE AWITHT ACQUISITION WITH THRESHOLDING MODULE
;LAB-APPLICATIONS-11
;DEC-11-SLABA-C-LA
;FILENAME AWITHT.MAC
;FILE ID AWIIS ROUTINE DOES NOT SAVE ANY REGISTERS BECAUSE
;IT IS NOT NECESSARY WHEN USED UNDER THE CONTROL MODULE.
;IT USES REGISTERS R0,THT.6

.CSECT AWITHT

;COPYRIGHT (C) 1975
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;THIS SOFTWARE IS FURNISHED UNDR1,R2,R3,R4.

MERGE:	MOV	R0,R4		;OUTPUT BUFFER INFO PTR
	MOV	R1,R3		;INPUT BUFFER INFO PTR
	.IIF NDF CTREL$ MOV R1,-(SP)	;SAER A LICENSE FOR USE ONLY ON A
;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
;OF THE ABOVE COPYRIGHT NOTICVE BUFFER ADDR
	TST	@R4		;IF OUTPUT BUFFER ADDR IS 0,
	BNE	2$		;THEN WE MUST GET ONE.
	MOV	BACNT,R1	;# OF BUFFERS THAT = 256.E. THIS SOFTWARE, OR ANY OTHER COPIES
;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON EXCEPT FO
	JSR	PC,BAGTM	;STORE BUF ADDR @R0
	BCC	2$		;NO OUTPUT BUFFERS AVAILABLE
	.IF NDF CTREL$
	MOV	(SP)+,R0	;RELEASE INPUT BUFR
R USE ON SUCH SYSTEM AND TO ONE WHO AGREES
;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE
;SHALL AT ALL TIMES	JSR	PC,BAREL
	SEC			;INDICATE ERROR
	.ENDC
	RTS	PC
2$:	MOV	(R4)+,R0	;OUTPUT BUF ADDR
	ADD	@R4,R0		;ADD WORD OFFSET
	ADD	@ REMAIN IN DEC.

;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
;COR4,R0		;MAKE AN ADDR.
	MOV	(R3)+,R1	;INPUT BUF ADDR
	MOV	@R3,R2		;INPUT LBI
	BEQ	12$		;IF=0, LAST BUF WITH NO WORDS.
	BPL	4$MMITMENT BY DIGITAL EQUIPMENT CORPORATION.

;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
;ITS SOFTWARE ON EQU
	NEG	R2		;MAKE + WORD COUNT
4$:	INC	R2		;FOLD WORD COUNT TO SPEED XFER
	ASR	R2
	BCC	8$
6$:	MOV	(R1)+,(R0)+	;INPUT BUF TO OIPMENT WHICH IS NOT SUPPLIED BY DEC.

;LDP SOFTWARE DEVELOPMENT, JUNE 1975

	.SBTTL MACRO DEFS,GLOBALS, AND CONDITIONAL ASSUTPUT BUF
8$:	MOV	(R1)+,(R0)+
	$SOB	R2,6$		;LOOP UNTIL ALL TRANSFERRED
	SUB	-2(R4),R0	;DETERMINE OUTPUT INDEX
	ASR	R0		;WORDEMBLY PARAMETERS


.MCALL ..V2..,.REGDEF,.INTENT,.PROTECT,.SYNCH,.RSUM,.DEVICE
.MCALL $ADDEF,$SOB,$DIV,$SPL,.GTJB
$ADDEF
. OFFSET
	MOV	R0,@R4		;STORE INDEX FOR FUTURE
	TST	@R3		;PASS LAST BUF TO CM?
	BPL	12$		;BR IF LAST BUF, LBI IS +
	NEG	@R4		;.V2..
.REGDEF		



	;EXTERNAL GLOBALS
.GLOBL BAGET,BAREL,BASIZ	;PROVIDED BY BUFFER ALLOCATOR
.GLOBL CTIBUF,CTIDON		;PROVIE 
	;	  VALUE AT WHICH TO SET THE THRESHOLD
	;	C)OBTAINING THE NUMBER OF SAMPLES TO AVERAGE IN ORDER 
	;	  TO CALCULATE A BASR A/D F/B
	MOV	(R5)+,R0	;GET CLOCK FREQ.
	ASL	R0
	ADD	#400,R0		;SET CLOCK STATUS WORD(MODE 2)
	MOV	R0,@#CLKSAD	;STORE CLOCK ELINE VALUE.
	;	D)SET UP A/D CHANNELS FOR SAMPLING
	;	E)ACQUIRE INITIAL DATA STORAGE BUFFER ADDRESSES
	;	F)GET READY TO ACCEPSTATUS WORD
	
	MOV	(R5)+,R0	;GET CLOCK TICK
	NEG	R0		;GET TWO'S COMPLEMENT OF CLOCK TICKS
	MOV	R0,@#CLKBUF	;SET CLOCK BUFFERT START AND STOP COMMANDS
	;	G)RETURN TO CALLING ROUTINE
	;
	;  ERRORS FROM THIS SECTION ARE SIGNALED BY THE CARRY BIT
	;BEI PRESET REG.
	
	MOV	(R5)+,ATTHRH	;SET THRESHOLD OFFSET VALUE
	MOV	(R5)+,ATIDNO	;GET DATA PATH ID NO FOR CONTROL MODULE
	
	MNG SET ON RETURN.  R0 WILL CONTAIN THE ERROR TYPE
	;AS FOLLOWS:	
	;	R0 = 0 IMPLIES, NO ROOM AVAILABLE FOR TWO INITIAL STORAGEOVB	(R5)+,R0	;SET NUMBER OF ADDITIONAL CHANNELS,
	INC	R0		;GET TOTAL NO. OF CHANNELS INVOLVED
	MOV 	R0,ATNOFC	;STORE NUMBER OF
	;			BUFFERS
	;	R0 = 1 IMPLIES, LOCATION ADVEC PROTECTED ALREADY
	;	R0 = 2 IMPLIES, LOCATION CLKVEC PROTECTED ALREADY
	;			( CHANNELS
	MOV	#ATCHAN,R2	;GET A/D SW TABLE
	
	MOVB	(R5)+,R1	;GET FIRST ENTRY FOR A/D SW TABLE
	BMI	4$		;IF NEGATIVE, GO PROMUST BE DEFINED TO INDICATE HARDWARE IN USE
;EIS	IF DEFINED, HARDWARE MULTIPLY AND DIVIDE OPTION IS CONFIGURED IN 
;	SYSTEM ANTHE ABOVE CAN OCCUR ONLY FOR ST1 START)
	;	R0 = 3 IMPLIES, LOCATION DIOVEC PROTECTED ALREADY
	;			(THE ABOVE CAN OCCUR ONLY FOD WILL BE USED. IF NOT DEFINED, "DIVR0" FROM GENERAL
;	SUBROUTINE MODULE IS REQUIRED.
;FG$	IF DEFINED, MODULE WILL BE RUN IN TR DIG START)


ATINIT:	JSR	PC,SAVRG	;SAVE REGISTERS R0-R5
	TST	@#ADBUF		;CLEAR DONE FLAG

	.IF	DF,FG$
	MOV	#GTJBA,R0	;GETHE FOREGROUND.
;LPSDR$ OR DR11K$	IF EITHER IS DEFINED, DIGITAL START/STOP OPTIONS
;			MAY BE USED. NOTE: ONLY ONE MAY BE DEFIN GTJB AREA
	.GTJB
	MOV	GTJBA,SYNCTL+2	;SET WORD IN SYNC TABLE FOR JOB F OR B
	.ENDC

	MOV	#DLIST,R0
	.DEVICE			;SET UP DEVED.

	.IF DF,LPSDR$ & DR11K$
	ERROR=2DIOS	;ONLY ONE DI/0 UNIT MAY BE SELECTED
	.ENDC
	
	PS=177776
	
	.SBTTL ACQUISITIONICE DISABLE LIST
	TST	PRTFLG		;ARE VECTOR LOCS. ALREADY PROTECTED
	BNE	ATINTS		;IF SO, DON'T PROTECT AGAIN
	MOV	#PROTAR,R0	;G WITH THRESHOLDING INITIALIZATION
	;  THIS SECTION READS THE PARAMETER TABLE DESCRIBED IN
	;THE USERS GUIDE AND USING THE INFOET AREA FOR .PROTECT
	.PROTECT ,#ADVEC		;PROTECT A/D VECTOR ADDRESS
	BCS	ERROR1		;GO INDICATE ERROR
	MOV	#PROTAR,R0	;GET AREARMATION CONTAINED IN
	;THE TABLE, INITIALIZES THE ACQUISITIONS PROCESS.
	;  THE ADDRESS OF THE PARAMETER TABLE SHOULD BE CONTA FOR .PROTECT
	.PROTECT  ,#CLKVEC
	BCS	ERROR2		;IF ALREADY PROTECTED, GO IND. ERR
	MOV	#340,@#CLKVEC+2	;SET PRIORITY FOR FG IINED
	;IN R5 WHEN THIS ENTRY IS CALLED VIA "JSR  PC,ATINIT".
	;  THE INITIALIZATION PROCESS CONSISTS OF THE FOLLOWING:
	;	A)SNT.
	INC	PRTFLG		;VECTOR LOCATIONS HAVE BEEN PROTECTED
	BR	ATINTS
ERROR1:	MOV	#1,R0		;INDICATE ADVEC ALREADY PROTECTED
	JMP	ETTING THE LPS CLOCK TO INITIATE A/D CONVERSIONS
	;	  AT A PRESCRIBED RATE
	;	B)OBTAINING THE OFFSET FROM A CALCULATED BASELINATINEX		;GO EXIT
ERROR2:	MOV	#2,R0		;INDICATE ERROR TYPE
	JMP	ATINEX		;RETURN
ATINTS:	MOV	#340,@#ADVEC+2	;STORE PRIORITY 7 FOCHECK FOR MOR CHANNELS
55$:	BIT	#1,R5		;CHECK FOR WORD BOUNDARY IN PARA TABLE
	BEQ	6$		;IF ON A WORD BOUNDARY , B+C
	INC	R5		D STOPPED?
	BEQ	AT3		;IF,ZERO, UNDER PROGRAMMED CONTROL

	.IF	DF,LPSDR$ ! DR11K$
	BMI	AT1		;IF NEG., ST1 START SO, B+C
	MOV;IF NOT, GET ON ONE
6$:	CLR	(R2)		;PUT ZERO AT END OF TABLE
	MOV	#BUF1,R0	;GO GET FIRST OUTPUT BUFFER
	JSR	PC,BAGET	;  FROM B	#PROTAR,R0	;SET UP .PROTECT SCRATCH SPACE
	.PROTECT  ,#DIVEC
	BCS	ERROR3		;IF ALREADY PROTECTED,GO IND.ERR
	MOV	#340,@#DIVECUFFER ALLOCATOR
	BCS	15$		;IF NO ROOM, GO IND. ERROR AND EXIT
13$:	MOV	#BUF2,R0	;GET SECOND BUFFER 
	JSR	PC,BAGET	;  FROM BUF+2	;IF NOT, SET PRIORITY FOR FG INT.
	CLR	@#DIOSAD	;DISABLE DI/O INT.
	MOV	(R5)+,SDIMSK	;GET START MASK
	MOV	(R5)+,HDIMSK	;GEFER ALLOCATOR
	BCC	14$		;CHECK FOR ERROR
15$:	CLR	R0		;INDICATE NO ROOM FOR BUF2
	SEC			;IND. ERROR
	BR	ATINEX		;DETECTED ANT STOP MASK
	MOV	#DISTRT,@#DIVEC	;SET UP INTERRUPT VECTOR
	MOV	#100,@#DIOSAD	;ENABLE DIGITAL INPUT INTERUPT
	BR	AT3
	.ENDC
 ERROR, SO RETURN
14$:	MOV	#ATBASL,@#ADVEC	;SET UP A/D VECTOR FOR BASELINE AVERAGE
	MOV	BUF1,BUFPNT	;SET UP BUFFER POINTER
	M	
AT1:	MOV	#ST1INT,@#CLKVEC;SET INTRPT LOC.
	ADD	#40000,@#CLKSAD	;ENABLE ST1 AND ST1 INT.
AT3:	CLRB	ATEROR		;CLEAR ERROR BYTEOV	BASIZ,BUFCNT	;SET UP BUFFER COUNTER
	MOV	(R5)+,ATN2AV	;SAVE NUMBER OF SAMPLES TO AVERAGE
	MOV	ATN2AV,BASCNT	;  TO GET BASEL
	CLR	R0		;INDICATE NO ERRORS
	CLC			;
ATINEX:	JSR	PC,RSTRG	;RESTORE REGISTERS
	RTS	PC
ERROR3:	MOV	#3,R0		;INDICATE ERROR TINE VALUE FOR RUN.
	BNE	16$		;IF BASELINE CALCUL NEEDED, B+C
	CLR	@BUFPNT		;OTHERWISE, IND ZERO BASELINE
	ADD	#2,BUFPNT	;UPDAYPE
	BR	ATINEX		;RETURN
	
	.SBTTL PROGRAMMED START ROUTINE
	;  THIS ROUTINE IS CALLED, VIA "JSR  PC,ATSAMP"
	;FROM THE USETE OUTPUT BUFFER INFORMATION
	DEC	BUFCNT
	MOV	#ATDATA,@#ADVEC	;IND. TO START TAKING DATA IMMED.
16$:	CLRB	ENDFLG		;CLEAR END R'S AREA TO START AND STOP ACQUISITION.
	;ACQUISITION MAY BE STARTED AND STOPPED ONLY ONCE PER
	;MODULE INITIALIZATION.
	;  TCESS TABLE
	SWAB	R1		;GET BIT IS LEGT HALF
	MOV	R1,R3
	ADD	#140,R3
	MOV	R3,(R2)+	;STORE FIRST A/D SW
	INC	R1		;SET A/D ENABOF RUN FLAG
	CLR	REJKLO		;CLEAR LO-PART OF REJECT COUNT
	CLR	REJKHI		;CLEAR HI-PART
	CLR	BASLIN		;CLEAR BASLIN SUM-AVERAGE
	LE BIT FOR CHANNELS
2$:	DEC	R0		;ANY MORE CHANNELS?
	BEQ	6$		;IF NOT, PROCESS NEXT PARAMETER
	ADD	#400,R1		;INCREMENT A/D CHACLR	BASLIN+2	;CLEAR BASLINE HI-PART
	CLR	BUFPAS		;CLEAR FLAG INDICATING
				;  A BUFFER IS BEING TRANSFERRED
	MOV	ATCHAN,@#ADNNEL NUMBER
	MOV	R1,(R2)+	;PUT NEXT ENTRY IN A/D SW TABLE
	BR	2$		;CHECK FOR MORE CHANNELS
4$:	MOVB	(R5)+,R1	;GET FIRST A/D CSAD	;SET UP FIRST A/D SW
	MOVB	#-1,FLAG1	;INDICATE TO "BREAK THRESHOLD" INITIALLY
	
	.IF DF,LPSDR$ ! DR11K$
	MOV	(R5)+,OUTDOHAN # FROM INPUT
	SWAB	R1
	ADD	#140,R1
	MOV	R1,(R2)+	;AND PUT IN A/D SW TABLE
5$:	DEC	R0		;ANY MORE CHANNELS?
	BEQ	55$		;IFP	;SHOULD WE OUT PUT DIGITTALY WHEN S/S
	BEQ	ATOUTP		;IF NOT, RESTORE PSW AND RETURN
	MOV	(R5)+,SDOMSK	;IF SO, GET MASK TO OUP NOT,GO PROCESS NEXT INPUT
	MOVB	(R5)+,R1
	SWAB	R1
	INC	R1
	MOV	R1,(R2)+	;IF YES, ENTER NEXT A/D # IN SW TABLE
	BR	5$		;GO TUT WHEN STARTING
	MOV	(R5)+,HDOMSK	;GET MASK TO OUTPUT WHEN STOPPING
	.ENDC

ATOUTP:	TST	(R5)+		;HOW WILL RUN BE STARTED AN AND WILL RETURN TO THE USER.


	;***NOTE***
	;  IF THIS IS A FOREGROUND JOB IT WILL BE THE RESPONSIBILITY
	;  OF THE USER  THE INPUT CONTAINS THE BITS
	;WHICH MATCH THE DIGITAL INPUT START BIT MASK. IF NOT,
	;THE ROUTINE JUST RETURNS.  IF IT DOES MTO INFORM THE MONITOR TO RESUME THE FOREGROUND
	;  PROCESSING UPON RETURN FROM A SECOND CALL TO "ATSAMP".

ATSAMP:	BIT	#1,@#CATCH, THE CLOCK IS
	;ENABLED, AND ALL FURTHER DIGITAL INPUT INTERRUPTS ARE 
	;DIRECTED TO "DISTOP"

DISTRT:	MOV	@#DIBUF,ATIDLKSAD	;IS CLOCK ALREADY ENABLED?
	BEQ	ATSMP2		;IF NOT, GO ENABLE
ATSTOP:	CLR	@#ADSAD		;CLEAR A/D INTERRUPTS
	CLR	@#CLKSAD	;IFIG	;GET THE D.I AND PUT IN GLOBAL
	MOV	ATIDIG,@#DIBUF	;CLEAR D.I. REG
	BIT	SDIMSK,ATIDIG	;DOES THE INPUT CONTAIN THE START MAS SO, DISABLE CLOCK AND THUS INPUT
	MOV	R2,-(SP)	;SAVE REGISTERS R0,R1,R2
	MOV	R1,-(SP)
	MOV	R0,-(SP)
	MOV	ATIDNO,R0	;GET DATK
	BEQ	DISTRR		;IF NOT, JUST RETURN
	JSR	PC,ATSMP2	;GO ENABLE OR DISABLE CLOCK
	MOV	#DISTOP,@#DIVEC	;SET VECTOR TO CHECK FOR A PATH ID NUMBER
	MOV	BUF1,R1		;GET BUFFER ADDRESS
	MOV	BASIZ,R2	;GET BUFFER SIZE
	SUB	BUFCNT,R2	;GET NUMBER OF DATA POINTS
HALT
DISTRR:	RTI			;RETURN

	;DIGITAL INPUT STOP ROUTINE
	; AFTER ACQUISITION HAS STARTED, ALL DIGITAL INTERRUPTS ARE
	;HAN	JSR	PC,CTIBUF	;GO GIVE BUFFER TO CONTROL MODULE
	DEC	CTIDON		;INDICATE ACQUISITION DONE
	MOV	BUF2,R0		;ALWAYS RELEASE
	JSR	PDLED BY "DISTOP" IF "ATSTRT" IN THE INITIALIZATION 
	;PARAMETER TABLE WAS POSITIVE. IF THE DIGITAL INPUT RECEIVED
	;MATCHES THC,BAREL	;  BUF2
	MOV	(SP)+,R0	;RESTORE REGISTERS
	MOV	(SP)+,R1
	MOV	(SP)+,R2

	.IF DF,LPSDR$ ! DR11K$
	TST	OUTDOP		;SHOULDE DIGITAL INPUT STOP BIT MASK, THE CLOCK IS DISABLED
	;BUFFERS ARE PASSED, AND, IF A FOREGROUND JOB, FOREGROUND 
	;MAINSTREAM  WE OUTPUT DIGITALLY?
	BEQ	ATSMP1		;IF NOT, JUST RETURN
	MOV	@#DOBUF,-(SP)	;GET CURRENT OUTPUT
	BIS	HDOMSK,(SP)	;SET HALT BITPROCESSING IS RESUMED. ALL FURTHER DIGITAL INPUT
	;INTERUPTS HAVE NO EFFECT ON THIS ROUTINE

DISTOP:	MOV	@#DIBUF,ATIDIG	;GET S INDICATION
	MOV	(SP)+,@#DOBUF	;OUTPUT NEW WORD
	.ENDC

ATSMP1:	JSR	PC,CHNGVC	;DUMMY UP INTERRUPT VECTORS
	RTS	PC		;RETURNTHE D.I. AND PUT IN GLOBAL
	MOV	ATIDIG,@#DIBUF	;CLEAR D.I. REG
	BIT	HDIMSK,ATIDIG	;TEST FOR STOP BITS
	BEQ	DISTPR		;IF NO MAT
ATSMP2:	INC	@#CLKSAD	;ENABLE CLOCK AND THUS ACQUISITION

	.IF DF,LPSDR$ ! DR11K$
	TST	OUTDOP		;SHOULD WE OUTPUT DIGITALLY?CH, JST RETURN
	JSR	PC,ATSTOP	;GO STOP PROCESS

	.IF	DF,FG$
	TST	CTRUN		;TEST FOR NEED TO SYNCH
	BNE	DCONT		;IF NOT NEEDED,
	BEQ	2$		;IF NOT, JUST RETURN
	MOV	@#DOBUF,-(SP)	;GET CURRENT OUTPUT
	BIS	SDOMSK,(SP)	;SET START BITS INDICATION
	MOV	(SP)+, BRANCH
	.INTEN	4
	.SYNCH #SYNCTL
	NOP
	.RSUM
	INC	CTRUN		;INDICATE SYNC
	CLR	HDIMSK		;DISABLE MSK
	RTS	PC
	.ENDC

DCOHE FIRST CALL TO THIS ENTRY WILL ENABLE THE CLOCK AND
	;SAMPLING WILL BEGIN ON THE FIRST CLOCK OVERFLOW.
	;  THE SECOND CALL T@#DOBUF	;OUTPUT NEW WORD
	.ENDC

2$:	RTS     PC		;RETURN
	
	.IF DF,LPSDR$ ! DR11K$
	
	.SBTTL DIGITAL INPUT INTERRUPT ROUO THIS ENTRY WILL DISABLE THE CLOCK AND
	;THUS ACQUISITION. IT WILL PASS THE SEMI-FILLED LAST BUFFER
	;TO THE "CONTROL MODULE"TINES
	
	;DIGITAL START ROUTINE
	; WHEN A DIGITAL INTERRUPT IS RECEIVED AFTER INITIALIZATION
	;THIS ROUTINE CHECKS TO SEE IF FAST, B+C
	JSR	PC,ERRSYN	;OTHERWISE, KILL JOB

	.IF	DF,FG$
	JMP	ST1A		;GO SYNC AND RETURN
	.ENDC

	.IF	NDF,FG$
	RTI			;MONITORED CHANNEL HAS "BROKEN THRESHOLD" AND 
	;   CERTAIN DATA IS OUTPUTTED. FIRST, THE COMPLEMENT OF THE 
	;   REJECT COUNT(NT:	CLR	HDIMSK		;SET MASK TO IGNORE ALL INPUT
DISTPR:	RTI			;RETURN
	.ENDC
	
	.SBTTL	SCHMIT TRIGGER 1 INTERRUPT ROUTINE
	 AND RETURN
	.ENDC
	.ENDC

11$:	ADD	@#ADBUF,BASLIN+2;ADD NEW VALUE TO SUM
	ADC	BASLIN		;UPDATE HI-PART OF SUM
	DEC	BASCNT	
	; THIS ROUTINE STARTS AND STOPS ACQUISITION VIA SCHMIT TRIGGER
	;1 INTERRUPTS. THE FIRST INTERRUPT AFTER INITIALIZATION START	;DECREMENT COUNT FOR AVERAGE
	BEQ	1$		;IF ZERO , GO AVERAGE
	RTI			;IF NOT, WAIT FOR MORE INFO.
1$:	MOV	R0,-(SP)	;SAVE REGISS
	;THE ACQUISITION. THE SECOND STOPS ACQUISITION, DISABLING THE 
	;CLOCK, AND PASSING THE SEMI-FILLED LAST BUFFERS TO THE 
	TERS R0 AND R1
	MOV	R1,-(SP)
	MOV	BASLIN+2,R1	;GET LO HALF OF SUM
	MOV	BASLIN,R0	;GET HI
	$DIV	ATN2AV,R0	;DIVIDE
	MOV	R0,@B;"CONTROL MODULE".

ST1INT:	JSR	PC,ATSAMP	;GO START OR STOP ACQUISITION
	BIC	#100000,@#CLKSAD ;CLEAR ST1 FLAG
	MOV	#ST12ND,@UFPNT	;STORE BASELINE VALUE IN BUFFER
	ADD	#2,BUFPNT	;INCREMENT BUFFER POINTER
	DEC	BUFCNT		;DECREMENT BUFFER COUNTER
	ADD	R0#CLKVEC ;REDIRECT CLK INT VEC
	RTI

ST12ND:	INCB	ENDFLG		;INDICATE DONE ACQ
11$:	TST	BUFPAS		;ARE WE PASSING A BUFFER
	BEQ	,ATTHRH	;MAKE THRESHOLD OFFSET ACTUAL VALUE
	MOV	#ATDATA,@#ADVEC	;SETUP A/D VECTOR FOR DATA TAKING
	MOV	(SP)+,R1	;RESTORE REGI1$		;IF NOT, B+C
	RTI			;OTHERWISE RETURN

1$:	JSR	PC,ATSTOP	;STOP ACQ AND PASS LAST BUFFERS

	.IF	NDF,FG$
	RTI
	.ENDC
STERS R0 AND R1
	MOV	(SP)+,R0
	RTI			;RETURN
	
	.SBTTL DATA PROCESSING SECTION
	;  THIS ROUTINE SAMPLES THE MONITORED CHAN
	.IF	DF,FG$
ST1A:	TST	CTRUN		;TEST NEED TO SYNCH
	BEQ	ST1B		;IF NOT NEEDED
	RTI			; RETURN
ST1B:	.INTEN	5		;LOWER PRIORITY NEL AT THE INITIALIZED
	;RATE AND CHECKS TO SEE IF IT IS ABOVE THE THRESHOLD VALUE 
	;CALCULATED IN THE PREVIOUS SECTION. THE TO 5
	.SYNCH #SYNCTL		;SET UP TO
	NOP
	.RSUM			;RESUME FOREGROUND MAINSTREAM
	INC	CTRUN		;INDICATE SYNC
	RTS	PC		;RETURN
	ACTION TAKEN NEXT 
	;DEPENDS BOTH ON THE RESULT OF THE COMPARE AND THE PREVIOUS 
	;HISTORY OF THE RUN.
	;  IF THE VALUE IS LE.ENDC
	.SBTTL CALCULATING BASELINE
	;  THIS ROUTINE SAMPLES THE FIRST "ATN2AV"(FROM INITIALIZATION
	;PARAMETER TABLE) VALUESSS THAN THE THRESHOLD VALUE, A REJECT COUNT
	;IS INCREMENTED BY ONE, AND THE ROUTINE RETURNS FROM THE INTERUPT
	;  IF THE VALU FROM THE MONITORED A/D CHANNEL, AVERAGES
	;THEM TO OBTAIN A BASELINE VALUE, ADDS THIS BASELINE VALUE TO
	;"ATHRSH"(FROM INITIE IS GREATER THAN THE THRESHOLD VALUE, A CHECK IS
	;MADE TO SEE IF THE PREVIOUS A/D CONVERTED VALUE FROM THE MONI-
	;TORED CHAALIZTION PARAMETER TABLE) TO OBTAIN THE
	;THRESHOLD VALUE FOR THE RUN, AND FINALLY, OUTPUTS THIS BASELINE
	;VALUE AS THE FIRSTNNEL WAS ALSO ABOVE THE THRESHOLD VALUE.
	;      IF IT WAS, THEN THE CURRENT VALUE IS OUTPUTTED TO THE
	;   CURRENT OUTPUT BUF DATUM IN THE FIRST OUTPUT BUFFER.

ATBASL:	.ENABL	LSB

	.IF	NDF,AR11$
	TST	@#ADSAD		;TEST ACQ SPEED
	BPL	11$		;IF NOT TOOFER AND THE ROUTINE EXITS FROM THE INTERUPT
	;      IF THE PREVIOUS VALUE WAS BELOW THE THRESHOLD VALUE, THEN
	;   WE SAY THE ;STORE BELOW THREHOLD INDICATOR (0)
	ADD	#2,BUFPNT	;INCREMENT BUFFER POINTER
	DEC	BUFCNT		;DECREMENT BUFFER COUNTER
	BNE	12$	EC	BUFCNT		;DECREMENT BUFFER COUNTER
	BNE	4$		;IF NOT FULL, CONTINUE
	JSR	PC,NXTBUF	;IF FULL, SWITCH BUFFERS
	BCS	LEAVE		;IF 	;IF NOT ZERO, BRANCH
	JSR	PC,NXBUF	;OTHERWISE, SWITCH BUFFERS
	BCS	12$		;IF ERROR, BRANCH
	JMP	PASBUF		;OTHERWISE, GO PASS BERROR,GO EXIT
	BR	4$		;TEST NEXT A/D SW
	
6$:	MOV	ATCHAN,@#ADSAD	;SET A/D SW FOR FIRST CHANNEL
	BIT	#200,@#CLKSAD	;DID WE BEUFFER
12$:	RTI			;RETURN
	
1$:	TSTB	FLAG1		;WAS PREVIOUS VALUE BELOW THRESH.?
	BNE	2$		;IF YES, EXTRA OUTPUT REQUIRED
	MOV	AT THE CLOCK
	BEQ	60$		;IF SO,BRANCH
	JSR	PC,ERREND	;IF NOT, INDICATE ERROR
60$:	MOV	SDATUM,(R4)+	;STORE MONITORED DATUM
	DE@#ADBUF,@BUFPNT	;IF NOT, JUST OUTPUT CURRENT VALUE
	ADD	#2,BUFPNT	;INCREMENT BUFFER POINTER
	DEC	BUFCNT		;DECREMENT BUFFER COUC	BUFCNT		;DECREMENT BUFFER COUNTER
	BNE	61$		;IF NOT FULL, CONTINUE
	JSR	PC,NXBUF	;IF FULL, SWITCH BUFFERS
	BCC	62$		;IF NO DOUBLE PRECISION) IS WRITTEN INTO THE CURRENT
	;   OUTPUT BUFFER. NEXT, IF ANY ADDITIONAL CHANNELS WERE
	;   SPECIFIED AT INTINTER
	BNE	15$		;IF NOT ZERO, BUFFER FULL, SO B+C
	JSR	PC,NXBUF	;IF BUFFER FULL, SWITCH BUFFERS
	BCC	PASBUF		;GO PASS FULL BUFALIZATION, THEY ARE NOW SAMPLED AND THEIR
	;   VALUES WRITTEN INTO THE OUTPUT BUFFER ALSO. FINALLY, THE
	;   MONITORED CHANNEL,GET NEW ONE,RETURN
15$:	RTI
	
2$:	BIC	#200,@#CLKSAD	;SET TRAP FOR SPEED ERROR
	MOV	@#ADBUF,SDATUM	;BROKE THRESHOLD, SAVE DAS VALUE IS WRITTEN INTO THE BUFFER. THEN
	;   THE ROUTINE RETURNS FROM THE INTERRUPT


ATDATA:	CLRB	FLAG2		;INDICATE NO FULLTUM
	MOV	R4,-(SP)	;SAVE R4,5
	MOV	R5,-(SP)
	CLRB	FLAG1		;IND. BROKE THRESHOLD
	MOV	#ATCHN2,R5	;GET ADDRESS OF A/D S.W.S
	MO BUFFERS

	.IF	NDF,AR11$
	TST	@#ADSAD		;TST ACQ. SPEED
	BPL	ATDATC		;IF ALRIGHT, B+C
	JSR	PC,ERREND	;IF SO, KILL JOB,BUT
AV	(R5)+,@#ADSAD	;START NEXT CONVERSION
	MOV	BUFPNT,R4	;GET CURRENT BUFFER POINTER
	MOV	REJKLO,(R4)+	;STORE LO-PART COMPLEMENT TERCD:	TST	BUFPAS		;TST IF PASSING A BUFFER
	BEQ	ATERSP		;IF NOT, BRANCH
	RTI			; ALLOW TO PASS BUFFERS
ATERSP:	JSR	PC,ATSTOPOF REJ. CNT
	DEC	BUFCNT		;DECREMENT BUFFER COUNTER
	BNE	3$		;IF BUFFER NOT FULL,CONTINUE
	JSR	PC,NXTBUF	;IF FULL,SWITCH WITH 	;STOP ACQ AND PASS BUFFER
	
	.IF	NDF,FG$
	RTI			;AND RETURN
	.ENDC

	.IF	DF,FG$
	JMP	ST1A		;GO SYNC AND RETURN
	.ENDC
ALTERNATE BUFFER
	BCS	LEAVE		;IF ERROR, GO EXIT
3$:	MOV	REJKHI,(R4)+	;STORE HI-PART OF REJ. CNT COMPLEMENT
	DEC	BUFCNT		;DECR	.ENDC

ATDATC:	CMP	@#ADBUF,ATTHRH	;COMPARE NEW VALUE TO THRESHOLD
	.ENABL	LSB
	BGT	1$		;IF GREATER, GO SAVE VALUE
	INC	REJEMENT BUFFER COUNTER
	BNE	4$		;IF BUFFER NOT FULL, CONTINUE
	JSR	PC,NXTBUF	;IF FULL,SWITCH WITH OTHER BUFFER
	BCS	LEAVE		;IF KLO		;INCR. LO-PART OF REJECT COUNT
	BNE	11$		;IF NO OVERFLOW, BRANCH
	INC	REJKHI		;OTHERWISE UPDATE HI-PART TOO
11$:	TSTB	FLERROR, GO EXIT
	
4$:	TST	@#ADSAD		;CHECK STATUS WORD
	BEQ	6$		;IF ZERO, NO EXTRA CHANNELS TO READ
41$:	TSTB	@#ADSAD		;TEST IAG1		;IS THIS THE FIRST TIME BELOW THRESH
	BNE	12$		;IF NOT, BRANCH
	DECB	FLAG1		;OTHERWISE, IND. BELOW THRESH
	CLR	@BUFPNT		F DONE
	BPL	41$		;IF NOT DONE TEST AGAIN
	MOV	@#ADBUF,(R4)+	;STORE NEW DATUM VALUE
	MOV	(R5)+,@#ADSAD	;START NEXT CHANNEL
	DSBUF:	.INTEN 5		;CHANGE PRIORITY LEVEL TO 5
	.ENABL	LSB
	MOV	R0,-(SP)	;SAVE REGISTERS R0,R1,R2
	MOV	R1,-(SP)
	MOV	R2,-(SP)
TY ONE, BUFFER 2.  THE ADDRESS OF THE 
	;ORIGINAL BUFFER 1 IS SAVED, AND WHEN THE CURRENT INTERUPT HAS
	;BEEN COMPLETELY SERVI	MOV	ATIDNO,R0	;GET ID NO. FOR CONTROL MODULE
	MOV	BUFPAS,R1	;GET BUFFER STARTING ADDRESS
	MOV	BASIZ,R2	;GET COUNT
	NEG	R2		;CED, THE PROCESS OF PASSING THE FILLED
	;BUFFER TO THE "CONTROL MODULE" AND ACQUIRING A NEW BUFFER 2
	;BEGINS

NXTBUF:	MOV	BSHOW NOT LAST BUFFER
	JSR	PC,CTIBUF	;GIVE FULL BUFFER TO CONTROL MODULE 
	BCC	10$		;IF NO ERRORS, CONTINUE
	CLR	@#ADSAD		;DISUF2,R4		;CHANGE STORAGE ADDRESS IN R0
	BR	NX2
NXBUF:	MOV	BUF2,BUFPNT	;CHANGE BUFFER POINTER
NX2:	TST	BUFPAS		;TEST IF PREVIOUABLE A/D INTERRUPT
	CLR	@#CLKSAD		;IF ERROR, HALT PROCESSING
	DEC	CTIDON		;INDICATE DONE
	MOV	BUF1,R0		;GET CURRENT BUFFER ADS FULL BUFFER GONE
	BEQ	NX1		;IF GONE CONTINUE
	JSR	PC,ERREND	;GO TERMINATE ACQUISITION
	RTS	PC
NX1:	INCB	FLAG2		;SIGNAL BUFDRESS
	JSR	PC,BAREL	;RELEASE IT

	.IF DF,LPSDR$ ! DR11K$
	TST	OUTDOP		;SHOULD WE OUTPUT DIGITALLY?
	BEQ	9$		;IF NOT, CONTINFER TRANSFER STATE
	MOV	BUF1,BUFPAS	;SETUP BUFFER ADDRESS TO PASS
	MOV	BUF2,BUF1	;CHANGE CURRENT BUFFER
	MOV	BASIZ,BUFCNT	;GEUE
	MOV	@#DOBUF,-(SP)	;GET CURRENT OUTPUT
	BIS	HDOMSK,(SP)	;SET HALT BITS INDICATION
	MOV	(SP)+,@#DOBUF	;OUTPUT NEW WORD
	.ET NEW BUFFER COUNT
	RTS	PC		;RETURN
	
	.SBTTL ROUTINE TO TERMINATE ABNORMALLY
	;  WHEN AN ERROR OCCURS DURING ACQUISITION, NDC

9$:	JSR	PC,CHNGVC	;DUMMY UP INTERRUPT VECTORS
	BR	11$		;GO EXIT GRACEFULLY
10$:	MOV	#BUF2,R0	;GO GET NEW BUFFER 
	JSR	USUALLY DUE TO
	;LACK OF SPACE FOR MORE REQUIRED BUFFERS OR AN ACQUISITION
	;SPEED TOO GREAT TO BE HANDLED BY PRE-PROCESSING RERROR, B+C
	BR	LEAVE		;IF ERROR, GO EXIT
61$:	MOV	R4,BUFPNT	;STORE BUFFER POINTER
62$:	CLR	REJKLO		;CLEAR LO-PART OF REJECT CPC,BAGET	;  FROM BUFFER ALLOCATOR
	BCC	11$		;IF NO ERRORS, CONTINUE
	JSR	PC,ERREND	;GO TERMINATE ACQUISITION
11$:	MOV	(SP)+,ROUNT
	CLR	REJKHI		;CLEAR HI-PART
LEAVE:	MOV	(SP)+,R5	;RESTORE R5,4
	MOV	(SP)+,R4
	TSTB	FLAG2		;WERE THE BUFFERS SWITCHED
	B2
	MOV	(SP)+,R1	;RESTORE REGISTERS
	MOV	(SP)+,R0
	
	.IF DF,FG$
	TST	CTRUN		;TEST NEED TO SYNCH
	BNE	13$		;IF NOT NEEDED, BNE	PASBUF		;IF SO, BRANCH
	TSTB	ENDFLG		;DID ERROR OCCUR
	BNE	ATEREX		;ITS POSSIBLE GO CHECK
	RTI			;OTHERWISE RETURN
ATEREXRANCH
	.SYNCH #SYNCTL
	BR	ERRSYN
	INC	CTRUN		;INDICATE SYNC
	.RSUM			;RESUME MAINSTREAM
	.ENDC

13$:	$SPL	7		;DISABLE INT:	JMP	ATERCD
	
	.SBTTL ROUTINE TO TEST FOR ACQUIRING NEW BUFFER AND RETURN
	;  IF BUFFERS ONE AND TWO WERE INTERCHANGED THENERUPTS
	TSTB	ENDFLG		;CHECK IF ACQ SHOULD BE DISABLED
	BEQ	12$		;IF NOT, B+C
	$SPL	5		;OTHERWISE, LET SOME INT. OCCUR
	JSR	P BUFFER 1
	;NEEDS TO BE PASSED TO THE "CONTROL MODULE" AND A NEW BACKUP
	;BUFFER 2 NEEDS TO BE ACQUIRED.  THIS SECTION SATISFIC,ATSTOP	; BUT DISABLE ACQ
12$:	CLR	BUFPAS		;INDICATE BUFFER TRANSFER DONE
	RTS	PC		;RETURN
	
	
	.SBTTL ROUTINE TO INTERCHES BOTH
	;NEEDS.  IF AN ERROR OCCURS IN THE PROCESS, ACQUISITION IS
	;HALTED, AND THE LAST BUFFER IS PASSED IF POSSIBLE.

PAANGE THE TWO PREVIOUSLY ACQUIRED BUFFERS
	;  WHEN THE CURRENT OUTPUT BUFFER IS FULL, BUFFER 1, IT IS 
	;EXCHANGE FOR A NEW EMPDUMMY INTERRUPT VECTORS
	MOV	#IGNORI,@#CLKVEC
	.IF	DF,LPSDR$ ! DR11K$
	MOV	#IGNORI,@#DIVEC
	.ENDC
	RTS	PC		;RETURN
IGNORA:
DLIST:	.BYTE 0,14	;ENT AR LIST
	.WORD DLIST1		;ADDRESS
DLIST1:	ADSAD
	0
	ADVEC
	IGNORA
	CLKSAD
	0
	CLKVEC
	IGNORI
	.	TST	@#ADBUF		;CLR DONE BIT
	CLR	@#ADSAD		;CLEAR ANY ERROR
IGNORI:	RTI
	.SBTTL STORAGE AREA
	
	.IF	DF,LPSDR$ ! DR11K$
OUTIF DF,LPSDR$ ! DR11K$
	DIOSAD
	.WORD 0
	DIVEC
	IGNORI
	.ENDC
	.WORD 0
PRTFLG:	.WORD 0		;PROTECT FLAG

	.IF	DF,FG$
GTJBDOP:	.BLKW 1		;SIGNAL FOR OUTPUT PULSE
SDOMSK:	.BLKW 1		;OUTPUT MSK FOR STARTING
SDIMSK:	.BLKW 1		;INPUT DIGITAL MASK FOR STARA:	.BYTE 0,20	;AREA FOR GET JOB
	.WORD	GTJBA
	.BLKW	6
SYNCTL:	.WORD 0,0,0,0,0	;STORAGE FOR .SYNCH
	-1
	0
	.ENDC
	
	.ENDTING
HDOMSK: .BLKW 1		;OUTPUT DIGITAL MASK FOR STOPPING
HDIMSK: .BLKW 1		;INPUT DIGITAL MASK FOR STOPPING
ATIDIG:	.BLKW 1		;G
                                                                                                                               LOBAL CONTAINNING CURRENT DIG. INP.
	.ENDC

ATEROR:	.BYTE 0		;ABNORMAL END INDICATOR
ENDFLG:	.BYTE 1		;SIGNAL TO END RUN
AT.TITLE ENVELOPE PROCESSING MODULE
;LAB-APPLICATIONS-11
;DEC-11-SLABA-C-LA
;FILENAME NVELOP.MAC
;FILE ID NVELOP.2

.CSECT	EIDNO:	.BLKW 1		;DATA PATH ID NO FOR CONTROLMODULE
ATTHRH:	.BLKW 1		;INITIAL THRESHOLD OFFSET AND LATER,
			;   ACTUAL THRESHOLNVLOP

;COPYRIGHT (C) 1975
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR D VALUE
ATNOFC:	.BLKW 1		;NUMBER OF ACTIVE CHANNELS
ATCHAN:	.BLKW 1		;AREA FOR A/D COMMANDS
ATCHN2: .BLKW 3		;AND SPACE FOR XUSE ONLY ON A
;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE,TRA CHNL'S A/D SW
ATN2AV:	.BLKW 1		;NUMBER OF SAMPLES TO AVERAGE FOR BASELINE
SDATUM:BASCNT: .BLKW 1	;COUNTER FOR AVERAGING
B OR ANY OTHER COPIES
;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON EXCEPT FOR USE ON SUCH SYSUF1:	.BLKW 1		;ADDRESS OF CURRENT OUTPUT BUFFER
BUF2:	.BLKW 1		;ADDRESS OF NEXT OUTPUT BUFFER
REJKLO: .BLKW 1		;LOW ORDER PARTTEM AND TO ONE WHO AGREES
;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE
;SHALL AT ALL TIMES REMAIN IN DEC.
 OF REJECT COUNTER
REJKHI: .BLKW 1		;HIGH ORDER PART OF REJECT COUNTEER
BASLIN: .BLKW 2		;SUM, THEN, AVERAGE BASELINE VALUE
F
;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
;COMMITMENT BY DIGITOUTINES
	;DOWN STREAM(SEE "CONTROL MODULE"), THE ROUTINE STOPS ACQUI-
	;SITION BY COMING HERE, DISABLING THE CLOCK, AND PASSINLAG1:	.BLKB 1		;FLAG INDICATING BREAKING THRESHOLD
FLAG2:	.BLKB 1		;FLAG INDICATING BUFFER TRANSFERRING
BUFPNT: .BLKW 1		;POING
	;THE LAST BUFFER,IF POSSIBLE.

ERRSYN:	DEC	CTIDON		;IND ACQ DONE
ERREND:	INCB	ATEROR		;INDICATE ABNORMAL END
	CLR	@#ADSATER INTO OUTPUT BUFFER
BUFCNT: .BLKW 1		;CURRENT COUNT OF OUTPUT BUFFER 
			;   POSITIONS REMAINING
BUFPAS: .BLKW 1		;ADDRESSD		;DISABLE A/D INTERRUPTS
	CLR	@#CLKSAD	;DISABLE CLOCK
	INCB	ENDFLG		;INDICATE ALL DONE
CHNGVC:	MOV	#IGNORA,@#ADVEC	;SET UP  OF BUFFER TO PASS TO CONTROL MODULE
			;  IF EQUAL ZERO, NO BUFFER TO PASS
PROTAR:	14400		;STORAGE AREA FOR PROTECT
	.BLKW 1AL EQUIPMENT CORPORATION.

;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
;ITS SOFTWARE ON EQUIPMENT WHICH IS NUMS COUNTER
CC=36		;MAXIMUMS COUNTER
T0L=40		;INITIAL TIME OF LOCAL TIME SEGMENT
T0H=42		;HI-ORDER
TYPE=44		;PEAK TYPE. =0 IOT SUPPLIED BY DEC.

;LDP SOFTWARE DEVELOPMENT, JUNE 1975
	.SBTTL MACROS,GLOBALS, AND CONDITIONALS

	.MCALL ..V2..,.REGDEF,F ENDS ON VALLEY, =1 IF AT THRESHOLD
OAL=46		;LO-ORDER OF AREA OF CURRENT PEAK
OAH=50		;HI
OCNL=52		;LO-ORDER OF SUMMATION FO$SOB,$MUL
	..V2..
	.REGDEF


	;EXTERNAL GLOBALS
.GLOBL	CTOBUF				;FROM CONTROL MODULE
.GLOBL	BAGET,BASIZ,BAREL,BBASIZ	;FRR, OR ACTUAL,CENTROID
OCNH=54		;HI
WDL=56		;LO-ORDER OF PEAK WIDTH
WDH=60		;HI
TOPTL=62	;LO-ORDER OF TIME OF PEAK
TOPTH=64	OM BUFFER ALLOCATION MODULE


	;INTERNAL GLOBAL
.GLOBL	NVELOP


	;CONDITIONAL ASSEMBLY PARAMETER

;	"CTREL$" IS THE ONL;HI
TOP=66		;PEAK HEIGHT
FTML=70		;LO-ORDER OF LEADING TIME OF PEAK
FTMH=72		;HI
SAVR=74		;LOCATION TO SAVE REGISTERS AT CRIY CONDITIONAL ASSEMBLY PARAMETER AFFECTING
;	THIS MODULE. IF NOT DEFINED, THE MODULE MUST RELEASE ITS OWN 
;	INPUT BUFFERS BEFTICAL TIMES
CCNL=76		;LO-ORDER OF PARTIAL CENTROID SUMMATION
CCNH=100	;HI
CTL=102		;LO-ORDER OF TIME OF LATEST MAXIMUM
CTH=1ORE RETURNING CONTROL TO THE CONTROL MODULE.
;	THE PREVIOUS STATEMENT ASSUMES THAT THE ENVELOPE PROCESSING
;	MODULE IS NOT THE04		;HI
CNT=106		;LOCATION NEEDED FOR A COUNTER
BAS=110		;BASELINE VALUE FOR DATA PATH

	.SBTTL START OF NVELOP MODULE

	 LAST MODULE IN A DATA PATH.  SEE CONTROL
;	MODULE FOR FURTHER EXPLAINATION.

	.SBTTL OFSETS INTO PARAMETER - VARIABLE TABLE;REGISTER FIVE(R5) SHOULD POINT TO ASSOCIATED
	;                  PARAMETER - VARIABLE TABLE
	;REGISTER ZERO(R0) SHOULD POINT 


;	THE FOLLOWING IS A LIST OF THE OFFSETS INTO THE PARAMETER -
;	VARIABLE TABLE (REGISTER FIVE(R5)CONTAINS THE ADDRESS OF TO ASSOCIATED
	;                  OUTPUT INFORMATION(SEE CONTROL MODULE)
	;REGISTER ONE (R1) SHOULD POINT TO ASSOCIATED
	;   THIS
;	TABLE WHEN "NVELOP" IS CALLED) USED BY THIS ROUTINE.


NOFC=0		;NO. OF EXTRA CHANNELS OF DATA
IGT=2		;SENSITIVITY, #               INPUT INFORMATION(SEE CONTROL MODULE)

NVELOP:	CLR	NDFLG		;CLEAR END OF INPUT FLAG
	TST	+2(R1)		;IS THIS A LAS OF PTS NEEDED ON EACH SIDE OF PEAK
FIRSTM=4	;ZER0 ON FIRST CALL TO ROUTINE ONLY
EROR=5		;ERROR INDICATOR
S1=6		;INDICATES A T BUFFER
	.ENABL	LSB
	BMI	3$		;IF NOT, B+C
	BNE	2$		;IF NOT EMPTY, B+C
	JMP	ENDATA		;OTHERWISE, GO OUTPUT FINAL BUFFER
2$:	DECREASING TREND WHEN SET
S2=7		;INDICATES AN INCREASING TREND WHEN SET
PK=10		;INDICATES A PEAK FOUND
YX=12		;PREVIOUS AVERADEC	NDFLG		;IND. LAST INPUT BUFFER
	NEG	+2(R1)		;CHANGE SIGN OF WORD COUNT
3$:	MOV	(R1)+,INADDR	;SAVE INPUT BUFFER POINTER

GED POINT
TML=14		;LO-ORDER OF LOCAL TIMER
TMH=16		;HI
TTL=20		;LO-ORDER OF TOTAL TIMER
TTH=22		;HI
CAL=24		;LO-ORDER OF AR	.IF	NDF,CTREL$
	MOV	INADDR,SINADR	;SAVE INPUT BUFFER ADDRESS
	.ENDC

	MOV	(R1),INCNT	;SAVE INPUT BUFFER WORD COUNT
	MOV	R0EA ACCUMULATED DURING INCREASING TREND
CAH=26		;HI
MX=30		;CURRENT MAXIMUM VALUE
MN=32		;CURRENT MINIMUM VALUE
MC=34		;MINIM,OUTADR	;SAVE ADDRESS OF POINTER TO OUTPUT BUFR
	TST	FIRSTM(R5)	;IS THIS THE FIRST CALL BY DATA PATH
	BEQ	4$		;IF SO, B+C
	JMNE	N30
	INC	FTMH(R5)
N30:	CLR	TOP(R5)		;CLEAR LAST PEAK VALUE
	CLR	TOPTL(R5)	;CLEAR PEAK TIME
	CLR	TOPTH(R5)
	CLR	OCNL(R5)	IF MORE B+C
	JMP	N20		;OTHERWISE, REINITIALIZE

	;GOT A NEW DATUM

N115:	INC	TML(R5)		;INC. LOCAL TIMER
	.ENABL  LSB
	BNE;CLEAR CENTROID SUMMATION
	CLR	OCNH(R5)
	CLR	OAL(R5)		;CLEAR TOTAL AREA
	CLR	OAH(R5)
N50:	MOV	#77777,MN(R5)	;SET MIN TO VERY	1$
	INC	TMH(R5)
1$:	INC	TTL(R5)		;INC. TOTAL TIMER
	BNE	2$
	INC	TTH(R5)
2$:	SUB	BAS(R5),R3	;SUBTRACT BASELINE VALUE
;	ADD LARGE NUMBER
	MOV	#100000,MX(R5)	;SET CURRENT MAX TO VERY LARGE NEG NUMBER
	CLR	MC(R5)		;CLEAR NO. OF DECREASES COUNTER
	CLR	YX(R5),R3	;GET "AVERAGED" POINT
;	ASR	R3
	MOV	R3,YX(R5)	;SAVE IT
	CMP	R3,MN(R5)	;TEST IF LOWER THAN CURRENT MINIMUM
	BGT	N1P	RESUME		;IF NOT, GO PICK UP WHERE LEFT OFF

;	COMES HERE ONLY ONCE, AT START, TO GET BASELINE VALUE ,
;	   AND THEN PASSES 	CC(R5)		;CLEAR NO. OF INCREASES COUNTER
	MOVB	#1,S1(R5)	;IND. INCREASING TREND
	CLRB	S2(R5)		;IND. NO DECREASING TREND
N100:IT ON THROUGH THE OUTPUT BUFFER

4$:	JSR	PC,NEXTPT	;GET BASELINE VALUE
	MOV	R3,BAS(R5)	;SAVE IT
	CLRB	EROR(R5)	;CLEAR ERROR 	JSR	PC,NEXTPT	;GET NEXT INPUT
	TST	R3		;IS THIS A REAL DATA POINT
	BNE	N115		;IF SO, B+C
	.ENABL	LSB
5$:	MOV	TTL(R5),WDL(R5INDICATOR
	JSR	PC,GETBUF	;GET OUTPUT BUFFER POINTER
	BCC	5$		;IF OUTPUT BUFR OBTAINED, B+C

	.IF	NDF,CTREL$
	JMP	ENDATC		;O)	;FIND WIDTH
	MOV	TTH(R5),WDH(R5)
	SUB	FTMH(R5),WDH(R5)
	SUB	FTML(R5),WDL(R5)
	SBC	WDH(R5)
	BNE	1$		;TEST IF WIDTH IS LESSTHERWISE, RETURN INDICATING ERROR
	.ENDC

	.IF	DF,CTREL$
	RTS	PC		;OTHERWISE, RETURN INDICATING ERROR
	.ENDC

5$:	MOV	R3, THAN SIX
	CMP	#6,WDL(R5)	; IF WIDER, BRANCH TO 1$
	BHI	N101		;OTHERWISE FORGET PEAK
1$:	MOV	#1,TYPE(R5)	;INDICATE PEAK ENDS (R2)+	;STORE BASELINE VALUE IN OUTPUT BUFFER
	DEC	(R0)		;DECREMENT OUTPUT BUFFER WORD CNT
	MOV	R2,-(R0)	;STORE OUTPUT BUFFER PON THRESHOLD
	JSR	PC,OUTPUT	;GO OUTPUT PEAK BLOCK
N101:	JSR	PC,NEXTPT	;GET LO-PART OF REJECT COUNT
	.ENABL	LSB
	ADD	R3,TTL(ROINTER
	CLR	TTL(R5)		;ZERO TOTAL TIMER
	CLR	TTH(R5)
	CLR	FTML(R5)	;ZERO INITIAL TIME OF PEAK
	CLR	FTMH(R5)
	INCB	FIRSTM(R5)5)	; COUNT. ADD TO TOTAL TIME
	ADC	TTH(R5)
	JSR	PC,NEXTPT	;GET HI-ORDER PART
	ADD	R3,TTH(R5)	;ADD TO TOTAL TIME
	MOV	TTL(R5)	;IND. NOT FIRST TIME ANY MORE
	BR	N101		;GO START PROCESSING
;	RE-INITIALIZE ALMOST EVERYTHING AT START OF NEW ENVELOPE

;,T0L(R5)	;SAVE T0 OF ENVELOP
	MOV	TTH(R5),T0H(R5)
	MOV	NOFC(R5),CNT(R5);GET NO. OF EXTRA CHANNELS
	MOV	#-1,R3		;INDICATE BEGI	MOV	BAS(R5),YX(R5)	;CLEAR PREVIOUS VALUE
N20:	CLRB	PK(R5)		;CLEAR PEAK FOUND INDICATION
	CLR	CAL(R5)		;CLEAR AREA ACCUM. DURINING NEW ENVELOP
	BR	31$
3$:	JSR	PC,NEXTPT	;GET NEXT POINT
31$:	JSR	PC,GETBUF	;GET OUTPUT BUFFER
	TST	(R0)		;IS THERE ROOM LNG INCREASE
	CLR	CAH(R5)
	CLR	CCNL(R5)	;CLEAR PARTIAL CENTROID CALCULATION
	CLR	CCNH(R5)
	CLR	TML(R5)		;CLEAR LOCAL TIMER
	EFT IN OUTPUT BUFFER
	BNE	4$		;IF SO, B+C
	JSR	PC,PASBUF	;IF NOT, PASS THE FULL BUFR AND GET NEW 1
4$:	MOV	R3,(R2)+	;OUTPUT VCLR	TMH(R5)
	MOV	TTL(R5),FTML(R5)	;SET BEGIN TIME TO CURRENT TIME
	MOV	TTH(R5),FTMH(R5)
	INC	FTML(R5)	;CORRECT BEGIN TIME
	BALUE
	DEC	(R0)		;DEC. OUTPUT WORD COUNT
	MOV	R2,-(R0)	;RESTORE OUTADDR
	DEC	CNT(R5)		;DECREMENT EXTRA CHANNEL CNT
	BGE	3$		;SING TREND
	CLR	CC(R5)		; SO CLEAR INCREASES COUNTER
	MOV	#100000,MX(R5)	;IF NOT, SET PHONY MAX
	JMP	N100		;AND GET NEXT POINT	;GO OUTPUT PEAK BLOCK
	MOV	TTL(R5),FTML(R5);RECORD BEGIN OF NEXT PEAK TIME
	MOV	TTH(R5),FTMH(R5)
	JMP	N30		;INITIALIZE SOMET
	
	;FOUND PEAK

N130:	MOVB	#1,PK(R5)	;INDICATE FOUND A PEAK
	MOV	MX(R5),TOP(R5)	;SAVE CREST VALUE
	MOV	CTL(R5),TOPTL(R5) VARIABLES

	.SBTTL UTILITY ROUTINES

	;ROUTINE TO GET NEXT AVERAGED POINT


NEXTPT:	MOV	INADDR,R2	;GET INPUT TABLE ADDR	;SAVE CREST TIME
	MOV	CTH(R5),TOPTH(R5)
	JMP	N50		;CONTINUE
	.SBTTL CHECK FOR NEW MAXIMUM

N150:	ADD	R3,CAL(R5)	;INCR. ARESS
NEXTIN:	INC	INCNT		;DECR INPUT BUFR CNT
	.ENABL	LSB
	BLE	NEXTC		;IF NOT EMPTY , CONTINUE
	TST	NDFLG		;CHECK FOR LAST BUFEA FROM INCREASING TREND
	ADC	CAH(R5)
	MOV	TML(R5),R0	;MULT LOCAL TIME BY CUR. VALUE AND ADD
	$MUL	R3,R0		;TO PARTIAL CENTROIFER
	BEQ	20$		;IF NOT A LAST BUFFER, B+C
	TST	(SP)+		;FORGET WHERE WE CAME FROM 
	JMP	ENDATB		;IF IT IS, RELEASE OUTPUT BUFFED SUMMATION
	ADD	R1,CCNL(R5)
	ADC	R0
	ADD	R0,CCNH(R5)
	MOV	TMH(R5),R0	;SAME FOR MSH OF LOCAL TIME
	$MUL	R3,R0
	ADD	R1,CCNHR
20$:	MOV	(SP)+,SAVR(R5)
	CLC			;INDICATE NO ERRORS

	.IF	NDF,CTREL$
	JMP	ENDATC		;GO RELEASE INPUT BUFFER AND RETURN
	.E(R5)
	CMP	R3,MX(R5)	;IS NEW VALUE LARGER THAN OLD MAX
	.ENABL	LSB
	BGE	1$		;IF SO, B+C
	JMP	N100		;OTHERWISE GET A NEW POINTNDC

	.IF	DF,CTREL$
	RTS	PC		;RETURN TO CONTROL MODULE
	.ENDC

RESUME:	MOV	SAVR(R5),-(SP)
	MOV	INADDR,R2	;GET ADDR OF INP50		;IF NOT, B+C
	.SBTTL FOUND NEW MINIMUM

	MOV	R3,MN(R5)	;STORE NEW MINIMUM
	INC	MC(R5)		;INCR. MINS COUNTER
	MOV	TML(R5
1$:	MOV	R3,MX(R5)	;SAVE NEW MAX
	MOV	TTL(R5),CTL(R5)	;SAVE NEW MAX TIME
	MOV	TTH(R5),CTH(R5)
	INC	CC(R5)		;INCR INCREASE CO),R0	;GET LOCAL TIME
	$MUL	R3,R0		;MUL BY NEW VALUE
	ADD	R1,OCNL(R5)	;ADD TO CENTROID SUMMATION
	ADC	R0
	ADD	R0,OCNH(R5)
	MUNTER
	CMP	CC(R5),IGT(R5)	;GOT ENOUGH INCREASES FOR A TREND
	BGE	2$		;IF SO, B+C
	JMP	N100		;OTHERWISE, GET NEXT POINT
2$:	COV	TMH(R5),R0	;DO SAME FOR MSH OF LOCAL TIME
	$MUL	R3,R0
	ADD	R1,OCNH(R5)
	ADD	CCNL(R5),OCNL(R5)	;ADD PARTIAL CENTR. SUM FOR LR	MC(R5)		;CLEAR DECREASES COUNTER
	MOV	MX(R5),MN(R5)	; AND SET MIN TO CURR VALUE
	TSTB	S1(R5)		;IS THIS AN INCREASE AFTER A INCR
	ADC	OCNH(R5)
	ADD	CCNH(R5),OCNH(R5)
	CLR	CCNL(R5)	;CLEAR PARTIAL CENTROID SUMMATION
	CLR	CCNH(R5)
	ADD	R3,OAL(R5)	;ADDECREASE
	BNE	3$		;IF SO, B+C
	JMP	N100		;IF NOT, GO GET NEXT POINT
3$:	MOVB	#1,S2(R5)	;IND. INCREASING TREND
	CLRB	S1(R5)		D TO TOTAL AREA
	ADC	OAH(R5)
	ADD	CAL(R5),OAL(R5)	;ADD PARTIAL AREA FROM INCR
	ADC	OAH(R5)
	ADD	CAH(R5),OAH(R5)
	CLR	CAL(R5; NOT DECREASING
	TSTB	PK(R5)		;HAS THERE BEEN A PEAK FOUND
	BNE	4$		;IF SO, IT IS ENDING ON A VALLEY,SO B+C
	JMP	N100		;IF N)		;CLEAR PARTIAL AREAS
	CLR	CAH(R5)
	.ENABL	LSB
	CMP	MC(R5),IGT(R5)	;ENOUGH POINTS DURING INCREAS
	BGE	1$		;IF SO, B+C
	JMOT, THIS IS START OF FIRST PEAK
4$:	CLRB	PK(R5)		;CLEAR PEAK FOUND FLAG
	MOV	TTL(R5),WDL(R5)	;GET WIDTH
	MOV	TTH(R5),WDH(R5)P	N100		;OTHERWISE GET NEXT POINT
1$:	TSTB	S2(R5)		;IS THIS AFTER A CREST
	BNE	N130		;IF SO, B+C
	MOVB	#1,S1(R5)	;IND. DECREA
	SUB	FTMH(R5),WDH(R5)
	SUB	FTML(R5),WDL(R5)
	SBC	WDH(R5)
	CLR	TYPE(R5)	;INDICATE TYPE OF PEAK(ENDS ON VALLEY)
	JSR	PC,OUTPUGET ADDR OF ADDR OF OUTPUT BUFFER
	JSR	PC,BAGET	;OTHERWISE, GET AN OUTPUT BUFFER
	BCC	1$		;IF ALLS WELL, B+C
	CLRB	FIRSTM(R5)CK IN OUTPUT BUFFER
	DEC	(R0)		;DECR BUFR WORD CNT
	$SOB	R3,3$		;DECR BLOCK WORD CNT. B+C IF NOT ZERO
	MOV	R2,-(R0)	;STORE CU	;IF NOT, IND. NEXT DATA RECEIVED FOR THIS
	INCB	EROR(R5)	;INDICATE ERROR
	SEC			; CHANL TO BE TREATED AS INITIAL DATA. 
2$:	RRENT BUFFER POINTER
	RTS	PC

	;ROUTINE TO OUTPUT LAST BUFFER

ENDATB:	MOV	OUTADR,R0	;GET ADDR OF ADDR OF OUTPUTBUFR
ENDATRTS	PC		;INDICATE ERROR AND RETURN

	;ROUTINE TO PASS FULL OUTPUT BUFFER TO CONTROL MODULE
	; ROUTINE ALSO CALLS GETBUF TO GEA:	MOV	+2(R0),R1	;GET BUFFER WORD CNT
	.ENABL	LSB
	BNE	1$		;IF USED, SOMETHING IS IN IT
	COM	(R0)		;OTHERWISE, SET PHONY BUFRT NEW OUTPUT BUFFER

PASBUF:	MOV	BASIZ,(R0)	;SET LBI TO BUFR SIZE
	.ENABL	LSB
	SUB	BBASIZ,R2	;GET BEGIN BUFR ADDR
	NEG	(R0) ADDR(-1)
	BR	2$
1$:	SUB	BASIZ,R1	;GET NEG COUNT OF BUFR ELEMENTS
	ASL	R1		;GET NEG BYTE COUNT
	ADD	R1,(R0)+	;RESET BUFR ADD		;INDICATE NOT LAST BUFR
	MOV	R2,-(R0)	;RESTORE BUFR ADDR
	JSR	PC,CTOBUF	;PASS BUFR
	BCC	3$		;IF ALL'S WELL, B+C
	CLR	FIRSTR TO START OF BUFR
	ASR	R1		;GET NEG COUNT OF BUFR ELEMENTS
	NEG	R1		;GET POS COUNT OF BUFR ELEMENTS
	MOV	R1,(R0)		;STORE FORM(R5)	;INDICATE IN INITIAL STATE
4$:	TST	(SP)+		;OTHERWISE, QUIT
	TST	(SP)+

	.IF	NDF,CTREL$
	JMP	ENDATC		;GO RELEASE INPUT LBI
2$:	JSR	PC,CTOBUF	;PASS BUFFER
	CLRB	FIRSTM(R5)	;INDICATE IN INITIAL STATE

	.IF	NDF,CTREL$
ENDATC:	ROR	-(SP)		;SAVE C BUFFER AND RETURN
	.ENDC

	.IF	DF,CTREL$
	RTS	PC
	.ENDC

3$:	JSR	PC,GETBUF	;GET ANOTHER OUTPUT BUFR
	BCS	4$		;IF NO AVAARRY
	MOV	SINADR,R0	;GET INPUT BUFFER ADDRESS
	JSR	PC,BAREL	;RELEASE IT
	ROL	(SP)+		;RESTORE CARRY
	.ENDC

	RTS	PC		;RETURILABLE BUFFERS, QUIT
	RTS	PC

	;ROUTINE TO OUTPUT A BLOCK OF PEAK DATA.

OUTPUT:	MOV	OCNL(R5),R1	;DIV OCN/OA + T0 = OCN
	MN
        
	;ROUTINE TO DIVIDE R0, R1 BY R2, R3 WITH RESULT IN R0,R1

DDIVD:	MOV	R5,-(SP)	;SAVE R5
	MOV	#32.,-(SP)	;GET LOOOV	OCNH(R5),R0
	MOV	OAL(R5),R3
	MOV	OAH(R5),R2
	JSR	PC,DDIVD
	ADD	T0L(R5),R1
	ADC	R0
	ADD	T0H(R5),R0
	MOV	R1,OCNL(R5)
	MP COUNT
	CLR	R4		;READY REMAINDER(R4+R5)
	CLR	R5
	.ENABL	LSB
1$:	ROL	R1
	ROL	R0		;EXPOSE NEW BIT OF NEWMERATOR
	ROL	R4
	RUT BUFFER
	INC	INCNT		;DECREMENT INPUT BUFFER COUNTER
NEXTC:	MOV	(R2)+,R3	;GET NEXT DATUM
	MOV	R2,INADDR	;SAVE INPUT BUFFER POV	R0,OCNH(R5)
	.ENABL	LSB
	JSR	PC,GETBUF	;GET OUTPUT BUFR ADDR IN R2, WD CT ADR R0
	BCC	1$		;IF NO ERRORS B+C
	TST	(SP)+
OINTER
	RTS	PC		;RETURN

	;ROUTINE TO GET THE CURRENT OUTPUT BUFR POINTER,RETURNED IN
	; R2, AND ADDRESS OF COUNT OF OUTPUT 
	.IF	NDF,CTREL$
	JMP	ENDATC		;GO RELEASE INPUT BUFFER AND RETURN
	.ENDC

	.IF	DF,CTREL$
	RTS	PC
	.ENDC

1$:	MOV	R5,R4
SPACE LEFT, RETURNED IN R0

GETBUF:	CLC			;IND. NO ERROR
	.ENABL	LSB
1$:	MOV	OUTADR,R0	;GET ADDR OF ADDR OF OUTPUT BUFFER
		ADD	#TYPE,R4	;GET ADDRESS OF START OF PEAK OUPUT BLOCK
	MOV	#14,R3		;GET OUPUT WORD COUNT
3$:	TST	(R0)		;IS THERE ROOM FOR MOMOV	(R0)+,R2	;GET ADDR OF OUTPUT BUFFER
	BNE	2$		;IF IT EXITS, B+C
	MOV	BASIZ,(R0)	;SET WORD CNT TO BUFFER SIZE
	TST	-(R0)		;RE IN OUT BUFR
	BNE	2$		;IF SO, B+C
	JSR	PC,PASBUF	;IF NOT, PASS THIS ONE AND GET NEW ONE
2$:	MOV	(R4)+,(R2)+	;PUT OUTPUT BLOECK LOW PARTS
	BHI	3$		;BRANCH IF DENOM. TOO BIG(C=0)
2$:	SUB	R3,R4		;SUB DENOM FROM REMAINDER
	SBC	R5
	SUB	R2,R5
	SEC			;IEM AND TO ONE WHO AGREES
;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE
;SHALL AT ALL TIMES REMAIN IN DEC.
NDECATE NEW QUOTIENT BIT
3$:	DEC	(SP)		;CHECK LOOP COUNT
	BGE	1$		;IF MORE TO COME B+C
	TST	(SP)+		;UP SP
	MOV	(SP)+,R5	;RES
;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
;COMMITMENT BY DIGITATORE R5
	RTS	PC		;RESULT IN R3,R2

NDFLG:	.WORD 0			;END FLAG, SET IF INPUT BUFR IS A LAST BF
INADDR: .WORD 0			;CONTAINS POL EQUIPMENT CORPORATION.

;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
;ITS SOFTWARE ON EQUIPMENT WHICH IS NOINTER IN CURRENT INPUT BUFFER
				;TO NEXT INPUT DATUM
INCNT:	.WORD 0			;CONTAINS COUNT OF DATA LEFT IN IN BUFFER
OUTADR:	.WOT SUPPLIED BY DEC.

;LDP SOFTWARE DEVELOPMENT, MAR. 1975
;	CARL RALSTON

;THE SPIKE TRAIN ACQUISITION MODULE WILL ALLOW THERD 0			;CONTAINS ADDRESS OF ADDRESS OF OUTPUT
				;BUFFER POINTER
	.IF 	NDF,CTREL$
SINADR:	.WORD 0			;ADDRESS TO SAVE INPUT B USER TO
;COLLECT INTER-SPIKE INTERVAL(ISI) OR POST STIMULUS TIME(PST)
;DATA FROM THE LPS OR AR11. (OPTIONALLY USING DIGITAL IUFFER ADDRESS
	.ENDC

	.END
                                                                                                /O)
.SBTTL	CONDITIONAL ASSEMBLY PARAMETER EXPLANATIONS
;FG$	IF DF THIS WILL BE USED IN THE FOREGROUND.
;	IF NDF WILL BE USED                                                                                                                                 IN THE BACKGROUND OR SJ.

;LPS11$	IF DF THE HARDWARE IS THE LPS.
; OR
;AR11$	IF DF THE HARDWARE IS THE AR11.

;LPSDR$	IF                                                                                                                                 DF INCLUDE CODE FOR USING THE LPS DIGITAL I/O
; OR
;DR11K$	IF DF INCLUDE CODE FOR USING THE DR11K AS THE DIGITAL I/O
; OR
;S                                                                                                                                TVC$	IF DF USE THE DISPLAY CONTROL AS LIMITED DIGITAL I/O.
;	THE INPUT BIT IS 'ERASE RET L' AND THE OUTPUT BIT IS 'CHANNEL'.
.TITLE STACQ  SPIKE TRAIN ACQUISITION
;LAB APPLICATIONS-11
;DEC-11-SLABA-C-LA
;FILENAME STACQ.MAC
;FILE ID STACQ.1
.CSECT	S
;STDP$	IF DF THE OUTPUT DATA FORMAT IS DOUBLE PRECISION. THE FIRST
;	WORD IS THE NUMBER OF CLOCK OVERFLOWS. THE SECOND WORD ISTACQ

;COPYRIGHT (C) 1975
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR U THE
;	VALUE LEFT IN THE MAIN COUNTER.(CLOCK TICKS PAST LAST OVERFLOW)

;DO SOME CONDITIONAL ASSEMBLY PARAMETER CHECKING
	.ISE ONLY ON A
;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, F DF LPSDR$ & DR11K$
	ERROR=2DIOS	;ONLY ONE DIGITAL I/O UNIT ALLOWED
	.ENDC

	.IF DF LPS11$ & AR11$
	ERROR=2DEVICES	;LPS11 OL	R5
	CMP	R2,R5		;DOES DENOMINATOR FIT
	BHI	3$		;IF NOT, B+C(CARRY = 0)
	BLT	2$		;IF SO, B+C
	CMP	R3,R4		;IF HIGH EQUAL, CHOR ANY OTHER COPIES
;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTHANNEL BIT OF THE VC. N=1 IF STDP$ NDF.
;STOPAT: .WORD	N	;DIG OUTPUT BIT PATTERN WHEN STSTYP IS NONZERO
;	.ENDC
;	.ENDC
;STS1
	MOV	#STIM,(R1)+
	MOV	R2,@R1
	.ENDC
	.IF DF AR11$
	MOV	#CLKVEC,R1	;R1 -> VECTOR LOCATIONS
	MOV	#CLKIN,(R1)+
	MOV	R2,(R1TYP & STODAT ARE REQUIRED FOR PST ONLY.

;LPS	AR11			USE
;ST1	'ERASE RET'		STIMULUS AND/OR STARTUP
;ST2	'EXTERNAL EVENT'	RES)+
	.IF DF STVC$
	MOV	#STIM,(R1)+
	MOV	R2,@R1
	.ENDC
	.ENDC
	.IF DF DR11K$
	MOV	#DIVEC,R1	;R1 -> DIGITAL VECTORS
	MOV	#DOR AR11 CAN BE SELECTED
	.ENDC

	.IF DF	LPSDR$
	.IF NDF LPS11$
	ERROR=NOLPS	;LPS11$ MUST BE DEFINED FOR LPSDR
	.ENDC
	.ENPONSES OR SPIKES
;D OUT	CHANNEL BIT OR D OUT	INTERNAL STIMULUS OUTPUT
;D IN	D IN			STIMULUS OR SPIKES
.SBTTL STINT	INITIALIZDC

	.IIF DF LPSDR$ ! DR11K$	DIO$=1

	.IF DF DIO$ & STVC$
	ERROR=CAN'T USE VC BITS WHEN DIGITAL I/O IS AVAILABLE.
	.ENDC
ATION ROUTINE
;DOES THE FOLLOWING:
;1. .DEVICE FOR STATUS REG USED
;2. IF FOREGROUND, DO A .PROTECT ON FIRST CALL ONLY
;3. S
.SBTTL	MACROS, GLOBALS, & EQUATES
.MCALL	.REGDEF,..V2..,.DEVICE,.PROTECT,.INTENT,.SYNCH,.RSUM
.MCALL	$ADDEF,$SOB,$SPL
.REGDETUP INERRUPT VECTORS FOR DEVICES ASSEMBLED.
;4. FROM RATE, DETERMINE IF ISI, AND BUILD CLK STATUS WORD.
;5. COPY STOP COUNTEREF
..V2..
$ADDEF

;GLOBALS DEFINED LOCALLY
.GLOBL	STINT,STGO,STSTOP,STDPID,STEROR
.IIF DF DIO$	.GLOBL	STIDIG

;GLOBALS D, STSRT,STIMSK,STSTYP, & INIT SOME VALUES
;6. GET 2 BUFRS
;7. DO PROPER START UP
;8. RETURN WITH CLC IF NO ERRORS

STINT:	JEFINED EXTERNALLY
.GLOBL BAGET,BAREL,BASIZ,CTIBUF,CTIDON,SAVRG,RSTRG
.IIF DF FG$	.GLOBL	CTRUN

PS=177776
B5=40
B6=100
B7=SR	PC,SAVRG	;R1-R4
	CLR	R4		;START AT 0 FOR ERR IND
	MOV	#DLIST,R0	;R0 -> AREA FOR .DEVICE
	.DEVICE			;NOP OF SJ, NO ERR POSS200
B8=400
B9=1000
B10=2000
B12=10000
B14=40000
B15=100000
;PARAMETER TABLE STRUCTURE
;STNBSP: .WORD	N	;# OF STIMULUSES IBLE
	TST	(PC)+		;ONLY PROTECT ON 1ST CALL
FSTCAL:	0			;0 ON 1ST CALL, NON-ZERO AFTER
	BNE	NOPRO
	INC	FSTCAL
	MOV	#PROTAR,RTO COUNT BEFORE STOPPING
			;(SPIKES FOR ISI)
;STRATE: .BYTE	1-5,7	;CLOCK RATE (NEG FOR ISI)
;STSRT:  .BYTE		;TYPE OF STARTUP1	;R1 -> AREA FOR .PROTECT
	MOV	R1,R0
	.PROTECT		;CLOCK
	BCS	ERR2		;ALREADY PROTECTED
	.IF DF DIO$
	MOV	R1,R0
	.PROTECT ,#
;		-1	;IMMEDIATELY ON ENTRY (STINT CALLS STGO)
;		0	;AFTER ST1 (ENABLE ST1 INTERRUPTS)
;		+1	;PROGRAM CONTROL (USER CALLS STDIVEC
	BCS	ERR0
	.ENDC
	.IF DF	LPS11$
	MOV	R1,R0
	.PROTECT ,#ADVEC	;USED FOR CLOCK OVERFLOW
	BCS	ERR3
	.ENDC
	.IF DF STVGO)
;	.IF DF DIO$
;STIMSK: .WORD	0	;DETECT RESPONSES ON ST2(SPIKES ISI)
;		N	;DETECT THEM FROM DIG INPUT WHERE N IS THE BITMAC$
	MOV	R1,R0
	.PROTECT ,#VCVEC
	BCS	ERR0
	.ENDC
NOPRO:	MOV	#340,R2		;VECTOR PRIORITY 7 !!!
	.IF DF LPS11$
	MOV	#ADVEC,R1SK
;	.IF DF DIO$ ! STVC$
;STSTYP: .WORD	0	;STIMULUS DETECTED ON ST1. IF STVC$ IS DF
			;THEN DETECTED ON VC BIT FOR 'ERASE RE	;R1 -> VECTOR LOCATIONS
	MOV	#OVRFLO,(R1)+	;USED FOR CLK OVERFLOW
	MOV	R2,(R1)+	;PS VALUE
	MOV	#CLKIN,(R1)+	;CLOCK ROUTINE
T L'
;		N	;INTERNALLY GENERATED STIMULUS PULSES ON EVERY NTH
			;CLOCK OVERFLOW & APPLIES A SIGNAL TO DIG OUTPUT
			;OR THE C	MOV	R2,(R1)+
	.IF DF LPSDR$
	MOV	#DIGIN,(R1)+	;DIG INPUT ROUTINE
	MOV	R2,(R1)+
	.ENDC
	.ENDC
	.IF DF STVC$
	MOV	#VCVEC,RNT NEED PATTERN IF 0
	MOV	(R5)+,(PC)+	;DIG OUTPUT PIT PATTERN
STOPAT:	0
	.ENDC
6$:	.IIF DF AR11$ CLR CNTCLK ;AR11 EXTENDED CLE PROCEEDS BY INTERRUPTS UNTIL STOPPED BY
;SOME EXTERNAL CONDITION(CALL TO STSTOP,CLK OVERFLOW, ERROR CONDITION).

STGO:	.IIOUNTER
	MOV	BASIZ,R3	;GET BUFFER SIZE
	CLR	BUFPAS		;NO BUFR TO PASS
	MOV	#OUTCTR,R0	;R0 -> OUTPUT COUNTER
	MOV	R3,@R0		;# OFF DF LPS11$ MOV #B6+B5,@#ADSAD ;CLK OVERFLOW ENABLE
	.IF DF DIO$
	TST	STIMSK		;SHOULD WE ENABLE DIG INPUT?
	BEQ	2$
	MOV	#177 WDS LEFT TO FILL
	.IIF DF STDP$ ASR @R0	;HALF FOR D.P.
	MOV	@R0,(PC)+	;VALUE TO RESTORE OUTCTR
SIZE:	0
	MOV	#BUF1,R0	;PRIMA77,@#DIBUF	;YES, CLR INPUT REG.
	MOV	#B6,@#DIOSAD	;ENABLE INPUT INTERRUPTS
	.ENDC
2$:	.IF DF STVC$
	TST	ISIFLG
	BNE	3$
	MORY OUTPUT BUFR ADDR.
	JSR	PC,BAGET
	BCS	ERR1
	MOV	BUF1,OUTPTR	;INIT OUTPUT POINTER
	MOV	#BUF2,R0	;SECONDARY OUTPUT BUFR ADDRV	#B6+B12,@#VCSTAT ;ERASE RTN FOR PST ONLY
	.ENDC
3$:	MOV	CLKSR,@#CLKSAD	;ENABLE CLOCK & CLR FLAGS
	RTS	PC

	.IF DF LPS11$ .
	JSR	PC,BAGET
	BCS	ERR1
	NEG	R3
	MOV	R3,LBI		;- # OF WDS IN BUFR
	CLR	STEROR		;ZERO SOME FLAGS
	CLR	ERRF
	CLR	@#CLKBUF	! STVC$
.SBTTL GOIN	STARTUP ROUTINE VIA ST1 OR ERASE RETURN BIT

GOIN:	.IIF DF LPS11$ MOV #CLKIN,@#CLKVEC ;SET CLK INTERRUPT IGIN,(R1)+
	MOV	R2,(R1)+
	.ENDC
	CLR	ISIFLG		;0 FOR PST, NON 0 FOR ISI
	MOV	(R5)+,STNBSP	;STOP COUNTER

;THE CLOCK STATUS ;ALWAYS COUNTS FROM ZERO
	TSTB	(PC)+		;CHECK TYPE OF STARTUP
STSRT:	0
	BGT	18$		;USER WILL CALL STGO
	BMI	12$		;START NOW
	WORD SHOULD HAVE THE FOLLOWING BITS ON:
; LPS	PST	B14+B9+B6+RATE+1
;	ISI	B9+B8+B6+RATE+1
; AR11	BOTH	B14+B8+B6+RATE+1

	MOV.IF DF LPS11$
	MOV	#GOIN,@#CLKVEC	;GO INTERRUPT FROM ST1
	MOV	#B14,@#CLKSAD	;ST1 ENABLE
	.ENDC
	.IF DF STVC$
	MOV	#GOIN,@#VB	(R5)+,R3	;CLK RATE 1-5,7
	ASL	R3		;PROPER BIT POSITION FOR CLK
	.ENABL LSB
	BPL	4$		;NEG OF ISI
	INC	ISIFLG		;DOING ISI TYCVEC
	MOV	#B6+B12,@#VCSTAT ;ERASE RET ENABLE & ERASE TO CLR F/F
	.ENDC
	BR	18$
12$:	JSR 	PC,STGO
18$:	CLC			;NO ERRORS
20$PE ACQUISITION
	NEG	R3		;POS CLK VALUE NOW
	.IF DF LPS11$
	BIS	#B9+B8+B6+1,R3	;COUNT FROM ZERO BASE, MODE ENABLE, GO
	BR	5$:	JSR	PC,RSTRG
	RTS	PC

ERR3:	INC	R4		;ADVEC ALREADY PROTECTED
ERR2:	INC	R4		;CLOCK ALREADY PROTECTED
ERR1:	INC	R4		;NO OUT
4$:	BIS	#B14+B9+B6+1,R3	;EXTERNAL EVENT OR ST1 FOR PST
5$:	.IFF
4$:	BIS	#B14+B8+B6+1,R3	;AR11 IN MODE 1
	.ENDC
	MOV	R3,(PC)PUT BUFFERS AVAILABLE
ERR0:	MOV	R4,R0		;DIG IN ALREADY PROTECTED OR VC
	BR	20$		;CARRY SET ON ERROR.
	.DSABL LSB
DLIST:	.BYT+	;BUILT CLK STATUS WORD
CLKSR:	0

	MOVB	(R5)+,STSRT	;TYPE OF STARTUP
	.IF DF DIO$
	MOV	(R5)+,STIMSK	;SPIKE INPUT BIT MASK,E	0,12.		;.DEVICE CODE
	DEVADR			;ADDR OF WORD PAIRS
DEVADR:	CLKSAD,0
	.IIF DF LPS11$	ADSAD,0
	.IIF DF DIO$	DIOSAD,0
	.IIF 
				;IF 0 DONT NEED TO ENABLE DIO
	.ENDC
	TST	ISIFLG		;IF 0 THEN PST
	BNE	6$
	.IF DF DIO$ ! STVC$
	MOV	(R5)+,STSTYP	;TYPEDF STVC$	VCSTAT,0
	0			;TERMINATED BY 0 ADDR.
PROTAR:	.BYTE	0,25.		;.PROTECT CODE
	CLKVEC			;VECTOR LOC TO PROTECT
.SBTTL S OF STIMULUS PULSES
	BEQ	6$
	.IIF NDF STDP$ MOV #1,STSTYP
	MOV	STSTYP,TYPCTR	;SET COUNTER
	.ENDC
	.IF DF DIO$
	BEQ	6$		;DOTGO	ENABLE INTERRUPTS FOR DATA COLLECTION
;AFTER STINT IS CALLED THIS ROUTINE ENABLES THE PROPER INTERRUPTS
;SO THAT THIS MODU		;SO THAT THE RTI AFTER .INTENT WILL
				;RTS PC FORM STSTOP.
	BR	FULL		;PASS LAST BUFR.

KILL:	.IIF DF STVC$	CLR	@#VCSTATRTUP.

;FOR THE AR11:
;THE MODE FLAG (BIT7) IS THE CLK OVERFLOW CONDITION AND BIT15 IS THE
;EXTERNAL EVENT FLAG. FOR OVERFLO
	.IIF DF DIO$	CLR	@#DIOSAD
	.IIF DF LPS11$	CLR	@#ADSAD
	CLR	@#CLKSAD	
	.IIF DF STDP$ ASL OUTCTR ;BY 2 FOR DP
	ADD	OUTCTR,LBW AN INTERNAL COUNTER IS INCREMENTED
;TO EXTEND THE AR11 8 BIT COUNTER TO 16 BITS. THE EXTERNAL
;EVENT (SPIKES) CAUSES THE CLKI	;REDUCE BY # LEFT
	NEG	LBI		;NOW + FOR LAST BUFR.
	RTS	PC

	.IF DF DIO$
.SBTTL DIGIN	DIGITAL INPUT INTERRUPT SERVICE ROUT CTR TO BE PLACED INTO THE OUTPUT BUFFER.
;FOR PST, THE STIMULUS PULSES MUST COME FROM DIG INPUT OR ERASE RETURN.

CLKIN:	TSTINE
;ONCE THE MODULE HAS BEEN INITIALIZED AND STARTED, THIS ROUTINE
;CHECKS TO SEE IF THE DIGITAL INPUT REG CONTAINS ANY BITS B	@#CLKSAD	;WAS IT THE MODE FLAG?
	BMI	MODE		;YES
	BIC	#B15,@#CLKSAD	;NO, CLR ST1 OR EXTERNAL EVENT FLAG
	.IIF DF AR11$ BR ARWHICH
;MATCH THE DIGITAL INPUT BITMASK "STIMSK". IF NOT, THE ROUTINE
;JUST RETURNS. IF ANY BITS MATCH, A ST2 INTERRUPT IS CAUSIN	;AR11 EXTERNAL EVENT

	;THE INTERRUPT FOR ERASE RETURN SIGNAL IS USED AS A
	;SUBSTITUTE FOR LPS ST1 COMES HERE.
STIM:	CLRED FOR LPS OR
;THIS IS A SPIKE OR RESPONSE WHEN USED WITH AR11. IN ANY CASE THE
;CURRENTLY READ DIGITAL INPUT REG IS SAVED IN 	-(SP)		;0 IN BUF MEANS STIMULUS PULSE
	.IIF DF STDP$ CLR -(SP)
	.IIF DF STVC$ BIS #B12,@#VCSTAT ;ERASE BIT TO REENABLE INTERRGLOBAL "STIDIG".

DIGIN:	MOV	@#DIBUF,(PC)+	;READ INPUT REG.
STIDIG:	0			;CURRENTLY READ IN VALUE
	MOV	STIDIG,@#DIBUF	;CLEAR UPT
STIM1:	DEC	@#CLKSAD	;STOP CLOCK ALSO CLEARS CLKCTR
	CLR	@#CLKBUF
	INC	@#CLKSAD	;RESTART CLK AT 0
	.IIF DF AR11$ CLR CNTCINPUT REG
	BIS	#B6,@#DIOSAD	;REENABLE INTERRUPTS
	BIT	STIDIG,(PC)+	;SEE IF ANY MASK BITS ON
STIMSK:	0			;DIGITAL INPUT BITMASLK ;HIGH BYTE CTR
	.IIF DF STDP$ CLR OVRCTR ;CLK OVERFLOW COUNTER
	DEC	(PC)+		;COLLECTED ENOUGH DATA?
STNBSP:	0			;# OF STIMUADDR.
	.IIF DF STVC$ MOV #STIM,@#VCVEC
	JSR	PC,STGO		;ENABLE INTR FOR DATA COLECTION
	TST	ISIFLG		;IS THIS FOR PST?
	BEQ	STIK
	BEQ	2$		;BR IF NO MASK BITS ON
	.IIF DF LPS11$	BIS #B10,@#CLKSAD ;SET MAINT ST2,
				;SO THE INTERRUPT WILL READ CLK
	.IIM		;YES, OUTPUT 0 FOR STIMULUS
	RTI
	.ENDC

.SBTTL STSTOP	DISABLE INTERRUPTS & PASS LAST BUFFER
;THIS ROUTINE MAY BE CALLEDF DF AR11$ BR ARIN	;RESPONSE FOR PST, SPIKE FOR ISI
2$:	RTI
	.ENDC

.SBTTL CLKIN	CLOCK INTERRUPT SERVICE ROUTINE
;FOR THE L AT ANYTIME TO STOP ACQUISITION. THIS
;IS DONE BY DISABLING ALL INTERUPTS. THE CURRENT BUFFER IS LABELED AS
;AS THE LAST AND PPS:
;THE SPIKES OR RESPONSES ARE RECIEVED FROM ST2 INTERRUPTS MODE FLAG
;BIT7. THE CLK COUNTER IS TRANSFERRED TO BUFFER PRESETASSED TO THE CTRL MODULE. IF THERE IS A 2ND BUFFER
;IT WILL BE RELEASED.

STSTOP:	JSR	PC,KILL		;STOP EVERYTHING
	MOV	(SP)+,S
;REG BY THE INTERRUPT AND THIS ROUTINE READS THE CLK VALUE  PLACING
;IT INTO THE OUTPUT BUFFER. THE STIMULUS PULSE COMES IN OTSRT	;SAVE PC OF JSR
	MOV	@#PS,-(SP)	;SETUP STACK SO THAT .INTENT WILL WORK
	MOV	STSRT,-(SP)	;PUT PC OF SUBR CALL ON STACK
		N ST1
;B15 FOR PST AT WHICH TIME THE CLK IS STOPPED, RESTART CLOCK AT 0,
;STORE 0 IN BUFFER. FOR ISI, ST1 IS ONLY USED FOR STA LPS11$
MODE:	BIC	#B7,@#CLKSAD	;CLR MODE FLAG
	MOV	@#CLKBUF,-(SP)	;CLK VALUE OF RESPONSE OR SPIKE
	.ENDC

	.IF DF AR11$
AR	.IFF
	BCC	RTN		;NOT D.P. OR 16 BIT OVERFLOW, JUST RTI
	.ENDC
	.ENDC
	.IF DF DIO$ ! STVC$
	TST	ISIFLG		;SHOULD WE GENERATE IN:	MOV	@#CLKCTR,-(SP)	;READ CLK DIRECTLY
	ADD	CNTCLK,@SP	;HIGH ORDER BITS
	.ENDC
	BNE	1$		;HAVE NO RESP VALUE OF 0
	TST	ISISTIMULUS PULSE?
	BNE	1$		;ONLY FOR PST, ISI STOP IF NOT D.P.
	TST	(PC)+		;IF 0 DONT OUTPUT ANYTHING
STSTYP:	0			;TYPE OF STIMFLG		;ONLY FOR PST
	BNE	1$
	INC	@SP
1$:	.IF DF STDP$
	MOV	(PC)+,-(SP)	;HIGH ORDER WORD
OVRCTR:	0
	.ENDC
	TST	(PC)+		;IF IULUS PULSES
	BEQ	1$		;STOP IF STDP$ NOT DF
	DEC	(PC)+		;YES, BUT THIS OVERFLOW?
TYPCTR:	0			;CTR FOR INTERNAL STIMULUS PULSESSI,
ISIFLG:	0
	BNE	STIM1		;COUNT # OF SPIKES & CLR CLOCK VALUES

.SBTTL INSERT	PUT VALUE INTO OUTPUT BUFR FROM STACK
;, UPD.
	BNE	RTN		;NO
	MOV	STSTYP,TYPCTR	;YES, RESET COUNTER &

.SBTTL	INTERNAL STIMULUS PULSE
;WHEN THE STIMULUS PULSES ARE GENEATE BUFR POINTERS AND SEE IF BUFR FULL
INSERT:	MOV	(SP)+,@OUTPTR	;STORE VALUE IN BUFR
	ADD	#2,(PC)+	;BUMP PTR
OUTPTR:	0			;PTRATED BY THIS ROUTINE,
;A SIGNAL WILL BE APPLIED TO THE DIGITAL OUTPUT REGISTER ON BITS
;SPECIFIED IN 'STODAT'. IF THE VC IS UR INTO CURRENT BUFR
	.IF DF STDP$
	MOV	(SP)+,@OUTPTR	;2ND D.P. VALUE
	ADD	#2,OUTPTR
	.ENDC
	DEC	(PC)+		;ANY MORE ROOM IN BUSED, THEN THE OUTPUT SIGNAL
;WILL BE THE CHANNEL BIT (BIT 9). THIS IS FOR PST ONLY.
;THE CLOCK WILL BE ZEROED & STARTED.
;A ZFR
OUTCTR:	0			;# OF WORDS LEFT TO FILL BUFR
	BEQ	FULL		;PASS FULL BUFR
RTN:	RTI

.SBTTL OVRFLO	CLOCK OVERFLOW ROUTINE
;THERO WILL BE PLACED IN OUTPUT BUFR TO INDICATE STIMULUS PULSE.

	.IF DF DIO$
	CLRB	@#DIOSAD+1	;CLR OUTPUT FLAG
	MOV	STOPAT,@#IS ROUTINE IS THE INTERRUPT SERVICE ROUTINE FOR THE LPS
;CLOCK OVERFLOW. IT IS REALLY THE INTERRUPT FROM THE A/D CONVERTER ON
DOBUF	;LOAD STIMULUS PULSE BITS
	.IFF
	BIS	#B9,@#VCSTAT	;OUTPUT SIGNAL ON CHANNEL BIT
	BIC	#B9,@#VCSTAT	;CAUSES A TRANSITION;A CLOCK OVERFLOW. IT WILL CONVERT A CHANNEL THEN INTERRUPT.
;IF STDP$ IS NOT DEFINED, THE OVERFLOW WILL STOP ACQUISITION. THIS
	.ENDC
	BR	STIM		;PLACE 0 IN BUFR
	.ENDC

1$:	.IIF DF STDP$	RTI
2$:	JSR	PC,KILL		;STOP ALL ACQ IF WE OVERFLOW
	INC	STEROR
;SHOULD NOT OCCURE FOR PROPER USE. IF STDP$ IS DEFINED,
;THEN AN INTERNAL OVERFLOW COUNTER IS INCREMENTED UNTIL IT OVERFLOWS		;THIS STOP IS AN ERROR
				;PASS LAST BUFR

.SBTTL FULL	PASS A FULL (OR LAST) BUFFER TO THE CONTROL MODULE
	.ENABL LSB
FU
;AT WHICH TIME ACQUISITION IS ALSO STOPPED.

	.ENABL LSB
OVRFLO:	.IF DF STDP$ & LPS11$
	INC	OVRCTR		;BUMP # OF OVERFLOWS
	LL:	TST	(PC)+		;IS ACQ TOO FAST?
BUFPAS:	0			;ADDR OF BUFR TO PASS
	BEQ	2$		;0 IF ALREADY PASSED
	JSR	PC,KILL		;IF SO, STOP ALI OR SPIKES TO CNT BEFORE STOP
	BNE	INSERT		;NO
	JSR	PC,KILL		;YES, STOP
	MOV	#1,OUTCTR	;FORCE A BR TO FULL
	.IF DF STDP$
BEQ	2$		;STOP IF BECOMES 0
	.ENDC
	.IF DF AR11$
MODE:	BIC	#B7,@#CLKSAD	;CLK OVERFLOW FLAG
	ADD	#400,(PC)+	;CLK OVERFLOW, 256	ADD	#2,LBI		;2 WORDS FOR LAST VALUE
	.IFF
	INC	LBI		;COUNT LAST VALUE
	.ENDC
	BR	INSERT		;PUT LAST VALUE INTO BUFR
	.IF DF TO INTERNAL CTR
CNTCLK:	0			;EXTENDS AR11 CLK COUNTER
	.IF DF STDP$
	ADC	OVRCTR		;D.P. CTR
	BEQ	2$		;STOP IF BECOMES ZERO
L	5
	TST	(PC)+		;IF + WE ARE ON LAST BUFR
LBI:	0			;-# OF WDS IN BUFR, + FOR LAST
	BMI	11$
	DEC	CTIDON		;CTRL MOD DONE COUNT11K VECTOR ADDR.
MAXRR$=12	;USED ONLY BY THE THROUGHPUT PROGRAM FOR THE
		;MAXIMUM # OF ENTRIES IN THE ROUND ROBIN TABLE.
;FGCQ
	INC	ERRF		;SET TOO FAST FLAG
	RTI
2$:	MOV	BUF1,BUFPAS	;GET BUFR TO PASS
	MOV	BUF2,OUTPTR	;SWITCH BUFFER 2 TO PRIMARY
	MER
11$:	CLR	BUFPAS		;READY TO PASS BUFR
	RTS	PC		;RTI, BECAUSE OF .INTENT

	.IF DF FG$
SYNFAIL:JSR	PC,KILL		;STOP ACQ.
	INOV	BUF2,(PC)+
BUF1:	0			;PRIMARY BUFFER ADDR.
	BNE	4$		;IF 0 MEANS NO SECOND BUFR
	JSR	PC,KILL		;STOP & PASS LAST BUFR
4$:	MC	ERRF		;WILL FORCE TO PASS LAST BUFR.
	INC	CTRUN		;SO WE DONT TRY ANOTHER .SYNCH
	BR	9$		;THIS WILL PASS LAST BUFR AND EXIT
OV	SIZE,OUTCTR	;RESET OUTPUT COUNTER
	.INTENT	5		;LOWER PRIORITY WHILE WE PASS
				;& GET THE NEW BUFFER
5$:	MOV	R0,-(SP)	;SA				;GRACEFULLY
SYNAR:	0,2,0,0,0,-1,0		;STORAGE FOR .SYNCH
	.ENDC
	.END
                                                  VE R0-R2
	MOV	R1,-(SP)
	MOV	R2,-(SP)
	MOV	BUFPAS,R1	;BUFFER ADDR
	MOV	(PC)+,R0	;DATA PATH I.D.
STDPID:	0			;SET BY CALLER, .NLIST
.TITLE	THRASM	CONDITIONAL ASSEMBLY PARAMETERS FOR 'THRU' PROGRAM.
;LAB APPLICATIONS-11
;DEC-11-SLABA-C-LA
;FILENAME TOTHERWISE 0
	MOV	LBI,R2		;# OF WORDS IN BUFR, LBI
	JSR	PC,CTIBUF	;PASS BUFR TO CTRL MOD
	BCC	6$		;IF ACCEPTED, BR
	JSR	PC,KIHRASM.MAC
;FILE ID THRASM.1

;THIS FILE CONTAINS THE CONDITIONAL ASSEMBLY PARAMETERS FOR THE
;THROUGHPUT PROGRAM.  TO CONFIGLL		;IF NOT, SHUT DOWN
	MOV	R1,R0		;ADDR OF BUF NOT ACCEPTED
	JSR	PC,BAREL	;RELEASE IT
	BR	8$		;CTRL MOD MADE PREVIOUS BUFR TURE A SYSTEM, IT IS ONLY NECESSARY TO
;ELIMINATE THE SEMICOLON TO THE LEFT OF THOSE PARAMETERS
;ONE WISHES DEFINED OR INSERT AHE LAST
6$:	TST	LBI		;DONT GET BUF2 WHEN PASSING LAST BUFR
	BPL	7$
	MOV	#BUF2,R0	;LOC TO STORE 2ND BUFR ADDR
	JSR	PC,BAGET	; SEMICOLON PRECEDING
;THE PARAMETERS NOT WANTED.  IF THAT PARAMETER IS DEFINED IT
;WILL INCLUDE CODE AND/OR ENABLE THE FEATUREGET BACK-UP BUFR
	BCC	8$
7$:	CLR	(PC)+		;NO SPACE,STOP WHEN CURRENT BUFR FULL
BUF2:	0			;ADDR OF SECONDARY BUFR
8$:	MOV	(SP) DISCRIBED.
;THE PARAMETERS DEFINED ARE THOSE USED BY THE SUPPLIED VERSION OF
;THE 'THRU' PROGRAM.

	;GENERAL HARDWARE USAGE+,R2	;RESTORE REGS
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	.IF DF FG$
	TST	CTRUN		;IS CTRL MOD RUNNING?
	BNE	9$
	.SYNCH	#SYNAR		;NO, 

LPS11$=10	;SET = MAXIMUM NUMBER OF DATA PATHS USED BY CONSAM
;AR11$=10	;SAME AS LPS11$ BUT FOR THE AR11
LPSDR$=1	;CODE FORUSES R4 & R5
	BR	SYNFAIL		;SYNAR ERROR RTN
	INC	CTRUN		;SAYWE DID A .SYNCH
	.RSUM
	.ENDC
9$:	$SPL	7		;* NO INTERRUPTS WHILE USING LPS DIGITAL INPUT & OUTPUT
;DR11K$=1	;LIKE LPSDR$ EXCEPT DR11K
;LVN40$=1	;CPU IS PDP-11/40 OR PDP-11/35
;LVN45$=1	;CPU CHECKING ERRORS
	TST	(PC)+		;RUNNING TOO FAST?
ERRF:	0			;NON-ZERO WHEN RUNNING TO FAST
	BEQ	10$
	INC	(PC)+		;SET GLOBAL ER IS PDP-11/45
;EIS=1		;EXTENDED INSTRUCTION SET (KE11-E)
;EAE=1		;INDICATES EAE (KE11-A OR KE11-B)
;ADSR$=170400	;DEFAULT A/DROR FLAG
STEROR:	0
	CLR	ERRF
	$SPL	5		;BACK TO .INTENT LEVEL
	MOV	BUF1,BUFPAS
	BR	5$		;PASS TOO FAST BUFR AS LAST
10$:	$SP STATUS REG. ADDR.
;ADVEC$=340	;DEFAULT A/D VECTOR ADDR
;DRSR$=167770	;DEFAULT DR11K STATUS REG. ADDR
;DRVEC$=300	;DEFAULT DRMULATE EIS	DIV
	.ENDC
TPCLS$=1	;CLOSE SUBROUTINE "TPCLS" INCLUDED
	.IF DF MODE1$
BAMLT$=1	;GET AND RELEASE MULTIPLE CONTIGUO



	.MCALL ..V2..,.REGDEF,$OUTDEF,$SOB,.PRINT,.TTYIN,.TTYOUT
	..V2..
	.REGDEF
	$OUTDEF



	;EXTERNAL GLOBALS


.GUS BUFFERS
	.ENDC
.LIST
                                                                                                     LOBL	CTNOFD,CTNOFB				;PERTAINENT TO C.T. MOD.
						; FROM DIRKTR PROGRAM
.GLOBL	CSMODE,CSNOFC,CSRATE,CSTICK,CSNOFB	;PERTAINE                                                                                                                                NT TO C.S. MOD.
.GLOBL	CSTYPE,CSCHGP,CSDOUT,CSSOUT,CSHOUT	; FROM DIRKTR PROGRAM
.GLOBL	CSSTOP,CSSIN,CSHIN,CSRRCT,CSRRTB,CSTART                                                                                                                                
.GLOBL	PROGSS					;PROGRAMMED START/STOP
						; FLAG FROM DIRKTR PROGR
.GLOBL	BAINT,BASIZ,BALL			;GLOBALS FROM B.A. MOD.
.$=1		;MODULES USED IN THE FOREGROUND

	;CONTRL		CONTROL MODULE

MAXDP$=10	;DEFINED = TO THE MAXIMUM # OF DATA PATHS TO BE US                                                                                                                                ED
		;SINCE THERE IS ONLY ONE ACQUISITION MODULE, THIS
		;PARAMETER SHOULD EQUAL LPS11$ OR AR11$.

	;CONSAM		CONTINUOUS SAMP.TITLE INITIALIZATION ROUTINE
;LAB-APPLICATIONS-11
;DEC-11-SLABA-C-LA
;FILENAME INTLIZ.MAC
;FILE ID INTLIZ.5


.CSECT	INTLING

MODE1$=1	;SINGLE RATE AND CONTROL MODE
MODE2$=1	;MULTI-RATE AND CONTROL MODE
MODE3$=1	;ROUND ROBIN MODE
	.IF DF MODE1LIZ

;COPYRIGHT (C) 1975
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR US$
AUTOG$=1	;GAIN RELATED CODE
DMA$=1		;CODE FOR SINGLE CHANNEL DMA
	.IF DF DMA$
DUAL$=1		;DUAL SAMPLE & HOLD DMA
	.IF DF DUE ONLY ON A
;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OAL$
DSORT$=1	;FOR DUAL SAMPLE & HOLD DMA, DATA IS SORTED
	.IF DF DSORT$
;INPLC$=1	;IF DSORT$ IS DF, ONLY 2 BUFFERS ARE SORTEDR ANY OTHER COPIES
;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTE IN PLACE
	.ENDC
	.ENDC
	.ENDC
	.ENDC

	;THE FOLLOWING PARAMETERS ARE FOR THE TTYR11, QA, OUTF,
	;GENS,TPUT AND BUFALL MOM AND TO ONE WHO AGREES
;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE
;SHALL AT ALL TIMES REMAIN IN DEC.

DULES.
	;THEY SHOULD NOT BE CHANGED.

RT11$=1		;RT-11 O.S. REQUIRED
QAMIX$=1	;MIXED INPUT
QAALP$=1	;ALPHANUMERIC INPUT
QAS;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
;COMMITMENT BY DIGITALDO$=1	;SINGLE, DOUBLE, OCTAL INPUT
FORTX$=1	;ASCII TEXT OUTPUT
FORSP$=1	;SINGLE PRECISION OUTPUT
SAVRG$=1	;SAVE AND RESTORE R EQUIPMENT CORPORATION.

;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
;ITS SOFTWARE ON EQUIPMENT WHICH IS NOTEG
LISTC$=1	;LIST COMPARE
MULT$=1		;UNSIGNED MULTIPLY
DIV$=1		;DIVIDE
	.IF NDF EIS
MULR0$=1	;SIMULATE EIS	MUL
DIVR0$=1	;SI SUPPLIED BY DEC.

;LDP SOFTWARE DEVELOPMENT, JUNE 1975
	.SBTTL	MACROS FROM SYSMAC,GLOBALS,CONDITIONAL ASSEMBLY PARAMETERS
 CONTINUOUS SAMPLING MODULE UNDER MODE #3). IT MUST BE
;	DEFINED ONLY IF MODE #3 TYPE SAMPLING IS BEING REQUESTED.

	.IF	NDF,
	MOV	X2,MESAGE	;GET ADDRESS OF MAIN TEXT
	MOV	X3,R3		;GET COUNT OF ITEM TO HANDLE
	MOV	X4,R2		;GET ADDRESS IN TEXT OF VARIABMAXRR$
	MAXRR$=0
	.ENDC

;FG$,LPSDR$,DR11K$,AND MAXDP$ ARE ALSO USED BY THIS PROGRAM.  FOR THEIR
;	MEANING, PLEASE CONSULT LE NUMBER
	JSR	PC,X5		;GO SET UP TABLE 
	.ENDM
	.SBTTL	INTLIZ-BABEGN SECTION TO PARAMETERIZE AND INITIALIZE
		;THE BUFFER ATHE MODULES MANUAL, SINCE THE MODULES
;	DETERMINE HOW OR IF THESE PARAMETERS ARE TO BE DEFINED.

	.SBTTL	MACROS PECULIAR TO LLOCATION MODULE
		;THE ONLY PARAMETER VALUE REQUIRED FROM THE USER IS
		;"BASIZ".




OVRLA1:	CLRB	TTYICH		;SET INPUT TOTHIS ROUTINE
		;CHECK PROVIDES TO PROCEDURE NECESSARY TO GET A 
		;PARAMETER VALUE FROM A USER FOR THE CONTROL AND
		;CONTINU COME FROM TERMINAL
	CLRB	TTYOCH		;SET OUTPUT TO GO TO THE TERMINAL
	MOV	#OVRLA1,BALL	;SET LOWER LIMIT TO FREE CORE FOR BUFFEROUS SAMPLING MODULES.
		;SETUPT PROVIDES THE PROCEDURE NECESSARY TO GET A
		;TABLE OF PARAMETER VALUES FOR THE CONTINUOUS
		;S
				; TO BE START OF THIS OVERLAY.  THIS 
				; INSTRUCTION MAKES THE ORDER OF LINKING
				; THIS OVERLAY CRUCIAL, IN THAT,SAMPLING MODULE.




.MACRO	CHECK Z0,Z1,Z2,Z3,Z4,?Z5,?Z6,?Z7 ;GETS PROPER VALUE FOR TABLE
	.ENABL	LSB		; OLD
	TST	NDFLAG	 THIS
				; PROGRAM MUST BE LINKED FIRST TO OBTAIN
				; MAXIMUM CORE UTILIZATION DURING DATA
				; ACQUISITION.
BABEGN:	JSR	;CHECK IF A USER RESPONSE IS NECCESSARY
	BEQ	Z5		;FOR ENTRY. IF SO, BRANCH
	CMP	Z1,NDFLAG	;CHECK IF THIS LINE NEEDS A RESPONS	R5,QA
	1000
	BAINMS			;INDICATE B.A. MODULE INITIALIZATION
BUFINT:	MOV	#BAMSAD,MESAGE	;SET ADDRESS OF BUFFER SIZE MESSAGE
	GLOBL	CTINIT					;C.T. MOD INIT. ADDR.
.GLOBL	CSINIT					;C.S. MOD. INIT. ADDR.
.GLOBL	TPOPN,TPCHN,TPWRT			;GLOBALS FORM T.P. E
	BNE	Z6		;IF NOT, BRANCH
	CLR	NDFLAG		;OTHERWISE, SIGNAL TO RESPONSE HEREAFTER
Z5:	MOV	Z2,MESAGE	;SET TEXT ADDRESS FOR PROMMOD.
.GLOBL	QA,QAERR,QADATF,QABUFP,QAANS		;QA MODULE GLOBALS
.GLOBL	CRLF,TTYOCH,TTYICH			;GLOBALS FROM T.I. MOD.
.GLOBL	FORMAPT
	.IF	B,Z4
	MOV	Z3,VALUE	;SUPPLY OLD VALUE 
	.IFF
	CLR	VALUE		;SUPPLY OLD VALUE
	MOVB	Z3,VALUE	; IN WORD
	.IF	IDN,Z0,GETT					;OUTPUT FORMATTER ADDRESS

	.IF	NDF,FG$
.GLOBL	TTYCHK					;ROUTINE TO CHECK FOR 
						; TERMINAL INPUT WHEN
						; ABS
	BPL	Z7		;IF POSITIVE, BRANCH
	BIS	#177400,VALUE	;EXTEND SIGN IN BYTE TO GET IT PRINTED
	.ENDC
	.ENDC
Z7:	JSR	PC,Z0		;LPROGRAMMED START/STOP
	.ENDC					; IS SELECTED.


	;INTERNAL GLOBALS

.GLOBL	OVRLA1					;OVERLAY START ADDRESS


	;CONDOOK FOR A NEW VALUE
	BCS	Z6		;IF NONE WAS SUPPLIED, BRANCH
	.IF	B,Z4
	MOV	R0,Z3		;OTHERWISE, UPDATE VALUE
Z6:	MOV	Z3,(R5)+	;ITIONAL ASSEMBLY PARAMETERS NEEDED

;MAXRR$ IS THE ONLY PARAMETER WHICH IS DIRECTLY APPLICABLE TO THE PROGRAM
;	AND IS NOT DIPUT VALUE IN PARAMETER TABLE
	.IFF
	MOVB	R0,Z3		;OTHERWISE,UPDATE VALUE
Z6:	MOVB	Z3,(R5)+	;PUT VALUE IN PARAMETER TABLE
	.ENRECTLY INVOLVED IN THE MODULES THEMSELVES.  IT 
;	REPRESENTS THE TOTAL NUMBER OF POSSIBLE ENTRIES IN A ROUND ROBIN
;	TABLE(SEEDC
	.ENDM


.MACRO	SETUPT X1,X2,X3,X4,X5	;SETS UP FOR AND CALLS PTABWD OR PTABYT
	MOV	X1,R4		;GET ADDRESS OF PRESENT VALUESMOV	BASIZ,R0	;GET DESIRED BUFFER SIZE IN R0 
	JSR	PC,BAINT	; GO INITIALIZE B.A. MODULE
	BCC	CTBEGN		;IF NO ERRORS, BRANCH AND S	CT5		;IF NO CHANGE INDICATED, BRANCH
	JSR	PC,QCHANG	;OTHERWISE, FIND OUT WHICH QUES. TO CHANGE
	BCS	CT4		;IF IMPROPER RESPONCONTINUE
	.PRINT	#INTERM		;OTHERWISE, INFORM USER OF ERROR
	BR	BUFINT		; AND RESTART PROCEDURE

INTERM:	.ASCIZ <15><12>/MODUSE, ASK FOR CHANGES
	JSR	R5,QA		;RESET QA MODULE TO RIGHT MODE
	11000			;OUTPUT CRLF
	BR	CT1		; GO LOOK FOR NEW VALUE



LE INITIALIZATION ERROR./
BAMSAD:	.ASCIZ /BASIZ = /
BAINMS:	.ASCIZ <15><12>/BUFFER ALLOCATION MODULE INITIALIZATION/<15><12>
	;THIS SECTION ACTUALLY CREATES THE PARAMETER TABLE NEEDED BY
	;THE CONTROL MODULE FOR INITIALIZATION

CT5:	MOV	#CTPTBL,R5	;O	.EVEN

	.SBTTL	CTBEGN ROUTINE TO PARAMETERIZE AND INITIALIZE
		;THE CONTROL MODULE.
		;ONLY TWO PARAMETERS ARE REQUIRED OFTHERWISE, GET ADDRESS OF C.T. PARA TABL
	MOV	#1,(R5)+	;INDICATE ONE ACQUISITION SOURCE IN TABLE
	MOVB	CTNOFD,R0	;GET # OF DATA THE USER:
		;	CTNOFD AND CTNOFB.
		;THE REASON THE OTHER PARAMETERS ARE NOT NEEDED
		;IS BECAUSE OF THE SPECIFIC NATURE OF T PATHS

	.IF	NDF,FG$
	INC	R0		;ADD ONE FOR DUMMY CHANL FOR PROGRAMMED
	.ENDC			;  START AND STOP

	MOV	R0,(R5)+	;SUPPLY PAHE PROGRAM.
		;THE PROCESSES IN EACH DATA PATH ARE THE SAME, AND
		;IN FACT EACH DATA PATH CONTAINS ONLY ONE PROCESS,
		;I.E.RAMETER TAB WITH # OF PROCESSES
	MOVB	CTNOFB,(R5)+	;SUPPLY # OF BUFRS ALLOWED TO WAIT
	MOVB	R0,(R5)+	;SUPPLY # OF DATA PATHS
,"TPWRT".  THE PROGRAM ALSO ASSIGNS THE PRIORITIES
		;OF PROCESS EXECUTION, WHICH IT CHOSES AS ONE MORE THAN
		;THE ASSOCIATED
	.IF	NDF,FG$
	DEC	R0		;SET R0 TO CTNOFD
	.ENDC

	CLR	R1		;SET DATA PATH ID AND PRIORITY INDICATOR
CT6:	MOVB	R1,(R5)+	;SUP DATA PATH NUMBER, THUS ENSURING UNIQUE
		;PRIORITIES.  
		;THIS SECTION ALSO SETS UP AN ADDITIONAL DATA PATH IF
		;THE CONDIPLY PARAMETER TABLE WITH DATA PATH ID
	MOVB	#1,(R5)+	;SUPPLY # OF DATA PATH ENTRIES
	MOV	R1,(R5)+	;SUPPLY RT-11 CHNL NO. TO TPTIONAL ASSEMBLY PARAMETER "FG$" IS NOT DEFINED.
		;THIS DATA PATH WOULD BE USED BY THE PROGRAM TO LOOK FOR
		;INPUT FROM THE TWRT
	MOV	#TPWRT,(R5)+	;SUPPLY PROCESS ADDRESS FOR DATA PATH
	MOV	R1,(R5)+	;SUPPLY PROCESS PRIORITY
	INC	R1		;INCR DATA PATH AERMINAL IF A PROGRAMMED START/STOP 
		;CAPABILITY IS REQUIRED BY THE PARAMETERIZATION OF THE
		;CONTINUOUS SAMPLING MODULE

ND PRIORITY LEVEL IND
	$SOB	R0,CT6		;CHECK FOR MORE DATA PATHS.

	.IF	NDF,FG$

	;THIS SECTION CREATES THE EXTRA DATA PATH
MOV	BASIZ,VALUE	;GET CURRENT VALUE OF BUFFER SIZE
	JSR	PC,GETNUM	;LOOK FOR NEW VALUE
	.ENABL	LSB
	BCS	1$		;IF NO CHANGE IS IN



CTBEGN:	JSR	R5,QA
	1000
	CTMSG			;INDICATE CONTROL MODULE INITIALIZATION
CT0:	CLR	NDFLAG		;CLEAR "NO RESPONSE NEEDED"DICATED, BRANCH
	MOV	R0,BASIZ	;OTHERWISE, UPDATE BASIZ
1$:	JSR	PC,CHANGE	;GIVE ANOTHER CHANCE TO CHANGE
	BCS	2$		;IF NO CHANG FLAG
CT1:	MOV	#CTNOFD,R5	;GET ADDRESS OF VARIABLES
	.ENABL	LSB
CT2:	CHECK	GETNUM,#1,#NOFDMS,(R5),#1	;GET NO. OF DATA PATHS
E DESIRED, BRANCH
	JSR	R5,QA		;GET QA MODULE IN RIGHT MODE
	11000			;AND OUTPUT CRLF
	BR	BUFINT		;GO LOOK FOR NEW VALUE
2$:		.ENABL	LSB
CT3:	CHECK	GETNUM,#2,#NOBTMS,(R5),#1  ;GET # OF BUFRS ALOWD TO WAIT
CT4:	JSR	PC,CHANGE	;CHECK FOR ANY CHANGES
	BC
	MOVB	R1,(R5)+	;SUPPLY DATA PATH ID FOR START/STOP PROG
	MOVB	#1,(R5)+	;SUPPLY # OF DATA PATH ENTRIES
	CLR	(R5)+		;NO EXTRA A PATHS
	BLT	5$		;IF LESS, BRANCH
	.PRINT	#TOOBIG		;BUT IF GREATER, INDICATE TOO LARGE
	BR	3$		;AND TRY AGAIN
5$:	MOV	QAANS,INFORMATION NEEDED BY PROCESS
	MOV	#TTYCHK,(R5)+	;SUPPLY PROCESS ADDRESS FOR DATA PATH
	MOV	R1,(R5)+	;SUPPLY LOWEST PRIORITY TTPCHN	;GET CHNL # TO BE DEFINED OR REDEFINED
	MOV	#1,R1		;GO GET ONE MORE DEF
	BR	1$


TOOBIG:	.ASCIZ/ILLEGAL RT-11 CHANNELO PARA TAB
	.ENDC

	MOV	#CTPTBL,R5	;GET PARAMETER TABLE ADDRESS
	JSR	PC,CTINIT	;INITIALIZE CONTROL MODULE WITH PARA. TAB
	B NUMBER/<15><12>
CCHNLN:	.ASCIZ/RT-11 CHANNEL NUMBER OF FILE DEFINITION TO CHANGE IS /
HEADIN:	.ASCIZ/DEFINE OUTPUT FILES FOR:CC	TPBEGN		; IF NO ERRORS, BRANCH
	JSR	PC,PRNTER	;GO PRINT ERROR MESSAGE
	JMP	CT0		;AND TRY AGAIN

CTMSG:	.ASCIZ <15><12>/CO/
TPMSAD:	.ASCIZ<15><12>/THROUGHPUT MODULE INITIALIZATION/
	.EVEN
	.SBTTL	CSBEGN ROUTINE TO PARAMETERIZE AND INITIALIZE
		;NTROL MODULE INITIALIZATION/<15><12>
NOFDMS:	.ASCIZ /Q1: CTNOFD = /
NOBTMS:	.ASCIZ /Q2: CTNOFB = /
	.EVEN
	.SBTTL	TPBEGN ROTHE CONTINUOUS SAMPLING MODULE.
		;ALL PARAMETERS MUST BE SPECIFIC EITHER EXPLICITLY
		;OR IMPLICITLY.  THE SECTION WILL NOT CUTINE TO INITIALIZE THE THROUGHPUT MODULE BY
		;DEFINING AN OUTPUT DATA FILE FOR EACH DATA PATH




TPBEGN:	.PRINT	#TPMSADHECK FOR NON-
		;PROGRAM RELATED ERRORS, BUT LETS THE MODULE DO MOST
		;OF THE CHECKING.  THE PROGRAM DOES CHECK TO SEE THAT
		;INDICATE THROUGPUT MODULE INITIALIZATION
	.ENABL	LSB
	MOVB	CTNOFD,R1	;GET NO. OF DATA PATHS
	MOV	R1,R2		;GET SECOND COPY
		;"CSNOFC" IS EQUAL TO "CTNOFD", SINCE THIS IS REQUIRED
		;FOR THIS PARTICULAR PROGRAM FOR PROPER OPERATION. IT
		;ALSO CHECK	CLR	TPCHN		;ZERO DATA PATH NO.(RT-11 CHANNEL)
1$:	.PRINT	#HEADIN		;PRINT GENERAL HEADING
2$:	JSR	R5,FORMAT	;ASK IF DEFINING RS THAT "CSRRCT" IS LESS THAN OR EQUAL TO
		;"MAXRR$" FOR THE SAME REASON.




CSBEGN:	JSR	R5,QA
	1000
	CSINMS			;TELL OFT-11 CHANNEL #X
	.BYTE	TEXT		; BY "CHANNEL #XXXXXX"
	.ASCIZ/RT-11 CHANNEL #/
	.BYTE	OCTAL,0
	.EVEN
	TPCHN
	.BYTE	SPACE,2
 CONTINUOUS SAMPLING MODULE INIT
CS0:	CLR	NDFLAG		;CLEAR "NO RESPONSE NEEDED" FLAG
CS1:	MOV	#CSPTBL,R5	;GET PARAMETER TABLE AD	.BYTE	EXIT
	.EVEN
	JSR	PC,ITPOPN	;OTHERWISE, GO TRY TO OPEN CHANNEL TPCHN
	BCS	2$		;IF ERROR OCCURED, ASK AGAIN
	$SOB	R1,2$DRESS
	CHECK	GETNUM,#1,#MODEMS,CSMODE,#1	;GET MODE(BYTE)
CS2:	.ENABL	LSB		;GET NO. OF CHANNELS
	TST	NDFLAG		;TEST IF A RESPON		;CHECK FOR MORE RT-11 CHANNELS
3$:	JSR	PC,CHANGE	;CHECK FOR ANY CHANGES
	BCS	CSBEGN		;IF NONE, BRANCH
	JSR	R5,QA		; FIND OUSE IS NECESSARY
	BEQ	1$		;IF SO, BRANCH
	CMP	#2,NDFLAG	;CHECK IF THIS LINE NEEDS A RESPONSE
	BNE	2$		;IF NOT, BRANCH
	CLR	NDT WHICH
	4			; RT-11 CHANNEL # TO REDEFINED OR DEFINE
	CCHNLN			;
	TSTB	QAERR		;IF RESPONSE IS SYNTACTICALLY WRONG
	BNE	3$		FLAG		;OTHERWISE, SIGNAL TO RESPOND HEREAFTER
1$:	MOV	#NOFCMS,MESAGE	;SET TEXT ADDRESS FOR PROMPT
	CLR	VALUE		;SUPPLY OLD VALU; OR
	TSTB	QADATF		; IF NO NUMBER IS SUPPLIED
	BEQ	3$		; GO ASK FOR CHANGES AGAIN
	CMP	QAANS,R2	;COMPARE RESPONSE TO # OF DATE
	MOVB	CSNOFC,VALUE	; IN WORD
	JSR	PC,GETNUM	;LOOK FOR A NEW VALUE
	BCS	2$		; IF NONE WAS SUPPLIED, BRANCH
	MOVB	R0,CSNOFC	NE CHANNEL
	BR	CS9		; NO. TO BE SPECIFIED
CS8:	DEC	NOFADC		;IF A DIGITAL CHANNEL, DEC. COUNT OF A/DS
	BEQ	CS9A		;IF DIGITAL CGO INITIALIZE
CS15:	CHECK	GETNUM,#12,#SINMS,CSSIN	;GET DIG MASK WHICH STARTS ACQ
	BNE	CS16		;IF SAME MASK FOR ALL CHANNELS, BRHANNEL ONLY, BRANCH
CS9:	CHECK	GETABS,#6,#CHGPMS,CSCHGP,#1 ;GET CHNL # + GAIN/POL(BYTE)
	BPL	CS9A		;IF CONTIGUOUS CHANNELS, BRANCH
	SETUPT #CSSIN+2,#MSINMS,CSNOFC,SINNO,PTABWD	;GET TABLE OF
					;DIG MASKS WHICH START ACQ
CS16:	CHECK	GETNUM,#13,#HINMSANCH
	SETUPT #CSCHGP+2,#MCGPMS,NOFADC,CHGPNO,PTABYT	;GET TABLE OF 
					; CHNL NOS. + GAINS OR POLARITIES
CS9A:	BIT	#1,R5		;M,CSHIN	;GET DIG MASK WHICH STOPS ACQ
	BNE	CS17		;IF SAME MASK FOR ALL CHANNELS, BRANCH
	SETUPT #CSHIN+2,#MHINMS,CSNOFC,HINNO,P;OTHERWISE STORE NEW VALUE
2$:	CMPB	CSNOFC,CTNOFD	;MAKE SURE COMPATIBLE WITH CONTROL MODULE
	BEQ	CS3		;IF COMPATIBLE, BRANCH
AKE SURE ON WORD BOUNDARY
	BEQ	CS10		;IF SO , BRANCH
	INC	R5		;OTHERWISE GET ON WORD BOUNDARY
CS10:	.IF	DF,LPSDR$ ! DR11K$
		.PRINT	#NOFCNC		;OTHERWISE, NOTIFY USER
	CLR	NDFLAG		; CLEAR "NO NEED TO RESPOND" FLAG
	BR	CS2		; AND GO GET CORRECT RESPONSECHECK	GETNUM,#7,#DOUTMS,CSDOUT ;GET DIGITAL OUTPUT INDICATOR
	BEQ	CS12		;IF DIGITAL OUTPUT NOT DESIRED, BRANCH
	CHECK	GETNUM,#(HOPEFULLY)
CS3:	MOVB	CSNOFC,(R5)+	;PUT VALUE IN PARAMETER TABLE
	MOVB	CSNOFC,NOFADC	;SET NO. OF A/D CHNLS TO # OF CHNLS 
	CH10,#SOUTMS,CSSOUT  ;GET VAL TO DIG. OUTP ON START
	BNE	CS11		;IF THE SAME FOR ALL CHANNELS, BRANCH
	BIT	#2,CSMODE	;IF NOT MODEECK	GETABS,#3,#RATEMS,CSRATE	;GET CLOCK FREQUENCY
	BPL	CS4		;IF ONLY ONE, BRANCH
	SETUPT #CSTICK,#MTICMS,CSNOFC,TICKNO,PTABWD	S 2 OR 3
	BEQ	CS11		; BRANCH
	SETUPT #CSSOUT+2,#MSOTMS,CSNOFC,SOUTNO,PTABWD	;GET TABLE OF 
				;VALUES TO OUTPUT DIGITALLY ON;GET TABLE OF
							; CLOCK TICKS
	BR	CS6
CS4:	TST	NDFLAG		;TEST IF RESPONSE IS REQUIRED
	BNE	CS5		;IF NOT, BRANCH
	MOV	#T START
CS11:	CHECK	GETNUM,#11,#HOUTMS,CSHOUT  ;GET VAL TO DIG. OUTP ON STOP
	BNE	CS12		;IF THE SAME FOR ALL CHANNELS, BRANCH
ICKMS,MESAGE	;OTHERWISE, GET PROMPT MESSAGE ADDRESS
	MOV	CSTICK,VALUE	;GET CURRENT VALUE
	JSR	PC,GETNUM	;GO LOOK FOR NEW VALUE	BIT	#2,CSMODE	;IF NOT MODES 2 OR 3
	BEQ	CS12		; BRANCH
	SETUPT #CSHOUT+2,#MHOTMS,CSNOFC,HOUTNO,PTABWD	;GET TABLE OF
				;VAL
	BCS	CS5		;BRANCH IF NO NEW VALULE
	MOV	R0,CSTICK	;OTHERWISE, UPDATE CSTICK
CS5:	MOV	CSTICK,(R5)+	;PUT VALUE IN PARAMETER TAUES TO OUTPUT DIGITALLY ON STOP
	.ENDC

CS12:	BIT	#2,CSMODE	;IF MODES 2OR 3
	BNE	CS15		; BRANCH
	CHECK	GETABS,#16,#STRTMS,CBLE
CS6:	CHECK	GETABS,#4,#NOFBMS,CSNOFB	;GET NO. OF BUFFERS TO FILL
	BPL	CS7		;IF SAME FOR ALL CHANNELS, BRANCH
	SETUPT #CSNOSTART	;GET METHOD OF START/STOP
	BEQ	CS14		;IF PROGRAMMED(TTY), BRANCH

	.IF	DF,LPSDR$ ! DR11K$
	BMI	CS13		;IF SCHMIT TRIGGEFB+2,#MNOBMS,CSNOFC,BUFNO,PTABWD	;GET TABLE OF
							; BUFFER LENGTHS
CS7:	CHECK	GETABS,#5,#TYPEMS,CSTYPE,#1	; GET TYPE(BYTE)R ONE, GO INITIALIZE
	CHECK	GETNUM,#12,#SINMS,CSSIN	;GET DIG MASK TO START ACQ
	CHECK	GETNUM,#13,#HINMS,CSHIN	;GET DIG MASK WH
	BEQ	CS9		;IF ALL A/D CHANNELS, BRANCH
	BMI	CS8		;IF ONE DIGITAL CHANNEL, BRANCH
	MOV	#1,NOFADC	;OTHERWISE, DMA. NEED ONLY OICH HALTS ACQ
	.ENDC

CS13:	JMP	CSCHNG		;GO INITIALIZE
CS14:	MOV	#1,PROGSS	;INDICATE A PROGRAMMED START/STOP
	JMP	CSCHNG		; UPDATE VALUE
2$:	CMP	CSRRCT,#MAXRR$	;COMPARE TO MAX SPACE ASSEMBLED
	BLE	CS21		;IF IT FITS, BRANCH
	.PRINT	#EXRRTB		;OTHERWIDOUT = /
SOUTMS: .ASCIZ/Q10: CSSOUT = /
MSOTMS: .ASCIZ/  CSSOUT FOR DATA PATH 000 = /
HOUTMS: .ASCIZ/Q11: CSHOUT = /
MHOTMS:SE, INFORM USER
	CLR	NDFLAG		;CLEAR "NO RESPONSE NEEDED" FLAG
	BR	CS20		;AND GO ASK AGAIN
CS21:	MOV	CSRRCT,(R5)+	;PUT ROUND R .ASCIZ/  CSHOUT FOR DATA PATH 000 = /
SINMS:	.ASCIZ/Q12: CSSIN = /
MSINMS: .ASCIZ/  CSSIN  FOR DATA PATH 000 = /
HINMS:	.ASCOBIN COUNT IN PARAMETER TABLE
	SETUPT #CSRRTB,#RRTBMS,CSRRCT,RRTBNO,PTABYT	;SET UP ROUND 
							;ROBIN TABLE
	CHECK	GETABS,#IZ/Q13: CSHIN = /
MHINMS:	.ASCIZ/  CSHIN  FOR DATA PATH 000 = /
STOPMS:	.ASCIZ/Q14: CSSTOP = /
RRCTMS: .ASCIZ/Q15: CSRRCT = /16,#STRTMS,CSTART	;GET START INDICATOR(WORD)
	BR	CS18

CSCHNG:	JSR	PC,CHANGE	;GO CHECK FOR ANY CHANGES
	BCS	CSINTL		;IF NONE
EXRRTB:	.ASCIZ<15><12>/CSRRCT HAS EXCEEDED VALUE ASSEMBLED FOR MAXRRC/
RRTBMS: .ASCIZ/  ROUND ROBIN TABLE ENTRY # 000 = /
ST, GO INITIALIZE MODULE
	JSR	PC,QCHANG	;OTHERWISE, FIND QUES. NO. TO CHANGE
	BCS	CSCHNG		;IF IMPROPER RESPONSE, BRANCH
	JSR	R5RTMS: .ASCIZ/Q16: CSTART = /
	.EVEN
TICKNO:	MTICMS+35		;ADDRESS OF NUMERICS IN TEXT
BUFNO:	MNOBMS+27
CHGPNO:	MCGPMS+27
SOUT,QA		;GET QA IN RIGHT MODE
	11000			;AND ISSUE CRLF
	JMP	CS1		;GO CHANGE APPROPRIATE LINE(S)

CSINTL:	MOV	#CSPTBL,R5	;GET ADNO:	MSOTMS+27
HOUTNO:	MHOTMS+27
SINNO:	MSINMS+27
HINNO:	MHINMS+27
RRTBNO:	RRTBMS+34
	.SBTTL	UTILITY ROUTINES PECULIAR TO TTABWD	;GET TABLE OF
					;DIG MASKS WHICH STOP ACQ
CS17:	CHECK	GETNUM,#14,#STOPMS,CSSTOP	;GET DIG MASK WHICH STOPS PROG
	CLR	DRESS OF PARAMETER TABLE
	JSR	PC,CSINIT	;GO INITIALIZE CONTINUOUS SAMPLING MODULE
	BCC	DONE		;IF NO ERRORS, BRANCH
	JSR	PC,PRPROGSS		;CLEAR FLAG FOR PROGRAMMED(TTY)START/STOP
	CMP	#3,CSMODE	;IS THIS MODE 3
	BEQ	CS20		; IF SO , BRANCH
	CHECK	GETABS,#1NTER	;GO PRINT ERROR MESSAGE
	JSR	R5,QA
	11000			;GET QA IN CORRECT MODE
	JMP	CS0		;GO START PARAMETER TABLE OVER
DONE:	.PRI6,#STRTMS,CSTART	;GET START INDICATOR
CS18:	BNE	CS19		;IF DIGITAL INPUT START/STOP, BRANCH
	INC	PROGSS		;OTHERWISE, INDICATE PNT	#INTLDN		;INDICATE DONE
	RTS	PC

NOFCNC:	.ASCIZ <15><12>/NO. OF CHANNELS NOT EQUAL NO. OF DATA PATHS./
INTLDN:	.ASCIZ <15ROGRAMMED(TTY)
CS19:	JMP	CSCHNG		;GO CHECK FOR ANY CHANGES BEFORE INIT
CS20:	.ENABL	LSB		;GET ROUND ROBIN TABLE COUNT
	TST	ND><12>/INITIALIZATION FINISHED!/<15><12>
CSINMS:	.ASCIZ<15><12>/CONTINUOUS SAMPLING MODULE INITIALIZATION/<15><12>
MODEMS:	.ASCFLAG		;IS A RESPONSE REQUIRED
	BEQ	1$		;IF SO, BRANCH
	CMP	#15,NDFLAG	;IS A RESPONSE REQUIRED FOR THIS LINE
	BNE	2$		;IF NOT,IZ/Q1:  CSMODE = /
NOFCMS:	.ASCIZ/Q2:  CSNOFC = /
RATEMS:	.ASCIZ/Q3:  CSRATE = /
MTICMS: .ASCIZ/  NO. OF TICKS FOR DATA PATH  BRANCH
	CLR	NDFLAG		;OTHERWISE, CLEAR "NO NEED TO RESPOND" FL
1$:	MOV	#RRCTMS,MESAGE	;GET PROMPT MESSAGE COUNT
	MOV	CSRRCT,V000 = /
TICKMS: .ASCIZ/  NO. OF TICKS = /
NOFBMS:	.ASCIZ/Q4:  CSNOFB = /
MNOBMS: .ASCIZ/  CSNOFB FOR DATA PATH 000 = /
TYPEMALUE	;GET CURRENT VALUE OF COUNT
	JSR	PC,GETNUM	;LOOK FOR NEW VALUE
	BCS	2$		;IF NO CHANGE, BRANCH
	MOV	R0,CSRRCT	;OTHERWISE,S:	.ASCIZ/Q5:  CSTYPE = /
CHGPMS: .ASCIZ/Q6:  CSCHGP = /
MCGPMS: .ASCIZ/  CSCHGP FOR DATA PATH 000 = /
DOUTMS: .ASCIZ/Q7:  CS, AND THE CARRY BIT WILL BE SET ON RETURN.
	; OTHERWISE, THE CARRY IS CLEAR ON RETURN.


ITPOPN:	CLR	R0		;INDICATE DEFS. COM 
	; IF A NEW VALUE IS SUPPLIED, THE VALUE IS STORED IN R0
	; AND THE CARRY IS CLEAR ON RETURN.
	; IF A (CR) ONLY IS RECEIVEDMING FROM TERMINAL
	JSR	PC,TPOPN	;GO TRY TO OPEN AN RT-11 CHANNEL
	.ENABL	LSB
	BCC	2$		;IF NO ERRORS, BRANCH
	MOV	R0,1$		;OT AS A RESPONSE TO THE PROMPT,
	; THE CARRY IS SET AND THE PROGRAM RETURNS.
	; IF A RESPONSE OF ".(CR)" IS RECEIVED, "NDFLAG", HERWISE, PUT ERROR NO. IN PLACE
	JSR	R5,FORMAT	; AND PRINT
	.BYTE	CRLFC0,TEXT	; ERROR MESSAGE
TPERMS:	.ASCIZ <12><15>/ERROR #THE "NO
	; NEED TO RESPOND" FLAG IS SET AS WELL AS THE CARRY BIT,
	; AND THE PROGRAM RETURNS.


GETNUM:	CLR	SIGN		;NON-PRIN/
	.BYTE	OCTAL,200	; AND
	.EVEN
1$:	.WORD	0		; ERROR NUMBER
	.BYTE 	CRLFC0,EXIT
	.EVEN
	SEC			;INDICATE ERROR
2$:	RTS	PC	TING CHARACTER
	BR	GAGAIN
GETABS:	TST	VALUE		;CHECK IF NEGATIVE
	BGE	GETNUM		;IF NOT,BRANCH
	MOV	#55,SIGN	;OTHERWISE, SUPPLY	;RETURN


	;CHANGE GIVES THE PROMPT "ANY CHANGES?" AND ACTS UPON THE ANSWER.
	; IF YES ("Y(CR)"), THE CARRY IS CLEAR ON RET MINUS SIGN
	NEG	VALUE		;AND TAKE ABSOLUTE VALUE OF VALUE
GAGAIN:	JSR	R5,FORMAT	;
	.BYTE	TEXTA		;PRINT
	.EVEN
MESAGE:	.WORDURN.
	; IF NO ("N(CR)"), THE CARRY IS SET ON RETURN.
	; IF RESTART ("R(CR)"), THE PROGRAM JUMPS TO "BABEGN".
	; OTHERWISE, TH	0		;PROMPT MESSAGE
	.BYTE	TEXTA		;PRINT SIGN OF VALUE IF NEGATIVE
	.EVEN
	SIGN
	.BYTE	OCTAL,200	;PRINT  CURRENT ABSOLUTE VAE QUESTION IS ASKED AGAIN.


CHANGE:	MOV	R5,-(SP)	;SAVE R5
	.ENABL	LSB
2$:	JSR	R5,QA		;ASK IF SATISFIED WITH RESPONSES FOR LUE OF
VALUE:	.WORD	0		;SELECTED PARAMETER
	.BYTE	EXIT
	.EVEN
	.TTYOUT	#57		;PRINT BACK-SLASH
	JSR	R5,QA		;GO LOOK FOR USERLAST
	20			; PARAMETER TABLE. ASK "ANY CHANGES?".
	CHNMS			; RESPOND "Y<CR>" FOR YES, "N<CR>" FOR NO
	COMAND			; OR "R<CR>" T RESPONSE
	4004			;EXPECT AN OCTAL RESPONSE
	MOV	QAANS,R0	;GET ANSWER
	.ENABL	LSB
	TSTB	QADATF		;TEST FOR CR-LF ONLY
	BEQ	2O RESTART PROGRAM
	TSTB	QAERR		;TEST FOR WRONG TYPE OF RESPONSE
	BNE	2$		;IF SO, ASK AGAIN.
	TSTB	QADATF		;TEST FOR NULL RESP$		;IF SO, NO CHANGE FOR PARAMETER INDICATED
	TSTB	QAERR		;TEST FOR "ERROR"
	BNE	1$		;IF ERROR INDICATED, CHECK FOR END OF TABHIS PROGRAM

	;PRNTER PRINTS AN ERROR MESSAGE AND THE VALUE RETURN IN
	; R0 AFTER AN UNSUCCESSFUL ATTEMPT AT A MODULE'S 
	; ONSE
	BEQ	2$		;IF SO, ASK AGAIN.
	MOV	(SP)+,R5	;RESTORE R5
	ASR	R0		;SET CARRY FOR NO, CLEAR CARRY FOR YES
	BMI	CHANGE		;ASKINITIALIZATION.

PRNTER:	MOV	R0,CSEROR		;OTHERWISE,
	JSR	R5,FORMAT	; INFORM USER
	.BYTE	CRLFC0,TEXTA
	INTERM
	.BYTE	TEXT
 AGAIN IF INCORRECT RESPONSE
	BEQ	1$		;IF Y, OR N BRANCH
	TST	(SP)+		; OTHERWISE, POP STACK
	JMP	BABEGN		; AND RESTART INITIA	.ASCIZ / R0 = /
	.BYTE	OCTAL,200	; ERROR
	.EVEN
CSEROR:	.WORD	0		; NO. RETURNED
	.BYTE	CRLFC0,EXIT
	.EVEN
	RTS	PC



LIZATION
1$:	RTS	PC		;RETURN

CHNMS:	.ASCIZ /ANY CHANGES? /
COMAND: .BYTE 4,1
	.ASCIZ /YNR/
	.EVEN


	;GETNUM GIVES A P	;ITPOPN CALLS TPOPN, AND ON RETURN, CHECKS FOR ERRORS
	; IF AN ERROR OCCURS, THE ERROR NO. AND AN ERROR MESSAGE
	; IS PRINTEDROMPT FOR OBTAINING A NEW VALUE FOR THE
	;PARAMETER NAMED IN THE PROMPT, AND AWAITS A REPLY, VIA
	;THE TERMINAL FROM THE USER.IF NOT, GO TELL OF IMPROPER RESPONSE
	MOV	#-1,NDFLAG	;OTHERWISE, INDICATE NO MORE TABLE CHANGE
2$:	SEC			;INDICATE NO CHANGE TRESS OF THE PARAMETER TABLE IS IN R5.


PTABST:	TST	NDFLAG		;SEE IF NECCESSARY TO ASK QUESTIONS
	BNE	PTAB4		;IF NOT, BRANCHO TABLE ENTRY
	RTS	PC		;AND RETURN
4$:	.PRINT	#BADRSP		;PRINT ERROR MESSAGE
	BR	GAGAIN		;TRY AGAIN

SIGN:	.WORD	0		;SIGN OF
	MOVB	#60,(R2)	;OTHERWISE START VARIABLE NUMBER IN TEXT
	MOVB	(R2),1(R2)	; AT ZERO
	MOVB	(R2),2(R2)
	BR	PTAB1		;START ASKING VALUE(IF DESIRED) IN ASCII
BADRSP:	.ASCIZ <12><15>/BAD RESPONSE. TRY AGAIN!/

	.EVEN


	;PTABWD SETS APPLICABLE INSTRUCTI QUESTIONS
PTAB0:	MOV	#10,R0		;GET ASCII OCTAL NUMBER OVERFLOW BIT
	INCB	2(R2)		;INCREMENT VARIABLE NUMBER IN TEXT
	BITB	R0,2ONS IN THE PTABST ROUTINE TO
	; WORD MODE

PTABWD:	MOV	#100000,R0	;GET BYTE INSTRUCTION BIT
	BIC	R0,PTAB1	;CLEAR IT IN THE A(R2)
	BEQ	PTAB1
	BICB	R0,2(R2)
	INCB	1(R2)
	BITB	R0,1(R2)
	BEQ	PTAB1
	BICB	R0,1(R2)
	INCB	(R2)
PTAB1:	MOVB	(R4),VALUE	;GPPROPRIATE INSTRUCTIONS
	BIC	R0,PTAB2
	BIC	R0,PTAB3
	BIC	R0,PTAB4
	MOV	#GETNUM,GETADR	;GET UNSIGNED VALUES
	BR	PTABST


ET CURRENT TABLE ENTRY
	JSR	PC,@GETADR	;GET NEW VALUE
	BCS	PTAB3		;IF NONE INDICATED, BRANCH
PTAB2:	MOVB	R0,(R4)		;OTHERWISE,	;PTABYT SETS APPLICABLE INSTRUCTIONS IN THE PTABST ROUTINE TO
	; BYTE MODE

PTABYT:	MOV	#100000,R0	;GET BYTE INSTRUCTION BIT UPDATE TABLE ENTRY
PTAB3:	MOVB	(R4)+,(R5)+	;ENTER VALUE IN PARAMETER TABLE
	TST	NDFLAG		;CHECK FOR NO MORE CHANGES
	BNE	PTAB
	BIS	R0,PTAB1	;SET IT IN THE APPROPRIATE INSTRUCTIONS
	BIS	R0,PTAB2
	BIS	R0,PTAB3
	BIS	R0,PTAB4
	MOV	#GETABS,GETADR	;GET S5		;IF NONE, BRANCH
	$SOB	R3,PTAB0	;OTHERWISE CHECK FOR MORE TO DO
	RTS	PC		;IF DONE, RETURN
PTAB4:	MOVB	(R4)+,(R5)+	;ENTER VIGNED VALUES
	CLR	VALUE		;CLEAR UPPER HALF OF VALUE TO PRINT


	;PTABST IS USED BY PTABYT AND PTABWD TO PRODUCE A TABLE OF ALUE IN PARAMETER TABLE
PTAB5:	$SOB	R3,PTAB4	;IF MORE ENTRIES, CONTINUE
	RTS	PC		;OTHERWISE,RETURN
GETADR:	.WORD	0		;ADDRES O
	; EITHER BYTES OR WORDS.  THIS IS DONE BY PRINTING A PROMPT
	; WHOSE STARTING ADDRESS HAS BEEN GIVEN TO THE "GETNUM" ROUTINEF ROUTINE TO GET NEW AND
				; PRINT OLD VALUES



	;QCHANG ASKS FOR THE NUMBER OF THE QUESTION TO CHANGE.
	;  IF AN OCTAL
	; ALREADY BY SETTING ADDRESS "MESAGE".  HOWEVER, PTABST MODIFIES
	; THIS PROMPT EACH TIME IT LOOKS FOR A NEW TABLE ENTRY BY  NUMBER IS SUPPLIED, THIS NUMBER IS
	;PUT IN "NDFLAG" , THE CARRY IS CLEARED, AND QCHANG RETURNS.
	;  IF SOMETHING OTHER THAN 
	; UPDATING A THREE DIGIT ASCII NUMBER WHOSE MOST SIGNIFICANT 
	; ASCII DIGIT START AT THE ADDRESS CONTAINED IN R2.
	; WHEN TAN OCTAL NUMBER IS RESPONDED TO
	;THE PROMPT OF QCHANG, "QUESTION # TO CHANGE = ", THE CARRY
	;IS SET AND THE ROUTINE RETURNS.HIS ROUTINE IS CALLED, R4 CONTAINS THE STARTING ADDRESS
	; OF THE PREVIOUS VALUES OF THIS TABLE, WHICH IS ALSO WHERE THE
	; NE


QCHANG:	JSR	R5,QA		;OTHERWISE, CHECK QUESTION NO. TO CHANGE
	4
	CHNGQS
	MOV	QAANS,NDFLAG	;GET QUESTION NO.
	ASRB	QAERR
	CLC			;OTHERWISE, INDICATE NEW DATUM RECEIVED
	RTS	PC		;AND RETURN
1$:	CMPB	@QABUFP,#56	;SEE IF INPUT WAS A "."
	BNE	4$		;W VALUES ARE STORE AS WELL AS IN THE PARAMETER TABLE BEING
	; PREPARED FOR THE CONTINUOUS SAMPLING MODULE. THE CURRENT 
	; ADDTION IN THIS DOCUMENT IS SUBJECT TO CHANGE
;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
;COMMITMENT BY DIGITAL EQUIPMENT CN TO 
;	CHANGE THE SEQUENCE.

ENTAR:	.BYTE	0,2		;.ENTER CHAN & CODE
	0,0			;DBLK & LENGTH
TPCTRG:	0			;0 FOR .ENTER, COUNT ORPORATION.

;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BYARG FOR MT & CT

DEFEXT:	.RAD50	/DATDATDATDAT/	;4 WD DEFAULT EXT BLK
OUTSPC:	.BLKW	15.		;15 WDS FOR 3 OUTPUT FILES
CBLK:	.BL		;IF A SYNTACTICALLY INCORRECT
	BCS	QC1		; OR
	TSTB	QADATF		; NULL RESPONSE RECEIVED
	BNE	QC1		; SET CARRY AND RETURN
	SEC	 DEC.

;LDP SOFTWARE DEVELOPMENT,	FEB. 1975
;	CARL RALSTON

;THIS MODULE TAKES THE SUPPLIED OUTPUT FILE INFORMATION AND
;O		;INDICATE AN ERROR
QC1:	RTS	PC		; AND RETURN

CHNGQS:	.ASCIZ /QUESTION NO. TO CHANGE = /


	.EVEN
NDFLAG:	.WORD 	0		;NOUTPUTS DATA FROM MEMORY INTO THOSE FILES ON AUXILARY STORAGE MEDIA.
;IT SUPPORTS MULTIPLE AND ASYNCHRONOUS DATA PATHS IN REAL-T NEED TO RESPOND FLAG
NOFADC:	.WORD	0		;NO. OF A/D CHANNELS
CTPTBL:	.BLKW 	1+MAXDP$*3	;CONTROL MODULE PARAMETER TABLE
	.IF	NDIME.
.SBTTL	CONDITIONAL ASSEMBLY PARAMETERS EXPLANATIONS
;FG$	IF DF, WILL BE USED IN THE FOREGROUND
;	IF NDF, ASSUMED TO BE F,FG$
	.BLKW	3
	.ENDC
CSPTBL:	.BLKW	MAXDP$/2*11+MAXRR$+12		;CONTIUOUS SAMPLING PARAMETER TABLE
	.IF	DF,LSSDR$ ! DR11K$
	.BLUSED IN THE BACKGROUND OR S.J.
;MAXDP$ MUST BE DEFINED EQUAL TO THE MAXIMUM NUMBER OF DATA
;	PATHS THAT CAN BE USED. ALSO THE KW	2*MAXDP$+3
	.ENDC

	.END
                                                                                               MAX # OF RT CHANNELS.
;TPCLS$ IF DF THE CLOSE "TPCLS" ROUTINE WILL BE INCLUDED.
;	OTHERWISE THE USER WILL DO HIS OWN .CLOSE
;                                                                                                                                BAMLT$	IF DF MULTIPLE CONTIGIOUS BUFFERS MAY BE COMBINED TO
;	FORM A 256. WORD BUFFER. OTHERWISE ALL BUFFER SIZES ARE A WHOLE
.TITLE TPUT	THROUGHPUT MODULE
;LAB APPLICATIONS-11
;DEC-11-SLABA-C-LA
;FILENAME TPUT.MAC
;FILE ID TPUT.7
.CSECT TP

;COPY;	NUMBER MULTIPLE OF 256. AND NEED ONLY BE RELEASED THRU "BAREL".

.SBTTL	MACROS & DEFINITIONS
.MCALL	.REGDEF,.WRITC,.CLOSE,.RIGHT (C) 1975
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A.V2..,.QSET,.CDFN,.DSTATUS,$SOB
..V2..
.REGDEF

ERRBYT	=52	;EMT ERROR CODE

.SBTTL	GLOBALS
;GLOBALS DEFINED LOCALLY
	.GL
;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER OBL TPOPN,TPWRT,TPCHN,TPEROR,TPSEK,TPCTRG
	.IIF DF TPCLS$	.GLOBL TPCLS

;EXTERNAL GLOBALS USED
	.GLOBL BASIZ,BAREL,BACNT,SAVCOPIES
;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONERG,RSTRG
	.IIF DF BAMLT$	.GLOBL BARLM
	.IIF NDF FG$	.GLOBL BAWDS

.SBTTL	LOCAL STORAGE
;TPCHN IS THE CURRENT CHANNEL TO BE  WHO AGREES
;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE
;SHALL AT ALL TIMES REMAIN IN DEC.

;THE INFORMAOPENED. STARTS AT 0
;	AND INCREMENTS UP FOR EACH CHANNEL ENTERED. THIS GLOBAL
;	CAN BE CHANGED BY THE USER BEFORE CALLING TPOPHANDLING ERRORS
	MOV	R0,CSTRG	;ADDR OF ASCIZ STRING OR 0 FOR TTY
	TST	(PC)+		;IS THIS 1ST CALL
FSTIM:	0			;0 ON 1ST CALL, .NEEL OF INTEREST
16$:	ADD	#10.,R2		;5 WDS FOR EACH FILE
	$SOB	R3,10$		;GET UP TO 3 FILES AT A TIME
20$:	JSR	PC,RSTRG
	RTS	PC		.0 ON ALL OTHERS
	BNE	2$		;BR IF 1ST
	INC	FSTIM		;MAKE .NE.0 FOR NEXT CALL
	.QSET	#QAREA,#MAXDP$	;ADDITIONAL QUEUE ELEMENTS
;ADD CLC FOR NORMAL RTN

ERR3:	INC	R4		;SETUP ERROR # FOR R0
ERR2:	INC	R4
ERR1:	INC	R4
ERR0:	MOV	R4,R0
	SEC			;C=1 FOR ERR	.IF GT MAXDP$-16.	;NEED ADDITIONAL CHANNELS DEFINED?
	MOV	#CDFAR,R0	;R0 -> CDFN AREA
	.CDFN			;IGNORE THE ERROR IF ANY
	.ENDOR
	BR	20$
	.DSABL	LSB

.SBTTL TPSEK	START A SEEK ON THE CHANNEL CONTAINED IN  R0
;ON ENTRY R0 CONTAINS THE RT-11 CHANNEL #C
2$:	MOV	#OUTSPC,R2	;R2 -> FILE INFO
	MOV	SP,R1		;SAVE STACK VALUE
	MOV	R2,-(SP)	;OUTSPC
	MOV	#DEFEXT,-(SP)	;DEFAULT EXTENS TO DO THE SEEK. CONTROL
;RETURNS TO THE USER IMMEDEATELY AFTER THE SEEK IS INITIATED.
;NO ERRORS ARE RETURNED.

TPSEK:	MOVBION
	MOV	(PC)+,-(SP)
CSTRG:	0			;ADDR OF ASCIZ STRING OR 0 FOR TTY
	EMT	345		;.CSISPC R2,#DEFEXT,CSTRG
	MOV	R1,SP		;RST STAC	R0,-(SP)	;SAVE CHANNEL #
	MOV	#SEKAR,R0	;R0 -> .READ AREA
	MOVB	(SP)+,@R0	;SET CHANNEL #
	EMT	375		;.READ EMT
	RTS	PC
SEKAKW	24.		;WDS FOR INPUT FILES & AREA FOR DSTATUS

.SBTTL TPOPN
;THE TPOPN ROUTINE DOES THE FOLLOWING:
;1. IF 1ST CALL, DO A .K VALUE
	BCS	ERR0		;ILL CMD LINE
	TST	CBLK		;WERE ANY INPUT FILES GIVEN?
	BNE	ERR0		;YES, ERROR
	MOV	#3,R3		;CNT FOR 3 OUTPUQSET FOR MAXDP$
;2. IF 1ST CALL AND MORE THAN 16 CHANNELS DO A .CDFN FOR
;   MAXDP$ CHANNELS.  THIS MUST BE DONE BEFORE ANY I/T FILES
10$:	TST	@R2		;WAS A FILE GIVEN
	BEQ	16$		;0 IF NO
	.DSTATUS #CBLK,R2	;INFO ABOUT DEV
	BCS	ERR1		;NO SUCH DEV
	MOV	O OPERATION
;   HAS BEEN INITIATED.
;3. CALLS THE CSI IN SPECIAL MODE TO GET OUTPUT FILE
;   INFORMATION EITHER FROM MEMORY OCBLK+4,R0	;ENTRY PT OF HNDLR
	.IF DF FG$
	BEQ	ERR3		;HNDLRS MUST BE RESIDENT FOR FG
	.IFF			;LOAD IT IF BG OR SJ
	BNE	14$		;R FROM THE TERMINAL.
;4. IF IN BG, NON-RESIDENT HANDLERS WILL BE LOADED INTO AN AREA
;   DETERMINED BY THE BA.  FG MUST HAVE D0 IMPLIES NOT IN MEMORY
	MOV	CBLK+2,R0	;SIZE OF HNDLR IN BYTES
	ASR	R0		;NOW SIZE IN WDS
	JSR	PC,BAWDS	;GET ROOM FOR HNDLR
	ONE A KMON LOAD CMD.
;5. CLOSE EACH CHANNEL BEFORE DOING AN ENTER.
;6. THE CHANNEL TO ENTER IS DETERMINED BY TPCHN AND IS
;  BCS	ERR3		;NO ROOM
	MOV	R0,-(SP)	;CORADD TO LOAD
	MOV	R2,R0		;R0 -> DEVICE NAME
	EMT	343		;.FETCH EMT
	BCS	ERR1		;NO SUCH DE INCREMENTED AFTER EACH ENTER.
;7. IF THE CARRY BIT IS SET, AN ERROR HAS OCCURED AND R0 HAS
;   VALUE IN IT MEANING AS FOLLOWSV
	.ENDC
14$:	MOV	TPCHN,R1	;CHAN #
	CLRB	TPEROR(R1)	;ZERO CHAN ERROR FLAG
	.CLOSE	R1		;CLOSE CHAN BEFORE USE
	MOV	#ENTAR+4,:
;	0 ILLEGAL COMMAND LINES TO CSI
;	1 DEVICE SPECIFIED IS NOT FOUND IN SYSTEM TABLES
;	2 NO ROOM FOR FILE ON OUTPUT DEVICE
R0	;PREPARE TO DO ENTER
	MOV	8.(R2),@R0	;LENGTH OF FILE
	MOV	R2,-(R0)	;DBLK ADDR
	TST	-(R0)		;2 FROM R0
	MOVB	R1,@R0		;SET C;	3 IF FG, HANDLER NOT RESIDENT. IF BG, NO ROOM TO LOAD HANDLER

	.ENABL	LSB
TPOPN:	JSR	PC,SAVRG	;SAV R1-R4
	CLR	R4		;0 FOR HAN #
	EMT	375		;.ENTER #ENTAR,TPCHN,DBLK,LENGTH,#0
	BCS	ERR2		;BAD ENTER
	INC	(PC)+		;BUMP CHAN #
TPCHN:	0			;CURRENT CHANNTABLE. THE VALUES IN TPEROR CAN BE
;	0 NO ERROR
;	1 ATTEMPTED TO WRITE PAST EOF
;	2 HARDWARE ERROR
;	3 CHANNEL NOT OPEN

;BAMLT$
	MOV	BACNT,R1	;# OF BUFFERS TO RELEASE
	BNE	4$		;IF = 0, BUFSIZ IS 256 OR GREATER
	.IFTF
	JSR	PC,BAREL	;RELEASE THIS CALL VIA	JSR	PC,TPWRT

	.ENABL	LSB
TPWRT:	MOV	R2,-(SP)	;SAV REG
	MOV	#WRTAR+6,R2	;R2 -> .WRITC AREA
	MOV	2(R1),@R2	;WORD COBUFFER
	RTS	PC		;RETURN
	.IFT
4$:	JSR	PC,BARLM	;RELEASE MULTIPLE BUFFERS
	RTS	PC		;RETURN
	.ENDC
	.DSABL	LSB
	.IF DF TPCUNT
	BEQ	4$		;IF WDCNT=0, JUST RTN
	BPL	2$		;- IF NOT LAST BUFFER
	NEG	@R2		;MAKE + WDCNT
2$:	MOV	@R1,-(R2)	;BUF ADDR
	MOV	LS$
.SBTTL TPCLS	CLOSE SUBR
;THIS ROUTINE TERMINATES ACTIVITY ON A SPECIFIED CHANNEL BY THE
;.CLOSE REQUEST. THIS MAKES THE O@R0,-(R2)	;REL BLK # INTO AREA
	MOV	4(R2),R1	;GET + WORD COUNT
	ADD	#377,R1		;ROUND UP MOD(256.)
	BIC	#377,R1
	SWAB	R1		;# TUTPUT FILE A PERMANENT FILE
;ON THE OUTPUT DEVICE.
;INPUTS:
;	R0 CONTAINS THE CHANNEL # TO CLOSE (RANGE 0-255)
;	IF NEGATIVEO UNDATE REL BLK
	ADD	R1,@R0		;UPDATE RELBLK #
	TST	-(R2)		;R2 - 2
	MOVB	R5,@R2		;SET CHAN #
	MOV	R5,R0		;.WAIT CODE IS 0
	, IT WILL CLOSE ALL CHANNELS UP TO MAXDP$
;NO ERRORS ARE POSSIBLE.
;CALL VIA	JSR	PC,TPCLS
;R0 IS NOT SAVED & WILL BE CHANGED..IIF GT MAXDP$-127. BIC #177400,R0 ;CLR PROPOGATED SIGN BITS
	EMT	374		;.WAIT EMT
	BCS	3$		;EOF OR HARDWARE ON PREVIOUS WRITE

;THIS ROUTINE USES THE USR, SO CARE MUST BE TAKEN AS
;TO WHEN YOU CLOSE A CHANNEL!

TPCLS:	TST	R0		;IF NEG CLOSE ALL
	BP
	ASL	R5		;BY 2 FOR WD OFFSET
	MOV	4(R2),BUFADS(R5) ;ADDR INTO TBL TO BE RELEASED LATER
	ASR	R5		;BACK TO CHAN #
	MOV	R2,R0		L	4$
	MOV	R1,-(SP)	;SAV REG
	MOV	#MAXDP$,R1	;USED FOR CTR
2$:	MOV	R1,R0		;CHAN #
	BIS	#6*400,R0	;SET CODE IN HIGH BYTE
	EMT;R0 -> WRITC AREA
	.WRITC
	BCC	4$
3$:	MOVB	@#ERRBYT,TPEROR(R5) ;GET EMT ERROR CODE
	INCB	TPEROR(R5)	;BUMP BY ONE
4$:	MOV	(S	374
	$SOB	R1,2$		;LOOP UNTIL ALL
	MOV	(SP)+,R1	;RST REG
	CLR	R0		;CLOSE CHAN 0 & RTN
4$:	BIS	#6*400,R0	;CODE BYTE FOR .CLOSR:	.BYTE	0,8.		;CHANNEL # & .READ CODE
	0,0,0			;REL BLK, BUF, WORD COUNT
	.WORD	1		;1 FOR .READ

.SBTTL TPWRT
;THIS ROUTINP)+,R2	;RST REG, C=1 IF ERROR
	RTS	PC		;RETURN
	.DSABL	LSB
WRTAR:	.BYTE	0,9.		;.WRITC CHAN & CODE
	0,0,0			;REL BLK #, BUF AE TAKES A BUFFER WHOSE SIZE IS A WHOLE NUMBER
;MULTIPLE OF 256 AND WRITES IT TO A SPECIFIED CHANNEL.
;INPUTS:
;	R1 -> 2 WORD DDR, WCNT
	WRCOMP			;ADDR OF COMPLETION ROUTINE

.SBTTL WRITC	COMPLETION ROUTINE
;THIS IS THE COMMON COMPLETION ROUTINE USEDAREA
;	1ST WD CONTAINS BUF ADDR
;	2ND WD IS # OF WDS IN THE BUF, + IF LAST BUFR
;	R0 -> THE "PIT" AREA OF THE CTRL MODULE.
; BY THE WRITC FOR ALL CHANNELS.
;ON ENTRY R0 CONTAINS THE CHAN STATUS WD
;	R1 CONTAINS THE CHAN #
;THE CHAN # IS USED AS AN O	R0 -> LOC TO STORE REL BLK FOR THIS CHAN
;	R5 = RT CHANNEL #
;THE CARRY WILL BE SET IF AN ERROR OCCURED ON THAT CHANNEL.
;R0FFSET INTO THE TBL CONTAINING
;THE BUF ADDR TO BE RELEASED.

	.ENABL	LSB
WRCOMP:	ROR	R0		;BIT 0 SET AN HARDWARE ERROR
	BCC	-R1 ARE DESTROYED, R2-R5 ARE PRESERVED.
;THE HARDWARE ERROR IS DETERMINED BY THE COMPLETION ROUTINE
;AND PLACED IN THE TPEROR 2$
	MOVB	#2,TPEROR(R1)	;ERR COND FOR CHAN
2$:	ASL	R1		;BY 2 FOR WORD OFFSET
	MOV	BUFADS(R1),R0	;BUF ADDR TO RELEASE
	.IF DF BLKW	MAXDP$*7.	;QUEUE ELEMENT AREA
TPEROR:	.REPT	MAXDP$	;TBL OF ERRORS. 1 FOR EACH RT11 CHAN.
	.BYTE	0	;IF NON-ZERO A ERROR OCHICH IS NOT SUPPLIED BY DEC.

;LDP SOFTWARE DEVELOPMENT, JUNE 1975




	;MACRO CALLS, GLOBALS, CONDITIONAL ASSEMBLY PARACURED ON THAT CHAN
	.ENDR
	.EVEN
BUFADS:	.BLKW	MAXDP$	;TBL OF BUF ADDR TO BE RELEASED
			;WHEN THE COMPLETION ROUTINE IS ENTMETERS

.MCALL ..V2..,.REGDEF,.INTEN,.PROTECT,.SYNCH,.RSUM,.DEVICE,$ADDEF
.MCALL $SOB,.GTJB
..V2..
.REGDEF
$ADDEF


	;EERED.
	.END
                                                                                                                  XTERNAL GLOBALS
.GLOBL	SAVRG,RSTRG,SAVARG,RSTARG	;FROM GENS
.GLOBL	BAGET,BAREL			;FROM BUFFER ALLOCATOR
	.IF	DF,MODE1$
.GLOB                                                                                                                                L	BAGTM,BARLM
	.ENDC
.GLOBL	BASIZ,BBASIZ,BAWDS
.GLOBL	CTIDON,CTIBUF			;FROM CONTROL MODULE
	.IF	DF,FG$
.GLOBL	CTRUN
	.ENDC                                                                                                                                

	;INTERNAL GLOBALS
.GLOBL	CSINIT,CSAMPL,CSEROR

	.IF DF,MODE2$ ! MODE3$
	.IF DF,LPSDR$ ! DR11K$
.GLOBL CSIDIG
	.ENDC
                                                                                                                                .GLOBL CSDATA
	.ENDC


	;CONDITIONALS
;	THE FOLLOWING PARAMETERS APPLY TO ALL MODES

;FG$	;MUST BE DEFINED FOR A FOREGROU.TITLE CONSAM CONTINUOUS SAMPLING MODULE
;LAB-APPLICATIONS-11
;DEC-11-SLABA-C-LA
;FILENAME CONSAM.MAC
;FILE ID CONSAM.8

.ND JOB
;LPSDR$	;MUST BE DEFINED FOR DI/O FROM LPSDR
;DR11K$	;MUST BE DEFINED FOR DI/O FROM DR11-K
	;NOTE:ONLY ONE OF THE PREVCSECT	CONSAM


;COPYRIGHT (C) 1975
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;THIS SOFTWARE IS FURNISHED UNDER A LICIOUS TWO PARAMETERS MAY 
	;     BE DEFINED AT ONE TIME OR AN ASSEMBLY
	;     ERROR WILL RESULT
;LPS11$ OR AR11$  ;MUST BE DEFENSE FOR USE ONLY ON A
;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
;OF THE ABOVE COPYRIGHT NOTICE. THIS INED, AND SET EQUAL TO THE LARGEST NO. OF
	          ;     DATA PATHS TO BE EMPLOYED IN RUNS

	.IF	DF,AR11$
MXINP$=AR11$
	.SOFTWARE, OR ANY OTHER COPIES
;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON EXCEPT FOR USE ONIFF
MXINP$=LPS11$
	.ENDC

	.IF 	DF,LPSDR$ & DR11K$
	ERROR=2DIOS
	.ENDC

;	THE FOLLOWING PARAMETERS APPLY ONLY TO MODE 1( SUCH SYSTEM AND TO ONE WHO AGREES
;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE
;SHALL AT ALL TIMES REMAIN CSMODE=1)

;MODE1$	;MUST BE DEFINED AND SET EQUAL TO ONE FOR ASSEMBLY
		;OF ANY CODE FOR MODE 1 OPERATIONS
;DEFINING THE FOLE
	EMT	374		;.CLOSE EMT
	RTS	PC
	.ENDC

	.IF GT MAXDP$-16.	;FOR .CDFN IF >16.
CHANL:	.BLKW	MAXDP$*5.	;NEED 5 WDS FOR EACH IN DEC.

;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
;COMMITMENTCHAN
CDFAR:	13.*400			;CODE WD FOR .CDFN
	CHANL			;ADDR OF I/O CHAN LIST
	MAXDP$			;# OF I/O CHAN TO CREATE
	.ENDC
QAREA:	. BY DIGITAL EQUIPMENT CORPORATION.

;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
;ITS SOFTWARE ON EQUIPMENT WO SET UP INTERRUPT VECTORS
	
CSINIT:	JSR	PC,SAVRG	;SAVE REGISTERS R1-R4

	.IF	DF,FG$
	MOV	#GTJBA,R0	;SET UP FOR GTJB
	.GTJ	BIT	#MODE,R1	;IS MODE ASSEMBLED?
	BNE	12$		;IF IT IS, CONTINUE
	MOV	#4,R0		;IF NOT, INDICATE ERROR TYPE
	JMP	EREXIT		; AND ELOWING PARAMETERS HAS AN EFFECT ONLY IF "MODE1$" IS
;	DEFINED AND SET EQUAL TO ONE.
;AUTOG$	;MUST BE DEFINED FOR AUTO-GAINING B
	MOV	GTJBA,SYNCTL+2	;PUT JOB # IN SYNC TABLE
	.ENDC

	MOV	#DLIST,R0
	.DEVICE			;SET UP DEVICE DISABLE LIST
	TST	PRTFLG		CODE IN MODE 1
;DMA$	;MUST BE DEFINED FOR ANY DMA OPERATIONS 
;IF DMA$ IS DEFINED,
;   DUAL$   ;MUST BE DEFINED FOR DMA DUAL ;ARE VECTOR LOCS. ALREADY PROTECTED
	BNE	CSINTS		;IF SO, DON'T PROTECT AGAIN
	
	.IF DF,LPSDR$ ! DR11K$
	MOV	#PROTAR,R0	;GET SAMPLE AND HOLD SAMPLING
;   IF DUAL$ IS DEFINED,
;      DSORT$   ;MUST BE DEFINED IF DATA ACQUIRED VIA DUAL DMA 
		; SAMPLINAREA FOR .PROTECT
	.PROTECT ,#DIVEC		;PROTECT DIO VECTOR ADDRESS
	BCC	PROTAD		;GO PROTEC ADVEC
	MOV	#2,R0		;INDICATE DIVEC ALG IS TO BE SORTED BY CHANNEL INTO SEPERATE
		; BUFFERS BEFORE PASSING TO C.M.
;      IF DSORT$ IS DEFINED,
;	  INPLAC   ;MUSTREADY PROTECTED
	JMP	EREXIT		;GO EXIT
	.ENDC

PROTAD:	MOV	#PROTAR,R0	;GET AREA FOR .PROTECT
	.PROTECT ,#ADVEC		;PROTECT A/D BE DEFINED IF SORTING OF DATA ACQUIRED VIA
		   ; DUAL DMA SAMPLING IS TO BE SORTED "IN PLACE".
		   ; IF NOT DEFINED, SORTIN VECTOR ADDRESS
	BCC	PROTCL		;GO PROTECT CLKVEC
	MOV	#1,R0		;INDICATE ADVEC ALREADY PROTECTED
	JMP	EREXIT		;GO EXIT
PROTCL:	G IS QUICKER BUT REQUIRES
		   ; AN ADDITIONAL BUFFER TO PERFORM THE SORT.
		   ; WHEN DEFINED, SORTING TAKES PLACE IN THE
		MOV	#PROTAR,R0	;GET AREA FOR .PROTECT
	.PROTECT ,#CLKVEC	;PROTECT CLOCK VEC ADDR
	BCC	DNPROT		;GO IND. PROTECTION DONE
	MOV	#   ; DOUBLE BUFFER WHICH IS ALREADY ALLOCATED.


;MODE2$	;MUST BE DEFINED FOR ANY MODE 2 (CSMODE=2)CODE TO BE ASSEMBLED
	;(M3,R0		;IND. CLOCK VEC ALREADY PROTECTED
	JMP	EREXIT		;GO EXIT
DNPROT:	INC	PRTFLG		;VECTOR LOCATIONS HAVE BEEN PROTECTED
	MOV	ULTI-CHANNEL,RATE AND CONTROL MODE)

;MODE3$	;MUST BE DEFINED FOR ANY MODE 3(CSMODE=3) CODE TO BE ASSEMBLED
	;(ROUND ROBIN MO#340,@#ADVEC+2	;STORE PRIORITY OF 7 FOR A/D NO F/B
	MOV	#340,@#CLKVEC+2	;STORE PRIORITY OF 7 FOR CLK NO F/B
	.IF DF,LPSDR$ ! DDE)

MODE=0

	.IF DF,MODE1$
	MODE=MODE+1
	.ENDC

	.IF DF,MODE2$
	MODE=MODE+2
	.ENDC

	.IF DF,MODE3$
	MODE=MODE+4
	R11K$
	MOV	#340,@#DIVEC+2	;STORE PRIOTRIY OF 7 FOR DIO NO F/B
	.ENDC
	
	;R5 CONTAINS ADDRESS OF PARAMETER TABLE FOR INITIAL.ENDC
	
	.IF DF,LPSDR$ & DR11K$
	2DIOER=CONDITIONALASSEMBLYERROR	;ONLY ONE DI/O UNIT ALLOWED
	.ENDC

	.IF DF,AR11$ & LPS11IZATION
	.SBTTL BEGIN TO READ PARAMETER TABLE

CSINTS:	CLR	@#ADSAD		;CLEAN SYSTEM
	TST	@#ADBUF
	CLR	@#CLKSAD

	.IF	DF,LPS$
	2ACQER=CONDITIONALASSEMBLYERROR	;ONLY ONE ACQ UNIT ALLOWED
	.ENDC

	.IF DF,DMA$ ! AUTOG$ & AR11$
	0NOPER=CONDITIONALASSEDR$ ! DR11K$
	CLR	@#DIOSAD
	.ENDC

	MOVB	(R5)+,R0	;GET INTENDED MODE
	MOV	#1,R1		;GET FIRST MODE BIT
	.ENABLE LSB
1$:	DECMBLYERROR	;OPTIONS NOT AVAILABLE ON AR11
	.ENDC


PS=177776
	.SBTTL CONTINUOUS SAMPLING MODULE INITIALIZATION
	;SECTION T	R0		;DECREMENT MODE COUNTER
	BEQ	11$		;IF MODE BIT IN PLACE, BRANCH
	ASL	R1		;IF NOT, MOVE BIT
	BR	1$		; AND TRY AGAIN
11$:E NEG. NUMBER
	MOV	#INTABL,R0	;GET CLOCK TICK COUNTER TABLE
	MOV	R1,R2		;GET SECOND COPY OF TAB LENGTH
	TST	CFLAG		;TST FOR M11,CSMODE	;IS THIS MODE 1 OR 4
	BNE	4$		;IF SO, BRANCH
33$:	MOV	#BUFCNT,R0	;GET FLAG
	MOV	CSNOFC,R3	;GET NO. OF CHANLS
	MOV	ULTI RATE
	BNE	24$		;IF MULTI RATE, B+C
	MOV	(R5)+,R4	;IF SINGLE, GET RATE
23$:	TST	CFLAG		;TST FOR MULTI RATE
	BNE	24$		;IF(R0),R1		;IS A TABLE PROVIDED?
	BMI	35$		;IF YES, PROCESS
34$:	MOV	R1,(R0)+	;STORE BUF. CNT FOR NEXT CHANNEL
	$SOB	R3,34$		;A MULTI RATE, B+C
	MOV	R4,(R0)		;IF NOT, FILL IN NEXT TAVBLE ENTRY
	BR	25$		;B+C
24$:	MOV	(R5)+,(R0)	;GET NEXT CLOCK CNT
25$:NY MORE CHANNELS,IF SO,B+C
	BR 	4$		;IF NOT, CONTINUE
35$:	MOV	(R5)+,(R0)+	;STORE BUF CNT FOR NEXT CHANL
	$SOB	R3,35$		;ANY M	NEG	(R0)		;GET TWO'S COMPLIMENT
	CMP	(R0)+,R3	;TEST IF SMALLER THAN LAST SMALLEST CNT
	BLE	26$		;IF NOT, B+C
	MOV	-2(R0),R3	ORE CHANNELS,IF SO,B+C
	.ENDC
	.SBTTL THIS SECTION DETERMINES FIRST MAIN BRANCH
	;IF DMA (MODE1 ONLY) A BRANCH OCCURS

4$:XIT
12$:	MOV	R1,CSMODE	;STORE MODE CODE
	MOVB	(R5)+,CSNOFC	;GET AND STORE NO. OF CHANLS.
	CLRB	CSNOFC+1	;MAKE SURE NO.OF CHNL;IF SMALLER(ABSOLUTE VALUE) SAVE
26$:	$SOB	R1,23$		;ANY MORE CHANNELS,IF SO, B+C
	MOV	R3,@#CLKBUF	;SET CLK BUF/PRE TO SMALLESTS IS RIGHT
	CMP	CSNOFC,#MXINP$	;MAKE SURE ASSEMB. FOR THIS MANY CHANNELS
	BLE	15$		;IF ENOUGH SPACE ALLOTTED, BRANCH
	MOV	#5, CNT
	MOV	#100001,R4	;GET LARGE NEG. NUMBER
	MOV	#SCHNTB,R1	;GET ADDR OF TABLE OF NEXT CHNLS TO SAMPL
	CLR	(R1)+		;CLEAR CNT R0		;OTHERWISE, GET ERROR CODE
	JMP	EREXIT		;AND EXIT
15$:	MOV	(R5)+,R0	;GET CLOCK FREQ.
	
	.IF DF,MODE2$
	BIT	#2,R1		;TESTOF CHNLS TO SAMPLE,PT TO NEXT 
	CLR	R0		;GET 1ST CHNLS GEN TAB OFFSET
27$:	MOV	INTABL(R0),CINTAB(R0)	;GET NEXT CNT
	SUB	R3,CI IF MODE 2
	BNE	2$		;IF SO, B+C
	.ENDC
	
	ASL	R0		;OTHERWISE, POSITION FREQ
	ADD	#400,R0		;SET CLOCK MODE
	MOV	R0,@#CLKSADNTAB(R0)	;SUBTRACT FIRST CNT TO GET CURR.CNT
	BNE	28$		;IF NOT EQUAL ZERO, B+C
	MOV	INTABL(R0),CINTAB(R0)	;IF EQUAL ZERO, SET 	;PUT FREQ IN CLOCK STATUS WORD
	MOV	(R5)+,R0	;GET CLOCK TICKS
	NEG	R0		;GET TW0'S COMPLEMENT
	MOV	R0,@#CLKBUF	;SET CLOCK COUEQUAL TO ORIG. CNT
	INC	SCHNTB		;INCR. CNT OF CHNLS TO SAMP 1ST
	MOV	R0,(R1)+	;STORE NEXT OFFSET OF CHNL TO SAMP
28$:	CMP	CINNTER
	
	;THIS SECTION SETS UP CLOCK TICKS FOR MULTIPLE
	; CHANNELS SAMPLED AT MULTIPLE RATES
	;(MODE2 ONLY)

	.IF DF,MODE2TAB(R0),R4	;IS THIS VALUE LESS THAN CURR. SMALLEST
	BLE	29$		;IF NOT, B+C
	MOV	CINTAB(R0),R4	;IF IT IS, RESET CUR. SMALLEST CN$
	BR	BUFRCK		;CONTINUE
2$:	TST	R0		;IS ONLY ONE RATE SPECIFIED
	BMI	20$		;IF NOT SO, B+C
	CLR	CFLAG		;IND. ONE RATE
	BR	21T
29$:	TST	(R0)+		;INC TABLE POINTER
	$SOB	R2,27$		;ARE THERE ANY MORE CHANNELS,IF SO, B+C
	MOV	R4,NXCKCT	;IF NOT, SAVE NEXT $		;GO SET CLOCK SW
20$:	MOV	#-1,CFLAG	;IND. MANY RATES
	NEG	R0		;GET CLOCK SW BITS
21$:	ASL	R0		;ADJUST THE BITS
	ADD	#500,CLOCK CNT
	MOV	#SAMOD2,@#CLKVEC;SET CLOCK INT VECTOR
	.ENDC
	
	;THIS SECTION TESTS FOR SAMPLING TO END ON A MAXIMUM
	; NUMBR0		;SET MODE AND INTERRUPT ENABLE
	MOV	R0,@#CLKSAD	;SET CLOCK SW
	MOV	CSNOFC,R1	;GET NO. OF CHANLS
	MOV	#100001,R3	;GET LARGER OF OUTPUT BUFFERS FILLED

BUFRCK:	MOV	(R5)+,BUFCNT	;GET BUFFER STOP COMMAND

	.IF	DF,MODE2$ ! MODE3$
	.ENABL	LSB
	BIT	#	SWAB	DMASW		;GET CHANL # IN CORRECT POSITION
	ADD	#42,DMASW	;GET FUNCTION BITS
	MOV	BASIZ,DMAWDC	;GET BUFFER SIZE
	NEG	DMAWDZATION SECTION
	;SET UP A/D CHANNEL-GAIN(OR POLARITY) TABLE
	
DIGCHN:	.IF	DF,LPSDR$ ! DR11K$
	DEC	R1		;DECREMENT A/D CHNL CNC		;GET NEG. WD CNT
	MOV	#DMASAM,@#ADVEC	;SET A/D VECTOR FOR DMA SAMPLING
	MOV	#BUF1,R0	;GET FIRST BUFFER PINTER
	DEC	R1		;FIT SINCE D.I.
	.IFF
	MOV	#10,R0		;GET NO DIGITAL EROR NO.
	JMP	EREXIT		;AND EXIT
	.ENDC
	
ADONLY:	MOV	R1,CSNOFA	;SET # OF AND OUT IF DUAL SAMPLING
	;
	.IF DF,DUAL$
	BNE	45$		;BRANCH IF DUAL SAMPLING
	.ENDC
	;
	JSR	PC,BAGET	;GET BUFFER #1
	BCS	4/D CHANLS
	.ENABL	LSB
	
	.IF DF,MODE1$
	.IF DF,LPSDR$ ! DR11K$
	BNE	59$		; IF SOME A/D CHANNELS, B+C
	BIT	#1,CSMODE	;IF MO4$		;IF NO SPACE, GO IND. ERROR
	MOV	#BUF2,R0	;GET BUFFER #2 PONTER
	JSR	PC,BAGET	;GET BUFFER #2
	BCC	47$		;GO BUFFER, SO BRADE 1
	BEQ	59$		;IF NOT MODE1, B+C
	JMP	DIONLY		;BRANCH TO D/I ONLY
	.ENDC
	.ENDC
	
59$:	MOV	#ADSWTB,R3	;GET ADDR OF A/D SWNCH
44$:	JMP	SPEXIT		;IND.ERROR AND EXIT IF NO ROOM
	;
	.IF DF,DUAL$
45$:	MOV	R1,R3		;TEST TO SEE IF 2 CHANNELS SELECTED
	D TAB
	MOV	CSNOFA,R2	;GET CHANL CNT
	
	.IF DF,LPSDR$ ! DR11K$
	BEQ	CTAB2		;IF DI ONLY , B+C
	.ENDC
	
	MOVB	(R5)+,R1	;GET CEC	R3
	BEQ	46$		;IF TWO CHANNELS, B+C
	MOV	#12,R0		;OTHERWISE, INDICATE ERROR
	JMP	EREXIT		; AND EXIT
46$:	BIS	#40000,DMASW	HANLS & GAIN OR POLARITY
	BMI	CTAB1		;IF NEG., GO PROCESS A TABLE
TABLOP:	JSR	PC,SETAB1	;GO INSERT VALUES IN BOTH ABOVE TABS
;INDICATE DUAL SAMPLING
	ASL	DMAWDC		;GET DOUBLE WD CNT
	INC	R1		;GET INDICATOR OF BUFFERS NEEDED
	JSR	PC,BAGTM	;GET 2 CONTIG	INC	R1		;UPDATE CHANL #
	$SOB	R2,TABLOP	;ANY MORE CHANLS?,IF MORE, B&C
	BR	CTAB2		;IF NOT, B&C
SETAB1:	BIC	#177600,R1	;GET C	MOV	CSNOFC,R1	;GET NUMBER OF CHANLS
	MOVB	(R5)+,R0	;GET CHANNEL TYPE
	MOV	R0,CSTYPE	;SAVE TYPE 
	BNE	48$		;BRANCH IF NOT ALLUOUS BUFFERS
	BCS	44$		;IF NOROOM GO IND. ERROR
	MOV	#BUF2,R0	;GET SECOND POINTER FOR BUFFERS
	JSR	PC,BAGTM	;GET 2 MORE CONTI NORMAL A/D CHANLS
	JMP	ADONLY
48$:	BPL	49$		;BRANCH IF NOT A DIGITAL CHANL
	JMP	DIGCHN
	
49$:	.IF DF,DMA$
	BIT	#1,CSMODE	GUOUS BUFFERS
	BCS	44$		;IF NO ROOM, GO IND. ERROR
	
	.IF	DF,DSORT$

	.IF	NDF,INPLAC
	MOV	#BUF3,R0	;GET ADDR. OF DUMMY BUF;IS IT MODE 1
	BEQ	41$		;IF NOT, GO INDICATE ERROR
	TST	R0		;TEST CHANL TYPE AGAIN
	BLE	41$		;BRANCH IF DMA CHANLS NOT REQ.
R NEEDED
	JSR	PC,BAGTM	;GET 2 MORE CONTIGUOUS BUFFERS
	BCS	44$		;IF NO ROOM, GO IND. ERROR
	.ENDC

	.ENDC

	.ENDC
	
47$	JMP	DMAINT
	.ENDC
	
	
41$:	MOV	#6,R0		;INDICATE TYPE ERROR
	JMP	EREXIT		; AND EXIT
	

	.IF	DF,MODE1$
	
	.IF	DF,DMA$:	MOV	R1,DMAFLG	;SET DMA FLAG
	BIC	#170000,DMAWDC	;SET WD CNT
	MOV	#6,@#ADSAD	;POINTER TO DMA ADDR REG
	MOV	BUF1,@#DMAREG	;SE
	.SBTTL SECTION IS UNIQUE TO DMA INITIALIZATION


DMAINT:	CLR	DMASW		;CLEAR A/D SW AREA
	MOVB	(R5)+,DMASW	;GET CHANNEL NO.T DMA DDDR REG
	MOV	#4,@#ADSAD	;POINT TO DMA WDC REG
	MOV	DMAWDC,@#DMAREG	;SET DMA WDC REG
	MOV	DMASW,@#ADSAD	;SET A/D SW FOR
	BGE	43$		;IF NON-NEGATIVE BRANCH
	MOVB	(R5)+,DMASW	; OTHERWISE, CHANNEL NO. IS NEXT
	TSTB	(R5)+		;GET ON WORD BOUNDERY
43$: DMA
	MOV	#10000,@#DMAREG	;ENABLE DMA TRANSFER
	JMP	MD1F		;PROCESS NEXT PARAMETER
	.ENDC

	.ENDC
	.SBTTL NON-DMA INITIALID GAIN OR POLITY
	JSR	PC,SETAB1	;INSERT VALUES IN TABLES
	$SOB	R2,CTAB1	;ANY MORE CHANLS,IF SO, B&C
CTAB2:
	.IF DF,LPSDR$ ! C
	JMP	SPEXIT		;IF NOT, GO IND. ERROR
MD1D:	MOV	#BUF2,R0	;GET POINTER FOR BACK-UP BUFFERS
	JSR	PC,BAGTM	;GET NEEDED PPACE FORDR11K$

	.IF DF,MODE2$ ! MODE3$
	TST	CSTYPE		;TEST FOR DIGITAL INPUT
	BPL	CTAB3		;IF NONE, B+C

	.IF DF,MODE1$
	BIT	#1,CS CONTIGUOUS BUFRS
	BCC	MD1E		;IF SPACE OBTAINED, B&C
	JMP	SPEXIT		;IF NOT, GO IND. ERROR
MD1E:	DEC	R1		;CK FOR SINGLE CHANL MMODE	;TEST IF MODE 1
	BNE	CTAB3		;IF SO, FORGET FAKING STATUS WORD
	.ENDC

	MOV	#200,(R3)	;STORE FAKE A/D SW

	.ENDC

	.ODE
	BNE	MD1F		;IF NOT, B+C

	.IF	DF,AUTOG$
	CMP	#MD1AUT,@#CLKVEC;TEST FOR AUTO-GAINING
	BEQ	MD1F		;IF SO, B+C
	.ENDC

	ENDC
	
CTAB3:
	.IF DF,MODE1$
	.SBTTL SECTION IS UNIQUE TO MODE 1 INITIALIZATION

	.IF	DF,MODE2$ ! MODE3$
	BIT	#1,CSMODE	MOV	#MD1SNG,@#ADVEC	;STORE A/D INT VECTOR
	MOV	#100,R1		;GET INTRP ENABLE BIT
	BIC	R1,@#CLKSAD	;DISABLE CLK INTERRUPT
	BIS	R1;IS THIS MODE 1
	BNE	MD1		;IF SO, B+C
	JMP	MD2OR3		;IF NOT, B&C
	.ENDC

MD1:	MOV	#MD1ACQ,@#CLKVEC;GET ADDRESS FOR SAMPLING,@#ADSAD	;ENABLE A/D INTERRUPT FOR SINGLE A/D CHNL
	BIS	R1,ADSWTB	;SET INTRP. BIT IN S/W TABLE
MD1F:	MOV	#SMODE1,CSAMPA	;STORE
	BIS	#100,@#CLKSAD	;ENABLE CLK INTERRUPT
MD1AGR:	MOV	#ADSWTB,R2	;GET	A/D SW TAB ADDR
	MOV	(R2),R3		;GET AND SAVE FIRST A/D SW POINTER TO START/STOP ACQ.
	CLR	CSTOP		;CLEAR ACQ STOP FLAG
	DEC	BUFCNT		;GET BUFR CNT READY FOR SAMPLING
	BNE	MDD1		;IF NOT
	BPL	MD1A		;BRANCH IF NO AUTO-GAIN

	.IF	DF,AUTOG$
	MOV	#MD1AUT,@#CLKVEC;OTHERWISE, SET AUTO-GAIN INT. VECTOR
	MOV	CSNOFA, ZERO, B+C
	INC	CSTOP		;IF ZERO, STOP AFTER ONE FULL BUFFER
MDD1:	CLR	CSERRF		;CLEAR TOO FAST FLAG
	CLR	CSDONF		;CLEAR ACQ DOR1	;GET NO. OF A/D CHANNELS
MD1AA:	BIC	#170000,(R2)+	;MAKE SURE NO GAIN IS SPECIFIED
	$SOB	R1,MD1AA	;B+C TILL DONE
	BR	MD1AGRNE FLAG
	CLR	FASTER		;CLEAR SPEEDY ERROR FLAG
	CLR	CHANCE		;DON'T GIVE A SECOND CHANCE 
	CLR	BUFPAS		;CLR FLG TO ALLOW ACQ TO		;GET A/D SW TAB ADDR
	.ENDC

MD1A:	MOV	CSNOFA,R1	;GET # OF A/D CHANLS
	ADD	#40,R3		;SET A/D SW FUNC. BITS FOR 1ST CHANL
	 PASS A BUFR
	BIT	#1,R5		;GET ON WORD BOUNDARY
	BEQ	MDD2
	INC	R5
	
MDD2:	.IF DF,LPSDR$ ! DR11K$
	MOV	(R5)+,OUTDOP	;SHALL WBR	MD1C		;GO CHECK FOR MORE CHANNELS
MD1B:	MOV	+2(R2),(R2)	;PUSH STACK DOWN
	INC	(R2)+		;SET FUNC. BITS IN NEXT CHNL'S A/D SWE OUTPUT
	BEQ	MD1G		;IF NOT, B&C
	MOV	(R5)+,SDOMSK	;GET START MASK FOR D/O
	MOV	(R5)+,HDOMSK	;GET STOP MASK FOR D/O
	.ENDC
HANNEL NO.
	BIT	#100,R1		;IS THIS AN AUTO-GAIN
	BEQ	SETB1		;IF NOT, B+C

	.IF	DF,AUTOG$
	ADD	#100,R1		;IF SO, MOVE BIT TO S
MD1C:	$SOB	R1,MD1B		;CK FOR MORE CHANLS,IF MORE, B&C
	MOV	R3,(R2)+	;STORE FIRST A/D SW
	MOV	#-1,(R2)	;INDICATE END OF TABLE
IGN POSITION
	.ENDC

	.IF	NDF,AUTOG$
	MOV	#7,R0		;IND. ERROR - NO AUTOGAIN ASSEMBLED
	JMP	EREXIT		; AND EXIT
	.ENDC

SET	MOV	R3,@#ADSAD	;SET FIRST A/D SW
	MOV	BASIZ,OUTPTR	;SET BUFR ENTRY CNTR
	MOV	CSNOFC,R1	;IF NOT, GET # OF DATA CHANLS
	MOV	#BB1:	MOV	R1,(R3)		;SAVE A/D STATUS
	SWAB	(R3)+		;STORE A/D SW BITS
	RTS 	PC		;RETURN
CTAB1:	MOVB	(R5)+,R1	;GET NEXT CHANL # ANUF1,R0	;GET POINTER ADDRESS FOR 1ST BUFFERS
	JSR	PC,BAGTM	;GET NEEDED CONTIGUOUS BUFR SPACE
	BCC	MD1D		;IF SPACE AVAILABLE, B&	
MD1G:	TST	(R5)+		;CHECK START/STOP FLAG
	BMI	MD1H		;IF ST1, B+C
	BNE	MDII		;IF DIGITAL, B+C
	JMP	CSEXIT		;IF PROGRAMMED STD	;SET INTRP ENABLE FOR ST1
	JMP	CSEXIT		;EXIT


	.ENDC		
	.IF	DF, MODE1$

	.IF 	DF,LPSDR$ ! DR11K$
	.SBTTL SECTION UNIART,RETURN

MDII:	.IF NDF,LPSDR$ & DR11K$
	MOV	#10,R0		;INDICATE NO DIGITAL INPUT
	JMP	EREXIT		;AND EXIT
	.ENDC
	
	.IF	DFQUE TO INITIALIZING MODE1 ONE DIGITAL CHANNEL


DIONLY:	BIS	#100,@#CLKSAD	;ENABL CLOCK INTERRUPT
	MOV	#BUF1,R0	;GET POINTER ,LPSDR$ ! DR11K$
	TST	CSTYPE		;TEST IF A DIGITAL INPUT CHNL EXITS
	BMI	TWODI		;IF SO , INDICATE ERROR
	MOV	#DISTRT,@#DIVEC	;SFOR FIRST BUFFER
	JSR	PC,BAGET	;GET SPACE
	BCC	DONLY1		;IF SPACE OBTAINED, B&C
	JMP	SPEXIT		;IF NOT, GO IND. ERROR
DONLY1:	MET UP DIGITAL INPUT INTRPT. VECTOR
	MOV	(R5)+,SDIMSK	;IF NOT, GET START MASK FOR D/I
	MOV	(R5),HDIMSK	;GET STOP MASK FOR D/I
OV	#BUF2,R0	;GET POINTER FOR BUFFER 2
	JSR	PC,BAGET	;GET SPACE FOR BUFFER 2
	BCC	DONLY2		;IF SPACE OBTAINED, B&C
	JMP	SPEXIT		MOV	#100,@#DIOSAD	;ENABLE DIO
	JMP	CSEXIT		; AND RETURN
TWODI:	MOV	#11,R0		;INDICATE ERROR
	JMP	EREXIT
	.ENDC
	
MD1H:	MOV	;IF NOT, GO IND. ERROR
DONLY2:	MOV	#DISAMP,@#CLKVEC;SET UP CLK VECTOR TO SAMPL D/I
	JMP	MD1F		;CK FOR START UP
	.ENDC

	.E	@#CLKSAD,R0
	SUB	#14,R0		;CHECK FOR CLK CNTING ST1'S
	BIT	#14,R0	
	.ENABL	LSB
	BNE	1$		;IF OK, B+C
	MOV	#13,R0		;IF NOT, INDC
	
	.IF	DF,MODE2$ ! MODE3$
	.SBTTL SECTION OF INITIALIZATION UNIQUE TO MODES 2 AND 3

MD2OR3:	.ENABL LSB
	MOV	#CSEROR+ND. ERROR TYPE
	JMP	EREXIT		;AND RETURN
1$:	.IF	DF,DMA$ ! LPSDR$ ! DR11K$
	TST	CSTYPE		;CHECK FOR ADDT PERIPHERAL HANDLING
	1,R1	;GET ERROR TABLE
	MOV	CSNOFC,R2	;GET NO. OF ENTRIES
	BIT	#1,R5		;GET ON WORD BOUNDARY
	BEQ	1$
	INC	R5
1$:	CLRB	(R1)+		BEQ	4$		;IF ONLY ORDINARY A/D, B+C
	.ENDC
	.IF	DF,LPSDR$ ! DR11K$
	BMI	42$		;IF A DIGITAL CHANNEL IS NEEDED, B+C
	.ENDC
	.I;CLR ENTRIES
	$SOB	R2,1$		;LOOP
	CLR	RNGCNT		;CLEAR CNT
	MOV	#RNGBEG,RNGIN	;SET UP PTRS INTO RING BUFR FOR BUFRS
	MOV	#RNGBEF	DF,DMA$
	BR	2$		;OTHERWISE, DMA SO BRANCH
	.ENDC
	.IF	DF,LPSDR$ ! DR11K$
42$:	CMP	#1,CSNOFC	;CHECK FOR SINGLE DIGITAL CHANG,RNGOUT	;  TO BE PASSED TO THE CONTROL MODULE
	MOV	#RNGBEG,RNGEND
	MOV	CSNOFC,R1
	ASL	R1
	ASL	R1
	ASL	R1
	ADD	R1,RNGEND	;NEL
	BNE	4$		;IF NOT, BRANCH
	MOV	#DISTSM,NEXCVA	;SET INTRP VEC FOR DIG ONLY START
	BR	3$
	.ENDC
4$:	.IF	DF,AUTOG$
	CMP	#MGET END OF RING BUFFER ADDRESS
	MOV	CSNOFC,R4	;GET NO.OF CHANLS
	MOV	#BUF2,R2	;GET ADDR OF BUF2 PTRS
	MOV	#BUF1,R1	;GET ADDR D1AUT,@#CLKVEC	;WAS AUTOGAINING SPECIFIED
	BNE	5$		;IF NOT BRANCH
	MOV	#MD1STA,NEXCVA	;SET INTRP VEC FOR AUTO-G
	BR	3$
	.ENDOF TABLE OF BUF1 PTRS
	MOV	#OUTPTR,R3	;GET ADDR OF TABLE OF BUFR 1 ENTRY CNTRS
2$:	MOV	R1,R0		;GET ADDR. OF BUFR 1 PTR FOR NEXC
5$:	CMP	#1,CSNOFC	;CHECK FOR SINGLE A/D CHANNEL METHOD
	BEQ	2$		;IF SO , BRANCH
	MOV	#MD1STN,NEXCVA	;SET INTRP VEC FOR MULTT CHANL
	JSR	PC,BAGET	;GET BUFFER
	BCC	3$		;IF NO ROOM, GO IND ERROR BY B&C
	JMP	SPEXIT		;GO IND ERROR
3$:	MOV	BASIZ,(R3)+	;I A/D CHAN 
	BR	3$
2$:	MOV	#ST1END,NEXCVA	;SET INTP VECTOR
3$:	MOV	#ST1INT,@#CLKVEC	;SET INTERUPT VECTOR
	BIS	#40000,@#CLKSASTORE ADDR. FOR OUTPUT POINTER
4$:	MOV	(R1)+,(R2)+	;INCREMENT ALL THE BUFFER POINTER POINTERS
	$SOB	R4,2$		;ANY MORE CHANLS,IFMK	;GET MASK TO STOP ACQUISTION ENTIRELY
	.ENDC
	
	.IF DF,MODE3$
	BIT	#4,CSMODE	;IS THIS MODE 3
	BNE	MODE3A		;IF SO , GO PRERROR
	MOV	CSNOFC,R2	;GET # OF CHNLS(DIG. IS LAST ONE)
	.ENDC

1$:	DEC	R2		;GET IN ROUND ROBIN TAB. ENTRY FORM
	BR	5$		;GO OCESS MORE PARAMETERS
	.ENDC
	
	.IF	DF,MODE2$
	TST	(R5)		;TEST FOR DIGITAL START
	BEQ	MD2A		;IF ZERO, PROGRAMMED START, B+CENTER IN TABLE
2$:	MOV	#ADSWTB+1,R3	;GET A/D SW TAB(ALSO CONTAINS CHNL #'S)
	MOV	CSNOFA,R4	;GET # OF A/D CHANLS
	BEQ	4$		;IF 


	.IF	NDF,LPSDR$ & DR11K$
	MOV	#10,R0		;IF NOT AVAILABLE, IND ERROR
	JMP	EREXIT
	.ENDC

	.IF DF,LPSDR$ ! DR11K$
	TST	NONE, ERROR

	.IF	DF,AUTOG$
	BIT	#100,R1		;CHECK FOR AUTOGAINNING CHANNEL
	BEQ	3$		;IF NOT ONE, BRANCH
	ADD	#100,R1		;OTHER YES, B&C
	MOV	#SAMP23,CSAMPA	;STORE START/STOP ADDRESS
	CLR	CSDONF		;CLEAR MORE FLAGS
	CLR	CSDATA
	CLR	BUFPAS
	CLR	CSCHDNCSTYPE		;CHECK FOR DIGITAL CHANNEL
	BEQ	MD2B		;IF NONE SPECIFIED , CONTINUE
	MOV	#11,R0		;OTHERWISE, A CONFLICT
	JMP	EREXIT

	MOV	#-1,SAMFLG	;SET FIRST FLAG
	
	.IF DF,LPSDR$ ! DR11K$
	MOV	(R5)+,OUTDOP	;WILL THERE BE DIGITAL OUTPUT
	BEQ	MD23AI		;IF MD2B:	MOV	#DIMD23,@#DIVEC
	MOV	#100,@#DIOSAD	;IF NOT, DI START. ENABLE INT.
	.ENDC
	
MD2A:	INC	@#CLKSAD	;START CLOCK
	MOV	NNOT, B&C
	MOV	CSNOFC,R1	;GET # OF CHANNELS
	MOV	#HDOMSK,R0	;STORE PTR FOR STOP OUTP MASK TABL
	MOV	R1,R2		;GET SECOND COPY OFXCKCT,@#CLKBUF	;SET NEXT CLOCK BUF/PRE
	JMP	CSEXIT		;RETURN
	.ENDC

	.IF DF,MODE3$
	.SBTTL SECTION OF INITIALIZATION UNIQU CHNLS CNT FOR SUB		
	MOV	#SDOMSK,R4	;GET ADDR OF STRT TABL
	JSR	PC,SETAB2	;FILL MASK TABLES
	.ENDC
	
MD23AI:	MOV	CSNOFC,R1E TO MODE 3
	
MODE3A:	MOV	(R5)+,R0	;GET COUNT OF SAMPLING TABLE
	MOV	R0,CSCHDN	;SAVE COUNT
	ASR	R0		;ONE BYTE PER TABLE ENTR	;GET NO. OF CHANLS
	MOV	#HDIMSK,R0	;STORE ADDR. FOE STOP INPUT MASKS
	MOV	#SDIMSK,R4	;GET ADDRESS OF START INPUT MASKS
	MOV	Y
	INC	R0
	JSR	PC,BAWDS	;GET SPACE FOR SAMPLING TABLE
	BCC	MODE3B		;IF SPACE OBTAINED, B+C
	JMP	SPEXIT		;IF NOT, IND. ERROR R1,R2		;GET A SECOND COPY OF # OF CHANLS
	JSR	PC,SETAB2	;FILL MASK TABLES
	BR	MD23HI

SETAB2:	MOV	(R5)+,R3	;CHECK TO SEE IF AND EXIT
MODE3B:	MOV	R0,RRTBEG	;STORE ADDR OF ROUND ROBIN TABLE
	MOV	R0,RRTEND	;SET UP END AND
	MOV	R0,CRRPTR	; CURRENT PTR TALL START MSKS SAME
	BEQ	MD23DI		;IF NOT, B&C
MD23CI:	MOV	R3,(R4)+	;STORE MASK IN TABLE # OF CHNL TIMES
	$SOB	R1,MD23CI
	BR	O ROUND ROBIN TABLE
	ADD	CSCHDN,RRTEND
MODE3C:	CLR	R2		;PREPARE TABLE OFFSET COUNTER
	.ENABL	LSB
	MOVB	(R5)+,R1	;GET NEXT ROMD23EI
MD23DI:	MOV	(R5)+,(R4)+	;STORE EACH MASK IN TABLE
	$SOB	R1,MD23DI
MD23EI:	MOV	(R5)+,R3	;TEST TO SEE IF ALL THE SAME STUND ROBIN TABLE ENTRY
	BPL	2$		;IF AN A/D CHANNEL, BRANCH
	INC	R1		;CHECK FOR A DELAY
	BEQ	1$		;IF A DELAY, BRANCH

	.IF	NDOP MASKS
	BEQ	MD23GI		;IF NOT, B&C
MD23FI:	MOV	R3,(R0)+	;STORE STOP MASK IN TABL # OF CHNL TIMES
	$SOB	R2,MD23FI
	RTS	PC		;RF,LPSDR$ & DR11K$
	BR	4$		;ILLEGAL ENTRY, GO INDICATE
	.ENDC

	.IF	DF,LPSDR$ ! DR11K$
	TST	CSTYPE		;CHECK FOR A DIG. ACQ. CETURN
MD23GI:	MOV	(R5)+,(R0)+	;STORE EACH STOP INPUT MASK IN TABLE
	$SOB	R2,MD23GI
	RTS	PC		;RETURN

MD23HI:	MOV	(R5)+,STOPHNL SPECIFIED
	BEQ	4$		;IF NONE SPECIFIED, ENTRY ERROR
	INC	R1		;OTHERWISE CHECK IF TRUE ENTRY
	BNE	4$		;IF NOT, GO INDICATE RROR TO INDICATE
	BR	EREXIT
6$:	MOV	#DIMD23,@#DIVEC
	ADD	#100,@#DIOSAD	;ENABLE DI INT
	.ENDC
	
MODE3H:	ADD	#101,@#CLKSAD	;E JUST RETURNS.  IF IT DOES MATCH, THE CLOCK IS
	;ENABLED, AND ALL FURTHER DIGITAL INPUT INTERRUPTS ARE 
	;DIRECTED TO "DISTOPSTART CLOCK
	JMP	CSEXIT

	.ENDC










SPEXIT:	CLR	R0		;INDICATE NOROOM ERROR
EREXIT:	SEC			;SET CARRY, INDICA"

DISTRT:	MOV	@#DIBUF,CSIDIG	;GET THE D.I AND PUT IN GLOBAL
	MOV	CSIDIG,@#DIBUF	;CLEAR D.I. REG
	BIS	#100,@#DIOSAD	;RE-ENABTE ERROR
	BR	CEXIT		;EXIT
CSEXIT:	CLRB	CSEROR		;CLEAR FATAL ERROR INDICATOR
	CLR	R0		;INDICATE NO ERRORS
	CLC			;CLEAR CARRYLE DI INTERRUPT
	BIT	SDIMSK,CSIDIG	;TEST FOR START BITS
	BEQ	DISTRR		;IF NO MATCH, JUST RETURN
	JSR	PC,SMODE1	;GO ENABLE OR D, INDICATE NO ERROR
CEXIT:	JSR	PC,RSTRG	;RESTORE REGISTERS 1-4
	RTS 	PC
	
	.SBTTL ACQUISITION SECTIONS

CSAMPL:	JSR	PC,@CISABLE CLOCK
	MOV	#DISTOP,@#DIVEC	;SET VECTOR TO CHECK FOR HALT
DISTRR:	RTI			;RETURN

	;DIGITAL INPUT STOP ROUTINE
	; AFTESAMPA	;GO TO APPRO ROUTINE
	RTS	PC
	
	.SBTTL	START UP ROUTINE FOR MODE 1 
	
	.IF 	DF,MODE1$ 

SMODE1:	MOV	#HMODE1,CSAMPA	R ACQUISITION HAS STARTED, ALL DIGITAL INTERRUPTS ARE
	;HANDLED BY "DISTOP" IF "ATSTRT" IN THE INITIALIZATION 
	;PARAMETER TAB;CHAMGE POINTER TO STOP TEST
	
	.IF	DF,LPSDR$ ! DR11K$
	TST	OUTDOP		;IS D/O REQUIRED ON START
	BEQ	SMD1B		;IF NOT, B+C
	MOVLE WAS POSITIVE. IF THE DIGITAL INPUT RECEIVED
	;MATCHES THE DIGITAL INPUT STOP BIT MASK, THE CLOCK IS DISABLED
	;BUFFERS ARE WISE, GET IN PROPER FORM FOR SEARCH
	.ENDC

3$:	CMPB	(R3)+,R1	;TEST FOR A MATCHING CHANNEL NO.
	BEQ	5$		;IF A MATCH IS FOUND	SDOMSK,@#DOBUF	;IF SO, OUTPUT DIGITALLY
	.ENDC
	
SMD1B:	INC	@#CLKSAD	;START CLOCK
	RTS	PC
	
HMODE1:	.IF DF,LPSDR$ ! DR11K, GO ENTRY IN RR TAB
	TSTB	(R3)+		;OTHERWISE, INC. A/D SW TABLE POINTER
	INC	R2		;INC OFFSET COUNTER
	$SOB	R4,3$		;CHECK FOR $
	TST	OUTDOP		;IS D/0 REQUIRED ON HALT
	BEQ	HMD1C		;IF NOT, B+C
	MOV	HDOMSK,@#DOBUF	;IF SO, OUTPUT DIGITALLY
	.ENDC
	
HMDMORE POSSIBILITIES TO CHECK
4$:	MOV	#14,R0		;SEARCH FAILED BECAUSE OF ILLEGAL ENTRY
	BR	EREXIT		;GO IND. ERROR
5$:	MOVB	R2,(R1C:	INC	CSTOP		;INDICATE TO HALT ACQ AFTER NEXT BUFR
	RTS	PC
	

	.SBTTL	SECTION FOR ST1(OR EXT INP) INTRPT START

ST1INT:	0)+	;ENTER OFSET IN ROUND ROBIN TABLE
	DEC	CSCHDN		;ANY MORE R.R. TABLE ENTRIES
	BNE	MODE3C		;IF SO, BRANCH AND CONTINUE,OTHERJSR	PC,SMODE1	;START ACQ
	BIC	#100000,@#CLKSAD	;CLEAR ST1 FLG
	MOV	NEXCVA,@#CLKVEC	;REDIRECT CLK INT VEC
	RTI


ST1END:	JSWISE
	MOV	#SAMOD3,@#CLKVEC;STORE CLKVEC ADDRESS
	BIT	#1,R5		;GET ON WORD BOUNDARY
	BEQ	55$
	INC	R5
55$:	TST	(R5)
	BEQ	MODER	PC,HMODE1	;STOP ACQ
	BIC	#140000,@#CLKSAD	;CLR ST1 FLG AND ST1 INT ENABLE
ST1NOP:	RTI
	.IF	DF,LPSDR$ ! DR11K$

	
	.SBTT3H		;IF NOT A DIGITAL START, B+C

	.IF	NDF,LSPDR$ ! DR11K$
	MOV	#10,R0		;INDICATE NO DIG. ASSM.
	BR 	EREXIT
	.ENDC
	
	.IFL DIGITAL INPUT INTERRUPT ROUTINES
	
	;DIGITAL START ROUTINE
	; WHEN A DIGITAL INTERRUPT IS RECEIVED AFTER INITIALIZATION
	;	DF,LPSDR$ ! DR11K$
	TST	CSTYPE		;CHECK FOR DIG. ACQ. CHANNEL
	BEQ	6$		;IF NONE, CONTINUE
	MOV	#11,R0		;OTHERWISE, CONFLICT ETHIS ROUTINE CHECKS TO SEE IF THE INPUT CONTAINS THE BITS
	;WHICH MATCH THE DIGITAL INPUT START BIT MASK. IF NOT,
	;THE ROUTIN	
	.SBTTL	SINGLE RATE,CONTROL. MULTI-CHANNEL
	
MD1STN:	TST	@#CLKSAD	;TEST FOR ST1 PULSE
	BPL	MD1ACQ		;IF NOT, B+C
	JMP	ST1ENC	CHANCE		;INDICATE SLOWED DOWN, SO GIVE ONE CHANC
	INC	CSTOP		;IND. TO STOP IF TRYING TO PASS BUFRS
	.INTEN	5		;CHANGE PRIORND		;IF SO, GO STOP
MD1ACQ:	BIC	#200,@#CLKSAD	;CLEAR DONE BIT
	TST	@#ADSAD		;CHECK FOR ERROR
	BPL	MD1A2		;IF NONE, CONTINUE
ITY LEVEL TO 5
	BR	6$
5$:	JSR	PC,KILLM1	;IF SO, SHUT DOWN SYSTEM
	TST	BUFPAS		;WAS THE MODULE PASSING A BUFFER
	BNE	55$		;IF	DEC	CHANCE		;IS THIS THE FIRST BAD POINT
	BMI	M3		;IF NOT, STOP ACQ
MD1A2:	MOV	R2,-(SP)	;SAVE REGS 2-4
	MOV	R3,-(SP)
	MOV	R SO, B+C
	.INTEN	5		;LOWER PRIORITY
	MOV	BUF1,BUFPAS	;GET OFFSETTED BUFFER PTR
	INC 	CSDONF		;IND. LAST BUFFER
	BR 	7$
55$:4,-(SP)
	MOV	BBASIZ,R2	;GET # OF BUFFER BYTES
	MOV	BUF1,R3		;GET CUR. PTR. INTO OUTPUT BUFR
	MOV	#ADSWTB,R4	;GET A/D SW TABLE	SUB	BBASIZ,BUF1	;RESET BUFFER POINTER
	INC	CSERRF		;INDICATE ACQ STOPPED ABNORMALLY
	RTI			; AND RETURN
6$:	TST	BUFCNT		;SHO
	BR	MD1LOP
MD1NXT:	ADD	R2,R3		;POINT INTO NEXT BUFFER
MD1LOP:	TSTB	@#ADSAD		;CK FOR CONVERSION COMPLETE
	BPL	MD1LOP		;IF NOULD BUFR CNT BE TESTED
	BMI	7$		;IF NOT, B+C
	DEC	BUFCNT		;IF IT SHOULD, TEST TO STOP ACQ ON BUFCNT
	BNE	7$		;IF NOT, B+C
	IT, B+C
	MOV	(R4)+,@#ADSAD	;START NEXT CHANNEL
	MOV	@#ADBUF,(R3)	;STORE DATA
	TST	(R4)		;TEST FOR END OF TABLE
	BPL	MD1NXT		;NC	CSTOP		;SET ACQ FINISHED FLG FOR THIS MODULE
7$:	MOV	R2,-(SP)	;SAVE REGISTERS 0-2
	MOV	R1,-(SP)	;.INTEN SAVES REG 4-5
	MOVIF MORE CHANNELS, B+C
	.ENABL	LSB

MD1DIG:	.IF	DF,LPSDR$ ! DR11K$
	TST	CSTYPE		;TEST FOR DIGITAL INPUT
	BPL	1$		;IF NONE, B	R0,-(SP)
	MOV	BUFPAS,R1	;GET OFFSETTED BUFFER PTR
	MOV	BBASIZ,R5	;GET BUFFER SIZE
	SUB	R5,R1		;RESET BUFR PTR
MD1MPS:	MOV	B+C
	ADD	R2,R3		;POINT TO NEXT BUFFER
	MOV	@#DIBUF,(R3)	;GET DIGITAL VALUE AND STORE
	MOV	(R3),@#DIBUF	;CLEAR DIGITAL VALUE INASIZ,R2	;GET BUFR SIZE IN WORDS
MD1CON:	MOV	CSNOFC,R4	;GET TOTAL # OF BUFRS TO PASS
	.ENABL LSB
	CLR	R0		;SET FIRST DPID
	TS BUFR
	.ENDC

1$:	ADD	#2,BUF1		;POINT FO NEXT ENTRY IN BUFFER
	MOV	(SP)+,R4	;RESTORE REGS 2-4
	MOV	(SP)+,R3
	MOV	(SP)+,R2T	CSDONF		;TEST FOR ACQ STOPPED
	BNE	1$		;IF SO, LEAVE LBI POSITIVE
	NEG	R2		;OTHERWISE NEGATE IT
1$:	JSR	PC,CTIBUF	;PASS BUFPASSED, AND, IF A FOREGROUND JOB, FOREGROUND 
	;MAINSTREAM PROCESSING IS RESUMED. ALL FURTHER DIGITAL INPUT
	;INTERUPTS ARE IG
	DEC	OUTPTR		;HAVE THE BUFFERS BEEN FILLED
	BEQ	M4		;IF SO, B+C
	BIT	#200,@#CLKSAD	;ARE WE SAMPLING TOO FAST
	BNE	2$		;IF SONORED BY THIS ROUTINE

DISTOP:	MOV	@#DIBUF,CSIDIG	;GET THE D.I. AND PUT IN GLOBAL
	MOV	CSIDIG,@#DIBUF	;CLEAR D.I. REG
	BIS	#, B+C
	RTI			;IF NOT, RETURN
2$:	DEC	CHANCE		;SHALL WE GIVE IT ANOTHER CHANCE
	BMI	M3		;NO
	RTI
M3:	JSR	PC,TOFAST	;GO STOP 100,@#DIOSAD	;RE-ENABLE DI INTERRUPT
	BIT	HDIMSK,CSIDIG	;TEST FOR STOP BITS
	BEQ	DISTPR		;IF NO MATCH, JUST RETURN
	JSR	PC,HMTHINGS
	MOV	BBASIZ,R5	;GET BYTE BUFFER COUNT
	BR	MD1CON		;GO PASS BUFFER
M4:	TST	CSTOP		;SHOULD ACQ STOP
	BNE	5$		;IF NOT, BODE1	;GO STOP PROCESS
	CLR	HDIMSK		;SET MASK TO IGNORE ALL INPUT
DISTPR:	RTI			;RETURN
	.ENDC

	.ENDC
	
	.IF	DF,MODE1$
+C
	MOV	BUF1,BUFPAS	;GET OFFSETTED BUFR PTR
	MOV	BUF2,BUF1	;SET UP NEXT BUFR PTR
	MOV	BASIZ,OUTPTR	;RESET BUFR ENTRY CNTR
	I1NST:	MOV	#BUF2,R0	;GET POINTER FOR BACKUP BUFRS
	MOV	CSNOFC,R1	;GET NO. OF CONTIGU BUFRS 
	TST	CSDONF		;TEST FOR ACQ STOPPEDOWER PRIORITY
	CLR	CHANCE		;SHOULD HAVE USED CHANCE BY NOW
	TST	CSDONF		;IS ACQ DONE
	BEQ	7$		;IF NOT, B+C
	DEC	CTIDON		;IF 
	BNE	3$		;IF SO, B+C
	JSR	PC,BAGTM	;IF NOT, GET MORE BUFFERS
	BCC	4$		;IF SPACE OBTAINED, B+C
2$:	INC	CSTOP		;INDICATE ACQ SIT IS, TELL THE CONTROL MODULE
	CLR	CSDONF		;DON'T DEC CTIDON AGAIN
7$:	RTS	PC		;RETURN VIA INTEN,SYNCH,RSUM

	.IF	DF,FG$
STOPPED
	CLR	BUF2		;PUT DUMMY VALUE FOR BUFR
	BR	4$		;CONTINUE
3$:	MOV	(R0),R0		;GET ADDRESS OF BUFFERS
	JSR	PC,BARLM	;RELEASYNER1:	JMP	KILLM1		;STOP ACQ
	INCB	CSEROR		;RECORD ERROR
	.ENABL	LSB
	TST	CSDONF		;TEST FOR ACQ STOPPED
	BEQ	1$		;IF NOT, BRE BACKUP BUFFERS
4$:	MOV	(SP)+,R0	;RESTORE REGS 0-2
	MOV	(SP)+,R1	;.SYNC WILL RESTORE 4-5
	MOV	(SP)+,R2
	
	.IF	DF,FG$
	TSTANCH 
	DEC	CTIDON		;OTHERWISE, TELL C.M. WE'RE DONE
	RTS	PC
1$:	TST	CSERRF		;CHECK FOR ADDIT. BUFFER WAITING
	BNE	MD1MEC		;I	CTRUN		;DO WE NEED A SYNCH
	BNE	45$		;IF NOT, BRANCH
	.SYNCH #SYNCTL
	BR	SYNER1
	INC	CTRUN		;INDICATE SYNC
	.RSUM
	.ENDCF SO, BRANCH
	INC	CSERRF		;OTHERWISE, MIMIC GOING TOO FAST TO
	INC	FASTER		; PASS A LAST PARTIAL BUFFER
	JSR	PC,NOTFUL	;RESET

45$:	BIS	#340,@#PS	;;RAISE PRIORITY WHILE CHECKING FOR ERS
MD1MEC:	TST	CSERRF		;;TEST FOR GOING TOO FAST
	.ENABL	LSB
	BLE	 BUF1 AND WORD COUNT
	BR	MD1MEC		;GO PASS BUFFERS
	.ENDC

NOTFUL:	MOV	R2,-(SP)	;SAVE R2
	MOV	BASIZ,R2	;GET BU;FFER SIZE
	S6$		;;IF ALRIGHT , B+C
	INCB	CSEROR		;RECORD ERROR COUNT
	CLR	CSERRF		;CLEAR ERROR FLAG, APPROP. ACTION TAKEN
	BIC	#100,@#PS	UB	OUTPTR,R2	;GET NO. OF ENTRIES
	ASL	R2		;GET NO. OF BYTES
	SUB	R2,BUF1		;RESET BUFFER POINTER
	ASR	R2		;GET NO. OF WORDS
	;LOWER PRIROITY IF ACQ STOPPED
	MOV	R2,-(SP)	;SAVE REGS 0-2
	MOV	R1,-(SP)	;.SYNCH SAVES 4-5
	MOV	R0,-(SP)
	INC	CSDONF		;IND.MOV	R2,CNT		;OTHERWISE, STORE CNT
	MOV	(SP)+,R2	;RESTORE R2
	RTS	PC


TOFAST:	JSR	PC,KILLM1	;STOP ACQ
	JSR	PC,NOTFUL	;RESE ACQ HAS STOPPED
	MOV	BUF1,R1		;GET BUFR POINTER

	.IF	DF,DMA$ & DUAL$
	.IF	NDF,DSORT$
	TST	CSTYPE		;TEST FOR DMA
	BLE	56$T BUF1 AND WORD COUNT
	MOV	(SP)+,JMPADR	;STORE RETURN ADDRESS
	TST	BUFPAS		;TEST FOR BUFFER PASSING
	BEQ	TO2		;IF NOT PASSING		;IF NOT DMA, BRANCH
	CMP	#2,CSNOFC	;IF DMA, CHECK FOR DUAL SAMPLING
	BNE	56$		;IF NOT,BRANCH
	JMP	DMANST		;OTHERWISE , BRAN, B+C
	INC	FASTER		;SET FAST ERR
	INC	CSERRF		;IND ERROR IN ACQ
	RTI			;AND RETURN
TO2:	.INTEN	5		;LOWER PRIORITY TO 5
	INCCH
	.ENDC
	.ENDC

56$:	MOV	BBASIZ,R5	;GET BUFFER SIZE IN BYTES
	TST	FASTER		;CHECK ERROR TYPE
	BNE	55$		;IF SAMPLING RATE B	CSEROR		;RECORD ERROR
	MOV	R2,-(SP)	;SAVE REG 0-2
	MOV	R1,-(SP)
	MOV	R0,-(SP)	;REG 4-5 SAVED BY .INTEN
	MOV	CNT,R2		;GET CTOO FAST TO SAMPLE,B+C
	JMP	MD1MPS		;GO PASS LAST BUFFER
55$:	CLR	FASTER		;CLEAR ERROR FLAG
	MOV	CNT,R2		;GET SAMPLE COUNT
	OUNT
	MOV	BUF1,R1		;GET BUFFER ADDRESS
	INC	CSDONF		;IND. ACQ STOPPED TO MODULE
	JMP	@(PC)		;RETURN
JMPADR:	.WORD	0


KILR TO CONTROL MODULE
	ADD	R5,R1		;POINT TO NEXT BUFR
	INC	R0		;UP DPID NO.
	$SOB	R4,1$		;ANOTHER BUFFR TO PASS? IF YES,B+C
MDBR	MD1CON		;OUTPUT BUFFER
6$:	DEC	CSTOP		;IND. READY TO PASS MORE BUFFERS
	CLR	BUFPAS		;NOT PASSING BUFFERS
	BIC	#100,@#PS	;L2$:	CMP	R5,#4200	;SHOULD GAIN VALUE BE ABOVE 4
	BGE	4$		;IF NOT, B+C
	CMP	R5,#4040	;SHOULD GAIN VALUE BE 16
	BLT	3$		;IF NOT,R ENTRY CNTR
	MOV	BUF1,BUFPAS	;GET BUFR TO PASS
	MOV	BUF2,BUF1	;REPLCE PRIMARY BUFR
	INC	CHANCE		;INDICATE SLOWED DOWN, SO GI NO OTHER GAIN NEEDED, B+C
	MOV	#20000,R0	;OTHERWISE, SET GAIN BITS TO 16
	BR	9$		;GO TO SET GAIN AND RESAMPLE
3$:	MOV	#30000VE ONE CHANC
	INC	CSTOP		;IND. TO STOP IF HERE TOO FAST
	.INTEN	5		;RESET PRIORITY TO LEVEL 5
	BR	2$
1$:	JSR	PC,KILLM1	;IF SLM1:	CLR	@#ADSAD		;SHUT DOWN ACQ - A/D,CLK,DI/O
	CLR	@#CLKSAD
	MOV	#IGNORA,@#ADVEC	; AND DUMMY UP VECTORS
	MOV	#IGNORI,@#CLKV,R0	;SET GAIN BITS TO 64
9$:	ADD	R0,@#ADSAD	;SET GAIN BITS IN A/D SW
	INC	@#ADSAD		;ENABLE A/D CONVERT
	BR	1$		;GO WAIT FOR CEC

	.IF	DF,LPSDR$ ! DR11K$
	MOV	#IGNORI,@#DIVEC
	CLR	SDIMSK
	CLR	HDIMSK
	TST	OUTDOP		;IS OUTPUT REQUIRED ON HALT
	BEQ	KIONVERSION
4$:	CMP	R5,#5000	;SHOULD GAIN VALUE BE 4
	BGE	5$		;IF NOT, B+C
	MOV	#10000,R0	;IF SO, SET GAIN BITS TO 4
	BR	9$		;LM1A		;IF NOT, B+C
	MOV	HDOMSK,@#DOBUF	;IF SO, OUTPUT REQUIRED MASK
	.ENDC

KILM1A:	RTS 	PC		;RETURN
	.ENDC

	.IF	DF,AUTAND GO TO SET GAIN AND RESAMPLE
5$:	TST	COMFLG		;TEST IF VALUE WAS NEGATED
	BEQ	10$		;IF IT WAS NOT, B+C
	BIS	#170000,R5	;IF OG$


	.SBTTL	SINGLE RATE,CONTROL. MULTI-CHANNEL AUTO-GAIN

	
MD1STA:	TST	@#CLKSAD	;TEST FOR ST1 PULSE
	BPL	MD1AUT		;IF NIT WAS, 
	NEG	R5		; RE-NEGATE IT
10$:	MOV	(R4)+,@#ADSAD	;START NEXT CHANNEL
	ADD	R0,R5		;IND. GAIN BITS IN DATA
	MOV	R5,(R3)OT THERE, B+C
	JMP	ST1END		;IF THERE, GO STOP
MD1AUT:	BIC	#200,@#CLKSAD	;CLEAR DONE BIT
	MOV	R2,-(SP)	;SAVE REG 2-4
	MOV	R3,		;STORE DATA
	TST	(R4)		;TEST FOR END OF TABLE OF A/D SW
	BPL	15$		;IF NOT AT END, B+C
	MOV	(SP)+,R5	;RESTORE REG 5+0
	MOV	-(SP)
	MOV	R4,-(SP)
	MOV	R0,-(SP)	;SAVE REG 0+5
	MOV	R5,-(SP)
	MOV	BBASIZ,R2	;GET BUFR SIZ
	MOV	BUF1,R3		;GET CUR. BUFR. EN(SP)+,R0
	JMP	MD1DIG		;OTHERWISE, CHECK FOR D/I AND FILLED BFS
	.ENDC

	.IF	DF,MODE1$

	.SBTTL SINGLE RATE,CONTROL,A/D CHTRY PTR.
	MOV	#ADSWTB,R4	;GET A/D SW TABLE ADDR.
	CLR	R0		;SIGNAL FIRST CONVERSION FOR CHNL
	.ENABL	LSB
	BR	17$
15$:	CLR	R0ANNEL ACQUISITION

MD1SNG:	MOV	@#ADBUF,@BUF1	;STORE NEXT A/D VALUE

	.IF	NDF,AR11
	TST	@#ADSAD		;CHECK FOR ERROR
	BGE	MD1S		;CLEAR FIRST CONVERSION FLAG
	ADD	R2,R3		;POINT INTO NEXT BUFFER
1$:	TSTB	@#ADSAD		;TST FO CONVERSION DONE
	BPL	1$		;IF NOTCN		;IF NONE, CONTINUE
	DEC	CHANCE		;DOES IT GET A SECOND CHANCE
	BEQ	MD1SCM		;IF SO, BRANCH AND CONTINUE
	JSR	PC,TOFAST	;OTH, BRANCH AND TEST AGAIN
17$:	MOV	@#ADBUF,R5	;GET A/D CONVERTED VALUE
	TST	R0		;IS THIS THE 1ST CONVERT. FOR CHANL
	BNE	10$		;ERWISE, STOP THINGS NOW
	BR	MD1ERR		;IF NOT PASSING BUFFERS, GO PASS BUFFER
MD1SCM:	BIC	#100000,@#ADSAD	;CLEAR ERROR FLAG
	.EIF NOT, B+C
	CLR	COMFLG		;CLEAR COMPLEMENT FLAG
	CMP	R5,#4000	;IS VALUE IN NEGATIVE RANGE
	BGE	2$		;IF NOT, B+C
	INC	COMFLG	NDC

MD1SCN:	ADD	#2,BUF1		;POINT TO NEXT ENTRY IN BUFFER
	DEC	OUTPTR		;ANY MORE ROOM IN BUFFER
	BEQ	MD1ONE		;IF NOT, B+C
	R	;IF SO, IND. TO NEGATE
	NEG	R5		;GET NO. IN RIGHT RANGE
	BEQ	10$		;IF ZERO, NO NEED FOR GAIN
	BIC	#170000,R5	;WITHOUT SIGN
TI			;IF THER IS, RETURN
MD1ONE:	TST	CSTOP		;IS ACQ FINISHED
	.ENABL LSB
	BNE	1$		;IF SO, B+C
	MOV	BASIZ,OUTPTR	;RESET BUFFEBUFR
	TST	CSDONF		;HAS ACQ STOPPED
	BNE	4$		;IF SO, GO RELEASE BUFR
	JSR	PC,BAGET	;IF NOT, GO GET BACK-UP BUFR
	BCC	5$		;IF 		;OTHERWISE, TELL C.M. WE'RE DONE
	RTS	PC
1$:	TST	CSERRF		;CHECK FOR ADDIT. BUFFER WAITING
	BNE	MD1SEC		;IF SO, BRANCH
	INCSPACE OBTAINED, B+C
	INC	CSTOP		;IND. ACQ STOPPED
	CLR	BUF2		;SET UP DUMMY ADDR. AT BUFFER 2
	BR	5$		;GO EXIT
4$:	MOV	(R0),R	CSERRF		;OTHERWISE, MIMIC GOING TOO FAST TO
	INC	FASTER		; PASS A LAST PARTIAL BUFFER
	JSR	PC,NOTFUL	;RESET BUF1 AND WORD COU0		;GET ADDR OF BUFR TO RELEASE
	JSR	PC,BAREL	;RELEASE BUFR
5$:	MOV	(SP)+,R0	;RESTORE REG. 0-2
	MOV	(SP)+,R1
	MOV	(SP)+,R2
NT
	BR	MD1SEC		;GO PASS BUFFERS
	.ENDC

	.ENDC
	.IF	DF,MODE1$

	.IF	DF,LPSDR$ ! DR11K$


	.SBTTL	SINGLE RATE,CONTROL,	
	.IF	DF,FG$
	TST	CTRUN		;DO WE NEED  A SYNCH
	BNE	6$		;IF NOT BRANCH
	.SYNCH	#SYNCTL	
	BR	SYNER2		;IF ERROR
	INC	CTRUN		 DIGITAL INPUT

DISTSM:	TST	@#CLKSAD	;TEST ST1 PULSE
	BPL	DISAMP		;IF NOT THERE, B+C
	JMP	ST1END		;IF THERE, STOP THINGS
DI;INDICATE SYNC
	.RSUM
	.ENDC

6$:	BIS	#340,@#PS	;;AVOID INTERRUPTS WHILE CHECKING ERS
MD1SEC:	TST	CSERRF		;;IS SYSTEM RUNNISAMP:	MOV	@#DIBUF,@BUF1	;STORE NEXT D/I VALUE
	MOV	@BUF1,@#DIBUF	;CLEAR DIGITAL INPUT
	ADD	#2,BUF1		;POINT TO NEXT BUFR ENTRYO, STOP ACQ.
	TST	BUFPAS		;CK FOR PASSING BUFFER
	BNE	15$		;IF SO, B+C
	.INTEN	5		;LOWER PRIORITY
	MOV	BUF1,BUFPAS	;GET BUFFNG TOO FAST
	.ENABL	LSB
	BEQ	7$		;;IF NOT, B+C
	INCB	CSEROR		;RECORD ERROR NUMBER
	CLR	CSERRF		;CLEAR ERROR FLAG. APPROP. ACER TO PASS
	INC	CSDONF		;IF NOT, IND. LAST BUFFER
	BR	3$
15$:	SUB	BBASIZ,BUF1	;POINT TO START OF BUFFER
	INC	CSERRF		;IND. GTION TAKEN
	BIC	#100,@#PS	;LOWER PRIORITY SINCE ACQ HAS STOPPED
	MOV	BUF1,BUFPAS	;GET LAST BUFFER
	INC	CSDONF		;INDICATE ACQ OING TOO FAST
	RTI			;AND RETURN
2$:	TST	BUFCNT		;DOES ACQ. STOP ON BUFR COUNT
	BMI	3$		;IF NOT, B+C
	DEC	BUFCNT		;IF SO, SHSTOPPED

	.IF	DF,AR11
	BR	MD1SP1		;GO PASS AND RELEASE LAST BUFFER
	.IFF
	TST	FASTER		;CHECK FOR ERROR TYPE
	BEQ	MD1SP1		;OULD ACQ STOP
	BNE	3$		;IF NOT, B+C
	INC	CSTOP		;IF SO, INDICATE
3$:	SUB	BBASIZ,BUFPAS	;GET START ADDRESS OF BUFR TO PASS
MDGO PASSS AND RELEASE LAST BUFFER
	MOV	R2,-(SP)	;RESAVE REGISTERS IF TOO FAST FOR ACQ. 
	MOV	R1,-(SP)
	MOV	R0,-(SP)
	MOV	CNT,1SP1:	MOV	R2,-(SP)	;SAVE REG 0-2
	MOV	R1,-(SP)
	MOV	R0,-(SP)
	MOV	BASIZ,R2	;GET BUFGER SIZE
MD1ER1:	MOV	BUFPAS,R1	;GET BUFFER2		;GET CORRECT WORD COUNT
	BR	MD1ER1		;GO PASS BUFFER
	.ENDC

7$:	DEC	CSTOP		;IND. READY TO PASS MORE BUFRS
	CLR	BUFPAS		R ADDRESS
	.ENABL LSB
MD1ERR:	CLR	R0		;GET CHANNEL ID
	TST	CSDONF		;IS THIS THE LAST BUFFER
	BNE	2$		;IF SO, LEAVE WD. CNT P;NOT PASSING BUFFERS
	BIC	#100,@#PS	;LOWER PRIORITY
	CLR	CHANCE		;SHOULD HAVE USED CHANCE BY NOW
	TST	CSDONF		;IS ACQ DONE
	OSITIVE
	NEG	R2		;IF NOT, NEGATE WD. CNT.
2$:	JSR	PC,CTIBUF	;PASS BUFR TO CONTROL MODULE
	BCC	25$		;IF ACCEPTED, B+C
	JSR	PCBEQ	8$		;IF NOT, B+C
	DEC	CTIDON		;IF IT IS, TELL THE CONTROL MODULE
8$:	RTS	PC		;RETURN

	.IF	DF,FG$
SYNER2:	JSR	PC,KILLM1,KILLM1	;IF NOT, SHUT ACQUISITION DOWN
	INC	CSDONF		;SIGNAL ACQUISITION HAS STOPPED
25$:	MOV	#BUF2,R0	;GET ADDR.OF PTR TO 2ND 	;STOP ACQ
	INCB	CSEROR		;RECORD ERROR
	.ENABL	LSB
	TST	CSDONF		;TEST FOR ACQ STOPPED
	BEQ	1$		;IF NOT, BRANCH 
	DEC	CTIDONMOV	#10000,@#DMAREG	;ENABLE DMA TRANSFER
	MOV	BUF2,BUF1	;REPLCE PRIMARY BUFR
	INC	CSTOP		;IND TO STOP NEXT TIME IF TOO FAST
	DECREMENT BY ONE
	MOV	BUFPAS,R1	;GET BUFR ADDR
	CLR	R2		;CLR # OF ITEMS TO PUSH
5$:	INC	R2		;INCR. # OF ITEMS TO PUSH
	MOV	R.INTEN	5		;LOWER PRIORITY TO LEVEL 5
	BR	2$
1$:	JSR	PC,KILLM1	;IF SO, STOP ACQ.
	TST	BUFPAS		;CK FOR PASSING BUFFER
	BNE	15$2,R4		;GET # OF TEMS TO PUSH
	MOV	R2,R3		;GET NEXT ENTRY
	ASL	R3		; TO BE
	ASL	R3		;   BUBBLED UP
	ADD	R1,R3		
	MOV	(R3),R5		;IF SO, B+C
	INC	CSDONF		;IF NOT, IND. LAST BUFFER
	.INTEN	5
	MOV	BUF1,BUFPAS	;GET LAST BUFFER ADDRESS
	BR	3$
15$:	INC	CS		;SAVE ENTRY TO BUBBLE
6$:	MOV	-(R3),2(R3)	;SWAP NEXT TWO ENTRIES
	DEC	R4		;CK IF DONE SWAPPING
	BNE	6$		; FOR THIS PASS, IFERRF		;IND. GOING TOO FAST
	RTI			;AND RETURN
2$:	TST	BUFCNT		;DOES ACQ. STOP ON BUFR COUNT
	BMI	3$		;IF NOT, B+C
	DEC	BUFCN NOT, B+C
	MOV	R5,(R3)		;IF SO, INSERT VALUE BUBBLED
	DEC	R0		;SORT FINISHED
	BNE	5$		;IF NOT, DO NEXT PASS
	.ENDC

7$:	MOT		;IF SO, SHOULD ACQ STOP
	BNE	3$		;IF NOT, B+C
	INC	CSTOP		;IND. TO STOP NEXT TIME
3$:
	.IF	NDF,DUAL$
	JMP	MD1SP1		;GO PAV	(SP)+,R3	;RESTORE R3
	.ENDC

	MOV	BUFPAS,R1	;GET ADDR OF BUFR TO PASS

	.IF	NDF,DSORT$
DMANST:	MOV	BASIZ,R2	;GET BUFFER SS BUFFER
	.ENDC

	.IF	DF,DUAL$
	TST	DMAFLG		;TEST FOR SINGLE OR DUAL SAMPLING
	BNE	4$		;IF DUAL, B+C
	JMP	MD1SP1		;IF SINSIZE
	NEG	R2		;NOT LAST BUFFER
	CLR	R0		;GET DAT PATH ID
	JSR	PC,CTIBUF	;PASS BUFFER
	BCC	DMAST1		;IF NO ERRORS, BRANCH
	JSGLE, GO PASS BUFFER
4$:	MOV	R2,-(SP)	;SAVE REGS 0-2
	MOV	R1,-(SP)	;.INTEN SAVE 4-5
	MOV	R0,-(SP)

	.IF	DF,DSORT$
	MOV	R3,-R	PC,KILLM1	;STOP ACQ
DMAST1:	ADD	BBASIZ,R1	;GET SECOND BUFER ADDRESS
	TST	CSDONF		;TEST IF LAST BUFFER
	BEQ	DMAST2		;IF SO ,(SP)	;SAVE R3 TOO

	.IF 	NDF,INPLAC
	MOV	BASIZ,R2	;GET BUFR SIZE
	MOV	BUF3,R1		;GET AREA TO SORT FIRST CHNL DATA TO
	MOV	R1 BRANCH
	NEG	R2		;OTHERWISE NEGATE
DMAST2:	JSR	PC,CTIBUF	;PASS IT
	BCC	DMAST3		;IF ACCEPTED, BRANCH
	JSR	PC,KILLM1	;STOP ACQ
	DEC	OUTPTR		;ANY MORE ROOM IN BUFR
	BEQ	DISAM1		;IF NOT, GO PASS BUFFER
	RTI			;OTHERWISE, RETURN
DISAM1:	JMP	MD1ONE		;GO P,R3
	ADD	R2,R3		;GET AREA TO SORT 2ND CHNL DATA TO
	MOV	BUFPAS,R4	;GET ADDR OF FILLED MIXED BUFFER
5$:	MOV	(R4)+,(R1)+	;GET AASS BUFFER

	.ENDC

	.ENDC
	.IF	DF,DMA$


	.SBTTL SINGLE RATE,CONTROL,DMA(SINGLE,DUAL-SORTED OR NOT)

DMASAM:	TST	CSTND STORE NEXT 1ST CHNL ENTRY
	MOV	(R4)+,(R3)+	;GET AND STORE NEXT 2ND CHNL ENTRY
	DEC	R2		;ANY MORE ENTRIES
	BNE	5$		;IF SO, OP		;IS ACQ FINISHED
	.ENABL LSB
	BNE	1$		;IF SO, B+C
	MOV	BUF1,BUFPAS	;GET FILLED BUFR ADDR.,SIGNAL PASSING
	MOV	#6,@#ADSADB+C
	MOV	BUF3,BUFPAS	;IF NOT, GET ADDR OF BUFRS ACTUALLY PASNG
	TST	CSDONF		;HAS ACQUISITION STOPPED
	BEQ	6$		;IF NOT, B+C
		;POINT DAM REG TO CUR. ADDR. REG.
	MOV	BUF2,@#DMAREG	;LOAD BUFR. ADDR. IN DMA ADDR. PTR.
	MOV	#4,@#ADSAD	;POINT DMA REG TO CUMOV	#2,R1		;GET NO. OF CONTIGUOUS BUFRS TO RELEASE
	MOV	BUF1,R0		;GET ADDR OF BUFRS TO RELEASE
	JSR	PC,BARLM	;GO RELEASE BUFRSR. WD. CTR.
	MOV	DMAWDC,@#DMAREG	;LOAD WD. CNT. IN DMA WD. CTR.
	MOV	DMASW,@#ADSAD	;POINT DMAR. TO DMA SW. ,SET A/D SW BITS
	
	BR	7$		
6$:	MOV	BUF1,BUF3	;REASSIGN THE DUTIES OF BUFR 1
	.ENDC

	.IF	DF,INPLAC
	MOV	BASIZ,R0	;GET BUFR SIZE
	DEC	R0		;SIZE OF BUFFER
	JMP	MD1MPS		;GO PASS BUFFERS
	.ENDC

	.ENDC


	.IF 	DF, MODE2$ ! MODE3$



SAMP23:	TST	CSDONF		;HAS 	;IF NOT, RESTORE ALL REGISTERS
	CLC			;IND. NO ERRORS
	RTS	PC		; AND RETURN
STCHNL:	MOV	#BUF2,R4	;GET BUF2 PTR TABLE ADDR
	ACQ STOPPED
	.ENABL	LSB
	BEQ	1$		;IF NOT, B+C
	SEC			;IF SO, SET CARRY IND. ERROR
	RTS	PC		; AND RETURN
1$:	TST	R1		;ZERO I.ENABL 	LSB
1$:	MOV	-(R3),R0	;GETNEXT OFFSET TO GEN TAB FOR CHNL
	ADD	R4,R0		;GET CHNL'S BUF2 PTR ADDR
	JSR	PC,BAGET	;GET A BNPUT IS A NOP
	BEQ	11$
	BIT	R1,STOPMK	;SHOULD ALL ACQ STOP
	BEQ	2$		;IF NOT, B+C
	JSR	PC,SAVARG	;SAVE ALL REGS
	JSR	PC,KILMUF2 FOR CHNL

	.IF	DF,LPSDR$ ! DR11K$
	TST	OUTDOP		;SHOULD D/O OCCUR ON CHANL START
	BEQ	2$		;IF NOT, B+C
	MOV	(R3),R2		;GE23	;IF SO, GO DISABLE SYSTEM AND CLEAN UP
	JSR	PC,RSTARG	;RESTORE ALL REGS
11$:	CLC			;IND. NO ERROR
	RTS	PC		;AND RETURN
2$T OFSET ONCE AGAIN
	MOV	SDOMSK(R2),@#DOBUF	;IF SO, OUTPUT PROPER MASK
	.ENDC

2$:	DEC	STCNT		;ANY MORE CHNLS STARTED
	BNE	1:	JSR	PC,SAVARG	;SAVE ALL REG(0-5)
	CLR	R2		;GET GEN. TAB. OFFSET FOR 1ST CHNL
	MOV	#SPTAB,R5	;GET ADDR OF STOPPED CHNLS TABLE$		;IF SO, B+C
	TST	SPCNT		;ANY CHNLS STOPPED
	BEQ	SAM23R		;IF NOT, B+C
SPCHNL:	MOV	BASIZ,R2	;GET FULL BUFFER SIZE
	MOV	-(R5
	MOV	#STTAB,R3	;GET ADDR OF STARTED CHNLS TABLE
	MOV	CSNOFC,R4	;GET # OF CHNLS
	CLR	STCNT		;CLEAR STARTED CHNLS CNTR
	CLR	S),R0	;GET CHNL'S GEN TAB OFFSET
	MOV	OUTPTR(R0),R3	;GET BUFR ENTRY CNTR FOR CHNL
	MOV	R2,OUTPTR(R0)	;RESET CNTR
	SUB	R3,R2		;PCNT		;CLEAR STOPPED CHNLS CNTR
3$:	BIT	R1,HDIMSK(R2)	;SHOULD THIS CHNL BE STOPPED
	BEQ	4$		;IF NOT, B+C
	BIT	#1,ADSWTB(R2)	;GET ACTUAL WORD CNT IN BUFR
	MOV	BUF1(R0),R1	;GET PTR TO NEXT FREE BUF1 ENTRY
	ASL	R2		;GET BYTE CNT
	SUB	R2,R1		;GET START OWAS THIS CHNL ALREADY STOPPED
	BEQ	4$		;IF SO, B+C
	BIC	#1,ADSWTB(R2)	;IF NOT, STOPPED CHNL'S ACQ
	INC	SPCNT		;INCR. STOPPED F BUF 1 FOR CHNL
	ASR	R2		;RESTORE WORD CNT
	ASR	R0		;GET DATA PATH ID NO.
	JSR	PC,CTIBUF	;PASS LAST BUFR FOR CHNL
	ASL	R0		CHNLS CNTR
	MOV	R2,(R5)+	;STORE CHNLS GEN. TAB. OFFSET
	BR	5$
4$:	BIT	R1,SDIMSK(R2)	;SHOULD THIS CHNL BE STARTED
	BEQ	5$		;I;RESTORE OFFSET IN BYTES
	MOV	BUF2(R0),BUF1(R0)	;SET UP BUF1 FOR RESTART

	.IF	DF,LPSDR$ ! DR11K$
	TST	OUTDOP		;SHOULD D/O OF NOT, B+C
	BIT	#1,ADSWTB(R2)	;WAS THIS CHNL ALREADY STARTED
	BNE	5$		;IF SO, B+C
	BIS	#1,ADSWTB(R2)	;IF NOT, ENABLE CHNLS ACCCUR ON CHNL HALT
	BEQ	SP1		;IF NOT, B+C
	MOV	HDOMSK(R0),@#DOBUF	;IF SO, OUTPUT PROPER MASK
	.ENDC

SP1:	DEC	SPCNT		;ANY OTQ
	INC	STCNT		;INCR. STARTED CHNLS CNTR
	MOV	R2,(R3)+	;STORE CHNL'S GEN. TAB. OFFSET
5$:	TST	(R2)+		;INCR. GEN. TAB. OFFSET PHER CHNLS STOPPED
	BNE	SPCHNL		;IF SO, B+C
	MOV	#1,CSDATA	;NDICATE DATA PASSED
	BR	SAM23R		;IF NOT, RETURN
SAMPLE:	BIT	#1,A
	INC	CSDONF		;INC. DONE FLAG
	SUB	BBASIZ,R1	;GET BUFFER ADDRESS
	CMP	R1,BUF2		;SEE IF THE TWO ARE THE SAME
	BNE	DMAST3		;IFTR BY 2 BYTES
	$SOB	R4,3$		;ANY MORE CHNLS TO CHK? IF SO, B+C
	BIC	#140,@#PS	;LOWER PRIORITY TO 4
	TST	STCNT		;WERE ANY PROCE NOT, JUST EXIT
	CLR	BUF2		;OTHERWISE DUMMY UP ADDRESS
DMAST3:	JMP	MD1NST		;OTHERWISE CONTINUE
	.ENDC

	MOV	BBASIZ,R5	;GET SSES STARTED
	BNE	STCHNL		;IF SO, B+C
	TST	SPCNT		;WERE ANY PROCESSES STOPPED
	BNE	SPCHNL		;IF SO, B+C
SAM23R:	JSR	PC,RSTARG, B+C
	CMP	R5,#4040	;SHOULD GAIN VALUE BE 16
	BLT	23$		;IF NOT, NO OTHER GAIN NEEDED, B+C
	MOV	#20000,R4	;OTHERWISE, SET GAINIF	DF,LPSDR$ ! DR11K$
	CLR	@#DIOSAD	;AND DIG INTERRUPTS
	.ENDC
	INC	CSDONF		;IND TO THIS MODULE ITS DONE
	DEC	CTIDON		;IND TDSWTB(R1)	;IS CHANNEL ENABLED
	.ENABL	LSB
	BNE	1$		;IF IT IS, B+C
	RTS	PC
1$:	MOV	ADSWTB(R1),R3	;GET STATUS WORD
	
	.IF	DF BITS TO 16
	BR	29$		;GO TO SET GAIN AND RESAMPLE
23$:	MOV	#30000,R4	;SET GAIN BITS TO 64
29$:	ADD	R4,@#ADSAD	;SET GAIN BITS ,LPSDR$ ! DR11K$
	TSTB	R3		;IS THIS A DIGITAL CHANNEL
	BMI	10$		;IF SO, B+C
	.ENDC

	MOV	R3,@#ADSAD	;START A/D CONVERSION
IN A/D SW
	INC	@#ADSAD		;ENABLE A/D CONVERT
	BR	21$		;GO WAIT FOR CONVERSION
24$:	CMP	R5,#5000	;SHOULD GAIN VALUE BE 4
	BGE		
	.IF	DF,AUTOG$
	TST	R3		;SEE IF AUTO-GAINNING
	BMI	20$		;IF SO, B+C
	.ENDC

2$:	TSTB	@#ADSAD		;IS CONVERSION DONE
	BPL	25$		;IF NOT, B+C
	MOV	#10000,R4	;IF SO, SET GAIN BITS TO 4
	BR	29$		;AND GO TO SET GAIN AND RESAMPLE
25$:	TST	COMFLG		;TEST 2$		;IF NOT, TRY AGAIN
	MOV	@#ADBUF,@BUF1(R1)	;STORE DATA IN BUFR
	ADD	#2,BUF1(R1)	;INCR. ADDR OF BUFR PTR
	DEC	OUTPTR(R1)	;DIF VALUE WAS NEGATED
	BEQ	28$		;IF IT WAS NOT, B+C
	BIS	#170000,R5	;IF IT WAS, 
	NEG	R5		; RE-NEGATE IT
28$:	ADD	R4,R5		;INDEC BUFR CNTR
	BNE	3$		;IF NOT ZERO JUST RETURN
	JMP	SAMPAS		;IF FULL, GO SET UP TO PASS BUFR
3$:	RTS	PC		;IF NOT, IND NO ERRO GAIN USED
	MOV	R5,@BUF1(R1)	;STORE DATA
	ADD	#2,BUF1(R1)	;INC BUFR POINTER
	DEC	OUTPTR(R1)	;DEC COUNTER FOR BUFFER
	BEQ	SAMR AND RETURN

	.IF	DF,LPSDR$ ! DR11K$
10$:	MOV	@#DIBUF,@BUF1(R1)	;STORE DATA IN BUFR
	MOV	@BUF1(R1),@#DIBUF	;CLEAR DIG. BUFRPAS		;IF BUFFER FULL, B+C
	RTS	PC		;AND RETURN
	.ENDC

SAMPAS:	MOV	RNGIN,R3	;GET NEXT ADDR IN BUFR TO STORE FULL BUFR
	.ENA
	ADD	#2,BUF1(R1)	;INCR. ADDR OF BUFFER POINTER
	DEC	OUTPTR(R1)	;CHECK FOR FULL BUFFER
	BNE	3$		;IF NOT ZERO, JUST RETURN
	JBL	LSB
	MOV	R1,(R3)+		;STORE CHNL TABLE OFFSET
	MOV	BASIZ,R4	;GET BUFR SIZE
	MOV	R4,OUTPTR(R1)	;RESET BUFR CNTR
	MOV	BUF1(R1MP	SAMPAS		;IF FULL, GO SET UP TO PASS BUFR
	.ENDC

	.IF	DF,AUTOG$
20$:	CLR	R4		;CLEAR SIGNAL FOR FIRST CONVERSION
	.ENABL	),R5	;GET ADDR. OF CUR. BUFR1 PTR
	SUB	R4,R5		;GET STRT OF FULL BUFR 1
	SUB	R4,R5		;GET STRT OF FULL BUFR 1
	CMP	BUF2(R1),R5	LSB
21$:	TSTB	@#ADSAD		;TST FO CONVERSION DONE
	BPL	21$		;IF NOT, BRANCH AND TEST AGAIN
	MOV	@#ADBUF,R5	;GET A/D CONVERTED VA;COMP BUF1 ADDR TO BUF2 ADDR
	BNE	53$		;IF NOT EQUAL, CORRECT, SO, B+C
	CLR	SDIMSK(R1)	;OTHERWISE,CHNL TOO FAST, SO DISABLE
	LUE
	TST	R4		;IS THIS THE 1ST CONVERT. FOR CHANL
	BNE	28$		;IF NOT, B+C
	CLR	COMFLG		;CLEAR COMPLEMENT FLAG
	CMP	R5,#4000	;IBIC	#1,ADSWTB(R1)	; BY CLEARING ENABLE MASK AND S.W. ENABLE
	ASR	R1		;GET COUNT OF BYTES
	INCB	CSEROR+1(R1)	;INDICATE CHANNEL S VALUE IN NEGATIVE RANGE
	BGE	22$		;IF NOT, B+C
	INC	COMFLG		;IF SO, IND. TO NEGATE
	NEG	R5		;GET NO. IN RIGHT RANGE
	BEQ	2STOPPED ABNORMALLY
	ASL	R1		;RESTORE R1
	NEG	-2(R3)		;IND. CHNL DEAD IN RING BUFR
	INC	CSCHDN		;INCR. CNT OF # OF CHNLS DEAD8$		;IF ZERO NO NEED FOR GAIN
	BIC	#170000,R5	;WITHOUT SIGN
22$:	CMP	R5,#4200	;SHOULD GAIN VALUE BE ABOVE 4
	BGE	24$		;IF NOT
	CMP	CSCHDN,CSNOFC	;COMPARE TO NO. OF CHANNELS
	BNE	53$		;IF SOME STILL ALIVE, B+C
	CLR	@#CLKSAD	;OTHERWISE, DIABLE CLOCK
	.(R4),R1	;WAS BUF1 SAME AS BUF2 FOR CHNL
	BEQ	20$		;IF SO, B+C
5$:	MOV	BUF2(R4),R0	;IF NOT, GET ADDR OF BUF2
	JSR	PC,BAREL	; A SAMPLE
6$:	SUB	R2,(R3)+	;SUB NEXT INT. FROM CHNL'S CUR INT
	BNE	7$		;IF NOT ZERO, DON'T SAMPLE NEXT TIME
	INC	SCHNTB		;IF ZEND RELEASE THE BUFFER TO B.A.
	BR	20$
10$:	TST	SDIMSK(R4)	;WAS CHNL ALIVE
	BNE	5$		;IF SO, B+C
20$:	TST	(R4)+		;INCREMENT OFRO, UP CNTR OF CHNLS TO SAM NEXT
	MOV	R1,(R0)+	;STORE OFFSET FOR CHNLS IN TABLE
	MOV	(R5),-2(R3)	;RESET TIM INT TO ORIGINAL COFSET
	$SOB	R5,2$		;IF MORE CHANLS, B+C
	INC	CSDONF		;IF NOT, IND. ACQ DONE TO THIS MODULE
	DEC	CTIDON		;INDICATE ACQUISITION UNT
7$:	TST	(R1)+		;INC BYTE COUNT FOR OFFSET
	TST	(R5)+		;INC ORIGINAL TIM INT TABL PTR
	DEC	R4		;ANY MORE CHANNELS
	BNE	6$STOPPED TO C.M.
	MOV	#IGNORI,@#CLKVEC	;DUMMY VECTORS
	.IF	DF,LPSDR$ ! DR11K$
	MOV	#IGNORI,@#DIVEC
	.ENDC
	RTS	PC		; AND RET		;IF SO, B+C
	TST	BUFPAS		;WAS BUFR PASSING INTERRUPTED
	BNE	8$		;IF SO, B+C
	TST	RNGCNT		;WERE MORE BUFFERS PUT IN RING BUFO C.M. ACQ HAS STOPPED
53$:	MOV	BUF2(R1),BUF1(R1)	;CHANG BUFFERS
	MOV	R5,(R3)+	;STORE BUFR ADDR. IN RING BUFR
	CMP	R3,RNGEND	URN

	.ENDC		;END OF CODE FOR MODE2+3
		.IF	DF,MODE2$

SAMOD2:	INC	SAMFLG		;TEST IF TOO SOON
	.ENABL	LSB
	BEQ	1$		;IF NO;TEST IF PAST LAST ADDR IN RING
	BNE	54$		;IF NOT, B+C
	MOV	#RNGBEG,R3	;IF SO, RESET TO FIRST
54$:	MOV	R3,RNGIN	;RESET RING IT, B+C
	CLR	@#CLKSAD	;IF SO, STOP CLOCK
	.IF	DF,LPSDR$ ! DR11K$
	CLR	@#DIOSAD	;STOP ALL DIO
	.ENDC
	RTI
1$:	.INTEN	5		;LOWN PTR
	INC	RNGCNT		;INDICATE GOT A BUFFER TO PASS
	RTS	PC		; AND RETURN

KILM23:	CLR	@#CLKSAD		;STOP THE CLOCK

	.IF 	DF,ER PRIORITY TO 4
	JSR	PC,SAVARG	;SAVE REG
	MOV	#SCHNTB,R2	;GET ADDR OF TABLE OF CHANNELS TO SAMPLE
	MOV	(R2)+,R0	;GET # OF CHLPSDR$ ! DR11K$
	CLR	@#DIOSAD		;STOP DI/O
	.ENDC

1$:	MOV	CSNOFC,R5		;GET TOTAL NO. OF CHANNELS
	CLR	R4			;CLEAR OFFSET PTRNLS TO TRY TO SAMPLE
2$:	MOV	(R2)+,R1	;GET OFFSET OF 1ST CHNL TO SAMPLE
	JSR	PC,SAMPLE	;GO TRY TO SAMPLE CHNL
	DEC	R0		;ANY M FOR GEN TABS
2$:	BIT	#1,ADSWTB(R4)		;WAS THIS CHANNEL ENABLED
	BEQ	10$		;IF NOT, B+C

	.IF	DF,LPSDR$ ! DR11K
	TST	OUTDOP		ORE CHNLS TO TRY TO SAMPLE
	BNE	2$		;IF SO, B+C
	MOV	#CINTAB,R0	;GET CUR. TIME INTERVAL TABLE ADDR
	MOV	R0,R3		;GET SECOND CO;CHECK FOR DIGITAL OUTPUT ON STOP
	BEQ	3$		;IF NOT, BRANCH
	BIS	HDOMSK(R4),@#DOBUF	;OTHERWISE SET BITS
	.ENDC

3$:	MOV	BASIPY
	MOV	CSNOFC,R1	;GET # OF CHNLS
	MOV	R1,R4		;GET 2ND COPY
	MOV	(R0)+,R2	;GET A GUESS FOR MINIMUM TIME INTERVAL
	BR	5$
4$:Z,R2	;GET BUFFER SIZE
	MOV	OUTPTR(R4),R3	;GET BUFR ENTRY CNTR FOR CHNL
	SUB	R3,R2		;GET ACTUAL WD CNT IN BUFR
	ASL	R2		;GET B	CMP	(R0)+,R2	;CMP NEXT INTERVAL TO PRESENT MINIMUM
	BLE	5$		;IF ABSOLUTE VALUE LARGER, B+C
	MOV	-2(R0),R2	;IF NOT, GET NEW MIYTE CNT
	MOV	BUF1(R4),R1	;GET PTR INTO BUF1 FOR CHNL
	SUB	R2,R1		;GET START OF BUFR
	ASR	R2		;RESTORE WD CNT
	MOV	R4,R0		;GENIMUM
5$:	DEC	R1		;ANY MORE CHANNEL TO TEST
	BNE	4$		;IF SO, B+C
	MOV	R2,@#CLKBUF	;SET NEXT BUF PRESET VALUE
	MOV	#INTABL,R5T DPID FOR CHNL
	ASR	R0		;GET DPID NO FOR CHANNEL
	JSR	PC,CTIBUF	;PASS BUFFER
	INC	CSDATA		;IND. BUFFER WAS PASSED
	CMP	BUF2	;GET ADDR OF ORIGINAL TIM INT TABLE
	MOV	#SCHNTB,R0	;GET ADDR OF NEXT CHNL TO SAMP TABL
	CLR	(R0)+		;CLEAR COUNT OF CHANLS TOSET SIGN
	BR	3$
2$:	TST	BUFCNT(R3)	;TEST FOR DISABLE ON BUFR. CNT.
	BEQ	5$		;IF NOT APPLICABLE, B+C
	DEC	BUFCNT(R3)	;TEST IFCTRUN		;INDCATE SYNCED
	.RSUM
	.ENDC

GIVCHK:	BIS	#340,@#PS	;;DID ANY THING HAPPEN
	TST	RNGCNT		;; HOUSE CLEANING WAS GOING # OF BUFRS PASSED IS MAX
	BNE	5$		;IF NOT, B+C
	CLR	SDIMSK(R3)	;IF SO, DISABLE CHNL'S START MSK
	BIC	#1,ADSWTB(R3)	;DISABLE  ON
	BNE	GIVBF2		;;IF SO, GO BACK AND PROCESS
	CLR	BUFPAS		;;IF NOT, SIGNAL THROUGH PASSING BUFRS
	RTS	PC
GIVBF2:	BIC	#140,@CHNL'S ACQ
	INC	CSCHDN		;INCR. CNT OF # OF CHNLS DEAD
	CMP	CSCHDN,CSNOFC	;COMPARE TO NO. OF CHANNELS
	BNE	3$		;IF SOME STILL #PS	;LOWER PRIORITY TO 4
	JSR	PC,SAVARG	;SAVE ALL REGS
	BR	GIVBF3		; GO PROCESS NEW BUFFERS


	.IF	DF,FG$
SYNER3:	CLR	@#CLALIVE, B+C
	CLR	@#CLKSAD	;OTHERWISE, DIABLE CLOCK
	.IF	DF,LPSDR$ ! DR11K$
	CLR	@#DIOSAD	;AND DIG INTERRUPTS
	.ENDC
	INC	CSDKSAD	;STOP ACQ
	INCB	CSEROR		;RECORD ERROR
	JSR	PC,SAVARG	;SAVE REG
	JSR	PC,KILM23	;PASS BUFFERS
	JSR	PC,RSTARG	;RESTORE REGONF		;IND TO THIS MODULE ITS DONE
	DEC	CTIDON		;IND TO C.M. ACQ HAS STOPPED
	
3$:	.IF	DF,LPSDR$ ! DR11K$
	TST	OUTDOP		;SHOULISTERS
	RTS	PC
	.ENDC

	.ENDC
	.IF	DF,MODE3$

SAMOD3:	INC	SAMFLG		;TEST IF TOO SOON
	.ENABL	LSB
	BEQ	1$		;IF NOT, B+CD OUTPUT D/O ON HALT
	BEQ	4$		;IF NOT, B+C
	MOV	HDOMSK(R3),@#DOBUF	;IF SO, OUTPUT MASK DIGITALLY
	.ENDC

4$:	NEG	R2		;INDIC
	CLR	@#CLKSAD	;IF SO, STOP CLOCK
	.IF	DF,LPSDR$ ! DR11K$
	CLR	@#DIOSAD	;STOP ALL DIO
	.ENDC
	RTI
1$:	.INTEN	5		;LOWER PRIOATE A LAST BUFR
5$:	MOV	(R4)+,R1	;GET BUFR TO PASS
	CMP	R4,RNGEND	;IS RING OUT PTR AT LAST LOC IN RING
	BNE	6$		;IF NOT, B+CRITY TO 4
	JSR	PC,SAVARG	;SAVE REG
	MOV	CRRPTR,R0	;GET CUR. PTR INTO ROUND ROBIN TABLE
	MOVB	(R0)+,R1		;GET NEXT OFFSET ENTRYFER
	BNE	GIVBUF		;IF SO, B+C
	JSR	PC,RSTARG	;RESTOR REGS
	BIS	#340,@#PS	;;DISABLE INTERRUPTS
	TST	SAMFLG		;;DID CLOCK TICK T
	MOV	#RNGBEG,R4	;IF SO, PTR TO 1ST LOC IN BUFR
6$:	MOV	R4,RNGOUT	;UPDATE RING OUTPUT POINTER
	MOV	R3,R0		;GET CHNL'S DPID
	AOO SOON
	BEQ	9$		;;IF NOT, B+C
	JSR	PC,SAVARG	;SAVE REG
	JSR	PC,KILM23	;;IF SO, GET RID OF ALL BUFFERS
	INCB	CSEROR		;;INDICSR	R0
	JSR	PC,CTIBUF	;PASS BUFFER
	TST	R2		;WAS THIS A LAST BUFFER
	BPL	7$		;IF SO, B+C
	MOV	#BUF2,R0	;IF NOT, GET BUF2 TABLATE ERROR, FATAL
	JMP	GIVEND		;;GO RETURN
8$:	JSR	PC,RSTARG	;RESTORE REGS
9$:	DEC	SAMFLG		;;RESET FLAG IF NO ERROR(=0 IF ERROE ADDR
	ADD	R3,R0		;GET ADDR FOR CHNL'S BUF2 PTR
	JSR	PC,BAGET	;GET ANOTHER BUFFER
7$:	DEC	RNGCNT		;ANY MORE BUFRS TO PASS
	R)
	RTS	PC
	
	.ENDC
	.IF	DF,MODE2$ ! MODE3$

GIVBUF:	INC	BUFPAS		;IND PASSING BUFFERS
	DEC	SAMFLG		;ALLOW MORE SAMPLINGBNE	GIVBF1		;IF SO, B+C
	TST	CSDONF		;HAS ACQ STOPPED ON ALL CHNLS FOR GOOD
	BNE	GIVEND		;IF SO, B+C
	TST	SAMFLG		;CHECK FOR 
GIVBF3:	MOV	RNGOUT,R4	;GET RING PTR FOR OUTPUT TO C.M.
	.ENABL	LSB
GIVBF1:	MOV	BASIZ,R2	;GET BUFFER SIZE
	NEG	R2		;IND. NOT DISABLED SYSTEM
	BMI	GIVEND		;IF NOT DISABLED, B+C
	JSR	PC,KILM23	;IF DISABLED, GO CLEAN UP
GIVEND:	JSR	PC,RSTARG	;RESTORE REA LAST BUFFER
	MOV	(R4)+,R3	;GET CHNL'S GEN TAB OFFSET 
	BPL	2$		;IF CHNL NOT KILLED, B+C
	NEG	R3		;IF DEAD CHNL, CORRECT OFFGS

	.IF	DF,FG$
	TST	CTRUN		;DO WE NEED A SYNCH
	BNE	GIVCHK		;IF NOT, BRANCH
	.SYNCH 	#SYNCTL
	BR	SYNER3		;IF ERROR
	INC	E		;TEST FOR DIG DATA CHANL IN USE
	BEQ	35$		;IF NOT, B+C
	CMP	R1,CSNOFC	;CHECK IF NEXT CHNL IS DIGITAL
	BEQ	4$		;IF SO B+C
PE:	.BLKW 1			;WORD INDICATING SPECIAL INPUT CONDITIONS
CSDONF:	.BLKW 1			;INTERNAL DONE FLAG
ADSWTB:	.BLKW MXINP$+1		;TABLE O	.ENDC

35$:	ASL	R1		;GET BYTE OFFSET INTO TABLES
	MOV	ADSWTB(R1),R1	;GET A/D SW
	BIC	#160377,R1	;GET MUX BITS ONLY
	MOV	R1F A/D STATUS WORDS. 1 FOR EA.CHNL

	.IF	DF,LPSDR$ ! DR11K
OUTDOP:	.BLKW 1			;FLAG INDICATING POSSIBLE D/O ON S/S
CSIDIG:	.BL,@#ADSAD	;CHANGE MUX
4$:	TST	BUFPAS		;WAS BUFR PASSING INTERRUPTED
	BNE	8$		;IF SO, B+C
	TST	RNGCNT		;WERE MORE BUFFERS PUT IKW 1			;WORD CONTAINING LASTEST SAMPLED DIG. INPUT
	.ENDC
	.IF	DF,AUTOG$
COMFLG:	.BLKW 1			;FLAG TO IND. FOLDING
	.ENDC

	N RING BUFFER
	BEQ	5$		;IF NOT ALREADY PASSING BUFRS, B+C
	JMP	GIVBUF		;IF SO, B+C
5$:	JSR	PC,RSTARG	;RESTOR REGS
	BIS	#340,.IF	NDF,MODE2$ 
	.IF	NDF,MODE3$
BUFCNT:	.BLKW 1			;STOREAGE  FOR OUTPUT BUFR CNT
BUF1:	.BLKW 1			;PNTR TO ACTIVE OUTPUT BUFRS@#PS	;;DISABLE INTERRUPTS
	TST	SAMFLG		;;DID CLOCK TICK TOO SOON
	BEQ	9$		;;IF NOT, B+C
	JSR	PC,SAVARG	;SAVE ALL REGS
	JSR	P
BUF2:	.BLKW 1			;PNTR TO NEXT OUTPUT BUFRS
OUTPTR:	.BLKW 1			;OUTPUT BUFRS COUNTER
	.IF	DF,LPSDR$ ! DR11K$
SDIMSK:	.BLKW 1	C,KILM23	;;IF SO, GET RID OF ALL BUFFERS
	INCB	CSEROR		;;RECORD FATAL ERROR
	JMP	GIVEND		;;GO RETURN
8$:	JSR	PC,RSTARG	;RESTO		;BIT MASK USED TO START ACQUISITION
HDIMSK:	.BLKW 1			;BIT MASK USED TO STOP ACQUISITION
SDOMSK:	.BLKW 1			;BIT MASK OUTPUTERE ALL REGS
9$:	DEC	SAMFLG		;;RESET FLAG IF NO ERROR(=0 IF ERROR)
	RTS	PC

	.ENDC
	.IF	DF, MODE2$ ! MODE3$


	.SBTTL DID ON D/O WHEN ACQ STRTS
HDOMSK:	.BLKW 1			;BIT MASK OUTPUTED ON D/O WHEN ACQ STOPS
	.ENDC
	.ENDC
	.ENDC

	.IF	DF,MODE1$ 
GITAL INTERRUPT ROUTINE FOR MODES 2+3

	.IF	DF,LPSDR$ ! DR11K$
DIMD23:	MOV	R1,-(SP)
	MOV	@#DIBUF,R1
	MOV	R1,@#DIBUF	;CLR DICHANCE:	.BLKW 1			;FLAG INDICATING SLOW DOWN
CSERRF:	.BLKW 1			;FLAG INDICATING ERROR
CSTOP:	.BLKW 1			;FLAG INDICATING TO STOGITAL INPUT BUFFER
	BIS	#100,@#DIOSAD	;RE-ENABLE DI INTERRUPT
	MOV	R1,CSIDIG	;SAVE DIGITAL INPUT IN GLOBAL
	.INTEN	4		;LOWER P ACQ
FASTER:	.BLKW 1			;FLAG IND. SECOND ERROR TYPE
CNT:	.BLKW 1			;COUNT OF UNFILLED BUFFER
NEXCVA:	.BLKW 1			;ADDR OF CLK PRIORITY
	JSR	PC,@CSAMPA
	MOV	(SP)+,R1

	.IF	DF,FG$
	TST	CSDATA		;WERE ANY BUFFERS PASSED
	BNE	DIMD01		;IF NOT, B+C
	.SYNINT VEC AFTER 1ST ST1
	.IF	DF,DMA$
DMASW:	.BLKW 1			;DMA STATUS WORD
DMAWDC:	.BLKW 1			;DMA WORD COUNT
DMAFLG:	.BLKW 1			;DM
	BMI	2$		;IF NEG., JUST A DELAY, SO B+C
	ASL	R1		;GET BYTE OFFSET
	JSR	PC,SAMPLE	;OTHERWISE GO TRY TO SAMPLE
2$:	CMP	R0,RRTCH  #SYNCTL
	NOP
	.RSUM
DIMD01:	CLR	CSDATA		;CLEAR DATA FLAG
	.ENDC

	RTS	PC

	.ENDC

	.ENDC
	.SBTTL	STORAGE AREA
END	;IS CUR. RR PTR AT END OF TABLE
	BNE	3$		;IF NOT, B+C
	MOV	RRTBEG,R0	;IF SO, RESET TO START OF TABLE
3$:	MOV	R0,CRRPTR	;U
CSMODE:	.BLKW 1			;MODE CODE
CSNOFC:	.BLKW 1			;NO. OF INPUT CHANNELS
CFLAG:	.BLKW 1
CSNOFA:	.BLKW 1			;NO. OF A/D INPUT CHAPDATE CURRENT RR POINTER
	MOVB	(R0),R1		;IS THE NEXT ENTRY A DELAY
	BMI	4$		;IF SO, B+C

	.IF	DF,LPSDR$ ! DR11K$
	TST	CSTYPNNELS
BUFPAS:	.BLKW 1			;FLAG INDICATING MODULE PASSING BUFRS
CSAMPA:	.BLKW 1			;WORD CONTAINING START/STOP ROUTINE ADDR
CSTYA FLAG FOR EITHER SINGLE OR DUAL SAMPL
	.IF	DF,DUAL$
	.IF	NDF,INPLAC
BUF3:	.BLKW 1			;PNTR TO SCRATCH BUFRS FOR SORT
	.ENDCR SMPLING EA. CHANL
SCHNTB:	.BLKW MXINP$+1		;TABLE OF CHNLS TO SAMPL NEXT CLK OVRFLW
NXCKCT:	.BLKW 1			;SECOND BUFR PRESET VAL
	.ENDC
	.ENDC
	.ENDC

CSEROR:	.BYTE 0			;FATAL ERROR COUNT
	.IF	DF,MODE2$ ! MODE3$
	.BLKB MXINP$		;TABLE OF CHANNELS STOPUE FOR CLOCK
	.ENDC

	.IF	DF,MODE3$
RRTBEG:	.BLKW 1			;PNTR TO DRIVER TABLE OF ROUND ROBIN
RRTEND:	.BLKW 1			;LAST ADDR INDPED ABNORMALLY
	.EVEN
BUFCNT:	.BLKW MXINP$		;TABLE OF BUFR CNTS. ONE FOR EACH CHANNEL
BUF1:	.BLKW MXINP$		;TABLE OF ACTIVE OU. OF ROUND ROBIN TABLE
CRRPTR:	.BLKW 1			;CUR. PTR INTO ROUND ROBIN TABLE
	.ENDC

	.IF DF,FG$
GTJBA:	.BYTE	0,20		;GET JOB ATPUT BUFR POINTERS
BUF2:	.BLKW MXINP$		;TABLE OF NEXT OUTPUT BUFRS
RNGBEG:	.BLKW 4*MXINP$		;RING BUFR FOR BUFRS TO PASS TO C.MREA
	.WORD	GTJBA
	.BLKW	6
SYNCTL:	.WORD 0,0,0,0,0		;STORAGE FOR .SYNCH
	-1
	0
	.ENDC

PROTAR:	14400		;STORAGE AREA FOR P.
OUTPTR:	.BLKW MXINP$		;TABLE OF OUTPUT BUFR CNTRS
SPTAB:	.BLKW MXINP$		;TABLE OF CHNLS TO BE STOPPED
STTAB:	.BLKW MXINP$		;ROTECT
	.BLKW 1
DLIST:	.BYTE 0,14	;ENT AR LIST
	.WORD DLIST1		;ADDRESS
DLIST1:	ADSAD
	.WORD 0
	ADVEC
	IGNORA
	CLKSAD
	.TABLE OF CHNLS TO BE STARTED
CSDATA:	.BLKW 1			;WD INDICATING IF BUFFER IS PASSED AFTER
				;CALL TO CSAMPL
SAMFLG:	.BLKW 1		WORD 0
	CLKVEC
	IGNORI
	.IF DF,LPSDR$ ! DR11K$
	DIVEC
	IGNORI
	DIOSAD
	.WORD 0
	.ENDC
	.WORD 0
PRTFLG:	.WORD 0		;PROTE	;FLAG INDICATING SAMPLING IN PROGRESS
SPCNT:	.BLKW 1			;COUNT OF CHNLS TO BE STOPPED
STCNT:	.BLKW 1			;COUNT OF CHNLS TO BE SCT FLAG

IGNORA:	TST	@#ADBUF	;CLR DONE FLAG
	CLR	@#ADSAD	;CLR ERROR FLAG
IGNORI:	RTI

	.END
                             TARTED
STOPMK:	.BLKW 1			;BIT MASK USED TO STOP ALL CHANNELS
SDIMSK:	.BLKW MXINP$		;TABLE OF BIT MSKS USED TO START CHNLS
HDI.TITLE PEAK PROCESSING MODULE
;LAB-APPLICATIONS-11
;DEC-11-SLABA-C-LA
;FILENAME PEAK.MAC
;FILE ID PEAK.1

.CSECT	PEAKPR
MSK: .BLKW MXINP$		;TABLE OF BIT MSKS USED TO STOP CHNLS
RNGEND:	.BLKW 1			;ADDR OF END OF RING BUFFER
RNGIN:	.BLKW 1			;ADDR 
;COPYRIGHT (C) 1975
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLYIN RING BUFR TO INPUT NEXT BUFR
RNGOUT:	.BLKW 1			;ADDR IN RING BUFR OF NEXT BUFR TO PASS
RNGCNT:	.BLKW 1			;COUNT OF BUFRS TO ON A
;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY  BE PASSED IN R BUFR
CSCHDN:	.BLKW 1			;COUNT OF CHNLS DONE FOR GOOD
	.IF	DF,LPSDR$ ! DR11K$
SDOMSK:	.BLKW MXINP$		;BITS MSKSOTHER COPIES
;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND  TO OUTPUT WHEN EACH CHNLS STRT
HDOMSK:	.BLKW MXINP$		;BIT MSKS TO OUTPUT WHEN EACH CHNL STOPS
	.ENDC
	.ENDC
	.EVEN

	.IF TO ONE WHO AGREES
;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE
;SHALL AT ALL TIMES REMAIN IN DEC.

;THE I	DF,MODE2$
INTABL:	.BLKW MXINP$	;TBL OF CLK TICKS BETWEEN SAMPLING EACH CHANL
CINTAB:	.BLKW MXINP$	;TBL OF CLK TICKS LEFT BEFONFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
;COMMITMENT BY DIGITAL EQUIPBROUTINE
;	MODULE IS REQUIRED AND "MULR0$" AND "DIVR0" MUST BE DEFINED
;	WHEN ASSEMBLING "GENS".

	.IF	DF,AUTOG$
	OFSET=4
 IF RATE DECREASE IS NEEDED
PTR=WS+2	;PTR FOR INITIAL SIX POINTS NEEDED FOR DIGITAL FILTER
CAL=PTR+2	;LO-ORDER PART OF AREA AC	.ENDC

	.IF	NDF,AUTOG$
	OFSET=2
	.ENDC
	.SBTTL PARAMETER-VARIABLE TABLE OFFSETS


;	THE FOLLOWING LIST OF OFFSETS INTOCUM. DURING SIGNAL INCREASE
CAH=CAL+2	;HI-ORDER PART
OSL=CAH+2	;LO-ORDER PART OF OLD SLOPE MINIMUM
OSH=OSL+2	;HI-ORDER PART
 THE PARAMETER TABLE - SCRATCH
;	AREA DEFINED BY THE ADDRESS IN REGISTER FIVE(R5) WHEN "PEAK" IS
;	CALLED IS USED BY THE ROUTITML=OSH+2	;LO-ORDER PART OF CURRENT PT COUNTER
TMH=TML+2	;HI-ORDER PART
CNTR2=TMH+2	;COUNTER OF POINTS TO AVERAGE
SAV0=CNTR2+MENT CORPORATION.

;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLNE.

SR=0		;PPDENS, ORIGINAL SAMPLE RATE
WT=2		;PPWIDTH, WIDTH TEST PARAMETER
GT=4		;PPGATE, NO. OF CONSECUTIVE CHANGES TO CIED BY DEC.

;LDP SOFTWARE DEVELOPMENT   JUNE 1975



	.SBTTL MACROS,GLOBALS, AND CONDITIONALS

	.MCALL ..V2..,.REGDEF,HANGE DIRECTION
HM=6		;PPMNIN, MINIMUM CHANGE CONSIDERED AN INCREASE
.IF	DF,AUTOG$
AUT=10		;PPAUTG,SET NON-ZERO FOR AUTO-GAIN$SOB,$MUL,$DIV
	..V2..
	.REGDEF

	;EXTERNAL GLOBALS
.GLOBL	CTOBUF				;FROM CONTROL MODULE
.GLOBL	BAGET,BASIZ,BBASIZ	;FROM ED INPUT
.ENDC
FIRSTM=HM+OFSET	;PPINIT, SET EQUAL ZERO MEANS MODULE NOT CALLED YET
EROR=FIRSTM+1	;ERROR INDICATOR
CNTR1=ERORBUFFER ALLOCATION MODULE
	.IF	NDF,CTREL$
.GLOBL	BAREL
	.ENDC

	;INTERNAL GLOBAL
.GLOBL	PEAK

;	THE MODULE IS VERY CONCER+1	;NEEDED COUNTER
SC=CNTR1+1	;BASELINE TEST INCREASE COUNTER
BS=SC+1		;BASELINE SWITCH. 0=PEAK STARTED ON BASELINE
		;	     NED WITH ONE CONDITIONAL ASSEMBLY
;	PARAMETER,
;		"AUTOG$".
;	IF DEFINED, THE DATA WILL ALWAYS BE HANDLED IN THE PROCESSING
     1=LOOK FOR PEAK WIDTH
		;		  2=LOOK FOR END ON BASELINE
S1=BS+1		;SWITCH SET IF DECREASING W/OUT A PREV. INCREASE
S2=S1+;	PORTION OF THE ROUTINE AS IF THE DATA WAS OBTAINED VIA AUTO-
;	GAINING, THUS HAVING A POSSIBILITY OF EIGHTEEN(18) BIT 
;	SIG1		;SWITCH SET IF INCREASING AFTER A DECRES OR BASELINE
Y1=S2+2		;FIRST POINT OF ARRAY USED FOR SMOOTHING WINDOW
.IF	DF,AUTOG$NIFICANCE, EVEN THOUGH THE ACTUAL DATA MAY BE EITHER 
;	AUTO-GAINED DATA OR 12-BIT NON-AUTO-GAINED DATA DEPENDING
;	ON THE PAR
Y1H=Y1+2	;HI-ORDER PART OF FIRST POINT OF ARRAY
.ENDC
Y2=Y1+OFSET	;SECOND POINT OF ARRAY
.IF	DF,AUTOG$
Y2H=Y2+2	;HI-ORDER AMETER "PPAUTG" IN THE PARAMETER TABLE. SEE OPERATING
;	MANUAL.
;
;	"CTREL$" IS ANOTHER CONDITIONAL ASSEMBLY PARAMETER 
;	AFOF 2ND PT
.ENDC
Y3=Y2+OFSET	;THIRD PT
.IF 	DF,AUTOG$
Y3H=Y3+2
.ENDC
Y4=Y3+OFSET	;FOURTH PT
.IF	DF,AUTOG$
Y4H=Y4+2
.ENDCFECTING THIS MODULE. IF NOT DEFINED, THE MODULE MUST RELEASE
;	ITS OWN INPUT BUFFERS BEFORE RETURNING CONTROL TO THE CONTROL
;
Y5=Y4+OFSET	;FIFTH PT
.IF	DF,AUTOG$
Y5H=Y5+2
.ENDC
Y6=Y5+OFSET	;SIXTH PT
.IF	DF,AUTOG$
Y6H=Y6+2
.ENDC
Y7=Y6+OFSET	;SEV	MODULE.
;	
;	"EIS" IS THE ONLY OTHER CONDITIONAL ASSEMBLY PARAMETER 
;	AFFECTING THIS MODULE. IF NOT DEFINED, THE GENERAL SUENTH PT
.IF	DF,AUTOG$
Y7H=Y7+2
.ENDC
DN=Y7+OFSET	;ACTUAL DENSITY OF THE POINTS IN THE PROCESS
WS=DN+2		;SWITCH TO DOUBLE DN;HI-ORDER PART
.ENDC
SLL=BM+OFSET	;LO-ORDER PART OF NEW OR CURRENT SLOPE*1000
SLH=SLL+2	;HI-ORDER PART
OAL=SLH+2	;LO-ORDER PI/O IS TREATED IN THIS WAY.


PEAK:	CLRB	NDFLG		;CLEAR END FO INPUT FLAG
	TST	+2(R1)		;IS THIS A LAST BUFFER
	.ENABL  LSB
ART OF AREA
OAH=OAL+2	;HI-ORDER PART
PH=OAH+2	;PEAK HEIGHT	(SAVED FOR OUTPUT)
.IF	DF,AUTOG$
PHH=PH+2	;HIGH ORDER PART OF PEA	BMI	3$		;IF NOT, B+C
	BNE	2$		;IF INPUT BUFFER NOT EMPTY, B+C
	JMP	ENDATA		;GO PASS LAST OUTPUT BUFFER
2$:	DECB	NDFLG		;INDIK HEIGHT
.ENDC
PTL=PH+OFSET	;LO-ORDER PART OF TIME OF PEAK (SAVED FOR OUTPUT)
PTH=PTL+2	;HI-ORDER PART
LMH=PTH+2	;LEADING MICATE END OF INPUT
	NEG	+2(R1)		;IF NOT, GET BUFFER SIZE
3$:	MOV	(R1)+,INADDR	;FREE REGS OF BUFFER INFORMATION

	.IF	NDF,CTRENIMUM HEIGHT(SAVED FOR OUTPUT)
.IF	DF,AUTOG$
LMHH=LMH+2	;HI-ORDER PART
.ENDC
LMTL=LMH+OFSET	;LO-ORDER PART OF TIME OR LEADINL$
	MOV	INADDR,SINADR	;SAVE INPUT BUFFER ADDRESS
	.ENDC

	MOV	(R1),INCNT
	MOV	R0,OUTADR
	TSTB	FIRSTM(R5)	;IS THIS THE FIRSG MINIMUM 
LMTH=LMTL+2	;HI-ORDER PART
WDL=LMTH+2	;LO-ORDER PART OF WIDTH(IN SAMPLE CNTS)
WDH=WDL+2	;HI-ORDER PART
MN=WDH+2	;T CALL
	BEQ	4$		;IF YES, B+C
	JMP	RESUME		;RESUME WHERE WE LEFT OFF


	;COMES HERE ONLY ONCE AT THE FIRST CALL TO 
	;INITITRAILING MINIMUM
.IF	DF,AUTOG$
MNH=MN+2	;HI-ORDER PART
.ENDC
MTL=MN+OFSET	;LO-ORDER PART OF TIME OF TRAILING MINIMUM
MTH=MTALIZE VARIABLES AND PROCESSING

4$:	MOVB	#1,FIRSTM(R5)	;IND. MODULE ENTERED AT LEAST ONCE
	CLRB	EROR(R5)	;CLEAR ERROR INDICAT2	;WORD TO STORE R0 WHILE WAITING FOR NEXT INPUT BUFFER
SAV1=SAV0+2	;WORD TO STORE R1
SAV6=SAV1+2	;WORD TO STORE SP
MC=SAV6+2L+2	;HI-ORDER PART
TYPE=MTH+2	;OUTPUT PEAK TYPE INDICATOR
		;	=0, IMPLIES PEAK ENDED ON BASELINE
		;	=1, IMPLIES PEAK ENDED O	;TEMPORARY COUNTER FOR # OF MINS FOUND
CC=MC+2		;TEMPORARY COUNTER FOR # OF MAXS FOUND
MX=CC+2		;CURRENT MAXIMUM
.IF	DF,AUTON VALLEY
	.SBTTL PEAK ENTRY POINT

	;R5 CONTAINS ADDRESS OF START OF PARAMETER-VARIABLE TABLE FOR
	;   PERTAINENT DATA PATHG$
MXH=MX+2	;HIGH ORDER PART OF CURRENT MAXIMUM
.ENDC
KM=MX+OFSET	;LAST CREST HEIGHT
.IF	DF,AUTOG$
KMH=KM+2	;HIGH ORDER PAR.
	;R1 SHOULD CONTAIN THE ADDRESS OF THE ADDRESS OF THE INPUT BUFFER
	;   (R1)+2 SHOULD CONTAIN THE NUMBER OF ELEMENTS IN THE T
.ENDC
KH=KM+OFSET	;HEIGHT OF LAST PEAK CREST
.IF	DF,AUTOG$
KHH=KH+2	;HI-ORDER PART OF HEIGHT OF LAST PEAK CREST
.ENDC
KCINPUT
	;   BUFFER. IF NEGATIVE, THIS IS NOT THE LAST INPUT BUFFER AND 
	;   THE ABSOLUTE VALUE OF THIS NUMBER IS THE WORD COUNL=KH+OFSET	;LO-ORDER PART OF TIME OF LAST PEAK CREST
KCH=KCL+2	;HI-ORDER PART
CTL=KCH+2	;LO-ORDER PART OF TIME OF LATEST MAXIMT FOR THE
	;   BUFFER.
	;R0 SHOULD CONTAIN THE ADDRESS OF THE PRESENT POINTER INTO THE
	;   OUTPUT BUFFER. IF ZERO, NO OUTPUTUM
CTH=CTL+2	;HI-ORDER PART
KTL=CTH+2	;LO-ORDER PART OF PEAK LEADING MINIMUM TIME
KTH=KTL+2	;HI-ORDER PART
BTL=KTH+2	;LO-ORD BUFFER HAS YET BEEN 
	;   ALLOCATED. (R0)+2 SHOULD CONTAIN THE COUNT OF THE NUMBER
	;   OF EMPTY ENTRIES LEFT IN THE OUTPUT BER PART OF LEADING BASELINE MINIMUM TIME
BTH=BTL+2	;HI-ORDER PART
BM=BTH+2	;LEADING BASELINE MINIMUM
.IF	DF,AUTOG$
BMH=BM+2	UFFER. ALL BUFFERS
	;   ARE OF SIZE "BASIZ".
	;R0 AND R1 ARE ASSUMED TO HAVE BEEN PROVIDED BY THE 
	;   "CONTROL MODULE" AND DD	#Y1,PTR(R5)	; OF FIRST AVERAGED ELEMENT
	MOVB	#6,CNTR1(R5)	;GET CNT OF AVERAGED ELEMENTS NEEDED


	;GET FIRST SIX AVERAGE HALVES
	.ENDC

	ASL	R3		
	
	.IF	DF,AUTOG$
	ROL	R2
	.ENDC

	ASL	R3

	.IF	DF,AUTOG$
	ROL	R2
	.ENDC

	SUB	R0,R3		;TD POINTS FOR DIGITAL FILTER.

FIRST6:	JSR	PC,NEXTPT	;GET NEXT AVERAGED POINT

	MOV	R0,@PTR(R5)	;STORE LOW ORDER RESULT
	ADDERM2 - TERM1
	SBC	R2

	.IF	DF,AUTOG$
	SUB	R1,R2
	.ENDC

	MOV	Y5(R5),R0	;  + 11 * (Y5 + Y3)
	ADD	Y3(R5),R0

	.IF	DF,AUT	#2,PTR(R5)	;POINT TO NEXT LOC

	.IF	DF,AUTOG$
	MOV	R1,@PTR(R5)	;STORE HIGH ORDER RESULT
	ADD	#2,PTR(R5)	;POINT TO NEXT LOCOG$
	MOV	Y5H(R5),R4
	ADC	R4
	ADD	Y3H(R5),R4
	.ENDC

	MOV	#11.,R1
	JSR	PC,MULUNS
	ADD	R1,R3
	ADC	R2
	ADD	R0,R2

	.IF	
	.ENDC

	DECB	CNTR1(R5)	;HAVE THE 1ST 6 AVERAGED POINTS BEEN CAL
	BNE	FIRST6		;IF NOT , B+C


	;START OF NEW PEAK


N2DF,AUTOG$
	MOV	R4,R0
	$MUL	#11.,R0
	ADD	R1,R2
	.ENDC

	MOV	Y4(R5),R0	;  + 14 * Y4
	MOV	#14.,R1
	JSR	PC,MULUNS
	ADD	R1,R47:	MOVB	#1,S1(R5)	;SET DECREASING WITHOUT INCREASE
	CLR	MC(R5)		;CLR MINIMUM COUNTER
	CLR	CC(R5)		;CLR MAXIMUM COUNTER
	CLRB3
	ADC	R2
	ADD	R0,R2

	.IF	DF,AUTOG$
	MOV	Y4H(R5),R0
	$MUL	#14.,R0
	ADD	R1,R2
	MOV	R2,R0
	MOV	R3,R1
	MOV	#42.,R3		;[-(	S2(R5)		;SET NOT INCREASING AFTER A DECREASE
	MOV	#77777,MN(R5)	;SET MINIMUM TO LARGE NO.
	MOV	#100000,MX(R5)	;SET MAXIMUN TOY1+Y7)+4*(Y2+Y6)+11.*(Y3+Y5)+14.*Y4]/
	CLR	R2		;				    42.
	JSR	PC,DDIVD
	MOV	R1,Y4(R5)	;STORE NEW FILTERED POINT
	MOV	R0,Y VERY LOW NO.

	.IF	DF,AUTOG$
	MOV	#77777,MNH(R5)	;FINISH SETTING MINIMUM
	MOV	#100000,MXH(R5)	;FINISH SETTING MAXIMUM
	.EN4H(R5)
	.ENDC

	.IF	NDF,AUTOG$
	MOV	R2,R0
	MOV	R3,R1
	$DIV	#42.,R0		;[-(Y1+Y7)+4*(Y2+Y6)+11.*(Y3+Y5)+14.*Y4]/
				;      DC

	;GETTING NEXT POINT

N100:	ADD	WS(R5),DN(R5)	;UPDATE SAMPLES TO AVERAGE
	.ENABL LSB
	BCC	1$		;IF SAM. RATE IS TOO LAR                               42.
	MOV	R0,Y4(R5)	;STORE NEW FILTERED POINT
	.ENDC

	;END OF ALGORITHM FOR DIGITAL FILTER
GE
	JMP	ENDATB		;EXIT
1$:	CLR	WS(R5)		;CLEAR CHANGE SAMPLE RATE INDICATOR
	ADD	DN(R5),TML(R5)	;UPDATE CURRENT TIME
	ADC	TMH(
	;SHIFT POINTS FOR ALGORITHM DOWN ONE

	MOV	R5,R4		;SET Y(I) =  Y(I+1)
	ADD	#Y1,R4

	.IF	NDF,AUTOG$
	MOV	#6,R3
	.ENDC
OR
	CLRB	SC(R5)		;CLEAR FLAGS. BASELINE SLOPE CHANGE CNTR
	CLRB	BS(R5)		;BASLINE SWITCH
	CLR	CAL(R5)		;ACC. AREA DURING INCRER5)
	JSR	PC,NEXTPT	;GET NEXT AVERAGED POINT
	MOV	R0,Y7(R5)	;STORE LOW PART OF VALUE

	.IF	DF,AUTOG$
	MOV	R1,Y7H(R5)	;STORE ASE
	CLR	CAH(R5)
	MOV	#77777,OSH(R5)	;SET SLOPE TO LARGE NO.
	MOV	#177777,OSL(R5)	;
	CLR	WS(R5)		;RATE CHANGE SWITCH
	MOV	SHI PART OF VALUE
	.ENDC

	;START OF ALGORITHM FOR DIGITAL FILTER

	MOV	Y7(R5),R0	;ALGORITHM FOR GETTING CNTR WGTD VALUE
	AR(R5),DN(R5)	;TAKE SAMPLE RATE FROM TABLE
	MOV	DN(R5),TML(R5)	;SET UP CURRENT TIME(IN SAMPLE PERIODS)
	CLR	TMH(R5)		;CLEAR HIGDD	Y1(R5),R0	; -(Y1+Y7)

	.IF	DF,AUTOG$
	MOV	Y1H(R5),R1
	ADC	R1
	ADD	Y7H(R5),R1	;         MOST SIG. HALVES
	.ENDC

	CLR	H PART OF TIME
	ASL	TML(R5)		;
	ROL	TMH(R5)
	ADD	DN(R5),TML(R5)
	ADC	TMH(R5)		;TIME=3*DENSITY
	MOV	R5,PTR(R5)	;GET ADDR
	AR2
	MOV	Y6(R5),R3	;+  4(Y6+Y2)
	ADD	Y2(R5),R3

	.IF	DF,AUTOG$
	ADC	R2
	ADD	Y6H(R5),R2
	ADD	Y2H(R5),R2	;         MOST SIG.)	;COMP. CENTER VALUE TO CURRENT MIN
	BLT	2$
	BEQ	3$		;IF EQUAL, CHECK LO-ORDER
	JMP	N150		;IF GREATER THAN OR EQUAL, B+C
	.BY
	MOV	DN(R5),R1	;  CENTERED PT. * SAMPLE RATE
	JSR	PC,MULUNS
	ADD	R1,OAL(R5)
	ADC	R0
	ADD	R0,OAH(R5)

	.IF	DF,AUTOG$
	ENDC

3$:	CMP	Y3(R5),MN(R5)	;CMPARE CENTER VALUE TO CURRENT MIN
	BLO	2$
	JMP	N150		;IF GREATER THAN OR EQUAL, B+C
	;NEW POMOV	Y3H(R5),R0
	$MUL	DN(R5),R0
	ADD	R1,OAH(R5)
	.ENDC

	ADD	CAL(R5),OAL(R5)	; AND INCREASE ACC. AREA BY AREA ACC.
	ADC	OAHINT LOWER THAN MINIMUM

2$:	CMPB	#1,BS(R5)	;ARE WE LOOKING FOR PEAK WIDTH
	BNE	N117		;IF NOT, B+C
	MOV	KH(R5),R1	;IF SO, CHE(R5)		;   DURING INCREASE
	ADD	CAH(R5),OAH(R5)
	.ENABL	LSB
	TSTB	BS(R5)		;IS PEAK START ON BASELINE?
	BNE	1$		;IF NOT, B+C
CK IF LOW ENOUGH TO
	ADD	KM(R5),R1	;  CALCULATE PEAK WIDTH

	.IF	DF,AUTOG$
	MOV	KHH(R5),R0
	ADC	R0
	ADD	KMH(R5),R0
	ASR	R	TSTB	S1(R5)		;ARE WE ON BACK SIDE OF PEAK
	BEQ	1$		;IF NOT, B+C
	CLR	OAH(R5)		;IF SO, ZERO ACC. AREA
	CLR	OAL(R5)
1$:	CLR	C0		;CAL (KM+KH)/2
	.ENDC

	ROR	R1		;(KM+KH)/2 = TERM

	.IF	DF,AUTOG$
	CMP	Y3H(R5),R0	;IS CENTERED PT > TERM
	BGT	N117		;IAH(R5)		;CLEAR ACC. AREA DURING INCREASE
	CLR	CAL(R5)
	CMP	MC(R5),GT(R5)	;COMPARE #MINS TO GATE
	BGE	2$		;IF GREATER OR EQUALF SO, B+C
	BLT	4$		;IF LESS, B+C
	.ENDC

	CMP	Y3(R5),R1	;IS CENTERED PT > TERM
	BHI	N117		;IF SO, B+C
4$:	MOV	TMH(R5),R0	;, B+C
	JMP	N100		;OTHERWISE
2$:	INCB	S1(R5)		;INDICATE NOT ON BACKSIDE
	CLR	CC(R5)		;CLEAR MAXIMUMS COUNTER
	TSTB	S2(R5)		;WOTHERWISE, CALCULATE 1/2WID AT 1/2HT
	MOV	TML(R5),R1
	SUB	KCH(R5),R0
	SUB	KCL(R5),R1
	SBC	R0
	MOV	R0,WDH(R5)	;SET WIDTH
	MAS THERE AN INCR. AFTER A DECR. OR BASL
	BNE	3$		;IF SO, B+C
	MOV	#100000,MX(R5)	;IF NOT, SET MAX LARGE NEG NUM

	.IF 	DF,AUOV	R1,WDL(R5)
	INCB	BS(R5)		;INDICATE LOOKING FOR END PEAK ON BASLIN
	$DIV	DN(R5),R0	;IS WIDTH LESS THAN 25 PTS
	CMP	R0,#25.TOG$
	MOV	#100000,MXH(R5)
	.ENDC

	JMP	N200
3$:	MOV	CTL(R5),PTL(R5)	;RECORD PEAK TIME
	MOV	CTH(R5),PTH(R5)
	MOV	KTL(R5),L
	BLT	N117		;IF SO , B+C

	MOV	Y5(R5),R1	;OTHERWISE, ADD 1/2 Y5 TO ACC. AREA

	.IF	NDF,AUTOG$
	ASR	R1
	.ENDC

	.IF	DF,AUMTL(R5);RECORD LEADING MINIMUM TIME
	MOV	KTH(R5),LMTH(R5)
	MOV	MX(R5),PH(R5)	;RECORD PEAK HEIGHT
	MOV	KM(R5),LMH(R5)	;RECORD TOG$
	MOV	Y5H(R5),R0	
	ASR	R0
	ROR	R1
	.ENDC

	ADD	R1,OAL(R5)	;ADJUSTING ACC. AREA FOR STEP CHANGE
	ADC	OAH(R5)

	.IF	DLEADING MINIMUM HEIGHT

	.IF	DF,AUTOG$
	MOV	MXH(R5),PHH(R5)	;RECORD PEAK HEIGHT(MSH)
	MOV	KMH(R5),LMHH(R5);RECORD LEADING MIF,AUTOG$
	ADD	R0,OAH(R5)
	.ENDC

	MOV	DN(R5),WS(R5)	;SET SWITCH TO HALVE SAMPLE RATE
	JSR	PC,OUTSRC	;OUTPUT SAMPLE RATE CHANIMUM HEIGHT(MSH)
	.ENDC

	MOVB	#1,BS(R5)	;IND. LOOKING FOR PEAK WIDTH
	MOV	CTL(R5),KCL(R5)	;KEEP TIME OF LASTEST MAX
	MOV	NGE BLOCK
N117:	MOV	Y3(R5),MN(R5)	;RECORD CURRENT MINIMUM VALUE

	.IF 	DF,AUTOG$
	MOV	Y3H(R5),MNH(R5)
	.ENDC

	MOV	TMH(R5CTH(R5),KCH(R5)
	MOV	MX(R5),KH(R5)	;KEEP VALUE OF LATEST MAX

	.IF	DF,AUTOG$
	MOV	MXH(R5),KHH(R5)	
	.ENDC

	JMP	N247		;PR
	.IF	DF,AUTOG$
	MOV	#14,R3
	.ENDC

	.ENABL	LSB
1$:	MOV	OFSET(R4),(R4)+
	$SOB	R3,1$

	.IF	DF,AUTOG$
	CMP	Y3H(R5),MNH(R5),MTH(R5)	;RECORD CURRENT PT COUNTER
	MOV	TML(R5),MTL(R5)
	INC	MC(R5)		;INC MINS FOUND COUNTER
	MOV	Y3(R5),R0	;INC ACC. AREA  LEADING MINIMUM TIME
	MOV	MTH(R5),KTH(R5)
	MOV	MN(R5),KM(R5)	;RECORD PEAK LEADING MINIMUM

	.IF	DF,AUTOG$
	MOV	MNH(R5),KMHSIDE OF PEAK
	BEQ	2$		;IF NOT, GO GET NEXT POINT
	MOV	WDH(R5),R0
	$MUL	WT(R5),R0	;CAL WIDTH*WIDTH TEST
	MOV	R1,R3
	MOV	WDL((R5)	
	.ENDC

	.ENABL	LSB
	CMPB	#1,BS(R5)	;DETERMINE WHAT TO DO BY WHERE WE ARE
	BLE	1$		;IF NOT STARTING ON BASELINE,END OR5),R0	;IF SO, TEST TO SEE IF FAR ENOUGH PAST
	MOV	WT(R5),R1	;  TO START LOOKING FOR BASELINE
	JSR	PC,MULUNS
	ADD	R3,R0
	MOVEPARE FOR NEXT PEAK
	;NEW POINT LARGER THAN CURRENT MINIMUM

N150:	MOV	Y3(R5),R0	;UPDATE AREA ACC. DURING INCR BY
	MOV	DN(RF PEAK
	MOV	KTL(R5),BTL(R5)	;IF STARTING ON BASELINE, RECORD NEW 
	MOV	KTH(R5),BTH(R5)	;  BASELINE TIME AND
	MOV	KM(R5),BM(R55),R1	;CURRENT AREA
	JSR	PC,MULUNS
	ADD	R1,CAL(R5)
	ADC	R0
	ADD	R0,CAH(R5)

	.IF	DF,AUTOG$
	MOV	Y3H(R5),R0
	$MUL	DN(R5),)	;  HEIGHT

	.IF	DF,AUTOG$
	MOV	KMH(R5),BMH(R5)
	.ENDC

	JMP	N160
1$:	BNE	2$		;IF NOT LOOKING FOR WIDTH, B+C
	MOV	MTL(RR0
	ADD	R1,CAH(R5)
	.ENDC

	MOV	MX(R5),R1	;CHECK IF NEW PT. SIGNIFICANTLY INCREASED
	ADD	HM(R5),R1	; OVER LATEST MAX
	.ENA5),R1	;OTHERWISE,MUST CAL. PEAK WIDTH NOW
	MOV	MTH(R5),R0	;  SINCE PEAK HAS ENDED BEFORE 
	SUB	KCH(R5),R0	;  HALF HEIGHT WAS RBL	LSB

	.IF	DF,AUTOG$
	MOV	MXH(R5),R0
	ADC	R0
	CMP	Y3H(R5),R0	
	BGT	1$
	BLT	2$
	.ENDC

	CMP	Y3(R5),R1
	BHI	1$
2$:	JEACHED
	SUB	KCL(R5),R1
	SBC	R0
	ASR	R0
	ROR	R1		;WIDTH EQUALS 1/2(MIN TIM - LEAD MIN TIM)
	MOV	R0,WDH(R5)	;SET WIDTH
	MOV	MP	N200
1$:	MOV	TML(R5),CTL(R5)	;IF INCREASE IS SIGNIFICANT, UPDATE MAX
	MOV	TMH(R5),CTH(R5)	;  INFORMATION
	INC	CC(R5)		;UPDR1,WDL(R5)
2$:	CLR	TYPE(R5)	;IND. NOT ON BASELINE
	JSR	PC,OUTPUT	;OUTPUT PEAK DATA
	MOVB	#2,BS(R5)	;IND. LOOKING FOR END ON BATE TIME,MAXS FOUND COUNT,
	MOV	Y3(R5),MX(R5)	; AND HEIGHT

	.IF	DF,AUTOG$
	MOV	Y3H(R5),MXH(R5)
	.ENDC

	CMP	CC(R5),GT(R5ASELINE
	MOV	WDL(R5),R1	;CHECK WIDTH
	MOV	WDH(R5),R0
	$DIV	DN(R5),R0
	CMP	#25.,R0		
	BLE	4$		;IF WIDER THAN 24 PTS, GO LOWE)	;CMPARE #MAXS TO GATE VALUE
	BGE	3$		;IF HIGH ENOUGH, B+C
	JMP	N200		;OTHERWISE WAIT
3$:	CLR	MC(R5)		;CLR MINS COUNTER
	TSR SAMP RATE
	JMP	N160
4$:	MOV	Y3(R5),R1	;CORRECT ACC AREA BY 1/2 CENTERED PT HT

	.IF 	NDF,AUTOG$
	ASR	R1
	.ENDC

	.IF	DTB	S1(R5)		;ARE WE ON BACKSIDE OF PEAK
	BNE	4$		;IF SO, B+C
	JMP	N160		;OTHERWISE
4$:	MOV	MN(R5),R0	;UPDATE AREA ACC. DURING F,AUTOG$
	MOV	Y3H(R5),R0
	ASR	R0
	ROR	R1
	ADD	R0,OAH(R5)
	.ENDC

	ADD	R1,OAL(R5)
	ADC	OAH(R5)
	JSR	PC,OUTSRC	;OUTPUT BLINCR. BY
	MOV	DN(R5),R1	;  1/2 LEADING MINIMUM * SAMPLE RATE
	JSR	PC,MULUNS

	.IF	DF,AUTOG$
	MOV	R1,R3
	MOV	R0,R2
	MOV	MNOCK INDICATINE SAMPLE RATE
	MOV	DN(R5),WS(R5)	; CHANGE. SET SWITCH TO CHANGE SAMP RATE
	;LOOKING FOR BASELINE

N160:	MOV	MX(H(R5),R0
	$MUL	DN(R5),R0
	ADD	R0,R3
	MOV	R3,R1
	MOV	R2,R0
	.ENDC

	ASR	R0
	ROR	R1
	ADD	R1,CAL(R5)	;UPDATE AREA
	ADC	R0R5),MN(R5)	;SET CURRENT MAX TO CURRENT MIN

	.IF	DF,AUTOG$
	MOV	MXH(R5),MNH(R5)
	.ENDC

N200:	CMPB	#2,BS(R5)	;HAS THE WIDT
	ADD	R0,CAH(R5)
	INCB	S2(R5)		;IND INCREASE AFTER DECREASE
	CLRB	S1(R5)		;IND NO DECREASE
	MOV	MTL(R5),KTL(R5)	;RECORD PEAKH BEEN CALCULATED YET
	.ENABL	LSB
	BEQ	1$		;IF SO, B+C
2$:	JMP	N100		;IF NOT, GO GET NEXT PT
1$:	TSTB	S1(R5)		;IS PT ON BACKOV	R0,R4
	MOV	R1,R3
	MOV	R2,R0
	$MUL	#1000.,R0
	ADD	R3,R0
	MOV	R0,R1
	MOV	R4,R0
	.ENDC

	MOV	TML(R5),R3	;          (CURBUFFER
20$:	MOV	R0,SAV0(R5)	;SAVE APPROPRIATE INFO
	MOV	R1,SAV1(R5)
	MOV	(SP)+,SAV6(R5)
	CLC			;INDICATE NO ERRORS

	.IF	NRENT TIME-LEADING BASELINE
	MOV	TMH(R5),R2	;                        TIME)
	SUB	BTH(R5),R2
	SUB	BTL(R5),R3
	SBC	R3
	JSR	PC,DDF,CTREL$
	JMP	ENDATC		;GO RELEASE INPUT BUFFER AND RETURN
	.ENDC

	.IF	DF,CTREL$
	RTS	PC		;RETURN TO CONTROL MODULE
	.ENDDIVD
	TSTB	SIGN
	BEQ	9$
	NEG	R0		;IF SIGNS DIFFERED, SLOPE NEGATIVE
	NEG	R1
	SBC	R0
9$:	MOV	R0,SLH(R5)
	MOV	R1,SLL(R5)
	C

RESUME:	MOV	SAV0(R5),R0	;RESTORE APPROPRIATE INFO
	MOV	SAV1(R5),R1
	MOV	SAV6(R5),-(SP)
	MOV	INADDR,R2	;GET ADDR OF INPUTCMP	OSH(R5),SLH(R5)	;COMPARE TO OLD SLOPE
	BGT	10$		;IF OLD GREATER, GO UPDATE AND TRY AGAIN
	BLT	11$		;IF OLD IS LESS, CHECK  BUFFER
	INC	INCNT
NEXTC:	MOV	(R2)+,R3	;GET NEXT DATUM
	
	.ENABL	LSB
	.IF	DF,AUTOG$
	TST	AUT(R5)
	BEQ	5$		;IF NOT, B+C
	IF BASELINE
	CMP	OSL(R5),SLL(R5)	;COMPARE TO LSH TO OLD SLOPE
	BLOS	11$		;IF OLD IS LESS, CHECK IF BASELINE
10$:	MOV	SLL(R5),MOV	-2(R2),-(SP)	;GET GAIN BITS
	BIC	#7777,(SP)
	BIC	(SP),R3		;GET RID OF GAIN BITS IN DATA
	CLR	R4		;GET MSH READY
	SUB	#40	TML(R5),R3	;CAL TIME FROM CREST TO CURRENT POINT
	MOV	TMH(R5),R2
	SUB	KCH(R5),R2
	SUB	KCL(R5),R3
	SBC	R2
	CMP	R2,R0		;COMPOSL(R5)	;SET OLD TO NEW
	MOV	SLH(R5),OSH(R5)
	CLRB	SC(R5)		;CLEAR SLOPE INCR COUNTER
	JMP	N100		;GO GET NEXT POINT
11$:	INCBARE TWO CALCULATED QUANTITIES
	BGT	4$		;IF FIRST IS GREATER, B+C
	BEQ	3$		;IF HIGH PARTS EQUAL, GO CHECK LO PARTS
5$:	JMP	N10	SC(R5)		;INCRE SLOPE INCR COUNTER
	CMPB	#2,SC(R5)	;HAS SLOPE INCR TWICE IN A ROW
	BGE	12$		;IF SO, B+C
	JMP	N100		;OTHERWISE0		;IF FIRST IS LESS, GO GET NEXT POINT
3$:	CMP	R3,R1		;COMPARE LSH OF TWO CAL. QUANTITIES
	BLO	5$		;IF FIRST IS LESS, GO GET , GO GET NEXT POINT
12$:	MOV	#1,TYPE(R5)	;IND. ENDING PEAK ON BASELINE
	JSR	PC,OUTPUT	;OUTPUT PEAK DATA BLOCK
	CLRB	SC(R5)		;NEXT POINT
4$:	MOV	Y3(R5),R0	;OTHERWISE, CALCULATE CURRENT SLOPE
	CLRB	SIGN		; CLEAR SIGN FLAG
	SUB	BM(R5),R0	;SLOPE = (CURRECLEAR SLOPE INCR. COUNTER
	MOV	#77777,OSH(R5)	;SET SLOPE TO LARGE NO.
	CLRB	BS(R5)		;SET FLAG TO INDICATE STARTING AT BASELINNT POINT-LEADING BASELINE
				;                       MINIMUM)/
	.IF	DF,AUTOG$
	MOV	Y3H(R5),R2
	SBC	R2
	SUB	BMH(R5),R2
	BP
	JMP	N100		;GO GET NEXT POINT
	.SBTTL UTILITIES

	;ROUTINE TO GET NEXT AVERAGED POINT


NEXTPT:	MOV	DN(R5),CNTR2(R5)	;GEL	55$		;IF POSITIVE, B+C
	INCB	SIGN		;OTHERWISE, INDICATE SIGN CHANGE
	NEG	R2
	NEG	R0
	SBC	R2
55$:	TST	R2		;CHECK FOR ZERO T NO.OF PTS TO AVERAGE
	MOV	INADDR,R2	;GET INPUT TABLE ADDRESS
	CLR	R0		;GET SUM READY
	CLR	R1	

	.IF	DF,AUTOG$
	CLR	R4
	SLOPE
	BNE	7$
	.ENDC
	
	.IF	NDF,AUTOG$
	BGE	6$		;IF POSITIVE, B+C
	INCB	SIGN		;OTHERWISE, INDICATE SIGN CHANGE
	NEG	R0
	.ENDC

NEXTIN:	INC	INCNT		;DECR INPUT BUFR CNT
	.ENABL	LSB
	BLE	NEXTC		;IF NOT EMPTY , CONTINUE
	TSTB	NDFLG		;CHECK FOR LAS.ENDC

6$:	TST	R0		;CHECK FOR ZERO SLOPE
	BEQ	9$		;IF NON-ZERO , B+C
7$:	MOV	#1000.,R1
	JSR	PC,MULUNS

	.IF	DF,AUTOG$
	MT BUFFER
	BEQ	20$		;IF NOT A LAST BUFFER, B+C
	TST	(SP)+		;FORGET WHERE WE CAME FROM 
	JMP	ENDATB		;IF IT IS, RELEASE OUTPUT N SAMPLES AVERAGED
	
	.IF	DF,AUTOG$
	CLR	R2		;DIVID R0,R1 BY R2,R3. RESULT IN R0,R1
	JSR	PC,DDIVD
	MOV	R0,-(SP)
	MOV	R1,R0LUE
	MOV	MN(R5),R0
	MOV	R2,R1
	JSR	PC,MULUNS
	ADD	R1,OAL(R5)
	ADC	R0
	ADD	R0,OAH(R5)

	.IF	DF,AUTOG$
	MOV	MNH(R5),R0
	
	MOV	(SP)+,R1
	.ENDC

	.IF	NDF,AUTOG$
	$DIV	R4,R0		;DIVD R0,R1 BY R4. RESULT R0
	.ENDC
	RTS	PC


	;ROUTINE TO GET THE$MUL	R2,R0
	ADD	R1,OAH(R5)
	.ENDC

	.ENABL	LSB
	JSR	PC,GETBUF	;GET OUTPUT BUFR ADDR IN R2,WD CNT ADR R0
	BCC	1$		;IF NO ER CURRENT OUTPUT BUFR POINTER,RETURNED IN
	; R2, AND ADDRESS OF COUNT OF OUTPUT SPACE LEFT, RETURNED IN R0

GETBUF:	CLC			;INDROR, B+C
	TST	(SP)+

	.IF	NDF,CTREL$
	JMP	ENDATC		;GO RELEASE INPUT BUFFER AND RETURN
	.ENDC

	.IF	DF,CTREL$
	RTS	PC
	.. NO ERROR
	.ENABL	LSB
1$:	MOV	OUTADR,R0	;GET ADDR OF ADDR OF OUTPUT BUFFER
	MOV	(R0)+,R2	;GET ADDR OF OUTPUT BUFFER
	BNE	2$ENDC

1$:	MOV	#OAL,R4		;GET ADDR OF OUTPUT BLOCK
	ADD	R5,R4

	.IF	DF,AUTOG$
	MOV	#17.,R3		;GET BLOCK LENGTH
	.ENDC

	.I		;IF IT EXITS, B+C
	MOV	BASIZ,(R0)	;SET WORD CNT TO BUFFER SIZE
	TST	-(R0)		;GET ADDR OF ADDR OF OUTPUT BUFFER
	JSR	PC,BAGETF	NDF,AUTOG$
	MOV	#14.,R3		;GET BLOCK LENGTH
	.ENDC

3$:	TST	(R0)		;IS THERE ROOM FOR MORE IN OUT BUFR
	BNE	2$		;IF SO, B+C	;OTHERWISE, GET AN OUTPUT BUFFER
	BCC	1$		;IF ALLS WELL, B+C
	CLRB	FIRSTM(R5)	;IF NOT, IND. NEXT DATA RECEIVED FOR THIS
	INC
	JSR	PC,PASBUF	;IF NOT, PASS THIS ONE AND GET NEW ONE
2$:	MOV	(R4)+,(R2)+	;PUT OUTPUT BLOCK IN OUTPUT BUFFER
	DEC	(R0)		;DECB	EROR(R5)	;INDICATE ERROR
	SEC			; CHANL TO BE TREATED AS INITIAL DATA. 
2$:	RTS	PC		;INDICATE ERROR AND RETURN

	;ROUTINE R BUFR WORD CNT
	$SOB	R3,3$		;DECR BLOCK WORD CNT. B+C IF NOT ZERO
	MOV	R2,-(R0)	;STORE CURRENT BUFFER POINTER
	CLR	OAL(R5)		TO PASS FULL OUTPUT BUFFER TO CONTROL MODULE
	; ROUTINE ALSO CALLS GETBUF TO GET NEW OUTPUT BUFFER

PASBUF:	MOV	BASIZ,(R0)	;S;CLEAR AREA
	CLR	OAH(R5)
	RTS	PC

	;ROUTINE TO OUTPUT -1, INDICATING A CHANGE OF SAMPLE RATE

OUTSRC:	MOV	#2,R3		;OUTPUT D00,R3	;GET IN RIGHT RANGE(SHOULD NOT BE NEG)
	SBC	R4		;GET RIGHT SIGN(SHOULD BE POSITIVE)
	SWAB	(SP)		;PUT IN RIGHT JUSTIFIED ET LBI TO BUFR SIZE
	.ENABL	LSB
	SUB	BBASIZ,R2	;GET BEGIN BUFR ADDR
	NEG	(R0)		;INDICATE NOT LAST BUFR
	MOV	R2,-(R0)	;RESTORPOSITION
	ASR	(SP)
	ASR	(SP)	
	ASR	(SP)
	COM	(SP)		;GET COMPLEMENT,I.E., # OF 	SHIFTS
	BIC	#177771,(SP)	;IN 2 LEAST SIGN. BE BUFR ADDR
	JSR	PC,CTOBUF	;PASS BUFR
	BCC	3$		;IF ALL'S WELL, B+C
	CLR	FIRSTM(R5)	;INDICATE IN INITIAL STATE
4$:	TST	(SP)+	ITS
	BEQ	2$		;IF DONE, B+C
4$:	ASL	R3		;NORMALIZE VALUE
	ROL	R4
	DEC	(SP)		;MORE SHIFTS
2$:	BNE	4$		;IF SO, B+C
	TST	(SP)+	;OTHERWISE, QUIT
	TST	(SP)+

	.IF	NDF,CTREL$
	JMP	ENDATC		;GO RELEASE INPUT BUFFER AND RETURN
	.ENDC

	.IF	DF,CTREL$
	R		;POP STACK
	.ENDC

5$:	ADD	R3,R1		;KEEP SUMMING
	ADC	R0

	.IF	DF,AUTOG$
	ADD	R4,R0		;ADD MSH
	.ENDC
	DEC	CNTR2(R5)	;STS	PC
	.ENDC

3$:	JSR	PC,GETBUF	;GET ANOTHER OUTPUT BUFR
	BCS	4$		;IF NO AVAILABLE BUFFERS, QUIT
	RTS	PC

	;ROUTINE TO OUHOULD MORE BE SUMMED
	BNE	NEXTIN		;IF SO , B+C
	MOV	R2,INADDR	;SAVE CURRENT ADDRESS OF INPUT BUFFER
	MOV	DN(R5),R3	;GET NO. ITPUT A BLOCK OF PEAK DATA.

OUTPUT:	MOV	DN(R5),R2	;CORRECT AREA BY 1/2 SAMPLE RATE *
	ASR	R2		;                LEADING MIN VA	#-1,(R2)+	;STORE RATE CHNGE INDICATOR
	DEC	(R0)		;DEC OUT BUF WD CNT
	$SOB	R3,1$		;DOUBLE OUTPUT
	MOV	R2,-(R0)	;STORE CURRENSULTS IN R0 AND R1


MULUNS:	.ENABL	LSB
	MOV	R3,-(SP)	;SAVE REGS 2 AND 3
	MOV	R2,-(SP)
	MOV	#100000,R3	;R3 CONTAINS COMPLET BUFFER POINTER
	RTS	PC

	;ROUTINE TO OUTPUT LAST BUFFER

ENDATB:	MOV	OUTADR,R0	;GET ADDR OF ADDR OF OUTPUTBUFR
ENDATA:	MTION FLAG
	CLR	R2		;R2 WILL CONTAIN HIGH ORDER PRODUCT
1$:	ROR	R1		;C = MULTIPLIER BIT
	BCC	2$		;BR IF ZERO MULTIPLIER BIT
	OV	+2(R0),R1	;GET BUFFER WORD CNT
	.ENABL	LSB
	BNE	1$		;IF USED, SOMETHING IS IN IT
	COM	(R0)		;OTHERWISE, SET PHONY BUFR ADDADD	R0,R2		;BIT MULTIPLY
2$:	ROR	R2		;SHIFT HIGH ORDER
	ROR	R3		;THE LOW ORDER & COMPLETION FLAG
	BCC	1$		;BR IF MULTIPLICATIR(-1)
	BR	2$
1$:	SUB	BASIZ,R1	;GET NEG COUNT OF BUFR ELEMENTS
	ASL	R1		;GET NEG BYTE COUNT
	ADD	R1,(R0)+	;RESET BUFR ADDR TOON IS NOT COMPLETE
	MOV	R2,R0		;LEAVE RESULT IN R0 & R1
	MOV	R3,R1
	MOV	(SP)+,R2	;RESTORE REGISTERS
	MOV	(SP)+,R3	
	RTS	PC START OF BUFR
	ASR	R1		;GET NEG COUNT OF BUFR ELEMENTS
	NEG	R1		;GET POS COUNT OF BUFR ELEMENTS
	MOV	R1,(R0)		;STORE FOR LBI


NDFLG:	.BYTE 0			;END FLAG, SET IF INPUT BUFR IS A LAST BF
SIGN:	.BYTE 0			;USED TO DETERMINE SIGN OF SLOPE
INADDR: .WORD
2$:	JSR	PC,CTOBUF	;PASS BUFFER
	CLRB	FIRSTM(R5)	;INDICATE IN INITIAL STATE

	.IF	NDF,CTREL$
ENDATC:	ROR	-(SP)		;SAVE CARRY 0			;CONTAINS POINTER IN CURRENT INPUT BUFFER
				;TO NEXT INPUT DATUM
INCNT:	.WORD 0			;CONTAINS COUNT OF DATA LEFT IN IN BU
	MOV	SINADR,R0	;GET INPUT BUFFER ADDRESS
	JSR	PC,BAREL	;RELEASE IT
	ROL	(SP)+		;RESTORE CARRY
	.ENDC

	RTS	PC		;RETURN
 FFER
OUTADR:	.WORD 0			;CONTAINS ADDRESS OF ADDRESS OF OUTPUT
				;BUFFER POINTER
	.IF 	NDF,CTREL$
SINADR:	.WORD 0			;ADDRES       
	;ROUTINE TO DIVIDE R0, R1 BY R2, R3 WITH RESULT IN R0,R1

DDIVD:	MOV	R5,-(SP)	;SAVE R5
	MOV	#32.,-(SP)	;GET LOOP COS TO SAVE INPUT BUFFER ADDRESS
	.ENDC

	.END
                                                                               UNT
	CLR	R4		;READY REMAINDER(R4+R5)
	CLR	R5
	.ENABL	LSB
1$:	ROL	R1
	ROL	R0		;EXPOSE NEW BIT OF NEWMERATOR
	ROL	R4
	ROL	R                                                                                                                                5
	CMP	R2,R5		;DOES DENOMINATOR FIT
	BHI	3$		;IF NOT, B+C(CARRY = 0)
	BLT	2$		;IF SO, B+C
	CMP	R3,R4		;IF HIGH EQUAL, CHECK .TITLE SWEEP SAMPLING MODULE
;LAB APPLICATION-11
;DEC-11-SLABA-C-LA
;FILE SWEEP.MAC
;FILE ID SWEEP.5
.CSECT	SWEEP

;COPYRLOW PARTS
	BHI	3$		;BRANCH IF DENOM. TOO BIG(C=0)
2$:	SUB	R3,R4		;SUB DENOM FROM REMAINDER
	SBC	R5
	SUB	R2,R5
	SEC			;INDECIGHT (C) 1975
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A
OUBLE PRECISION
	JSR	PC,GETBUF	;GET OUTPUT BUFFER
	.ENABL	LSB
	BCC	1$		;IF ALL'S WELL, B+C
	TST	(SP)+		;OTHERWISE, QUIT
	RTATE NEW QUOTIENT BIT
3$:	DEC	(SP)		;CHECK LOOP COUNT
	BGE	1$		;IF MORE TO COME B+C
	TST	(SP)+		;UP SP
	MOV	(SP)+,R5	;RESTORES	PC
1$:	TST	(R0)		;IS THERE ROOM IN OUTBUFR
	BNE	2$		;IF SO, B+C
	JSR	PC,PASBUF	;IF NOT, PASS OLD, GET NEW OUT BUFR
2$:	MOV R5
	RTS	PC		;RESULT IN R3,R2


	;UNSIGNED SINGLE PRECISION MULTIPLY
	;MULTIPLIES THE CONTENTS OF R0 BY R1 AND STORES
	;REN NOT HAVE BOTH DISPLAYS DEFINED.
.ENDC
.IF DF	SS$1
.IF NDF	GT40$ & VR14$
ERROR=XXXX		;IF SS$1 DEFINED, A DISPLAY MUST BE DEE ON.
   THE GT40 DISPLAY IS ALWAYS TURNED OFF ON EXIT.
4. A TELETYPE MODULE IS NEEDED.  UNLESS DISPLAY TYPE
   (SSDTYP) =-1 ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER CFINED
.ENDC
.ENDC

.SBTTL	VALUE DEFINITIONS & MACROS

.MCALL	.REGDEF,$ADDEF,$QADEF,$SOB,$SPL
.REGDEF
$ADDEF
$QADEF
HLTOPIES
;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE =0
TTYBUF=177562	;TTY INPUT BUFR
B5=40
B6=100
B7=200
B8=400
B14=40000
B15=100000
PR6=300

.SBTTL	GLOBAL DEFINITIONS
WHO AGREES
;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE
;SHALL AT ALL TIMES REMAIN IN DEC.

;THE INFORMAT
.GLOBL	SSAMP,QA,QAERR,QADATF,QAANS,MULT,DIVR
.IF DF	SS$1
.IF DF	VR14$
.GLOBL	DISPLY,DIRCMD,DILCMD,DIICMD,DIDCMD,DISET
.ENDCION IN THIS DOCUMENT IS SUBJECT TO CHANGE
;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
;COMMITMENT BY DIGITAL EQUIPMENT CO
.IF DF	GT40$
.GLOBL	GTDISP,GTRCMD,GTLCMD,GTICMD,GTDCMD,GTSET
.GLOBL	GTRCAL,SSSCAL,SSMAXV
.ENDC
.GLOBL	SSDTYB,SSDTAB
.ENDCRPORATION.

;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY 
.IIF DF	SS$2	.GLOBL	SSXWAT
.SBTTL	DISCRIPTION
	.REPT	0
SSAMP IS A SUBROUTINE TO DO THE FOLLOWING

1. SAMPLE 1-64 CHANNELDEC.

;LDP SOFTWARE DEVELOPMENT,	MAY 1975
;	CARL RALSTON
.SBTTL	CONDITIONAL ASSEMBLY PARAMETERS

;SS$1			SHOW DISPLAY IF S, OR 1 DMA CHANNELS
2. ADD DATA IF MORE THAN ONE SWEEP TO A S.P. OR D.P. BUFR.
3. DISPLAY DATA WHILE SAMPLING
4. START CLOCKDEFINED
;FOR NO PRE-AMPS ON A/D
;SS$2			IF NDF THE MUX IS CHANGED AT THE
			;SAME TIME THE A/D IS STARTED.
			;IF DF, THD MU OFF OF SCHMITT 1 AND SAMPLE
   CHANNELS VIA CLOCK TIMING.  CLOCK FIRES A/D.
5. ALLOW A NEGATIVE DELAY(COLLECT DATA PRIOR TO SX IS CHANGED THEN A USER DELAY
			;SUBR IS CALLED, ON RETURN THE A/D IS STARTED.
;SS$3			DF IF MUTI CHANNEL CAPABILITY DESIREDYNC PULSE)
   DMA CAN'T BE USED WHEN A NEGITIVE DELAY IS REQUESTED.

   TO CALL THE ROUTINE THE USER MUST DO THE FOLLOWING.

;SS$4			DF IF FAST SAMPLING DESIRED
;SS$5			DF IF LED READOUT DESIRED
;GT40$			GT40 IF DF
;SS$INT			SAMPLING PRIORITY FOR F1. THE VECTOR AND STATUS REGISTER ADDRESSES ARE DETERMINED IN LABMAC
   BY DEFINING ADVEC$ AND ADSR$ EQUAL TO THE ADDRESSES RESAST SAMPLE MODE
			;SSDTYP=-1, SET SS$INT = 4, 5, OR 6
			;IF NDF, THE DEFAULT PRIORITY IS 4
;VR14$			IF DF, THE SCOPE IS VR1P.
   THE DEFAULT IS 340 AND 170400.
2. IF A DISPLAY IS TO BE USED, DEFINE THE ENTRY IN THE DISPLAY
   TABLE, Y BUFR ADDR=DIS4.
;AR11$			IF DF, SYSTEM HAS AR11 RATHER THAN LPS
;LPS11$			IF DF, SYSTEM HAS LPS

.SBTTL	CONDITIONAL CHECKS
.IF DF AR11$ YBU, TO SSDTYB,  SET SSDTAB TO THE
   DISPLAY TABLES FIRST VALUE AND SET BOTH GLOBAL
3. INCLUDE THE MULTIPLY AND DIVIDE ROUTIN& SS$5
NOLEDS		;AR11 HAS NO LEDS
.ENDC
.IIF NDF SS$INT,SS$INT=4 ;DEFAULT TO PRIORITY 4
.IF DF	GT40$ & VR14$
ERROR=XXXX		;CAE FROM THE
   GENERAL SUBROUTINE MODULE
   FOR A GT40 DISPLAY , IF SSAMP IS CALLED WITH F TYPE
   DISPLAY, THE DISPLAY MUST B

   A PARTIAL DISPLAY IS A GRAPH PLOT DISPLAY AND DOES
   NOT COVER THE WHOLE SCREEN.  IN THIS DISPLAY, THE
   INCREASE AND FR(DPFLG)
9.  SSCHN	(BYTE) THE FIRST CHANNEL TO SAMPLE FROM, 0
		IS CHANNNEL 0.(FSTCHN)
10. SSNOFC	(BYTE) IS THE # OF CHANNELDECREASE COMMANDS DO NOT WORD.  THE SUM
   BUFR OF THE A/D IS UPDATED ON THE FLY, THE CURRENT
   BUFR FOR DMA IS UPDATED ON THS -1 TO SAMPLE.(NOFC)
11. SSCOUT	IS THE # OF POINTS SAMPLED PER CHANNEL.(NPTS)
12. SSNOFS	IS THE # OF SWEEPS.(NSWPS)
FOR GRAPE FLY, BUT THE SUM
   BUFR FOR DMA IS UPDATED AT THE END OF THE SWEEP

   IF A GT40 DISPLAY IS USED THE FOLLOWING VARIABLES
H PLOT MODE THE NEXT 2 INPUTS ARE NEEDED
FOR MODES N AND F THEY ARE NOT NEEDED
13. SSGRAB	DISPLAY BUFR FOR GRAPH PLOT ON GT-40   MUST BE DEFINED AND SET GLOBAL.
   SSACAL	ADDRESS OF THE SCALE FACTOR IN THE DISPLAY
		ID. TABLE
   SSMAXV	ADDRESS OF THE ,ADDRESS OF BUFR
14. SSGRAS	SIZE OF DISPLAY BUFR FOR GRAPH PLOT

7.  SET THE DISPLAY TYPE IN THE
    DISPLAY TABLE TO DOUBLEIS USED.  IF THE MODULE IS ASSEMBLED WITH
   NO DISPLAY, DISPLAY TYPE -1 OR 0 CAN BE USED
   DISPLAY TYPE = -1 CAN SAMPLE AT AMAXIMUM Y SIZE OF THE SCOPE 1377=GT40,
		1777=GT44, 7777=VR14

   IF A VR14 IS USED THE DISPLAY IS THE ONE PRODUCED
   BY TH FASTER RATE
5. LOAD THE A/D SAMPLER TABLE AS SHOWN BELOW.
6. CALL SSAMP
	MOV	#PARTBL,R5
	JSR 	PC,SSAMP
	CARRY BIT SET IF EE VR14 DISPLAY MODULE, AND SHOWN THE DATA
   COMMING IN ON THE FLY.  THE DMA SUM BUFR
   IS UPDATED AT THE END OF THE SWEEP.
RROR

CHARACTERISTICS OF A/D TABLE
 A TABLE OF DISPLAY COMMANDS TO CONTROL
   THE DISPLAY WHILE SAMPLING ID DEFINED AS FOLLO
   SAMPLE TABLE:	INTERNAL VARIABLES IN ()
1.  SSBUFA	ADDRESS OF FIRST SUM BUFR OR BUFRS.
		THE SUM BUFRS ARE CONTIGUOUS(BUFAWS.  THE TABLE IS A
   CHARACTER PER BYTE ENDED BY 0, AND HAS THE VALUES AS FOLLOWS.

   CMDS:	.BYTE	'S,'X,'R,'L,'I,'D,C,0
DR)
2.  SSBTMP	IS THE ADDRESS OF THE TEMP BUFR FOR
		DMA ONLY. CAN = SSBUFA FOR ONE SWEEP & BOTH S.P.
		ALSO A REQUIRED TEMP 
   THE FIRST CHARACTER IS TO START THE SAMPLING, THE SECOND TO EXIT,
	THE ROUTINE BACK TO THE USER, THE NEXT 4 WILL
   SCALE BUFR WHEN NEGATIVE
		DELAY IS REQUESTED.(TMPBUF)
3.  SSDTYP	(BYTE) DISPLAY TYPE FOR VR14 AND GT40
		SET=0 FOR FULL DISPLAY
	UP,SCALE DOWN, INCREASE AND DECREASE THE NUMBER
   OF POINTS DISPLAYED RESPECTIVELY.
	A NUMBER IS INPUT TO DISPLAY DIFFERENT C	   =1 FOR GRAPH PLOT DISPLAY, GT40 ONLY
		   =-1 FOR NO DISPLAY AND FAST SAMPLE MODE
		IN THE MODE TERMINAL IS LOCKED OUT.
	HANNELS.
	1 FOR THE FIRST CHANNEL, 2 FOR SECOND, ETC.
   TYPYING A C WILL VIEW THE CURRENT SWEEP FOR DMA SAMPLING.
   IF A GT	S AND X ARE NOT ECHOED(DISTYP)
4.  SSRATE	(BYTE) THE CLOCK BASE FREQUENCY
5.  SSCLK	CLOCK COUNTER VALUE.
6.  SSDELY	THE NUMB40 DISPLAY IS USED THERE IS THE POSSIBILITY
   OF 2 DISPLAYS OR NO DISPLAY
   A FULL DISPLAY WILL SHOW THE DISPLAY VIA THE
  ER OF SAMPLE PERIODS TO DELAY.
		IF NEQATIVE, CAUSES THE ABS(SSDELY) SAMPLES TO BE
		COLLECTED PRIOR TO THE SYNC PULSE.(DELY) GT40 DISPLAY MODULE.  THIS DISPLAY IS UPDATED 10
   TIMES A SWEEP, THE DMA BUFRS WILL BE UPDATED AT
   THE END OF THE SWEEP.
7.  SSCHTY	(BYTE) IS THE CHANNEL TYPE 0 FOR REGULAR,
		1 FOR DMA(DMAFLG)
8.  SSDOUP	(BYTE) SET 0 FOR S.P. BUFR, 1 FOR D.P. BU
TMPBUF		ADDR OF DMA OR NEG DELAY BUFR
NOFC		(# OF CHAN)-1
NPTS		# OF PTS PER SWEEP
NSWPS		# OF SWEEPS
DELY		# OF SAMPLE PE
SSDOUP	=13		;=0 FOR S.P., =1 FOR D.P. BUFRS.
SSCHN	=14		;FIRST CHANNEL TO SAMPLE FROM.
SSNOFC	=15		;# OF CHANNELS -1
SSCOUT	RIODS TO DELY(+ OR -)
DISINC		FULL DISPLAY UPDATE INCREMENT
DISCTR		DISPLAY COUNTER
DISDLT		"	TABLE DELTA
DISCT		"	BUFR SIZE=16		;PTS PER SWEEP COUNTER.
SSNOFS	=20		;NUMBER OF SWEEPS
.SBTTL SSAMP	ENTRY TO SWEEP SAMPLING ROUTINE
	;MOV	#PARTBL,R5
	;
DISBUF		"	BUFR ADDR
DISTYP		FULL=0,-1 NONE, 1 POINT PLOT
BUFPTR		RELATIVE PTR INTO SUM BUFR
BUFCTR		# OF POINTS COUNTER
TMJSR 	PC,SSAMP
	;CARRY SET IF ERROR, R0 WILL CONTAIN ERROR #

SSAMP:	CLR	R3		;USED FOR ERROR RETURN
	MOV	R5,R4		;USE R4 AS TAPPTR		RELATIVE POSITION IN TEMP BUFR
TMPCTR		# OF POINTS CTR
TMPSIZ		TEMP SUB BUFR SIZE IN BYTES
NOFCTR		NOFC TEMP CTR
TOTBSBLE POINTER
	CLR	(PC)+		;INITIALIZE VALUES.
DMAFLG:	.BYTE	0		;=1 FOR DMA, ELSE 0
DONFLG:	.BYTE	0		;SAMPLING DONE FLAG.
	CLR	Z		TOTAL BUFR SIZE IN WORDS
BUFADR		START OF SUM BUFR
DELCTR		DELY TEMP CTR
SAVVEC		A/D INTERRUPT ROUTINE ADDR
DELYP		ABS(DE(PC)+
DPFLG:	.BYTE	0		;=0 FOR S.P. BUFR, 1 FOR D.P.
AVGFLG:	.BYTE	0		;=0 WHEN NOT AVG. =1 WHEN AVERAGING.
	MOV	SSCOUT(R4),R5	LY) WHEN NEG , ELSE 0
	.ENDR
.SBTTL	RUN TIME VALUES
SSAML:	SCSP-INTOFF-2		;RELATIVE ADDRESSES OF INTERRUPT ROUTINES
	SCDP-I;R5 = # OF PTS PER SWEEP
	.ENABL	LSB
	.SBTTL	IF ABS(SSDELY) .GE. SSCOUT GIVE ERROR!
	CLR	R2		;START DELYP AT 0
	MOV	SSDELY(RNTOFF-2		;SINGLE CHAN D.P.
	MCSPDP-INTOFF-2		;MULTI CHAN S.P. & D.P.
	SSWPD-INTOFF-2		;DMA INTERRUPT ADDRESS
	SCNSP-INTOFF-2	4),R0
	BPL	2$		;ONLY WHEN NEG
	NEG	R0		;NOW POSITIVE
	MOV	R0,R2
	CMP	R0,R5		;IS DELAY .GE. PTS PER SWEEP
	BHIS	ERR0		;YES,  OR SINGLE
    WORD, DEPENDING ON THE BUFR TYPE
	REGISTERS
	THIS ROUTINE WILL DESTROY ALL REGISTERS
	ERROR MESSAGES ARE IN R	;SINGLE CHAN N MODE S.P.
	SCNDP-INTOFF-2		;		D.P.
	MCNSP-INTOFF-2		;MULTI CHAN N MODE S.P.
	MCNDP-INTOFF-2		;		D.P.
TMPSAM:0
	R0=0 DELAY ERROR
	R0=1 CLOCK RATE ERROR
	R0=2 BUFR TYPE ERROR
	R0=3 DISPLAY BUFR OVERFLOW

8. THE ROUTINE WILL RETURN T	SCSPD-TMPOFF-2		;SINGLE CHAN DURING NEG DELAY
	SCNSP-TMPOFF-2		;		N MODE
	MCSPD-TMPOFF-2		;MULTI CHAN
	MCNSPD-TMPOFF-2
	.IFO THE USER WHEN THE TOTAL SAMPLING
IS DONE.
	.ENDR
.SBTTL	INTERNAL VARIABLE LIST
	.REPT	0
DMAFLG	BYTE	1 IF DMA, ELSE 0
DON DF	SS$5
LEDCTR:	.BYTE	0,0,0,0,0,0	;LED COUNTERS
	.ENDC
CMDS:	.BYTE	7,1,'S,'X,'R,'L,'I,'D,'C,0

.SBTTL	EXTERNAL INPUT VALUEFLG	BYTE	SAMPLING DONE FLAG
DPFLG	BYTE	0 FOR S.P., 1 FOR D.P.
AVGFLG	BYTE	0 WHEN NOT AVG. 1 WHEN AVERAGING
TMP2		TEMP FOR FASS.
	;THIS TABLE REPRESENTS THE USER'S TABLE THAT MUST
	;BE SET BEFORE CALLING THE ROUTINE
SSBUFA	=0		;ADDRESS OF FIRST BUFR OT SAMPLING
TMP3		"
BPTINC		BUFR PTR INCREMENT, 2 FOR SP, 4 FOR DP
BUFSKP		2*ABS(DELY)[*2 IF DP],  ELSE 0
BUFSTP		BUFR STEP FF BUFRS.
SSBTMP	=2		;TEMPORARY BUFR ADDR.
SSDTYP	=4		;DISPLAY TYPE
SSRATE	=5		;BASE CLOCK FREQUENCY
SSCLK	=6		;NUMBER OF CLOOR MULTI CHAN
BUFSIZ		SUB BUFR SIZE
CLKRAT		VALUE TO LOAD CLK STATUS REG. RATE
ADSAV		A/D STATUS VALUE TO RUN(1ST CHAN+B6+B5)CK TICKS FOR EACH SAMPLE PERIOD
SSDELY	=10		;NUMBER OF SAMPLE PERIODS TO DELAY
SSCHTY	=12		;CHANNEL TYPE 0=REG CHANNEL, 1=DMA
4$:	.IIF DF LPS11$ CMP #16.,SSNOFS(R4)
	.IIF DF AR11$  CMP #64.,SSNOFS(R4)
	BLO	ERR2
6$:	MOV	R5,(PC)+	;SAVE SUB BUFR SIZE IN ADDR OF A/D
	ADD	@R1,R0		;INTERRUPT ROUTINE
	MOV	R0,(PC)+
SAVVEC:	0
	MOV	#PR6,@#ADVEC+2	;PRIORITY 6
	MOV	#PR6,@#CLKVEC+2
 BYTES
BUFSIZ:	0
	.IF DF SS$3
	ADD	R5,R0		;BUMP STEP BY BUFSIZ
	MOV	R0,BUFSTP	;BUFR STEP TO NEXT SUM SUB BUFR
	.ENDC
	MOV		;GET REST OF VARIABLES FROM THE INPUT TABLE.
	MOV	(R4)+,BUFADR
	MOV	(R4)+,(PC)+	;DMA OR NEG DELAY TEMP BUF
TMPBUF:	0
	MOVB	R2,(PC)+	;BYTES TO SKIP AT BEGINNING OF
BUFSKP:	0			;SUM BUFR DUE TO NEG DELAY
	.SBTTL	IF BOTH DMA & NEG DELAY GIVE ERROR!
	T(R4)+,(PC)+	;GET DISPLAY TYPE
DISTYP:	0			;=0 FULL DISPLAY, -1 NO DISPLAY
				;=1 GRAPH PLOT DISPLAY
	;DETERMINE CLOCK VALUESSTB	SSCHTY(R4)	;IS DMA USED?
	BEQ	8$
	TST	SSDELY(R4)	;YES, CHECK NEG DELAY?
	BGE	8$		;NO, SO NO ERROR
ERR3:	INC	R3		;BOTH DM
	MOVB	(R4)+,R0	;GET CLK FREQUENCY
	BLE	ERR1		;RATE OF 0 WON'T WORK
	ASL	R0		;PROPER BITS FOR CLK
	MOV	R0,(PC)+	;CLOCK RATEA & NEG DELAY REGUESTED
ERR2:	INC	R3		;BUFR ERROR
ERR1:	INC	R3		;CLOCK ERROR
ERR0:	MOV	R3,R0		;DELAY ERROR
	SEC			;INDICATE 
CLKRAT:	0
	MOV	(R4)+,@#CLKBUF	;LOAD BUFR/PRESET REG.
	NEG	@#CLKBUF
	MOV	(R4)+,(PC)+	;DELAY COUNT
DELY:	0
.SBTTL	DETERMINE ERROR
	RTS	PC

	;CALCULATE TOTAL SIZE OF ALL BUFRS.
8$:	MOVB	SSNOFC(R4),R0	;MULTIPLY # OF BUFR TIMES
	INC	R0		;THEIR SIZE
INTERRUPT SERVICE ROUTINE FOR NEG DELAY
	BPL	NONEG
	CMP	TMPBUF,BUFADR	;CAN'T BE THE SAME
	BEQ	ERR2
	CLR	R0
	TSTB	3(R4)		;MU	ASR	R5		;SET BUFSIZ TO WORDS
	JSR	PC,@#MULT
	MOV	R5,TOTBSZ	;TOTAL BUFR SIZE IN WORDS
	.DSABL LSB
	.SBTTL	DETERMINE A/D STALTI CHANNEL?
	BEQ	2$
	CMP	(R0)+,(R0)+	;YES, ADD 4
2$:	TSTB	DISTYP		;NEG IF N MODE
	BPL	4$
	TST	(R0)+		;N MODE SO ADD 2
4$:TUS & ROUTINE TO USE
	MOVB	SSCHN(R4),R0	;SET 1ST CHANNEL TO START FROM.
	SWAB	R0
	ADD	#B6+B5,R0	;CLOCK STARTS A/D.
	MOV	R0,(	MOV	PC,R1		;ADDR OF TEMP SERVICE
	ADD	#TMPSAM-4$-2,R1	;ROUTINE TABLE
	ADD	R0,R1		;OFFSET INTO TBL
TMPOFF:	MOV	PC,R0
	ADD	@RPC)+	;A/D STATUS VALUE TO RUN
ADSAV:	0
	CLR	R0		;USED TO DETERMINE ADDR OF INTERRUPT
	TSTB	SSDOUP(R4)	;TEST BUFR TYPE
	BEQ	21,R0
	MOV	R0,(PC)+	;INTR ROUTINE TO USE DURING NEG DELAY
TMPVEC:	0
NONEG:	ADD	#3,R4		;SKIP SOME VALUES
	MOVB	(R4)+,(PC)+	;# $
	INCB	DPFLG
	TST	(R0)+		;ADD 2
2$:	TSTB	SSNOFC(R4)	;TEST FOR MULTI CHANNEL
	BEQ	4$
	MOV	#4,R0
4$:	TSTB	SSCHTY(R4)	;TEST OF CHAN -1
NOFC:	0
	MOV	@R4,(PC)+	;POINTS PER SWEEP
NPTS:	0
	MOV	(R4)+,TMPSIZ
	ASL	(PC)+		;TMP SUB BUFR SIZE IN BYTES
TMPSERROR
2$:	MOV	R2,DELYP	;ABS(DELY) WHEN NEG, ELSE 0
	ASL	R2		;(# OF PTS TO SKIP)*2
	ASL	R5		;(# OF PTS)*2
	MOV	#2,(PC)+	;SETUFOR DMA
	BEQ	6$
	INCB	DMAFLG
	MOV	#6,R0
	BR	8$
6$:	.IF DF	SS$4
	TSTB	SSDTYP(R4)	;TEST FOR NO DISPLAY
	BPL	8$
	ADD	#10,R0P BUFR VALUES
BPTINC:	0			;=2 FOR S.P., 4 FOR D.P.
	MOV	#-2,R0		;BUFR STEP
	TSTB	SSDOUP(R4)	;IS BUFR D.P.?
	BEQ	4$
	ASL	BPT		;CALCULATE NO DISPLAY
	TSTB	SSNOFC(R4)	;TEST FOR MULTI CHARACTERS
	BEQ	8$
	TSTB	DPFLG		;INTERRUPT ROUTINE ADDR.
	BEQ	8$
	INC		;YES, MULT SOME VALUES BY 2
	ASL	R0
	ASL	R2
	ASL	R5
	BR	6$
	.SBTTL	IF SSNOFC .GT. 16(64 AR11) AND NOT D.P. GIVE ERRORTST	(R0)+		;ADD 2
	.ENDC
8$:	MOV	PC,R1		;GET ADDR OF A/D
	ADD	#SSAML-8$-2,R1	;ADDR TABLE
	ADD	R0,R1
INTOFF:	MOV	PC,R0		;GETIZ:	0
	MOV	(R4)+,(PC)+	;# OF SWEEPS
NSWPS:	0
	.IF DF	GT40$ & SS$1
	.SBTTL	SETUP INITIAL VT11 DISPLAY BUFR
	MOV	NPTS,R5		;CASAVE THE BUFR START ADDR.
DISBUF:	0
	MOV	R2,R3		;SAVE ADDR.
	ASL	R0
	ADD	R0,R2		;END ADDR +2 OF DISPLAY BUFR.
	MOV	#DRET,(RLCULATE UPDATE PERIOD
	MOV	#10.,R0		;FOR F TYPE DISPLAYS
	JSR	PC,@#DIVR
	MOV	R0,(PC)+	;FULL DISPLAY UPDATE INCREMENT
DISINC:2)+	;STORE A SUBR RTN.
	CLR	@R2
	MOV	BUFADR,@#SSDTYB	;STORE BUFR TO DISPLAY
	ASR	R0
4$:	CLR	(R3)+		;CLEAR DISPLAY BUFR
	$SO	0
	MOV	R0,(PC)+	;INITIALIZE FOR DISPLAY COUNTER
DISCTR:	0
	TSTB	DISTYP		;TEST FOR GRAPH PLOT
	BEQ	STSAM2
	BMI	2$		;N DISPLB	R0,4$
	MOV	R5,R0
	.INSRT
	.START			;START DISPLAY
	.ENDC
.SBTTL STSAM	START SAMPLING
STSAM:	.IF DF	SS$4
	CLR	TMP3
	TSAY MODE
	MOV	(R4)+,R5	;DISPLAY ADDR
	MOV	@R4,R0		;DISPLAY BUF SIZE
2$:	.STOP			;STOP THE GT-40 FOR N OR P
	TSTB	DISTYP
	BMITB	DISTYP		;TEST FOR N MODE
	BPL	STSAM2
	$SPL	SS$INT		;SHUT OUT INTERRUPTS
	.ENDC
STSAM2:	JSR	PC,ZBUF		;ZERO BUFRS.
	JSR	PC	STSAM
	CMP	R0,#10.		;DISPLAY BUF. MUST BE AT LEAST 10.
	BHI	NER4
ERR4:	MOV	#4,R0		;DISPLAY BUFR NOT BIG ENOUGH
	SEC
	RTS	P,STSWP	;SET UP TO START SAMPLING
	.IF DF	SS$4
	TSTB	DISTYP		;TEST FOR NO DISPLAY
	BPL	STSAM8
ST4:	TSTB	DONFLG		;TEST IF DONEC

NER4:	MOV	#1,R1		;SET DISPLAY DELTA
	MOV	#1,R2		;SET DATA BUF. DELTA
	MOV	NPTS,R4		;CAL DISPLAY BUF THE SMALLER
	SUB	#7,.
	BNE	STSM12		;YES
	MOV	@#TTYBUF,(PC)+	;READ TTY INPUT
TMP2:	0
	BIC	#200,TMP2	;CLEAR PARITY BIT
	CMP	TMP2,(PC)+	;TST IF VAR0		;OF 1024, BUFR, OR
	CMP	R4,R0		;DISPLAY BUFR
	BHI	4$
	MOV	R4,R0
4$:	CMP	#1024.,R0
	BHI	6$
	MOV	#1024.,R0
6$:	CMP	R0,#LUE CHANGED
TMP3:	0
	BEQ	ST4		;NO
	MOV	TMP2,TMP3	;YES,SAVE NEW VALUE
	CMP	#'S,TMP3	;TEST FOR S
	BEQ	CD2
	CMP	#'X,TMP3	;TES1024.	;TEST IF DATA TO DISPLAY GREATER
	BHI	10$		;THAN GT-40 ABILILY
	MOV	R0,R3		;NO, CALCULATE THE DISPLAY LESS THAN
8$:	ASLT FOR X
	BNE	ST4
	BR	CD6
	.ENDC

STSAM8:	JSR	R5,QA
	QADWA+QANQ
STSM10:	TSTB	DONFLG		;TEST IF SWEEP DONE
	.IF DF	SS$1
	B	R3
	CMP	R3,#1024.	;TEST TO DOUBLE DELTA
	BHI	10$
	ASL	R1
	BIT	#100,R1		;TEST FOR MAX DISPLAY DELTA
	BEQ	8$
	DEC	R1		;SET EQ	SETDIS
	.IFF
	BEQ	CD
	.ENDC
STSM12:			;SWEEP DONE RETURN TO USER.
	.IF DF	GT40$ & SS$1
	.STOP
	TSTB	DISTYP		;TEST TO STO MAX DISPLAY DELTA
10$:	CMP	R4,R0
	BLOS	14$
	MOV	R4,R3
12$:	ASL	R2
	ASR	R3
	CMP	R3,R0
	BHI	12$
	MOV	R3,R0
				;CALCULTOP DISPLAY
	BEQ	2$
	.ENDC
	.IF DF	SS$4
	TSTB	DISTYP		;TEST FOR NO DISP.
	BPL	2$
	MOV	@#TTYBUF,R0	;CLEAR TTY BUF.
	$SPL	0ATE THE DATA BUFR DELTA
				;SAVE THE DISPLAY BUFR SIZE
14$:	MOV	R2,(PC)+	;SAVE DATA BUFR DELTA
DISDLT:	0
	MOV	R5,R2		;BUILD		;RESET THE STATUS
	.ENDC
2$:	CLC			;NO ERRORS
	RTS	PC		;ALL DONE RETURN TO CALLER

	.IF DF SS$1
SETDIS:	.IIF DF	VR14$	JS THE DISPLAY BUFR
	ADD	#174100,R1
	MOV	#POINT,(R2)+	;SET POINT MODE
	CLR	(R2)+
	CLR	(R2)+
	MOV	R1,(R2)+	;STORE THE GRAPH DER PC,@#DISPLY	;SET DISPLAY
	.IF DF	GT40$
	.SBTTL	UPDATE VT11 DISPLAY BUFR
	TSTB	DISTYP		;TEST FOR DISPLAY TYPE
	BMI	CD		;NO LTA MODE WORD
	MOV	#GRAPHY+INT6,(R2)+ ;STORE THE GRAPH MODE WORD.
	MOV	R0,(PC)+	;SAVE THE BUFR SIZE
DISCT:	0
	MOV	R2,(PC)+	;DISPLAY
	BEQ	16$		;GRAPH DISPLAY
	MOV	DISCT,R0	;GRAPH PLOT DISPLAY
	MOV	DISBUF,R1	;SCALE AND STORE DATA
	MOV	@#SSDTYB,R2	;GESTSM10
	TST	R0		;TEST FOR NON VALID COMMAND.
	BMI	20$		;NEG IF NO MATCH
	BNE	4$
CD2:	CLR	@#ADSAD		;S CMD
	CLR	@#CLKSAD
	IN.P.

SCSP:	ADD	@#ADBUF,@BUFPTR	;ADD DATA TO BUFR
	ADD	#2,(PC)+
BUFPTR:	0			;RELATIVE POSITION IN BUF
SCSP2:	DEC	(PC)+		;TESCB	AVGFLG		;START SAMPLING
	JMP	STSAM2

4$:	CMP	R0,#2
	.IF DF	SS$1
	BGE	10$
	.IFF
	BGE	STSAM8
	.ENDC
CD6:	CLR	@#CLKSAD	T IF DONE
BUFCTR:	0
	BEQ	2$
	RTI
2$:	JMP	SSWPD		;YES SET FOR NEXT SWEEP.

.SBTTL SCDP	SINGLE CHANNEL SAMPLING, D.P.

SCD;X CMD,CLR CLOCK & A/D
	CLR	@#ADSAD
	.IF DF LPS11$
	TSTB	DMAFLG		;TEST FOR DMA
	BEQ	8$
	MOV	#2,@#ADSAD	;TURN DMA OFF
	CLR	P:	MOV	R0,-(SP)
	MOV	BUFPTR,R0	;DO A D.P. ADD TO BUFR.
	ADD	@#ADBUF,(R0)+
	ADC	(R0)+
	MOV	R0,BUFPTR
	MOV	(SP)+,R0
	BR	SCSPT BUFR ADDRESS
2$:	CLR	R4		;CLEAR HIGH ORDER OF VALUE
	MOV	(R2)+,R5	;GET VALUE
	TSTB	DPFLG		;TEST FOR DOUBLE PRECISION
	BEQ	@#DMAREG
	.ENDC
8$:	JMP	STSM12		;EXIT

	.IF DF	SS$1
10$:	.IF DF	VR14$
	BNE	12$
	JSR	PC,@#DIRCMD	;R CMD, UP SCOPE
	.ENDC4$
	MOV	(R2)+,R4	;HIGH ORDER PART
4$:	MOVB	@#SSSCAL,R3	;GET SCALE FACTOR
	BMI	8$
	BEQ	10$
6$:	ASL	R5		;SCALE LEFT
	ROL	R4
	.IF DF	GT40$
	TSTB	DISTYP		;TEST FOR NO DISPLAY
	BMI	28$
	CMP	R0,#2		;TEST FOR UP SCOPE
	BNE	12$
	JSR	PC,@#GTRCMD
	.ENDC
	$SOB	R3,6$
	BR	10$
8$:	CLC			;SCALE RIGHT
	ROR	R4
	ROR	R5
	INC	R3
	BNE	8$
10$:	CMP	R5,SSMAXV	;TEST FOR A VALUE TOO LARG
	BR	28$

12$:	CMP	R0,#4
	BGE	14$
	.IIF DF	VR14$	JSR PC,@#DILCMD	;LOWER SCOPE
	.IIF DF	GT40$	JSR PC,@#GTLCMD
	BR	28$

1E FOR SCREEN
	BLO	12$
	MOV	SSMAXV,R5
12$:	MOV	R5,(R1)+	;STORE VALUE IN DISPLAY
	DEC	R0		;BUFR TEST IF DONE
	BEQ	CD
	MOV	DI4$:	BNE	16$
	.IIF DF	VR14$	JSR PC,@#DIICMD	;INCREASE # OF POINTS
	.IIF DF	GT40$	JSR PC,@#GTICMD
	BR	28$

16$:	CMP	R0,#6
	BSDLT,R4	;GET DATA BUF. DELTA
14$:	DEC	R4		;SKIP POINTS IF NECC.
	BEQ	2$
	TST	(R2)+		;SKIP POINTS
	TSTB	DPFLG		;TEST FOR D.P.GE	18$
	.IIF DF	VR14$	JSR PC,@#DIDCMD	;DECREASE # OF POINTS.
	.IIF DF	GT40$	JSR PC,@#GTDCMD
	BR	28$

18$:	BNE	20$
	.IF DF  SKIP.
	BEQ	14$
	TST	(R2)+		;ADD 2
	BR	14$
16$:	MOV	NPTS,R0		;TEST FOR REFRESH DISPLAY
	SUB	BUFCTR,R0	;TEST IF COUNTER OVERLPS11$
	TSTB	DMAFLG		;TEST FOR DMA BUFR
	BEQ	28$
	MOV	TMPBUF,@#SSDTYB
	BR	26$
	.ENDC
	.IIF DF AR11$	BR	28$

20$:	JSR	R5,FLOWED
	CMP	R0,DISCTR	;UPDATE EVERY 1/10TH OF # OF PTS
	BLE	17$
	MOVB	#1,@#GTRCAL
	ADD	DISINC,DISCTR	;BUMP FOR NEXT TIME
17QA
	QASIL+QASP		;SILENT Q, S.P. #
	TSTB	@#QAERR		;ANY ERROR?
	BNE	28$
	MOV	@#QAANS,R0	;NO, GET CHAN. #
	BEQ	28$
	DEC	R0
	$:	TSTB	@#GTRCAL	;RECALCULATE DISPLAY?
	BEQ	CD
	.STOP			;YES, TURN IT OFF.
	JSR	PC,@#GTDISP	;RESET DISPLAY
	TST	R0		;TEST FOCMP	R0,NOFC		;IS # TOO LARGE?
	BHI	28$
	MOV	BUFADR,R1	;NO, CALCULATE NEW BUFR
22$:	DEC	R0		;ADDRESS.
	BMI	24$
	ADD	BUFSIZ,RR ERROR
	BEQ	18$
	JMP	ERR4
18$:	.START			;TURN IT ON.
	.ENDC
	.ENDC
.SBTTL CD	COMMAND DECODER
	.ENABL LSB
CD:	JSR	R5,QA1
	BR	22$
24$:	MOV	R1,@#SSDTYB	;STORE IN DISPLAY TABLE
26$:	MOV	#SSDTAB,R0	;RESET DISPLAY
	.IIF DF	VR14$	JSR PC,@#DISET
	.I
	QAAO+QADWA+QAALP	;ALPHANUMERIC CMD, ANS ONLY DON'T WAIT
	CMDS			;S,X,R,L,I,D,C
	TSTB	@#QADATF	;TEST FOR A LINE INPUT
	BEQ	IF DF	GT40$	JSR PC,@#GTSET
28$:	JMP	STSAM8
	.IFF
20$:	BR	STSAM8
	.ENDC
	.DSABL LSB
.SBTTL SCSP	SINGLE CHANNEL SAMPLING, S$
6$:	TSTB	@#ADSAD		;WAIT FOR THE A/D CONVERSION
	BMI	2$		;TO COMPLETE.
	BR	6$

8$:	TSTB	@#ADSAD		;WAIT FOR A/D.
	BPL	8$
 CHANGE CHAN
	.IFF
	ADD	#401,@R3	;CHANGE CHANNELS, START NEXT CHAN.
	.IFTF
	ADD	@R4,(R1)+	;ADD DATA TO BUFR
	.IFT
	JSR	PC,	ADD	@#ADBUF,(R0)+	;ADD VALUE
	MOVB	DPFLG,R1	;TEST FOR D.P. BUFR
	BEQ	10$
	ADC	@R0
10$:	ADD	BPTINC,BUFPTR	;STEP BUFR POINTERSSXWAT	;GO TO USER WAIT ROUTINE
	INC	@R3
	.ENDC
	MOV	NOFC,NOFCTR	;SET # OF CHANNELS-1 TO DO.
	MOV	R1,R0		;SAVE BUF ADDR
	BR FOR NEXT  VALUE.
12$:	MOV	ADSAV,@#ADSAD	;RESET A/D CSR
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	BR	SCSP2		;EXIT.

.SBTTL MCSPD	MULTI 	6$

4$:	.IF DF	SS$2
	ADD	#400,@R3	;JUST CHANGE CHAN
	.IFF
	ADD	#401,@R3	;CHANGE CHANNELS, START NEXT CHAN.
	.IFTF
	ADD	@CHANNEL SAMPLING DURING NEG DELAY
MCSPD:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	TMPPTR,R0	;SET BUFR ADDR
	MOV	NOFC,R1		;# OF CHANNER4,(R1)+	;ADD DATA TO BUFR
	.IFT
	JSR	PC,SSXWAT	;GO TO USER WAIT ROUTINE
	INC	@R3
	.ENDC
6$:	ADD	BUFSTP,R1	;SET TO NEXT CHALS
14$:	.IF NDF SS$2
	ADD	#401,@#ADSAD	;START NEXT CHAN
	.IFF
	ADD	#400,@#ADSAD
	JSR	PC,SSXWAT
	INC	@#ADSAD
	.ENDC
	MOV	NNEL'S BUF.
	DEC	NOFCTR		;TEST IF LAST CHANNEL
	BEQ	10$
8$:	TSTB	@R3		;NO, WAIT TILL A/D DONE
	BMI	4$
	BR	8$
10$:	TSTB	@R3@#ADBUF,@R0
	ADD	TMPSIZ,R0	;SET TO NEXT BUFR
	DEC	R1		;DONE ALL CHANNELS?
	BEQ	20$
18$:	TSTB	@#ADSAD		;WAIT FOR CONVERT TO C		;LAST CHANNEL, WAIT TILL
	BPL	10$		;A/D DONE
	ADD	@R4,@R1		;ADD VALUE TO BUFR
MCNEX:	MOV	R0,R1		;RESET BUF POINTER FOR CHAN2

.SBTTL SCSPD	SINGLE CHANNEL SAMPLING, S.P. DURING NEG DELAY

SCSPD:	MOV	@#ADBUF,@TMPPTR	;DATA TO RING BUFR
	ADD	#2,(PC)+OMPLETE
	BMI	14$
	BR	18$
20$:	ADD	#2,TMPPTR	;STEP BUFR PTR FOR NEXT TIME
22$:	TSTB	@#ADSAD
	BPL	22$
	MOV	@#ADBUF,@R0	;READ
TMPPTR:	0
SCSPD2:	DEC	(PC)+		;TEST IF AT END OF RING BUFR
TMPCTR:	0
	BNE	2$
	MOV	TMPBUF,TMPPTR	;RESET PTR TO BEGINNING OF  LAST CHAN
	MOV	ADSAV,@#ADSAD	;RESET STATUUS REG.
	MOV	(SP)+,R1
	MOV	(SP)+,R0
	BR	SCSPD2		;SEE IF END OF RING BUFR
	.DSABL	BUFR
	MOV	NPTS,TMPCTR	;RESET WORDS IN BUFR CTR
2$:	RTI
	.IF DF SS$3
.SBTTL MCSPDP	MULTI CHANNEL SAMPLING (S.P. & D.P.)
	.ELSB
	.IFF
MCSPDP:MCSPD:	HLT
	.ENDC
	.IF DF	SS$4
.SBTTL SCNSP	SINGLE CHANNEL N MODE, S.P.
;	R0 TEMP
;	R1 -> BUFR POINTERNABL	LSB
MCSPDP:	MOV	R0,-(SP)
	MOV	R1,-(SP)
	MOV	BUFPTR,R0	;SET BUFR ADDRESS
	MOV	NOFC,R1		;# OF CHANNELS
2$:	.IF NDF	SS$2
;	R2 = COUNTER OF NUMBER OF PTS
;	R3 -> PTR TO A/D STATUS REG.
;	R4 -> PTR TO A/D BUFR REG.
;	R5 = VALUE TO RESTORE A/D STAT
	ADD	#401,@#ADSAD	;START NEXT CHANNEL.
	.IFF
	ADD	#400,@#ADSAD
	JSR	PC,SSXWAT	;USER WAIT ROUTINE
	INC	@#ADSAD		;START AD
	US (ADSAV)
	.ENABL	LSB
1$:	RTI			;COMMON RETURN FOR SOB
SCNSP:	ADD	@R4,(R1)+	;ADD DATA TO BUFR
2$:	$SOB	R2,1$		;TEST IF SWEE.ENDC
	.IIF DF AR11$ BIC #140,@#ADSAD ;TURN OFF CLOCK START
	ADD	@#ADBUF,(R0)+	;ADD VALUE TO BUFR.
	BITB	#1,DPFLG	;TEST FOR DP DONE
	BR	SSWPD

.SBTTL SCNDP	SINGLE CHANNEL N MODE, D.P.
SCNDP:	ADD	@R4,(R1)+	;ADD DATA LOW TO BUFR
	ADC	(R1)+		;ADD HIGH.P. BUFR
	BEQ	4$
	ADC	(R0)+		;ADD CARRY IF SO.
4$:	ADD	(PC)+,R0	;SET TO NEXT BUFR.
BUFSTP:	0
	DEC	R1		;TEST IF DONE
	BEQ	8 ORDER
	$SOB	R2,1$
	BR	SSWPD

.SBTTL MCNSP	MULTI CHANNEL N MODE, S.P.
	.IF DF	SS$3
MCNSP:	.IF DF	SS$2
	ADD	#400,@R3	;JUST BUFR
	.IFT
	JSR	PC,SSXWAT	;GO TO USER WAIT ROUTINE
	INC	@R3
	.ENDC
	MOV	NOFC,NOFCTR	;SET # OF CHANNELS-1 TO DO.
	MOV	R1,RMCNSP:MCNDP:SCNSPD:MCNSPD:	HLT
	.ENDC
	.DSABL LSB
.SBTTL SSWPD	END OF SWEEP ROUTINE FOR REGULAR CHANNELS
;CLEAR CLOCK AND A0		;SAVE BUF ADDR
	TST	(R0)+		;ADD 2
	BR	16$

14$:	.IF DF	SS$2
	ADD	#400,@R3	;JUST CHANGE CHAN
	.IFF
	ADD	#401,@R3	;CHANG/D
;TEST IF AVERAGING. NO, ZERO BUFRS.
SSWPD:	CLR	@#CLKSAD
	CLR	@#ADSAD
	MOV	R0,-(SP)
	MOV	R1,-(SP)
	.ENABL	LSB
	.IF DF	SE CHANNELS, START NEXT CHAN.
	.IFTF
	MOV	@R4,@R1		;DATA TO BUFR
	.IFT
	JSR	PC,SSXWAT	;GO TO USER WAIT ROUTINE
	INC	@R3
	.ES$5
	.SBTTL	UPDATE LEDS
	MOV	#LEDCTR,R0	;R0 -> INTERNAL LED COUNTERS
	CLR	R1
2$:	INCB	@R0		;ADD 1 TO DIGIT
	CMPB	@R0,#10.	;NDC
16$:	ADD	TMPSIZ,R1	;SET TO NEXT CHANNEL'S BUF.
	DEC	NOFCTR		;TEST IF LAST CHANNEL
	BEQ	20$
18$:	TSTB	@R3		;NO, WAIT TILLTEST IF DIGIT =10.
	BNE	4$
	CLRB	(R0)+		;NUMBER CARRY,SET DIGIT 0
	MOV	R1,@#ADBUF	;SET LED DIGIT 0
	ADD	#400,R1		;GO TO NEXT A/D DONE
	BMI	14$
	BR	18$
20$:	TSTB	@R3		;LAST CHANNEL, WAIT TILL
	BPL	20$		;A/D DONE
	MOV	@R4,@R1		;ADD VALUE TO BUFR
	M LED
	CMP	R0,#LEDCTR+5	;AND CARRY THE 1 TO NEXT DIGIT
	BNE	2$
	BR	5$		;EXIT IF COUNTER FULL
4$:	MOVB	@R0,-(SP)	;SET DIGIT INOV	R0,R1		;RESET BUF POINTER
	MOV	R5,@R3		;RESET A/D STATUS
	BR	12$
.SBTTL MCNDP	MULTI CHANNEL N MODE, D.P.

	.ENABL LSB
 LEDS
	BIC	#177400,@SP
	ADD	(SP)+,R1
	MOV	R1,@#ADBUF
5$:	.ENDC
	.IF DF	GT40$ & SS$1
	MOVB	#1,@#GTRCAL
	MOV	DISINC,DISCTR	MCNDP:	.IF DF	SS$2
	ADD	#400,@R3	;JUST CHANGE CHAN
	.IFF
	ADD	#401,@R3	;CHANGE CHANNELS, START NEXT CHAN.
	.IFTF
	ADD	@R4,(;RESET REFRESH COUNT FOR
				;TYPE DISPLAY
	.ENDC
	TSTB	AVGFLG
	BNE	8$
	JSR	PC,ZBUF
6$:	MOV	(SP)+,R1
	MOV	(SP)+,R0
7$:	JR1)+	;ADD DATA TO BUFR
	ADC	(R1)+
	.IFT
	JSR	PC,SSXWAT	;GO TO USER WAIT ROUTINE
	INC	@R3
	.ENDC
	MOV	NOFC,NOFCTR	;SET # OFSR	PC,STSWP	;START NEXT SWEEP
	RTI

8$:	.IF DF LPS11$
.SBTTL	ADD DMA BUFR TO SUM BUFR
	TSTB	DMAFLG		;TEST FOR DMA
	BEQ	14$ CHAN -1
	MOV	R1,R0		;SAVE BUFR POINTER
	BR	4$
2$:	.IF DF	SS$2
	ADD	#400,@R3	;JUST CHANGE CHAN
	.IFF
	ADD	#401,@R3	;CHANGE		;BRANCH IF NOT
	CMP	TMPBUF,BUFADR	;TEST FOR SINGLE
	BEQ	14$		;BUFR DMA
	MOV	R2,-(SP)
	MOV	TMPBUF,R0	;ADD THE CURRENT BUFR. 1
	MOV	R5,@R3		;RESET A/D STATUS
	BR	2$		;TEST END OF SWEEP DONE
	.ENDC

.SBTTL SCNSPD	SINGLE CHANNEL N MODE DURING NEG D CHANNELS, START NEXT CHAN.
	.IFTF
	ADD	@R4,(R1)+	;ADD DATA TO BUFR
	ADC	(R1)+
	.IFT
	JSR	PC,SSXWAT	;GO TO USER WAIT ROUTINELAY

SCNDPD:	MOV	@R4,(R1)+	;DATA TO TEMP BUFR
12$:	$SOB	R2,1$		;TEST IF END OF RING BUFR
	MOV	TMPBUF,R1	;RESET OF BEGINING E
	INC	@R3
	.ENDC
4$:	ADD	BUFSTP,R1	;SET TO NEXT CHANNEL'S BUF.
	DEC	(PC)+		;TEST IF LAST CHANNEL
NOFCTR:	0			;TEMP # OF CHOF BUFR
	MOV	NPTS,R2		;RESET # OF PTS
	RTI

.SBTTL MCNSPD	MULTI CHANNEL N MODE DURING NEG DELAY
	.IF DF	SS$3
MCNSPD:	.IF DAN COUNTER
	BEQ	8$
6$:	TSTB	@R3		;NO, WAIT TILL A/D DONE
	BMI	2$
	BR	6$

8$:	TSTB	@R3		;LAST CHANNEL, WAIT TILL
	BPL	8$		F	SS$2
	ADD	#400,@R3	;JUST CHANGE CHAN
	.IFF
	ADD	#401,@R3	;CHANGE CHANNELS, START NEXT CHAN.
	.IFTF
	MOV	@R4,@R1		;DATA TO;A/D DONE
	ADD	@R4,(R1)+	;ADD VALUE TO BUFR
	ADC	@R1
	BR	MCNEX
	.IFF
MCNSP:MCNDP:MCNSPD:	HLT
	.ENDC

	.IFF
SCNSP:SCNDP:R2)+
12$:	$SOB	R1,10$
	MOV	(SP)+,R2
	.ENDC
.SBTTL	ADD NEG DELAY BUFR TO SUM BUFR
14$:	TST	DELY		;NEG DELAY?
	BPL	28$
	.II
	MOV	ADSAV,R5
	.ENDC
2$:	MOV	CLKRAT,@#CLKSAD
	TST	@#ADBUF		;CLEAR A/D FLAG
	.IF DF LPS11$
	TSTB	DMAFLG		;DMA SAMPLING USEF DF SS$3 MOV NOFC,NOFCTR ;YES,# OF CHANNELS TO DO
	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	TMPSIZ,-(SP)	;TEMP SUB BUFR SIZE ON STACKD?
	BEQ	3$
	MOV	#6,@#ADSAD	;YES,SET CURRENT ADDRESS
	MOV	TMPBUF,@#DMAREG
	MOV	#4,@#ADSAD	;SET COUNT AS NEG. VALUE
	MOV	NPTS
	MOV	BUFADR,R2	;ST ADDR OF SUM BUFR
	MOV	TMPBUF,R3	;ST ADDR OF TEMP RING BUFR
	MOV	TMPPTR,R0	;VALUE OF POINTER WHEN ST1 FIRE,@#DMAREG
	NEG	@#DMAREG
	MOV	#2,@#ADSAD	;ENABLE DMA
	MOV	#10000,@#DMAREG
	.ENDC
3$:	MOV	SAVVEC,@#ADVEC	;PROPER INTR ROUTINED
16$:	MOV	(PC)+,R1	;# OF PTS TO ADD
DELYP:	0
	SUB	R1,R0		;BACKUP DELAY WORDS
	SUB	R1,R0
	CMP	R0,R3		;IF R0 < ,THEN WENT TO
	MOV	#CLKINT,@#CLKVEC
	MOV	DELY,DELCTR	;WHAT TYPE OF DELAY? & SET CTR
	BLT	6$		;NEG DELAY
	BGT	4$		;POSITIVE DELAY
	.SBTTLO FAR
	BHIS	18$
	ADD	@SP,R0		;MOV TOWARDS END OF RING
18$:	ADD	@SP,R3		;START OF NEXT RING SUB BUFR
	MOV	R2,TMPPTR	;REMEMBER	ZERO DELAY, ST1 START
	BIS	#B14+B8,@#CLKSAD ;ENABLE ST1 INTER & MODE
	RTS	PC

	.SBTTL	POSITIVE DELAY, SETUP TO COUNT DELY C CURRENT POSITION
20$:	ADD	(R0)+,(R2)+	;DO SUM
	BITB	#1,DPFLG
	BEQ	22$
	ADC	(R2)+
22$:	CMP	R0,R3		;ARE WE BEYOND END OF RINLOCK OVERFLOWS
4$:	BIS	#B14+B8+B6,@#CLKSAD ;ENABLE ST1 INTER, OVERFLOW ENABLE
	RTS	PC

	.SBTTL	NEG DELAY, ENABLE ST1 INTR & G SUB BUFR?
	BLO	24$
	SUB	@SP,R0		;YES, RESET R0 FOR WRAP AROUND
24$:	$SOB	R1,20$		;ALL FOR THIS CHAN?
	.IF DF SS$3
	.IF DFSTART SAMPLING
6$:	MOV	ADSAV,@#ADSAD	;1ST CHAN, INTR ON CLK OVER
	MOV	TMPVEC,@#ADVEC	;SERVICE ROUTINE DURING NEG DELAY
	MOV	# SS$4
	DEC	NOFCTR
	.IFF
	DEC	(PC)+
NOFCTR:	0
	.ENDC
	BMI	26$
	MOV	TMPPTR,R2	;DETERMINE NEXT SUM SUB BUFR
	ADD	BUFSIZ,R2ST1INT,@#CLKVEC
	MOV	TMPBUF,TMPPTR	;SET PTR TO BEGINNING OF BUFR
	MOV	NPTS,TMPCTR	;RING BUFR FULL CTR
	TSTB	DISTYP
	BPL	8$

	ADD	@SP,R0		;UPDATE TO NEXT SUB BUFR
	BR	16$
	.ENDC
26$:	TST	(SP)+		;POP TMPSIZ OFF STACK
	MOV	(SP)+,R3
	MOV	(SP)+,R2
28	MOV	TMPBUF,R1	;SET REG IF N MODE
	MOV	NPTS,R2
8$:	BIS	#B14+B8+1,@#CLKSAD ;ST1 ENABLE & GO
	RTS	PC

.SBTTL CLKINT	CLOCK INT$:	MOV	(SP)+,R1
	MOV	(SP)+,R0
	DEC	NSWPS		;TEST IF ALL SWEEPS DONE
	BNE	7$
	INCB	DONFLG		;SET DONE FLAG
	RTI
	.DSABL	LSB
ERRUPT SERVICE FOR + DELAY
;IF ST1 OR EXTERNAL EVENT INTERRUPT, START CLOCK
	.ENABL	LSB
CLKINT:	MOV	R0,-(SP)
	MOV	#CLKSAD,R0.SBTTL STSWP	ROUTINE TO INITIALIZE A SWEEP OF SAMPLING.

STSWP:	MOV	BUFADR,BUFPTR	;SET UP SUM BUFR POINTER
	ADD	BUFSKP,BUFPT	;R0 -> CLOCK STATUS REG
	TST	@R0		;ST1 OR EXTERNAL EVENT?
	BPL	2$
	INC	@R0		;YES, START CLK
	BIC	#B15+B14,@R0	;ST1 FLAG & DR	;SKIP OVER NEG DELAY PTS IF REQUIRED
	MOV	NPTS,BUFCTR	;# OF PTS PER CHAN
	SUB	DELYP,BUFCTR	;REDUCED BY DELAY PTS
	.IF DF	SSISABLE INTR
	BR	4$
2$:	TSTB	@R0		;MODE FLAG?
	BPL	8$		;NO
4$:	DEC	(PC)+		;IS DELAY DONE?
DELCTR:	0
	BGT	6$
	BIC	#B7+B6,@R
	MOV	NPTS,R1		;TO THE SUM BUFR.
	MOV	BUFADR,R2
10$:	ADD	(R0)+,(R2)+
	BITB	#1,DPFLG	;TEST FOR D.P. SUM BUFR
	BEQ	12$
	ADC	($4
	TSTB	DISTYP		;TEST FOR N MODE.
	BPL	2$
	MOV	#ADBUF,R4	;YES, SET REGISTERS
	MOV	BUFPTR,R1
	MOV	BUFCTR,R2
	MOV	#ADSAD,R3THER COPIES
;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TTH HISTOGRAM

.SBTTL OUTPUT BUFFER FORMAT
;THE ZEROTH HISTOGRAM PROCEEDS THE HISTOGRAM TABLE SINCE ITS LENGTH
;IS NOT KNOWN O ONE WHO AGREES
;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE
;SHALL AT ALL TIMES REMAIN IN DEC.

;THE INUNTIL COMPLETION OF THE RUN. ITS END IS INDICATED BY A
; -1.  THE HISTO TABLE CONTAINS A COPY OF SOME PARAMETER TABLE INFO
;PL0	;YES, DISABLE CLK INTR
	MOV	ADSAV,@#ADSAD	;INTR ON & CLK DRIVEN FOR A/D
	BR	8$
6$:	BIC	#B7,@R0		;CLR MODE FLAG
8$:	MOV	(SPFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
;COMMITMENT BY DIGITAL EQUIPM)+,R0
	RTI
	.DSABL	LSB

.SBTTL ST1INT	CLOCK INTERRUPT SERVICE FOR ST1 DURING NEG DELAY
ST1INT:	BIC	#B15+B14,@#CLKSAD ;ST1 FENT CORPORATION.

;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLILAG & DISABLE INTR
	MOV	SAVVEC,@#ADVEC	;CHANGE SERVICE ROUTINES
	TSTB	DISTYP		;IF N MODE MUST REMEMBER
	BPL	2$		;POINTER INTOED BY DEC.

;LDP SOFTWARE DEVELOPMENT, JUNE 1975
;	CARL RALSTON
.SBTTL CONDITIONAL ASSEMBLY PARAMETER EXPLANATION
;HTPST$	 TEMP BUFR
	MOV	R1,TMPPTR	;YES, N MODE
	MOV	BUFPTR,R1	;ALSO SETUP USED REG
	MOV	BUFCTR,R2
2$:	RTI

.SBTTL ZBUF	ZERO BUFRS IF DF, INCLUDE CODE TO PROCESS PST DATA.
;HTISI$	IF DF, INCLUDE CODE TO PROCESS ISI DATA
;HTDP$	IF DF, INPUT VALUES & SOME PARAND LEDS
ZBUF:	MOV	R0,-(SP)
	MOV	R5,-(SP)
	MOV	(PC)+,R5	;TOTAL BUFR SIZE IN WORDS
TOTBSZ:	0
	MOV	(PC)+,R0	;ZERO IT ALL.
BUAMETERS ARE DOUBLE PRECISION.
;HTZER$	IF DF, CODE TO PRODUCE ZEROTH HISTOGRAM IS INCLUDED.
;CTREL$	IF DF, THE CONTROL MODULE WFADR:	0
2$:	CLR	(R0)+
	$SOB	R5,2$
	.IF DF	SS$5
	CLR	@#ADBUF		;SET LED COUNTERS 0
	MOV	#5,R5
	CLR	R0
4$:	ADD	#400,R0		;DIGILL RELEASE INPUT BUFFERS.
	.IF NDF HTPST$ ! HTISI$
ERROR=DEFINE HTPST$ OR HTISI$ OR BOTH
	.ENDC
	.IIF DF HTDP$	DP=1
	.IIF IT ADDR
	MOV	R0,@#ADBUF
	CLRB	LEDCTR(R5)
	$SOB	R5,4$
	CLRB	LEDCTR
	.ENDC
	MOV	(SP)+,R5
	MOV	(SP)+,R0
	RTS	PC
	.END
  NDF HTDP$	DP=0

.SBTTL MACROS & GLOBALS
.MCALL	.REGDE,$SOB,$DIV,$MUL
.REGDE

	;INTERNAL GLOBALS
.IIF DF HTPST$	.GLOBL	HTP                                                                                                                                ST
.IIF DF HTISI$	.GLOBL	HTISI
.GLOBL	HTTBL,HTEROR

	;EXTERNAL GLOBALS
.GLOBL	BAGTM,BAGET,CTOBUF,BASIZ,BBASIZ
.IIF NDF CTR.TITLE HISTO	HISTOGRAM MODULE
;LAB APPLICATIONS-11
;DEC-11-SLABA-C-LA
;FILENAME HISTO.MAC
;FILE ID HISTO.2
.CSECT	HISTO

EL$ .GLOBL BAREL

.SBTTL PARAMETER TABLE OFFSETS
HTMNTM=0	;MIN VALUE TO CONSIDER (SP OR DP)
HTBINW=2*DP+2	;BIN WIDTH
HTNOFB;COPYRIGHT (C) 1975
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY =HTBINW+2	;# OF BINS
HTMXTM=HTNOFB+2	;MAX VALUE TO CONSIDER (SP OR DP)
HTZERO=2*DP+HTMXTM+2	;ZEROTH HISTOGRAM FLAG
HTOOFL=HTZON A
;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OERO+2	;ORDER OF LATENCY, MAX # OF RESPONSES TO CONSIDER
		;AFTER EACH STIMULUS. (PST)
HTTMSG=HTOOFL	;TIME SEGMENT FOR ISI ZEROE WHEN REQUESTED
;	2	CTOBUF RETRUNED ERROR
;	3	ARITHMETIC OPERATION OVERFLOW BEYOND PRECISION

	.IF DF HTISI$
HTISI:	MOV	#1OV	(R5)+,(R0)+	;BIN WIDTH
	MOV	@R5,(R0)+	;# OF BINS
	MOV	(R5)+,R1	;COPY FOR CTR
	MOV	(R5)+,(R0)+	;HTMXTM
	.IIF DF HTDP$ MOV ,ISIFLG	;INDICATE ISI
	BR	IN
	.ENDC

	.IF DF HTPST$
HTPST:	CLR	ISIFLG		;NOT ISI
	.ENDC
IN:	MOV	R0,-(SP)	;SAVE OUTPUT PTR (R5)+,(R0)+
	TST	(R5)+		;SKIP ZEROTH HISTO FLAG
	MOV	@R5,(R0)+	;HTOOFL OR HTTMSG
	SUB	#HTOOFL,R5	;RESET R5 TO BEGINNING OF PAON STACK
	.IIF NDF CTREL$ MOV @R1,BUFADR	;SAVE BUFR ADDR TO RELEASE
	INC	LSTBUF		;SAY LAST UNTIL CLEARED
	MOV	2(R1),R2	;# OF RM TBL
	ADD	#5,R1		;5 EXTRA CTRS TO ZERO
	MOV	#10.,BIN1	;DETERMINE ADDR OF 1ST BIN
	ADD	R0,BIN1
6$:	CLR	(R0)+		;CLEAR ALL COWORDS IN INPUT BUFR
	BGT	2$		;LAST AND SOME TO PROCESS
	BNE	1$
	JMP	LAST		;0 SO NONE TO PROCESS
1$:	NEG	R2		;MAKE COUNT +
	UNTERS
	$SOB	R1,6$
	.IF DF HTZER$
	TST	HTZERO(R5)	;DO WE NEED ZEROTH HISTO BUFR
	BEQ	8$
	JSR	PC,GETZER	;GET ZEROTH HISTO OUCLR	LSTBUF		;SAY NOT LAST BUFR
2$:	.IIF DF HTDP$ ASR R2	;HALF FOR D.P.
	MOV	@R1,R3		;R3 -> INPUT BUFR
	TST	@R0		;0 ADDR ON FITPUT BUFR
	BCS	NOROOM
	.IIF DF HTISI$ CLR RUNSUM ;STARTS AT 0
	.ENDC
8$:	CLR	(PC)+		;COUNT OF # OF SPIKES IN TIME SEGMENT
RUS THE HISTOGRAM PROPER. ALL VALUES ARE S.P. EXCEPT FOR HTMNTM 
;AND HTMXTM.  THE FIRST PART ARE COPIES OF THE FOLLOWING:
;1-5RST CALL
	BNE	PROCES		;NOT FIRST CALL

;COME HERE ONLY ONCE ON FIRST CALL.(WHEN R0 -> 0).
;SO DO THE FOLLOWING:
;1. DETERMI.	HTMNTM,HTBINW,HTNOFB,HTMXTM, HTOOFL OR HTTMSG
;6. # OF BIN COUNTERS THAT HAVE OVERFLOWED
;7. TOTAL # OF STIMULI	(0 FOR ISI)NE SIZE NEEDED FOR HISTO TABLE OUTPUT BUFR.
;2. GET MULTI BUFRS & STORE BUFR TABLE ADDR.
;3. COPY PARAMETERS & ZERO COUNTERS

;8. UNDERFLOW BIN COUNTER
;9. OVERFLOW BIN CTR
;10. REJECT CTR (VALUES OVER HTMXTM)
;	.
;	.
;	HTNOFB WORDS OF THE BIN COUN;4. IF ZEROTH HISTO GET A BUFR FOR IT

	.ENABL	LSB
	CLR	(PC)+		;SET TO NO ERROR
HTEROR:	0
	MOV	#2*DP+10.,R1	;HEADER WORDS ATERS
;	.
;	.

.SBTTL HTISI & HTPST	ENTRY POINTS
;THIS MODULE IS A PROCESSING MODULE AND AS SUCH USES THE CONTROL
;MODULE ST BEGINNING
	ADD	HTNOFB(R5),R1	;ADD # OF BINS REQUIRED
	MOV	R1,WDSREQ	;FOR LATER USE
	CLR	R0		;S.P. DIV
	$DIV	BASIZ,R0	;WORDCHEME FOR PASSING BUFFER INFORMATION.
;R5 = ADDR OF THE PARAMETER TABLE
;R0 -> OUTPUT BUFR ADDR  OR 0 IF NON-YET
;	ADDR OF HIS REQ/BASIZ
	TST	R1		;IS REM 0?
	BEQ	2$
	INC	R0		;NO, BUMP # OF BUFRS NEEDED
2$:	MOV	R0,R1		;# OF BUFRS REQUIRED
	MOV	@SP,RSTO TABLE IF NO ZEROTH HISTO REGUIRED
;	OTHERWISE ADDR OF ZEROTH HISTOGRAM BUFR
;	2(R0) INDEX INTO OUTPUT BUFR (LBI)
;R1 -> A0		;STORE ADDR @R0
	JSR	PC,BAGTM
	BCC	5$
NOROOM:	MOV	#1,HTEROR	;NO BUFRS AVAILABLE
ERTN:	.IF NDF CTREL$
	MOV	BUFADR,R0	;WE DDR OF INPUT BUFR
;	2(R1) NUMBER OF WORDS IN THE INPUT BUFR
;	IF NEG., NOT LAST BUFR
;IF AN ERROR OCCURED THE CARRY BIT WILL MUST RELEASE INPUT BUFR
	JSR	PC,BAREL
	SEC
	.ENDC
	MOV	(SP)+,R0	;POP STACK, LEAVE C=1
	RTS	PC

5$:	MOV	@(SP),R0	;R0 -> HIBE SET ON RETURN.
;(EXCEPT IF CTOBUF RETURNED AN ERROR)
;HTEROR HAS THE FOLLOWING VALUES:
;	0	NO ERROR
;	1	NO BUFRS AVAILABLSTO TBL
	MOV	R0,HTTBL	;HISTO TABLE ADDR
	MOV	(R5)+,(R0)+	;COPY THE FOLLOWING VALUES:HTMNTM
	.IIF DF HTDP$ MOV (R5)+,(R0)+
	MW
;3. IF .GT. HTMXTM, INC REJECT CTR
;4. IF > MXKP, INC OVERFLOW (MXKP=HTMNTM+HTBINW*HTNOFB)
;5. DETERMINE NORMAL BIN TO INC:	.IFTF
	CMP	R1,@R5		;HIGH =, CMP LOW PARTS
	BHIS	6$
	INC	-6(R4)		;UNDERFLOW CTR
	BR	12$
6$:	.IFT
	CMP	@R3,HTMXTM+2(R5) ;I
;6. IF ANY BIN OVERFLOWS, INC BIN OVERFLOW FLAG
;R0 = TEMP
;R1   INPUT VALUE
;R2 = # OF WORDS IN INPUT BUFR.
;R3 -> INPUT BF > HTMXTM, INC REJECT
	BHI	7$
	BLO	8$
	.IFTF
	CMP	R1,HTMXTM(R5)
	BLOS	8$
7$:	INC	-2(R4)		;REJECT CTR
	BR	12$
8$:	.IFT
UFR
;R4 -> OUTPUT BUFR 1ST BIN
;R5 -> START OF PARAMETER TABLE

	.ENABL LSB
	.IF DF HTPST$ & HTZER$
	TST	ISIFLG		;PICK UP 	CMP	@R3,MXKP+2	;IF .GE. MXKP, INC OVERFLOW
	BHI	9$
	BLO	10$
	.IFTF
	CMP	R1,MXKP
	BLO	10$
9$:	INC	-4(R4)		;OVERFLOW CTR
	1ST STIMULUS IF PST
	BNE	PROCES		;NOT PST
	MOV	BIN1,R4		;SETUP R4
	MOV	(R3)+,R1	;GET 1ST BUFR VALUE
	BNE	3$
	.IF DF HTDP$
BR	12$
10$:	SUB	@R5,R1		;DETERMINE WHICH BIN TO INC
	.IFT
	MOV	@R3,R0		;HIGH ORDER PART
	SBC	R0
	SUB	HTMXTM+2(R5),R0	;HIGH 	TST	@R3		;D.P. TEST FOR 0
	BNE	3$
	.ENDC
	BR	2$		;A STIMULUS SO INC STIM CTR
	.ENDC
PROCES:	MOV	(PC)+,R4	;R4 -> 1ST BIN
BORDER PART
	.IFF
	CLR	R0		;S.P. DIV
	.ENDC
	$DIV	HTBINW(R5),R0	;(VALUE-HTMNTM)/HTBINW
	BVS	EROR3		;BINWIDTH TOO SMALL
	ASLIN1:	0
PROLP:	.IF DF HTISI$
	TST	ISIFLG		;ONLY FOR ISI
	BEQ	1$
	MOV	(R3)+,R1
	.IF DF HTZER$
	TST	HTZERO(R5)
	BEQ	4$
	INC	R0		;MAKE WORD INDEX
	ADD	R4,R0
	INC	@R0
12$:	BNE	14$		;DID ANY INC CAUSE AN OVERFOW
	INC	-12(R4)		;YES, BIN OVERFLOW FLAG	RSPCT		;COUNT OF SPIKES IN TIME SEGMENT
	ADD	R1,(PC)+	;RUNNING SUM OF TIMES
RUNSUM:	0
	CMP	RUNSUM,HTTMSG(R5) ;IS RUNSUM.GE.H
14$:	.IIF DF HTDP$ TST (R3)+ ;BUMP INPUT PTR
	$SOB	R2,PROLP	;LOOP UNTIL ALL INPUT GONE
	TST	(PC)+		;LAST BUFR?
LSTBUF:	0			;TTMSG?
	BLO	4$
	SUB	HTTMSG(R5),RUNSUM ;YES,RESET RUNNING SUM &
	JSR	PC,ZEROUT	;OUTPUT # OF SPIKES
	BCS	NOROOM
	.ENDC
	BR	4LAST BUFR FLAG, NON-ZERO FOR LAST
	BNE	LAST
RTN:	.IF NDF CTREL$
	MOV	(PC)+,R0	;WE MUST RELEASE BUFR

BUFADR:	0
	JSR	PC,BARSPCT:	0			;COUNT OF # OF RESPONSES AFTER STIMULUS
	MOV	HTBINW(R5),R0	;CALCULATE MAX VALUE TO KEEP
	$MUL	HTNOFB(R5),R0	;HTBINW*$
	.ENDC

1$:	.IF DF HTPST$
	MOV	(R3)+,R1	;INPUT VALUE, ZERO=STIM
	BNE	3$
	.IF DF HTDP$
	TST	@R3		;HIGH ORDER PART ZERO AHTNOFB
	ADD	@R5,R1		;MXKP=HTMNTM+HTBINW*HTNOFB
	.IF DF HTDP$
	ADC	R0
	ADD	HTMNTM+2(R5),R0
	MOV	R0,MXKP+2	;HIGH ORDER PART
LSO?
	BNE	3$
	.ENDC
	.IF DF HTZER$
	TST	HTZERO(R5)	;ZEROTH HISTO OUTPUT
	BEQ	2$
	JSR	PC,ZEROUT	;YES, OUTPUT RESPONSES CTR	.ENDC
	BCC	9$
EROR3:	MOV	#3,HTEROR	;OVERFLOW BEYOND PRECISION
	BR	ERTN
9$:	MOV	R1,MXKP		;LOW ORDER PART
	.DSABL	LSB

.SB
	BCS	NOROOM
	.ENDC
2$:	INC	-10(R4)		;TOTAL STIMULUS COUNT
	BR	12$
3$:	INC	RSPCT		;BUMP COUNT OF RESPONSES
	CMP	RSPCT,HTOOFTTL INCREMENT PROPER BIN
;THIS SECTION TAKES THE INPUT VALUE AND DOES THE FOLLOWING:
;1. IF=0, A STIMULUS, INC TOTAL STIMULUS L(R5) ;SHOULD THIS RESP BE INCLUDED?
	BLOS	4$		;KEEP IT
	DEC	RSPCT		;PREVENT FROM OVERFLOWING
	BR	14$		;DONT KEEP BUT LOOP
	COUNT
;	OUTPUT RSPCT FOR ZEROTH HISTO
;	ZERO RSPCT (COUNT OF # OF RESPONSES AFTER EACH STIMULI)
;2. IF < HTMNTM, INC UNDERFLO.ENDC
4$:	.IF DF HTDP$
	CMP	@R3,HTMNTM+2(R5) ;IF<HTMNTM, INC UNDERFLOW
	BHI	6$		;VALUE > HTMNTM
	BLO	5$		;VALUE < HTMNTM
5$UST PASS HISTO TABLE BUFR.

	.ENABL	LSB
LAST:	.IF DF HTZER$
	TST	HTZERO(R5)	;WAS ZEROTH HISTO DONE?
	BEQ	7$
	JSR	PC,ZEROUT ANOTHER OUTPUT BUFR. C=1 IF NO BUFRS AVAILABLE

	.ENABL	LSB
ZEROUT:	MOV	RSPCT,@ZERPTR	;YES, OUTPUT RESPONSES CTR
	CLR	RSPCT	;YES,OUTPUT LAST RESPONSE CNT
	MOV	#-1,RSPCT	;PUT -1 IN ZEROTH BUFR
	JSR	PC,ZEROUT
	MOV	ZERCTR,R2	;# OF WDS LEFT TO FILL BUF		;RESET TO 0
	ADD	#2,(PC)+	;BUMP BUFR PTR
ZERPTR:	0			;ZEROTH HISTO BUFR PTR
	DEC	(PC)+		;IS IT FULL
ZERCTR:	0			;ZEROTH OUR
	CMP	BASIZ,R2	;IF BUFR JUST FULL,
	BEQ	7$		;DON'T NEED TO COMBINE
	MOV	@SP,R0		;R0 -> OUTPUT PAIR
	TST	(R0)+		;R0 -> LBI OTPUT BUFR FULL CTR
	BNE	2$
PASZER:	MOV	2(SP),R0	;GET OUTPUT BUFR PTR
	TST	(R0)+		;PTS TO LBI
	MOV	BASIZ,@R0	;LBI
	NEG	@R0		F OUTPUT BUFR
	MOV	BASIZ,@R0	;START WITH BUFR SIZE
	SUB	R2,@R0		;TAKE AWAY ZERCTR
	MOV	ZERPTR,R1	;R1 -> ZEROTH BUFR TO FILL
;NOT LAST BUFR
	JSR	PC,CTOBUF	;PASS OUTPUT BUFR TO CTRL MOD
	BCS	EROR2		;FULL UP, CM ALREADY KNOWS
	TST	LSTBUF		;DONT GET ANO	MOV	HTTBL,R3	;HIST BUFR ADDR
	MOV	#WDSREQ,R4	;R4 -> WORDS REGUIRED
	SUB	R2,@R4		;TRANSFER ZERCTR OR WDSREQ WORDS
	BPL	2$		;WTHER IF LAST
	BNE	1$
GETZER:	MOV	#ZERPTR,R0	;GET A NEW BUFR
	JSR	PC,BAGET
	MOV	ZERPTR,@2(SP)	;STORE BUFR ADDR
1$:	MOV	BASIZHICHEVER IS SMALLER.
	ADD	R2,@R4		;IF SUB -, THEN HISTO TBL <
	MOV	@R4,R2		;NEEDED TO FILL BUFR.
	CLR	@R4		;0 FOR LATER CHECK,ZERCTR	;RESET COUNTER
2$:	RTS	PC
	.ENDC

ISIFLG:	0		;0 FOR PST, NON-ZERO FOR ISI
MXKP:	.BLKW 1+DP	;MXKP=HTMNTM+HTBINW*HTNO
2$:	ADD	R2,@R0		;ADD WDS TO FILL BUFR TO LBI
4$:	MOV	(R3)+,(R1)+	;SHIFT TO ZEROTH BUFR
	$SOB	R2,4$
	TST	@R4		;IF 0, THEN LAFB
		;VALUES BETWEEN MXKP & HTMXTM CAUSE OVERFLOW BIN
		;TO BE INCREMENTED.
	.END
                                          ST BUFR
	BEQ	5$
	NEG	@R0		;- NOT LAST BUFR
5$:	JSR	PC,CTOBUF	;PASS HISTO TBL TO CTRL
	BCS	EROR2
	MOV	HTTBL,R1	;SHIFT HISTO .TITLE DIRECTOR PROGRAM
;LAB-APPLICATIONS-11
;DEC-11-SLABA-C-LA
;FILENAME DIRKTR.MAC
;FILE ID DIRKTR.3


.CSECT	DIRKTR
TBL DOWN
	MOV	@R4,R2		;# OF WDS TO MOV
	BLE	8$		;NON TO TRANSFER
6$:	MOV	(R3)+,(R1)+
	$SOB	R2,6$
	.ENDC
7$:	MOV	@SP,R0		;P
;COPYRIGHT (C) 1975
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLYASS HISTO TBL TO CTRL MOD
	MOV	(PC)+,(R0)+
HTTBL:	0			;ST ADDR OF HISTO TBL
	MOV	(PC)+,@R0	;LAST BUFR SO +
WDSREQ:	0			;WORD ON A
;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION
;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY S REQUIRED FOR HISTO TBL
	JSR	PC,CTOBUF
	BCC	8$
EROR2:	MOV	#2,HTEROR	;CTOBUF RTNED ERROR, DONT RTN C SET
8$:	.IF DF CTREL$
OTHER COPIES
;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND EL
	.ENDC
	TST	(SP)+		;POP STACK & C=0
	RTS	PC		;RETURN

;ON LAST BUFR.:
;IF ZEROTH, PUT -1 IN ITS BUFR, COMBINE HISTO TBL	CLR	@(SP)+		;0 INPUT BUFR ADDR IN CTRL MOD TABLE
	RTS	PC
	.IFF
	CLR	@(SP)
	BR	RTN
	.ENDC
	.DSABL	LSB

	.IF DF HTZER$
. WITH ZEROTH BUFR,
;	PASS SINGLE BUFR WHEN FULL, COMBINE REST INTO
;	SELF, PASS THE COMBINED WITH PROPER LBI.
;IF NO ZEROTH JSBTTL ZEROUT	SUBR TO OUTPUT INTO ZEROTH HISTOGRAM BUFFER
;THIS SUBR OUTPUTS 'RSPCT' INTO ZEROTH BUFR AND IF FULL
;GETS ANOTHERODE #3). IT MUST BE
;	DEFINED ONLY IF MODE #3 TYPE SAMPLING IS BEING REQUESTED.

	.IF	NDF,MAXRR$
	MAXRR$=1
	.ENDC

;FG$,LJSR	PC,OVRLA2	;CALL ROUTINE TO CLOSE OPEN FILES
	BR	REINIT		;RECYCLE
	.SBTTL	ROUTINE FOR PROGRAMMED START/STOP CONTROL VIA TETO ONE WHO AGREES
;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE
;SHALL AT ALL TIMES REMAIN IN DEC.

;THE IPSDR$,DR11K$,AND MAXDP$ ARE ALSO USED BY THIS PROGRAM.  FOR THEIR
;	MEANING, PLEASE CONSULT THE MODULES MANUAL, SINCE THE MODULNFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
;COMMITMENT BY DIGITAL EQUIPES
;	DETERMINE HOW OR IF THESE PARAMETERS ARE TO BE DEFINED.


	.SBTTL	DIRECTION SECTION. THIS PART OF THE PROGRAM, CALLS
MENT CORPORATION.

;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF
;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPL		;THE OVERLAYS AS NEEDED, STARTS THE CONTROL MODULE
		;AND STARTS THE PROCESS OF LOOKING FOR A PROGRAMMED
		;START/STOP COMMAIED BY DEC.

;LDP SOFTWARE DEVELOPMENT  JUNE 1975
	.SBTTL	MACROS,GLOBALS,AND CONDITIONAL ASSEMBLY PARAMETERS


	.MCALL ..ND, VIA THE TERMINAL, IF THE 
		;CONTINUOUS SAMPLING MODULE WAS PARAMETERIZED AS SUCH.



THRU:	BIS	#100,@#44	;SET BIT 6 INV2..,.REGDEF,.QSET,.MRKT,.CMKT,.TTINR,.TTYIN,.PRINT
	.MCALL	.TWAIT
	..V2..
	.REGDEF


	;INTERNAL GLOBALS

.GLOBL	CTNOFD, JOB STATUS WORD
	.IF	DF,FG$
	.PRINT	#GIVCTF		;REMIND USER TO HIT
	.QSET	#QUEUE,#1	; (CNTRL) F (CR)
WATING:	MOV	#TAREA,R0
	CTNOFB				;PERTAINENT TO C.T. MOD.
.GLOBL	CSMODE,CSNOFC,CSRATE,CSTICK,CSNOFB	;PERTAINENT TO C.S. MOD.
.GLOBL	CSTYPE,CSCHGP,CSD.TWAIT			;MEANWHILE, WAIT	
	NOP
GETING:	.TTINR
	BCS	WATING
	CMPB	R0,#12		;WAIT FOR END OF LINE
	BNE	GETING
	.ENDC

REINIOUT,CSSOUT,CSHOUT
.GLOBL	CSSIN,CSHIN,CSSTOP,CSRRCT,CSRRTB,CSTART
.GLOBL	PROGSS,TTYBUF


	;EXTERNAL GLOBALS

.GLOBL	OVRLA1T:	JSR	PC,OVRLA1	;CALL PARAMETERIZATION-INITIALIZATION 
	CLR	R0		;SET SEEK FOR CHANNEL 0
	JSR	PC,TPSEK	;START HEAD IN MOTION
,OVRLA2				;ADDRESSES OF OVERLAYS
.GLOBL	CTSTRT,CTIDON				;GLOBALS FROM OF C.T.MOD
.GLOBL	CSAMPL					;START/STOP ADDR OF
					TST	PROGSS		;CHECK FOR PROGRAMMED START/STOP(VIA TTY)
	.ENABL	LSB
	BEQ	2$		;IF NOT, JUST GO TO CONTROL MODULE

	.IF	NDF,FG$		; CONTINUOUS SAMPLING MOD
.GLOBL	TPSEK					;FROM TPUT

	.IF	NDF,FG$
.GLOBL	CTIBUF,TTYCHK				;ADDRESS TO PASS BUFFERS
	.EN
	MOV	#-1,R2		;OTHERWISE, ENABLE ROUTINE
	MOV	R2,R1		;TO LOOK FOR TTY INPUT TO START AND STOP
	MOVB	CTNOFD,R0	;ACQUISITION. RDC					; IN C.T. MOD, AND 
						; ROUTINE TO PROCESS
						; PROGRAMMED START/STOP
	;CONDITIONAL ASSEMBLY PARAMETERS NEEDEDOUTINE IS A SELF FEEDING 
	JSR	PC,CTIBUF	;DUMMY DATA PATH PROCESS
	.ENDC

	.IF	DF,FG$	
	TST	QUEDON		;OTHERWISE, ENABLE ROUT

;MAXRR$ IS THE ONLY PARAMETER WHICH IS DIRECTLY APPLICABLE TO THE PROGRAM
;	AND IS NOT DIRECTLY INVOLVED IN THE MODULES THEMINE TO LOOK
	BNE	1$		;FOR TTY INPUT TO START AND STOP 
	.QSET	#QUEUE,#1	;ACQUISITION. ROUTINE IS .MRTM DRIVEN.
1$:	.MRKT	#ARESELVES.  IT 
;	REPRESENTS THE TOTAL NUMBER OF POSSIBLE ENTRIES IN A ROUND ROBIN
;	TABLE(SEE CONTINUOUS SAMPLING MODULE UNDER MA,#INTRVL,#TTYCHK,#1
	.ENDC

2$:	JSR	PC,CTSTRT	;START CONTROL MODULE

	.IF	DF,FG$
	.CMKT	#AREA,#1	;STOP CLOCK
	.ENDC

	.TTYIN			;OTHERWISE, GET LF OUT OF BUFFER
	JSR	PC,CSAMPL	;PASS VALUE TO C.S. MODULE
3$:	TST	CTIDON		;CHECK TO SEE IF ACQUISITIååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååON FINISHED
	BEQ	4$		;IF SO, NO NEED TO CHECK FOR MORE INPUT, 
				; SO BRANCH TO EXIT
	.IF	DF,FG$
	.MRKT	#AREA,#INTRVL,#TTYååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååCHK,#1	;RESTART CLOCK

	.IFF
	MOV	#-1,R2		;GIVE PROCESS ANOTHER DUMMY BUFFER
	MOV	R2,R1		;TO PROCESS, THUS ENABLING IT
	MOVååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååB	CTNOFD,R0	;WHEN TIME AVAILS.
	JSR	PC,CTIBUF
	.ENDC

4$:	RTS	PC
	.SBTTL	STORAGE AREA.
		;AREA WHERE PREVIOUS RUN PARAMETååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååRMINAL
		;IF IN F/G ENVIRONMENT, A .MRKT IS USED TO CHECK EVERY
		;TENTH OF A SECOND OR SO FOR TERMINAL INPUT. 
		;IF IN S/J ERS AS WELL AS
		;PROGRAM STORAGE LOCATIONS ARE KEPT




CTNOFD:	.BYTE	1		;STORED PARAMETERS FOR CONTROL MODULE
CTNOFB:	.ENVIRONMENT, A SELF-FEEDING DATA PATH WITH
		;ONE PROCESS OF LOWEST PRIORITY IS USED TO CHECK FOR
		;TERMINAL INPUT. 
		;A.)IBYTE	4		;ONLY TWO VARY

CSMODE:	.WORD	1		;STORRED PARAMETERS FOR 
CSNOFC:	.WORD	1		;  CONTINUOUS SAMPLING ROUTINE
CSRATE:	.WF INPUT IS NOT AVAILABLE:
		;	IN F/G ANOTHER .MRKT COMMAND IS GIVEN, AND THE
		;	 ROUTINE RETURNS.
		;	IN S/J A DUMMY BUFFER ORD	4
CSTICK:	.WORD	5
	.BLKW	MAXDP$-1
CSNOFB:	.WORD	12
	.BLKW	MAXDP$
CSTYPE:	.WORD	0
CSCHGP:	.WORD	0
	.BLKB	MAXDP$
	.EVE(ADDRESS OF -1) IS GIVEN
		;	 TO THE CONTROL MODULE FOR THIS PROCESS, AND 
		;	 THEN THE ROUTINE RETURNS.
		;**EXCEPTION:
		N
	.IF	DF,LPSDR$ ! DR11K$
CSDOUT:	.WORD	0
CSSOUT:	.WORD 	1
	.BLKW	MAXDP$
CSHOUT:	.WORD	2
	.BLKW	MAXDP$
	.ENDC
CSSIN:	.WO;	 IF THE ACQUISITION HAS STOPPED,I.E.,CTIDON=0.
		;	 IN THIS CASE THE ROUTINE SIMPLY RETURNS
		;	 WITH NO FURTHER ACTION.
		RD	4
	.BLKW	MAXDP$
CSHIN:	.WORD	10
	.BLKW	MAXDP$
CSSTOP:	.WORD	20
CSRRCT:	.WORD	1
CSRRTB:	.BYTE	0
	.BLKB	MAXRR$-1
	.EVEN;B.)IF INPUT IS AVAILABLE, IT IS GIVEN TO THE CONTINUOUS
		;   SAMPLING ROUTINE IN R1 VIA CSAMPL, AND THEN PROCEEDS
		;   AS I
CSTART:	.WORD	0



	.IF	DF,FG$
QUEDON:	.WORD	0		;FLAG TO TEST IF .QSET AREA IS RESERVED
QUEUE:	.BLKW	5		;AREA FOR QUEUE S A.)



TTYCHK:	.TTINR			;CHECK FOR TTY LINE
	.ENABL	LSB
	BCS	3$		;IF NONE AVAILABLE, SPLIT
	CLR	R1		;PREPARE FOR MASK
ELEMENT FOR .MRTM
AREA:	.BLKW	5		;AREA NEEDED BY .MRTM SCRATCH
TAREA:	.BYTE  0,24		;AREA FOR TWAIT
	.WORD	INTRVL
INTRVL:	.WO	BR	2$
1$:	SUB	#60,R0		;ASSUME OCTAL NO. STRIP OFF ASCII
	ASL	R1		;MULTIPLY OLD VALUE BY EIGHT
	ASL	R1
	ASL	R1
	ADD	R0,R1		RD	0,6		;INTERVAL TO CHECK(ABOUT 1/10 SEC)
GIVCTF:	.ASCIZ /TYPE (CTRL)F(CR) TO START PROGRAM/
	.ENDC

PROGSS:	.WORD	0		;PROG;ADD NEW VALUE
	.TTYIN			;GET NEXT VALUE
2$:	CMP	#15,R0		;CHECK FOR CARRIAGE RETURN
	BNE	1$		;IF NOT, UPDATE CURRENT VALUE
	RAMMED START/STOP FLAG

TTYBUF:	.BLKB	112		;ALLOW FOR 72 CHARACTER TERMINAL

	.END	THRU
                                   