![]() |
256 Bajtów - Króger |
![]() |
W trzecim numerze Serious'a poruszona została sprawa 256 bajtówek. Stało się tak, gdyż pozostawiłem Jabolowi do dyspozycji mój pierwszy mikroefekcik. W swej formie pozostawiał nieco do życzenia, ale mógł posłużyć jako materiał dydaktyczny dla początkujących. Tym razem prezentuję programik znacznie doskonalszy, z dokładnym opisem technik zmierzających do dokonania maksymalnej optymalizacji pod względem objętości kodu. Kilka procedur składających się na poniższy efekcik (tworzenie tablicy sinusów, tworzenie DL, tworzenie tablic dla szybkiego plota) można uznać za wzorcowe, prawdopodobnie są najkrótsze. Możecie śmiało z nich korzystać.
Efektem programiku zawierającego się w 264 bajtach jest wektorowa kula składająca
się z 256 punktów obracająca się wokół dwóch osi. Zatem zaczynamy...
Rozwiązanie to posiada jednak szereg wad. Po pierwsze trudno jest ustalić jaką częścią strony zerowej możemy używać. Przyjmuje się, że dostępna jest tylko starsza połowa strony zerowej. Jednak niekoniecznie - zależy to od używanego DOS'u. Najbardziej rozpowszechniony II+D ingeruje w stronę zerową tylko do $54, reszta należy do nas, dlatego kod możemy umieścić śmiało od $55, należy jednak pamiętać, że programik niekoniecznie musi działać pod wszystkimi DOS'ami.
Program przekraczający długość $aa ($ff-$55) załaduję się na początek stosu. Można
to śmiało zrobić, gdyż system korzysta z niewielkiej części stosu (ok. 40 ostatnich bajtów). Jednak zajęcie części stosu
może wejść w kolizję z innymi programami zeń korzystającymi (np. turbo stacji). Należy się z tym liczyć.
0, 5.625, 11.25, ... ,84.375, 90, 84.375, 78.75, ... ,11.25, 5.625 Wartości te są pomnożone przez 256. Nasza procedurka kolejno (dla każdego argumentu) dodaje wartość pobraną z tablicy SI i zapisuje ją w słowie, którego młodszy bajt zawiera się w MK, a starszy (zapisywany do tworzonej tablicy przetrzymywany jest na szczycie stosu. Dla oszczędności zrezygnowałem z rozkazu CLC przed dodawaniem. Zrozumienie działania procedury nie jest konieczne dla zrozumienia dalszej części artykułu. Problem tworzenia tablic sinusów poruszyłem swego czasu w CA Zine #1 i zainteresowanych tamże odsyłam.
UWAGA! Rozmiar tablicy (64 kąty) jest sztywny - nie można go zmieniać.
Teraz zajmiemy się naszym display list. Cały efekt będzie wyświetlany tylko na
jednej płaszczyżnie ekranu (nie stać nas na rozrzutność), skutkiem tego będzie problem nieobcy żadnemu koderowi, czyli
"mruganie" (brak synchronizacji z Antic'em).
Ostatnie cztery rozkazy ustalają szerokość ekranu i podają młodszy bajt DL (starszy
będzie podany przy sprzyjającym stanie akumulatora). Znajomość bieżącego stanu rejestrów pozwala uniknąć zbędnego
wpisywania do nich wartości już tam się znajdujących, co zostanie wykorzystane również w poniższych procedurkach:
128, 64, 32, 16, 8, 4, 2, 1
Obie tablice służą do przetwarzania współrzędnej X na punkt na ekranie. Z tablic korzysta się następująco:
a0 equ * jsr los ldy #60 lda (sin),y sta tbz,x lda (cos),y tay jsr los lda (cos),y sta tbx,x lda (sin),y sta tby,x inx bne a0 Powyższa procedurka tworzy powierzchnię kuli złożoną z 256 punktów. Jej działanie polega na obróceniu o losowe kąty (kąty losuje podprogram LOS, którego działanie będzie opisane niżej) punktu o współrzędnych 60, 0, 0 wokół osi Y i Z. Algorytm obrotu został w skrajnym stopniu skrócony. Możemy się temu przyjrzeć wychodząc od podstawowych wzorów na obrót wokół osi Y i Z (sprawę obrotów dokładnie opisałem w CA Zine #1): x1=cos(alfa)*x-sin(alfa)*z y1=y z1=sin(alfa)*x+cos(alfa)*z x2=cos(beta)*x1-sin(beta)*y1 y2=sin(beta)*x1+cos(beta)*y1 z2=z1 Zauważmy, że z i y1 (y1=y) są zawsze równe 0, dlatego drugi składnik obu sum i odjemniki obu różnic mogą być pominięte. Dzięki temu powyższe wzory możemy skrócić do postaci: x1=cos(alfa)*x y1=y z1=sin(alfa)*x x2=cos(beta)*x1 y2=sin(beta)*x1 z2=z1 I powyższa procedurka jest właśnie przełożeniem tych wzorków. Po tych przygotowaniach wstępnych czas na pętlę główną efektu. Jej układ może być zaskakujący. Najpierw jest stawiany punkt (cztery rozkazy zaczynając od E3), a następnie jest wyliczany kolejny punkt, który będzie postawiony dopiero, gdy pętla rozpocznie swój bieg od początku. Skutkiem tego pierwszy punkt, który będzie postawiony (numer punktu przechowywany jest w rejestrze X ) został wyliczony jeszcze w poprzedniej klatce. Cute!
Na początek trzy czynności wstępne, które muszą być wykonane przed rozpoczęciem
rysowania klatki.
Następnie wykonywane są obroty wokół osi X i Y według wzorów, które najpierw
obejrzmy w wersji oryginalnej (pełnej):
Wyliczony X2 nie musi być ześrodkowywany (tzn. nie trzeba doń dodawać 128, czyli połowy szerokości ekranu wyrażonej w liczbie pikseli), robi to za nas Antic, który pamięć obrazu przesuwa o 16 bajtów (spójrz niżej, pod etykietę DL1).
Kula obraca się o minimalny zdefiniowany kąt (INC SIN+1), wyjście poza zakres (czyli
ustalenie kątu nr 64) jest póżniej korygowane przez odwołanie się do procedurki LOZ.
COS+1 różni się od SIN+1 tylko sześcioma młodszymi bitami. Dodaje się do nich 16, a
na wypadek, gdyby nastąpiło przeniesienie do bitu 6, jest on zerowany. Jest to zrozumiałe, gdyż:
Jeszcze jedna sugestia z mojej strony. Zrobienie 256-tki polega przede wszystkim na znalezieniu i opracowaniu dobrego pomysłu. Najważniejsza jest orginalność. Dlatego proszę, przestańcie ludzi katować różnymi fajerkami i im podobnymi nowościami. Króger/Quasimodos PS. Ergo Bibamus "się robi" - dość powoli.Errata do Serious #3 - programik "Bulki" nie był mojego autorstwa. Przypisał mi je błędnie ktoś z redakcji. Od redakcji: Rzeczywiście, autorstwo publikowanego w SERIOUS #3 programu BULKI zostało błędnie przypisane Kógerowi. Ponieważ to JA ponoszę moralną odpowiedzialność za całe to zajście, Krógera oraz autora programu BULKI serdecznie przepraszam! Ponieważ Króger nie lubi się powtarzać, a w swoim artykule kilkukrotnie odwoływał się do stworzonych i opublikowanych wcześniej materiałów jeżeli będzie na nie zapotrzebowanie odpowiednie artykuły możemy jeszcze raz "przedrukować", na życzenie społeczeństwa, oczywiście... Zbycho Jabol/DIAL |