File: PHAMPL.MC of Tape: Various/ETH/eth11-2
(Source file text)
.TITLE THE PHASE/AMPLITUDE SPECTRA SUBROUTINE(PHAMPL) ;LABORATORY SUBROUTINES ;DEC-11 ;FILENAME PHAMPL.MAC ;FILE ID PHAMPL.1 .CSECT FPHAMP ; 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 CONDITIONALS ;CONDITIONAL ASSEMBLY PARAMETERS ; DEFINE PARAMETERS BY REMOVING FIRST ";" IN LINE WHICH ; PRECEEDS THE APPROPRIATE PARAMETER. ;EIS=1 ;EAE=1 ;F4P$=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". ;F4P$ "F4P$" SHOULD BE DEFINED IF THIS SUBROUTINE WILL BE USED WITH ; THE FORTRAN IV+ OBJECT TIME SYSTEM(OTS) LIBRARY. ; SPECIFICALLY IT MUST BE DEFINED WHEN USED WITH ROUTINES ; COMPILED WITH THE FORTRAN IV+ COMPILER. ; ASK YOUR SYSTEM MANAGER WHICH FORTRAN IS BEING USED IN YOUR ; INSTALLATION IF YOU ARE NOT SURE. ;GLOBALS ; -INTERNAL .GLOBL PHAMPL ; -EXTERNAL .IIF NDF,F4P$ .GLOBL FLOAT,SQRT,ATAN2 .IIF DF,F4P$ .GLOBL $FLOAT,$SQRT,$ATAN2 ;REGISTER DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;MACROS ; -PROGRAM ;MULTIPLY MACRO .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 MFLOAT .IIF DF,F4P$ JSR PC,$FLOAT .IIF NDF,F4P$ JSR PC,FLOAT .ENDM .MACRO MATAN2 .IIF DF,F4P$ JSR PC,$ATAN2 .IIF NDF,F4P$ JSR PC,ATAN2 .ENDM .MACRO MSQRT .IIF DF,F4P$ JSR PC,$SQRT .IIF NDF,F4P$ JSR PC,SQRT .ENDM .SBTTL MULR0 .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 .ENDC .SBTTL FORTRAN CALLING SEQUENCE ; THE FORTRAN CALL TO THE PHASE AND AMPLITUDE SPECTRUM SUBROUTINE ; SHOULD TAKE THE FOLLOWING FORM ; CALL PHAMPL(N,IR,IM,PH,AM) ; WHERE ; N IS AN INTEGER THAT DEFINES THE LENGTH OF THE INPUT AND OUTPUT ; ARRAYS ; IR IS AN INTEGER ARRAY CONTAINING THE REAL PARTS OF THE COMPLEX ; VALUES TO BE CONVERTED ; IM IS AN INTEGER ARRAY CONTAINING THE IMAGINARY PARTS OF THE ; COMPLEX VALUES TO BE CONVERTED ; PH IS A REAL ARRAY IN WHICH THE SUBROUTINE STORES THE ; PHASE ANGLE SPECTRUM, I.E. ; PH(I)= ATAN2(FLOAT(IM(I))/FLOAT(IR(I))) ; WHERE "FLOAT" AND "ATAN2" ARE ROUTINES IN THE FORTRAN ; LIBRARY. ; AM IS A REAL ARRAY IN WHICH THE SUBROUTINE STORES THE AMPLITUDE ; SPECTRUM, I.E., ; AM(I)= SQRT(FLOAT(IR(I)*IR(I)+IM(I)*IM(I))) ; WHERE "FLOAT" AND "SQRT" ARE ROUTINES IN THE FORTRAN ; LIBRARY. ; !!! NOTE !!! ; IF ANY ARGUMENT IN THE CALL IS OMITTED, THE SUBROUTINE WILL ; CAUSE A TRAP THRU 4 ERROR. .SBTTL PHASE/AMPLITUDE ENTRY POINT .SBTTL CALCULATE PHASE ANGLES PHAMPL: CMPB #5,@R5 ;CHECK FOR CORRECT NUMBER OF ARGUMENTS BLE 1$ ;IF CORRECT, RETURN ; !!! NOTE INTENTIONAL TRAP OUT FOR NOT ENOUGH ARGUMENTS MOV R5,1 ;IF NOT ENOUGH ARGUMENTS, TRAP-OUT ; 1$: TST (R5)+ ;GET FIRST ADDRESS MOV @(R5)+,-(SP) ;GET TWO COPIES OF COUNT ; NOTE: THE PREVIOUS STATEMENT WILL ; CAUSE A TRAP ERROR IF THE ; REQUIRED ARGUMENT WAS DEFAULTED. MOV (SP),(PC)+ ;SAVE ONE COPY OF THE COUNT COUNT: .WORD 0 ; HERE. MOV (R5)+,R2 ;GET TWO COPIES OF REAL ARRAY ADDRESS MOV R2,-(SP) ; SAVE ONE ON THE STACK MOV (R5)+,R3 ;DO THE SAME FOR THE IMAGINARY ARRAY MOV R3,-(SP) MOV (R5)+,R4 ;GET THE ADDRESS FOR THE PHASE ANGLES MOV (R5)+,-(SP) ;SAVE THE ADDRESS FOR THE AMPLITUDES MOV COUNT,-(SP) ;POINT STACK AT A COPY OF THE COUNT 2$: MOV (R2)+,IRH ;GET THE NEXT REAL ; NOTE: THE PREVIOUS STATEMENT WILL ; CAUSE A TRAP ERROR IF THE ; REQUIRED ARGUMENT WAS DEFAULTED. MOV (R3)+,IMH ; AND IMAGINARY VALUE ; NOTE: THE PREVIOUS STATEMENT WILL ; CAUSE A TRAP ERROR IF THE ; REQUIRED ARGUMENT WAS DEFAULTED. MOV R2,-(SP) ;SAVE ALL ADDRESS POINTERS MOV R3,-(SP) MOV R4,-(SP) MOV #FLOT1,R5 ;FLOAT THE REAL PART MFLOAT MOV R1,IRL ;STORE THE FLOATED REAL RESULTS MOV R0,IRH MOV #FLOT2,R5 ;FLOAT THE IMAGINARY PART MFLOAT MOV R1,IML ;STORE THE FLOATED IMAGINARY RESULTS MOV R0,IMH MOV #ATAN2L,R5 ;TAKE THE ARCTAN OF IMAGINARY/REAL MATAN2 MOV (SP)+,R4 ;RESTORE THE ADDRESS POINTERS MOV (SP)+,R3 MOV (SP)+,R2 MOV R0,(R4)+ ;STORE THE NEXT PHASE ANGLE RESULTS ; NOTE: THE PREVIOUS STATEMENT WILL ; CAUSE A TRAP ERROR IF THE ; REQUIRED ARGUMENT WAS DEFAULTED. MOV R1,(R4)+ DEC (SP) ;LOOP THROUGH THE ARRAY BNE 2$ .SBTTL COMPUTE AMPLITUDES TST (SP)+ ;POP STACK MOV (SP)+,R4 ;GET COPY OF ADDRESS FOR AMPLITUDES MOV (SP)+,R3 ;GET COPY OF ADDRESS FOR IMAGINARY PART MOV (SP)+,R2 ;GET COPY OF ADDRESS FOR REAL PART ;LEAVE STACK POINTING AT COPY OF COUNT 13$: MOV (R3)+,R0 ;GET NEXT IMAGINARY VALUE $MUL R0,R0 ; SQUARE IT MOV R0,-(SP) ; STORE THE HIGH MOV R1,-(SP) ; AND THEN THE LOW PARTS MOV (R2)+,R0 ;GET NEXT REAL VALUE $MUL R0,R0 ; SQUARE IT ADD (SP)+,R1 ;ADD LOW OF SQUARED IMAG. TO LOW OF REAL ADC R0 ; AND THEN ADD (SP)+,R0 ;ADD HIGHS OF THE SQUARES MOV R2,-(SP) ;SAVE ADDRESS POINTERS MOV R3,-(SP) MOV R4,-(SP) ;DO A DOUBLE INTEGER FLOAT TST R1 ;TEST LOW PART BNE 11$ ;BRANCH IF NOT 0 MOV R0,R2 ;IS ENTIRE NUMBER 0 BEQ 7$ ;BRANCH IF YES 11$: MOV R0,R2 ;GET HIGH PART BPL 12$ ;BRANCH IF POSITIVE NEG R2 ;NEGATE HIGH PART, C=1 NEG R1 ;NEGATE LOW PART SBC R2 12$: MOV #237,R3 ;SET MAXIMUM EXP+1 3$: BIT #177400,R2 ;LOOK FOR A STRING OF 8 0 BITS BNE 5$ ;BRANCH IF NOT FOUND SWAB R2 ;LEFT JUSTIFY THEM SUB #8.,R3 ;PERFORM A SHIFT BY 8 SWAB R1 BISB R1,R2 ;INSERT NEW BITS CLRB R1 ;REMOVE THEM BR 3$ ;TRY AGAIN 4$: DEC R3 ;FIX EXP COUNT ROL R1 ;NORMALIZE R2:R1 ROL R2 5$: BPL 4$ ;LOOP TILL IMPLIED NORM BIT IN SIGN CLRB R1 ;REMOVE THE BITS FROM 2ND WORD BISB R2,R1 ;MOVE THE NEW ONES IN FROM R2 SWAB R1 ;JUSTIFY IT CLRB R2 ;REMOVE THEM FROM HIGH WORD SWAB R2 ;JUSTIFY IT SWAB R3 ;GET EXP INTO HIGH BYTE TST R0 ;WAS ORIGINAL NUMBER + OR - BPL 6$ ;BRANCH IF POSITIVE, C=0 SEC 6$: ROR R3 ;INSERT WITH EXP ADD R3,R2 ;CREATE RESULT 7$: MOV R2,IRH ;STORE RESULTS MOV R1,IRL MOV #FLOT1,R5 ;TAKE THE SQUARE ROOT MSQRT MOV (SP)+,R4 ;RESTORE ADDRESSES MOV (SP)+,R3 MOV (SP)+,R2 MOV R0,(R4)+ ;STORE THE RESULTING AMPLITUDE ; NOTE: THE PREVIOUS STATEMENT WILL ; CAUSE A TRAP ERROR IF THE ; REQUIRED ARGUMENT WAS DEFAULTED. MOV R1,(R4)+ DEC (SP) ;LOOP TILL DONE BNE 13$ TST (SP)+ ;POP STACK RTS PC ;RETURN FLOT1: 1 ;ADDRESS AREA FOR CALL TO FLOAT AND SQRT IRH FLOT2: 1 ;SECOND ADDRESS AREA FOR CALLS TO FLOAT IMH ATAN2L: 2 ;ADDRESS AREA FOR CALL TO ATAN2 IMH IRH IRH: .WORD 0 ;SCRATCH SPACE FOR FORTRAN LIBRARY CALLS IRL: .WORD 0 IMH: .WORD 0 IML: .WORD 0 .END