C*******--PDP-11 AUTOCORRELATION ASSEMBLER GENERATOR************ C GENERATES INLINE AUTOCORRELATION PROGRAM C FOR PDP-11/34,40,45,55,70 AND LSI/11 C --I.E., USING 'MUL' AND 'ASHC' INSTRUCTION-- C WRITES FILE NAMED 'AUTO.INL' ON SY0. C USES PFIEFER/BLANKINSHIP AUTOCORRRELATION ALGORITHM C WITH RESTRICTION THAT P<0.5N, N=# POINTS,P=#LAGS. C EXAMPLE OF USE OF 'AUTO.INL': C FOR N=128,P+1=10, MAIN PROG HAS INTEGER IR(20), C INTEGER*4 IIR(10),EQUIVALENCE (IR(1),IIR(1)) C COMMON /YY/IX(128), AND THEN CALL AUTO(IR(1)). C OUTPUT IS DOUBLE INTEGER WITH HIGH 16 BITS IN EVEN C POSITIONS AND LOW 16 BITS IN ODD POSITIONS OF ARRAY IR. C ALTERNATIVELY, THE DOUBLE INTEGER ARRAY IIR MAY BE CONVERTED C TO FLOATING POINT AND THE RESULTANT NUMBERS ENTERED INTO C AN AUTOCORRELATION MATRIX SOLUTION. RESULTS ARE NORMALIZED C SUCH THAT 2**14<16 MSB'S OF R(0)<2**15-1. C GENERATED PROGRAM REQUIRES ABOUT N(5+4.5P) MEMORY LOCATIONS C AND EXECUTES IN K[N(4.95+3.45P)+5.55P] USEC, C WHERE K=1 FOR 11/55 (BIPOLAR), K=3 FOR 11/34,40, AND C K=9 FOR LSI 11. DIMENSION INAM(6) DATA INAM(1),INAM(2),INAM(3),INAM(4),INAM(5),INAM(6), + IUNIT/2HSY,2H0:,2HAU,2HTO,2H.I,2HNL,5/ CALL ASSIGN(IUNIT,INAM(1),12) C WRITE(7,700) 700 FORMAT(1X,'INPUT NUMBER OF POINTS, FORMAT I4') READ(7,701) N 701 FORMAT(I4) WRITE(7,702) 702 FORMAT(1X,'INPUT NUMBER OF LAGS, FORMAT I2') READ(7,703) M 703 FORMAT(I2) MP1=M+1 C GENERATE INITIALIZATION,MACRO KERNEL DEFINITION CODE WRITE(5,800) WRITE(5,810) WRITE(5,820) WRITE(5,830) WRITE(5,840) C USE REPEAT MACRO TO GENERATE CODE FOR ZERO LAG WRITE(5,850) N C GENERATE IN-LINE CODE FOR LAG 1,2,..,P (MP1-1) DO 50 JJ=2,MP1 NDEL=JJ-1 NQ=N/(2*NDEL) NN=2*NDEL*NQ IF (NN.NE.N) NQ=NQ+1 C GENERATE CODE TO CLEAR R2,R3 FOR 32 BIT RUNNING SUM WRITE(5,855) DO 60 JK=1,NQ JL=JK-1 NB1=NDEL*(2*JL+1) NB2=NDEL*(2*JL) NB3=NDEL*(2*JL+2) DO 61 I=1,NDEL N1=NB1+I N2=NB2+I N3=NB3+I IN1=N1+N1-2 IN2=N2+N2-2 IN3=N3+N3-2 C GENERATE ONE OF TWO AUTOCORRELATION KERNELS IF NECESSARY IF (N2.GE.N) GO TO 60 IF (N3.LE.N) WRITE(5,860) IN2,IN3,IN1 IF (N1.GT.N) GO TO 60 IF (N3.GT.N) WRITE(5,870) IN2,IN1 61 CONTINUE 60 CONTINUE C GENERATE CODE TO SCALE 32 BIT RESULT C AND SAVE 16 MSB'S IN OUTPUT ARRAY WRITE(5,880) 50 CONTINUE WRITE(5,890) WRITE(5,910) END FILE 5 STOP 800 FORMAT(9X,'.TITLE AUTO',/9X,'.GLOBL AUTO',/9X,'.IRPC X,0123456' + ,/9X,'R''X=%''X',/9X,'.ENDM',/9X,'.CSECT YY',/9X,'IX=.',/9X, + '.CSECT',/9X,'PC=%7',/) 810 FORMAT(9X,'.MACRO SUMSQ',/9X,'MOV (R0)+,R4',/9X,'MUL R4,R4' + ,/9X,'ADD R5,R3',/9X,'ADC R4',/9X,'ADD R4,R2',/9X,'.ENDM',/) 820 FORMAT(9X,'.MACRO CORR0 A1,A2,A3',/9X,'MOV A1,R4',/9X, + 'ADD A2,R4',/9X,'MUL A3,R4',/9X,'ADD R5,R3',/9X, + 'ADC R4',/9X,'ADD R4,R2',/9X,'.ENDM',/) 830 FORMAT(9X,'.MACRO CORR1 A1,A2',/9X,'MOV A1,R4',/9X, + 'MUL A2,R4',/9X,'ADD R5,R3',/9X,'ADC R4',/9X, + 'ADD R4,R2',/9X,'.ENDM',/) 840 FORMAT(1X,'AUTO:',/9X,'MOV R5,-(R6)',/9X,'MOV 2(R5),R1',/9X, + 'CLR R2',/9X,'CLR R3',/9X,'MOV #IX,R0') 850 FORMAT(9X,'.REPT ',O6,/9X,'SUMSQ',/9X,'.ENDM',/9X,'MOV R2,R4', + /9X,'MOV R3,R5',/9X,'CLR R0',/1X,'T1:',/9X,'ASHC #1,R2',/9X, + 'INC R0',/9X,'BCC T1',/9X,'SUB #2,R0',/9X,'MOV R0,-(R6)', + /9X,'ASHC R0,R4',/9X,'MOV R5,(R1)+',/9X,'MOV R4,(R1)+') 855 FORMAT(/,9X,'CLR R2',/9X,'CLR R3') 860 FORMAT(9X,'CORR0 ,,') 870 FORMAT(9X,'CORR1 ,') 880 FORMAT(9X,'ASHC (R6),R2',/9X,'MOV R3,(R1)+',/9X,'MOV R2,(R1)+') 890 FORMAT(9X,'TST (R6)+',/9X,'MOV (R6)+,R5',/9X,'RTS PC',/) 910 FORMAT(9X,'.END',/) END