From 78df8e8c3fb4c099d5be3149a5d7b29cd6051128 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Mon, 14 Nov 2022 01:22:03 +0100 Subject: [PATCH] make cbm float library available --- libsrc/Makefile | 3 +- libsrc/c64/extra/fp488kernal.s | 42 +++++++++++++++ libsrc/float/cbmkernal/cc65wrapper.s | 80 ++++++++++++++-------------- libsrc/float/cbmkernal/ffloor.c | 4 +- libsrc/float/cbmkernal/ftoa.c | 2 +- libsrc/vic20/extra/fp488kernal.s | 42 +++++++++++++++ 6 files changed, 130 insertions(+), 43 deletions(-) create mode 100644 libsrc/c64/extra/fp488kernal.s create mode 100644 libsrc/vic20/extra/fp488kernal.s diff --git a/libsrc/Makefile b/libsrc/Makefile index 8de4d9dd0..f5bc1f335 100644 --- a/libsrc/Makefile +++ b/libsrc/Makefile @@ -167,7 +167,8 @@ endif SRCDIRS = $(SRCDIR) ifeq ($(TARGET),$(filter $(TARGET),$(CBMS))) - SRCDIRS += cbm + SRCDIRS += cbm \ + float/cbmkernal endif ifeq ($(TARGET),$(filter $(TARGET),$(GEOS))) diff --git a/libsrc/c64/extra/fp488kernal.s b/libsrc/c64/extra/fp488kernal.s new file mode 100644 index 000000000..553e106c1 --- /dev/null +++ b/libsrc/c64/extra/fp488kernal.s @@ -0,0 +1,42 @@ + +; import/overload stubs for the C64 kernal floating point implementation + + .import ___cbmkernal_afloat + .import ___cbmkernal_aufloat + .import ___cbmkernal_axfloat + .import ___cbmkernal_axufloat + .import ___cbmkernal_eaxfloat + .import ___cbmkernal_eaxufloat + .import ___cbmkernal_feaxint + .import ___cbmkernal_feaxlong + .import ___cbmkernal_fbnegeax + .import ___cbmkernal_ftosaddeax + .import ___cbmkernal_ftossubeax + .import ___cbmkernal_ftosdiveax + .import ___cbmkernal_ftosmuleax + .import ___cbmkernal_ftoseqeax + .import ___cbmkernal_ftosneeax + .import ___cbmkernal_ftosgteax + .import ___cbmkernal_ftoslteax + .import ___cbmkernal_ftosgeeax + .import ___cbmkernal_ftosleeax + + .export afloat := ___cbmkernal_afloat + .export aufloat := ___cbmkernal_aufloat + .export axfloat := ___cbmkernal_axfloat + .export axufloat := ___cbmkernal_axufloat + .export eaxfloat := ___cbmkernal_eaxfloat + .export eaxufloat := ___cbmkernal_eaxufloat + .export feaxint := ___cbmkernal_feaxint + .export feaxlong := ___cbmkernal_feaxlong + .export fbnegeax := ___cbmkernal_fbnegeax + .export ftosaddeax := ___cbmkernal_ftosaddeax + .export ftossubeax := ___cbmkernal_ftossubeax + .export ftosdiveax := ___cbmkernal_ftosdiveax + .export ftosmuleax := ___cbmkernal_ftosmuleax + .export ftoseqeax := ___cbmkernal_ftoseqeax + .export ftosneeax := ___cbmkernal_ftosneeax + .export ftosgteax := ___cbmkernal_ftosgteax + .export ftoslteax := ___cbmkernal_ftoslteax + .export ftosgeeax := ___cbmkernal_ftosgeeax + .export ftosleeax := ___cbmkernal_ftosleeax diff --git a/libsrc/float/cbmkernal/cc65wrapper.s b/libsrc/float/cbmkernal/cc65wrapper.s index 4f3c2ed8b..58f7806a9 100644 --- a/libsrc/float/cbmkernal/cc65wrapper.s +++ b/libsrc/float/cbmkernal/cc65wrapper.s @@ -5,23 +5,23 @@ .import __stof ; 8bit signed -> float - .export afloat -afloat: + .export ___cbmkernal_afloat +___cbmkernal_afloat: jmp __ctof ; 8bit unsigned -> float - .export aufloat -aufloat: + .export ___cbmkernal_aufloat +___cbmkernal_aufloat: jmp __utof ; 16bit signed -> float - .export axfloat -axfloat: + .export ___cbmkernal_axfloat +___cbmkernal_axfloat: jmp __itof ; 16bit unsigned -> float - .export axufloat -axufloat: + .export ___cbmkernal_axufloat +___cbmkernal_axufloat: jmp __stof ; FIXME: this might be more accurate when done directly in one step (but the @@ -30,8 +30,8 @@ axufloat: .importzp sreg, tmp1 .import pusheax - .export eaxfloat -eaxfloat: + .export ___cbmkernal_eaxfloat +___cbmkernal_eaxfloat: sta tmp1 @@ -83,8 +83,8 @@ eaxfloat: .importzp sreg, tmp1 .import pusheax - .export eaxufloat -eaxufloat: + .export ___cbmkernal_eaxufloat +___cbmkernal_eaxufloat: sta tmp1 @@ -135,16 +135,16 @@ eaxufloat: .import __ftoi ; float -> 16bit int - .export feaxint -feaxint: + .export ___cbmkernal_feaxint +___cbmkernal_feaxint: jmp __ftoi ; FIXME: this might be more accurate when done directly in one step (but the ; kernal can not do this for 32bit) ; float -> 32bit int .importzp tmp1, tmp2 - .export feaxlong -feaxlong: + .export ___cbmkernal_feaxlong +___cbmkernal_feaxlong: jsr pusheax @@ -186,16 +186,16 @@ feaxlong: .import __fneg ; binary negate (not) for the ! operator. returns a bool! - .export fbnegeax + .export ___cbmkernal_fbnegeax .import bnegax -fbnegeax: +___cbmkernal_fbnegeax: ; FIXME: why does this not work with __fnot? jsr __ftoi jmp bnegax .if 0 = 1 - .export fnegeax - fnegeax: + .export ___cbmkernal_fnegeax + ___cbmkernal_fnegeax: jmp __fneg .endif @@ -208,22 +208,22 @@ fbnegeax: .import __fmul ; Primary = TOS + Primary (like tosaddeax) - .export ftosaddeax -ftosaddeax: + .export ___cbmkernal_ftosaddeax +___cbmkernal_ftosaddeax: ; arg0: a/x/sreg/sreg+1 ; arg1: (sp),y (y=0..3) ; FAC: ieee float is in A/X/sreg/sreg+1 jmp __fadd - .export ftossubeax -ftossubeax: + .export ___cbmkernal_ftossubeax +___cbmkernal_ftossubeax: jmp __fsub - .export ftosdiveax -ftosdiveax: + .export ___cbmkernal_ftosdiveax +___cbmkernal_ftosdiveax: jmp __fdiv - .export ftosmuleax -ftosmuleax: + .export ___cbmkernal_ftosmuleax +___cbmkernal_ftosmuleax: jmp __fmul ;-------------------------------------------------------------- @@ -231,8 +231,8 @@ ftosmuleax: .import __fcmp ; test for equal - .export ftoseqeax -ftoseqeax: + .export ___cbmkernal_ftoseqeax +___cbmkernal_ftoseqeax: ; arg0: a/x/sreg/sreg+1 ; arg1: (sp),y (y=0..3) jsr __fcmp @@ -248,8 +248,8 @@ ftoseqeax: rts ; test for not equal - .export ftosneeax -ftosneeax: + .export ___cbmkernal_ftosneeax +___cbmkernal_ftosneeax: ; arg0: a/x/sreg/sreg+1 ; arg1: (sp),y (y=0..3) jsr __fcmp @@ -265,8 +265,8 @@ ftosneeax: rts ; Test for greater than - .export ftosgteax -ftosgteax: + .export ___cbmkernal_ftosgteax +___cbmkernal_ftosgteax: ; arg0: a/x/sreg/sreg+1 ; arg1: (sp),y (y=0..3) jsr __fcmp @@ -283,8 +283,8 @@ ftosgteax: rts ; Test for less than - .export ftoslteax -ftoslteax: + .export ___cbmkernal_ftoslteax +___cbmkernal_ftoslteax: ; arg0: a/x/sreg/sreg+1 ; arg1: (sp),y (y=0..3) jsr __fcmp @@ -300,8 +300,8 @@ ftoslteax: rts ; Test for greater than or equal to - .export ftosgeeax -ftosgeeax: + .export ___cbmkernal_ftosgeeax +___cbmkernal_ftosgeeax: ; arg0: a/x/sreg/sreg+1 ; arg1: (sp),y (y=0..3) jsr __fcmp @@ -318,8 +318,8 @@ ftosgeeax: rts ; Test for less than or equal to - .export ftosleeax -ftosleeax: + .export ___cbmkernal_ftosleeax +___cbmkernal_ftosleeax: ; arg0: a/x/sreg/sreg+1 ; arg1: (sp),y (y=0..3) jsr __fcmp diff --git a/libsrc/float/cbmkernal/ffloor.c b/libsrc/float/cbmkernal/ffloor.c index f0b7cbd88..492fd07f8 100644 --- a/libsrc/float/cbmkernal/ffloor.c +++ b/libsrc/float/cbmkernal/ffloor.c @@ -2,8 +2,9 @@ #include <_float.h> #include -#include +#include "cbmfp.h" +#if 0 #define _fcmplt(_d, _s) (_fcmp((_d), (_s)) == 1) #define _fcmpgt(_d, _s) (_fcmp((_d), (_s)) == 255) #define _fcmpeq(_d, _s) (_fcmp((_d), (_s)) == 0) @@ -22,3 +23,4 @@ float ffloor(float x) } return _fsub(d, 1); } +#endif diff --git a/libsrc/float/cbmkernal/ftoa.c b/libsrc/float/cbmkernal/ftoa.c index c80cdf52b..e77f7b0bb 100644 --- a/libsrc/float/cbmkernal/ftoa.c +++ b/libsrc/float/cbmkernal/ftoa.c @@ -2,7 +2,7 @@ #include <_float.h> #include -#include +#include "cbmfp.h" // convert float into a string. this is surprisingly complex, so we just use // the kernal function, and then fix up the result diff --git a/libsrc/vic20/extra/fp488kernal.s b/libsrc/vic20/extra/fp488kernal.s new file mode 100644 index 000000000..35c34f0ce --- /dev/null +++ b/libsrc/vic20/extra/fp488kernal.s @@ -0,0 +1,42 @@ + +; import/overload stubs for the VIC20 kernal floating point implementation + + .import ___cbmkernal_afloat + .import ___cbmkernal_aufloat + .import ___cbmkernal_axfloat + .import ___cbmkernal_axufloat + .import ___cbmkernal_eaxfloat + .import ___cbmkernal_eaxufloat + .import ___cbmkernal_feaxint + .import ___cbmkernal_feaxlong + .import ___cbmkernal_fbnegeax + .import ___cbmkernal_ftosaddeax + .import ___cbmkernal_ftossubeax + .import ___cbmkernal_ftosdiveax + .import ___cbmkernal_ftosmuleax + .import ___cbmkernal_ftoseqeax + .import ___cbmkernal_ftosneeax + .import ___cbmkernal_ftosgteax + .import ___cbmkernal_ftoslteax + .import ___cbmkernal_ftosgeeax + .import ___cbmkernal_ftosleeax + + .export afloat := ___cbmkernal_afloat + .export aufloat := ___cbmkernal_aufloat + .export axfloat := ___cbmkernal_axfloat + .export axufloat := ___cbmkernal_axufloat + .export eaxfloat := ___cbmkernal_eaxfloat + .export eaxufloat := ___cbmkernal_eaxufloat + .export feaxint := ___cbmkernal_feaxint + .export feaxlong := ___cbmkernal_feaxlong + .export fbnegeax := ___cbmkernal_fbnegeax + .export ftosaddeax := ___cbmkernal_ftosaddeax + .export ftossubeax := ___cbmkernal_ftossubeax + .export ftosdiveax := ___cbmkernal_ftosdiveax + .export ftosmuleax := ___cbmkernal_ftosmuleax + .export ftoseqeax := ___cbmkernal_ftoseqeax + .export ftosneeax := ___cbmkernal_ftosneeax + .export ftosgteax := ___cbmkernal_ftosgteax + .export ftoslteax := ___cbmkernal_ftoslteax + .export ftosgeeax := ___cbmkernal_ftosgeeax + .export ftosleeax := ___cbmkernal_ftosleeax