; FUNCTION COSINE(X:REAL):REAL;
; {+++   COSINE ROUTINE, ANGLE "X" MUST BE IN RADIANS   +++}
; CONST PI = 3.1415926536;
;       J = 2;
; VAR   M,N : INTEGER;
;       R,S,T,U,V : REAL;


       NAME COSINE
       ENTRY COSINE


;       FUNCTION FIX(Y,P: REAL): REAL;
;       VAR     SGN : -1..1;
;       BEGIN
L151
       ENTR    D,3,2
;         IF Y>0.0 THEN
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,12
       DADD    B
       LXI     B,4
       LDIR
       MOV     H,A
       MOV     L,A
       MOV     D,A
       MOV     E,A
       PUSH    H
       PUSH    D
       GRET    D,-4
;           SGN := 1
       JNC     L165
;         ELSE IF Y=0.0 THEN
       MOV     0(IX),A
       MVI     -1(IX),1
       JMP     L178
L165
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,12
       DADD    B
       LXI     B,4
       LDIR
       MOV     H,A
       MOV     L,A
       MOV     D,A
       MOV     E,A
       PUSH    H
       PUSH    D
       EQUL    D,-4
;           SGN := 0
       JNC     L180
;         ELSE
       MOV     0(IX),A
       MOV     -1(IX),A
;           SGN := -1;
       JMP     L193
L180
       MVI     0(IX),255
       MVI     -1(IX),255
L193
L178
;         FIX := SGN * TRUNC(ABS(Y)/P);
       MOV     L,-1(IX)
       MOV     H,0(IX)
       PUSH    H
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,12
       DADD    B
       LXI     B,4
       LDIR
       CALL    L116
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,8
       DADD    B
       LXI     B,4
       LDIR
       FDVD    D,-4
       CALL    L129
       POP     H
       MULT    D,0
       CVTF    H
       LXI     H,3
       DADD    S
       XCHG
       PUSH    IX
       POP     H
       LXI     B,19
       DADD    B
       XCHG
       LXI     B,4
       LDDR
       POP     H
       POP     H
;       END;
       EXIT    D,8
;
;
;
; BEGIN
L138
cosine: ENTR    D,2,24
;   R := 0.0;
       MOV     H,A
       MOV     L,A
       MOV     D,A
       MOV     E,A
       PUSH    H
       PUSH    D
       LXI     H,3
       DADD    S
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-4
       DADD    B
       XCHG
       LXI     B,4
       LDDR
       POP     H
       POP     H
;   IF ABS(X)>PI THEN R := FIX(X,PI);
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,8
       DADD    B
       LXI     B,4
       LDIR
       CALL    L116
       LXI     H,612
       LXI     D,-30739
       PUSH    H
       PUSH    D
       GRET    D,-4
       JNC     L227
       PUSH    B
       PUSH    B
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,8
       DADD    B
       LXI     B,4
       LDIR
       LXI     H,612
       LXI     D,-30739
       PUSH    H
       PUSH    D
       CALL    L151    ; FIX(...)
       LXI     H,3
       DADD    S
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-4
       DADD    B
       XCHG
       LXI     B,4
       LDDR
       POP     H
       POP     H
L227
;   X := X - R * PI;
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,8
       DADD    B
       LXI     B,4
       LDIR
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-7
       DADD    B
       LXI     B,4
       LDIR
       LXI     H,612
       LXI     D,-30739
       PUSH    H
       PUSH    D
       MULT    D,-4
       DSUB    D,-4
       LXI     H,3
       DADD    S
       XCHG
       PUSH    IX
       POP     H
       LXI     B,11
       DADD    B
       XCHG
       LXI     B,4
       LDDR
       POP     H
       POP     H
;   M := -1;
       MVI     0(IX),255
       MVI     -1(IX),255
;   N := 0;
       MOV     -2(IX),A
       MOV     -3(IX),A
;   S := 1.0;
       LXI     H,320
       MOV     D,A
       MOV     E,A
       PUSH    H
       PUSH    D
       LXI     H,3
       DADD    S
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-8
       DADD    B
       XCHG
       LXI     B,4
       LDDR
       POP     H
       POP     H
;   T := 1.0;
       LXI     H,320
       MOV     D,A
       MOV     E,A
       PUSH    H
       PUSH    D
       LXI     H,3
       DADD    S
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-12
       DADD    B
       XCHG
       LXI     B,4
       LDDR
       POP     H
       POP     H
;   U := -X * X;
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,8
       DADD    B
       LXI     B,4
       LDIR
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,8
       DADD    B
       LXI     B,4
       LDIR
       MULT    D,-4
       NEGT    E
       LXI     H,3
       DADD    S
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-16
       DADD    B
       XCHG
       LXI     B,4
       LDDR
       POP     H
       POP     H
;   REPEAT
;     V := S;
L296
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-11
       DADD    B
       LXI     B,4
       LDIR
       LXI     H,3
       DADD    S
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-20
       DADD    B
       XCHG
       LXI     B,4
       LDDR
       POP     H
       POP     H
;     M := M + J; N := N + J;
       MOV     L,-1(IX)
       MOV     H,0(IX)
       INX     H
       INX     H
       MOV     0(IX),H
       MOV     -1(IX),L
       MOV     L,-3(IX)
       MOV     H,-2(IX)
       INX     H
       INX     H
       MOV     -2(IX),H
       MOV     -3(IX),L
;     T := T*U/(M*N) ;
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-15
       DADD    B
       LXI     B,4
       LDIR
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-19
       DADD    B
       LXI     B,4
       LDIR
       MULT    D,-4
       MOV     L,-1(IX)
       MOV     H,0(IX)
       MOV     E,-3(IX)
       MOV     D,-2(IX)
       MULT    D,0
       PUSH    H
       CVTF    B
       FDVD    D,-4
       LXI     H,3
       DADD    S
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-12
       DADD    B
       XCHG
       LXI     B,4
       LDDR
       POP     H
       POP     H
;     S := S + T;
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-11
       DADD    B
       LXI     B,4
       LDIR
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-15
       DADD    B
       LXI     B,4
       LDIR
       DADD    D,-4
       LXI     H,3
       DADD    S
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-8
       DADD    B
       XCHG
       LXI     B,4
       LDDR
       POP     H
       POP     H
;   UNTIL (S = V);
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-11
       DADD    B
       LXI     B,4
       LDIR
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-23
       DADD    B
       LXI     B,4
       LDIR
       EQUL    D,-4
       JNC     L296
;   IF (TRUNC(R) MOD J<>0) THEN S := -S;
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-7
       DADD    B
       LXI     B,4
       LDIR
       CALL    L129
       LXI     H,2
       XCHG
       MMOD    D,0
       MOV     D,A
       MOV     E,A
       DSB1    D,0
       JZ      L347
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-11
       DADD    B
       LXI     B,4
       LDIR
       NEGT    E
       LXI     H,3
       DADD    S
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-8
       DADD    B
       XCHG
       LXI     B,4
       LDDR
       POP     H
       POP     H
L347
;   COSINE := S;
       LXI     H,-4
       DADD    S
       SPHL
       XCHG
       PUSH    IX
       POP     H
       LXI     B,-11
       DADD    B
       LXI     B,4
       LDIR
       LXI     H,3
       DADD    S
       XCHG
       PUSH    IX
       POP     H
       LXI     B,15
       DADD    B
       XCHG
       LXI     B,4
       LDDR
       POP     H
       POP     H
; END;
       EXIT    D,4