Na fali uniesienia bardzo dobrą pozycją dema Back To Old Scholl na SV podsyłam kod liczący pierwiastki kwadratowe. Funkcja jest w formie makra, dzięki czemu można ją dopasować do swojego kodu i zaoszczędzić na BSR/JSR :P  Parametry makra wyglądają następująco: rejestr z liczbą do spierwiastkowania, rejestr z wynikiem, rejestr pomocniczy1, rejestr pomocniczy2, rejestr adresowy z tablicą pomocniczą. Wygląda skomplikowanie, ale tak nie jest. Przykład wywołania:

sqrt_on_tabs d0,d1,d2,d3,a6, gdzie w d0 liczba do spierwiastkowania, a w d1 wynik. Zresztą zamieszczony przykład jest wart więcej, niż 1000 słów.

Wadą (niewielką) przygotowanego rozwiązania jest brak zaokrągleń do najbliższej liczby całkowitej (zaoszczędziłem jedno dzielenie), czyli pierwiastek z 25 będzie równy 5, ale pierwiastek z 35 wyniesie również 5 i dopiero pierwiastek z 36 da w wyniku 6 :) Z praktycznego punktu widzenia nie ma to absolutnie żadnego znaczenia - wszystkie lightsource w BTOSie są liczone tą metodą.

Zaletą jest oczywiście szybkość - do 65535 funkcja obywa się zupełnie bez dzielenia.

Post's attachments

fastsqrt.s 5.65 kb, liczba pobrań: 22 (od 2016-11-14) 

Tylko zalogowani mogą pobierać załączniki.

2

Przeanalizuję jak przejdzie mi alergia na assembler po ostatnim maratonie przed party;)

Wracając do meritum... na SV wspomniałeś, że potrzebujesz tego do oświetlenia. Może coś przeoczyłem w Waszym demie (kudos za kod! super szybkie 3D) chyba był tylko flat shade z przodu, nie? Nie wystarczyło Ci zrobić wartości oświetlenia ze wspołczynnika który liczysz przy backface-cullingu? (ja tak zawsze robię i masz to wtedy za free)

Maciek
--------
Atari 65XE + Ultimate 1MB + Stereo + SIO2SD | Atari 520STE + 4MB + UltraSatan | Atari Falcon 030 + CT60e + 14MB ST + 256MB TT + 68882  + CF + Netusbee | Amiga 500 + 1MB + Gotek | Amiga 600 + 2MB Chip + 8MB Fast + CF

Oświetlenie pada z góry. :) Chciałem zrobić poprawne oświetlenie, nawet przy ścianach, które mają w danej chwili stałą jasność (właśnie flat shading), a do tego należy obliczyć znormalizowany wektor normalny (masło maślane :P ) do płaszczyzny i na tej podstawie obliczyć jasność ściany. Oczywiście sposób podany przez Ciebie również zadziała, ale docelowo chciałbym dojść do ruchomego źródła światła (na razie mam procedurę, która liczy oświetlenie dla promieni padających prostopadle do obiektu (góra, dół, lewo, prawo).

Co do szybkich operacji matematycznych w asmie m68k, to ray/tscc udostepnil kiedys niezla libke: http://s390174849.online.de/ray.tscc.de/code.htm

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

Mmmm... Macra... Co ja bym bez nich począł? :D Fajna biblioteka, chociaż na małej dokładności robiona (8 bitów). Ze względów wydajnościowych (jeśli chodzi o M68k) działam na 15 bitowej. A moje sqrt i tak szybsze... :P