| Routines

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.