From d90c51220fee01ba186258b6b7711a519fb4d315 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Thu, 31 Mar 2022 18:35:47 +0200 Subject: [PATCH] x16 r39: additional FP routine changes --- compiler/res/prog8lib/cx16/floats.p8 | 39 +++++++++++++--------------- compiler/res/prog8lib/cx16/syslib.p8 | 2 ++ docs/source/todo.rst | 3 --- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/compiler/res/prog8lib/cx16/floats.p8 b/compiler/res/prog8lib/cx16/floats.p8 index db565bb7b..6de86ea0e 100644 --- a/compiler/res/prog8lib/cx16/floats.p8 +++ b/compiler/res/prog8lib/cx16/floats.p8 @@ -38,19 +38,19 @@ romsub $fe0c = GETADR() clobbers(X) -> ubyte @ Y, ubyte @ A romsub $fe0f = FLOATC() clobbers(A,X,Y) ; convert address to floating point 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 $fe15 = FSUBT() clobbers(A,X,Y) ; fac1 = fac2-fac1 mind the order of the operands 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 $fe1b = FADDT() clobbers(A,X,Y) ; fac1 += fac2 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 $fe21 = FMULTT() clobbers(A,X,Y) ; fac1 *= fac2 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 $fe27 = FDIVT() clobbers(A,X,Y) ; fac1 = fac2/fac1 (remainder in fac2) mind the order of the operands 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 $fe39 = FPWRT() clobbers(A,X,Y) ; fac1 = fac2 ** fac1 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) @@ -70,22 +70,19 @@ romsub $fe69 = MOVFA() clobbers(A,X) ; copy fac2 to fac1 romsub $fe6c = MOVAF() clobbers(A,X) ; copy fac1 to fac2 (rounded) ; 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 +romsub $fe81 = FADDH() clobbers(A,X,Y) ; fac1 += 0.5, for rounding- call this before INT +romsub $fe84 = ZEROFC() clobbers(A,X,Y) ; fac1 = 0 +romsub $fe87 = NORMAL() clobbers(A,X,Y) ; normalize fac1 (?) +romsub $fe8a = NEGFAC() clobbers(A) ; switch the sign of fac1 (fac1 = -fac1) (juse use NEGOP() instead!) +romsub $fe8d = MUL10() clobbers(A,X,Y) ; fac1 *= 10 +romsub $fe90 = DIV10() clobbers(A,X,Y) ; fac1 /= 10 , CAUTION: result is always positive! +romsub $fe93 = MOVEF() clobbers(A,X) ; copy fac1 to fac2 +romsub $fe96 = SGN() clobbers(A,X,Y) ; fac1 = SGN(fac1), result of SIGN (-1, 0 or 1) +romsub $fe99 = FLOAT() clobbers(A,X,Y) ; FAC = (u8).A +romsub $fe9c = FLOATS() clobbers(A,X,Y) ; FAC = (s16)facho+1:facho +romsub $fe9f = QINT() clobbers(A,X,Y) ; facho:facho+1:facho+2:facho+3 = u32(FAC) +romsub $fea2 = FINLOG(byte value @A) clobbers (A, X, Y) ; fac1 += signed byte in A + asmsub FREADSA (byte value @A) clobbers(A,X,Y) { ; ---- 8 bit signed A -> float in fac1 diff --git a/compiler/res/prog8lib/cx16/syslib.p8 b/compiler/res/prog8lib/cx16/syslib.p8 index 39c69024d..093f1c7a8 100644 --- a/compiler/res/prog8lib/cx16/syslib.p8 +++ b/compiler/res/prog8lib/cx16/syslib.p8 @@ -373,6 +373,8 @@ romsub $ff1a = FB_filter_pixels(uword pointer @ R0, uword count @R1) clobbers(A romsub $ff1d = FB_move_pixels(uword sx @R0, uword sy @R1, uword tx @R2, uword ty @R3, uword count @R4) clobbers(A,X,Y) ; misc +romsub $fec6 = i2c_read_byte(ubyte device @X, ubyte offset @Y) clobbers (A,X,Y) -> ubyte @A, ubyte @Pc +romsub $fec9 = i2c_write_byte(ubyte device @X, ubyte offset @Y, ubyte data @A) clobbers (A,X,Y) -> ubyte @Pc romsub $fef0 = sprite_set_image(uword pixels @R0, uword mask @R1, ubyte bpp @R2, ubyte number @A, ubyte width @X, ubyte height @Y, ubyte apply_mask @Pc) clobbers(A,X,Y) -> ubyte @Pc romsub $fef3 = sprite_set_position(uword x @R0, uword y @R1, ubyte number @A) clobbers(A,X,Y) romsub $fee4 = memory_fill(uword address @R0, uword num_bytes @R1, ubyte value @A) clobbers(A,X,Y) diff --git a/docs/source/todo.rst b/docs/source/todo.rst index f1e6c7927..8287211c3 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -3,9 +3,6 @@ TODO For next release ^^^^^^^^^^^^^^^^ -- x16: check additional FP lib changes https://github.com/commanderx16/x16-rom/commit/ae608673f0210953172d6837acfbb231d62ddbd1 - and https://github.com/commanderx16/x16-docs/commit/21238aedc641da91df88e04c4ce9bf3324a3c12d -- x16: check joystick support (petaxian, own stuff) because of api change in r39 kernal https://github.com/commanderx16/x16-docs/blob/master/Commander%20X16%20Programmer's%20Reference%20Guide.md#function-name-joystick_get - x16: new vera memory layout https://github.com/commanderx16/x16-rom/issues/185 this may break certain things in gfx2 and elsewhere. Such as font rendering broken examples: amiga, colorbars, cube3d, highresbitmap, rasterbars, tehtriz, testgfx2, testvtui can we make the code read the new layout from vera registers instead of hardcoding it?