coś ciekawego knujesz?
Jak ma flachę, to aż zbrodnią byłoby nie poznać DSPka :)
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
Tydzień na oddanie głosu w FUJICUP! Głosowanie potrwa tylko do 22 lutego 2025...
TURGEN 9.3.1 Najnowsza wersja oprogramowania TURGEN wprowadza kilka istotnych ulepszeń.
FujiCup 2024 - głosowanie Wystartowało głosowanie w tegorocznej edycji konkursu FujiCup.
IX. Basque Tournament of Atari 2600 31 stycznia Euskal Retro Association zorganizowało IX. Baskijski Turniej Atari 2600.
Rogul 1.0f Poprawki i nowe funkcje
atari.area forum » Posty przez Tomasz Wachowiak
coś ciekawego knujesz?
Jak ma flachę, to aż zbrodnią byłoby nie poznać DSPka :)
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
Na pocieszenie (prawdopodobnie wątpliwe) Grey napiszę, że kilka lat temu buchnęli mi cały samochód...
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).
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.
Gratulacje. Bardzo ładnie całość wyszła.
Tak to mniej-więcej wygląda. Przykład, jak zrobię kostkę :D, chociaż wystarczą drobne zmiany, żeby u każdego zadziałało - trzeba w odpowiednie miejsce (mała zagadka, chociaż od razu widać gdzie :P) wstawić adres ekranu i powinno być ok. :)
lea blitter,a6
movem.l clearParams+endmsk1(pc),d0-d5
movem.l d0-d5,endmsk1(a6)
move.b #mLineBusyHog,lineNum(a6)
section data
clearParams
dcb.b endmsk1,0
dc.w $ffff,$ffff,$ffff,8,-6-((4000-2)*8),0,0,4000,planes,$0200
To mnie zaskoczyliście z tym Blade Packerem. :O Patrząc na kod potrzebny do odtworzenia muzy w Insomnii nie widzę nigdzie procedur depakujących, ale postaram się przeanalizować kod pod tym kątem. :) W sumie to mógłbym wyciąć kod potrzebny do odtworzenia muzy, ale na pewno nie jestem w stanie zrobić z powrotem moda. Na 90% procedura korzysta z bebechów octalyzera (zobaczcie na info, które dodałem do posta) - Insomnia korzysta z modroutine "Rachel".
OFTOP: :D Teraz to ładna pogoda jest i trzeba to wykorzystać... :P Ok. Coś tam zrobię... ;)
Wygląda na jakąś karnację Octalyzera (do jej odtwarzania wykorzystywany jest plugin "rachel" znany właśnie z Octalyzera) . Tyle, że Octalyzer nie chce jej odtworzyć... :P
Właśnie taką ewentualność chcę w domu sprawdzić. :D Ściągnę sobie odtwarzacz, który obsługuje dużo formatów i zobaczymy co się stanie.
W toolach nic nie widzę. Poszukam jeszcze u mnie w zachowanych źródłach.
Racja... Ale za cholerę nie wiem, jak ja to skonwertowałem. Nie widzę też, żeby się jakiś tool do konwersji u mnie uchował. :(
To była trackerowa muzyczka, tyle że w jakimś dziwnym formacie. Szczerze, to nie pamiętam czym była konwertowana lub na czym pisana, co nie przeszkadza mi, żeby ją wrzucić. :) Może ktoś będzie wiedział, jakim trackerem ją potraktować. :)
Bardzo mi się podoba.
:D
Planuję demko "Insomnia 2016" - nową wersję po 20 (!!!) latach od ukazania się oryginalnej "Insomnii". Oczywiście o ile starczy mi czasu i samozaparcia. No i oczywiście liczę na dużą pomoc grupowiczów :)
Trzeba poczekać kilka sekund na wygenerowanie obiektów - a później jest już bardzo ładnie. :D No i do tego ten obrazek umilający oczekiwanie... :P Oczywiście kod w asmie do wglądu, efekt jest stosunkowo prosty do zakodowania - najpierw przeliczamy, rysujemy i zapamiętujemy sobie obiekty 3d, a później rzucamy ja na ekran w formie spriteów.
No i w końcu jest... Wersja ekstremalna z rozwiniętą pętlą wypełniającą. :) I znowu 9 scanlinii mniej :D
Edit: Tylko źródła jeszcze dodam :P
W takim razie może uda się zejść poniżej 50% czasu ramki :D
Podsyłam obiecaną wersję. Doszło kilka flag, którymi można manipulować: clipOn - włącza/wyłącza clipping, debug - wersja pomocna w czasie debugowania kodu - teraz działanie programu można przejrzeć (oczywiście w debugerze) w sposób łatwy, prosty i przyjemny. Wersja jest już bardzo mocno zoptymalizowana i jedyne co można jeszcze zrobić, to rozwinąć pętlę rysującą linie poziome - uwalniamy wtedy jeden rejestr na wprowadzenie optymalizacji pod kątem adresowania blittera. Tak swoją drogą, to tylko dwóch optymalizacji adresowych zabrakło mi do pełnej optymalizacji pętli wypełniającej - jeszcze dwa rejestry i byłoby genialnie, a tak jest tylko super :P )
Edit: Kurde! Dla linii dłuższych od 16 pix. (dla krótszych musi być bra, więc będzie podobnie jak w pętli) do wyciągnięcia jest od 12 do 16 cykli zegara plus 4 na optymalizację adresową. Hmmmm... :D
Dzisiaj po południu powinienem wrzucić gotową wersję i powiem tylko tyle: drukuje kod, tapetuję ścianę i codziennie się do niego modlę :P Niestety nie mam chyba możliwości (halo panie adminie :)) wrzucenia obrazka z wersji przed i po, ale trójkąt w 4 planach, oczywiście na cały ekran zabiera tylko około 52% czasu ramki!!!
Yeah! Zbliżamy się do końca optymalizacji. Mam już 3-przebiegową wersję generowania masek na blitterze, a dodatkowo po mojej ostatniej optymalizacji kod wypełniania wygląda tak: :D
movem.w (a2)+,d0-d3 ;left x offset, right x offset, left mask, right mask
sub.w d0,d1 ;line width
ext.l d0
add.l (a5)+,d0
asr.w #3,d1
bgt.s .multi_words
Jak dodam pomniejsze optymalizację na tryby adresowania oczywiście wrzucę wersję ostateczną
Więc miałeś na myśli leftEdge i rightEdge w jedym przebiegu.
Dokładnie tak. :D Po tym, jak otworzyłeś mi oczy na odpowiednie wykorzystanie xCountów i yCountów pierwsze co robię, to zastanawiam się, czy nie da się tego odpowiednio wykorzystać :) W wolnej chwili połączę optymalizację i będziemy mieć BOSKIE wypełnianie. :D
Kur...ka. ;) Wiem, gdzie popełniłem błąd w swoim kodzie. Założyłem, że smudge przyjmie wartości tylko z przedziału 0-15, a przecież większe zostaną po prostu obcięte (!!!) - jedno przejście mam nadmiarowe. Ale z tego co widzę, trochę inaczej podszedłem do tematu i (po połączeniu naszych optymalizacji) wydaje mi się, że całość uda się zamknąć w 3 przejściach! Jak znajdę siły, postaram się napisać odpowiednią poprawkę...
Jakie kroki wykonujesz? Przed implementacją byłem przekonany, że uda mi się właśnie w 4 krokach wszystko załatwić, ale skew dla offsetów wykonuje się przed maskami i jest dupa - musiałem rozdzielić offsety na 2 przejścia. A może udało ci się maski w jednym przejściu wygenerować?
atari.area forum » Posty przez Tomasz Wachowiak
Wygenerowano w 0.018 sekund, wykonano 73 zapytań