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