mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-10 20:33:47 +00:00
1969 lines
44 KiB
Plaintext
1969 lines
44 KiB
Plaintext
TITLE ARITH V.021 12-MAR-79
|
||
SUBTTL DEFNS FOR ARITHMETIC
|
||
|
||
|
||
|
||
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
|
||
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
|
||
;
|
||
;COPYRIGHT (C) 1970,1979 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
|
||
|
||
HISEG
|
||
|
||
; SOME UNIVERSAL DEFINITIONS
|
||
|
||
RADIX 10
|
||
RA=1
|
||
RB=2
|
||
RC=3
|
||
RD=4
|
||
RE=5
|
||
RF=6
|
||
RG=7
|
||
RH=8
|
||
RI=9
|
||
RJ=0
|
||
AMAG=RA
|
||
ASGN=RB
|
||
ASF=RC
|
||
BMAG=RD
|
||
BSGN=RE
|
||
BSF=RF
|
||
INTERN S80A
|
||
INTERNAL S76A,S83A,S84A,P92A,P93A
|
||
INTERNAL S86A,P75A,P78A,P82A,P77A,P81A,P80A,S87A
|
||
INTERNAL S75A,S82A,P76A,S5450A,P8530A,S5455A,S79A,SR1A
|
||
EXTERNAL S86,P75,P78,P82,P77,P81,P80
|
||
INTERNAL P83A,S78A,P94A,P84A,S77A,P85A,P91A,S81A,P90A
|
||
EXTERNAL P75.08
|
||
EXTERNAL S79.01,P84.97,P90.04,P90.05,P91.06,P91.03
|
||
EXTERNAL S83.96,S83.95,S84.99,S84.98,S84.97,S54.97
|
||
EXTERNAL P92,P93,S83.99,S83.98,S83.97,AS
|
||
EXTERNAL P79,P83,P84,P85,P90,P91,P94
|
||
EXTERNAL S76,S77,S78,S80,S81,S83,S84
|
||
EXTERNAL S87,S75,S82,P76,S54.50,P85.30,S54.55,S79,SR1
|
||
EXTERNAL P79.90,P79.91,P79.92,P79.89,P79.85,P79.86
|
||
EXTERNAL P79.87,P79.88,P80.97,P80.98,P80.99,P81.80
|
||
EXTERNAL P81.81,P81.82,P81.99,P82.80,P82.81,P82.82
|
||
EXTERNAL P82.90,P82.91,P82.92,P82.84,P83.94,P83.95
|
||
EXTERNAL P83.96,P83.97,P83.98,P83.99,P85.99,P85.98
|
||
EXTERNAL S75.93,S54.60,S54.98,S54.99,S80.98,S80.99
|
||
EXTERNAL S81.98,S85,S85.80,S85.81,S85.90,S85.95
|
||
EXTERNAL S85B,S85C,S85A,S85Y,S85M
|
||
EXTERNAL S86,P75,P78,P82,P77,P81,P80
|
||
EXTERNAL S87,S75,S82,P76,S54.50,P85.30,S54.55,S79,SR1
|
||
SUBTTL MACROS FOR ARITH
|
||
|
||
DEFINE RETURN (NAME,N)
|
||
<
|
||
IFE N-1,
|
||
<
|
||
AOS NAME
|
||
>
|
||
IFG N-1,
|
||
<
|
||
EXCH RA,NAME
|
||
ADDI RA,N
|
||
EXCH RA,NAME
|
||
>
|
||
JRST 2,@NAME
|
||
>
|
||
DEFINE PUT (P,Q)
|
||
<
|
||
MOVE Q'MAG,P'MAG
|
||
MOVE Q'SGN,P'SGN
|
||
MOVE Q'SF,P'SF
|
||
>
|
||
DEFINE PUTM (P,Q)
|
||
<
|
||
MOVEM P'MAG,Q'MAG
|
||
MOVEM P'SGN,Q'SGN
|
||
MOVEM P'SF,Q'SF
|
||
>
|
||
DEFINE NRMLZ
|
||
<
|
||
CAML AMAG,T80.08
|
||
JRST .+3
|
||
IMULI AMAG,^D10
|
||
SOJA ASF,.-3
|
||
>
|
||
DEFINE UNPK (P)
|
||
<
|
||
SETZM P'SGN
|
||
TLZE P'MAG,^O400000
|
||
TLO P'SGN,^O400000
|
||
>
|
||
DEFINE RENTRY (NAME,N)
|
||
<
|
||
IFE N-2,
|
||
<
|
||
JSR S86
|
||
>
|
||
IFE N-1,
|
||
<
|
||
JSR S87
|
||
>
|
||
>
|
||
|
||
DEFINE PACK (N)
|
||
<
|
||
OR AMAG,ASGN
|
||
IFE N-2,
|
||
<
|
||
OR BMAG,BSGN
|
||
>
|
||
>
|
||
DEFINE JADD
|
||
<
|
||
PACK 2
|
||
JSR P75
|
||
>
|
||
DEFINE JSUB
|
||
<
|
||
PACK 2
|
||
JSR P76
|
||
>
|
||
DEFINE JMPY
|
||
<
|
||
PACK 2
|
||
JSR P77
|
||
>
|
||
DEFINE JDIV (ZERO)
|
||
<
|
||
PACK 2
|
||
JSR P78
|
||
JRST ZERO
|
||
>
|
||
DEFINE JSQRT (NEG)
|
||
<
|
||
PACK 1
|
||
JSR P80
|
||
JRST NEG
|
||
>
|
||
DEFINE JEXP (OFLOW)
|
||
<
|
||
PACK 1
|
||
JSR P81
|
||
JRST OFLOW
|
||
>
|
||
DEFINE JLOG (ERR)
|
||
<
|
||
PACK 1
|
||
JSR P82
|
||
JRST ERR
|
||
>
|
||
SUBTTL ROUTINE P75...A=A+B
|
||
; CALLED BY:
|
||
; JSR P75;
|
||
; RETURN
|
||
PWR=BSF
|
||
MAX=^D10;
|
||
QUOT=AMAG;
|
||
REM=ASGN;
|
||
NORM=0;
|
||
|
||
P75A: RENTRY Q75,2; DATA SWITCH 1
|
||
JUMPE BMAG,P75.10; EXIT IF B=0
|
||
JUMPG AMAG,P75.01;
|
||
PUT (B,A);
|
||
; SET A=B AND EXIT IF A=0.
|
||
P75.10: RETURN (P75,NORM);
|
||
P75.01: CAMG ASF,BSF; SKIP IF A>B
|
||
JRST P75.50; TO INTERCHANGE TEST
|
||
|
||
P75.02: CAME ASGN,BSGN; SKIP IF SIGNS AGREE
|
||
MOVNS BMAG; COMPLEMENT SMALLER
|
||
SUBM ASF,BSF; PWR=ASF-BSF
|
||
CAILE PWR,MAX; SKIP IF SHIFT LE MAX
|
||
JRST P75.10; TO EXIT IF A+B=A
|
||
HLRM ASGN,P75.08; SAVE ASGN
|
||
ASH BMAG,1;
|
||
ASH AMAG,1;
|
||
MUL AMAG,T80(PWR); 2.A.10*PWR
|
||
JOV .+1;
|
||
ADD ASGN,BMAG; 2.A.10*PWR+2.B
|
||
JOV P75.53; TO.53 IF LEAST SIG. OFLOW
|
||
TLZE ASGN,^O400000; SKIP IF LSH IS POS
|
||
SUBI AMAG,1
|
||
P75.03: DIV AMAG,T80(PWR); (2.A.10*P+2.B)/10*P
|
||
JUMPE QUOT,P75.55; TO .55 IF QUOT=0
|
||
|
||
P75.04: CAML QUOT,P75.90; SKIP IF QUOT<2.10*8
|
||
JRST P75.06;
|
||
MOVE BMAG,REM;
|
||
MULI BMAG,^D10; 10.R/10*P
|
||
DIV BMAG,T80(PWR);
|
||
IMULI QUOT,^D10;
|
||
ADD QUOT,BMAG; 10.Q+10.R/10*P
|
||
P75.05: SOS ASF;
|
||
CAML QUOT,P75.90; SKIP IF Q<2.10*8
|
||
JRST P75.06;
|
||
IMULI QUOT,^D10; 10.Q TO Q
|
||
JRST P75.05; CONTINUE NORMALIZE
|
||
P75.06: CAMGE QUOT,P75.91; SKIP IF Q GE (2.10*9-1)
|
||
|
||
JRST P75.07;
|
||
AOS ASF;
|
||
IDIVI QUOT,^D10; Q/10 TO Q
|
||
P75.07: AOS QUOT; ROUND: Q=(Q+1)/2
|
||
ASH QUOT,-1;
|
||
|
||
XCT P75.08
|
||
RETURN (P75,NORM);
|
||
P75.50: CAML ASF,BSF; SKIP IF ABS(ASF) LE ABS(BSF)
|
||
JRST P75.52; ASF=BSF
|
||
P75.51: EXCH ASGN,BSGN;
|
||
EXCH ASF,BSF;
|
||
EXCH AMAG,BMAG;
|
||
JRST P75.02;
|
||
P75.52: CAMGE AMAG,BMAG; SKIP IF ABS(A) GE ABS(B)
|
||
JRST P75.51;
|
||
JRST P75.02; TO ARITH
|
||
P75.53: TLZ ASGN,^O400000; SET SIGN OF L.S. PLUS
|
||
AOJA AMAG,P75.03; INCREMENT MS HALF
|
||
P75.55: JUMPN REM,P75.04;
|
||
SETZB AMAG,ASF;
|
||
MOVEI ASGN,0;
|
||
JRST P75.10; A=0 AND EXIT
|
||
|
||
P75.90: DEC 200000000;
|
||
P75.91: DEC 1999999999;
|
||
SUBTTL P76.....SUBTRACT....A=A-B
|
||
|
||
; ROUTINE P76..A=A-B
|
||
; CALLED BY:
|
||
; JSR P76;
|
||
; RETURN
|
||
|
||
NORM=0;
|
||
|
||
P76A: JUMPE BMAG,P76.02; A-B=A IF B=0
|
||
TLC BMAG,^O400000; CHANGE SIGN
|
||
JSR P75
|
||
RETURN P76,NORM
|
||
P76.02: UNPK A
|
||
P76.01: RETURN (P76,NORM); EXIT
|
||
SUBTTL P77.....MULTIPLY.....A=A.B
|
||
;ROUTINE P77..A=A.B
|
||
;CALLED BY:
|
||
; JSR P77;
|
||
; RETURN
|
||
|
||
|
||
PWR=BSF;
|
||
PROD=BMAG;
|
||
NORM=0;
|
||
|
||
|
||
P77A: RENTRY Q77,2; DATA SWITCH 3
|
||
JUMPN BMAG,P77.02; JUMP IF B NE 0
|
||
MOVEI AMAG,0; SET ANS=0 IF B=0
|
||
SETZB ASGN,ASF
|
||
P77.01: RETURN (P77,NORM); EXIT
|
||
P77.02: JUMPE AMAG,P77.01; TO EXIT IF A=0
|
||
XOR ASGN,BSGN; SIGN OF RESULT TO ASGN
|
||
|
||
ADD ASF,BSF; SCALE FACTOR..TO BE ADJUSTED
|
||
ASH BMAG,1; 2.B
|
||
MUL BMAG,AMAG; 2.A.B
|
||
;
|
||
; IF 2.A.B<2.10*17-10*8, DIV BY 10*8
|
||
; OTHERWISE INCREMENT ASF AND DIV BY 10*9
|
||
|
||
HRRI PWR,^D8; SET FOR 10*8
|
||
CAML PROD,P77.90; SKIP IF LESS
|
||
|
||
JRST P77.50; G.E.
|
||
P77.03: DIV PROD,T80(PWR); 2.A.B/10*PWR
|
||
ADDI PROD,1; ROUND: PROD=(PROD+1)/2
|
||
ASH PROD,-1;
|
||
MOVE AMAG,PROD; RESULT TO A
|
||
JRST P77.01; TO EXIT
|
||
|
||
;
|
||
; 2.A.B GE 2.10*17-10*8
|
||
;
|
||
P77.50: CAME PROD,P77.90; SKIP IF MOST SIG. HALF IS EQUAL
|
||
JRST P77.51; GREATER
|
||
CAMGE PROD+1,P77.91; SKIP IF L.S.HALF IS GE
|
||
JRST P77.03; LSH IS LESS; TO DIVIDE BY 10*8
|
||
P77.51: HRRI PWR,^D9; SET FOR 10*9
|
||
AOJA ASF,P77.03; INCREMENT SF; TO DIVIDE BY 10*9
|
||
|
||
|
||
P77.90: DEC 5820766; Q[(2.10*17-10*8)/2*35]
|
||
P77.91: DEC 3038650112; R[ ]
|
||
SUBTTL ROUTINE P78A: A=A/B
|
||
SUBTTL ROUTINE P78A: A=A/B
|
||
; CALLED BY:
|
||
; JSR P78;
|
||
; ERROR: DIVISION BY ZERO
|
||
|
||
; NORMAL
|
||
|
||
ERR=0;
|
||
NORM=1;
|
||
|
||
P78A: RENTRY Q78,2; DATA SWITCH 4
|
||
JUMPN BMAG,P78.02; ERROR IF B=0
|
||
P78.06: RETURN P78,ERR; ERROR EXIT
|
||
P78.02: JUMPN AMAG,P78.08; EXIT IF A=0
|
||
P78.04: RETURN (P78,NORM); NORMAL EXIT
|
||
|
||
P78.08: XOR ASGN,BSGN; SIGN OF ANSWER
|
||
SUB ASF,BSF; SF (TO BE ADJUSTED)
|
||
MOVEI BSGN,^D8; SET P=8
|
||
CAMGE AMAG,BMAG; SKIP IF AMAG GE BMAG
|
||
JRST P78.50;
|
||
P78.10: MOVE BSGN,T80(BSGN); 10*P (P=8 OR P=9)
|
||
ASH AMAG,1; 2A
|
||
MUL BSGN,AMAG; 2A.10*P
|
||
DIV BSGN,BMAG; 2A.10*P/B
|
||
ADDI BSGN,1; ROUND
|
||
ASH BSGN,-1;
|
||
MOVE AMAG,BSGN; STORE IN A
|
||
JRST P78.04; TO EXIT
|
||
P78.50: HRRI BSGN,^D9; SET P=9
|
||
SOJA ASF,P78.10; DECREMENT SF .. BACK TO COMPUTE
|
||
SUBTTL ROUTINE P79:A*B
|
||
SUBTTL ROUTINE P79:A*B
|
||
; CALLED BY:
|
||
; JSR P79;
|
||
; ERR 1: NEG NO. TO FRACT. PWR.
|
||
; ERR 2: A*B>2*36-1
|
||
; ERR 3: ZERO TO NEGATIVE PWR.
|
||
; NORMAL RETURN
|
||
|
||
INTERN P79A
|
||
|
||
NEG=0;
|
||
OFLO=1;
|
||
ERR=2;
|
||
NORM=3;
|
||
YMAG=RG;
|
||
YSGN=RH;
|
||
YSF=RI;
|
||
TBMAG=RJ;
|
||
DEFINE EXIT (N)
|
||
<
|
||
IFE N-1,
|
||
<
|
||
AOS P79
|
||
>
|
||
IFG N-1,
|
||
<
|
||
EXCH RA,P79
|
||
ADDI RA,N
|
||
EXCH RA,P79
|
||
>
|
||
JRST P79.06
|
||
>
|
||
TAMAG=P79.90
|
||
TASGN=P79.91
|
||
TASF=P79.92
|
||
|
||
|
||
EXTERN S68
|
||
P79A: JSR S86
|
||
JRST P79.10;
|
||
P79.01: EXIT (NORM);
|
||
P79.02: EXIT (ERR); ZERO TO NEGATIVE
|
||
P79.03: EXIT (OFLO); A*B>2*36-1
|
||
P79.04: EXIT (NEG); NEG A TO FRACT B
|
||
P79.06: MOVE RG,P79.85;
|
||
MOVE RH,P79.86;
|
||
MOVE RI,P79.87;
|
||
MOVE RJ,P79.88;
|
||
JRST 2,@P79;
|
||
P79.10: MOVEM RG,P79.85; SAVE RG THRU RJ
|
||
MOVEM RH,P79.86;
|
||
MOVEM RI,P79.87;
|
||
MOVEM RJ,P79.88;
|
||
JUMPN BMAG,P79.12; TO .12 IF B NE 0
|
||
SETZB ASGN,ASF; SET Y=1 IF B=0
|
||
MOVE AMAG,T80.08
|
||
JRST P79.01; TO EXIT
|
||
|
||
; B NE 0
|
||
P79.12: JUMPN AMAG,P79.20; TO .20 IF A NE 0
|
||
JUMPN BSGN,P79.02; ERROR IF A=0 AND B<0
|
||
JRST P79.01; SET Y=0 IF A=0 AND B>00
|
||
|
||
; A NE 0 AND B NE0
|
||
; TEST FOR B INTEGRAL
|
||
P79.13: MOVEM ASGN,P79.89; SAVE SIGN OF A
|
||
JUMPL BSF,P79.18; TO .18 IF ABS(B)<1
|
||
CAILE BSF,^D8;
|
||
JRST P79.22; TO .22 IF ABS(B)>10*9
|
||
PUTM (B,TA); SAVE B IN TA
|
||
MOVNI BSF,-^D8(BSF); P=8-SF(B)
|
||
IDIV BMAG,T80(BSF); !B!/10*(8-SF(B))
|
||
JUMPN BSGN,P79.16; TO .16 IF REMAINDER NE 0
|
||
|
||
; B IS INTEGRAL
|
||
CAIE BMAG,1;
|
||
JRST P79.15; TO .15 IF !B! NE 1
|
||
|
||
; !B!=1
|
||
SKIPN TASGN;
|
||
JRST P79.01; SET Y=A IF B=1
|
||
MOVE BMAG,T80.08
|
||
SETZB BSGN,BSF; SET Y=1/A IF B=-1
|
||
EXCH AMAG,BMAG;
|
||
EXCH ASGN,BSGN;
|
||
EXCH ASF,BSF;
|
||
JDIV (P79.03);
|
||
JRST P79.01; TO EXIT
|
||
|
||
; B INTEGRAL AND !B! NE 1
|
||
P79.15: CAMN AMAG,T80.08; SKIP IF A NE PWR(10)
|
||
JRST P79.30;
|
||
CAIG BMAG,^D29;
|
||
JRST P79.24; TO .24 IF !B! LE 29
|
||
|
||
; B INTEGRAL AND !B!>29
|
||
TLZN ASGN,^O400000; SET FOR LOG(ABS(A))
|
||
JRST P79.16; TO .16 IF A WAS POSITIVE
|
||
|
||
; A<0
|
||
TRNN BMAG,1; SET SGN(Y=(-1)*B
|
||
MOVEM ASGN,P79.89;
|
||
|
||
|
||
|
||
P79.16: PUT (TA,B); RESTORE B
|
||
P79.17: JLOG (P79.04); LOG(A), TO ERROR IF A<0
|
||
; B.LOG
|
||
JMPY
|
||
JEXP (P79.03); WXP(B.LOG(A)); TO ERROR IF OFLO
|
||
MOVE ASGN,P79.89; Y=EXP(B.LOG(A)).SGN
|
||
JRST P79.01; TO EXIT
|
||
|
||
; !B!<1
|
||
P79.18: JUMPN ASGN,P79.04; TO ERROR IF A<0
|
||
CAME BSF,P79.95;
|
||
JRST P79.17; TO .17 IF !B! NE1/2
|
||
CAME BMAG,P79.96;
|
||
JRST P79.17; TO .17 IF !B! NE 1/2
|
||
|
||
; !B!=1/2
|
||
JSQRT (P79.04);
|
||
JUMPE BSGN,P79.01; Y=SQRT(A) IF B>0
|
||
MOVE BMAG,T80.08
|
||
SETZB BSGN,BSF; Y=1/SQRT(A) IF B<0
|
||
EXCH AMAG,BMAG; BOTH SIGNS ARE 0
|
||
EXCH ASF,BSF;
|
||
JDIV (P79.03);
|
||
JRST P79.01; TO EXIT
|
||
|
||
; TEST FOR A=1
|
||
P79.20: JUMPN ASGN,P79.13; TO .13 IF A<0
|
||
JUMPN ASF,P79.13; TO .13 IF A NE X.X (10*0)
|
||
CAME AMAG,T80.08
|
||
JRST P79.13; TO .13 IF A NE 1
|
||
JRST P79.01; SET Y=1 IF A=1
|
||
|
||
|
||
; ~ B>10*9; TREAT LIKE INTEFER
|
||
P79.22: MOVEI ASGN,0; RET FOR LOG(!A!)
|
||
MOVEM ASGN,P79.89; SET SGN(Y) +
|
||
JRST P79.17; TO Y=EXP(B.LOG(A))
|
||
|
||
; A=PWR(10); B INTEGRAL
|
||
P79.30: TRNN BMAG,1; SKIP IF B IS ODD
|
||
MOVEI ASGN,0; IF B IS EVEN, ANS IS +
|
||
SKIPE TASGN; RESTORE SIGN OF B
|
||
MOVNS BMAG;
|
||
IMUL ASF,BMAG; 10*P)*B=10*(PB)
|
||
JRST P79.01; TO EXIT
|
||
|
||
; B INTEGRAL AND !B! LE 29
|
||
P79.24: MOVE BSGN,TASGN
|
||
|
||
; B INTEGRAL
|
||
; 1<ABS(B) LE 29
|
||
; ~BMAG CONTAINS INTEGRAL ABS(B)
|
||
|
||
P79.70: MOVE YMAG,T80.08; Y=1:MAG=10*8
|
||
SETZB YSF,YSGN; SF=SGN=0
|
||
MOVE TBMAG,BMAG; SAVE MAG(B) FOR LATER USE
|
||
JUMPL BSGN,P79.80; COMPUTE 1/A IF B<0
|
||
P79.72: PUTM (A,TA); SAVE A
|
||
TRNN TBMAG,1; SKIP IF NEXT PWR(2) IS PRERENT
|
||
JRST P79.75;
|
||
PUT (Y,B);
|
||
JMPY
|
||
PUT A,Y
|
||
ASH TBMAG,-1; B=IP(B/2)
|
||
JUMPE TBMAG,P79.01; DONE IF B=0
|
||
PUT (TA,A); RESTORE A
|
||
P79.74: PUT (A,B);
|
||
JMPY
|
||
JRST P79.72; LOOP
|
||
P79.75: ASH TBMAG,-1; B=IP(B/2)
|
||
JRST P79.74; TO SQUARE A
|
||
|
||
; B<0; SET A=1/A
|
||
P79.80: PUT A,B
|
||
PUT (Y,A); Y=1
|
||
JDIV (P79.03); A=1/A
|
||
JRST P79.72;
|
||
|
||
P79.94: DEC 230258509; 10*8.LN(10)
|
||
P79.95: OCT 777777777777; -1
|
||
P79.96: DEC 500000000; 1/2 . 10*9
|
||
|
||
SUBTTL P80A: A=SQRT(A)
|
||
; CALLED BY:
|
||
; JSR P80;
|
||
; ERROR: A<0
|
||
; NORMAL
|
||
|
||
ERR=0;
|
||
NORM=1;
|
||
ROOT=AMAG;
|
||
ARG=RF;
|
||
|
||
DEL=RD;
|
||
TBMAG=P80.97
|
||
TBSGN=P80.98
|
||
TBSF=P80.99
|
||
|
||
|
||
P80A: RENTRY Q80,1; DATA SWITCH 6
|
||
JUMPN AMAG,P80.11; EXIT IF A = 0
|
||
P80.10: RETURN (P80,NORM);
|
||
P80.11: JUMPE ASGN,P80.14;
|
||
RETURN (P80,ERR); ERROR EXIT: A<0
|
||
P80.14: PUTM (B,TB); SAVE B
|
||
MOVE ARG,AMAG; A TO ARG
|
||
TRNN ASF,1; SKIP IF SF IS ODD
|
||
JRST P80.50; SF IS EVEN
|
||
IMULI ARG,^D10; 10.A TO A
|
||
MOVE ROOT,T80.09; 10*9 TO GUESS
|
||
|
||
P80.01: ASH ASF,-1; SF=SF/2
|
||
P80.02: MOVE DEL,ARG; BEGIN LOOP
|
||
MUL DEL,T80.08; 10*8.A
|
||
DIV DEL,ROOT;
|
||
SUBM ROOT,DEL; D=X-10*8.A/X
|
||
ASH ROOT,1;
|
||
SUB ROOT,DEL;
|
||
ASH ROOT,-1; X=(2.X-D)/2
|
||
CAIL DEL,^D10000; SKIP IF D<10*4
|
||
JRST P80.02; ITERATE
|
||
MOVE DEL,ARG;
|
||
MUL DEL,T80.08;
|
||
DIV DEL,ROOT;
|
||
SUB DEL,ROOT;
|
||
; ROUND IF 10*8A/X-X>1
|
||
CAIGE DEL,1
|
||
JRST P80.20; NOT GREATER
|
||
CAIG DEL,1; SKIP IF GREATER
|
||
JUMPE RE,P80.20; JUMP IF REMAINDER=0
|
||
AOS ROOT; ROUND UP
|
||
P80.20: PUT TB,B
|
||
RETURN (P80,NORM); RESTORE B AND EXIT
|
||
P80.50: MOVE ROOT,P80.90; 10*8.SQRT(10)+EPSILON TO GUESS
|
||
JRST P80.01;
|
||
|
||
P80.90: DEC 316227800; 10*8.SQRT(10)+24
|
||
SUBTTL P81A: A=EXP(A)
|
||
; JSR P81;
|
||
; OVERFLOW RETURN
|
||
; NORMAL RETURN
|
||
X=BMAG;
|
||
Y=BSGN;
|
||
I=AMAG;
|
||
NORM=1;
|
||
OFLO=0;
|
||
TBMAG=P81.80
|
||
TBSGN=P81.81
|
||
TBSF=P81.82
|
||
|
||
|
||
|
||
|
||
P81A: RENTRY Q81,1; DATA SWITCH 7
|
||
JUMPN AMAG,P81.01;
|
||
MOVE AMAG,T80.08; SET Y=1 IF A=0
|
||
P81.20: RETURN (P81,NORM); EXIT
|
||
P81.01: PUTM (B,TB); SAVE B
|
||
SETZM P81.99; SET FOR +ARG
|
||
CAIL ASF,3;
|
||
JRST P81.60; SF GE 3
|
||
CAIN ASF,2; SF LS3
|
||
JRST P81.61; SF=2
|
||
CAMGE ASF,P81.90; SF LS2
|
||
|
||
JRST P81.62; SF LS -5
|
||
P81.05: TLZE ASGN,^O400000; SF GE -5..SET SIGN +,SKIP IF +
|
||
AOS P81.99; SET FOR - ARG
|
||
MOVE X,AMAG; POSITION FOR DOUBLE LENGTH OPERATIONS
|
||
MOVEI Y,0;
|
||
JUMPL ASF,P81.50;
|
||
ASH X,4; X B31
|
||
MUL X,P81.95(ASF); XB31.10*SFXB32
|
||
DIV X,P81.91; XB63/10*8LN(10)B28
|
||
MOVEI BSF,0
|
||
DIV Y,P81.91; REMAINDER DIVEDED AGAIN
|
||
;IP IN X...FP IN Y
|
||
MOVE ASF,X; SFX=IP(X.10*SFX)
|
||
MUL Y,P81.92; FP( ).LN(10)B3
|
||
ASHC Y,1; .25X B0
|
||
MOVE X,Y;
|
||
|
||
P81.10: HRLZI I,^O300000; SERIES...I=12B4
|
||
HRLZI Y,^O200000; Y=1B1
|
||
|
||
P81.11: MUL Y,X; X(B0).Y(B1)
|
||
ASHC Y,-4; X.Y(B5)
|
||
|
||
DIV Y,I; X.Y(B5)/I(B4)
|
||
ADD Y,P81.97; Y=X.Y/I+1 B1
|
||
SUB I,P81.98; I=I-1 B4
|
||
CAMLE I,[OCT 040000000000]; SKIP IF I LE 2B4
|
||
JRST P81.11;
|
||
MUL Y,X; X.Y B1
|
||
JUMPL Y,.+2;
|
||
AOSA Y;
|
||
SOS Y; ROUND
|
||
ASH Y,-1;
|
||
ADD Y,P81.97; Y=X.Y/2+1 B1
|
||
MUL Y,X;
|
||
ASHC Y,1; X.Y B0...ROUND AND SCALE AT B1
|
||
JUMPL Y,.+2;
|
||
AOSA Y;
|
||
SOS Y;
|
||
ASH Y,-1;
|
||
ADD Y,P81.97; Y=X.Y+1 B1 ROUNDED
|
||
P81.12: MUL Y,Y; Y*2 B2
|
||
TLNE BSF,^O200000; ROUND
|
||
AOS Y;
|
||
MUL Y,Y; Y*4 B4
|
||
TLNE BSF,^O200000; ROUND
|
||
AOS Y;
|
||
MOVE AMAG,Y; SETUP FOR S75, B=4
|
||
SOSN P81.99; SKIP IF ARG WAS PLUS
|
||
JRST P81.14; COMPUTE 1/Y
|
||
P81.40: MOVEI ASGN,4
|
||
JSR S75;
|
||
MOVEI ASGN,0; SET SIGN +
|
||
P81.13: PUT TB,B
|
||
JRST P81.20
|
||
P81.14: HRLZI AMAG,^O001000; 1 B4
|
||
MOVEI ASGN,0; CLEAR ASGN
|
||
DIV AMAG,Y; 1/E*X
|
||
MOVNS ASF; ADJUST SCALE FACTOR
|
||
JRST P81.40; TO NORMALIZE AN D EXIT
|
||
P81.50: MOVMS ASF; ASF<0;ABS(ASF) TO ASF
|
||
ASHC X,-^D11; X B11
|
||
DIV X,P81.96-1(ASF); XB46/10*(7+SFX)B44
|
||
MOVEI ASF,0; X/4 B0; SFX=0
|
||
JRST P81.10; TO SERIES
|
||
P81.60: JUMPL ASGN,P81.65;
|
||
RETURN (P81,OFLO); SF(X) GE 3; OFLO IF +
|
||
P81.65: MOVEI AMAG,0; EXP(X)=0 IF -
|
||
SETZB ASGN,ASF;
|
||
JRST P81.20;
|
||
P81.61: CAMLE AMAG,P81.93; SFX=2; COMPARE MAG VS 10*8 LN 10
|
||
JRST P81.60; X>10*9.LN(10)
|
||
JRST P81.05; X LE 10*9.LN(10)
|
||
|
||
P81.62: SETZB BSGN,BSF; SF(X) LS -5
|
||
MOVE BMAG,T80.08; B=1
|
||
; EXP(X)=1+X
|
||
JADD
|
||
P81.63: PUT (TB,B); RESTORE B
|
||
JRST P81.20; TO EXIT
|
||
; TEMP STORE FOR B
|
||
|
||
P81.90: DEC -5;
|
||
P81.91: OCT 333456723246; 10*8LN(10)B28
|
||
P81.92: OCT 111535433567; LN(10) B3
|
||
P81.93: DEC 230258509; 10*8 LN (10)
|
||
P81.95: DEC 8,80,800; 1,10,100 B32
|
||
P81.96: DEC 1953125,19531250,195312500,1953125000,19531250000;
|
||
; 10*9 THRU 10*13 B44
|
||
|
||
P81.97: OCT 200000000000; 1 B1
|
||
P81.98: OCT 020000000000; 1 B4
|
||
SUBTTL ROUTINE P82A: A=LN(A)
|
||
SUBTTL ROUTINE P82A: A=LN(A)
|
||
; CALLED BY
|
||
; JSR P82;
|
||
; ERROR: A LE 0
|
||
; NORMAL
|
||
Q=BSF;
|
||
ERR=0; A LE 0 EXIT
|
||
NORM=1; NORMAL EXIT
|
||
TBMAG=P82.80
|
||
TBSGN=P82.81
|
||
TBSF=P82.82
|
||
TAMAG=P82.90
|
||
TASGN=P82.91
|
||
TASF=P82.92
|
||
|
||
|
||
P82A: RENTRY Q82,1; DATA SWITCH 8
|
||
P82.20: JUMPL ASGN,P82.24; ERROR IF A LE 0
|
||
JUMPG AMAG,P82.25
|
||
|
||
P82.24: RETURN (P82,ERR); ERROR EXIT
|
||
P82.25: PUTM B,TB; SAVE B
|
||
; TEST FOR X CLOSE TO 1
|
||
JUMPG ASF,P82.26; NO
|
||
CAML ASF,[DEC -1]
|
||
JRST P82.50; MAYBE
|
||
P82.26: MOVEI Q,3
|
||
P82.01: CAML AMAG,P82.83
|
||
JRST P82.02
|
||
ASH AMAG,1; X LS 10*8.2*3.SQRT(2)/2
|
||
SOJA Q,P82.01; X=2.X; Q= Q-1
|
||
P82.02: MOVE BMAG,P82.87; X GE 10*8.2*3.SQRT(2)/2
|
||
ADD BMAG,AMAG; X+8
|
||
SUB AMAG,P82.87; X-8
|
||
; ASGN IS ALREADY 0
|
||
ASH AMAG,2; (X-8)B33
|
||
DIV AMAG,BMAG; X=(X-8)/(X+8) B-2
|
||
MOVEM AMAG,P82.84; SAVE X
|
||
MUL AMAG,AMAG; Z=X*2 B-4
|
||
ADDI AMAG,^O10;
|
||
ASH AMAG,-4; Z B0 ROUNDED
|
||
MOVE BMAG,P82.94; S= 1/13 B-1
|
||
HRREI ASGN,-5; N=-5
|
||
P82.03: MUL BMAG,AMAG; S.Z(B-1)
|
||
ADD BMAG,P82.95+5(ASGN); S=S.Z+ 1/I (I=11,9,7,5,3)
|
||
AOJL ASGN,P82.03;
|
||
|
||
MUL AMAG,BMAG; Z=S.Z B-1
|
||
MUL AMAG,P82.84; X=S.Z.X B-3
|
||
JUMPL AMAG,.+2;
|
||
AOSA AMAG;
|
||
SOS AMAG;
|
||
ASH AMAG,-1; ROUND AND SCALE AT B-2
|
||
ADD AMAG,P82.84;X=(S.Z.X+X)B-2=LN(X) B-1
|
||
MOVE BSGN,P82.96; LN(2) B0
|
||
MUL BSGN,Q; Q.LN(2) TO BSGN, BSF B35
|
||
ASH ASF,2; SF(X)B33
|
||
MUL ASF,P82.97; SF(X).LN(10) TO ASF,BMAG B35
|
||
;IF ABS(P.LN(10)) LE 1,SCALE AT B=2
|
||
;OTHERWISE SCALE AT B=8
|
||
JSR S82
|
||
P82.07: MOVEI ASF,2; SF(X)=2
|
||
CAIGE BSGN,^D100;
|
||
ASH ASF,-1; SF(X) = 1 IF XLS 100
|
||
CAIGE BSGN,^D10;
|
||
ASH ASF,-1; SF(X)=0 IF XLS 10
|
||
CAIG BSGN,0;
|
||
HRREI ASF,-1; SF(X) = -1 IF X =0
|
||
P82.15: DIV BSGN,T80.01(ASF); X=X/10*(SF+1) B0
|
||
AOS ASF
|
||
MOVE AMAG,BSGN; SET FOR S75
|
||
MOVEI ASGN,0; B=0
|
||
JSR S75;
|
||
JUMPE AMAG,.+2; TO EXIT IF ANS =0
|
||
MOVE ASGN,BMAG; RESTORE SIGN
|
||
P82.21: PUT TB,B
|
||
P82.22: RETURN (P82,NORM); EXIT
|
||
; SF IS 0 OR -1; TEST #
|
||
P82.50: JUMPE ASF,P82.52; SF=0
|
||
CAMGE AMAG,[DEC 997885258]
|
||
JRST P82.26; 1-X>EPSILON
|
||
JRST P82.54; TO "JOSS EVALUATION"
|
||
P82.52: CAMN AMAG,T80.08
|
||
JRST P82.56; LOG(1)=0
|
||
CAMLE AMAG,[DEC 100211474]
|
||
JRST P82.26; X-1>EPSILON
|
||
; X IS CLOSE TO 1
|
||
P82.54: MOVE BMAG,T80.08; COMPUTE X-1
|
||
SETZB BSGN,BSF
|
||
JSUB
|
||
PUTM A,TA; SAVE Z=X-1
|
||
MUL AMAG,AMAG; Z*2.10*16 B70
|
||
DIV AMAG,T80.09; Z*2/10 10*8 B35
|
||
ASH ASF,1;
|
||
AOS ASF; 2.SF+1
|
||
MOVE BMAG,AMAG
|
||
MOVE BSF,ASF
|
||
ADD BSF,TASF; SF(Z*2)+SF(Z)=SF(Z*3)
|
||
MUL BMAG,TAMAG; Z*3
|
||
DIV BMAG,T80.08
|
||
AOS AMAG
|
||
ASH AMAG,-1; Z*2/2 ROUNDED
|
||
MUL BMAG,[DEC 33333333]; Z*3/3 (EIGHT DIGITS IN 3)
|
||
DIV BMAG,T80.08;
|
||
CAML AMAG,T80.08
|
||
JRST .+3
|
||
IMULI AMAG,^D10; NORMALIZE BY 1
|
||
SOS ASF
|
||
CAML BMAG,T80.08
|
||
JRST .+3
|
||
IMULI BMAG,^D10
|
||
SOS BSF
|
||
HRLZI ASGN,^O400000; -Z*2/2
|
||
MOVE BSGN,TASGN; Z*3/3 WITH SIGN OF Z
|
||
; COMPUTE LN(X)=Z-Z*2/2+Z*3/3
|
||
JADD
|
||
PUT TA,B
|
||
JADD
|
||
JRST P82.21; TO EXIT
|
||
P82.56: SETZM AMAG; LOG(1)=0
|
||
|
||
JRST P82.21; TO EXIT
|
||
P82.83: DEC 565685425; 10*8.2*3. SQRT (2)/2
|
||
P82.87: DEC 800000000; 10*8.2*3
|
||
P82.94: OCT 047304730473; 1/13 = .07692307692 B(-1)
|
||
P82.95: OCT 056427213506; 1/11 = .09090909091 B(-1)
|
||
OCT 070707070707; 1/9 = .11111111111 B(-1)
|
||
OCT 111111111111; 1/7 = .1428571429 B(-1)
|
||
OCT 146314631463; 1/5=.2 B(-1)
|
||
OCT 252525252525; 1/3 = .33333 B(-1)
|
||
P82.96: OCT 261344137676; LN(2)=.6931471806 B0 (-EPSILON)
|
||
P82.97: OCT 223273067355; LN(10)=2.3025850930 B2
|
||
SUBTTL DOUBLE PRECISION FOR LOG
|
||
S82A: ASH AMAG,-1; SCALE LN(X) AT 0
|
||
JUMPE BMAG,S82.02;
|
||
JUMPGE ASF,S82.02; IF P.LN(10) IS 1 COMP,MAKE IT 2 COMP
|
||
AOS ASF
|
||
S82.02: JOV .+1
|
||
ADD BSF,AMAG; LN(X)+Q.LN(2) (LSH)
|
||
JOV .+2
|
||
JRST .+3
|
||
TLC BSF,^O400000; OFLOW MUST BE+; ADJUST SIGN
|
||
AOS BSGN; OF LSH; INCREMENT MSH
|
||
ADD BSF,BMAG; ADD LSH(P.LN(10))
|
||
JOV .+2
|
||
JRST S82.05
|
||
TLCE BSF,^O400000; ADJUST SIGN OF LSH
|
||
AOSA BSGN; OVERFLOW WAS +
|
||
SOS BSGN; OVERFLOW WAS -
|
||
S82.05: ADD BSGN,ASF; MSH
|
||
S82.20: MOVEI BMAG,0; SET FOR + ANS
|
||
JUMPN BSGN,S82.30
|
||
JUMPGE BSF,@S82; MSH=0; EXIT IF LSH GE 0
|
||
TLC BMAG,^O400000; LSH<0; SET ANS -
|
||
MOVNS BSF; COMPLEMENT LSH
|
||
JRST @S82; EXIT
|
||
S82.30: JUMPG BSGN,S82.50; MSH NE 0
|
||
TLC BMAG,^O400000; MSH <0; SET ANS -
|
||
MOVNS BSGN; COMPLEMENT MSH
|
||
MOVNS BSF; COMPLEMENT LSH
|
||
JUMPL BSF,S82.40; IF LSH WAS+,DECREMENT MSH
|
||
JRST @S82; AND EXIT
|
||
S82.40: SOJA BSGN,@S82; LSH>0; DECREMENT MSH
|
||
S82.50: JUMPGE BSF,@S82; MSH>0; EXIT IF LSH GE0
|
||
SOJA BSGN,@S82; DECREMENT MSH AND EXIT
|
||
SUBTTL P83,P84: SIN/COS
|
||
; CALLED BY:
|
||
; JSR (P83,P84)
|
||
; ERROR: A GE 100
|
||
; NORMAL
|
||
TAMAG=P83.94
|
||
TASGN=P83.95
|
||
TASF=P83.96
|
||
TBMAG=P83.97
|
||
TBSGN=P83.98
|
||
TBSF=P83.99
|
||
|
||
|
||
ERR=0;
|
||
NORM=1;
|
||
|
||
N=BSF;
|
||
SIGN=BSGN;
|
||
P83A: RENTRY Q83,1; DATA SWITCH 9
|
||
PUTM (B,TB); SAVE B
|
||
MOVE BMAG,P83;
|
||
MOVEM BMAG,P84; SET RETURN IN P84
|
||
JUMPE AMAG,P83.10; SIN(0)=0
|
||
MOVE SIGN,ASGN; SINE: SET N=11, SIGN=SGN
|
||
HRRZI N,^D11;
|
||
JRST P84.01;
|
||
P83.10: PUT (TB,B); NORMAL EXIT
|
||
P83.11: RETURN (P84,NORM);
|
||
P83.20: PUT (TB,B); ERROR EXIT
|
||
RETURN P84,ERR
|
||
PAGE
|
||
|
||
|
||
P84A: RENTRY Q84,1; DATA SWITCH 10
|
||
JUMPN AMAG,P84.03;
|
||
MOVE AMAG,T80.08; COS(0)=1
|
||
JRST P83.11; TO EXIT
|
||
P84.03: PUTM (B,TB);
|
||
MOVEI N,^D10; COS, SET N=10
|
||
MOVEI SIGN,0; COS, SET SGN PLUS
|
||
P84.01: CAIL ASF,2;
|
||
JRST P83.20; ERROR, ARG GE 100
|
||
P84.02: JUMPG ASF,P84.30;
|
||
CAIN N,^D10; IF COS, IGNORE CROSSOVER TEST
|
||
JRST P84.05
|
||
CAMG ASF,P84.99; TES AGAINST CROSSOVER
|
||
JRST P84.60; TO 60 IF LESS
|
||
P84.05: MOVEI ASGN,0; CROSSOVER LS A LS 10
|
||
ASHC AMAG,-4; (AMAG)B39/(10*8)B35
|
||
DIV AMAG,T80.08; YB4
|
||
JUMPE ASF,P84.07; SF(A)=0
|
||
MOVNS ASF; ABS(SF(A))
|
||
MOVEI ASGN,0; CLEAR AMAG + 1
|
||
ASHC AMAG,-^D32; YB36
|
||
DIV AMAG,T80(ASF); YB1=BY36/10*ABS(SF)B35
|
||
P84.04: CAMLE AMAG,P84.84; Y VS PI/4
|
||
JRST P84.06; GR
|
||
ASH AMAG,1 ;SCALE Y AT BO
|
||
JRST P84.50; TO SERIES EVALUATION
|
||
|
||
P84.06: MOVNS AMAG;
|
||
ADD AMAG,P84.83; PI/2-Y
|
||
ASH AMAG,1; SCALE AT B0
|
||
CAIE N,^D11; SET TO COMPUTE OPPOSITE FUNCTION
|
||
AOJA N,P84.50; TO SERIES
|
||
SOJA N,P84.50; TO SERIES
|
||
P84.07: MOVEI ASGN,0; CLEAR AMAG+1
|
||
ASHC AMAG,-^D34; YB38
|
||
DIV AMAG,P84.83; (Y)B38/(2PI)B3
|
||
P84.08: MOVE AMAG,ASGN; REMAINDER TO YB3
|
||
CAMG AMAG,P84.84; YB3 VS (PI)B3
|
||
JRST P84.10;
|
||
MOVNS AMAG;
|
||
ADD AMAG,P84.83; (2PI)B3-Y(B3)
|
||
CAIN N,^D11;
|
||
TLC SIGN,^O400000; CHANGE SIGN IF SINE
|
||
P84.10: ASH AMAG,1; YB2
|
||
CAMG AMAG,P84.84; (Y)B2 VS (PI/2)B2
|
||
JRST P84.12;
|
||
MOVNS AMAG;
|
||
ADD AMAG,P84.83; (PI-Y)B2
|
||
CAIE N,^D11;
|
||
TLC SIGN,^O400000; CHANGE SIGN IF COS
|
||
P84.12: ASH AMAG,1; YB1
|
||
JRST P84.04;
|
||
P84.30: IMULI AMAG,^D10;
|
||
MOVEI ASGN,0; CLEAR AMAG + 1
|
||
ASHC AMAG,-7; 10.A.B42
|
||
DIV AMAG,T80.08; (10A/10*8)B7
|
||
MOVEI ASGN,0;
|
||
ASHC AMAG,-^D31; YB38
|
||
DIV AMAG,P84.83; (Y)B38/(2PI)B3
|
||
JRST P84.08;
|
||
|
||
; EVALUATE SERIES
|
||
; YB0 IN AMAG
|
||
; ASGN, ASF, BMAG AVAILABLE
|
||
; SIGN IN BSG
|
||
; N IN BSF
|
||
|
||
P84.50: MOVE ASGN,AMAG; Y
|
||
MUL ASGN,AMAG; Z IN ASGN
|
||
TLNE ASF,^O200000; ROUND
|
||
AOS ASGN;
|
||
MOVNS ASGN; -Z IN ASGN
|
||
MOVE ASF,T1(N); S=1/N
|
||
P84.51: SUBI N,2; N=N-2
|
||
MUL ASF,ASGN; S=-S.Z.1/(N.(N+1))+1/N
|
||
MUL ASF,T2(N);
|
||
ADD ASF,T1(N);
|
||
CAILE N,2;
|
||
JRST P84.51; N GR 2
|
||
CAIE N,2;
|
||
JRST P84.56; N=1
|
||
MUL ASF,ASGN; N=2
|
||
ADD ASF,P84.90; S=1-Z.S
|
||
MOVE AMAG,ASF;
|
||
P84.52: SETZB ASGN,ASF; SET SCALE AND B=0 FOR S75
|
||
P84.53: JSR S75
|
||
JUMPE AMAG,P83.10; TO EXIT IF 0
|
||
MOVE ASGN,SIGN;
|
||
JRST P83.10; TO EXIT
|
||
P84.56: MUL AMAG,ASF; S.Y
|
||
JRST P84.52;
|
||
P84.60: CAME ASF,P84.99; IF SF LS SPECIAL COMPUTE
|
||
JRST .+3
|
||
CAMLE AMAG,P84.97; SF=; CHECK MAG
|
||
JRST P84.05; GREATER
|
||
PUTM A,TA; SAVE A
|
||
MUL AMAG,AMAG; X*2.10*16
|
||
DIV AMAG,[DEC 600000000]; X*2/6 10*8
|
||
ASH ASF,1; DOUBLE SF FOR X*2
|
||
|
||
HRLZI ASGN,^O400000; -X*2/6
|
||
MOVE BMAG,T80.08; COMPUTE 1-X*2/6
|
||
SETZB BSGN,BSF
|
||
JADD
|
||
PUT TA,B; X.(1-X*2/6)
|
||
JMPY
|
||
JRST P83.10; TO EXIT
|
||
P84.83: OCT 311037552421; (2PI)B3=(PI)B2=(PI/2)B1
|
||
P84.84: OCT 144417665211; (PI)B3=(PI/2)B2=(PI/4)B1
|
||
|
||
|
||
P84.90: OCT 377777777777; 1-EPSILON
|
||
OCT 200000000000; 1/2
|
||
OCT 125252525253; 1/3
|
||
OCT 100000000000; 1/4
|
||
OCT 063146314632; 1/5
|
||
OCT 052525252525; 1/6
|
||
OCT 044444444445; 1/7
|
||
OCT 040000000000; 1/8
|
||
OCT 034343434344; 1/9
|
||
P84.92: OCT 031463146315; 1/10
|
||
OCT 027213505643; 1/11
|
||
T1=P84.90-1;
|
||
|
||
P84.91: OCT 200000000000; 1/2
|
||
OCT 052525252525; 1/6 3.2
|
||
OCT 025252525253; 1/12 4.3
|
||
OCT 014631463146; 1/20 5.4
|
||
OCT 010421042104; 1/30 6.5
|
||
OCT 006060606061; 1/42 7.6
|
||
OCT 004444444445; 1/56 8.7
|
||
OCT 003434343434; 1/72 9.8
|
||
OCT 002660266027; 1/90 10.9
|
||
T2=P84.91-1;
|
||
P84.99: DEC -2; CROSSOVER IS AT
|
||
SUBTTL P85: ARG(A,B)
|
||
NORM=0
|
||
QUAD1=0
|
||
QUAD2=1
|
||
QUAD3=2
|
||
QUAD4=3
|
||
P85A: RENTRY Q85,2; DATA SWITCH 11
|
||
JRST P85.56
|
||
P85.50: RETURN (P85,NORM);
|
||
P85.56: JUMPN AMAG,P85.01; TO .01 IF X NE 0
|
||
JUMPE BMAG,P85.50; ARG(0,0)=0 EXIT
|
||
MOVE AMAG,P85.95; ARG(0.Y)=PI/2.SGN(Y)
|
||
MOVEI ASF,0;
|
||
MOVE ASGN,BSGN;
|
||
JRST P85.50; EXIT
|
||
P85.01: JUMPN BMAG,P85.02; TO .02 IF Y NE 0
|
||
SETZB ASF,AMAG; ARG(X,0)=0 IF X>0
|
||
JUMPE ASGN,P85.50;
|
||
MOVEI ASGN,0; ARG(X,0)=PI IF X>0
|
||
MOVE AMAG,P85.97;
|
||
JRST P85.50;
|
||
; DETERMINE QUADRANT
|
||
P85.02: XOR ASGN,BSGN;
|
||
JUMPE ASGN,P85.03; SIGNS ARE SAME - 1 OR 3
|
||
; SIGNS ARE DIFF - 2 OR 4
|
||
JUMPE BSGN,.+3; Y POSITIVE - 2
|
||
MOVEI BSGN,QUAD4; Y NEGATIVE - 4
|
||
JRST P85.04;
|
||
MOVEI BSGN,QUAD2;
|
||
JRST P85.04;
|
||
P85.03: JUMPE BSGN,P85.04; Y POSITIVE - 1
|
||
MOVEI BSGN,QUAD3; Y NEGATIVE - 3
|
||
; DETERMINE IF Z < 10*(-5)
|
||
P85.04: MOVEM ASF,P85.99; SAVE ASF
|
||
SUB ASF,BSF;
|
||
CAIGE ASF,6; SKIP IF ABS(Y/X) < 10*(-5)
|
||
JRST P85.08;
|
||
MOVEM BSGN,P85.98; SAVE QUADRANT
|
||
MOVE ASF,BSF; EXCHANGE X AND Y
|
||
MOVE BSF,P85.99;
|
||
EXCH AMAG,BMAG;
|
||
P85.05: SETZB BSGN,ASGN; SET SIGNS
|
||
JDIV (P85.06); Z=ABS(Y/X)
|
||
P85.06: MOVE BSGN,P85.98; GET QUADRANT
|
||
XCT P85.72(BSGN); ARG=M.Z+C
|
||
XCT P85.73(BSGN);
|
||
JUMPE BMAG,P85.50; EXIT IF C=0
|
||
SETZB BSF,BSGN;
|
||
JUMPG BMAG,.+3; IF C LS 0, COMPLEMENT
|
||
HRLZI BSGN,^O400000; AND CHANGE SIGN
|
||
MOVNS BMAG;
|
||
JADD
|
||
P85.07: JRST P85.50;
|
||
|
||
P85.08: MOVNS ASF;
|
||
CAIGE ASF,6; SKIP IF ABS(X/Y) < 10*(-5)
|
||
JRST P85.09;
|
||
MOVE ASF,P85.99; RESTORE ASF
|
||
ADDI BSGN,^D8; ADJUST QUADRANT
|
||
MOVEM BSGN,P85.98; SAVE QUADRANT
|
||
JRST P85.05;
|
||
|
||
|
||
; ABS(Z) GE 10*(-5)
|
||
P85.09: MOVE ASF,P85.99; RESTORE ASF
|
||
CAMLE ASF,BSF;
|
||
JRST P85.20; SF(X) > SF(Y)
|
||
CAME ASF,BSF; SF(X) LE SF(Y)
|
||
JRST P85.13; SF(X) L SF(Y)
|
||
CAMLE AMAG,BMAG; SF(X) = SF(Y)
|
||
JRST P85.20; X > Y IN MAG
|
||
CAME AMAG,BMAG; MAG(X) LE MAG(Y)
|
||
JRST P85.13; X < Y IN MAG
|
||
; X = Y IN MAG
|
||
MOVE AMAG,P85.93; SET A=PI/4 B2
|
||
P85.10: XCT P85.70(BSGN); COMPUTE C(Q)+MCQ.A
|
||
XCT P85.71(BSGN); WHERE Q IS A FCN OF QUADRANT
|
||
MOVEI BSGN,0; SET SIGN PLUS
|
||
JUMPGE AMAG,P85.12;
|
||
MOVN AMAG,AMAG; COMPLEMENT AND CHANGE SIGN
|
||
TLC BSGN,^O400000; IF NEGATIVE
|
||
P85.12: MOVEI ASGN,2; BINARY SCALE = 2
|
||
MOVEI ASF,0; SET SF=0 FOR S75
|
||
JSR S75; CONVERT
|
||
JUMPE AMAG,P85.50; EXIT IF 0
|
||
MOVE ASGN,BSGN; GET SIGN
|
||
JRST P85.50;
|
||
; X<Y
|
||
P85.13: ADDI BSGN,^D8; ADJUST QUADRANT FOR X<Y
|
||
P85.14: MOVEM BSGN,P85.98; STORE QUADRANT TEMPORARILY
|
||
|
||
P85.15: JSR P85.30; OBTAIN ARCTAN (Z), B2, IN AMAG
|
||
MOVE BSGN,P85.98; GET QUADRANT INDEX
|
||
JRST P85.10;
|
||
; X>Y
|
||
P85.20: EXCH AMAG,BMAG; EXCH ABS(X) AND ABS(Y)
|
||
EXCH ASF,BSF;
|
||
JRST P85.14;
|
||
|
||
P8530A: SUB BSF,ASF; DIFF OF PWRS (Y>X)
|
||
MOVEI ASGN,0; CLEAR LOW ORDER
|
||
ASHC AMAG,-3;
|
||
ADD ASGN,BMAG;
|
||
ASHC AMAG,-1; (XB39 + YB71)/YB35
|
||
DIV AMAG,BMAG; X/Y B4 ROUNDED
|
||
IDIV AMAG,T80(BSF)
|
||
IDIV ASGN,T80(BSF)
|
||
ASHC AMAG,4; (X/Y B4)?10*(SFY-SFX)
|
||
; ISOLATE IN PI/16 INTERVAL
|
||
MOVEI BSF,0; I=1
|
||
CAMLE AMAG,P85.89(BSF); SKIP IF ISOLATED
|
||
AOJA BSF,.-1;
|
||
MOVN BMAG,P85.89-1(BSF); K(I-1)
|
||
MOVE BSGN,P85.89(BSF); K(I)
|
||
ADD BMAG,AMAG; Z-K(I-1)
|
||
SUB BSGN,AMAG; K(I)-Z
|
||
CAMLE BMAG,BSGN;
|
||
JRST P85.40;
|
||
P85.31: MUL AMAG,P85.89-1(BSF); Z.K(J)
|
||
ASH AMAG,-1;
|
||
TLO AMAG,^O200000; 1+Z.K(J) B1
|
||
MOVEI BSGN,0;
|
||
DIV BMAG,AMAG; (Z-K(J))/(1+Z.K(J)) B -1
|
||
ASH BMAG,-1; WBO
|
||
MOVE AMAG,P85.90(BSF); THETA(J)
|
||
MOVN BSGN,BMAG;
|
||
MUL BSGN,BMAG; Q=-W*2
|
||
MOVEI BSF,4; N=4
|
||
MOVE ASGN,P85.87; S=1/11
|
||
P85.33: MUL ASGN,BSGN
|
||
ADD ASGN,P85.88(BSF); S.Q+1/(2N+1)
|
||
SOJGE BSF,P85.33;
|
||
MUL ASGN,BMAG; BETA=W.S
|
||
ADD AMAG,ASGN; ALPHA=THETA + BETA
|
||
ASH AMAG,-1; COULD OFLO IF ROUNDED FIRST
|
||
AOS AMAG;
|
||
ASH AMAG,-1; ALPHA(B2), ROUNDED
|
||
JRST @P85.30; EXIT
|
||
|
||
P85.40: MOVN BMAG,BSGN; -(K(I)-Z)
|
||
AOJA BSF,P85.31; COMPUTE W(I+1)
|
||
; TABLES FOR X > Y
|
||
P85.70: HRLI BSGN,0; NOOP M=1
|
||
MOVNS AMAG; M=-1
|
||
HRLI BSGN,0; M=1
|
||
MOVNS AMAG; M=-1
|
||
P85.71: HRLI BSGN,0; C=0
|
||
ADD AMAG,P85.92; C=PI
|
||
SUB AMAG,P85.92; C=-PI
|
||
HRLI BSGN,0; C=0
|
||
; TABLES FOR X < Y
|
||
MOVNS AMAG; M=-1
|
||
HRLI BSGN,0; M=1
|
||
MOVNS AMAG; M=-1
|
||
HRLI BSGN,0; M=1
|
||
ADD AMAG,P85.91; C=PI/2 B2
|
||
ADD AMAG,P85.91; C=PI/2 B2
|
||
SUB AMAG,P85.91; C=-PI/2 B2
|
||
SUB AMAG,P85.91;} C=-PI/2 B2
|
||
P85.72: HRLZI ASGN,0; M-1
|
||
HRLZI ASGN,^O400000; M=-1
|
||
|
||
HRLZI ASGN,0; M=1
|
||
HRLZI ASGN,^O400000; M=-1
|
||
P85.73: HRLZI BMAG,0; C=0
|
||
MOVE BMAG,P85.97; C=PI
|
||
MOVN BMAG,P85.97; C=-PI
|
||
HRLZI BMAG,0; C=0
|
||
;
|
||
HRLZI ASGN,^O400000; M=-1
|
||
HRLZI ASGN,0; M=1
|
||
HRLZI ASGN,^O400000; M=-1
|
||
HRLZI ASGN,0; M=1
|
||
MOVE BMAG,P85.95; C=PI/2
|
||
MOVE BMAG,P85.95; C=PI/2
|
||
MOVN BMAG,P85.95; C=-PI/2
|
||
MOVN BMAG,P85.95; C=-PI/2
|
||
|
||
P85.90: OCT 0; 0
|
||
P85.93: OCT 062207732504; 1/16.PI BO = PI/4 B2
|
||
P85.91: OCT 144417665211; 2/16.PI BO = PI/2 B2
|
||
OCT 226627617715; 3/16.PI BO
|
||
P85.92: OCT 311037552421; 4/16.PI BO = PI B2
|
||
OCT 0; TAN(0)
|
||
P85.89: OCT 062727657005; TAN(PI/16)
|
||
OCT 152023631500; TAN(PI/8)
|
||
OCT 253033405256; TAN(3.PI/16)
|
||
P85.88: OCT 377777777777; TAN(PI/4)
|
||
OCT 125252525253; 1/3
|
||
OCT 063146314632; 1/5
|
||
OCT 044444444445; 1/7
|
||
OCT 034343434344; 1/9
|
||
P85.87: OCT 027213505643; 1/11
|
||
P85.97: DEC 314159265; 10*8.PI
|
||
P85.96: DEC 235619449; 10*8.(3PI/4)
|
||
P85.95: DEC 157079633; 10*8.PI/2
|
||
P85.94: DEC 785398163; 10*9.PI/4
|
||
SUBTTL ROUTINE P90...A=IP(A)
|
||
; CALLED BY:
|
||
; JSR P90;
|
||
; RETURN
|
||
|
||
NORM=0;
|
||
|
||
P90A: UNPK A
|
||
JUMPE AMAG,P90.06; EXIT IF A=0
|
||
P90.01: JUMPGE ASF,P90.02; TO .02 IF SF GE 0
|
||
MOVEI ASGN,0; SET A=0 AND EXIT IF NO INTEGER PART
|
||
SETZB AMAG,ASF;
|
||
RETURN (P90,NORM);
|
||
P90.02: CAIL ASF,^D8; IF SF GE 8 IP(A)=A
|
||
JRST P90.06; TO EXIT
|
||
HLRM ASGN,P90.05; SAVE SIGN
|
||
HRRM ASF,P90.04; SAVE SF (0 LE SF<8)
|
||
MOVNI ASF,-^D8(ASF); P=8-SF
|
||
IDIV AMAG,T80(ASF);
|
||
IMUL AMAG,T80(ASF); A=IP(A/10*P).10*P
|
||
XCT P90.04
|
||
XCT P90.05
|
||
P90.06: RETURN (P90,NORM);
|
||
SUBTTL P91: A=FP(A)
|
||
; CALLED BY:
|
||
; JSR P91;
|
||
; RETURN
|
||
|
||
REM=ASGN;
|
||
NORM=0;
|
||
P91A: UNPK A
|
||
JUMPE AMAG,P91.04; EXIT IF A=0
|
||
JUMPL ASF,P91.04; EXIT IF SF<0
|
||
CAIGE ASF,^D8;
|
||
JRST P91.02;
|
||
MOVEI AMAG,0; SET A=0 AND EXIT
|
||
P91.05: SETZB ASGN,ASF;
|
||
JRST P91.04;
|
||
P91.02: HLRM ASGN,P91.03; 0 LE SF<8,SAVE SIGN
|
||
HRRM ASF,P91.06; SAVE SF
|
||
MOVNI ASF,-^D8(ASF); P=8-SF
|
||
IDIV AMAG,T80(ASF); MAG/10*(8-SF)
|
||
XCT P91.06
|
||
AOS ASF; SF+1
|
||
IMUL REM,T80(ASF);
|
||
|
||
MOVE AMAG,REM; R(MAG/10*(8-SF)).10*(SF+1)
|
||
JUMPE AMAG,P91.05; EXIT IF ZERO
|
||
XCT P91.03
|
||
HRREI ASF,-1; SET SF=-1
|
||
NRMLZ ;
|
||
P91.04: RETURN (P91,NORM); EXIT
|
||
SUBTTL DIGIT PART......A=DP(A)
|
||
;ROUTINE P92 .. DP(A)
|
||
;CALLED BY:
|
||
; JSR P92;
|
||
; RETURN
|
||
|
||
NORM=0;
|
||
|
||
P92A: UNPK A
|
||
MOVEI ASF,0;
|
||
RETURN (P92,NORM);
|
||
SUBTTL EXPONENT PART.......A=XP(A)
|
||
; ROUTINE P93...XP(A)
|
||
; CALLED BY:
|
||
; JSR P93;
|
||
; RETURN
|
||
|
||
NORM=0;
|
||
|
||
P93A:
|
||
JUMPN AMAG,.+3; A NE 0
|
||
MOVEI ASGN,0; CLEAR SIGN IF A=0
|
||
RETURN P93,NORM; EXIT IF A=0
|
||
JUMPGE ASF,P93.02;
|
||
HRLZI ASGN,^O400000; IF SF<0 SET SIGN - AND
|
||
MOVN AMAG,ASF; PUT COMPLEMENT OF SF IN MAG
|
||
JRST P93.04;
|
||
P93.02: MOVEI ASGN,0; IF SF GE 0, SET + AND
|
||
MOVE AMAG,ASF; PUT SF IN MAG
|
||
P93.04:HRRZI ASF,0; ZERO TO SF
|
||
CAIL AMAG,^D10; IF MAG GE 10
|
||
AOJA ASF,P93.06; ADD 1 TO SF; SET P=10*7
|
||
IMUL AMAG,T80.08; P=10*8 IF MAG < 10
|
||
JRST P93.07; TO EXIT
|
||
P93.06:IMUL AMAG,T80.07; ASF.10*P TO AMAG
|
||
P93.07:RETURN (P93,NORM); EXIT
|
||
SUBTTL SIGN .......A=SGN(A)
|
||
; ROUTINE P94...SGN(A)
|
||
; CALLED BY:
|
||
; JSR P94;
|
||
; RETURN
|
||
|
||
NORM=0;
|
||
|
||
P94A: UNPK A
|
||
JUMPE AMAG,P94.01; TO EXIT IF A=0
|
||
MOVE AMAG,T80.08; SET SGN(A)=1.SIGN(A)
|
||
MOVEI ASF,0;
|
||
P94.01: RETURN (P94,NORM);
|
||
SUBTTL T80 TBL OF PWRS OF 10
|
||
|
||
ENTRY T80; INTERN T80,T80.01,T80.02,T80.03,T80.04,T80.05,T80.06;
|
||
INTERN T80.07,T80.08,T80.09,T80.10,T80.99;
|
||
|
||
T80: DEC 1;
|
||
T80.01: DEC 10;
|
||
T80.02: DEC 100;
|
||
T80.03: DEC 1000;
|
||
T80.04: DEC 10000;
|
||
T80.05: DEC 100000;
|
||
T80.06: DEC 1000000;
|
||
T80.07: DEC 10000000;
|
||
T80.08: DEC 100000000;
|
||
T80.09: DEC 1000000000;
|
||
T80.10: DEC 10000000000;
|
||
T80.99=T80-1; INTERFACE WITH ED
|
||
SUBTTL ROUTINE S75A: CONVERT AND NORMALIZE
|
||
; INPUT:
|
||
; RA=X (FRACTION)
|
||
; RB=N -3 LE N LE 4
|
||
; RC=EXISTING SF OR ZERO;
|
||
; WHERE: X IS SCALED AT BN
|
||
|
||
; CALLED BY:
|
||
; JSR S75
|
||
; RETURN (RA=RB=RC=0 IF X=0)
|
||
|
||
; OUTPUT:
|
||
; RA=X (INTEGER)
|
||
; RB=HASH
|
||
; RC=SF(X)
|
||
|
||
|
||
RA=1
|
||
RB=2
|
||
RC=3
|
||
|
||
S75A: JUMPE RA,S75.04; JUMP IF INPUT=0
|
||
SOS RC; SET SF=SF-1
|
||
HRRM RB,AS; SET SHIFT OF N
|
||
MUL RA,S75.90; 2.X.10*9...B=35+N
|
||
XCT AS
|
||
CAML RA,S75.91;
|
||
JRST S75.02;
|
||
MOVEM RC,S75.93; IF LS 2.10*8
|
||
IMULI RA,^D10; NORMALIZE--BRING IN ONE MORE DIGIT
|
||
MULI RB,^D10;
|
||
ADD RA,RB;
|
||
MOVE RC,S75.93;
|
||
SOS RC; ADJUST SF
|
||
JUMPE RA,S75.04; JUMP IF ANS IS 0
|
||
S75.01: CAML RA,S75.91;
|
||
JRST S75.02;
|
||
IMULI RA,^D10; CONTINUE NORMALIZE
|
||
SOJA RC,S75.01; BRING IN ZEROES
|
||
S75.02: CAMGE RA,S75.92;
|
||
JRST S75.03;
|
||
IDIVI RA,^D10; IF > 2.10*9-1
|
||
AOJA RC,S75.02; SCALE DOWN
|
||
S75.03: AOS RA; ROUND
|
||
ASH RA,-1;
|
||
JRST 2,@S75; EXIT
|
||
S75.04: SETZB RB,RC; X=0
|
||
JRST 2,@S75;
|
||
S75.90: DEC 2000000000; 2.10*9
|
||
|
||
S75.91: DEC 200000000; 2.10*8
|
||
S75.92: DEC 1999999999; 2.10*9-1
|
||
SUBTTL THE RETURN MACRO
|
||
DEFINE RETURN (NAME,N)
|
||
<
|
||
IFE N-1,
|
||
<
|
||
AOS NAME
|
||
>
|
||
IFG N-1,
|
||
<
|
||
EXCH 0,NAME
|
||
ADDI 0,N
|
||
EXCH 0,NAME
|
||
>
|
||
JRST 2,@NAME
|
||
>
|
||
SUBTTL ROUTINE S76: COMPARE A TO B
|
||
;A IS IN REGISTERS EX1 AND N1
|
||
;B IS IN REGISTERS EX2 AND N2
|
||
|
||
; THESE ARE LEFT IN-TACT
|
||
;EXI CONTAINS EXP, 2'S COMP. IF NEG
|
||
;NI(0) CONTAINS SIGN OF NUMBER
|
||
;NI(1-35) CONTAINS MAGNITUDE OF NUMBER
|
||
|
||
;ON EXIT, REGISTER "ANS" WILL CONTAIN
|
||
;-1 IF A<B
|
||
;0 IF A=B
|
||
;1 IF A>B
|
||
|
||
;CALLED BY:
|
||
;JSR S76
|
||
;-RETURN
|
||
|
||
ANS=2
|
||
EX1=3
|
||
N1=1
|
||
EX2=6
|
||
N2=4
|
||
NORM=0;
|
||
|
||
S76A: MOVEI ANS,0; SET FOR A=B
|
||
JUMPE N1,S76.40; A=0
|
||
JUMPE N2,S76.50; B=0
|
||
MOVE ANS,N1;
|
||
XOR ANS,N2; COMPARE SIGNS
|
||
JUMPL ANS,S76.30 ;TO .30 IF SIGNS DISAGREE
|
||
MOVEI ANS,0; SIGNS AGREE; SET ANS FOR A=B
|
||
CAMGE EX1,EX2; COMPARE EXPONENTS
|
||
SOJA ANS,S76.20; ABS(A)<ABS(B), SET ANS =-1
|
||
CAME EX1,EX2;
|
||
AOJA ANS,S76.20; ABS(A)>ABS(B), SET ANS=+1
|
||
; EXPONENTS EQUAL
|
||
CAMGE N1,N2;
|
||
SOJA ANS,S76.20;
|
||
CAME N1,N2;
|
||
AOJA ANS,S76.20;
|
||
S76.11: RETURN (S76,NORM);
|
||
S76.30: MOVEI ANS,1; SET ANS FOR A POSITIVE
|
||
S76.20: JUMPGE N1,S76.11; TO EXIT IF POSITIVE ARGS
|
||
MOVNS ANS; INVERT ANS IF NEGATIVE ARGS
|
||
JRST S76.11;
|
||
S76.40: JUMPE N2,S76.11; EXIT IF B=0
|
||
SKIPL N2
|
||
SOJA ANS,S76.11; A<B IF B>0
|
||
AOJA ANS,S76.11; A>B IF B<0
|
||
S76.50: SKIPL N1; B=0,A NE 0
|
||
AOJA ANS,S76.11; A>B IF A>0
|
||
SOJA ANS,S76.11; A<B IF A<0
|
||
SUBTTL ROUTINE S77: CHECK INDEX VALUE
|
||
|
||
|
||
; JNF OF INDEX VALUE IS IN REGISTERS EX1 AND N1
|
||
; EX1 CONTAINS EXP., 2'S COMP. IF NEG.
|
||
; N1(0) CONTAINS SIGN
|
||
; N1(1-35) CONTAINS MAGNITUDE
|
||
|
||
; CALLING SEQUENCE:
|
||
; JSR S77;
|
||
; EXIT 1: ABS(INDEX) GE 250 OR NOT INTEGRAL
|
||
; EXIT 2: INDEX VALUE IN N1 AS AN INTEGER,
|
||
; NEG. IS 2'S COMP.
|
||
|
||
; NOTE EX1,EX1+1,AND N1 ARE CLOBBERRED
|
||
|
||
ERR1=0;
|
||
NORM=1;
|
||
|
||
EX1=3
|
||
N1=1
|
||
EX2=3
|
||
N2=1
|
||
|
||
S77A:
|
||
S77.10: JUMPE N1,S77.06; EXIT IF INDEX=O
|
||
|
||
JUMPL EX1,S77.02; FRACTION NOT 0 IF EX<0
|
||
CAIL EX1,3
|
||
JRST S77.02; TO ERROR IF ABS(INDEX) GE 1000
|
||
TLZE N1,^O400000; SET N +, SKIP IF +
|
||
MOVNS N1; COMPLEMENT IF <0
|
||
MOVNI EX2,-^D8(EX2); P=8-EX
|
||
IDIV N2,T80(EX2); N1/10*P
|
||
JUMPN N2+1,S77.02; TO ERR IF FRACT NE 0
|
||
CAILE N2,^D250
|
||
JRST S77.02; TO ERROR IF INDEX>250
|
||
CAMGE N2,[DEC -250]
|
||
JRST S77.02; TO ERROR IF INDEX<-250
|
||
S77.06: RETURN (S77,NORM); NORMAL EXIT
|
||
S77.02: RETURN (S77,ERR1); ERROR EXIT
|
||
SUBTTL ROUTINE S78: CONVERT JNF TO PART,
|
||
;STEP NUMBER
|
||
|
||
; JNF IN REGS. EX1 AND N1
|
||
; EX1 CONTAINS S.F (2'S COMP.)
|
||
; N1(0) CONTAINS SIGN OF NUMBER
|
||
; N1(1-35) CONTAINS MAGNITUDE
|
||
|
||
; CALLED BY:
|
||
; JSR S78;
|
||
; EXIT 1: ILLEGAL STEP #
|
||
; EXIT 2: PART # IN N1 AS AN INTEGER
|
||
; STEP # IN N1+1 AS AN INTEGER
|
||
; PART # + STEP # = 9 DIGITS
|
||
|
||
|
||
ERR=0; ERROR EXIT
|
||
NORM=1; NORMAL EXIT
|
||
|
||
EX1=3
|
||
N1=1
|
||
|
||
EX2=3
|
||
N2=1
|
||
|
||
S78A: JUMPG N1,S78.04; ERROR IF STEP LE 0
|
||
S78.02: RETURN (S78,ERR);
|
||
S78.04: JUMPL EX1,S78.02; ERROR IF S.F.<0
|
||
CAILE EX1,^D8;
|
||
JRST S78.02; ERROR IF SF>8
|
||
MOVNI EX2,-^D8(EX2); P=8-SF
|
||
IDIV N2,T80(EX2); N/10*P: Q TO EX1; R TO N1
|
||
RETURN S78,NORM
|
||
SUBTTL ROUTINE S79A: TYPE A VALUE
|
||
|
||
; JNF OF NUMBER IS IN REGISTERS EX1 AND N1
|
||
; EX1 CONTAINS EXP, 2'S COMP
|
||
; N1(0) CONTAINS SIGN OF NUMBER
|
||
; N1(1-35) CONTAIN, MAGNITUDE
|
||
; PTR CONTAINS BYTE PTR FOR NEXT OUTPUT CHAR
|
||
|
||
; CALLED BY
|
||
; JSR S79
|
||
; RETURN - POINTER UPDATED TO LAST CHAR
|
||
|
||
|
||
EX1=3
|
||
N1=1
|
||
PTR=2
|
||
|
||
PWR=4; SAVED AND RESTORED
|
||
RADIX 8;
|
||
MINUS=141;
|
||
POINT=160;
|
||
MULT=142;
|
||
AST=144;
|
||
OPEN=120;
|
||
CLOSE=121;
|
||
DEFINE OUT (CHAR)
|
||
<
|
||
MOVEI PTR,CHAR
|
||
IDPB PTR,S54.99
|
||
>
|
||
|
||
S79A: JUMPN N1,S54.01; TO .01 IF NOT ZERO
|
||
IDPB N1,PTR; OUTPUT ZERO
|
||
JRST 2,@S79; EXIT
|
||
S54.01: MOVEM PTR,S54.99; PTR TO STORAGE
|
||
MOVEI PTR,MINUS;
|
||
TLZE N1,^O400000; SET NUMBER +; SKIP IF +
|
||
IDPB PTR,S54.99; OUTPUT MINUS SIGN
|
||
MOVE PWR,S54.98; SAVE REGISTER
|
||
MOVEI PWR,^D8; INITIALIZE P TO 8 FOR S54.50
|
||
JUMPL EX1,S54.30; TO .30 IF EXPONENT IS NEGATIVE
|
||
CAMLE EX1,S54.97; TEST FOR MAX EXPONENT
|
||
JRST S54.20; TO .20 IF EXPONENT > MAXX
|
||
; 0 LE EXPONENT LE MAX
|
||
; GENERATE (EXPONENT+1) DIGITS
|
||
S54.02: JSR S54.50;
|
||
SOJGE EX1,S54.02;
|
||
JSR S54.55; GET DEC PT AND REMAINING DIGITS
|
||
|
||
|
||
; EXIT
|
||
S54.10: MOVE PWR,S54.98; RESTORE REGISTER
|
||
MOVE PTR,S54.99; RESTORE POINTER.
|
||
JRST 2,@S79;
|
||
; EXPONENT <MIN OR <MAX
|
||
S54.20: JSR S54.50; GENERATE FIRST DIGIT
|
||
JSR S54.55; DECIMAL POINT AND REMAINING DIGITS
|
||
OUT (MULT);
|
||
OUT (1); .10*
|
||
OUT (0);
|
||
OUT (AST);
|
||
JUMPL EX1,S54.25; TO .25 IF EXPONENT IS NEGATIVE
|
||
; EXPONENT POSITIVE
|
||
JSR S54.60; OUTPUT EXPONENT DIGITS
|
||
JRST S54.10; TO EXIT
|
||
|
||
; EXPONENT NEGATIVE
|
||
S54.25: MOVNS EX1; COMPLEMENT
|
||
OUT (OPEN);
|
||
OUT (MINUS);
|
||
JSR S54.60; OUTPUT EXPONENT DIGITS
|
||
OUT (CLOSE)
|
||
JRST S54.10; TO EXIT
|
||
|
||
; EXPONENT <0
|
||
S54.30: CAMGE EX1,S54.96;
|
||
JRST S54.20; O .20 IF EXP<MIN
|
||
OUT (POINT);
|
||
S54.32: AOJE EX1,S54.34; GENERATE (EXPONENT+1) ZEROES
|
||
OUT (0);
|
||
JRST S54.32;
|
||
S54.34: JSR S54.50; GENERATE DIGITS
|
||
JUMPN N1,S54.34; UNTIL EXHAUSTED
|
||
JRST S54.10; TO EXIT
|
||
S5450A: IDIV N1,T80(PWR); N/10*P (P=8(-1)?)
|
||
EXCH N1,PTR; PTR=QUOT; N1=REMAINDER
|
||
IDPB PTR,S54.99; PLACE IN OUTPUT BUFFER
|
||
SOJA PWR,@S54.50; DECREMENT P AND EXIT
|
||
|
||
; GENERATE DECIMAL POINT AND REMAINING
|
||
S5455A: JUMPE N1,@S54.55; EXIT IF NO MORE DIGITS
|
||
OUT (POINT);
|
||
S54.56: JSR S54.50; GENERATE ANOTHER DIGIT
|
||
JUMPN N1,S54.56; CONTINUE IF MORE DIGITS
|
||
JRST @S54.55; EXIT IF NO MORE DIGITS
|
||
; OUTPUT EXPONENT DIGITS
|
||
INTERN S5460A
|
||
S5460A: IDIVI EX1,^D10; TENS TO EX1; UNITS TO PWR
|
||
JUMPE EX1,S54.62; TO .62 IF TENS DIGIT IS ZERO
|
||
IDPB EX1,S54.99; OUTPUT TENS DIGIT
|
||
S54.62: IDPB PWR,S54.99; OUTPUT UNITS DIGIT
|
||
JRST @S54.60;
|
||
; PARAMETERS FOR EXP RANGE
|
||
; (FIXED POINT)
|
||
S54.96: DEC -3; MIN
|
||
SYN S54.96,S79.02;
|
||
SUBTTL ROUTINE S80:
|
||
;TYPE A VALUE WITH LINED UP DECIMAL POINTS
|
||
|
||
; JNF OF NUMBER IS IN REGISTERS EX1 AND N1
|
||
; EX1 CONTAINS EXP, 2'S COMP
|
||
; N1(0) CONTAINS SIGN OF NUMBER
|
||
; N1(1-35) CONTAINS MAGNITUDE
|
||
|
||
; PTR CONTAINS BYTE PTR FOR NEXT OUTPUT CHAR
|
||
; REG."OFFSET" CONTAINS OFFSET OF =
|
||
; CALLED BY
|
||
; JSR S80
|
||
; RETURN - POINTER UPDATED TO LAST CHAR
|
||
; NOTE S80 USES S79
|
||
SPACE=^O167; JOES SPACE-1
|
||
EX1=3
|
||
N1=1
|
||
PTR=2
|
||
OFFSET=4
|
||
|
||
S80A: MOVEM PTR,S80.99; SAVE POINTER
|
||
MOVEI PTR,5; SET MAX VALUE OF EXPONENT
|
||
MOVEM PTR,S79.01; STORE IN S79
|
||
AOS PTR; DEC PT TO BE (MAX+4) OVER
|
||
TLNN N1,^O400000; SKIP IF NEG.
|
||
AOS PTR; ADD TO COUNT IF POSITIVE
|
||
JUMPE N1,S80.10; TO UPDATE IF ZERO
|
||
|
||
CAMGE EX1,S79.02; EXPONENT <MIN?
|
||
JRST S80.10; YES-UPDATE
|
||
CAIGE EX1,0; IF FIXED POINT AND NO WHOLE DIGIT
|
||
AOJA PTR,S80.10; ADD ONE TO COUNT AND UPDATE
|
||
CAMLE EX1,S79.01; EXPONENT >MAX?
|
||
JRST S80.10; YES-UPDATE
|
||
SUB PTR,EX1; COUNT-EXPONENT
|
||
; UPDATE POINTER
|
||
S80.10: SUB PTR,OFFSET; DECREMENT COUNT BY OFFSET
|
||
JUMPLE PTR,S80.20; TO EXIT IF COUNT LE 0
|
||
EXCH N1,S80.98; SAVE N1
|
||
S80.12: MOVEI N1,SPACE
|
||
CAILE PTR,^D8; MORE THAN EIGHT SPACES?
|
||
JRST S80.30; YES
|
||
ADD N1,PTR; NO-GENERATE JWS SPACES
|
||
IDPB N1,S80.99
|
||
EXCH N1,S80.98; RESTORE N1
|
||
S80.20: MOVE PTR,S80.99; RESTORE POINTER
|
||
JSR S79; TO OUTPUT
|
||
MOVEI N1,^D8;
|
||
MOVEM N1,S79.01; RESTORE MAX VALUE TO 8
|
||
JRST 2,@S80; EXIT
|
||
S80.30: ADDI N1,^D8; GENERATE JWS 8 SPACES
|
||
SUBI PTR,^D8; REDUCE SPACE COUNT
|
||
IDPB N1,S80.99
|
||
JRST S80.12; CONTINUE
|
||
;CALLED BY:
|
||
;JSR S81
|
||
;RETURN
|
||
|
||
;INPUT PART IN REG 1
|
||
; STEP IN REG 3
|
||
;OUTPUT JNF IN 1 AND 3; 2 IS CLOBBERRED
|
||
|
||
RA=1
|
||
RB=2
|
||
RC=3
|
||
|
||
S81A: MOVEI RB,0; CHOOSE P SUCH THAT
|
||
CAML RA,T80(RB); 10*(P+1)>PART #
|
||
AOJA RB,.-1; NEW SF =P
|
||
SOS RB
|
||
MOVEM RB,S81.98; SAVE SF
|
||
MOVNI RB,-^D8(RB); 8-SF
|
||
IMUL RA,T80(RB); PART.10*(8-SF)
|
||
ADD RA,RC; +STEP
|
||
MOVE RC,S81.98; RESTORE SF
|
||
JRST 2,@S81; EXIT
|
||
SUBTTL ROUTINE S83: TYPE IN FORM - UNDERSCORES
|
||
; CALLED BY
|
||
; JSR S83
|
||
; ERROR
|
||
; NORMAL
|
||
; INPUT:
|
||
; REGISTER 1 AND 3 JNF OF NUMBER
|
||
; REGISTER 2 BYTE POINTER (0 LEVEL)
|
||
; REGISTER 4: NUMBER OF WHOLE DIGITS :W
|
||
; REGISTER 5: NUMBER OF DECIMAL DIGITS :D
|
||
; IF D=0, REGISTER 6 = 0 IF NO DECIMAL POINT
|
||
; 1 IF DECIMAL POINT
|
||
; OUTPUT:
|
||
; RESULT IN STRING (INTERPRETER INTERNAL FORM)
|
||
; BYTE POINTER UPDATED IN REGISTER 2
|
||
; REGISTERS 1,3,4,5,6 CLOBBERED
|
||
A=1
|
||
PTR=2
|
||
S=3
|
||
W=4
|
||
D=5
|
||
PT=6
|
||
; INTERPRETER INTERNAL FORM
|
||
RADIX 8
|
||
SPACE=170
|
||
POINT=160
|
||
MINUS=141
|
||
DEFINE OUT (CHAR)
|
||
<
|
||
MOVEI PTR,CHAR
|
||
IDPB PTR,S83.99
|
||
>
|
||
S83A: MOVEM PTR,S83.99; SAVE POINTER
|
||
MOVEM PT, S83.98; DECIMAL POINT INDICATOR
|
||
SETZM S83.97; STORE SIGN AS 0 OR 1
|
||
TLZE A,^O400000; SET SIGN +, SKIP IF +
|
||
AOS S83.97; STORE SIGN AS 1
|
||
JUMPN A,S83.20; TO .20 IF A NE 0
|
||
; A=0
|
||
S83.03: JUMPE D,S83.10; TO .10
|
||
MOVE PT,W; A = ZERO, IF D=0
|
||
MOVEI PTR, SPACE;
|
||
JSR SR1; OUTPUT W SPACES
|
||
OUT POINT; OUTPUT DEC PT
|
||
|
||
MOVEI PTR,0;
|
||
MOVE PT,D;
|
||
JSR SR1; OUTPUT D ZEROES
|
||
S83.05: MOVE PTR,S83.99; RESTORE PTR
|
||
AOS S83; NORMAL RETURN
|
||
JRST 2,@S83;
|
||
S83.10: MOVE PT,W ;A=0, D=0
|
||
SOS PT
|
||
MOVEI PTR,SPACE
|
||
JSR SR1; OUTPUT W-1 SPACES
|
||
OUT 0; OUTPUT A ZERO
|
||
SKIPN S83.98; SKIP IF DEC POINT REQUIRED
|
||
JRST S83.05; EXIT
|
||
OUT POINT; OUTPUT POINT
|
||
JRST S83.05; EXIT
|
||
; A NE 0
|
||
S83.20: MOVEI PTR,2; COMPUTE P = D+S+2
|
||
ADD PTR,D
|
||
ADD PTR,S
|
||
CAILE PTR,^D9;
|
||
JRST S83.25; IF P>9, NO ROUNDING
|
||
CAIGE PTR,1;
|
||
JRST S83.03; IF P<1, ANSWER IS ZERO
|
||
; ROUND
|
||
MOVNI PTR,-^D9(PTR); 9-P
|
||
ADD A,S83.80(PTR); A+5.10*(9-P)
|
||
CAML A,T80.09; CARRY PROPAGATED?
|
||
JRST S83.75 ;YES
|
||
S83.25: MOVEI PTR,^D8; NO
|
||
MOVEM PTR,S83.96; P=8
|
||
JUMPGE S,S83.45 ;IF SF >0, OUTPUT WHOLE DIGITS
|
||
MOVNS S; ABS(S) TO S
|
||
CAMLE S,D; OUTPUT ZERO IF LEAD 0'S = D
|
||
JRST S83.03;
|
||
MOVE PT,W
|
||
MOVEI PTR,SPACE
|
||
SKIPN S83.97; MINUS SIGN
|
||
JRST S83.40; NO
|
||
JUMPG W,S83.30; YES - JUMP IF THERE'S A WHOLE #
|
||
EEXIT: MOVE PTR,S83.99; ERROR EXIT IF NO ROOM
|
||
JRST 2,@S83;
|
||
S83.30: SOS PT
|
||
JSR SR1; OUTPUT W-1 SPACES
|
||
OUT MINUS
|
||
S83.35: OUT POINT
|
||
MOVE PT,S
|
||
SOS PT
|
||
SUB D,PT; D=D-(ABS(SF)-1)
|
||
MOVEI PTR,0
|
||
JSR SR1; OUTPUT (ABS(SF)-1) ZEROES
|
||
JRST S83.57; TO OUTPUT DEC. DIGITS
|
||
S83.40: JSR SR1; OUTPUT W SPACES
|
||
JRST S83.35; TO OUTPUT DEC. POINT
|
||
; SF >0
|
||
S83.45: MOVEM S,S83.95;
|
||
AOS S83.95; I=S+1
|
||
SKIPE S83.97;
|
||
AOS S83.95; INCREMENT I IF MINUS SIGN
|
||
CAMGE W,S83.95
|
||
JRST EEXIT; TO ERROR EXIT IF FIELD SMALL
|
||
SUB W,S83.95; W-I
|
||
MOVE PT,W
|
||
MOVE W,S
|
||
AOS W; W=S+1
|
||
MOVEI PTR,SPACE
|
||
JSR SR1; OUTPUT W-1 SPACES
|
||
SKIPN S83.97; OUTPUT A MINUS IF NECESSARY
|
||
JRST S83.47;
|
||
OUT MINUS
|
||
S83.47: JUMPE W,S83.50
|
||
SKIPGE S83.96; MORE DIGITS
|
||
JRST S83.49; ZEROES
|
||
MOVE PTR,S83.96; P
|
||
IDIV A,T80(PTR) ;X/10*P
|
||
EXCH A,PTR; PTR=QUOT; A=REMAINDER
|
||
SOS S83.96; P=P-1
|
||
IDPB PTR,S83.99; OUTPUT NUMBER
|
||
SOJA W,S83.47; DECREMENT W AND LOOP
|
||
S83.49: OUT 0
|
||
SOJA W,S83.47;
|
||
S83.50: JUMPN D,S83.55;
|
||
SKIPN S83.98; D=0; SKIP IF DEC. PT
|
||
JRST S83.05; EXIT
|
||
OUT POINT
|
||
JRST S83.05; EXIT
|
||
; DECIMAL DIGITS TO OUTPUT
|
||
S83.55: OUT POINT
|
||
S83.57: MOVE W,D; NUMBER OF DECIMAL DIGITS TO W
|
||
MOVEI D,0; CLEAR D AND DEC PT INDIC.
|
||
SETZM S83.98;
|
||
JRST S83.47; TO OUTPUT
|
||
; CARRY PROPAGATED FROM ROUND
|
||
S83.75: IDIVI A,^D10; A/10
|
||
AOJA S,S83.25; SF+1
|
||
; PTR IN S83.99
|
||
; CHARACTER IN PTR
|
||
; K IN PT
|
||
SR1A:SR1.1: JUMPLE PT,@SR1; EXIT IF K LE 0
|
||
IDPB PTR,S83.99;
|
||
|
||
SOJA PT,SR1.1;
|
||
S83.80: DEC 5
|
||
DEC 50
|
||
DEC 500
|
||
DEC 5000
|
||
DEC 50000
|
||
DEC 500000
|
||
DEC 5000000
|
||
DEC 50000000
|
||
DEC 500000000
|
||
SUBTTL ROUTINE S84: TYPE IN FORM (PERIODS)
|
||
; CALLED BY :
|
||
; JSR S84
|
||
; ERROR
|
||
; NORMAL
|
||
; INPUT:
|
||
; 1 AND 3: JNF
|
||
; 2: BYTE PTR (0 LEVEL)
|
||
; 4: N=NUMBER OF PERIODS
|
||
; OUTPUT:
|
||
; 2: UPDATED POINTER
|
||
; 1,3,4: CLOBBERRED
|
||
; CONVERTED NUMBER IN STRING, INTERP. FORM
|
||
A=1
|
||
PTR=2
|
||
S=3
|
||
N=4
|
||
RADIX 8
|
||
MINUS=141
|
||
POINT=160
|
||
SPACE=170
|
||
DEFINE OUT (N)
|
||
<
|
||
MOVEI PTR, N
|
||
IDPB PTR, S84.99
|
||
>
|
||
S84A: CAIGE N,7
|
||
JRST 2,@S84; ERROR IF N<7
|
||
MOVEM PTR,S84.99; SAVE POINTER
|
||
JUMPN A,S84.10
|
||
OUT SPACE; A=0
|
||
OUT 0
|
||
SUBI N,2
|
||
MOVEI PTR,SPACE; OUTPUT N-2 SPACES
|
||
IDPB PTR,S84.99
|
||
SOJG N,.-1
|
||
MOVE PTR,S84.99; RESTORE POINTER
|
||
S84.05: AOS S84; BUMP FOR NORMAL
|
||
JRST 2,@S84;
|
||
S84.10: SETZM S84.98; SET 0 OR 1 AS SIGN
|
||
TLZE A,^O400000; IS + OR -
|
||
AOS S84.98;
|
||
CAIL N,^D14; IF N GE 14 NO ROUND
|
||
JRST S84.12; N=14; NO ROUNDING
|
||
MOVEI PTR,^D13;
|
||
SUB PTR,N; 13-N
|
||
ADD A,S84.80(PTR); ROUND: A=A+5.10*(13-N)
|
||
CAMGE A,T80.09;
|
||
JRST S84.12
|
||
IDIVI A,^D10; ADJUST FOR OFLOW
|
||
AOS S
|
||
S84.12: SKIPN S84.98; SKIP IF MINUS NEEDED
|
||
JRST S84.14;
|
||
OUT MINUS
|
||
JRST S84.15
|
||
S84.14: OUT SPACE
|
||
S84.15: MOVEM S,P84.97; SAVE SF
|
||
MOVEI S,^D8; SET P=8
|
||
IDIV A,T80(S); A/10*P
|
||
EXCH A,PTR ;PTR=QUOT. A=REM
|
||
IDPB PTR,S84.99; OUTPUT X.
|
||
OUT POINT
|
||
SUBI N,6; N=N-6 (S,X.,S,XX)
|
||
S84.20: SOS S; P=P-1
|
||
IDIV A,T80(S)
|
||
EXCH A,PTR; PTR=Q(A/10*P); A=REMAINDER
|
||
IDPB PTR,S84.99; OUTPUT DECIMAL DIGITS
|
||
SOJG N,S84.20; LOOP ON N
|
||
MOVE A,P84.97; SCALE FACTOR
|
||
JUMPGE A,S84.25
|
||
MOVNS A; NEGATIVE SF
|
||
OUT MINUS
|
||
JRST S84.30
|
||
S84.25: OUT SPACE
|
||
S84.30: IDIVI A,^D10; TENS IN A; UNITS IN PTR
|
||
IDPB A,S84.99; OUTPUT SF
|
||
IDPB PTR,S84.99;
|
||
MOVE PTR,S84.99; RESTORE POINTER
|
||
JRST S84.05; EXIT
|
||
S84.80: DEC 5
|
||
DEC 50
|
||
DEC 500
|
||
DEC 5000
|
||
DEC 50000
|
||
DEC 500000
|
||
DEC 5000000
|
||
SUBTTL S86A:UNPACK 2
|
||
S86A: UNPK B
|
||
JSR S87
|
||
JRST 2,@S86
|
||
SUBTTL S87A:UNPACK 1
|
||
S87A: EXTERN T7.9
|
||
AOS T7.9; ED'S ARITH COUNTER
|
||
UNPK A
|
||
JRST 2,@S87
|
||
|
||
END
|
||
|
||
|