1 Ostatnio edytowany przez piotrv (2006-01-11 10:33:13)

Czy ktoś widział / pisał coś do obsługi typu zmiennoprzecinkowego w CC65? Bo zacząłem już coś pisać, ale nie chce wyważać otwartych drzwi, więc na wszelki wypadek pytam.

Potrzebna minimalna funkcjonalność to mnożenie, dzielenie, wyświetlanie, konwersje, COS. Typ float z BASIC-a odpada (dla kilku procedur nie warto blokowac sobie 8kB, wyciągnięcie z ROMu nie jest chyba możliwe ze względów prawnych).

Znalazłem jakieś biblioteki na 6502.org, ale są w ASM, z kodami end-of-line typu Atari więc trochę ciężko mi tak z marszu tego użyć.
Poza tym fajnie by to było jednak zrobić w czystym C (nie zależy mi - przynajmniej na początku - na wydajności).

I'm not so bad, once you get to know me.

2

Floaty to tylko 2 Kb, może warto je podpiąć do CC65, szczególnie te szybkie, o których Drac030 pisał tutaj:
http://atariarea.krap.pl/forum/viewtopic.php?id=3772

Co prawda na dzis floatów nie potrzebuje, ale jakby w CC65 była ładna i szybka biblioteka to parę ciekawych pomysłów z przeszłości możnaby wskrzesić...

http://www.5oft.pl/

3

Co do wydajności, to myślę bardziej o zastosowaniach matematycznych niż do dem. Oczywiście w końcowym efekcie powinno się to też jakoś tam w skończonym czasie liczyć. W demach jak by nie robił zawsze szybciej będzie fixed-pointem liczyć.

I'm not so bad, once you get to know me.

4

tak wiec wspomniane wyzej wyciagniete z "ulepszanego" romu procedury matematyczne beda jak najbardziej na miejscu...

przydalo by sie by ktos je wyripowal, tak by oddzielic poszczegolne czesci: fixed, float, arithmetic funcs...
po czym do poszczegolnych funkcji mozna by maciupkie wrappery dopisac...

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

5

jellonek napisał/a:

po czym do poszczegolnych funkcji mozna by maciupkie wrappery dopisac...

O o o! O to dokładnie mi chodziło. Gdybym potrafił już bym to robił :]

http://www.5oft.pl/

6 Ostatnio edytowany przez piotrv (2006-01-12 01:23:21)

jellonek napisał/a:

tak wiec wspomniane wyzej wyciagniete z "ulepszanego" romu procedury matematyczne beda jak najbardziej na miejscu...

tak, ale chce to zrobic tak nowocześnie, tzn. bez piractwa :) jeśli się da...
z tego co widze, to sieć jest raczej jałowa w tym temacie, więc jest to jakieś pole do zagospodarowania. jak coś będę miał to udostępnie, pewnie nie tylko atarowcom by się przydało (bo to przecie cc65).

W cc65 to funkcje w ROM można z marszu wywołać (_sys).

http://www.cc65.org/doc/funcref-54.html

Nawet wrappera nie trza (jak się uprzesz).

I'm not so bad, once you get to know me.

7

Po co "ripować"? Przecież pisałem, że procki pana Marsletta są dostępne w _postaci_źrodłowej_.

KMK
? HEX$(6670358)

8 Ostatnio edytowany przez piotrv (2006-01-12 01:21:27)

Ale masz jego pozwolenie / licencję? No i miałeś je gdzieś udostępnić, a na razie tylko się chwalisz...

I'm not so bad, once you get to know me.

9 Ostatnio edytowany przez drac030 (2006-01-12 01:12:39)

Licencja jest zawarta w pliku źrodłowym. A co do udostępniania, to napisałem, że przy okazji.

PS. Przeczytaj punkt ósmy regulaminu, bo się któregoś dnia zdziwisz.

KMK
? HEX$(6670358)

10

Regulamin przeczytany, wnioski wyciągnięte, odpowiednie posty zmodyfikowane...

I'm not so bad, once you get to know me.

11

piotrv: 4 lata temu floaty w cc65 były "TODO" i pewnie nic się nie zmieniło. W planach było użycie standardowych 32-bitowych IEEE big endian (czyli wykładnik trzymany w akumulatorze, mantysa w rejestrze X i sreg). Ulrich stwierdził, że podstawowym problemem nie są procedury dla 6502, lecz przeróbki kompilatora (w którego wnętrznościach orientuje się tylko on sam).

Emulację floatów przy pomocy funkcji stałoprzecinkowych w C zdecydowanie odradzam - szybciej będzie chodzić BASIC, szczególnie Turbo BASIC.

https://www.youtube.com/watch?v=jofNR_WkoCE

12

Proponuje przejrzec zrodla w .asm spod rąk S. Wozniaka (ten od Apple) - pewnie z okolo 1979 roku.
Gosciu wtedy calkiem niezle wymiatal w .asm i jak ostatnio przegladalem jego zrodla to zdaje sie byly tam szybkie procedury matematyczne (ale to moze juz z pozniejszych lat)...

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

13

Tak, te źródła właśnie są na stronce którą wymieniłem. Ponoć dyktowane przez telefon :D Z roku 1979 bodajże. Jak mi już zbrzydnie C to je pewnie wykorzystam.

I'm not so bad, once you get to know me.

14

Nie szybkie tylko krótkie. Cztery podstawowe operacje arytmetyczne oraz konwersje z/na int w niecałych 256 bajtach kodu, logarytmy i exp w 512 bajtach - całkiem nieźle. Na 6502.org nie znalazłem najtrudniejszych operacji dla takiej reprezentacji floatów: konwersji z/na string.

https://www.youtube.com/watch?v=jofNR_WkoCE

15

Szkoda, że liczby FP nie są little endian - można byłoby lepiej wykorzystać 816, a dla 6502 to chyba wszystko jedno.

KMK
? HEX$(6670358)

16

Fox napisał/a:

Na 6502.org nie znalazłem najtrudniejszych operacji dla takiej reprezentacji floatów: konwersji z/na string.

Właśnie się z tym męcze. Algorytm już mam, muszę go tylko uprościć. (na razie zweryfikowany na Excelu).

I'm not so bad, once you get to know me.

17

share it ;)

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

18

Nie, będę to sprzedawał :D

Tak poważnie, to jak już będzie przynajmniej +-*/ i wyświetlanie to wystawie na swoim www. Aktualnie mam tylko konwersję z/do int-a.

I'm not so bad, once you get to know me.

19

drac030 napisał/a:

Szkoda, że liczby FP nie są little endian - można byłoby lepiej wykorzystać 816,

Jeśli sam implementujesz FP, to możesz jak najbardziej wybrać reprezentację little-endian.

drac030 napisał/a:

a dla 6502 to chyba wszystko jedno.

W przypadku CC65 korzystniejsze wydaje się big endian - tj. wykładnik w akumulatorze (dla intów i longów jest tam LSB).

https://www.youtube.com/watch?v=jofNR_WkoCE

20

Miałem na myśli float Atari BASIC-a.

KMK
? HEX$(6670358)

21

Wybrałem taką notację:
 
EEEEEEEE SSSSSSSS M.MMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM 

E - exponent (cecha?)
S - znak (jeden bajt na jeden bit - powinno być szybciej)
M - 32-bitowa mantysa, pierwsze 16 bitów starsze, następne - młodsze (każde unsigned int w CC65)

Zakres liczb: +/-1.0E+/-38 z ok. dziesięcioma cyframi znaczącymi

Skończyłem algorytm na FP -> ASCII. Jest tak pokręcony, że wykorzystuje prawie całą bibliotekę (!) - tzn logarytmy, +-*/, POW. Więc muszę na razie zaimplementować te elementarne funkcje, żeby zobaczyć co mi się liczy :)

I'm not so bad, once you get to know me.

22

Nie szkoda ci marnowac całego bajtu na znak? Nie lepiej wsadzić go do najstarszego bitu wykładnika? Pewnie i tak jest nieużywany - a miałbyś jeden bajt więcej na mantysę.

Zresztą, co ja się czepiam, czy ja będę używał CC65? Nie przecież :)

KMK
? HEX$(6670358)

23

Czepiaj się - po to napisałem.

Ale gdyby wsadzić znak do wykładnika to już by był za mały zakres - aktualnie już jest mały: E+/38
Zwykle znak wsadzają do mantysy - ale to jest dobre dla kompów, które mają za dużo wolnego czasu. Więc ułatwiam sobie trochę sprawę.

Zrobiłem już +-, wydajność nie jest rewelacyjna, ale za to czyste C. Być może da się to jeszcze zoptymalizować w C, a może trzeba będzie na końcu to przerobić na ASM.

Aktualnie wydajność dodawania i odejmowania to ok. 185 operacji / s (FASTCHIP: 4880/s) - test na emulatorze z aktywnym ANTIC-iem.

Jeśli starczy mi siły i będzie zainteresowanie, to dorobienie wersji double w C będzie już o wiele prostsze.

Niestety testowy EXEC rośnie w tempie zastraszającym... Na razie 9.7kB (!)

I'm not so bad, once you get to know me.

24

kmk ma racje - tez uwazam ze poswiecanie calego bajtu na sign jest do dupy...
piotrv - nie przesadzaj z implementowniem tego w czystym C - w wypadku 8 bitow (mimo ze jestem orendownikiem C) NIE MA CO PRZESADZAC z C - lepiej assemblerzyc...

The UNIX Guru`s view of Sex:
unzip; strip; touch; finger; mount; fsck; more; yes; umount; sleep

25

piotrv zrob to w asemblerze, wiecej osob bedzie moglo skorzystac

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C