1

Na wstępnie powiem że to co tutaj opisuję "odkryłem"(przez przypadek) sam, co nie oznacza że już ta technika nie jest wykorzystywana od lat przez wtajemniczonych, ale ja na ten temat nigdzie informacji nie mogłem znaleźć. Ale technika jest naprawdę prosta więc się zdziwię bardzo że nikt do tego wcześniej nie "odkrył", więc prawdopodobnie i tak wyjdę na "wiejskiego głupka" ale co tam. Przynajmniej (mam nadzieję) że będzie łatwiej informację o "krótkich" sinach znaleźć.

To był wstęp to teraz drugi wstęp:)  Jak do tego doszło …. nie wiem…
A więc tak: próbują jakiegoś fajnego sposobu na ruch sprajta w jak najmniejszej ilości bajtów (celowałem w 32b aby wystawić cokolwiek na lovebyte) po paru próbach wyszło mi coś dość ciekawego… no i się udało, intro 32b zrobione, nawet fajnie wyglądało (i chyba innym też się spodobało bo zajęło 3 miejsce: sea_calm). No i zacząłem drążyć co tam się w ogóle zadziałało. No i chyba coś tam się tak fajnego zadziało że wyszedł mi (-)cosinus w amplitudzie 0-$20 i trochę dłuższy w amplitudzie 0-$40, sinusy w pełnym zakresie 0-$ff w 2 wersjach (troszkę różniące się w wartościach, ale nieznacznie, ale kto co lubi) oraz ćwiartki sinusa w okresie 0-$7f. To w sumie tyle.

Technika polega na dodawaniu coraz to większej liczby i badania rejestru procesora (C w przypadku sina i V w przypadku -cosinusa). Proste prawda? no nawet bardzo...

Dodam jeszcze że to oczywiście nie jest sinus, ale coś bardziej opartego na dwóch parabolach połączonych ze sobą. Coś podobnego jak w sinusie którego do tej pory używałem z codebase:
https://codebase64.org/doku.php?id=base … n_assembly

Ten z codebase ma fajnie regulowany okres którego u mnie nie ma ale jest o 3 bajty na ZP lub 5bajtów poza ZP dłuższy. Niby niewiele – ale to czasami robi różnice przy intrach mniejszych 256b. Kto robił wie o czym mówię ;)

W produkcjach na Lovebyte (które później mi się posypały jedno za drugim z tym sinusem) użyłem  tego agenda_cos_small_v1, gdyż ma on może małą amplitudę (od 0 do $20) co mi akurat tutaj odpowiadało, a zajmuje relatywnie mniej bo 27b na ZP (albo 31 poza ZP).

Więcej info co gdzie jak działa i ile zajmujesz znajdziesz w plikach ASM (ASX) dołączonych do tego postu lub do ściągnięcia tutaj:
http://www.atari.org.pl/files/parties/l … /sines.zip

Kończąc: więc jakby się okazało jakimś cudem że to co mi do głowy strzeliło i co tutaj piszę jest czymś do tej pory nieodkrytym (w co mi się nie chce wierzyć…) to oczywiście jeżeli tylko chcecie możecie wykorzystywać/modyfikować/kasować dowolnie jak chcecie :)
A jeżeli okazało się że próbuje odkryć koło na nowo to bardzo Was od razu przepraszam, a na swoje usprawiedliwienie mogę jedynie powiedzieć że nie byłem tego świadomy!

I kończąc po raz drugi chciałem podziękować za wsparcie merytoryczne jak i mentalne reszcie Agendziaków!

Ps: do plików asm(a właściwie asx bo tak mi się w edytorze koloruje) dołączyłem malutką wizualizację danej tablicy – ale chyba tego nie muszę tłumaczyć bo każdy koder zobaczy se :)

ps2: Atari Rulez!

Post's attachments

agenda_cos_small_v1.asx 787 b, liczba pobrań: 12 (od 2022-02-14) 

agenda_cos_small_v2.asx 854 b, liczba pobrań: 1 (od 2022-02-14) 

agenda_sin_quater_v1.asx 698 b, liczba pobrań: 2 (od 2022-02-14) 

agenda_sin_quater_v2.asx 829 b, nikt jeszcze nie pobierał tego pliku. 

agenda_sin_v1.asx 910 b, liczba pobrań: 4 (od 2022-02-14) 

agenda_sin_v2.asx 910 b, liczba pobrań: 2 (od 2022-02-14) 

Tylko zalogowani mogą pobierać załączniki.

2

coś takiego ?

https://github.com/tebe6502/Mad-Assembl … sintro.asm

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

3

Fajna sztuczka.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

4 Ostatnio edytowany przez koala (2022-02-14 16:42:18)

No chyba nie do końca to - u Ciebie jest dodawanie słów - to inna chyba metoda.
Po drugie: z tego co widzę to generujesz ćwiartkę i to zajmuje 51b (albo coś źle patrzę)
Tą metodą co podałem ćwiartkę sinusa mam w  21b na ZP albo 23b poza ZP
Chyba że mnie przekonasz że to jednak to samo:)

5

Nie zerkałem do kodu (i tak się nie znam), ale czy to nie jest jakaś pochodna algorytmy Bresenhama rysującego kółka?

What can be asserted without proof can be dismissed without proof.

6 Ostatnio edytowany przez koala (2022-02-14 22:40:13)

sqward napisał/a:

Nie zerkałem do kodu (i tak się nie znam), ale czy to nie jest jakaś pochodna algorytmy Bresenhama rysującego kółka?

hmm nie brałem tego algorytmu pod uwagę, bo wyglądowo to bardziej przypomina parabolę niż ćwiarkę koła, ale może coś w tym jest, jakaś mądrzejsza ode mnie głowa by musiała się wypowiedzieć. Jak pisałem - to mi wyszło przez przypadek, a nie wyprowadzałem to z jakiegoś wzoru:) Ale jakbyś miał racę (a może tak jak najbardziej być) to wtedy to co napisałem o odkrywaniu na nowo koła nabiera drugiego, bardziej dosadnego znaczenia...

edit: jednak na moje (krzywe) oko to nie jest to, chyba że jakieś uproszczenie uproszczenia tego algorytmu w specyficznych warunkach

7 Ostatnio edytowany przez qbahusak (2022-02-15 01:05:24)

Hejka.

Kiedyś (niedawno) niejaki Jakub Kruszona Zawadzki robił jakiś efekt na sinusach i mi się tym chwalił, ale żalił się, że tablica sinusów ma 1 kB; a że rozmiar miał znaczenie, to mu ten pomysł sprzedałem ( a wziąłem go chyba z doświadczenia). Parabola jest najprostszym rozwinięciem w szereg taylora funkcji trygonometrycznych typu cosinus, przynajmniej w okolicach 0 aż do Pi/2 daje niezłe (do demek) przybliżenie (1 - x^2).

Skojarzenie z algorytmem Bresenhama może być takie, że dodajemy do wyniku 0, potem 1, potem 2, 3 itd, i siłą rzeczy wychodzi parabola.

Także ten. Genialne w swej prostocie, ale nie załapało się na opis w guglu :)

8

Hej Kuba! Dzięki za odpowiedź. Właśnie nie mogę znaleźć sposobu dodawania tego ciągu w algorytmie Brasenhama - ale pewnie źle szukam, może ktoś mi pokazać w którym to się odbywa miejscu?
Chodzi o dodawanie właśnie 0 potem 1, 2, 3 ... itd. (to mogę nazwać pseudo parabolą bo ona się jednak różni od wyników funkcji kwadratowej)

Cały ten "mój" trik polega na tym żeby otrzymywany wynik podzielić przez 256 (wziąć tylko starszy bajt wyniku 2 bajtowej liczby) - i to jest jakby cały pomysł tego sinusowego algorytmu(ćwiartki sinusa) i nigdzie wcześniej takiego wykorzystywania nie zauważyłem ;) i to że dodając właśnie tak liczby od 0 do 255 starszy bajt wyniku jest z przedziału 0-127, co łatwo się później przekłada na samego (pseudo) sinusa. To jasne i proste – ale nie znalazłem nigdy wcześniej opisu aby tak do tego podejść :( Stąd właśnie powstał ten temat – proszę nie bić :P

Ale bardziej dla mnie ciekawą sprawą jest tutaj te mniejsze cosinusy (agenda_cos_small_v1 / v2): tutaj też mamy do czynienia z dodawaniem tego samego ciągu, ale starszy bajt wyniku zwiększamy TYLKO w przypadku pojawienia się / skasowania bitu V rejestru procesora(a nie C jak w przypadku zwykłego dodawania 1 bajtowej liczby do dwu) – tutaj wyniki wpierw powoli rośnie, przyspiesza a na końcu przedziału zwalnia (jak dodajemy 128 razy ciąg pod rząd)
jakbyśmy dodawali bez końca to byśmy otrzymali dokładnie taką falę jaką widać w tym moim intrze sea_calm). To już tak łatwo nie jestem w stanie wytłumaczyć. Może w weekend siądę i sobie to rozpisze bo mi to jeszcze spokoju nie daje. Chyba że znowu wyważam otwarte drzwi i ktoś tutaj napisze w łapotologiczny sposób jak to się odbywa?

Kuba – mógłbyś zapytać Acida jak on do tego tematu podszedł? A może Ty w swoich produkcjach już gdzieś to wykorzystałeś. Szkoda że wcześniej nikt tego sposobu nie "opublikował" (albo ja nie znalazłem). Sizecoding wtedy byłby o wiele prostszy!

9

koala napisał/a:

Chodzi o dodawanie właśnie 0 potem 1, 2, 3 ... itd. (to mogę nazwać pseudo parabolą bo ona się jednak różni od wyników funkcji kwadratowej)

No właśnie jest. Bo masz de facto sumę szeregu arytmetycznego z postępem 1, czyli w n-tym kroku masz wartość n*(n-1)/2=0.5*n^2-0.5*n co jest jak najbardziej funkcją kwadratową.

Pamięć studenta ma charakter kwantowy - student wie wszystko, ale jednocześnie nic nie pamięta.
- Kilka(naście?) pudełek z klawiszami i światełkami. I jeden Vectrex, żeby nimi wszystkimi rządzić.

10 Ostatnio edytowany przez koala (2022-02-16 18:47:44)

Tak masz rację! Jest to funkcja kwadratowa dla dziedziny liczb naturalnych. Mój błąd. Tak więc jest to jednak pełnoprawna parabola! Ahh ta matematyka! :)

ps: sizecoding jest piękny, bo właśnie znalazłem sposób na urwanie paru bajtów:) Można wywalić pha/pla, dodać txa i skorzystać z jakiejś zmiennej na ZP.  Ale to już jutro naniosę poprawki i opiszę :)

ps2: w paczce z 1 postu dodałem to sines.zip zoptymalizowane procki (mają dopisek _opt1) ale pewnie i tak nikt do tego nie zajrzy;)