diff --git a/compiler/res/prog8lib/c128/floats.p8 b/compiler/res/prog8lib/c128/floats.p8 index 35c3d940c..cbac96b0c 100644 --- a/compiler/res/prog8lib/c128/floats.p8 +++ b/compiler/res/prog8lib/c128/floats.p8 @@ -25,46 +25,64 @@ romsub $af00 = AYINT() clobbers(A,X,Y) ; fac1-> signed word in 102-103 ; there is also floats.GIVUAYFAY - unsigned word in A/Y (lo/hi) to fac1 ; (tip: use GIVAYFAY to use A/Y input; lo/hi switched to normal order) romsub $af03 = GIVAYF(ubyte lo @ Y, ubyte hi @ A) clobbers(A,X,Y) -romsub $af09 = VAL(ubyte length @ A) clobbers(A,X,Y) ; str -> fac1, $24/25 must point to string in bank1, A=string length Don't call this from bank0 -; fac1 -> unsigned word in Y/A (might throw ILLEGAL QUANTITY) (result also in $16/17) +romsub $af06 = FOUT() clobbers(X) -> uword @ AY ; fac1 -> string, address returned in AY +; romsub $af09 = VAL_1() clobbers(A,X,Y) ; convert ASCII string to floating point [not yet implemented!!!] + +; fac1 -> unsigned word in Y/A (might throw ILLEGAL QUANTITY) (result also in $14/15) ; (tip: use GETADRAY to get A/Y output; lo/hi switched to normal little endian order) romsub $af0c = GETADR() clobbers(X) -> ubyte @ Y, ubyte @ A +romsub $af0f = FLOATC() clobbers(A,X,Y) ; convert address to floating point romsub $af12 = FSUB(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 = mflpt from A/Y - fac1 -romsub $af15 = FSUBT() clobbers(A,X,Y) ; fac1 = fac2-fac1 mind the order of the operands -romsub $af18 = FADD(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 += mflpt value from A/Y in bank 1 -romsub $af1b = FADDT() clobbers(A,X,Y) ; fac1 += fac2 -romsub $af2a = LOG() clobbers(A,X,Y) ; fac1 = LN(fac1) (natural log) +romsub $af15 = FSUBT() clobbers(A,X,Y) ; fac1 = fac2-fac1 mind the order of the operands NOTE: use FSUBT2() instead! +romsub $af18 = FADD(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 += mflpt value from A/Y +romsub $af1b = FADDT() clobbers(A,X,Y) ; fac1 += fac2 NOTE: use FADDT2() instead! romsub $af1e = FMULT(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 *= mflpt value from A/Y -romsub $af21 = FMULTT() clobbers(A,X,Y) ; fac1 *= fac2 -romsub $af5a = CONUPK(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory bank 1 in A/Y into fac2 -romsub $af5d = ROMUPK(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in current bank in A/Y into fac2 +romsub $af21 = FMULTT() clobbers(A,X,Y) ; fac1 *= fac2 NOTE: use FMULTT2() instead! romsub $af24 = FDIV(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 = mflpt in A/Y / fac1 (remainder in fac2) -romsub $af27 = FDIVT() clobbers(A,X,Y) ; fac1 = fac2/fac1 (remainder in fac2) mind the order of the operands - -romsub $af63 = MOVFM(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in A/Y into fac1 -romsub $af60 = MOVFRM() clobbers(A,X,Y) ; load mflpt value from memory in $24/$25 into fac2 -romsub $af66 = MOVMF(uword mflpt @ XY) clobbers(A,X,Y) ; store fac1 to memory X/Y as 5-byte mflpt -romsub $af69 = MOVFA() clobbers(A,X) ; copy fac2 to fac1 -romsub $af6c = MOVAF() clobbers(A,X) ; copy fac1 to fac2 -romsub $af6c = MOVEF() clobbers(A,X) ; copy fac1 to fac2 -romsub $af51 = SIGN() clobbers(X,Y) -> ubyte @ A ; SIGN(fac1) to A, $ff, $0, $1 for negative, zero, positive -romsub $af4e = ABS() clobbers(A,X,Y) ; fac1 = ABS(fac1) -romsub $af54 = FCOMP(uword mflpt @ AY) clobbers(X,Y) -> ubyte @ A ; A = compare fac1 to mflpt in A/Y, 0=equal 1=fac1 is greater, 255=fac1 is less than +romsub $af27 = FDIVT() clobbers(A,X,Y) ; fac1 = fac2/fac1 (remainder in fac2) mind the order of the operands NOTE: use FDIVT2() instead! +romsub $af2a = LOG() clobbers(A,X,Y) ; fac1 = LN(fac1) (natural log) romsub $af2d = INT() clobbers(A,X,Y) ; INT() truncates, use FADDH first to round instead of trunc -romsub $af06 = FOUT() clobbers(X) -> uword @ AY ; fac1 -> string, address returned in AY ($0100) romsub $af30 = SQR() clobbers(A,X,Y) ; fac1 = SQRT(fac1) -romsub $af36 = FPWR(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 = fac2 ** mflpt from A/Y -romsub $af39 = FPWRT() clobbers(A,X,Y) ; fac1 = fac2 ** fac1 romsub $af33 = NEGOP() clobbers(A) ; switch the sign of fac1 (fac1 = -fac1) +romsub $af36 = FPWR(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 = fac2 ** float in A/Y +romsub $af39 = FPWRT() clobbers(A,X,Y) ; fac1 = fac2 ** fac1 NOTE: use FPWRT2() instead! romsub $af3c = EXP() clobbers(A,X,Y) ; fac1 = EXP(fac1) (e ** fac1) -romsub $af57 = RND() clobbers(A,X,Y) ; fac1 = RND(fac1) float random number generator romsub $af3f = COS() clobbers(A,X,Y) ; fac1 = COS(fac1) romsub $af42 = SIN() clobbers(A,X,Y) ; fac1 = SIN(fac1) romsub $af45 = TAN() clobbers(A,X,Y) ; fac1 = TAN(fac1) romsub $af48 = ATN() clobbers(A,X,Y) ; fac1 = ATN(fac1) +romsub $af4b = ROUND() clobbers(A,X,Y) ; round fac1 +romsub $af4e = ABS() clobbers(A,X,Y) ; fac1 = ABS(fac1) +romsub $af51 = SIGN() clobbers(X,Y) -> ubyte @ A ; SIGN(fac1) to A, $ff, $0, $1 for negative, zero, positive +romsub $af54 = FCOMP(uword mflpt @ AY) clobbers(X,Y) -> ubyte @ A ; A = compare fac1 to mflpt in A/Y, 0=equal 1=fac1 is greater, 255=fac1 is less than +romsub $af57 = RND_0() clobbers(A,X,Y) ; fac1 = RND(fac1) float random number generator NOTE: special cx16 setup required, use RND() stub instead!! +romsub $af5a = CONUPK(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in A/Y into fac2 +romsub $af5d = ROMUPK(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in current bank in A/Y into fac2 +romsub $af60 = MOVFRM(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in A/Y into fac1 (use MOVFM instead) +romsub $af63 = MOVFM(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in A/Y into fac1 +romsub $af66 = MOVMF(uword mflpt @ XY) clobbers(A,X,Y) ; store fac1 to memory X/Y as 5-byte mflpt +romsub $af69 = MOVFA() clobbers(A,X) ; copy fac2 to fac1 +romsub $af6c = MOVAF() clobbers(A,X) ; copy fac1 to fac2 (rounded) +; X16 additions +romsub $af6f = FADDH() clobbers(A,X,Y) ; fac1 += 0.5, for rounding- call this before INT +romsub $af72 = FADDT2() clobbers(A,X,Y) ; fac1 += fac2 +romsub $af75 = ZEROFC() clobbers(A,X,Y) ; fac1 = 0 +romsub $af78 = NORMAL() clobbers(A,X,Y) ; normalize fac1 (?) +romsub $af7b = NEGFAC() clobbers(A) ; switch the sign of fac1 (fac1 = -fac1) (juse use NEGOP() instead!) +romsub $af7e = FMULTT2() clobbers(A,X,Y) ; fac1 *= fac2 +romsub $af81 = MUL10() clobbers(A,X,Y) ; fac1 *= 10 +romsub $af84 = DIV10() clobbers(A,X,Y) ; fac1 /= 10 , CAUTION: result is always positive! +romsub $af87 = FDIVT2() clobbers(A,X,Y) ; fac1 = fac2/fac1 (remainder in fac2) mind the order of the operands +romsub $af8a = MOVEF() clobbers(A,X) ; copy fac1 to fac2 +romsub $af8d = SGN() clobbers(A,X,Y) ; fac1 = SGN(fac1), result of SIGN (-1, 0 or 1) +romsub $af90 = FLOAT() clobbers(A,X,Y) ; FAC = (u8).A +romsub $af93 = FLOATS() clobbers(A,X,Y) ; FAC = (s16)facho+1:facho +romsub $af9C = QINT() clobbers(A,X,Y) ; facho:facho+1:facho+2:facho+3 = u32(FAC) +romsub $af9f = FINLOG(byte value @A) clobbers (A, X, Y) ; fac1 += signed byte in A +romsub $afa5 = FPWRT2() clobbers(A,X,Y) ; fac1 = fac2 ** fac1 asmsub FREADSA (byte value @A) clobbers(A,X,Y) { ; ---- 8 bit signed A -> float in fac1 @@ -81,22 +99,14 @@ asmsub FREADSA (byte value @A) clobbers(A,X,Y) { asmsub GIVUAYFAY (uword value @ AY) clobbers(A,X,Y) { ; ---- unsigned 16 bit word in A/Y (lo/hi) to fac1 %asm {{ - stx P8ZP_SCRATCH_REG - sta _tmp - sty P8ZP_SCRATCH_B1 - tya - ldy _tmp - jsr GIVAYF ; load it as signed... correct afterwards - lda P8ZP_SCRATCH_B1 - bpl + - lda #<_flt65536 - ldy #>_flt65536 - jsr ROMUPK - jsr FADDT -+ ldx P8ZP_SCRATCH_REG - rts -_tmp .byte 0 -_flt65536 .byte 145,0,0,0,0 ; 65536.0 + phx + sty $64 ; facmo + sta $65 ; facmo+1 + ldx #$90 + sec + jsr FLOATC + plx + rts }} } @@ -111,6 +121,17 @@ asmsub GIVAYFAY (uword value @ AY) clobbers(A,X,Y) { }} } +asmsub FTOSWRDAY () clobbers(X) -> uword @ AY { + ; ---- fac1 to signed word in A/Y + %asm {{ + jsr FTOSWORDYA ; note the inverse Y/A order + sta P8ZP_SCRATCH_B1 + tya + ldy P8ZP_SCRATCH_B1 + rts + }} +} + asmsub GETADRAY () clobbers(X) -> uword @ AY { ; ---- fac1 to unsigned word in A/Y %asm {{ @@ -125,8 +146,8 @@ asmsub GETADRAY () clobbers(X) -> uword @ AY { asmsub FREADUY (ubyte value @Y) { ; -- 8 bit unsigned Y -> float in fac1 %asm {{ - lda #0 - jmp GIVAYF + tya + jmp FLOAT }} } diff --git a/compiler/res/prog8lib/cx16/floats.p8 b/compiler/res/prog8lib/cx16/floats.p8 index 791c76b2a..db565bb7b 100644 --- a/compiler/res/prog8lib/cx16/floats.p8 +++ b/compiler/res/prog8lib/cx16/floats.p8 @@ -14,7 +14,7 @@ floats { const float TWOPI = 6.283185307179586 -; ---- ROM float functions ---- +; ---- ROM float functions (same as on C128 except base page) ---- ; note: the fac1 and fac2 are working registers and take 6 bytes each, ; floats in memory (and rom) are stored in 5-byte MFLPT packed format. @@ -29,68 +29,87 @@ romsub $fe00 = AYINT() clobbers(A,X,Y) ; fac1-> signed word in 100-101 ; (tip: use GIVAYFAY to use A/Y input; lo/hi switched to normal order) romsub $fe03 = GIVAYF(ubyte lo @ Y, ubyte hi @ A) clobbers(A,X,Y) +romsub $fe06 = FOUT() clobbers(X) -> uword @ AY ; fac1 -> string, address returned in AY +; romsub $fe09 = VAL_1() clobbers(A,X,Y) ; convert ASCII string to floating point [not yet implemented!!!] + ; fac1 -> unsigned word in Y/A (might throw ILLEGAL QUANTITY) (result also in $14/15) ; (tip: use GETADRAY to get A/Y output; lo/hi switched to normal little endian order) -romsub $fe06 = GETADR() clobbers(X) -> ubyte @ Y, ubyte @ A +romsub $fe0c = GETADR() clobbers(X) -> ubyte @ Y, ubyte @ A +romsub $fe0f = FLOATC() clobbers(A,X,Y) ; convert address to floating point -romsub $fe09 = FADDH() clobbers(A,X,Y) ; fac1 += 0.5, for rounding- call this before INT -romsub $fe0c = FSUB(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 = mflpt from A/Y - fac1 -romsub $fe0f = FSUBT() clobbers(A,X,Y) ; fac1 = fac2-fac1 mind the order of the operands -romsub $fe12 = FADD(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 += mflpt value from A/Y -romsub $fe15 = FADDT() clobbers(A,X,Y) ; fac1 += fac2 -romsub $fe1b = ZEROFC() clobbers(A,X,Y) ; fac1 = 0 -romsub $fe1e = NORMAL() clobbers(A,X,Y) ; normalize fac1 (?) -romsub $fe24 = LOG() clobbers(A,X,Y) ; fac1 = LN(fac1) (natural log) -romsub $fe27 = FMULT(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 *= mflpt value from A/Y -romsub $fe2a = FMULTT() clobbers(A,X,Y) ; fac1 *= fac2 -romsub $fe30 = CONUPK(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in A/Y into fac2 -romsub $fe33 = MUL10() clobbers(A,X,Y) ; fac1 *= 10 -romsub $fe36 = DIV10() clobbers(A,X,Y) ; fac1 /= 10 , CAUTION: result is always positive! -romsub $fe39 = FDIV(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 = mflpt in A/Y / fac1 (remainder in fac2) -romsub $fe3c = FDIVT() clobbers(A,X,Y) ; fac1 = fac2/fac1 (remainder in fac2) mind the order of the operands +romsub $fe12 = FSUB(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 = mflpt from A/Y - fac1 +romsub $fe15 = FSUBT() clobbers(A,X,Y) ; fac1 = fac2-fac1 mind the order of the operands NOTE: use FSUBT2() instead! +romsub $fe18 = FADD(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 += mflpt value from A/Y +romsub $fe1b = FADDT() clobbers(A,X,Y) ; fac1 += fac2 NOTE: use FADDT2() instead! +romsub $fe1e = FMULT(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 *= mflpt value from A/Y +romsub $fe21 = FMULTT() clobbers(A,X,Y) ; fac1 *= fac2 NOTE: use FMULTT2() instead! +romsub $fe24 = FDIV(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 = mflpt in A/Y / fac1 (remainder in fac2) +romsub $fe27 = FDIVT() clobbers(A,X,Y) ; fac1 = fac2/fac1 (remainder in fac2) mind the order of the operands NOTE: use FDIVT2() instead! +romsub $fe2a = LOG() clobbers(A,X,Y) ; fac1 = LN(fac1) (natural log) +romsub $fe2d = INT() clobbers(A,X,Y) ; INT() truncates, use FADDH first to round instead of trunc +romsub $fe30 = SQR() clobbers(A,X,Y) ; fac1 = SQRT(fac1) +romsub $fe33 = NEGOP() clobbers(A) ; switch the sign of fac1 (fac1 = -fac1) +romsub $fe36 = FPWR(uword mflpt @ AY) clobbers(A,X,Y) ; fac1 = fac2 ** float in A/Y +romsub $fe39 = FPWRT() clobbers(A,X,Y) ; fac1 = fac2 ** fac1 NOTE: use FPWRT2() instead! +romsub $fe3c = EXP() clobbers(A,X,Y) ; fac1 = EXP(fac1) (e ** fac1) +romsub $fe3f = COS() clobbers(A,X,Y) ; fac1 = COS(fac1) +romsub $fe42 = SIN() clobbers(A,X,Y) ; fac1 = SIN(fac1) +romsub $fe45 = TAN() clobbers(A,X,Y) ; fac1 = TAN(fac1) +romsub $fe48 = ATN() clobbers(A,X,Y) ; fac1 = ATN(fac1) +romsub $fe4b = ROUND() clobbers(A,X,Y) ; round fac1 +romsub $fe4e = ABS() clobbers(A,X,Y) ; fac1 = ABS(fac1) +romsub $fe51 = SIGN() clobbers(X,Y) -> ubyte @ A ; SIGN(fac1) to A, $ff, $0, $1 for negative, zero, positive +romsub $fe54 = FCOMP(uword mflpt @ AY) clobbers(X,Y) -> ubyte @ A ; A = compare fac1 to mflpt in A/Y, 0=equal 1=fac1 is greater, 255=fac1 is less than +romsub $fe57 = RND_0() clobbers(A,X,Y) ; fac1 = RND(fac1) float random number generator NOTE: special cx16 setup required, use RND() stub instead!! +romsub $fe5a = CONUPK(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in A/Y into fac2 +romsub $fe5d = ROMUPK(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in current bank in A/Y into fac2 +romsub $fe60 = MOVFRM(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in A/Y into fac1 (use MOVFM instead) +romsub $fe63 = MOVFM(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in A/Y into fac1 +romsub $fe66 = MOVMF(uword mflpt @ XY) clobbers(A,X,Y) ; store fac1 to memory X/Y as 5-byte mflpt +romsub $fe69 = MOVFA() clobbers(A,X) ; copy fac2 to fac1 +romsub $fe6c = MOVAF() clobbers(A,X) ; copy fac1 to fac2 (rounded) -romsub $fe42 = MOVFM(uword mflpt @ AY) clobbers(A,X,Y) ; load mflpt value from memory in A/Y into fac1 -romsub $fe45 = MOVMF(uword mflpt @ XY) clobbers(A,X,Y) ; store fac1 to memory X/Y as 5-byte mflpt -romsub $fe48 = MOVFA() clobbers(A,X) ; copy fac2 to fac1 -romsub $fe4b = MOVAF() clobbers(A,X) ; copy fac1 to fac2 (rounded) -romsub $fe4e = MOVEF() clobbers(A,X) ; copy fac1 to fac2 -romsub $fe54 = SIGN() clobbers(X,Y) -> ubyte @ A ; SIGN(fac1) to A, $ff, $0, $1 for negative, zero, positive -romsub $fe57 = SGN() clobbers(A,X,Y) ; fac1 = SGN(fac1), result of SIGN (-1, 0 or 1) -romsub $fe5a = FREADSA(byte value @ A) clobbers(A,X,Y) ; 8 bit signed A -> float in fac1 -romsub $fe66 = ABS() clobbers(A,X,Y) ; fac1 = ABS(fac1) -romsub $fe69 = FCOMP(uword mflpt @ AY) clobbers(X,Y) -> ubyte @ A ; A = compare fac1 to mflpt in A/Y, 0=equal 1=fac1 is greater, 255=fac1 is less than -romsub $fe72 = INT() clobbers(A,X,Y) ; INT() truncates, use FADDH first to round instead of trunc -romsub $fe78 = FINLOG(byte value @A) clobbers (A, X, Y) ; fac1 += signed byte in A -romsub $fe7b = FOUT() clobbers(X) -> uword @ AY ; fac1 -> string, address returned in AY -romsub $fe81 = SQR() clobbers(A,X,Y) ; fac1 = SQRT(fac1) -romsub $fe84 = FPWRT() clobbers(A,X,Y) ; fac1 = fac2 ** fac1 -romsub $fe8a = NEGOP() clobbers(A) ; switch the sign of fac1 (fac1 = -fac1) -romsub $fe8d = EXP() clobbers(A,X,Y) ; fac1 = EXP(fac1) (e ** fac1) -romsub $fe96 = RND() clobbers(A,X,Y) ; fac1 = RND(fac1) float random number generator -romsub $fe99 = COS() clobbers(A,X,Y) ; fac1 = COS(fac1) -romsub $fe9c = SIN() clobbers(A,X,Y) ; fac1 = SIN(fac1) -romsub $fe9f = TAN() clobbers(A,X,Y) ; fac1 = TAN(fac1) -romsub $fea2 = ATN() clobbers(A,X,Y) ; fac1 = ATN(fac1) +; X16 additions +romsub $fe6f = FADDH() clobbers(A,X,Y) ; fac1 += 0.5, for rounding- call this before INT +romsub $fe72 = FADDT2() clobbers(A,X,Y) ; fac1 += fac2 +romsub $fe75 = ZEROFC() clobbers(A,X,Y) ; fac1 = 0 +romsub $fe78 = NORMAL() clobbers(A,X,Y) ; normalize fac1 (?) +romsub $fe7b = NEGFAC() clobbers(A) ; switch the sign of fac1 (fac1 = -fac1) (juse use NEGOP() instead!) +romsub $fe7e = FMULTT2() clobbers(A,X,Y) ; fac1 *= fac2 +romsub $fe81 = MUL10() clobbers(A,X,Y) ; fac1 *= 10 +romsub $fe84 = DIV10() clobbers(A,X,Y) ; fac1 /= 10 , CAUTION: result is always positive! +romsub $fe87 = FDIVT2() clobbers(A,X,Y) ; fac1 = fac2/fac1 (remainder in fac2) mind the order of the operands +romsub $fe8a = MOVEF() clobbers(A,X) ; copy fac1 to fac2 +romsub $fe8d = SGN() clobbers(A,X,Y) ; fac1 = SGN(fac1), result of SIGN (-1, 0 or 1) +romsub $fe90 = FLOAT() clobbers(A,X,Y) ; FAC = (u8).A +romsub $fe93 = FLOATS() clobbers(A,X,Y) ; FAC = (s16)facho+1:facho +romsub $fe9C = QINT() clobbers(A,X,Y) ; facho:facho+1:facho+2:facho+3 = u32(FAC) +romsub $fe9f = FINLOG(byte value @A) clobbers (A, X, Y) ; fac1 += signed byte in A +romsub $fea5 = FPWRT2() clobbers(A,X,Y) ; fac1 = fac2 ** fac1 +asmsub FREADSA (byte value @A) clobbers(A,X,Y) { + ; ---- 8 bit signed A -> float in fac1 + %asm {{ + tay + bpl + + lda #$ff + jmp GIVAYF ++ lda #0 + jmp GIVAYF + }} +} asmsub GIVUAYFAY (uword value @ AY) clobbers(A,X,Y) { ; ---- unsigned 16 bit word in A/Y (lo/hi) to fac1 %asm {{ - phx - sta _tmp - sty P8ZP_SCRATCH_B1 - tya - ldy _tmp - jsr GIVAYF ; load it as signed... correct afterwards - lda P8ZP_SCRATCH_B1 - bpl + - lda #<_flt65536 - ldy #>_flt65536 - jsr FADD -+ plx - rts -_tmp .byte 0 -_flt65536 .byte 145,0,0,0,0 ; 65536.0 + phx + sty $c4 ; facmo ($64 on c128) + sta $c5 ; facmo+1 ($65 on c128) + ldx #$90 + sec + jsr FLOATC + plx + rts }} } @@ -130,11 +149,23 @@ asmsub GETADRAY () clobbers(X) -> uword @ AY { asmsub FREADUY (ubyte value @Y) { ; -- 8 bit unsigned Y -> float in fac1 %asm {{ - lda #0 - jmp GIVAYF + tya + jmp FLOAT }} } + +asmsub RND() clobbers(A,X,Y) { + %asm {{ + lda #0 + php + jsr cx16.entropy_get + plp + jmp RND_0 + }} +} + + sub print_f (float value) { ; ---- prints the floating point value (without a newline). %asm {{ @@ -165,8 +196,7 @@ sub pow(float value, float power) -> float { jsr floats.CONUPK lda #power - jsr floats.MOVFM - jsr floats.FPWRT ; cx16 doesn't have FPWR + jsr floats.FPWR ply plx rts diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 92e8fc8ce..67f23043a 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -3,9 +3,6 @@ TODO For next release ^^^^^^^^^^^^^^^^ -- adapt to new(?) addresses in cx16 math library https://github.com/commanderx16/x16-docs/blob/master/Commander%20X16%20Programmer's%20Reference%20Guide.md#math-library - also fix calls to FPWRT etc as suggested there - ... diff --git a/examples/test.p8 b/examples/test.p8 index f4cdc92c8..d3669ae31 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -1,3 +1,4 @@ +%import floats %import textio ; NOTE: meant to test to virtual machine output target (use -target vitual) @@ -6,51 +7,68 @@ main { sub start() { txt.clear_screen() txt.print("Welcome to a prog8 pixel shader :-)\n") - ubyte bb = 4 - ubyte[] array = [1,2,3,4,5,6] - uword[] warray = [1111,2222,3333] - str tekst = "test" - uword ww = 19 - bb = bb in "teststring" - bb++ - bb = bb in [1,2,3,4,5,6] - bb++ - bb = bb in array - bb++ - bb = bb in tekst - bb++ - bb = ww in warray - bb++ - bb = 666 in warray - bb ++ - bb = '?' in tekst - bb++ - txt.print("bb=") - txt.print_ub(bb) + + float fl = 9.9 + fl = floats.pow(fl, 3.3) + floats.print_f(fl) txt.nl() - sys.exit(99) + ubyte ww = 65 + fl = ww + fl += 0.1 + floats.print_f(fl) + txt.nl() + uword ww2 = 65432 + fl = ww2 + fl += 0.1 + floats.print_f(fl) - syscall1(8, 0) ; enable lo res creen - ubyte shifter - shifter >>= 1 - - repeat { - uword xx - uword yy = 0 - repeat 240 { - xx = 0 - repeat 320 { - syscall3(10, xx, yy, xx*yy + shifter) ; plot pixel - xx++ - } - yy++ - } - shifter+=4 - - txt.print_ub(shifter) - txt.nl() - } +; ubyte bb = 4 +; ubyte[] array = [1,2,3,4,5,6] +; uword[] warray = [1111,2222,3333] +; str tekst = "test" +; uword ww = 19 +; bb = bb in "teststring" +; bb++ +; bb = bb in [1,2,3,4,5,6] +; bb++ +; bb = bb in array +; bb++ +; bb = bb in tekst +; bb++ +; bb = ww in warray +; bb++ +; bb = 666 in warray +; bb ++ +; bb = '?' in tekst +; bb++ +; txt.print("bb=") +; txt.print_ub(bb) +; txt.nl() +; sys.exit(99) +; +; +; syscall1(8, 0) ; enable lo res creen +; ubyte shifter +; +; shifter >>= 1 +; +; repeat { +; uword xx +; uword yy = 0 +; repeat 240 { +; xx = 0 +; repeat 320 { +; syscall3(10, xx, yy, xx*yy + shifter) ; plot pixel +; xx++ +; } +; yy++ +; } +; shifter+=4 +; +; txt.print_ub(shifter) +; txt.nl() +; } } }