Trailing-Edge
-
PDP-10 Archives
-
AP-D480B-SB_1978
-
forcpx.mac
There are 3 other files named forcpx.mac in the archive. Click here to see a list.
TITLE FORCPX %4.(235) COMPLEX FUNCTION MODULE FOR FOROTS
SUBTTL D. TODD /DRT/HPW 11-DEC-73
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
;FROM V.32(425)
;FROM V.021 26-SEP-69
;FROM V.32(415) LIB40
;COMPLEX EXP2 FUNCTION.
;THIS ROUTINE CALCULATES A COMPLEX NUMBER TO
;AN INTEGER POWER.
;THE BASIC ALGORITHM USED IS:
; Z**B=(R**B)*[COS(B*TH)+I*SIN(B*TH)]
;WHERE Z=X+I*Y, R=/Z/, AND TH=ATAN2(Y,X).
;THE CALLING SEQUENCE IS:
; MOVEI 16,POWER
; PUSHJ 17,CEXP.2
;WHERE POWER IS THE ADDRESS OF THE INTEGER POWER,
;AND THE BASE IS IN AC'S 0 AND 1. THE COMPLEX
;RESULT IS RETURNED IN AC'S 0 AND 1.
;BECAUSE SIN AND COS MUST PERFORM A RANGE REDUCTION
;ON THEIR ARGUMENTS, FOR LARGE B*TH THEY WILL
;RETURN ANSWERS OF ZERO.
SEARCH FORPRM
IFN F40LIB,<ENTRY CEXP.2>
IFN F10LIB,<ENTRY CEXP2.>
IFN F10LIB,<
SIXBIT /CEXP2./
CEXP2.: DMOVE T0,@(L) ;GET THE BASE
MOVEI L,@1(L) ;POINT TO THE POWER
IFN F40LIB,<
JRST CEXP.2 ;GO TO THE COMMON ROUTINE
>>
IFN F40LIB,<
SIXBIT /CEXP.2/ ;F40 ENTRY POINT
CEXP.2:
>
MOVEM 0,SAVEXL ;SAVE X IN SAVEX.
MOVEM 1,SAVEYR ;SAVE Y IN SAVEYR.
JUMPN 0,ZNONZR ;JUMP AHEAD UNLESS
JUMPN 1,ZNONZR ;Z=(0,0).
MOVE 1,(16) ;PICK UP B IN AC 1.
SETZ 0, ;SET REAL (ANS.)=0 UNLESS
JUMPGE 1,.+4 ;B < 0, IN WHICH CASE
ERROR (APR,5,1,.+1) ;MESSAGE AND REAL (ANS)=
HRLOI 0,377777 ;+ INFINITY.
SETZ 1, ;IMAG (ANS)=0.
POPJ 17, ;RETURN.
ZNONZR: MOVE 0,(16) ;PICK UP B IN AC 0.
MOVEM 0,SAVEB ;SAVE B IN SAVEB.
MOVEM 2,SAVE2 ;SAVE THE CONTENTS OF AC 2.
SETZM MINFLG ;SET THE -INFINITY FLAG TO 0.
IFE CPU-KI10,<FLTR 0,SAVEB ;USE THE HARDWARE>
IFE CPU-KA10,<CAME 0,[400000000000] ;THESE 4 LINES ARE A FIX FOR A****
JRST ZNONZ1 ;HARDWARE BUG THAT MAKES FLOAT*****
HRLZI 0,533400 ;RETURN 0 FOR - INTEGER INFINITY.**
JRST ZNONZ2 ;REMOVE THEM WHEN IT IS FIXED.*****
ZNONZ1: FUNCT FLOAT.,<SAVEB> ;GET B IN FLOATING POINT
ZNONZ2:>
MOVEM 0,BFLOAT ;IN BFLOAT
MOVE 2,0 ;AND IN AC 2.
FUNCT ATAN2.,<SAVEYR,SAVEXL> ;FIND TH=
;ATAN(X/Y)AND MULT BY
FMPR 2,0 ;BAND STORE IT IN AC 2.
FUNCT COS.,<2> ;FIND COS(B*TH)
;AND STORE
MOVEM 0,COSBTH ;IT IN COSBTH.
FUNCT SIN.,<2> ;FIND SIN(B*TH)
MOVEM 0,SINBTH ;IT IN SINBTH.
MOVM 2,SAVEXL ;/X/ TO AC 2.
MOVM 1,SAVEYR ;/Y/ TO AC 1.
CAMLE 2,1 ;PUT THE SMALLER OF /X/ AND
EXCH 2,1 ;/Y/ IN AC 2, THE OTHER IN AC 1.
FDVR 2,1 ;CALC S/L AND
JFCL ;SUPPRESS THE ERROR MESSAGE.
FMPR 2,2 ;CALC (S/L) **2 AND
JFCL ;SUPPRESS THE ERROR MESSAGE
FADRI 2,201400 ;CALC. (1.0 + (S/L)**2).
MOVEM 1,SAVEXL ;SAVE L IN SAVEXL.
FUNCT SQRT.,<2> ;CALC. SQRT(1.0 + (S/L)**2)
;AND LEAVE IT IN AC 0.
MOVE 1,SAVEB ;PICK UP B IN AC 1.
MOVE 2,0 ;STORE THE SQRT IN AC 2.
FMPR 0,SAVEXL ;CALC. R.
JFCL SEPAR ;IF OVERFLOW, GO TO SEPAR.
MOVEM 0,SAVEYR ;STORE R IN SAVEYR.
MOVSI 2,201400 ;SET UP 1.0 IN AC 2.
JUMPGE 1,XP2 ;GO TO R**B CALC IF B>=0.
MOVMS 1,1 ;GET /B/. IF B WAS
JFCL MININF ;-INFINITY GO TO MININF.
JRST XP2 ;GO TO R**B CALC.
XP1: FMPR 0,0 ;FORM R**N.
JFCL OVER ;IF OVER/UNDERFLOW, GO TO OVER.
LSH 1,-1 ;SHIFT EXP. FOR NEXT BIT.
XP2: TRZE 1,1 ;IS THE BIT ON?
FMPR 2,0 ;YES, MULTIPLY ANSWER BY R**N.
JFCL OVER ;IF OVER/UNDERFLOW, GO TO OVER.
JUMPN 1,XP1 ;UPDATE R**N UNLESS ALL FINISHED.
MOVE 0,2 ;PICK UP THE RESULT.
MOVEM 0,1 ;PUT IT IN AC 1 ALSO.
SKIPL SAVEB ;IF B WAS >=0,
JRST .+4 ;GO AHEAD.
MOVSI 1,201400 ;O'E, INVERT THE CALCULATED
FDVRB 1,0 ;QUANTITY AND IF IT
JFCL OVER2 ;OVER/UNDER FLOWS, GO TO OVER2.
FMPR 0,COSBTH ;FORM REAL (ANS) AND GO
JFCL TEMP1 ;TO TEMP1 IF IT UNDERFLOWS.
SECOND: FMPR 1,SINBTH ;FORM IMAG (ANS) AND GO
JFCL TEMP2 ;TO TEMP2 IF IT UNDERFLOWS.
OUT: MOVE 2,SAVE2 ;RESTORE THE CONTENTS OF AC 2.
POPJ 17, ;RETURN.
OVER2: MOVE 2,.JBTPC ;PICK UP THE FLAGS AND
TLC 2,(1B11) ;COMPLEMENT THE UNDERFLOW FLAG
JRST .+2 ;JUMP AHEAD.
OVER: MOVE 2,.JBTPC ;PICK UP THE FLAGS.
SKIPE MINFLG ;IF NECESSARY, RESTORE THE
SUB 17,[XWD 1,1] ;PUSH DOWN LIST COUNTER.
SKIPG BFLOAT ;IF TRUE OVERFLOW
TLC 2,(1B11) ;OCCURED, JUMP TO
TLNN 2,(1B11) ;ALOGRT. O'E,
JRST ALOGRT ;STAY HERE AND
SKIPE COSBTH ;RETURN AN ERROR MESSAGE UNLESS
PUSHJ 17,ERR ;REAL(ANS) IS IDENTICALLY 0.
SKIPE SINBTH ;RETURN AN ERROR MESSAGE UNLESS
PUSHJ 17,ERR ;IMAG(ANS) IS IDENTICALLY 0.
SETZB 0,1 ;ANS=(0,0)
JRST OUT ;GO TO RETURN.
ALOGRT:
FUNCT ALOG.,<SAVEYR> ;CALC. THE LOG(R)
ALGRT2: FMPR 0,BFLOAT ;IT BY B.
MOVEM 0,TEMP ;STORE IT IN TEMP.
SKIPN SINBTH ;IF SIN(B*TH)=0,
JRST ZRIMAG ;GO TO ZRIMAG.
MOVM 2,SINBTH ;/SIN(B*TH)/ TO AC 2.
FUNCT ALOG.,<2> ;CALC. THE LOG
FADR 0,TEMP ;ADD IT TO THE OTHER TERM.
MOVE 2,0 ;PUT IT IN AC NE 0 OR 1.
FUNCT EXP.,<2> ;CALC THE IMAGINARY
SKIPGE SINBTH ;ANSWER AND GIVE IT
MOVNS 0,0 ;THE CORRECT SIGN.
MOVEM 0,IMAG ;STORE IMAG(ANS) IN IMAG.
REAL: SKIPN COSBTH ;IF COS(B*TH)=0,
JRST ZRREAL ;GO TO ZRREAL.
MOVM 2,COSBTH ;/COS(B*TH)/ TO AC 2
FUNCT ALOG.,<2> ;CALC. THE LOG
;(/COS(B*TH)/) AND
FADR 0,TEMP ;ADD IT TO THE OTHER TERM.
MOVE 2,0 ;PUT IT IN AC NE 0 OR 1.
FUNCT EXP.,<2> ;CALC THE REAL PART OF
SKIPGE COSBTH ;IT THE
MOVNS 0,0 ;CORRECT SIGN.
MOVE 1,IMAG ;SET UP IMAG(ANS).
JRST OUT ;GO TO RETURN.
ZRIMAG: SETZM IMAG ;IMAG(ANS)=0
JRST REAL ;GO BACK TO CALC OF REAL(ANS).
ZRREAL: SETZ 0, ;REAL(ANS)=0
MOVE 1,IMAG ;SET UP IMAG(ANS).
JRST OUT ;GO TO RETURN
SEPAR:
FUNCT ALOG.,<2> ;CALC. THE LOG (SQRT(
;1+(S/L)**2)) AND
MOVEM 0,TEMP ;STORE IT IN TEMP.
FUNCT ALOG.,<SAVEXL> ;CALC THE LOG(L)
FADR 0,TEMP ;OTHER LOG.
JRST ALGRT2 ;GO TO EXPANDED CALC.
MININF:
AOS MINFLG ;SET B=-INFINITY FLAG.
HRLOI 1,377777 ;SET B=+INFINITY AND
PUSHJ 17,XP2 ;GO TO CALC R**B.
FDVR 0,SAVEYR ;CALC. REAL(ANS).
FDVR 1,SAVEYR ;CALC. IMAG(ANS).
JRST OUT ;GO TO RETURN.
MINFT: SKIPE MINFLG ;IF B=-INFINITY,
JRST ALOGRT ;GO TO ALOGRT.
ERR: ERROR (APR,7,1,.+1) ;MESSAGE AND GO BACK
POPJ 17, ;TO CALC.
TEMP1: MOVEM 1,TEMP ;TYPER. DOES NOT SAVE AC 1.
PUSHJ 17,MINFT ;JUMP TO MINFT.
MOVE 1,TEMP ;RESTORE AC 1.
JRST SECOND ;RETURN TO CALC.
TEMP2: PUSHJ 17,MINFT ;JUMP TO MINFT.
SETZM 1 ;TYPER. DOES NOT SAVE AC 1.
JRST OUT ;GO TO RETURN.
SAVEXL: 0
SAVEYR: 0
SAVEB: 0
SAVE2: 0
MINFLG: 0
BFLOAT: 0
COSBTH: 0
SINBTH: 0
IMAG: 0
TEMP: 0
PRGEND
TITLE CEXP.3 %5.(572) ;FROM LIB40 VERSION V.023 14-JULY-72
;FROM V.023 LIB40
;COMPLEX NUMBER TO A COMPLEX POWER FUNCTION.
;THE ALGORITHM USED IS:
;(X+IY)**(A+IB)=
;EXP[A*LOG(R)-B*TH+LOG(TRIG(A*TH+B*LOG(R)))]
;WHERE TRIG=COS FOR THE REAL PART AND SIN
;FOR THE IMAGINARY PART., AND WHERE
;R=(X**2+Y**2)**0.5 AND
;TH=ATAN2(Y,X).
;THIS ROUTINE USES THE FACT THAT EXP(N) WHERE
;N>ABOUT 89.0 IN MAGNITUDE OVER OR UNDERFLOWS,
;AND THAT COS AND SIN OF LARGE ARGUMENTS RETURN
;ZERO BECAUSE OF THEIR RANGE REDUCTION.
;THE CALLING SEQUENCE FOR THIS ROUTINE IS
; MOVEI 16,ADDR
; PUSHJ 17,CEXP.3
;THE BASE IS IN AC'S 0 AND 1 AND THE POWER
;IS IN ADDR AND ADDR+1.
;THE ANSWER IS RETURNED IN AC'S 0 AND 1.
;REVISION HISTORY
;EDIT SPR COMMENT
;---- --- -------
;572 ----- ALLOW CEXP TO LOAD IF F40LIB TURNED OFF
;****** END OF REVISION HISTORY ******
SEARCH FORPRM
IFN F40LIB,<ENTRY CEXP.3>
IFN F10LIB,<ENTRY CEXP3.>
EXTERNAL EXP3.. ;[572] FLOATING TO FLOATING POWER
MLON
IFN F10LIB,<
SIXBIT /CEXP3./ ;FORTRAN 10 ENTRY
CEXP3.: DMOVE T0,@(L) ;GET THE BASE
MOVEI L,@1(L) ;GET THE POWER POINTER
IFN F40LIB,<
JRST CEXP.3 ;COMMON ROUTINE
>>
IFN F40LIB,<
SIXBIT /CEXP.3/ ;F40 ENTRY
CEXP.3:>
JUMPN 0,.+3 ;IF THE BASE = (0,0),
JUMPN 1,.+2 ;THEN THE ANSWER IS SET = (0,0),
POPJ 17, ;AND THE ROUTINE EXITS.
MOVEM 2,SAVE2 ;SAVE THE CONTENTS OF AC 2.
MOVEM 3,SAVE3 ;SAVE THE CONTENTS OF AC 3.
MOVE 2,(16) ;REAL(POWER) TO AC 2.
MOVE 3,1(16) ;IMAG(POWER) TO AC 3.
JUMPN 3,NORMAL ;IF IMAG(BASE) = 0 AND
JUMPN 2,RLTORL ;IMAG(POWER) = 0, THEN GO TO RLTORL.
HRLZI 0,201400 ;IF THE BASE NE (0,0) AND THE POWER
SETZM 1 ;= (0,0), THE ANSWER =
JRST OUT1 ;(1.0,0.0).
OUT: MOVE 4,SAVE4 ;RESTORE THE CONTENTS OF AC 4.
OUT1: MOVE 2,SAVE2 ;RESTORE THE CONTENTS OF AC 2.
MOVE 3,SAVE3 ;RESTORE THE CONTENTS OF AC 3
POPJ 17, ;EXIT.
RLTORL: JUMPN 1,NORMAL ;RLTORL IS IMAG OF BASE AND POWER = 0.
JUMPL 0,NORMAL ;BASE MUST BE >=0 HERE.
MOVE 1,2 ;SET UP ARGS FOR EXP3.
;**; [572] CHANGE @ RLTORL+3 CLRH 2-AUG-76
PUSHJ 17,EXP3.. ;[572] CALC REAL(ANS).
SETZM 1 ;IMAG(ANS) = 0.
JRST OUT1 ;GO TO EXIT.
NORMAL: MOVEM 4,SAVE4 ;SAVE THE CONTENTS OF AC 4.
MOVEM 0,BASE1 ;SAVE THE BASE IN BASE1
MOVEM 1,BASE2 ;AND BASE2.
MOVEM 2,POWER1 ;SAVE THE POWER IN POWER1
MOVEM 3,POWER2 ;AND POWER2.
SETZM COSFLG ;ZERO TWO OF
SETZM SINFLG ;THE FLAGS.
FDVR 1,0 ;JUMP TO THAUFL IF
JFCL THAUFL ;OV/UN/DIV TROUBLE.
N2: FUNCT CLOG.,<BASE1> ;CALC THE LOG(R)
MOVEM 0,LOGR ;AND STORE
CAML 1,[202622077325] ;THEM
FSBR 1,[203622077325];IN LOGR
MOVEM 1,THETA ;AND THETA.
N1: PUSHJ 17,ANGLCL ;CALC THE LOG(TRIG).
SKIPE OUTFLG ;IF THE ANS. HAS BEEN SETUP, GO TO OUT,
JRST OUT ;O'E, STAY HERE.
MAGCLC: MOVN 0,POWER2 ;CALC -B*THETA,
FMPR 0,THETA ;UNDERFLOW IS OK,
JFCL [JUMPE 0,.+1 ;GO TO OVER1 IF
JRST OVER1] ;OVERFLOW OCCURRED.
MOVE 1,POWER1 ;CALC A*LOGR,
MAG1: FMPR 1,LOGR ;JUMP TO TEMP1
JFCL TEMP1 ;IF UNDER/OVERFLOW.
MAG2: FADRB 0,1 ;CALC.A*LOGR - B*THETA AND
JFCL TEMP2 ;GO TO TEMP2 WHEN OVER/UNDERFLOW.
MAG3: FADRM 0,LOGCOS ;CALC ARG FOR EXP -- REAL
JFCL ;AND NEVER MIND OVER/UNDERFLOW.
FADRM 1,LOGSIN ;CALC ARG FOR EXP -- IMAG
JFCL ;AND NEVER MIND OVER/UNDERFLOW.
TEST: SKIPE COSFLG ;COSFLG AND SINFLG ARE 0, UNLESS
JRST SETSG3 ;COS AND SIN ARE 0, RESPECTIVELY.
FUNCT EXP.,<LOGCOS> ;CALC REAL(ANS)
MOVEM 0,4 ;IT IN 4(REAL).
SKIPE SINFLG ;SEE NOTE FOR
JRST SETSGN ;TEST ABOVE.
SETSG3: FUNCT EXP.,<LOGSIN> ;CALC IMAG(ANS)
MOVEM 0,IMAG ;IT IN IMAG.
SETSGN: SKIPGE COSINE ;SET THE SIGN
MOVNS 4,4 ;OF REAL(ANS).
SKIPGE SINE ;SET THE SIGN
MOVNS IMAG ;OF IMAG(ANS).
STORE: MOVE 0,4 ;RETURN REAL(ANS).
MOVE 1,IMAG ;RETURN IMAG(ANS).
JRST OUT ;GO TO EXIT.
ANGLCL: SETZM OUTFLG ;ZERO THE OUT FLAG.
FMPR 2,1 ;CALC A*THETA AND GO TO
JFCL ANGL1 ;ANGL1 IF OVER/UNDERFLOW OCCURS.
FMPR 0,POWER2 ;CALC B*LOGR AND GO TO
JFCL ANGL2 ;ANGL2 IF OVER/UNDERFLOW OCCURS.
FADR 2,0 ;CALC A*THETA + B*LOGR AND GO TO
JFCL ANGL3 ;ANGL3 IF OVER/UNDERFLOW OCCURS.
TRIG: FUNCT SIN.,<2> ;CALC SIN(ARG) AND
MOVEM 0,SINE ;IN SINE.
FUNCT COS.,<2> ;CALC COS(ARG) AND
MOVEM 0,COSINE ;IN COSINE.
JUMPN 0,LGCOSC ;IF COS=0, THEN REAL=0.
COSZ: AOS COSFLG ;SO SET COSFLG NE 0
SETZM 4 ;AND SET UP REAL AND GO
JRST CHKSIN ;AHEAD TO CHKSIN.
LGCOSC: MOVM 2,COSINE ;COS NE 0, SO
FUNCT ALOG.,<2> ;CALC LOG(/COS/)
MOVEM 0,LOGCOS ;IN LOGCOS.
CHKSIN: SKIPE SINE ;IF SIN = 0
JRST LGSINC ;THEN IMAG = 0,
SINZ: AOS SINFLG ;SO SET SINFLG NE 0
SETZM IMAG ;AND SET UP IMAG.
SKIPE COSFLG ;IF THE ENTIRE ANSWER IS 0,
JRST BTHZRO ;GO TO BTHZRO. O'E,
POPJ 17, ;RETURN.
LGSINC: MOVM 2,SINE ;SIN NE 0, SO
FUNCT ALOG.,<2> ;CALC LOG(/SIN/)
MOVEM 0,LOGSIN ;THEN JUMP OUT OF THIS SECTION.
POPJ 17, ;******END OF CODE FOR MAIN CALC******
OVER1: MOVE 1,POWER1 ;CALC A*LOGR
FMPR 1,LOGR ;AND IF ANYTHING
JFCL [JUMPE 1,.+1 ;BUT B*THETA AND A*LOGR
XOR 1,0 ;BOTH OVERFLOW AND THEY HAVE
JUMPGE 1,.+1 ;DIFFERENT SIGNS, GO AHEAD.
JRST OVER2] ;FOR THAT SPECIAL CASE, GO TO OVER2.
TEMP4: MOVEM 0,LOGCOS ;ARG IS ALREADY SO LARGE THAT
MOVEM 0,LOGSIN ;LOG(TRIG) DOESN'T MATTER, SO STORE
JRST TEST ;RESULTS AND GO BACK TO CALC.
OVER2: MOVN 0,POWER2 ;SPECIAL CASE, OVERFLOW
MOVE 3,LOGR ;PLUS OVERFLOW, WITH
MOVE 2,THETA ;DIFFERENT SIGNS.
PUSHJ 17,FOUR ;CALC IT
JUMPN 0,TEMP4 ;AND THEN
JRST TEST ;RETURN.
FOUR: FDVR 0,POWER1 ;THIS SECTION CALCULATES
MOVE 1,3 ;X1*X2 - X3*X4
FDVR 1,2 ;IN
MOVEM 0,TEMP ;DIFFERENT
FADR 0,1 ;WAYS
JFCL OVER3 ;DEPENDING
FMPR 0,POWER1 ;ON
JFCL ;WHERE
FMPR 0,2 ;OVERFLOW
JFCL ;AND
POPJ 17, ;UNDERFLOW
OVER3: MOVE 0,2 ;OCCUR. IT IS
FMPR 0,TEMP ;CALLED
JFCL ;WITH
FADR 0,3 ;PUSHJ AND
FMPR 0,POWER1 ;EXITS
JFCL ;WITH
POPJ 17, ;POPJ.
TEMP1: JUMPE 1,MAG2 ;IGNORE UNDERFLOW,
JRST TEMP3 ;FOR OVERFLOW PLUS
TEMP2: JUMPE 1,MAG3 ;NORMAL, THIS ANSWER
TEMP3: MOVEM 1,LOGCOS ;IS OVERFLOW, SO
MOVEM 1,LOGSIN ;SET IT UP, AND
JRST TEST ;RETURN.
ANGL1: FMPR 0,POWER2 ;IF O/U + O/U,
JFCL ANGL11 ;GO TO ANGL11. O'E, STAY HERE.
JUMPN 2,BTHZRO ;IF O+N, ANS IS O, GO TO BTHZRO.
MOVE 2,0 ;IF U+N WHERE N>EPS,
MOVE 0,POWER1 ;THEN
BTHM10: MOVM 3,2 ;ANS = N, GO TO TRIG.
CAML 3,EPS ;IF U+N WHERE N< EPS,
JRST TRIG ;THEN
FMPRI 1,271400 ;STAY HERE AND TRY TO
FMPR 1,0 ;SAVE
JFCL ;SOME BITS
FMPRI 2,271400 ;THEN
FADR 2,1 ;GO TO
JRST SUMUFL ;SUMUFL.
BTHZRO: SETZB 0,1 ;ANSWER = (0,0), SO
AOS OUTFLG ;SET THE OUT FLAG
POPJ 17, ;AND EXIT.
ANGL11: JUMPN 2,.+3 ;IF U+U, GO TO UU.
JUMPE 0,UU ;IF U+O, GO TO
JRST BTHZRO ;BTHZRO.
JUMPE 0,BTHZRO ;IF O+O WITH THE
XOR 2,0 ;SAME SIGN, GO TO BTHZRO.
JUMPGE 2,BTHZRO ;IF O+O WITH DIFFERENT SIGNS,
MOVE 0,POWER2 ;STAY HERE.
MOVE 3,THETA ;FOUR CALCULATES
MOVE 2,LOGR ;THE SUM OF THE TWO
PUSHJ 17,FOUR ;PRODUCTS -- THEN
MOVE 2,0 ;GO BACK TO
JRST TRIG ;TRIG.
UU: MOVE 0,LOGR ;THIS
MOVE 1,THETA ;IS
MOVE 4,LG2126 ;THE UNDERFLOW
FMPRI 0,377400 ;PLUS
FMPRI 1,377400 ;UNDERFLOW
MOVEM 0,TEMP ;CASE --
MOVEM 1,IMAG ;MULTIPLY
FMPR 0,POWER2 ;IT
JFCL U1 ;UP
FMPR 1,POWER1 ;AND
JFCL U2 ;TRY
MOVEM 0,2 ;TO
UU20: FADR 0,1 ;SAVE
JFCL DOUBL ;IT.
UU21: MOVMM 0,2 ;4
UU2: MOVEM 0,SINE ;CONTAINS
FUNCT ALOG.,<2> ;A
SETZM LOGCOS ;FACTOR
FSBR 0,4 ;TO
MOVEM 0,LOGSIN ;BE
POPJ 17, ;SUBTRACTED.
U1: FMPR 1,POWER1 ;CONTINUATION
JFCL DOUBL ;OF UNDERFLOW PLUS
MOVE 0,1 ;UNDERFLOW CASE --
U2: MOVM 2,0 ;MULTIPLYING
CAML 2,EPS ;UP AS
JRST UU2 ;MUCH
DOUBL: MOVE 0,POWER2 ;AS
MOVE 1,POWER1 ;IS
FMPRI 0,377400 ;NECESSARY.
FMPRI 1,377400 ;DOUBL
FMPR 0,TEMP ;IS
FMPR 1,IMAG ;ALSO USED
FADR 4,LG2126 ;BY
JRST UU20 ;SEVERAL SECTIONS.
ANGL2: JUMPN 0,BTHZRO ;O+N=O, ANS = (0,0).
MOVE 1,LOGR ;SET UP FOR
MOVE 0,POWER2 ;U+N TESTS
JRST BTHM10 ;AND JUMP TO THEM.
ANGL3: JUMPN 2,BTHZRO ;IF THE SUM OVERFLOWS, ANS=(0,0).
MOVE 2,POWER1 ;THIS
FMPR 2,THETA ;IS
FMPRI 2,271400 ;UNDERFLOW --
FMPRI 0,271400 ;TRY TO
FADR 2,0 ;SAVE IT.
SUMUFL: MOVEM 2,SINE ;THE FINAL ARG
MOVM 2,SINE ;HAD TO BE
FUNCT ALOG.,<2> ;SAVED.
FSBR 0,LG256 ;SUBTRACT
MOVEM 0,LOGSIN ;56.0*LOG(2)BASE2
SETZM LOGCOS ;AT THE
POPJ 17, ;END.
THAUFL: JUMPE 0,DIVCHK ;GO TO DIVCHK IF X = 0.
JUMPN 1,N2 ;RETURN IMMED. IF REALLY OVFLW.
MOVM 3,BASE1 ;GET
FUNCT ALOG.,<3> ;LOGR =
;LOG (/X/)
MOVEM 0,LOGR ;AND STORE IT.
MOVM 1,POWER1 ;/A/ < 1.0 ?
CAML 1,[1.0] ;NO, GO
JRST AGTHN1 ;TO AGTHN1.
SETZB 1,THETA ;YES, THETA = 0
JRST N1 ;AND GO BACK TO MAIN. CALC.
AGTHN1: MOVE 1,BASE2 ;SWAP ARGS., SO
MOVEM 1,THETA ;THAT A = A/X
MOVEM 2,TEEMP1 ;AND
FDVR 2,BASE1 ;THETA = Y
MOVE 2,POWER1 ;AND CALL THE
PUSHJ 17,ANGLCL ;ANGLE CALCULATION.
SKIPE OUTFLG ;IF (0,0), THEN
JRST OUT ;EXIT.
SETZM THETA ;SET THETA = 0, AND
MOVE 1,TEEMP1 ;RESTORE A = A
MOVEM 1,POWER1 ;AND GO BACK TO
JRST MAGCLC ;MAIN CALC.
DIVCHK: MOVM 3,BASE2 ;X = 0, SO
FUNCT ALOG.,<3> ;LOGR =
;LOG(/Y/)
MOVEM 0,LOGR ;AND THETA =
MOVE 1,[201622077325] ;+-
SKIPGE BASE2 ;PI/2.
MOVNS 1 ;SET UP
MOVEM 1,THETA ;LOCATIONS AND RETURN
JRST N1 ;TO MAIN CALC.
EPS: 033400000000
SAVE2: 0
SAVE3: 0
SAVE4: 0
BASE1: 0
BASE2: 0
POWER1: 0
POWER2: 0
COSFLG: 0
SINFLG: 0
LOGR: 0
THETA: 0
COSINE: 0
SINE: 0
IMAG: 0
LOGCOS: 0
LOGSIN: 0
TEMP: 0
OUTFLG: 0
TEEMP1: 0
LG2126: 207535261175
LG256: 206466417250
PRGEND
TITLE CSQRT %4.(235) COMPLEX SQURE ROOT
SUBTTL H. P. WEISS/HPW 11-DEC-73
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
SEARCH FORPRM
ENTRY CSQRT
EXTERN CSQRT.
CSQRT=CSQRT.
PRGEND
TITLE CSQRT. %4.(235) COMPLEX SQURE ROOT
SUBTTL D. TODD/DRT/HPW 30-NOV-1973
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
;FORM V.21 LIB40
;COMPLEX SQUARE ROOT FUNCTION
;THE ALGORITHM IS AS FOLLOWS:
;IF X >= 0 AND Y >= 0.,
; A=SQRT((/X/+/X+IY/)/2)
; B=Y/(2*A)
;IF X >= 0 AND Y < 0,
; A=-SQRT((/X/+/X+IY/)/2)
; B=Y/(2*A)
;IF X < 0 AND Y >= 0,
; A=Y/(2*B)
; B=SQRT((/X/+/X+IY/)/2)
;IF X < 0 AND Y < 0,
; A=Y/(2*B)
; B=SQRT((/X/+/X+IY/)/2)
;WHERE /Z/ MEANS THE ABSOLUTE VALUE OF Z.
;BECAUSE OF OVER/UNDERFLOW PROBLEMS, THE SQUARE
;ROOT TERM IS CALCULATED IN SEVERAL DIFFERENT WAYS.
;THE CALLING SEQUENCE IS:
; JSA 16,CSQRT
; EXP Z
;WHERE Z HAS BEEN DECLARED COMPLEX.
;THE REAL PART OF THE ANSWER IS RETURNED IN AC 0,
;AND THE IMAGINARY PART OF THE ANSWER IS RETURNED IN AC 1.
SEARCH FORPRM
HELLO (CSQRT,.) ;[235] ENTRY TO COMPLEX SQUARE ROOT ROUTINE.
MOVEI 1,@0(16) ;[227] PICK UP ADDRESS OF Z
MOVE 0,(1) ;PICK UP X IN AC 0.
MOVE 1,1(1) ;PICK UP Y IN AC 1.
MOVEM 2,SAVE2 ;SAVE AC 2.
MOVM 2,0 ;/X/ TO AC 2.
;IF Y IS NOT ZERO,
JUMPN 1,NORMAL ;GO TO THE STANDARD ROUTINE.
;IF Y=0 AND X>=0, Z IS REAL,
JUMPGE 0,REAL ;SO TRANSFER TO SIMPLE CALC.
NORMAL: MOVEM 3,SAVE3 ;SAVE AC 3.
MOVEM 0,XSAVE ;SAVE X.
MOVEM 1,YSAVE ;SAVE Y.
MOVM 3,1 ;/Y/ TO AC 3.
SETZM FLAGWD ;FLAGWD CONTAINS 0 IF /X/
CAMLE 2,3 ;<= /Y/, O'E IT CONTAINS 1. PUT
AOSA FLAGWD ;THE LARGER OF /X/,/Y/ IN AC 2
EXCH 2,3 ;AND THE SMALLER IN AC 3.
FDVR 3,2 ;CALC S/L.
JFCL ;NO UNDERFLOW ERROR MESSAGE ALLOWED.
FMPR 3,3 ;CALC (S/L)**2.
JFCL ;NO UNDERFLOW ERROR MESSAGE ALLOWED.
FADRI 3,201400 ;HAVE (1+(S/L)**2) IN AC 3.
FUNCT SQRT.,<3> ;CALC. THE SQRT OF
;(1+(S/L)**2)=1+EPS.
SKIPN FLAGWD ;GO TO YGTX IF
JRST YGTX ;/Y/>/X/.
XGTY: FADRI 0,201400 ;CALC. 2 + EPS.
FDVRI 0,202400 ;CALC. (2+EPS)/2.
MOVM 3,0 ;PUT IT IN AC NE 0 OR 1 FOR
FUNCT SQRT.,<3> ;CALL TO SQRT
MOVEM 0,3 ;SAVE SQRT(1+EPS/2) IN AC 3.
FUNCT SQRT.,<2> ;CALC.
FMPR 0,3 ;CALC. SQRT(/X/*(1+EPS/2)).
JRST OUT1 ;GO TO REST OF CALC.
YGTX: CAMGE 2,[1.0] ;IF /Y/>1, GO TO POSSIBLE OVERFLOW CASE.
JRST YXSMAL ;O'E, GO TO POSSIBLE UNDERFLOW.
FDVRI 0,203400 ;CALC. (1+EPS)/4.
FMPR 2,0 ;CALC. /Y/*(1+EPS)/4.
MOVM 3,XSAVE ;/X/ TO AC 3.
FDVRI 3,203400 ;CALC. /X//4.
JFCL ;SUPPRESS UNDERFLOW ERROR MESSAGE.
FADR 3,2 ;CALC.(/X//4)+(/Y/*(1+EPS)/4).
FUNCT SQRT.,<3> ;CALC.
FMPR 0,SQ2 ;MULTIPLY IT BY SQRT(2).
OUT1: MOVM 1,YSAVE ;/Y/ TO AC 1.
FDVR 1,0 ;CALC. /Y//2 TIMES THE
FDVRI 1,202400 ;SQRT TERM.
JRST SIGNS ;GO TO REST OF CALC.
YXSMAL: FMPR 0,2 ;/Y/*(1+EPS).
MOVM 3,XSAVE ;/X/ TO AC 3.
FADR 3,0 ;CALC. /X/+/Y/*(1+EPS).
FUNCT SQRT.,<3> ;CALC. SQRT OF
MOVEM 0,3 ;SAVE IT IN AC 3.
FDVR 0,SQ2 ;DIVIDE IT BY THE SQRT(2).
FMPR 3,SQ2 ;OR MULTIPLY IT BY SQRT(2).
FDVR 2,3 ;THEN CALC /Y//THIS.
MOVE 1,2 ;PUT A TEMP ANSWER IN AC 1.
SIGNS: SKIPGE XSAVE ;SET UP THE REAL AND
EXCH 1,0 ;THE IMAGINARY ANSWERS WITH
SKIPGE YSAVE ;THE APPROPRIATE
MOVNS 0,0 ;SIGNS.
MOVE 2,SAVE2 ;RESTORE AC 2.
MOVE 3,SAVE3 ;RESTORE AC 3.
GOODBY (1) ;RETURN
REAL: FUNCT SQRT.,<2> ;CALC. THE SQRT(X)
SETZ 1, ;IMAG. ANSWER = 0.
MOVE 2,SAVE2 ;RESTORE AC 2.
GOODBY (1) ;RETURN
SQ2: 201552023632 ;SQRT(2).
XSAVE: 0
YSAVE: 0
SAVE2: 0
SAVE3: 0
FLAGWD: 0
PRGEND
TITLE CLOG %4.(235) COMPLEX LOG FUNCTION
SUBTTL H. P. WEISS/HPW 11-DEC-73
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
SEARCH FORPRM
ENTRY CLOG
EXTERN CLOG.
CLOG=CLOG.
PRGEND
TITLE CLOG. %4.(235) COMPLEX LOG FUNCTION
SUBTTL D. TODD /DRT 15-FEB-1973
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
;FROM LIB40 ..(050)
;FROM V.021 22-SEP-69
;FROM V.027 LIB40
;COMPLEX LOGARITHM FUNCTION.
;THIS ROUTINE CALCULATES THE LOGARITHM OF A COMPLEX
;ARGUMENT., Z = X + I*Y, WITH THE FOLLOWING ALGORITHM:
; CLOG(Z) = LOG(ABS(Z)) + I*ATAN2(Y,X)
;WHERE ABS(Z) IS CALCULATED AS L*SQRT(1.0 + (S/L)**2)
;BECAUSE OF OVERFLOW/UNDERFLOW (L IS THE LARGER
;OF X AND Y, AND S IS THE SMALLER.)
;A SPECIAL CASE CHECK IS MADE FOR X=0 AND Y=0
;AND AN ANSWER WITH REAL = - INFINITY AND IMAG = 0
;IS RETURNED.
;THE ROUTINE IS CALLED IN THE FOLLOWING MANNER:
; JSA Q,CLOG
; EXP ARG
;THE REAL PART OF THE ANSWER IS RETURNED IN ACCUMULATOR A
;AND THE IMAGINARY PART IS RETURNED IN ACCUMULATOR B.
SEARCH FORPRM
A=0
B=1
C=10
D=11
Q=16
P=17
HELLO (CLOG,.) ;[235] ENTRY TO COMPLEX LOG ROUTINE.
MOVEI 1,@(Q) ;GET ADDRESS OF COMPLEX ARG.
MOVE 0,(1) ;PICK UP REAL PART OF ARG.
MOVE 1,1(1) ;PICK UP IMAG. PART OF ARG.
JUMPN 0,NORMAL ;SPECIAL CASE CHECK
JUMPN 1,NORMAL ;FOR X=0 AND Y=0.
ERROR (APR,5,1,.+1) ;TYPE AN ERROR MESSGAE
MOVE A,[400000000001] ;THE ANSWER RETURNED IS
SETZ B, ;REAL=-INFINITY, IMAG. = 0.
GOODBY (1) ;RETURN
NORMAL: MOVEM C,SAVEC ;SAVE AC C.
MOVEM D,SAVED ;SAVE AC D.
MOVE C,0 ;REAL OF ARG. TO AC C.
MOVE D,1 ;IMAG OF ARG. TO AC D.
FUNCT ATAN2.,<D,C> ;CALCULATE IMAG.
JUMPGE A,.+2 ;ANGLE IS OK IF >= 0,
FADR A,TWOPI ;ADD 2*PI IF ANGLE WAS < 0.
MOVEM A,IMAG ;STORE ANSWER IN IMAG.
MOVMS C,C ;GET ABS(X).
MOVMS D,D ;GET ABS(Y).
CAMGE D,C ;PUT LARGER OF X AND Y
EXCH D,C ;IN AC D AND SMALLER IN AC C.
FDVR C,D ;CALC. S/L.
JFCL ;NO UNDERFLOW ERROR MESSAGE ALLOWED.
FMPR C,C ;CALC. (S/L)**2.
JFCL ;NO UNDERFLOW ERROR MESSAGE ALLOWED.
FADRI C,201400 ;CALC. 1.0 + (S/L)**2.
FUNCT SQRT.,<C> ;CALC. THE SQRT OF THIS
MOVE C,A ;THE ANSWER IS IN AC A AND AC C.
FMPR C,D ;CALC. L*SQRT.
JFCL OVER ;JUMP IF IT OVERFLOWS.
FUNCT ALOG.,<C> ;CALC. LOG(ABS(Z)).
OUT: MOVE B,IMAG ;SET UP IMAG. PART OF ANSWER.
MOVE C,SAVEC ;RESTORE AC C.
MOVE D,SAVED ;RESTORE AC D.
GOODBY (1) ;RETURN
OVER: MOVEM A,SAVEHF ;ARG. TO SAVEHF.
FUNCT ALOG.,<SAVEHF> ;CALC. ALOG(SQRT).
MOVEM A,SAVEHF ;STORE ANSWER IN SAVEHF.
FUNCT ALOG.,<D> ;CALC. ALOG(L).
FADR A,SAVEHF ;SUM THE TWO LOGS.
JRST OUT ;GO TO RETURN.
TWOPI: 203622077325 ;2*PI.
SAVEHF: 0
IMAG: 0
SAVEC: 0
SAVED: 0
PRGEND
TITLE CABS %4.(235) COMPLEX ABSOLUTE VALUE FUNCTION
SUBTTL H. P. WEISS/HPW 11-DEC-73
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
SEARCH FORPRM
ENTRY CABS
EXTERN CABS.
CABS=CABS.
PRGEND
TITLE CABS. %4.(235) COMPLEX ABSOLUTE VALUE FUNCTION
SUBTTL D. TODD /DRT 15-FEB-1973
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
;FROM V.21 LIB40
;COMPLEX ABSOLUTE VALUE FUNCTION
;THIS ROUTINE CALCULATES THE ABSOLUTE VALUE OF A COMPLEX NUMBER
;Z = X +I*Y
;THE CALLING SEQUENCE IS AS FOLLOWS:
; JSA Q.,CABS
; EXP ARG
;THE ANSWER IS LEFT IN ACCUMULATOR "A"
;CALCULATE SQRT(Y*Y+X*X) BX USING:
; Y*SQRT[(X/Y)**2+1] WITH X<Y
;IF (X/Y)**2 UNDERFLOWS, THEN RETURN Y
SEARCH FORPRM
Q=16
A=0
B=1
MLON ;ALLOW MULTI LINE LITERALS
HELLO (CABS,.)
MOVEI B,@(Q) ;GET ADR OF COMPLEX ARG
MOVM A,(B) ;GET MAGNITUDE OF REAL PART
MOVM B,1(B) ;GET MAGNITUDE OF IMAGINARY PART
CAML A,B ;GET SMALLER ARG IN A AND
EXCH A,B ; LARGER IN B
FDVR A,B ;X/Y
JFCL OUT ;IF UNDERFLOW, GO TO OUT VIA OVTRAP
FMPR A,A ;(X/Y)**2
JFCL OUT ;IF UNDERFLOW, GO TO OUT VIA OVTRAP
FADRI A,201400 ;(X/Y)**2+1.0
MOVEM A,TT ;STORE ARG. IN NE 0 OR 1.
MOVEM B,TTT ;SAVE LARGER.
FUNCT SQRT.,<TT> ;TAKE SQUARE ROOT
FMPR A,TTT ;Y*SQRT[(X/Y)**2+1.0]
RET: GOODBY (1) ;RETURN
OUT: MOVE A,B ;Y IS THE ANSWER
GOODBY (1) ;RETURN
TT: 0
TTT: 0
PRGEND
TITLE CEXP %4.(235) COMPLEX EXPONENTIATION ROUTINE
SUBTTL H. P. WEISS/HPW 11-DEC-73
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
SEARCH FORPRM
ENTRY CEXP
EXTERN CEXP.
CEXP=CEXP.
PRGEND
TITLE CEXP. %4.(235) COMPLEX EXPONENTIATION ROUTINE
SUBTTL D. TODD/DRT/HPW 30-NOV-1973
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
;FROM V.021 7-SEP-69
;FROM V.27 LIB40
;COMPLEX EXPONENTIAL FUNCTION.
;THIS ROUTINE CALCULATES THE EXPONENTIAL OF A
;COMPLEX ARGUMENT Z=X+I*Y IN THE FOLLOWING
;MANNER:
;IF -89.415... <= X <= +88.029....,
; CEXP(Z)=EXP(X)*[COS(Y)+I*SIN(Y)]
;IF X < -89.415...,
; CEXP(Z)=0
;AND AN ERROR MESSAGE IS RETURNED FOR BOTH THE
;REAL AND THE IMAGINARY PARTS UNLESS EITHER
;COS(Y) OR SIN(Y) IS IDENTICALLY ZERO.
;IF X>+88.029...,
; REAL(CEXP(Z))=[EXP((ALOG(/COS(Y)/))+X)]*[SIGN(COS(Y))]
; IMAG(CEXP(Z))=[EXP((ALOG(/SIN(Y)/))+X)]*[SIGN(SIN(Y))]
;THE CALLING SEQUENCE FOR THE ROUTINE IS AS FOLLOWS:
; JSA 16,CEXP
; EXP ARG
;THE REAL PART OF THE ANSWER IS LEFT IN AC 0.
;THE IMAGINARY PART OF THE ANSWER IS LEFT IN AC 1.
SEARCH FORPRM
HELLO (CEXP,.) ;[235] ENTRY TO COMPLEX EXP. ROUTINE.
MOVEI 1,@0(16) ;PUT ADDR OF Z IN AC 1
MOVE 0,(1) ;X TO AC 0.
MOVE 1,1(1) ;Y TO AC 1.
MOVEM 2,SAVE2 ;SAVE THE CONTENTS OF AC 2.
MOVEM 3,SAVE3 ;SAVE THE CONTENTS OF AC 3.
MOVEM 0,2 ;X TO AC 2.
MOVEM 1,3 ;X TO AC 3.
FUNCT COS.,<3> ;FIND THE
;COS(Y) AND STORE
MOVEM 0,COSY ;IT IN COSY.
FUNCT SIN.,<3> ;FIND THE
MOVEM 0,SINY ;IT IN SINY.
CAMGE 2,MIN89 ;IF X < -89.415...,
JRST XVRYNG ;THEN GO TO XVRYNG.
CAMLE 2,PLS88 ;IF X >+88.029...,
JRST XVRYPL ;THEN GO TO XVRYPL.
FUNCT EXP.,<2> ;O'E, FIND E**X
MOVE 1,SINY ;FORM (E**X)*(SIN(Y)) AND
FMPR 1,0 ;STORE IT IN AC 1.
FMPR 0,COSY ;STORE (E**X)*(COS(Y)) IN AC 0.
OUT: MOVE 2,SAVE2 ;RESTORE THE CONTENTS OF AC 2.
MOVE 3,SAVE3 ;RESTORE THE CONTENTS OF AC 3.
GOODBY (1) ;RETURN
XVRYNG: SKIPN COSY ;IF COS(Y)=0, THE
JRST .+3 ;REAL(ANS.) IS EXACTLY 0.
ERROR (APR,7,1,.+1) ;O'E, REAL(ANS.)=0 PLUS
SKIPN SINY ;IF SIN(Y)=0, THE
JRST .+3 ;IMAG(ANS.) IS EXACTLY 0.
ERROR (APR,7,1,.+1) ;O'E, IMAG(ANS.)=0 PLUS
SETZB 0,1 ;ANSWER=(0,0)
JRST OUT ;GO TO RETURN.
XVRYPL: SKIPN SINY ;IF SIN(Y)=0, THEN IMAG(ANS)
JRST IZERO ;=0, GO TO IZERO.
MOVM 3,SINY ;O'E, /SIN(Y)/TO AC NE 0 OR 1.
FUNCT ALOG.,<3> ;FIND THE LOG (/SIN(Y)/)
FADR 0,2 ;CALC. (LOG(/SIN(Y)/)) + X
MOVE 3,0 ;AND STORE IT IN AC NE 0 OR 1.
FUNCT EXP.,<3> ;CALC. (E**X)*(/SIN(Y)/)
MOVEM 0,SAVIMG ;IT IN SAVIMG.
SKIPGE SINY ;MAKE IT NEGATIVE IF
MOVNM 0,SAVIMG ;SIN(Y)<0.
REAL: SKIPN COSY ;IF COS(Y)=0, THEN REAL(ANS.)
JRST RZERO ;=0, SO GO TO REZERO.
MOVM 3,COSY ;O'E, /COS(Y)/ TO AC NE 0 OR 1.
FUNCT ALOG.,<3> ;FIND THE LOG (/COS(Y)/)
FADRM 0,2 ;CALC. (LOG(/COS(Y)/)) + X
FUNCT EXP.,<2> ;CALC. (E**X)*(/COS(Y)/)
SKIPGE COSY ;MAKE IT NEGATIVE IF
MOVNS 0 ;COS(Y) WAS NEGATIVE.
MOVE 1,SAVIMG ;RESTORE IMAG(ANS.)
JRST OUT ;GO TO RETURN.
IZERO: SETZM SAVIMG ;SET LOC OF IMAG(ANS.)=0.
JRST REAL ;RETURN TO CALC.
RZERO: SETZ 0, ;SET REAL(ANS.)=0.
MOVE 1,SAVIMG ;SET UP IMAG(ANS.).
JRST OUT ;GO TO RETURN.
SINY: 0
COSY: 0
SAVIMG: 0
SAVE2: 0
SAVE3: 0
MIN89: 570232254037
PLS88: 207540074636
PRGEND
TITLE CSIN %4.(235) COMPLEX SIN FUNCTION
SUBTTL H. P. WEISS/HPW 11-DEC-73
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
SEARCH FORPRM
ENTRY CSIN
EXTERN CSIN.
CSIN=CSIN.
PRGEND
TITLE CCOS %4.(235) COMPEX COSINE FUNCTION
SUBTTL H. P. WEISS/HPW 11-DEC-73
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
SEARCH FORPRM
ENTRY CCOS
EXTERN CCOS.
CCOS=CCOS.
PRGEND
TITLE CSIN. %4.(235) COMPLEX SIN AND COSINE ROUTINES
SUBTTL D. TODD/DRT/HPW 30-NOV-1973
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
;FROM V.21 LIB40
;COMPLEX SINE AND COSINE FUNCTIONS.
;THESE ROUTINES CALCULATE THE SINE AND COSINE
;OF Z., WHERE Z=X+I*Y. THE ALGORITHM USED IS:
; SIN(Z)=SIN(X)COSH(Y)+I*COS(X)SINH(Y)
; COS(Z)=COS(X)COSH(Y)-I*SIN(X)SINH(Y)
;THE ROUTINES ARE CALLED IN THE FOLLOWING MANNER:
; JSA 16,CSIN
; EXP ARG
;WHERE ARG IS THE ADDRESS OF THE REAL PART OF THE
;COMPLEX ARGUMENT, THE IMAGINARY PART BEING IN
;ARG+1. THE COMPLEX ANSWER IS RETURNED IN AC'S
;0 AND 1.
SEARCH FORPRM
HELLO (CCOS,.) ;[235] ENTRY TO COMPLEX COSINE ROUTINE.
MOVEI 1,1 ;SET THE FLAGWORD AC = 1.
JRST CSIN1 ;GO TO SINE ROUTINE.
HELLO (CSIN,.) ;[235] ENTRY TO COMPLEX SINE ROUTINE.
SETZM 1 ;SET THE FLAGWORD AC TO 0.
CSIN1: MOVEM 1,FLGWRD ;SET UP THE FLAGWORD ITSELF.
MOVEI 1,@0(16) ;[227] PUT ADDR OF Z IN AC 1
MOVE 0,(1) ;PUT X IN AC 0.
MOVE 1,1(1) ;PUT Y IN AC 1.
MOVEM 1,YSAVE ;SAVE Y.
MOVEM 2,SAVE2 ;SAVE THE CONTENTS OF AC 2.
MOVE 2,0 ;PUT X IN AN AC NE 0 OR 1.
FUNCT SIN.,<2> ;CALCULATE
;THE SIN(X).
MOVEM 0,SINX ;STORE RESULT OF SIN(X)
FUNCT COS.,<2> ;CALC. COS(X) AND
MOVEM 0,COSX ;IN COSX.
SKIPN FLGWRD ;IF THIS IS CSIN ROUTINE,
JRST .+4 ;THEN JUMP AHEAD.
MOVN 2,SINX ;OTHERWISE, PUT -SIN(X)
EXCH 2,COSX ;IN COSX, AND COS(X)
MOVEM 2,SINX ;IN SINX.
SKIPN YSAVE ;SKIP UNLESS Z IS REAL, IN WHICH
JRST CSIN2 ;CASE, GO TO THE SIMPLE CASE.
MOVM 2,YSAVE ;/Y/ TO AC 2.
CAMLE 2,EIGHT8 ;IF /Y/ TOO LARGE FOR SIMPLE
JRST OVFL ;SINH OR COSH, GO TO OVFL.
MOVE 2,YSAVE ;Y TO AC 2.
FUNCT SINH.,<2> ;CALC. SINH(Y) AND
MOVEM 0,FLGWRD ;IN FLGWRD.
FUNCT COSH.,<2> ;CALC. COSH(Y) AND
FMPR 0,SINX ;CALC. THE REAL PART OF THE ANS.
MOVE 1,FLGWRD ;SINH(Y) TO AC 1.
FMPR 1,COSX ;CALC. THE IMAG. PART OF THE ANS.
OUT: MOVE 2,SAVE2 ;RESTORE AC 2.
GOODBY (1) ;RETURN
CSIN2: MOVEI 1,0 ;SET THE IMAG. PART OF THE ANSWER = 0.
MOVE 0,SINX ;SET REAL(ANSWER)=TRIG. FN.
JRST OUT ;GO TO RETURN.
OVFL: MOVM 2,SINX ;/SIN(X)/ TO AC 2.
JUMPN 2,.+3 ;IF ARG FOR ALOG IS
SETZM FLGWRD ;ZERO, SET REAL(ANS) = 0,
JRST IMAG ;AND JUMP AHEAD.
FUNCT ALOG.,<2> ;CALC. THE LOG(/SIN(X)/) AND
FSBR 0,LOG2BE ;CALC. (LOG(/SIN(X)/))-(LOG(2)).
MOVM 2,YSAVE ;/Y/ TO AC 2.
FADR 2,0 ;CALC. (LOG(/SIN(X)/))-(LOG(2))+/Y/.
FUNCT EXP.,<2> ;CALC. (E**/Y/)*/SIN(X)/)/2.
MOVEM 0,FLGWRD ;SAVE THE ANSWER IN FLGWRD.
SKIPGE SINX ;IF ANS. IS TO BE < 0,SET
MOVNM 0,FLGWRD ;ANS. < 0.
IMAG: MOVM 2,COSX ;/COS(X)/ TO AC 2.
JUMPN 2,.+3 ;IF ARG FOR ALOG = 0,
SETZM 1 ;SET IMAG(ANSWER)=0, AND
JRST IMAG2 ;JUMP AHEAD.
FUNCT ALOG.,<2> ;CALC. LOG(/COS(X)/) AND
FSBR 0,LOG2BE ;CALC. LOG(/COS(X)/))-(LOG(2)).
MOVM 2,YSAVE ;/Y/ TO AC 2.
FADR 2,0 ;CALC. LOG(/COS(X)/)-(LOG(2))+/Y/.
FUNCT EXP.,<2> ;CALC. (/COS(X)/)*
;(E**/Y/)/2.
SKIPGE YSAVE ;SET THE SIGN NEGATIVE IF
MOVN 0,0 ;SINH(Y) WAS NEGATIVE.
SKIPGE COSX ;NEGATE THE SIGN IF
MOVN 0,0 ;COS(X) WAS NEGATIVE. PUT
MOVE 1,0 ;THE IMAG. PART OF THE ANS. IN AC 1.
IMAG2: MOVE 0,FLGWRD ;PUT THE REAL PART OF THE ANS. IN AC 0.
JRST OUT ;GO TO RETURN.
EIGHT8: 207540074636
LOG2BE: 200542710300
PIOT: 201622077325
YSAVE: 0
SAVE2: 0
SINX: 0
COSX: 0
FLGWRD: 0
PRGEND
TITLE CFM %4.(207) ;FROM LIB40 VERSION .027
SUBTTL D. TODD /DRT/HPW/ 29-AUGUST-1973
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
;FROM V.021 16-OCT-70
;COMPLEX FLOATING MULTIPLY ROUTINE.
;THIS ROUTINE MULTIPLIES TWO COMPLEX NUMBERS ACCORDING
;TO THE RULE:
; (A+IB)*(C+ID)=(A*C-B*D)+I*(B*C+A*D)
;IF EITHER PRODUCT IN EITHER TERM OVER OR UNDERFLOWS,
;A JUMP IS MADE TO A SPECIAL CASE CALCULATION. OVER
;AND UNDERFLOW ERROR MESSAGES ARE RETURNED ONLY IF THE
;ENTIRE TERM OVER OR UNDERFLOWS.
;THERE ARE TWO SETS OF ENTRY POINTS TO THIS ROUTINE:
;THE MULTIPLY, AND THE MULTIPLY-TO-MEMORY.
;THE CALLING SEQUENCE FOR THE MULTIPLY ROUTINES IS AS
;FOLLOWS:
; MOVEI 16,ARG2
; PUSHJ 17,CFM.N
;WHERE N=0,2,4,OR 6. ARG1 IS ASSUMED TO BE IN
;AC'S N AND N+1, AND THE RESULTS ARE LEFT IN AC'S N AND N+1.
;THE CALLING SEQUENCE FOR THE MULTIPLY TO MEMORY ROUTINES IS AS
;FOLLOWS:
; MOVEI 16,ARG2
; PUSHJ 17,CMM.N
;WHERE N AND ARG1 ARE AS BEFORE AND THE RESULTS ARE
;LEFT IN ARG2 AND ARG2+1.
SEARCH FORPRM
DEFINE SYM(A,B)<
SIXBIT /A'B/
A'B: HRLI 16,B
JRST A'0
>
ZZ.=2
REPEAT 6,<
SYM(CFM.,\ZZ.)
SYM(CMM.,\ZZ.)
ZZ.=ZZ.+2
>
SIXBIT /CMM.0/
CMM.0: MOVSS 16 ;SET UP THE ADDRESS WORD.
JRST CFM.0
SIXBIT /CFM.0/
CFM.0:
PUSH P,(L) ;SAVE THE LINK
POP P,ARG21 ;COPY TO ARG21
PUSH P,1(L) ;COPY THE ARGUMENTS
POP P,ARG22
MOVSS L ;GET THE POINTER TO THE FIRST ARG
PUSH P,(L) ;SAVE FIRST ARG
POP P,ARG11
PUSH P,1(L)
POP P,ARG12
PUSH P,T0 ;SAVE FOUR REGISTERS
PUSH P,T1
PUSH P,T2
PUSH P,T3
PUSHJ 17,CALC ;CALC (A*C-B*D)
MOVEM 0,REAL ;SAVE REAL (ANS) IN REAL.
MOVE 0,ARG12 ;SET UP
EXCH 0,ARG11 ;AND CALCULATE
MOVNM 0,ARG12 ;(B*C+A*D)
PUSHJ 17,CALC ;AND LEAVE IT IN AC0.
POP P,T3 ;RESTORE THE SCRATCH REGISTERS
POP P,T2
POP P,T1
MOVEM T0,1(L) ;STORE THE IMAG ANS
POP P,T0
PUSH P,REAL ;PUT REAL ANS ON THE STACK
POP P,(L) ;STORE THE REAL PART
POPJ P, ;RETURN
CALC: MOVE 0,ARG11 ;"A" TO AC0.
MOVE 2,ARG12 ;"B" TO AC2.
FMPR 0,ARG21 ;CALC A*C AND IF
JFCL OUFLO1 ;IT OVER/UNDERFLOWS, GO TO OUFLO1.
SECOND: FMPR 2,ARG22 ;CALC B*D AND IF
JFCL OUFLO2 ;IT OVER/UNDERFLOWS, GO TO OUFLO2.
FSBR 0,2 ;CALC A*C-B*D AND
POPJ 17, ;RETURN.
OUFLO1: MOVE 3,ARG22 ;"D" TO AC3.
SKIPN 0 ;JUMP IF OVERFLOW.
JRST UNDER1 ;UNDERFLOW, GO TO UNDER1
FMPRB 2,3 ;CALC B*D AND
JFCL OFL1OU ;IF OVER/UNDERFLOW GO TO OFL1OU.
XOR 3,0 ;OVERFLOW + NORMAL CASE
TLNN 3,400000 ;IF THE SIGNS ARE THE SAME, GO
JRST SROVNM ;TO SROVNM.O'E, GO TO INFIN.
INFIN: MOVEM 0,ANSTMP ;STORE ANSWER.
ERROR (APR,5,1,.+1) ;RETURN WITH ERROR MESSAGE
MOVE 0,ANSTMP ;PICK UP ANSWER.
POPJ 17, ;RETURN.
OFL1OU: JUMPE 2,INFIN ;OVERFLOW + UNDERFLOW CASE GOES TO INFIN.
XOR 3,0 ;OVERFLOW + OVERFLOW CASE.
TLNN 3,400000 ;IF THE SIGNS ARE THE
JRST SROVOV ;SAME, GO TO SROVOV,
JRST INFIN ;O'E, GO TO INFIN.
SROVNM: JUMPE 2,INFIN ;OVERFLOW + ZERO, GO TO INFIN.
MOVE 0,ARG21 ;C TO AC0.
FDVRI 0,202400 ;CALC. C/2.
FMPR 0,ARG11 ;CALC. (C/2)*A AND IF
JFCL 1,[POPJ 17,] ;IT OVERFLOWS, IMMEDIATELY RETURN.
FSBRM 0,2 ;CALC ((C/2*A)-(B*D).
FADR 0,2 ;CALC (A*C-B*D) AND
POPJ 17, ;RETURN.
SROVOV: MOVE 0,ARG21 ;C TO AC0.
FDVR 0,ARG22 ;CALC. (C/D).
MOVE 1,ARG12 ;B TO AC1.
FDVR 1,ARG11 ;CALC. (B/A).
FSBR 0,1 ;CALC. ((C/D)-(B/A)) AND
JFCL FIXUP ;IF IT UNDERFLOWS, GO TO FIXUP.
FMPR 0,ARG22 ;CALC. ((C)-(B/A)*D)) AND
JFCL ;SUPPRESS OVERFLOW MESSAGE.
FMPR 0,ARG11 ;CALC (A*C-B*D) AND
POPJ 17, ;RETURN.
FIXUP: FMPR 1,ARG22 ;CALC. ((B/A)*D).
MOVE 0,ARG21 ;C TO AC0.
FSBR 0,1 ;CALC. (C-(B/A)*D).
FMPR 0,ARG11 ;CALC. (A*C-B*D) AND
POPJ 17, ;RETURN.
UNDER1: FMPR 2,3 ;CALC. B*D AND GO
JFCL U1OU ;TO U1OU IF OVER/UNDERFLOW.
MOVM 3,2 ;IF B*D IS <2**-105,
CAMGE 3,[030400000000] ;GO
JRST .+3 ;TO .+3.
MOVN 0,2 ;NO BITS CAN BE SAVED,
POPJ 17, ;FIX SIGN AND RETURN.
FMPRI 2,232400 ;CALC B*D*(2**27).
UNDR1: MOVE 0,ARG11 ;CALC
FMPRI 0,232400 ;A*C*(2**27)
FMPR 0,ARG21 ;AND SUPPRESS AN
JFCL ;ERROR MESSAGE.
FSBR 0,2 ;CALC (2**27)(A*C-B*D),
FDVRI 0,232400 ;CALC (A*C-B*D) AND
POPJ 17, ;RETURN.
U1OU: JUMPE 2,.+3 ;IF OVERFLOW + UNDERFLOW, GO
MOVNM 2,ANSTMP ;TO ERROR
JRST INFIN+1 ;RETURN.
MOVE 2,ARG12 ;O'E, TRY TO SAVE BITS.
FMPRI 2,232400 ;CALC. B*(2**27).
FMPR 2,ARG22 ;CALC B*D*(2**27)
JFCL ;AND SUPPRESS UNDERFLOW MESSAGE
MOVE 0,ARG11 ;CALC. A*(2**27) AND
FMPRI 0,232400 ;A*(2**27)*C
FMPR 0,ARG21 ;AND SUPPRESS
JFCL ;UNDERFLOW MESSAGE.
JUMPN 2,UNDR1+4 ;IF BOTH UNDERFLOW, RETURN
JUMPN 0,UNDR1+5 ;AN ERROR MESSAGE. O'E,
ERROR (APR,7,1,.+1) ;ERROR MESSGE
SETZ 0, ;CLEAR AC0
POPJ 17, ;CALC.
OUFLO2: JUMPN 2,.+11 ;JUMP AHEAD IF (B*D) OVERFLOWED.
CAML 0,[030400000000] ;IF NO BITS CAN BE SAVED,
POPJ 17, ;RETURN.
FMPRI 0,232400 ;CALC. (2**27)*(A*C)
MOVE 2,ARG12 ;AND
FMPRI 2,232400 ;THEN
FMPR 2,ARG22 ;(2**27)*(B*D)
JFCL ;AND GO TO THE REST
JRST UNDR1+4 ;OF THE CALC.
MOVEM 2,1 ;OVERFLOW + NORMAL.
XOR 1,0 ;IF THE SIGNS ARE THE SAME,
TLNN 1,400000 ;GO TO SROVN; O'E
JRST SROVN ;SET UP
MOVNM 2,ANSTMP ;THE ANSWER AND
JRST INFIN+1 ;GO TO ERROR EXIT.
SROVN: MOVE 3,ARG22 ;"D" TO AC3.
FDVRI 3,202400 ;CALC (D/2).
FMPR 3,ARG12 ;CALC (B*(D/2)) AND IF
JFCL FIXUP2 ;IT OVERFLOWS, GO TO FIXUP2.
FSBR 0,3 ;CALC. ((A*C)-(B*(D/2))).
FSBR 0,3 ;CALC (A*C-B*D) AND
POPJ 17, ;RETURN.
FIXUP2: MOVNM 3,ANSTMP ;SET UP THE ANSWER
JRST INFIN+1 ;AND GO TO ERROR EXIT.
ARG11: 0
ARG12: 0
ARG21: 0
ARG22: 0
REAL: 0
ANSTMP: 0
ENTRY CFM.0,CFM.2,CFM.4,CFM.6,CFM.10,CFM.12,CFM.14
ENTRY CMM.0,CMM.2,CMM.4,CMM.6,CMM.10,CMM.12,CMM.14
IFN F40LIB,<
;DEFINE THE OLD F40 NAMES
ENTRY CFMM.0,CFMM.2,CFMM.4,CFMM.6
CFMM.0=:CMM.0
CFMM.2=:CMM.2
CFMM.4=:CMM.4
CFMM.6=:CMM.6
>
PRGEND
TITLE CFDV %4.(207) ;FROM LIB40 VERSION .027
SUBTTL D. TODD /DRT/HPW 29-AUGUST-1973
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
;FROM V.026 24-MAR-70
;THIS PROGRAM CALCULATES THE QUOTIENT OF TWO FLOATING POINT
;NUMBERS IN THE FOLLOWING MANNER:
;(A+IB)/(C+ID) = [(AC+BD)+I(BC-AD)]/(C**2+D**2)
;IF OVER OR UNDERFLOW OCCURS AT ANY POINT IN THE
;CALCULATION, THE PROGRAM JUMPS TO A MORE
;INVOLVED ROUTINE IN WHICH THE ORDER IN WHICH THE
;TERMS ARE MULTIPLIED OR DIVIDED TOGETHER IS VERY
;IMPORTANT. OVER OR UNDERFLOW IS NOT PERMITTED
;UNLESS THE FINAL ANSWER OVER OR UNDERFLOWS.
;THERE ARE TWO SETS OF ENTRY POINTS FOR THE PROGRAM - ONE
;FOR THE DIVIDE ROUTINES AND ONE FOR THE DIVIDE-TO-MEMORY
;ROUTINES. THE CALLING SEQUENCE FOR THE DIVIDE ROUTINES IS
; MOVEI 16, ARG2
; PUSHJ 17, CFD.N
;WHERE N=0,2,4, OR 6. ARG1 IS ASSUMED TO BE IN AC N AND (N+1),
;AND THE RESULTS ARE RETURNED IN AC N AND AC (N+1)
;THE CALLING SEQUENCE FOR THE DIVIDE-TO-MEMORY ROUTINES IS
;AS FOLLOWS:
; MOVEI 16,ARG2
; PUSHJ 17,CFDM.N
;WHERE N=0,2,4, OR 6. ARG1 IS ASSUMED TO BE IN AC N AND (N+1),
;AND THE RESULTS ARE RETURNED IN ARG2 AND ARG2+1.
SEARCH FORPRM
DEFINE SYM(A,B)<
SIXBIT /A'B/
A'B: HRLI 16,B
JRST A'0
>
ZZ.=2
REPEAT 6,<
SYM(CFD.,\ZZ.)
SYM(CDM.,\ZZ.)
ZZ.=ZZ.+2
>
SIXBIT /CDM.0/
CDM.0: SETOM MEMFLG ;MEMORY FLAG.
JRST CFD.0+1 ;GO TO THE MAIN ROUTINE.
SIXBIT /CFD.0/
CFD.0: SETZM MEMFLG ;SET UP THE MEMORY FLAG
MOVSS 16 ;SET UP 16.
PUSH P,T0 ;SAVE TWO SCRATCH REGISTERS
PUSH P,T1
MOVEM 0,LCD ;SAVE AC 0 IN CASE IT IS AN ARG.
MOVE 0,(16) ;PICK UP REAL OF ONE ARG AND
MOVEM 0,SAB ;STORE IT IN SAB.
MOVE 0,1(16) ;PICK UP IMAG OF ONE ARG AND
MOVEM 0,LAB ;STORE IT IN LAB.
MOVE 0,LCD ;RESTORE AC0.
MOVSS 16 ;SET UP ADDRESS WORD.
MOVE 0,(16) ;PICK UP REAL OF THE OTHER ARG
MOVEM 0,SCD ;AND STORE IT IN SCD
MOVE 1,1(16) ;PICK UP IMAG. OF THIS ARG AND
MOVEM 1,LCD ;STORE IT IN LCD.
JUMPE 0,CZERO ;GO TO CZERO IF C=0, TO
JUMPE 1,DZERO ;DZERO IF D=0,
SKIPE SAB ;TO NORMAL IF ONLY
JRST NORMAL ;ONE OF A AND B
SKIPE LAB ;=0, TO ABEQZR
JRST NORMAL ;IF
ABEQZR: SETZM REAL ;A=
SETZM 0 ;B=
JRST OUT+1 ;0
DZERO: MOVE 0,SAB ;D IS ZERO, SO REAL (ANS)
FDVR 0,SCD ;= A/C AND
MOVEM 0,REAL ;IMAG (ANS) =
MOVE 0,LAB ;B/C
FDVR 0,SCD ;AND THEN
JRST OUT+1 ;GO TO EXIT
CZERO: MOVE 0,LAB ;C IS ZERO (POSSIBLY D IS
FDVR 0,LCD ;ZERO ALSO). REAL (ANS) =
MOVEM 0,REAL ;B/D AND
MOVN 0,SAB ;IMAG (ANS) =
FDVR 0,LCD ;-A/D AND THEN
JRST OUT+1 ;GO TO EXIT.
NORMAL: FMPR 0,SCD ;THIS SIMPLE ROUTINE
JFCL NTSMPL ;CALCULATES
FMPR 1,LCD ;REAL (ANS) =
JFCL NTSMPL ;(A*C+B*D)/(C(2)+D(2))
FADR 0,1 ;AND
JFCL NTSMPL ;IMAG (ANS) =
MOVEM 0,TEMP ;(B*C-A*D)/(C(2)+D(2))
MOVE 0,SCD ;BUT
FMPR 0,SAB ;IF
JFCL NTSMPL ;AT
MOVE 1,LAB ;ANY
FMPR 1,LCD ;POINT
JFCL NTSMPL ;OVER
FADR 0,1 ;OR
JFCL NTSMPL ;UNDERFW
FDVR 0,TEMP ;OCCURS
JFCL NTSMPL ;IT
MOVEM 0,REAL ;JUMPS
MOVE 0,SAB ;TO
FMPR 0,LCD ;NTSMPL
JFCL NTSMPL ;FOR
MOVE 1,LAB ;A
FMPR 1,SCD ;DIFFERENT
JFCL NTSMPL ;CALCULATION.
FSBRM 1,0 ;IF THERE IS
JFCL NTSMPL ;OVER OR
FDVR 0,TEMP ;UNDERFLOW
JRST OUT+1 ;IT EXITS TO OUT+1.
NTSMPL: MOVEM 2,SAVE2 ;SAVE THE CONTENTS OF AC2.
MOVEM 3,SAVE3 ;SAVE THE CONTENTS OF AC3.
MOVEM 4,SAVE4 ;SAVE THE CONTENTS OF AC4.
MOVE 2,SAB ;REARRANGE THE REAL
MOVM 0,SAB ;AND IMAG PARTS OF
MOVM 1,LAB ;THE 1ST ARG
MOVEI 4,1 ;SO THAT THE SMALLER ONE
CAMG 0,1 ;(IN MAGNITUDE) IS IN
JRST .+4 ;SAB, AND THE OTHER IS IN
EXCH 2,LAB ;LAB AND SET UP AC4 AS
MOVEM 2,SAB ;A FLAG WORD TO TELL
MOVNS 4,4 ;WHICH PART IS WHERE.
MOVE 2,SCD ;REARRANGE THE REAL
MOVM 0,SCD ;AND IMAG PARTS OF THE OTHER ARG
MOVM 1,LCD ;SO THAT THE SMALLER ONE
CAMG 0,1 ;(IN MAGNITUDE) IS IN SCD AND
JRST .+4 ;THE OTHER IS IN LCD AND
EXCH 2,LCD ;FIX AC4 TO TELL WHICH
MOVEM 2,SCD ;PART
IMULI 4,3 ;IS WHERE.
MOVE 3,LCD ;CALCULATE
FDVRB 2,3 ;THE
JFCL ;TERM
FMPR 2,2 ;1+(SCD/LCD)**2
JFCL ;AND
FADRI 2,201400 ;STORE IT IN
MOVEM 2,DENOM ;DENOM.
MOVE 0,SAB ;CALCULATE
FDVR 0,LAB ;(SCD/LCD)*(SAB/LAB)
JFCL ;SUPPRESSING
FMPRM 0,3 ;UNDERFLOW
JFCL ;IF NECESSARY.
CAIN 4,1 ;FIX THE AC FLAG WORD
MOVNI 4,2 ;FOR
ADDI 4,1 ;EASY COMPARISONS.
SKIPL 4 ;CALCULATE
MOVNS 3,3 ;+-1 +-(SCD/LCD)*(SAB/LAB),
FADRI 3,201400 ;WHERE THE SIGNS
SKIPN 4 ;DEPEND ON
MOVNS 3,3 ;THE AC FLAG WORD.
PUSHJ 17,CALC34 ;JUMP TO CALC OF (LAB/LCD)*(AC3/DENOM).
MOVEM 0,REAL ;STORE IT IN REAL(ANS) AND
MOVEM 0,IMAG ;IMAG(ANS)(THE TEMP. LOCATIONS).
MOVE 3,SAB ;CALCULATE
MOVE 2,SCD ;+-(SAB/LAB)+-(SCD/LCD)
CAMN 4,[-2] ;WHERE THE SIGNS
MOVNS 2,2 ;AGAIN DEPENDS ON
CAMN 4,[-1] ;THE AC FLAG WORD,
MOVNS 3,3 ;AND IF UNDERFLOW
MOVE 0,2 ;OCCURS JUMP TO
MOVE 1,3 ;THE
FDVR 3,LAB ;SPECIAL
JFCL OVER1 ;ROUTINES-
FDVR 2,LCD ;OVER1,
JFCL OVER2 ;OVER2,
ADD2: FADR 3,2 ;OR
JFCL OVER3 ;OVER3.
PUSHJ 17,CALC34 ;JUMP TO CALC OF(LAB/LCD)*(AC3/DENOM).
JUMPGE 4,.+3 ;STORE THIS IN
MOVEM 0,IMAG ;THE CORRECT
JRST .+2 ;PART OF THE
MOVEM 0,REAL ;ANSWER (TEMP. LOCATION).
MOVE 2,SAVE2 ;RESTORE THE CONTENTS OF AC2.
MOVE 3,SAVE3 ;RESTORE THE CONTENTS OF AC3.
MOVE 4,SAVE4 ;RESTORE THE CONTENTS OF AC4.
OUT: MOVE 0,IMAG ;PICK UP THE IMAG (ANS)
SKIPN MEMFLG ;SET UP AC L TO
MOVSS L ;CONTAIN THE ANSWER ADDRESS.
POP P,T1 ;RESTORE T1
MOVEM 0,1(L) ;STORE THE IMAG (ANS) IN ITS FINAL LOCATION, AND
POP P,T0 ;RESTORE T0
PUSH P,REAL ;GET THE REAL PART
POP P,(L) ;STORE THE REAL PAR
POPJ 17, ;EXIT.
CALC34: MOVM 1,LAB ;CALC34 CALCS. (LAB/LCD)*(AC3/DENOM).
MOVM 2,LCD ;/LAB/ TO AC 1 AND /LCD/ TO AC 2.
MOVM 0,3 ;/AC3/ TO AC 0.
CAMGE 2,ONE ;GO TO CASEA IF
JRST CASEA ;/LCD/<1.0. O'E, STAY HERE.
CAMGE 1,ONE ;GO TO CASEB IF /LCD/>1.0 AND
JRST CASEB ;/LAB/<1.0 OR IF
CAMGE 0,ONE ;(>1)(<1)/(>1)(>1).
JRST CASEB ;STAY HERE IF (>1)(>1)/
FDVR 2,1 ;(>1)(>1).
FDVR 0,DENOM ;CALCULATE
FDVR 0,2 ;IT AND GO
JRST SETSGN ;TO SETSGN.
CASEB: FMPR 0,1 ;CALCULATE CASE B AND
JRST .-4 ;GO TO SETSGN (EVENTUALLY).
CASEA: FMPR 2,DENOM ;CONDENSE THE DENOMINATOR INTO AC 2.
CAMLE 1,ONE ;THEN (<1)(<1)/(<1) GOES
JRST CHKAGN ;TO SR, AND (>1)(><1)/(<>1)
CAMLE 0,ONE ;GOES TO CHKAGN,
JRST NOTRVS ;AND EVERYTHING ELSE
CAMG 2,ONE ;GOES TO
JRST SR ;NOTRVS.
NOTRVS: FMPRM 1,0 ;CALCULATE
JFCL 1,SETSGN ;NOTRVS AND GO
FDVR 0,2 ;TO
JRST SETSGN ;SETSGN.
CHKAGN: CAMG 0,ONE ;(>1)(<1)/(<>1)
JRST NOTRVS ;AND (>1)(>1)/(<1)
CAMG 2,ONE ;GO TO
JRST NOTRVS ;NOTRVS.
FDVR 1,2 ;(>1)(>1)/(>1) IS
FMPRM 1,0 ;CALCULATED AND
JRST SETSGN ;GOES TO SETSGN.
SR: MOVEM 1,TEMP ;SR CALCULATES
FDVR 1,2 ;(<1)(<1)/(<1)
JFCL OV1 ;AND SINCE
FMPRM 1,0 ;(<1)/(<1)
JRST SETSGN ;CAN
OV1: MOVE 1,TEMP ;OVERFLOW, IT
MOVEM 0,TEMP ;CALCULATES
FDVR 0,2 ;IT
JFCL OV2 ;WHICHEVER
FMPRM 1,0 ;WAY
JRST SETSGN ;IS
OV2: MOVE 0,TEMP ;NECESSARY
FMPRM 1,0 ;AND
FDVR 0,2 ;THEN GOES TO SETSGN.
SETSGN: MOVE 1,LAB ;GET THE
XOR 1,LCD ;SIGN OF THE
XOR 1,3 ;RESULT IN AC 1.
SKIPG 1 ;SET THE SIGN OF
MOVNS 0,0 ;THE ANSWER
POPJ 17, ;AND EXIT.
OVER1: FDVR 2,LCD ;IF ONE
JFCL UU ;TERM
MOVE 3,2 ;UNDERFLOWS
MOVE 0,1 ;AND THE OTHER
MOVE 2,LAB ;TERM IS SO LARGE
JRST OVER2+1 ;THAT NO BITS
OVER2: MOVE 2,LCD ;CAN BE
MOVEM 2,SAVE5 ;SAVED,
JUMPE 3,UU ;THEN
MOVM 1,3 ;RETURN
CAML 1,[030400000000] ;RIGHT
JRST ADD2+2 ;AWAY.
FMPRI 3,270400 ;O'E, TRY TO
FMPRI 0,270400 ;SAVE SOME BITS
FDVRM 0,2 ;BY MULTIPLYING
JFCL ;THE TERMS BY 2**56,
FADRB 3,2 ;ADDING THE TERMS, AND THEN / BY 2**56.
FDVRI 3,270400 ;IF THE RESULT UNDERFLOWS, GO
JFCL SRX ;TO SRX, O'E GO BACK
JRST ADD2+2 ;TO THE MAIN ROUTINE.
OVER3: MOVE 3,1 ;SET UP
FDVR 3,LAB ;AC 2 FOR
FMPRI 3,270400 ;SRX. AC 2 WILL
FMPRI 2,270400 ;CONTAIN THE TERM
FADR 2,3 ;*(2**56).
SRX: MOVEM 5,SAVE5 ;SAVE THE CONTENTS OF AC 5.
MOVE 0,LCD ;THIS IS AN
MOVE 1,LAB ;ALTERNATE
MOVM 5,1 ;CALCULATION TO
CAMGE 5,ONE ;CALC34, AND TAKES
JRST SRX2 ;ADVANTAGE OF
FMPR 1,2 ;THE FACT THAT HERE
MOVM 5,0 ;DENOM CONTAINS 1.0.
CAML 5,ONE ;THE ORDER OF
JRST .+4 ;CALCULATION
FMPRI 0,270400 ;DEPENDS
FDVRM 1,0 ;ON THE SIZE OF
JRST SETSN2 ;THE TERMS. AFTER
FDVRM 1,0 ;THE CALCULATION A
FDVRI 0,270400 ;TRANSFER
JRST SETSN2 ;IS
SRX2: FDVRM 2,0 ;MADE
FMPR 0,1 ;TO
FDVRI 0,270400 ;SETSN2
SETSN2: MOVE 5,SAVE5 ;RESTORE THE CONTENTS OF AC 5.
JRST ADD2+3 ;GO BACK TO MAIN ROUTINE.
UU: MOVEM 0,SAB ;ANOTHER ALTERNATE
MOVEM 1,SCD ;CALCULATION TO
FMPR 1,LCD ;CALC34
FMPR 0,LAB ;USED WHEN
FADR 0,1 ;S/L FOR
JFCL UND ;BOTH SETS
FDVR 0,LCD ;HAS UNDERFLOWED
FDVR 0,LCD ;OR FOR
JRST ADD2+3 ;UNDERFLOW PLUS
UND: ERROR (APR,7,1,.+1)
JRST ADD2+3 ;TO ADD2+3.
SAVE2: 0
SAVE3: 0
SAVE4: 0
SAVE5: 0
SAB: 0
LAB: 0
SCD: 0
LCD: 0
TEMP: 0
REAL: 0
IMAG: 0
DENOM: 0
MEMFLG: 0
ONE: 201400000000
ENTRY CFD.0,CFD.2,CFD.4,CFD.6,CFD.10,CFD.12,CFD.14
ENTRY CDM.0,CDM.2,CDM.4,CDM.6,CDM.10,CDM.12,CDM.14
IFN F40LIB,<
;EQUATE THE OLD F40 NAMES
ENTRY CFDM.0,CFDM.2,CFDM.4,CFDM.6
CFDM.0=:CDM.0
CFDM.2=:CDM.2
CFDM.4=:CDM.4
CFDM.6=:CDM.6
>
PRGEND
TITLE REAL %4.(235) COMPLEX TO REAL CONVERSION
SUBTTL H. P. WEISS/HPW 11-DEC-73
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
SEARCH FORPRM
ENTRY REAL
EXTERN REAL.
REAL=REAL.
PRGEND
TITLE REAL. %4.(120) ;FROM LIB40 VERSION .022
SUBTTL D. TODD /DRT 15-FEB-1973
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
;FROM V.005
;COMPLEX TO REAL CONVERSION FUNCTION
;THIS ROUTINE RETURNS THE REAL PART OF A COMPLEX NUMBER
;THE ROUTINE IS CALLED IN THE FOLLOWING MANNER:
; JSA Q., REAL
; EXP ARG
;THE ANSWER IS RETURNED IN ACCUMULATOR A
SEARCH FORPRM
A= 0
Q= 16
HELLO (REAL,.) ;[235] ENTRY TO REAL ROUTINE
MOVE A, @(Q) ;GET REAL PART OF ARGUMENT
GOODBY (1) ;RETURN
PRGEND
TITLE AIMAG %4.(235) COMPLEX TO REAL CONVERSION
SUBTTL H. P. WEISS/HPW 11-DEC-73
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
SEARCH FORPRM
ENTRY AIMAG
EXTERN AIMAG.
AIMAG=AIMAG.
PRGEND
TITLE AIMAG. %4.(235) COMPLEX TO REAL COVERSION
SUBTTL D. TODD /DRT 25-MAY-1973
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
;FROM LIB40 V.022
;FROM V.005
;COMPLEX TO IMAGINARY CONVERSION FUNCTION
;THIS ROUTINE RETURNS THE IMAGINARY PART OF A COMPLEX NUMBER
;THE ROUTINE IS CALLED IN THE FOLLOWING MANNER:
; JSA Q., AIMAG
; EXP ARG
;THE ANSWER IS RETURNED IN ACCUMULATOR A
SEARCH FORPRM
A= 0
B= 1
Q= 16
HELLO (AIMAG,.) ;[235]ENTRY TO AIMAG ROUTINE
MOVEI B,@(Q) ;PUT IMAG(ARG)
MOVE A,1(B) ;IN AC A.
GOODBY (1) ;RETURN
PRGEND
TITLE CONJG %4.(235) COMPLEX CONJUGATE FUNCTION
SUBTTL H. P. WEISS/HPW 11-DEC-73
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
SEARCH FORPRM
ENTRY CONJG
EXTERN CONJG.
CONJG=CONJG.
PRGEND
TITLE CONJG. %4.(235) COMPLEX CONJUGATE FUNCTION
SUBTTL D. TODD /DRT 15-FEB-1973
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
;FROM LIB40 V.022
;COMPLEX CONJUGATE FUNCTION
;THIS ROUTINE CALCULATES THE COMPLEX CONJUGATE OF ITS ARGUMENT
;THE ROUTINE IS CALLED IN THE FOLLOWING MANNER:
; JSA Q., CONJG
; EXP ARG
;THE REAL PART OF THE ANSWER IS LEFT IN ACCUMULATOR A, AND THE
;IMAGINARY PART IN ACCUMULATOR B.
SEARCH FORPRM
A= 0
B= 1
Q= 16
HELLO (CONJG,.) ;[235] ENTRY TO CONJG ROUTINE
MOVEI B, @(Q) ;GET ADDRESS OF COMPLEX ARGUMENT
MOVE A, (B) ;GET REAL PART OF ARGUMENT
MOVN B, 1(B) ;GET NEGATIVE OF IMAGINARY PART
GOODBY (1) ;RETURN
PRGEND
TITLE CMPLX %4.(235) REAL TO COMPLEX CONVERSION
SUBTTL H. P. WEISS/HPW 11-DEC-73
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
SEARCH FORPRM
ENTRY CMPLX
EXTERN CMPLX.
CMPLX=CMPLX.
PRGEND
TITLE CMPLX. %4.(235) REAL TO COMPLEX CONVERSION
SUBTTL D. TODD /DRT 15-FEB-1973
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;COPYRIGHT (C) 1972,1977 BY DIGITAL EQUIPMENT CORPORATION
;FROM LIB40 V.022
;FROM V.005
;REAL TO COMPLEX CONVERSION FUNCTION
;THIS ROUTINE CONVERTS TWO REAL ARGUMENTS TO A COMPLEX NUMBER
;OF THE FORM ARG1+I*ARG2
;THE ROUTINE IS CALLED IN THE FOLLOWING MANNER:
; JSA Q.,CMPLX
; EXP ARG1
; EXP ARG2
;THE REAL PART OF THE ANSWER IS LEFT IN ACCUMULATOR A, AND THE
;IMAGINARY PART IS LEFT IN ACCUMULATOR B
SEARCH FORPRM
A=0
B=1
Q=16
HELLO (CMPLX,.) ;[235] ENTRY TO CMPLX ROUTINE
MOVE A,@(Q) ;GET REAL PART OF COMPLEX ANSWER
MOVE B,@1(Q) ;GET IMAGINARY PART OF COMPLEX ANS
GOODBY (2) ;RETURN
END