Kod: Markera allt
* 00259 ; =================================================================
* 00260 ; TAN(x*PI/4) = x * P(x*x)/Q(x*x)
* 00261 ;
* 00262 ; Formula 4242, pg216
* 00263 ; TAN
* 00264 ; 0 90 90+ 180- 180 270- 270 360-
* 00265 ; 0,1,1,INF | -INF,-1,-1,-0 | 0,1,1,INF | INF,-1,-1,-0
* 00266 ;
* 00267 ; We can compute TAN 0 to 45 degrees directly
* 00268 ;
* 00269 ; IDENTITIES
* 00270 ; TAN(X) = TAN(X MOD 180)
* 00271 ; Y = X MOD 45
* 00272 ; QUAD 0 if(X >= 0 && < 45)
* 00273 ; TAN = TAN(Y);
* 00274 ; QUAD 1 if(X >= 45 && < 90)
* 00275 ; TAN = 1/TAN(45-Y);
* 00276 ; QUAD 2 if(X >= 90 && < 135)
* 00277 ; TAN = -1/TAN(Y);
* 00278 ; QUAD 3 if(X >= 135 && < 180)
* 00279 ; TAN = -TAN(45-Y));
* 00280 ;
* 00281 ; NOTE SAME TAN_SCALE BASIS IS USED IN COMPUTATION, KINDA NICE!
* 00282 ;
* 00283 ;===============================================================
M_TAN_SCALE .eq M_4_PI * 0000005D 00284 M_TAN_SCALE equ M_4_PI ; 1.2732395447e+00 (temp real)
* 00285 ;
M_TANP1 *0488 00286 M_TANP1 ; -1.2528888728e+01 (temp real)
rtl a,#0
rtl a,#0
rtl a,#0x07 ; (0) LSB *0488 3407 00287 retlw 0x07 ; (0) LSB
rtl a,#0x54 ; (1) *0489 3454 00288 retlw 0x54 ; (1)
rtl a,#0x76 ; (2) *048A 3476 00289 retlw 0x76 ; (2)
rtl a,#0xc8 ; (3) MSB *048B 34C8 00290 retlw 0xc8 ; (3) MSB
rtl a,#0x82 ; (4) EXP *048C 3482 00291 retlw 0x82 ; (4) EXP
rtl a,#0x80 ; (5) SIGN *048D 3480 00292 retlw 0x80 ; (5) SIGN
* 00293
M_TANP2 *048E 00294 M_TANP2 ; 2.1184936966e+02 (temp real)
rtl a,#0
rtl a,#0
rtl a,#0x4a ; (0) LSB *048E 344A 00295 retlw 0x4a ; (0) LSB
rtl a,#0x70 ; (1) *048F 3470 00296 retlw 0x70 ; (1)
rtl a,#0xd9 ; (2) *0490 34D9 00297 retlw 0xd9 ; (2)
rtl a,#0xd3 ; (3) MSB *0491 34D3 00298 retlw 0xd3 ; (3) MSB
rtl a,#0x86 ; (4) EXP *0492 3486 00299 retlw 0x86 ; (4) EXP
rtl a,#0x00 ; (5) SIGN *0493 3400 00300 retlw 0x00 ; (5) SIGN
* 00301
M_TANQ1 *0494 00302 M_TANQ1 ; 1.0000000000e+00 (temp real)
rtl a,#0
rtl a,#0
rtl a,#0x00 ; (0) LSB *0494 3400 00303 retlw 0x00 ; (0) LSB
rtl a,#0x00 ; (1) *0495 3400 00304 retlw 0x00 ; (1)
rtl a,#0x00 ; (2) *0496 3400 00305 retlw 0x00 ; (2)
rtl a,#0x80 ; (3) MSB *0497 3480 00306 retlw 0x80 ; (3) MSB
rtl a,#0x7f ; (4) EXP *0498 347F 00307 retlw 0x7f ; (4) EXP
rtl a,#0x00 ; (5) SIGN *0499 3400 00308 retlw 0x00 ; (5) SIGN
* 00309
M_TANQ2 *049A 00310 M_TANQ2 ; -7.1414530935e+01 (temp real)
rtl a,#0
rtl a,#0
rtl a,#0x66 ; (0) LSB *049A 3466 00311 retlw 0x66 ; (0) LSB
rtl a,#0x3d ; (1) *049B 343D 00312 retlw 0x3d ; (1)
rtl a,#0xd4 ; (2) *049C 34D4 00313 retlw 0xd4 ; (2)
rtl a,#0x8e ; (3) MSB *049D 348E 00314 retlw 0x8e ; (3) MSB
rtl a,#0x85 ; (4) EXP *049E 3485 00315 retlw 0x85 ; (4) EXP
rtl a,#0x80 ; (5) SIGN *049F 3480 00316 retlw 0x80 ; (5) SIGN
* 00317
M_TANQ3 *04A0 00318 M_TANQ3 ; 2.6973501312e+02 (temp real)
rtl a,#0
rtl a,#0
rtl a,#0xe9 ; (0) LSB *04A0 34E9 00319 retlw 0xe9 ; (0) LSB
rtl a,#0x14 ; (1) *04A1 3414 00320 retlw 0x14 ; (1)
rtl a,#0xde ; (2) *04A2 34DE 00321 retlw 0xde ; (2)
rtl a,#0x86 ; (3) MSB *04A3 3486 00322 retlw 0x86 ; (3) MSB
rtl a,#0x87 ; (4) EXP *04A4 3487 00323 retlw 0x87 ; (4) EXP
rtl a,#0x00 ; (5) SIGN *04A5 3400 00324 retlw 0x00 ; (5) SIGN
* 00325
_FP_TAN *04A6 00326 _FP_TAN: ; FPac = TAN(FPac)
* 00327 TRarg_TABLE_LD M_TAN_SCALE ; TRarg = M_TAN_SCALE
* M TABLE_SET_SOURCE M_TAN_SCALE
* M LOAD16I table_ptr,M_TAN_SCALE
* M IN_LOADI table_ptr,M_TAN_SCALE,2
* 0000 M local index = 0
* M WHILE index < 2
* M LOAD8I table_ptr+index, ((M_TAN_SCALE) >> (index*8)) & 0xff
lod a,#<M_TAN_SCALE/2 *04A6 305D M movlw LOW(((M_TAN_SCALE) >> (index*8)) & 0xff)
lod table.ptr,a *04A7 00A6 M movwf table_ptr+index
* 00000001 M index = index + 1
* M LOAD8I table_ptr+index, ((M_TAN_SCALE) >> (index*8)) & 0xff
lod a,#>M_TAN_SCALE/2 *04A8 3000 M movlw LOW(((M_TAN_SCALE) >> (index*8)) & 0xff)
lod table.ptr+1,a *04A9 00A7 M movwf table_ptr+index
* 00000002 M index = index + 1
* M ENDW
jsr _TRarg_TABLE_LD *04AA 203F M CALL _TRarg_TABLE_LD
* 00328
* 00329 FP_MUL
jsr _FP_MUL *04AB 22CB M CALL _FP_MUL
* 00330 FP_QUAD
jsr _FP_QUAD *04AC 2421 M CALL _FP_QUAD
* 00331 JMP_BCLR FPquad,0,_FP_tan_1
* M SKIP_BSET FPquad,0
sbs FPquad,0 *04AD 1C50 M btfss FPquad,0
* M JMP _FP_tan_1
jmp _FP_tan_1 *04AE 2CB2 M goto _FP_tan_1
* 00332 FParg_ONE ; FParg = 1.0
jsr _FParg_ONE *04AF 21FA M CALL _FParg_ONE
* 00333 FPac_SWAP
jsr _FPac_SWAP *04B0 21EB M CALL _FPac_SWAP
* 00334 FP_SUB ; xp = 1.0 - xp
jsr _FP_SUB *04B1 228D M CALL _FP_SUB
_FP_tan_1 *04B2 00335 _FP_tan_1
* 00336 TABLE_SET_TRarg ; TRarg = Default Table load
jsr _TABLE_SET_TRarg *04B2 202E M CALL _TABLE_SET_TRarg
* 00337 TRac_STORE FParg1 ; FParg1 = xp
lod a,#FParg1 *04B3 3044 M movlw FParg1
jsr _TRac_STORE *04B4 21DF M CALL _TRac_STORE
* 00338 FPac_CLR ; p = 0
jsr _FPac_CLR *04B5 21F4 M CALL _FPac_CLR
* 00339 TABLE_SET_SOURCE M_TANP1
* M LOAD16I table_ptr,M_TANP1
* M IN_LOADI table_ptr,M_TANP1,2
* 0000 M local index = 0
* M WHILE index < 2
* M LOAD8I table_ptr+index, ((M_TANP1) >> (index*8)) & 0xff
lod a,#<M_TANP1/2 *04B6 3088 M movlw LOW(((M_TANP1) >> (index*8)) & 0xff)
lod table.ptr,a *04B7 00A6 M movwf table_ptr+index
* 00000001 M index = index + 1
* M LOAD8I table_ptr+index, ((M_TANP1) >> (index*8)) & 0xff
lod a,#>M_TANP1/2 *04B8 3004 M movlw LOW(((M_TANP1) >> (index*8)) & 0xff)
lod table.ptr+1,a *04B9 00A7 M movwf table_ptr+index
* 00000002 M index = index + 1
* M ENDW
* 00340 POLY_FParg1 ; p += Constant, p *= xp
jsr _POLY_FParg1 *04BA 23FB M CALL _POLY_FParg1
* 00341 FP_MUL ; p *= xp
jsr _FP_MUL *04BB 22CB M CALL _FP_MUL
* 00342 POLY_FParg1 ; p += Constant, p *= xp
jsr _POLY_FParg1 *04BC 23FB M CALL _POLY_FParg1
* 00343 TRac_STORE FParg2 ; p
lod a,#FParg2 *04BD 304A M movlw FParg2
jsr _TRac_STORE *04BE 21DF M CALL _TRac_STORE
* 00344
* 00345 TABLE_SET_SOURCE M_TANQ1
* M LOAD16I table_ptr,M_TANQ1
* M IN_LOADI table_ptr,M_TANQ1,2
* 0000 M local index = 0
* M WHILE index < 2
* M LOAD8I table_ptr+index, ((M_TANQ1) >> (index*8)) & 0xff
lod a,#<M_TANQ1/2 *04BF 3094 M movlw LOW(((M_TANQ1) >> (index*8)) & 0xff)
lod table.ptr,a *04C0 00A6 M movwf table_ptr+index
* 00000001 M index = index + 1
* M LOAD8I table_ptr+index, ((M_TANQ1) >> (index*8)) & 0xff
lod a,#>M_TANQ1/2 *04C1 3004 M movlw LOW(((M_TANQ1) >> (index*8)) & 0xff)
lod table.ptr+1,a *04C2 00A7 M movwf table_ptr+index
* 00000002 M index = index + 1
* M ENDW
* 00346 FPac_CLR ; p = 0
jsr _FPac_CLR *04C3 21F4 M CALL _FPac_CLR
* 00347 POLY_FParg1 ; q += Constant, q *= xp
jsr _POLY_FParg1 *04C4 23FB M CALL _POLY_FParg1
* 00348 FP_MUL ; q *= xp
jsr _FP_MUL *04C5 22CB M CALL _FP_MUL
* 00349 POLY_FParg1 ; q += Constant, q *= xp
jsr _POLY_FParg1 *04C6 23FB M CALL _POLY_FParg1
* 00350 FP_MUL ; q *= xp
jsr _FP_MUL *04C7 22CB M CALL _FP_MUL
* 00351
* 00352 TABLE_LD ; FParg = Constant
jsr _TABLE_LD *04C8 2013 M CALL _TABLE_LD
* 00353 FP_ADD ; q += Constant
jsr _FP_ADD *04C9 2292 M CALL _FP_ADD
* 00354 TRarg_LOAD FParg2 ; FPac = q, FParg = p
lod a,#FParg2 *04CA 304A M movlw FParg2
jsr _TRarg_LOAD *04CB 21E3 M CALL _TRarg_LOAD
* 00355
* 00356 AND8I FPquad,3
lod a,#3 *04CC 3003 M movlw 3
and FPquad,a *04CD 05D0 M andwf FPquad,f
* 00357
* 00358 CMP8I FPquad,1 ; FPquad == 1
lod a,#1 *04CE 3001 M movlw 1
sur a,FPquad *04CF 0250 M subwf FPquad,w
* 00359 JMP_Z _fp_tan_2 ; q / p
* M SKIP_NZ
* M SKIP_BCLR STATUS,Z
sfc z *04D0 1903 M btfsc STATUS,Z
* M JMP _fp_tan_2
jmp _fp_tan_2 *04D1 2CD7 M goto _fp_tan_2
* 00360 CMP8I FPquad,2 ; FPquad == 2 ?
lod a,#2 *04D2 3002 M movlw 2
sur a,FPquad *04D3 0250 M subwf FPquad,w
* 00361 JMP_Z _fp_tan_2 ; q / p
* M SKIP_NZ
* M SKIP_BCLR STATUS,Z
sfc z *04D4 1903 M btfsc STATUS,Z
* M JMP _fp_tan_2
jmp _fp_tan_2 *04D5 2CD7 M goto _fp_tan_2
* 00362 FPac_SWAP ; p / q
jsr _FPac_SWAP *04D6 21EB M CALL _FPac_SWAP
_fp_tan_2 *04D7 00363 _fp_tan_2
* 00364 FP_DIV
jsr _FP_DIV *04D7 22FD M CALL _FP_DIV
* 00365 JMP_BCLR FPquad,1,_fp_tan_3 ; FP_quad & 4
* M SKIP_BSET FPquad,1
sbs FPquad,1 *04D8 1CD0 M btfss FPquad,1
* M JMP _fp_tan_3
jmp _fp_tan_3 *04D9 2CDC M goto _fp_tan_3
* 00366 XOR8I FPac_SIGN,0x80 ; xp = -xp
lod a,#0x80 *04DA 3080 M movlw 0x80
eor FPac_SIGN,a *04DB 06AF M xorwf FPac_SIGN,f
_fp_tan_3 *04DC 00367 _fp_tan_3
* 00368 XOR8 FPac_SIGN,FPflag ; xp ^= FPflag
lod a,FPflag *04DC 0851 M movfw FPflag
eor FPac_SIGN,a *04DD 06AF M xorwf FPac_SIGN,f
* 00369 ENDSUB
rts *04DE 0008 M return
.bc * 00370