diff --git a/make b/make index 5d6ec89..ebb32f1 100644 --- a/make +++ b/make @@ -19,7 +19,7 @@ if {#} == 0 unset exit end - for i in cc ctype string stdlib time setjmp orca fcntl vars toolglue signal int64 fenv fpextra + for i in cc ctype string stdlib time setjmp orca fcntl vars toolglue signal int64 fenv fpextra math2 Newer obj/{i}.a {i}.asm if {Status} != 0 set exit on @@ -40,7 +40,7 @@ delete orcalib set list vars.a assert.a cc.a setjmp.a ctype.a string.a stdlib.a set list {list} time.a signal.a toolglue.a orca.a fcntl.a stdio.a int64.a -set list {list} fenv.a fpextra.a +set list {list} fenv.a fpextra.a math2.a for i in {list} echo makelib orcalib +obj/{i} makelib orcalib +obj/{i} diff --git a/math2.asm b/math2.asm new file mode 100644 index 0000000..9c9cdc6 --- /dev/null +++ b/math2.asm @@ -0,0 +1,130 @@ + keep obj/math2 + mcopy math2.macros + case on + +**************************************************************** +* +* Math2 - additional math routines +* +* This code provides additional functions from +* (including internal helper functions used by macros), +* supplementing the ones in SysFloat. +* +**************************************************************** + +math2 private dummy segment + end + +**************************************************************** +* +* int __fpclassifyf(float x); +* +* Classify a float value +* +* Inputs: +* val - the number to classify +* +* Outputs: +* one of the FP_* classification values +* +**************************************************************** +* +__fpclassifyf start + + csubroutine (10:val),0 + + tdc + clc + adc #val + ldy #0 + phy + pha + phy + pha + phy + pha + FX2S + FCLASSS + txa + and #$00FF + cmp #$00FC + bne lb1 + inc a +lb1 sta val + + creturn 2:val + end + +**************************************************************** +* +* int __fpclassifyd(double x); +* +* Classify a double value +* +* Inputs: +* val - the number to classify +* +* Outputs: +* one of the FP_* classification values +* +**************************************************************** +* +__fpclassifyd start + + csubroutine (10:val),0 + + tdc + clc + adc #val + ldy #0 + phy + pha + phy + pha + phy + pha + FX2D + FCLASSD + txa + and #$00FF + cmp #$00FC + bne lb1 + inc a +lb1 sta val + + creturn 2:val + end + +**************************************************************** +* +* int __fpclassifyl(long double x); +* +* Classify a long double value +* +* Inputs: +* val - the number to classify +* +* Outputs: +* one of the FP_* classification values +* +**************************************************************** +* +__fpclassifyl start + + csubroutine (10:val),0 + + tdc + clc + adc #val + pea 0 + pha + FCLASSX + txa + and #$00FF + cmp #$00FC + bne lb1 + inc a +lb1 sta val + + creturn 2:val + end diff --git a/math2.macros b/math2.macros new file mode 100644 index 0000000..ba5bd1a --- /dev/null +++ b/math2.macros @@ -0,0 +1,123 @@ + MACRO +&lab csubroutine &parms,&work +&lab anop + aif c:&work,.a + lclc &work +&work setc 0 +.a + gbla &totallen + gbla &worklen +&worklen seta &work +&totallen seta 0 + aif c:&parms=0,.e + lclc &len + lclc &p + lcla &i +&i seta 1 +.b +&p setc &parms(&i) +&len amid &p,2,1 + aif "&len"=":",.c +&len amid &p,1,2 +&p amid &p,4,l:&p-3 + ago .d +.c +&len amid &p,1,1 +&p amid &p,3,l:&p-2 +.d +&p equ &totallen+4+&work +&totallen seta &totallen+&len +&i seta &i+1 + aif &i<=c:&parms,^b +.e + tsc + aif &work=0,.f + sec + sbc #&work + tcs +.f + phd + tcd + mend + MACRO +&lab creturn &r +&lab anop + lclc &len + aif c:&r,.a + lclc &r +&r setc 0 +&len setc 0 + ago .h +.a +&len amid &r,2,1 + aif "&len"=":",.b +&len amid &r,1,2 +&r amid &r,4,l:&r-3 + ago .c +.b +&len amid &r,1,1 +&r amid &r,3,l:&r-2 +.c + aif &len<>2,.d + ldy &r + ago .h +.d + aif &len<>4,.e + ldx &r+2 + ldy &r + ago .h +.e + aif &len<>10,.g + ldy #&r + ldx #^&r + ago .h +.g + mnote 'Not a valid return length',16 + mexit +.h + aif &totallen=0,.i + lda &worklen+2 + sta &worklen+&totallen+2 + lda &worklen+1 + sta &worklen+&totallen+1 +.i + pld + tsc + clc + adc #&worklen+&totallen + tcs + aif &len=0,.j + tya +.j + rtl + mend + MACRO +&LAB FCLASSS +&LAB PEA $021C + LDX #$090A + JSL $E10000 + MEND + MACRO +&LAB FCLASSD +&LAB PEA $011C + LDX #$090A + JSL $E10000 + MEND + MACRO +&LAB FCLASSX +&LAB PEA $001C + LDX #$090A + JSL $E10000 + MEND + MACRO +&LAB FX2S +&LAB PEA $0210 + LDX #$090A + JSL $E10000 + MEND + MACRO +&LAB FX2D +&LAB PEA $0110 + LDX #$090A + JSL $E10000 + MEND