Prev: 3713 Up: Map Next: 37AA
3783: THE 'REDUCE ARGUMENT' SUBROUTINE (offset +39)
 The address of this routine is found in the table of addresses. It is called via the calculator literal +39 by the routines at cos and sin. This subroutine transforms the argument X of SIN X or COS X into a value V. The subroutine first finds the value Y=X/2π-INT(X/2π+0.5), where -0.5<=Y<0.5. The subroutine returns with: V=4*Y if -1<=4*Y<=1 (case i) or V=2-4*Y if 1<4*Y<2 (case ii) or V=-4*Y-2 if -2<=4*Y<-1 (case iii) In each case, -1<=V<=1 and SIN (πV/2)=SIN X. get_argt 3783 RST \$28 X 3784 DEFB \$3D re_stack: X (in full floating-point form) 3785 DEFB \$34 stk_data: X, 1/2π 3786 DEFB \$EE,\$22,\$F9,\$83,\$6E 378B DEFB \$04 multiply: X/2π 378C DEFB \$31 duplicate: X/2π, X/2π 378D DEFB \$A2 stk_half: X/2π, X/2π, 0.5 378E DEFB \$0F addition: X/2π, X/2π+0.5 378F DEFB \$27 int: X/2π, INT (X/2π+0.5) 3790 DEFB \$03 subtract: X/2π-INT (X/2π+0.5)=Y Note: adding 0.5 and taking INT rounds the result to the nearest integer. 3791 DEFB \$31 duplicate: Y, Y 3792 DEFB \$0F addition: 2*Y 3793 DEFB \$31 duplicate: 2*Y, 2*Y 3794 DEFB \$0F addition: 4*Y 3795 DEFB \$31 duplicate: 4*Y, 4*Y 3796 DEFB \$2A abs: 4*Y, ABS (4*Y) 3797 DEFB \$A1 stk_one: 4*Y, ABS (4*Y), 1 3798 DEFB \$03 subtract: 4*Y, ABS (4*Y)-1=Z 3799 DEFB \$31 duplicate: 4*Y, Z, Z 379A DEFB \$37 greater_0: 4*Y, Z, (1/0) 379B DEFB \$C0 st_mem_0: (mem-0 holds the result of the test) 379C DEFB \$00 jump_true to ZPLUS: 4*Y, Z 379D DEFB \$04 379E DEFB \$02 delete: 4*Y 379F DEFB \$38 end_calc: 4*Y=V (case i) 37A0 RET Finished. If the jump was made then continue. ZPLUS 37A1 DEFB \$A1 stk_one: 4*Y, Z, 1 37A2 DEFB \$03 subtract: 4*Y, Z-1 37A3 DEFB \$01 exchange: Z-1, 4*Y 37A4 DEFB \$36 less_0: Z-1, (1/0) 37A5 DEFB \$00 jump_true to YNEG: Z-1 37A6 DEFB \$02 37A7 DEFB \$1B negate: 1-Z YNEG 37A8 DEFB \$38 end_calc: 1-Z=V (case ii) or Z-1=V (case iii) 37A9 RET Finished.
 Prev: 3713 Up: Map Next: 37AA