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

.TITLE THE POWER SPECTRUM SUBROUTINE(POWRSP)
;LABORTORY SUBROUTINES
;DEC-11
;FILENAME POWRSP.MAC
;FILE ID POWRSP.1

.CSECT	FPOWRS









;			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
.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".



	;GLOBALS
	;	-INTERNAL

	.GLOBL	POWRSP


	;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



	.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 POWER SPECTRUM SUBROUTINE SHOULD TAKE
; THE FOLLOWING FORM

; CALL POWRSP(N,IR,IM,P)

;WHERE
;	N IS AN INTEGER VALUE SPECIFYING THE NUMBER OF POINTS IN
;	  ARRAYS IR,IM, AND P
;	IR IS AN INTEGER ARRAY CONTAINING THE REAL PARTS OF THE
;	   COMPLEX FOURIER TRANSFORM RESULTS
;	IM IS AN INTEGER ARRAY CONTAINING THE IMAGINARY PARTS OF THE
;	   COMPLEX FOURIER TRANSFORM RESULTS
;	P IS A REAL ARRAY WHERE THE SUBROUTINE WILL RETURN THE 
;	  POWER SPECTRUM RESULTS
;  !!!NOTE!!
;	IF ANY ARGUMENT IN THE SUBROUTINE CALL IS OMITTED OR DEFAULTED
;	THE SUBROUTINE WILL CAUSE A FATAL ERROR. M-TRAP THRU 4.
	.SBTTL POWRSP ENTRY AND PROCESSING

POWRSP:	CMPB	#4,@R5		;CHECK FOR CORRECT NUMBER OF ARGUMENTS
	BLE	1$		;IF CORRECT, RETURN

;  !!! NOTE INTENTIONAL TRAP ON MISSING ARGUMENTS !!!
	MOV	R5,1		; MUST HAVE CORRECT NO. OF ARGUMENTS
;
1$:	TST	(R5)+		;GET FIRST ADDRESS
	MOV	@(R5)+,-(SP)	;GET TWO COPIES OF COUNT. NOTE, THIS
				; STATEMENT WILL TRAP IF COUNT DEFAULTED
	MOV	(SP),-(SP)	;SAVE COUNT ADDRESS
	MOV	(R5)+,R2	;SAVE THE ADDR OF THE REAL PART.
	MOV	(R5)+,R3	;SAVE THE ADDR OF THE IMAGINARY PART
	MOV	(R5)+,R4	;SAVE THE ADDRESS FOR THE RESULTS
2$:	MOV	(R2)+,R0	;GET THE NEXT REAL PART
				; NOTE: PREVIOUS STATEMENT WILL TRAP OUT
				;       IF ARGUMENT WAS DEFAULTED.
	$MUL	R0,R0		; SQUARE IT
	MOV	R0,(R4)+	; AND STASH THE HIGH PART OF THE RESULTS
				; NOTE: PREVIOUS STATEMENT WILL TRAP OUT
				;       IF ARGUMENT WAS DEFAULTED.
	MOV	R1,(R4)		; AND THEN THE LOW PART
	MOV	(R3)+,R0	;GET THE NEXT IMAGINARY PART
				; NOTE: PREVIOUS STATEMENT WILL TRAP OUT
				;       IF ARGUMENT WAS DEFAULTED.
	$MUL	R0,R0		; SQUARE IT
	ADD	R1,(R4)+	; AND ADD THE LOW
	ADC	R0		; AND THEN
	ADD	R0,-4(R4)	; THE HIGH PARTS TO THE REAL SQUARED
	DEC	(SP)		;LOOP UNTIL WHOLE ARRAY IS PROCESSED
	BNE	2$

; NOW CHANGE DOUBLE INTEGER RESULTS TO FLOATING POINT, 
;	BACKWARDS THROUGH THE ARRAY

	TST	(SP)+		;POINT STACK AT SECOND COPY OF COUNT
13$:	MOV	-(R4),R1	;TEST LOW PART
	BNE	11$		;BRANCH IF NOT 0
	MOV	-(R4),R2	;IS ENTIRE NUMBER 0
	BEQ	7$		;BRANCH IF YES
	BR	21$
11$:	MOV	-(R4),R2	;GET HIGH PART
21$:	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	(R4)		;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,(R4)		;STORE RESULTS
	MOV	R1,2(R4)		
	DEC	(SP)		;LOOP THROUGH ARRAY
	BNE	13$
	TST	(SP)+		;POP STACK
	RTS	PC		;RETURN
	.END