.segment "CODE" .ifndef SYM1 SIN_COS_TAN_ATN: ; ---------------------------------------------------------------------------- ; "COS" FUNCTION ; ---------------------------------------------------------------------------- COS: lda #CON_PI_HALF jsr FADD ; ---------------------------------------------------------------------------- ; "SIN" FUNCTION ; ---------------------------------------------------------------------------- SIN: jsr COPY_FAC_TO_ARG_ROUNDED lda #CON_PI_DOUB ldx ARGSIGN jsr DIV jsr COPY_FAC_TO_ARG_ROUNDED jsr INT lda #$00 sta STRNG1 jsr FSUBT ; ---------------------------------------------------------------------------- ; (FAC) = ANGLE AS A FRACTION OF A FULL CIRCLE ; ; NOW FOLD THE RANGE INTO A QUARTER CIRCLE ; ; <<< THERE ARE MUCH SIMPLER WAYS TO DO THIS >>> ; ---------------------------------------------------------------------------- lda #QUARTER jsr FSUB lda FACSIGN pha bpl SIN1 jsr FADDH lda FACSIGN bmi L3F5B lda CPRMASK eor #$FF sta CPRMASK ; ---------------------------------------------------------------------------- ; IF FALL THRU, RANGE IS 0...1/2 ; IF BRANCH HERE, RANGE IS 0...1/4 ; ---------------------------------------------------------------------------- SIN1: jsr NEGOP ; ---------------------------------------------------------------------------- ; IF FALL THRU, RANGE IS -1/2...0 ; IF BRANCH HERE, RANGE IS -1/4...0 ; ---------------------------------------------------------------------------- L3F5B: lda #QUARTER jsr FADD pla bpl L3F68 jsr NEGOP L3F68: lda #POLY_SIN jmp POLYNOMIAL_ODD ; ---------------------------------------------------------------------------- ; "TAN" FUNCTION ; ; COMPUTE TAN(X) = SIN(X) / COS(X) ; ---------------------------------------------------------------------------- TAN: jsr STORE_FAC_IN_TEMP1_ROUNDED lda #$00 sta CPRMASK jsr SIN ldx #TEMP3 ldy #$00 jsr GOMOVMF lda #TEMP1+(5-BYTES_FP) ldy #$00 jsr LOAD_FAC_FROM_YA lda #$00 sta FACSIGN lda CPRMASK jsr TAN1 lda #TEMP3 ldy #$00 jmp FDIV TAN1: pha jmp SIN1 ; ---------------------------------------------------------------------------- .ifdef CONFIG_SMALL CON_PI_HALF: .byte $81,$49,$0F,$DB CON_PI_DOUB: .byte $83,$49,$0F,$DB QUARTER: .byte $7F,$00,$00,$00 POLY_SIN: .byte $04,$86,$1E,$D7,$FB,$87,$99,$26 .byte $65,$87,$23,$34,$58,$86,$A5,$5D .byte $E1,$83,$49,$0F,$DB .else CON_PI_HALF: .byte $81,$49,$0F,$DA,$A2 CON_PI_DOUB: .byte $83,$49,$0F,$DA,$A2 QUARTER: .byte $7F,$00,$00,$00,$00 POLY_SIN: .byte $05,$84,$E6,$1A,$2D,$1B,$86,$28 .byte $07,$FB,$F8,$87,$99,$68,$89,$01 .byte $87,$23,$35,$DF,$E1,$86,$A5,$5D .byte $E7,$28,$83,$49,$0F,$DA,$A2 .ifndef CONFIG_11 ; no easter egg text before BASIC 1.1 .elseif !.def(CONFIG_2A) ; ASCII encoded easter egg MICROSOFT: .byte $A6,$D3,$C1,$C8,$D4,$C8,$D5,$C4 .byte $CE,$CA .else ; PET encoded easter egg text since CBM2 MICROSOFT: .byte $A1,$54,$46,$8F,$13,$8F,$52,$43 .byte $89,$CD .endif .endif .ifndef AIM65 ; ---------------------------------------------------------------------------- ; "ATN" FUNCTION ; ---------------------------------------------------------------------------- ATN: lda FACSIGN pha bpl L3FDB jsr NEGOP L3FDB: lda FAC pha cmp #$81 bcc L3FE9 lda #CON_ONE jsr FDIV ; ---------------------------------------------------------------------------- ; 0 <= X <= 1 ; 0 <= ATN(X) <= PI/8 ; ---------------------------------------------------------------------------- L3FE9: lda #POLY_ATN jsr POLYNOMIAL_ODD pla cmp #$81 bcc L3FFC lda #CON_PI_HALF jsr FSUB L3FFC: pla bpl L4002 jmp NEGOP L4002: rts ; ---------------------------------------------------------------------------- POLY_ATN: .ifdef CONFIG_SMALL .byte $08 .byte $78,$3A,$C5,$37 .byte $7B,$83,$A2,$5C .byte $7C,$2E,$DD,$4D .byte $7D,$99,$B0,$1E .byte $7D,$59,$ED,$24 .byte $7E,$91,$72,$00 .byte $7E,$4C,$B9,$73 .byte $7F,$AA,$AA,$53 .byte $81,$00,$00,$00 .else .byte $0B .byte $76,$B3,$83,$BD,$D3 .byte $79,$1E,$F4,$A6,$F5 .byte $7B,$83,$FC,$B0,$10 .byte $7C,$0C,$1F,$67,$CA .byte $7C,$DE,$53,$CB,$C1 .byte $7D,$14,$64,$70,$4C .byte $7D,$B7,$EA,$51,$7A .byte $7D,$63,$30,$88,$7E .byte $7E,$92,$44,$99,$3A .byte $7E,$4C,$CC,$91,$C7 .byte $7F,$AA,$AA,$AA,$13 .byte $81,$00,$00,$00,$00 .endif .if .def(CONFIG_11A) && (!.def(CONFIG_2)) .byte $00 ; XXX .endif .endif .endif