File: HISTI.MC of Tape: Various/ETH/eth11-3
(Source file text) 

.TITLE THE INTERVAL HISTOGRAMMING SUBROUTINE(HISTI)
;LABORATORY SUBROUTINES
;DEC-11
;FILENAME HISTI.MAC
;FILE ID HISTI.1

.CSECT	FHISTI









;			COPYRIGHT (C) 1976 BY
;	    DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND  COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH  LICENSE AND 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.  NO TITLE TO AND OWNERSHIP OF  THE  SOFTWARE  IS  HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE  WITHOUT  NOTICE
;AND  SHOULD  NOT  BE  CONSTRUED  AS  A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF  ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
;
;
;
;LDP SOFTWARE DEVELOPMENT GROUP   SEPTEMBER, 1977.
	.SBTTL CONDITIONAL ASSEMBLY PARAMETER EXPLANATION

	;CONDITIONAL ASSEMBLY PARAMETERS
	;   DEFINE PARAMETERS BY REMOVING FIRST ";" IN LINE WHICH
	;   CONTAINS THE APPROPRIATE PARAMETER
;EIS=1
;EAE=1
;FREQ$=1
;DPREC$=1
.IFDF	EAE
DIV=177300
AC=DIV+2
MQ=AC+2
MUL=MQ+2
EAESR=MUL+3
.ENDC



	;CONDITIONAL ASSEMBLY PARAMETER DESCRIPTIONS

;EIS	"EIS" SHOULD BE DEFINED IF EIS(KE11-E) HARDWARE IS AVAILABLE
;	ON THE SYSTEM WHERE THIS SOFTWARE IS TO BE USED. IF NOT DEFINED,
;	SUBROUTINES WHICH MIMIC THE REQUIRED FUNCTIONS OF THIS HARDWARE
;	ARE ASSEMBLED AND SUBSTITUTED.
;
;EAE	"EAE" SHOULD BE DEFINED IF EIS HARDWARE IS NOT AVAILABLE BUT
;	THE EAE IS.
;	NOTE: IF EAE HARDWARE IS AVAILABLE AND IS TO BE USED, THE 
;	      DEFAULT ADDRESSES ASSOCIATED WITH THE DEVICE ARE USED.
;	      IF YOUR "EAE" IS NOT INSTALLED AT THE NORMAL LOCATIONS
;	      THE DEFAULT ADDRESSES OF THE STATUS WORDS SHOULD BE
;	      MODIFIED TO REFLECT THIS DESCREPENCY BY REDEFINING "DIV"
;	      BY EDITING THIS FILE AND SETTING IT EQUAL TO THE STARTING
;	      ADDRESS OF THE STATUS WORDS ASSOCIATED WITH THE "EAE".
;		
;FREQ$	"FREQ$" SHOULD BE DEFINED IF A ZEROETH HISTOGRAM IS DESIRED.
;	IF IT IS DEFINED, AN ADDITIONAL ARGUMENT IS REQUIRED IN THE
;	FORTRAN CALL STATEMENT, AND ADDITIONAL PARAMETERS IN THE 
;	PARAMETER TABLE ARE REQUIRED. SEE MANUAL FOR ADDITIONAL 
;	DETAILS.
;
;DPREC$	"DPREC$" SHOULD BE DEFINED IF THE RANGE OF INTERVALS TO BE
;	HISTOGRAMMED ARE DELIMITED BY VALUES LARGER THAN 32767,
;	(2**15-1)
;	IF DEFINED, THE PARAMETER TABLE VALUES MUST ALSO BE DOUBLE
;	PRECISION INTEGER, I.E., INTEGER*4.
;	NOTE:
;	     THIS CONDITIONAL ASSEMBLY PARAMETER DOES NOT AFFECT THE
;	     DATA TYPE OF THE OUTPUT ARRAY.           ---


	.IIF DF DPREC$	DP=4
	.IIF NDF DPREC$	DP=2


	.SBTTL MACROS AND GLOBALS


	R0=%0
	R1=%1
	R2=%2
	R3=%3
	R4=%4
	R5=%5
	SP=%6
	PC=%7



	;INTERNAL GLOBAL
	.GLOBL HISTI




	;MACROS

.MACRO	$MUL	SRC,RX
	.IFDF	EIS
	MUL	SRC,RX
	.IFF
	.NTYPE .SYM,RX
	.IIF NE .SYM .ERROR ;REGISTER MUST BE R0
	.IF NB SRC
	.IIF DIF SRC,R1	MOV SRC,R1
	.ENDC
	JSR PC,MULR0
	.ENDC
.ENDM


.MACRO	$DIV	SRC,RX
	.IFDF	EIS
	DIV	SRC,RX
	.IFF
	.NTYPE .SYM,RX
	.IIF NE .SYM,.ERROR ;REGISTER MUST BE R0
	.IF NB SRC
	.IIF DIF SRC,-(SP) MOV SRC,-(SP)
	.ENDC
	JSR PC,DIVR0
	.ENDC
.ENDM

	.SBTTL MULR0,DIVR0
.IFNDF EIS
;MULR0 SUBROUTINE TO SERVE $MUL SRC,REG MACRO
;USED TO SIMULATE THE INTEGER MULTIPLY INSTRUCTION WHEN THE USER 
;DOES NOT HAVE THE EXTENDED INSTRUCTION SET (EIS).
;CALLED BY THE FOLLOWING
;	MOV	SRC,R1
;	JSR	PC,MULR0
;	RETURNS HIGH PRODUCT IN R0, LOW IN R1
;ON RETURN ONLY C-BIT OF CONDITION CODES IS MEANINGFUL
;C=1 IMPLIES MORE THAN 16-BIT PRODUCT, C=0 IMPLIES SINGLE PREC. OK

;THE MACRO $MUL SRC,REG WILL ALSO GENERATE THIS CALLING SEQUENCE
;WHEN THE CONDITIONAL ASSEMBLY PARAMETER 'EIS' IS NOT DEFINED.

MULR0:	.IFDF	EAE
	MOV	R1,@#MQ		;PUT 1ST NUMBER IN MQ
	MOV	R0,@#MUL	;MULTIPLY BY SECOND NUMBER
	MOV	@#MQ,R1		;LOW ORDER PRODUCT
	MOV	@#AC,R0		;HIGH ORDER PRODUCT
	CLC
	BITB	#2,@#EAESR	;TEST FOR SINGLE PRECISION
	BNE	1$
	SEC			;C=0 IMPLIES 16-BIT PRODUCT OK
1$:	RTS	PC
	.ENDC
	.IFNDF	EAE
	MOV	R2,-(SP)	;PUSH TWO REGISTERS AND A FLAG
	MOV	R4,-(SP)
	CLR	-(SP)
	TST	R0		;CHECK SIGNS
	BPL	2$
	NEG	R0		;TAKE ABSOLUTE VALUES
	INC	@SP		;AND FLAG NEGATIONS
2$:	TST	R1
	BPL	4$
	NEG	R1
	DEC	@SP		;MINUS*MINUS=PLUS
4$:	MOV	#17.,R2		;COUNT ITERATIONS
	CLR	R4		;HIGH ORDER PRODUCT BUILT HERE
6$:	CLC			;CLEAR CARRY FOR ROTATES
	ROR	R4		;SHIFT MULTIPLIER AND PARTIAL PRODUCT
	ROR	R1
	BCC	8$		;NO ADD NEEDED
	ADD	R0,R4
8$:	DEC	R2		;COUNT ITERATION
	BGT	6$
	TST	R4		;WAS RESULT DOUBLE?
	BNE	10$		;YES
	CMP	R1,#100000	;MAYBE
	BLO	12$		;DEFINITELY NOT
	BHI	10$		;DEFINITELY
	TST	@SP		;SPECIAL CASE -2**15 OK
	BNE	12$		;YES
10$:	COM	R2		;USE THIS AS CARRY FLAG
12$:	TST	(SP)+		;IS RESULT TO BE NEGATED?
	BEQ	14$		;NO
	NEG	R4		;YES
	NEG	R1
	SBC	R4
14$:	MOV	R4,R0
	ASR	R2		;SET CARRY BIT FOR TWO WORD CASE
	MOV	(SP)+,R4	;RST REG
	MOV	(SP)+,R2
	RTS	PC
	.ENDC


;DIVR0	32 BY 16 BIT DIVIDE TO SUPPORT MACRO  $DIV  SRC,R0
;CALLED BY USING THE MACRO	$DIV	SRC,R0
;WHICH EXPANDS TO THE FOLLOWING WHEN EIS IS NOT AVAILABLE:
;		MOV	SRC,-(SP)
;		JSR	PC,DIVR0
;	ON RETURN R0 CONTAINS QUOTIENT, R1 CONTAINS REMAINDER
;	SIGN OF REMAINDER SAME AS SIGN OF DIVIDEND
;	CONDITION CODES N AND V CORRECTLY SET, Z AND C NOT

DIVR0:	.IFDF	EAE
	MOV	R1,@#MQ		;LOW ORDER DIVEND
	MOV	R0,@#AC		;HIGH ORDER DIFIDEND
	MOV	2(SP),@#DIV	;DIVIDE
	MOV	(SP)+,@SP	;PUT RETURN ADDR WHERE NEEDED
	MOV	@#MQ,R0		;QUOTIENT
	MOV	@#AC,R1		;REMAINDER
	ROLB	@#EAESR		;SET N AND V
	RTS	PC
	.ENDC
	.IFNDF	EAE
	MOV	2(SP),-(SP)	;GET SOURCE
	MOV	2(SP),4(SP)	;PUT RETURN WHERE NEEDED
	MOV	R2,2(SP)	;FREE A REGISTER
	MOV	(SP)+,R2	;AND FILL IT WITH SOURCE
	MOV	R3,-(SP)	;SAVE ANOTHER REGISTER
	CLR	-(SP)		;SET UP A SIGN CONTROL WORD
	TST	R0
	BGE	1$
	DECB	1(SP)		;KEEP TRACK OF THE ORIGINAL
	NEG	R0		;SIGN AND NEGATE
	NEG	R1		;THE ORIGINAL NUMBER
	SBC	R0		;  I
1$:	TST	R2
	BEQ	12$		;DIVISION BY ZERO IS A NO-NO
	BGT	2$		;->	CHECK THE SIGN
	INC	@SP		;AND KEEP TRACK AS ABOVE
	NEG	R2		;  I
2$:	MOV	R2,R3		;<-	MOVE THE DIVISOR AND
	NEG	R3		;NEGATE FOR THE ALGORITHM
	ADD	R3,R0		;PREFORM THE INITIAL SUBTRACTION
	BCS	12$		;CARRY SET IS AN OVERFLOW
	MOV	#20,-(SP)	;SET UP A COUNTER
	CLR	-(SP)		;THIS IS A LASTING CARRY BIT
3$:	ROL	R1		;ROTATE ONE LEFT
	ROL	R0
	TST	@SP		;CHECK THE LAST CARRY
	BEQ	4$		;IF ZERO ADD ELSE SUBTRACT
	CLR	@SP		;CLEAR THE CARRY
	ADD	R3,R0		;DO ONE MORE STEP
	BR	5$
4$:	ADD	R2,R0		;-2N+N=N FOR THIS STEP
5$:	ADC	@SP		;KEEP IT A WHILE
	BEQ	6$		;IF ZERO OMIT UPDATE
	INC	R1		;NO CARRY POSSIBLE
6$:	DEC	2(SP)		;DECREMENT COUNTER
	BGT	3$		;BRANCH IF MORE TO DO
	ROR	R1		;SEE ABOUT THE LAST CYCLE
	BCS	7$		;OMIT CORRECTION IF ONE
	ADD	R2,R0		;CORRECT REMAINDER
	CLC
7$:	ROL	R1		;REPLACE THE LAST BIT
	CMP	(SP)+,(SP)+	;POP TWO WORDS
	TST	@SP		;TEST FOR REMAINDER CHANGES
	BGE	8$		;OMIT IF POSITVE
	NEG	R0		;NEGATE REMAINDER
	CLRB	1(SP)		;CLEAR SIGN
	DEC	@SP		;BUT DO A GOOD JOB ON QUOTIENT
8$:	CMP	#100000,R1	;TEST FOR THE BUG IN THE ALGORITHM
	BLO	12$		;EXIT WITH ERROR OF TOO BIG
	BEQ	11$		;CHECK FOR OVERFLOW
9$:	TST	(SP)+		;TEST FOR QUOTIENT ADJUSTMENT
	BEQ	10$		;IF ZERO NONE NEEDED
	NEG	R1
10$:	MOV	R0,R2		;SAVE REMAINDER
	MOV	R1,R0		;GET QUOTIENT
	MOV	R2,R1		;AND REMAINDER WHERE NEEDED
	CLC
	BR	13$		;EXIT WITH NO OVERFLOW
11$:	TST	@SP		;TEST FOR NEGATIVE
	BNE	9$		;IF NEGATIVE, OK
12$:	TST	(SP)+		;REMOVE SIGN WORD
	SEC			;MARK OVERFLOW
13$:	MOV	(SP)+,R3	;THIS CLEARS V-BIT
	MOV	(SP)+,R2
	MOV	R0,R0		;THIS SETS Z,N
	BCC	14$
	SEV
14$:	RTS	PC
	.ENDC
.ENDC


	.SBTTL PARAMETER TABLE OFFSETS
HTMNTM=0		;MIN VALUE TO CONSIDER (SP OR DP)
HTBINW=HTMNTM+DP	;BIN WIDTH
HTNOFB=HTBINW+DP	;# OF BINS
HTINCT=HTNOFB+DP	;# OF INPUT VALUES IN INPUT ARRAY
HTINIT=HTINCT+DP	;FIRST CALL FLAG. MUST BE ZERO ON FIRST CALL.
HTUNDR=HTINIT+DP	;UNDERFLOW BIN COUNTER
HTOVER=HTUNDR+DP	;OVERFLOW BIN COUNTER
HTBINO=HTOVER+DP	;NO. OF BINS WHICH HAVE OVERFLOWED.
HTEROR=HTBINO+DP	;ERROR INDICATOR
	.IF DF,FREQ$
HTZERO=HTEROR+DP	;ZEROTH HISTOGRAM FLAG
HTZRCT=HTZERO+DP	;# OF ELEMENTS IN ZEROETH HIST. ARRAY
HTTMSG=HTZRCT+DP	;TIME SEGMENT FOR ZEROETH HISTOGRAM
HTZRPT=HTTMSG+DP	;CURRENT POINTER INTO ZEROETH HISTOGRAM
RSPCT=HTZRPT+DP		;COUNT OF # OF RESPONSES AFTER STIMULUS.
ZERPTR=RSPCT+DP		;STORE ZEROETH HISTOGRAM POINTER
RUNSUM=ZERPTR+DP	;RUNNING SUM FOR TIME SEGMENT
OFFSET=1
	.IFF
OFFSET=0
	.ENDC			
MXKP=7*DP*OFFSET+HTEROR+DP	;MXKP=HTMNTM+HTBINW*HTNOFB
			;VALUES BETWEEN MXKP AND HTMXTM CAUSE THE
			;OVERFLOW BIN TO BE INCREMENTED.


	.SBTTL HISTI CALLING DISCRIPTION

;THE FORMAT OF THE FORTRAN CALL TO THIS ROUTINE SHOULD BE:

;CALL HISTI(ITABLE,INPUT,IHGRAM[,IZERO])

;WHERE
;"ITABLE" IS AN INTEGER ARRAY, DOUBLE PRECISION IF "DPREC$" WAS DEFINED
;   WHEN THE ROUTINE WAS ASSEMBLED, OF LENGTH 10, 17 IF "FREQ$" WAS
;   DEFINED WHEN THE ROUTINE WAS ASSEMBLED(SEE CONDITIONAL ASSEMBLY
;   PARAMETERS).  MOST OF THE ENTRIES ARE USED TO TRANSMIT TO THE
;   ROUTINE THE INFORMATION WHICH DESCRIBES HOW THE INPUT WILL BE
;   PROCESSED.  THE REMAINING ELEMENTS ARE USED BY THE ROUTINE ITSELF
;   FOR TEMPORARY STORAGE PERTINENT TO THE DATA STREAM.  THE ELEMENTS
;   WHICH THE USER MUST DEFINE ARE AS FOLLOWS:
;	ITABLE(1)  THIS VALUE INDICATES THE MINIMUM VALUE OF THE FIRST
;	    	   BIN.
;	ITABLE(2)  THIS ELEMENT SPECIFIES THE LENGTH OF EACH INTERVAL
;	ITABLE(3)  THIS VALUE SPECIFIES THE TOTAL NUMBER OF INTERVAL
;		   BINS.
;	ITABLE(4)  THIS ELEMENT SPECIFIES THE NUMBER OF DATA ELEMENTS,
;		   STARTING WITH THE FIRST ENTRY IN THE ARRAY, THAT
;		   SHOULD BE PROCESSED.
;	ITABLE(5)  THIS ELEMENT INDICATES THE INITIAL CALL TO THE
;		   SUBROUTINE BY THE USER SETTING IT TO ZERO(0). 
;		   FOR SUBSEQUENT CALLS, THE SUBROUTINE USES THIS
;		   ELEMENT FOR PROPER REENTERY AND THUS THE USER SHOULD
;		   NOT TAMPER WITH THIS ELEMENT BETWEEN SUBROUTINE CALLS
;		   FOR THE SAME DATA STREAM.
;   THESE ELEMENTS ARE USED BY THE ROUTINE TO REPORT INFORMATION TO THE
;   USER CONCERNING THE DATA COMPILATION PROCESS WHICH IS NOT PART OF 
;   THE HISTOGRAM PROPER WHICH IS BEING CONSTRUCTED.
;	ITABLE(6)  THIS ELEMENT IS USED BY THE ROUTINE TO REPORT THE
;		   COUNT IN THE UNDERFLOW BIN
;	ITABLE(7)  THIS ELEMENT IS USED BY THE ROUTINE TO REPORT THE
;		   COUNT IN THE OVERFLOW BIN.
;	ITABLE(8) THIS ELEMENT IS USED BY THE ROUTINE TO REPORT THE
;		   NUMBER OF BINS(OUTPUT ARRAY ELEMENTS) WHICH HAVE
;		   OVERFLOWED(GREATER THAN 2**16-1)
;	ITABLE(9) THIS ELEMENT IS USED BY THE ROUTINE TO REPORT ANY 
;		   ERRORS AS FOLLOWS:
;		   = 0  => NO ERRORS
;		   = N  => ITABLE(N) IS IN ERROR
;		   = -N => NOT ENOUGH ARGUMENTS IN CALL STATEMENT
;	!!! NOTE !!!
;		IF THE FIRST ARGUMENT IS OMITTED, AN M-TRAP ERROR WILL
;		OCCUR.
;
;   IF "HTZER" WAS NOT DEFINED THEN ITABLE(10) IS USED EXCLUSIVELY
;   BY THE ROUTINE.
;   IF "HTZER" WAS DEFINED THEN THE FOLLOWING ADDITIONAL PARAMETERS MUST
;   BE SUPPLIED:
;	ITABLE(10) THIS ELEMENT IS USED TO INDICATE WHETHER OR NOT
;		   A ZEROETH HISTOGRAM SHOULD BE PRODUCED.
;		   = 0 => DO NOT PRODUCE A ZEROETH HISTOGRAM
;		   = 1 => PRODUCE A ZEROETH HISTOGRAM
;	ITABLE(11) THIS ELEMENT SPECIFIES THE NUMBER OF ELEMENTS IN
;		   THE ARRAY BEING USED TO STORE THE ZEROETH HISTOGRAM
;		   (THE DIMENSION OF "IZERO" IN CALL STATEMENT)
;	ITABLE(12) THIS ELEMENT SPECIFIES THE LENGTH IN INPUT UNITS, OF
;		   AN INTERVAL FOR A ZEROETH HISTOGRAM BIN
;	ITABLE(13) THIS ELEMENT CONTAINS THE VALUE OF THE SUBSCRIPT OF
;		   THE LAST ELEMENT OF THE ZEROETH HISTOGRAM ARRAY WHICH
;		   WAS USED.  THUS, INITIALL IT SHOULD BE SET TO ZERO.
;		   THE ROUTINE WILL UPDATE THIS VALUE UPON RETURN AND 
;		   THE USER, MAY FURTHER CHANGE IT BEFORE REENTRY.
;	ITABLE(14) THIS ELEMENT CONTAINS THE CURRENT COUNT FOR THE
;		   ITABLE(13)+1ST ENTRY IN THE FREQUENCY HISTOGRAM.
;		   IT HAS NOT YET BEEN ENTERED INTO THE HISTOGRAM PROPER
;		   SINCE NOT ALL ENTRIES HAVE YET BEEN COUNTED.
;	ITABLE(15-17) ARE USED EXCLUSIVELY BY THE ROUTINE)
;	NOTE:
;	     IF "FREQ$" WAS DEFINED WHEN THE ROUTINE WAS ASSEMBLED,
;	     "ITABLE" MUST STILL BE DIMENSIONED TO 17 EVEN IF
;	     ITABLE(10)=0.  HOWEVER, IF ITABLE(10)=0, ITABLE(11-13)
;	     NEED NOT BE SET.
;
;"INPUT" IS AN INTEGER ARRAY, DOUBLE PRECISION IF "DPREC$" WAS DEFINED 
;   WHEN THE ROUTINE WAS ASSEMBLED, WHICH CONTAINS THE DATA TO BE
;   HISTOGRAMMED.  ITS LENGTH MUST BE AT LEAST THAT SPECIFIED BY
;   "ITABLE(4)".
;
;
;"IHGRAM" IS AN INTEGER ARRAY WHICH CONTAINS THE ACTUAL HISTOGRAM.
;   ITS LENGTH MUST BE AT LEAST THAT SPECIFIED BY "ITABLE(3)".  EACH
;   ELEMENT IN THE ARRAY IS CONSIDERED A BIN IN WHICH THE COUNT OF
;   THE NUMBER OF TIMES A VALUE IN THE INPUT ARRAY WAS OBSERVED TO BE
;   IN THE INTERVAL BETWEEN
;	ITABLE(1)+THE SUBSCRIPT OF THE ELEMENT MINUS ONE TIMES ITABLE(2)
;   			AND
;	ITABLE(1)+THE SUBSCRIPT OF THE ELEMENT TIMES ITABLE(2)
;
;
;IF "FREQ$" WAS DEFINED WHEN THE ROUTINE WAS ASSEMBLED  A N D 
;   ITABLE(10)=1, THEN THE FOLLOWING ARGUMENT MUST APPEAR IN THE CALLING
;   STATEMENT:
;"IZERO" IS AN INTEGER ARRAY WHICH CONTAINS THE ZEROETH HISTOGRAM.  ITS
;   LENGTH MUST BE AT LEAST THAT SPECIFIED BY "ITABLE(11)".  AN ELEMENT
;   IN THIS ARRAY IS CALCULATED BY COUNTING THE LEAST NUMBER OF 
;   SUCCESSIVE INPUT VALUES WHICH WHEN SUMMED TOGETHER PRODUCE A VALUE
;   GREATER THAN  ITABLE(12)*THE SUBSCRIPT OF THE ELEMENT, AND THEN
;   SUBTRACTING FROM THAT COUNT OF INPUT VALUES, ONE PLUS THE VALUE OF
;   THE PREVIOUS ARRAY ELEMENT.
;   UPON RETURN, THE USER WILL BE NOTIFIED BY ITABLE(13) OF HOW MANY
;   ELEMENTS IN THE ARRAY HAVE BEEN USED.  IF THE DATA IS TAKEN OUT OF
;   THE ARRAY BY THE USER, ITABLE(13) MAY BE ADJUSTED BEFORE REENTRY.
;   NOTE:
;        IF FEW ZEROETH HISTOGRAM ARRAY ELEMENTS ARE AVAILABLE THAN
;	 ARE REQUIRED, THE ROUTINE SIMPLY STOPS COMPUTING THE
;	 ZEROETH HISTOGRAM UNTIL CORRECTIVE ACTION IS TAKEN BY THE
;	 USER. ITABLE(13) WILL REFLECT THE NUMBER OF ELEMENTS LOST,
;	 .I.E,ITABLE(13)-ITABLE(11).
	.SBTTL INTERVAL HISTOGRAMMING CODE BEGINS
	.ENABL	LSB
HISTI:	MOV	R5,R0		;SAVE INPUT LIST POINTER
	MOVB	(R0),R1		;GET NO. OF ARGUMENTS
	BNE	SOME		;IF SOME, CONTINUE
;  !!! NOTE INTENTIONAL M-TRAP ERROR IF FIRST ARGUMENT IS OMITTED
TRAPER:	MOV	R5,1		;M-TRAP IF FIRST ARGUMENT IS OMITTED
;
ARGERR:	MOV	(SP)+,R1	;POP STACK FIRST ON ARGUMENT ERROR
ERRET:	MOV	R1,HTEROR(R5)	;RECORD ERROR TYPE
	RTS	PC		;AND RETURN
SOME:	TST	(R0)+		;POINT TO ADDRESS OF PARAMETER TABLE
	MOV	#-1,-(SP)	;NEED FOR DEFAULTED ARG CHECKING
	MOV	(R0)+,R5	;GET PARAMETER TABLE ADDRESS
	CMP	R5,@SP		;CHECK FOR DEFAULTED ARGUMENT
	BEQ	TRAPER		;IF DEFAULTED, GO M-TRAP
	CLR	HTEROR(R5)	;CLEAR ERROR INDICATOR
	SUB	#3,R1
	BMI	ARGERR		;IF NOT AT LEAST THREE, RETURN WITH ERR
	MOV	(R0)+,R3	;GET INPUT ARRAY ADDRESS
	CMP	R3,@SP		;CHECK FOR DEFAULTED ARGUMENT
	BEQ	ARGERR		;IF DEFAULTED, GO INDICATE ERROR
	MOV	(R0)+,R4	;GET OUTPUT BINS ARRAY ADDRESS
	CMP	R4,@SP		;CHECK FOR DEFAULTED ARGUMENT
	BEQ	ARGERR		;IF DEFAULTED, GO INDICATE ERROR
	MOV	HTINCT(R5),R2	;GET INPUT COUNT
	BGT	1$		;IF POSITIVE, BRANCH
	MOV	#HTINCT/DP+1,@SP ;INDICATE INPUT COUNT ERROR
	BR	ARGERR		;GO REPORT ERROR
1$:	.IF	DF,FREQ$
	TST	HTZERO(R5)		;CHECK IF ZEROETH HISTOGRAM
	BEQ	BRANCH		;IF NO, BRANCH
	CMP	(R0),@SP		;CHECK FOR DEFAULTED ARGUMENT
	BEQ	ARGERR		;IF DEFAULTED, GO INDICATE ERROR
	DEC	R1		;CHECK IF THERE WERE ENOUGH ARGUMENTS
	BMI	ARGERR		;IF NOT, RETURN WITH ERROR
	MOV	(R0)+,ZERPTR(R5)	;OTHERWISE SAVE ADDRESS
	.ENDC
BRANCH:	TST	(SP)+		;POP STACK
	TST	HTINIT(R5)	;CHECK IF FIRST CALL
	BNE	PROCES		;IF NOT, B+C
	MOV	HTNOFB(R5),R1	;GET NO.OF BINS
	BGT	5$		;CHECK FOR GREATER THAN ZERO
	MOV	#HTNOFB/DP+1,R1	;OTHERWISE, INDICATE PROBLEM
	BR	ERRET		;AND LEAVE
5$:	MOV	R4,R0		;GET ADDRESS OF BINS
6$:	CLR	(R0)+		;CLEAR ALL COUNTERS
	DEC	R1
	BNE	6$
	MOV	HTBINW(R5),R0	;CALCULATE MAX VALUE TO KEEP
	BNE	40$
	.IF	DF,DPREC$
	TST	HTBINW+2(R5)	;
	BNE	41$
	.ENDC
	MOV	#HTBINW/DP+1,R1	;IF BINWIDTH EQUALS 0 INDICATE ERROR
	BR	ERRET
40$:	$MUL	HTNOFB(R5),R0	;HTBINW*HTNOFB
	.IF DF DPREC$
41$:	MOV	R0,-(SP)	;SAVE R0,R1
	MOV	R1,-(SP)
	MOV	HTBINW+2(R5),R0
	$MUL	HTNOFB(R5),R0
	.IFTF
	TST	R0		;CHECK FOR OVERFLOW
	BNE	7$
	.IFT
	MOV	R1,R0
	MOV	(SP)+,R1
	ADD	(SP)+,R0
	BCS	7$
	.IFTF
	ADD	@R5,R1		;MXKP=HTMNTM+HTBINW*HTNOFB
	.IFT
	ADC	R0
	ADD	HTMNTM+2(R5),R0
	MOV	R0,MXKP+2(R5)	;HIGH ORDER PART
	.ENDC
	BCC	9$
7$:	MOV	#1,R1		;OVERFLOW ON MAX CALCULATION
	BR	ERRET		;INDICATE ERROR AND LEAVE
9$:	MOV	R1,MXKP(R5)		;LOW ORDER PART
	.IF	DF,FREQ$
	TST	HTZERO(R5)	;CHECK FOR ZEROTH HISTOGRAM
	BEQ	12$		;IF NON, BRANCH
	TST	HTZRCT(R5)	;CHECK Z.H. ARRAY LENGTH INDICATOR
	BGT	10$		;IF ALRIGHT CONTINUE
	MOV	#HTZRCT/DP+1,R1	;OTHERWISE, INDICATE ERROR
	BR	ERRET		;AND RETURN
10$:	.IF	DF,DPREC$
	TST	HTTMSG+2(R5)	;TEST FOR PROPER MEASURE SEGMENT
	BGT	11$		;IF NON-ZERO AND POSITIVE, CONTINUE
	BMI	14$		;IF NEG, ERROR
	.ENDC
 	TST	HTTMSG(R5)	;ALSO, CHECK Z.H. INTERVAL LENGHT
	BNE	11$		;IF ALRIGHT CONTINUE
14$:	MOV	#HTTMSG/DP+1,R1	;OTHERWISE, INDICATE ERROR AND 
	BR	ERRET		; LEAVE
11$:	CLR	RSPCT(R5)	;CLEAR COUNT OF RSPNSES AFTER STIMULI
	CLR	HTZRPT(R5)	;CLEAR 0TH HISTOGRAM CNT
	CLR	RUNSUM(R5)	;STARTS AT 0
	.IF	DF,DPREC$
	CLR	RUNSUM+2(R5)
	.ENDC
	.ENDC
12$:	INC	HTINIT(R5)	;INDICATE FIRST CALL SUCCESSFUL
	CLR	HTOVER(R5)
	CLR	HTUNDR(R5)
	CLR	HTBINO(R5)
	.DSABL	LSB

.SBTTL INCREMENT PROPER BIN
;THIS SECTION TAKES THE INPUT VALUE AND DOES THE FOLLOWING:
;1. IF < HTMNTM, INC UNDERFLOW
;2. IF > MXKP, INC OVERFLOW (MXKP=HTMNTM+HTBINW*HTNOFB)
;3. DETERMINE NORMAL BIN TO INC
;4. IF ANY BIN OVERFLOWS, INC BIN OVERFLOW FLAG
;R0 = TEMP
;R1   INPUT VALUE
;R2 = # OF WORDS IN INPUT BUFR.
;R3 -> INPUT BUFR
;R4 -> OUTPUT BUFR 1ST BIN
;R5 -> START OF PARAMETER TABLE

	.ENABL LSB
PROCES:	MOV	(R3)+,R1
	.IF DF FREQ$
	TST	HTZERO(R5)
	BEQ	4$
	ADD	R1,RUNSUM(R5)	;RUNNING SUM OF TIMES
	.IF	DF,DPREC$
	ADC	RUNSUM+2(R5)
	ADD	@R3,RUNSUM+2(R5)
40$:	CMP	RUNSUM+2(R5),HTTMSG+2(R5)
	BLT	41$		;IF LESS THAN MEASURE SEGMENT, BRANCH
	BGT	42$		;IF GREATER THAN MEASURE SEGMENT,BRANCH
	.IFF
40$:
	.ENDC
	CMP	RUNSUM(R5),HTTMSG(R5) ;IS RUNSUM.GE.HTTMSG?
	BLO	41$
42$:	SUB	HTTMSG(R5),RUNSUM(R5) ;YES,RESET RUNNING SUM &
	.IF	DF,DPREC$
	SBC	RUNSUM+2(R5)
	SUB	HTTMSG+2(R5),RUNSUM+2(R5)
	.ENDC
	INC	HTZRPT(R5)	;INCREMENT 0TH HISTOGRAM CNT
	MOV	HTZRPT(R5),R0	;GET ADDRESS OF ZEROETH
	CMP	R0,HTZRCT(R5)	;CHECK IF STILL ENOUGH ROOM
	BGT	1$		;IF NOT, KEEP GOING BUT DON'T STORE DATA
	ASL	R0		;GET BYTES OFSET
	ADD	ZERPTR(R5),R0	;GET ADDRESS +2
	MOV	RSPCT(R5),-2(R0)	;STORE RESPONSE COUNT
1$:	CLR	RSPCT(R5)	;RESET TO 0
	BR	40$		;GO CHECK IF IN RIGHT FREQUENCY HISTOGRAM BIN
41$:	INC	RSPCT(R5)	;COUNT OF SPIKES IN TIME SEGMENT
	.ENDC
4$:	.IF DF DPREC$
	CMP	@R3,HTMNTM+2(R5) ;IF<HTMNTM, INC UNDERFLOW
	BHI	6$		;VALUE > HTMNTM
	BLO	5$		;VALUE < HTMNTM
	.IFTF
	CMP	R1,@R5		;HIGH =, CMP LOW PARTS
	BHIS	6$
5$:	INC	HTUNDR(R5)	;UNDERFLOW CTR
	BR	CHECK
6$:	.IFT
	CMP	@R3,MXKP+2(R5)	;IF .GE. MXKP, INC OVERFLOW
	BHI	9$
	BLO	10$
	.IFTF
	CMP	R1,MXKP(R5)
	BLO	10$
9$:	INC	HTOVER(R5)	;OVERFLOW CTR
	JMP	CHECK
10$:	SUB	@R5,R1		;DETERMINE WHICH BIN TO INC
	.IFT
	MOV	@R3,R0		;HIGH ORDER PART
	SBC	R0
	SUB	HTMNTM+2(R5),R0	;HIGH ORDER PART
	.IFF
	CLR	R0		;S.P. DIV
	.IFT
	TST	HTBINW+2(R5)	;CHECK FOR D.P. BINWIDTH
	BEQ	SDIV
DDIVD:	MOV	R2,-(SP)
	MOV	R3,-(SP)
	MOV	R4,-(SP)
	MOV	R5,-(SP)	;SAVE R2-R5
	MOV	HTBINW+2(R5),R2
	MOV	HTBINW(R5),R3
	MOV	#32.,-(SP)	;GET LOOP COUNT
	CLR	R4		;READY REMAINDER(R4+R5)
	CLR	R5
	.ENABL	LSB
1$:	ROL	R1
	ROL	R0		;EXPOSE NEW BIT OF NEWMERATOR
	ROL	R4
	ROL	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, CHECK 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			;INDECATE NEW QUOTIENT BIT
3$:	DEC	(SP)		;CHECK LOOP COUNT
	BGE	1$		;IF MORE TO COME B+C
	TST	(SP)+		;UP SP
	MOV	(SP)+,R5	;RESTORE R5
	MOV	(SP)+,R4
	MOV	(SP)+,R3
	MOV	(SP)+,R2
	MOV	R1,R0
	BR	NDIV
	.ENDC
SDIV:	$DIV	HTBINW(R5),R0	;(VALUE-HTMNTM)/HTBINW
NDIV:	ASL	R0		;MAKE WORD INDEX
	ADD	R4,R0
	INC	@R0
CHECK:	BNE	14$		;DID ANY INC CAUSE AN OVERFOW
	INC	HTBINO(R5)	;YES, BIN OVERFLOW FLAG
14$:	.IIF DF DPREC$ TST (R3)+ ;BUMP INPUT PTR
	DEC	R2
	BNE	PROCES		;LOOP UNTIL ALL INPUT GONE
	RTS	PC

	.END