diff --git a/msbasic.s b/msbasic.s index aa7e5b4..9b2b055 100644 --- a/msbasic.s +++ b/msbasic.s @@ -4805,6 +4805,9 @@ RTS3: .include "float.s" +.include "rnd.s" + +.include "trig.s" @@ -4814,269 +4817,6 @@ RTS3: - - -.ifndef KBD -CONRND1: - .byte $98,$35,$44,$7A -CONRND2: - .byte $68,$28,$B1,$46 -.endif -RND: -.ifdef KBD - ldx #$10 - jsr SIGN - beq LFC26 - bmi LFC10 - lda $87 - ldy $88 -LFBFA: - sta FAC+2 - sty FAC+1 -LFBFE: - asl a - asl a - eor FAC+2 - asl a - eor FAC+1 - asl a - asl a - asl a - asl a - eor FAC+1 - asl a - rol FAC+2 - rol FAC+1 -LFC10: - lda FAC+2 - dex - bne LFBFE - sta $87 - sta FAC+3 - lda FAC+1 - sta $88 - lda #$80 - sta FAC - stx FACSIGN - jmp NORMALIZE_FAC2 -LFC26: - ldy $03CA - lda $03C7 - ora #$01 -GOMOVMF: - bne LFBFA - .byte $F0 -.else - jsr SIGN -.ifdef CONFIG_CBM_ALL - bmi L3F01 - bne LDF63 - lda ENTROPY - sta FAC+1 - lda ENTROPY+4 - sta FAC+2 - lda ENTROPY+1 - sta FAC+3 - lda ENTROPY+5 - sta FAC+4 - jmp LDF88 -LDF63: -.else - tax - bmi L3F01 -.endif - lda #CONRND1 - jsr FMULT - lda #CONRND2 - jsr FADD -L3F01: - ldx FAC_LAST - lda FAC+1 - sta FAC_LAST - stx FAC+1 -.ifdef CONFIG_CBM_ALL - ldx FAC+2 - lda FAC+3 - sta FAC+2 - stx FAC+3 -LDF88: -.endif - lda #$00 - sta FACSIGN - lda FAC - sta FACEXTENSION - lda #$80 - sta FAC - jsr NORMALIZE_FAC2 - ldx #RNDSEED - ldy #$00 -GOMOVMF: - jmp STORE_FAC_AT_YX_ROUNDED -.endif -SIN_COS_TAN_ATN: -COS: - lda #CON_PI_HALF - jsr FADD -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 - lda #QUARTER - jsr FSUB - lda FACSIGN - pha - bpl SIN1 - jsr FADDH - lda FACSIGN - bmi L3F5B - lda CPRMASK - eor #$FF - sta CPRMASK -SIN1: - jsr NEGOP -L3F5B: - lda #QUARTER - jsr FADD - pla - bpl L3F68 - jsr NEGOP -L3F68: - lda #POLY_SIN - jmp POLYNOMIAL_ODD -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_CBM_ALL -MICROSOFT: - .byte $A6,$D3,$C1,$C8,$D4,$C8,$D5,$C4 - .byte $CE,$CA -.endif -.ifdef CBM2 -MICROSOFT: - .byte $A1,$54,$46,$8F,$13,$8F,$52,$43 - .byte $89,$CD -.endif -.endif -ATN: - lda FACSIGN - pha - bpl L3FDB - jsr NEGOP -L3FDB: - lda FAC - pha - cmp #$81 - bcc L3FE9 - lda #CON_ONE - jsr FDIV -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 -.ifdef KIM - .byte $00 ; XXX -.endif -.endif RAMSTART1: GENERIC_CHRGET: inc TXTPTR diff --git a/rnd.s b/rnd.s new file mode 100644 index 0000000..0b056cc --- /dev/null +++ b/rnd.s @@ -0,0 +1,105 @@ +.ifdef KBD +RND: + ldx #$10 + jsr SIGN + beq LFC26 + bmi LFC10 + lda $87 + ldy $88 +LFBFA: + sta FAC+2 + sty FAC+1 +LFBFE: + asl a + asl a + eor FAC+2 + asl a + eor FAC+1 + asl a + asl a + asl a + asl a + eor FAC+1 + asl a + rol FAC+2 + rol FAC+1 +LFC10: + lda FAC+2 + dex + bne LFBFE + sta $87 + sta FAC+3 + lda FAC+1 + sta $88 + lda #$80 + sta FAC + stx FACSIGN + jmp NORMALIZE_FAC2 +LFC26: + ldy $03CA + lda $03C7 + ora #$01 +GOMOVMF: + bne LFBFA + .byte $F0 +.else +CONRND1: + .byte $98,$35,$44,$7A +CONRND2: + .byte $68,$28,$B1,$46 +RND: + jsr SIGN +.ifdef CONFIG_CBM_ALL + bmi L3F01 + bne LDF63 + lda ENTROPY + sta FAC+1 + lda ENTROPY+4 + sta FAC+2 + lda ENTROPY+1 + sta FAC+3 + lda ENTROPY+5 + sta FAC+4 + jmp LDF88 +LDF63: +.else + tax + bmi L3F01 +.endif + lda #RNDSEED + jsr LOAD_FAC_FROM_YA +.ifndef CONFIG_CBM_ALL + txa + beq L3EDA +.endif + lda #CONRND1 + jsr FMULT + lda #CONRND2 + jsr FADD +L3F01: + ldx FAC_LAST + lda FAC+1 + sta FAC_LAST + stx FAC+1 +.ifdef CONFIG_CBM_ALL + ldx FAC+2 + lda FAC+3 + sta FAC+2 + stx FAC+3 +LDF88: +.endif + lda #$00 + sta FACSIGN + lda FAC + sta FACEXTENSION + lda #$80 + sta FAC + jsr NORMALIZE_FAC2 + ldx #RNDSEED +GOMOVMF: + jmp STORE_FAC_AT_YX_ROUNDED +.endif diff --git a/trig.s b/trig.s new file mode 100644 index 0000000..d94d33c --- /dev/null +++ b/trig.s @@ -0,0 +1,195 @@ +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_CBM_ALL +MICROSOFT: + .byte $A6,$D3,$C1,$C8,$D4,$C8,$D5,$C4 + .byte $CE,$CA +.endif +.ifdef CBM2 +MICROSOFT: + .byte $A1,$54,$46,$8F,$13,$8F,$52,$43 + .byte $89,$CD +.endif +.endif + +; ---------------------------------------------------------------------------- +; "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 +.ifdef KIM + .byte $00 ; XXX +.endif +.endif