http://mads.atari8.info/softsprt_OK.zip
wersja najnowsza, zoptymalizowana detekcja kolizji (rozpisane petle), inne poprawki
15 duchow 12x24 z detekcja / 3 ramki
18 duchow 8x24 z detekcja / 3 ramki
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
FiSh 0.70 Bocianu wydał FiSh 0.70, shell ułatwiający przeszukiwanie zasobów serwerów TNFS.
Street Fighter II już na Atari 8-bit! Vega i jego zespół wydali finalną wersję kultowej bijatyki. Wymaga 4MB cartridge i 64KB RAM.
Elite Demo 6 na Atari 8-bit! Trwają prace nad konwersją kultowej gry Elite. Szóste demo wprowadza liczne poprawki błędów.
vbcc v5 dla 6502 Kompilator C vbcc doczekał się piątej wersji dystrybucji dla 6502. Zapewnia dużo szybszą arytmetykę FPU i nowe narzędzia.
HDDRIVER 12.75 Sterownik HDDRIVER, kluczowe narzędzie dla pamięci masowej Atari 16/32-bit, otrzymał aktualizację 12.75, która naprawia błąd w HDDRUTIL.
atari.area forum » Posty przez tebe
http://mads.atari8.info/softsprt_OK.zip
wersja najnowsza, zoptymalizowana detekcja kolizji (rozpisane petle), inne poprawki
15 duchow 12x24 z detekcja / 3 ramki
18 duchow 8x24 z detekcja / 3 ramki
programow pakujacych jest wiele, aktualnie najlepszym bo o najwyzszym wspolczynniku kompresji jest deflater FOX-a o którym wspomina Laoo, na PC jest paker DEFLATER.EXE (ogolnie jest to znana biblioteka kompresji/dekompresji ZLIB) a jego źródła procedury dekompresujacej dołączone są np. do pakietu z mads-em INFLATE.ASM
wystarczy podac adres spakowanych danych w zmiennej INPUTPOINTER (np. MWA #SOURCE INPUTPOINTER) i adres pod ktorym maja zostac umieszczone rozpakowane dane w zmiennej OUTPUTPOINTER (np. MWA #DESTINATION OUTPUTPOINTER), skoczyc pod adres INFLATE (np. JSR INFLATE) i to koniec.
jeśli zalezy nam na szybkości a nie na wysokim współczynniku kompresji możemy użyć naprostszej i najbardziej prymitywnej metody RLE, swojego czasu tutaj na forum opracowaliśmy najkrotszy depacker dla tej metody przy konkretnej formie zapisu spakowanych danych, program kompresujacy jest znów na PC, dekompresujacy dla 6502 http://mads.atari8.info/rle_encoder.zip (w zakladce Depacker sa dwie wersje depakera)
http://mads.atari8.info/softsprt_OK_18.08.06.zip
wersja z detekcja kolizji, z mruganiem i bez (mruganie tła sygnalizuje wykryta kolizje)
13 duchow 12x24 / 3 ramki
16 duchow 8x24 / 3 ramki
ogolnie detekcja kolizji wykonana dla kazdego ducha zmniejsza maksymalna liczbe generowanych w 3 ramkach duchow do 13 (bez detekcji 17)
http://mads.atari8.info/softsprt_OK.zip
z obsluga duchow 8x24, na ekranie znajduje sie 18 duchow (3 ksztalty), calosc wyrabia sie w 3 ramkach (mozna sprawdzic komorke $0200, wartosc 2 oznacza 3 ramki)
źródła razem z madsem załączone w archiwum, ogolnie nie jest to na 100% wersja finalna, ale juz dzialajaca
ja bym sprobowal, wolna strona zerowa, zajetej pamieci na duchy o polowe mniej, wada to "tylko" 13 duchow... moze warto?
Aktualnie jest wystarczajaco wolnej strony zerowej, tak naprawde zysk byłby z tego taki że zamiast 15 klatek animacji duch mógłby skladac sie z 30 klatek i tych duchow byloby mniej
Dodatkowo zostałoby wprowadzone poważne ograniczenie dotyczące masek dla operacji AND, aktualne maski wyliczane są na podstawie pixli grafiki i nie są idealne ale na potrzeby testów wystarczające, czyli jeśli jest jakiś pixel to twórz pixel maski, a co jeśli pixlem grafiki jest kolor %00 ktory domyslnie traktowany jest jako tło a nie kolor grafiki? a co jeśli chcesz aby duch miał czarną obwódkę jak jest to zrealizowane w przeszkadzajkach z Dynablaster. Ogólnie musze stworzyć bardziej skomplikowana procedure generującą maski aby uwzględniać czarne pixle wewnątrz ducha i wtedy tablica 256 bajtow dla maski ducha nic nie pomoże.
Trzeba pamietac że aktualnie nie ma wogóle detekcji kolizji, jest tylko jeden program obsługi duchów ktory losuje wartosci i dodaje do pozycji X,Y, brak muzyki dla ktorej player zająłby jakiś czas na przerwaniu VBL. Program obsługi ducha wywoływany jest zaraz po jego wygenerowaniu i ma za zadanie sterować duchem, podejmować decyzje odnośnie jego zachowania itp, itd. to właśnie te krótkie programiki obsługi ducha będą determinować o końcowej szybkości całego silnika.
W prawdziwej grze na pewno stracimy jeszcze kilka dodatkowych duchow, wiec ideą przewodnią jest stworzenie jak najszybszego silnika generującego duchy.
Mam jeszcze takie pytanie: te 17duchów/na 3 ramki to przy jakiej szerokośći ekranu? 32 znaki? Jeżeli tak to ile ich będzie przy szerokości 40 i 48 znaków?
ekran 32 bajty: 17 duchow / 3 ramki
ekran 40 bajtów: 15 duchow / 3 ramki
ekran 48 bajtów: brak wyniku, ekran rozpierniczony, śmieci, tryb GTIA, trzeba przyjrzec sie temu blizej
ogolnie caly silnik synchronizuje sie do zadanej liczby ramek (domyslnie 3) tak ze jesli na ekranie bedzie mniej duchow to nadal przelaczanie obrazow bedzie odbywalo sie raz na 3 ramki, czyli nie bedzie przyspieszenia akcji ze wzgledu na mala ilosc obliczen, podobnie jesli zostanie odpalony na dopalce Pasia F7 to tez zachowa zadane tempo 3 ramek
i jeszcze jedno bo to mi nie daje spokoju:
mowisz o 13 duchach na raz ruszonych (w 3 ramkach) a co jest jesli wyswietliles wczesniej np. 20 duchow ale 7 stoi w miejscu i sie nie animuje ?
zostana skasowane, wszystkie duchy sa nakładane na dany bufor za kazdym razem, bo wszystkie duchy wykorzystuja ta sama strone zerowa i za kazdym razem dla kazdego ducha z osobna musi ona zostac zaincjowana nowymi watrtosciami
sa dwa bufory (animacja przez przelaczanie obrazow), kazdy z tych buforow ma swoja pamiec obrazu i swoje 4 zestawy znakowe, dodatkowo istnieje bufor główny ktory przechowuje tylko pamiec obrazu z polem gry
cała pętla działa w dwóch właściwie krokach, krok1: wyświetl bufor 3, zacznij modyfikować bufor 2, krok2: wyświetl bufor 2, zacznij modyfikować bufor 3, skok do kroku 1.
modyfikacja bufora polega na przepisaniu pamieci obrazu z bufora glownego (bufor 1) do danego bufora i nalozenie duchow, bufor glowny sluzy tylko do odczytu, mozna go modyfikowac jesli chce sie uzyskac jakas dodatkowa akcje w polu gry, tyle ze trzeba zrobic to w odpowiednim miejscu
p.s.
można zrobić jeszcze inaczej, silnik będzie odpalany przez skok JSR pod odpowiedni adres (za kazdym wywołaniem zostanie przelaczony obraz na inny bufor), po powrocie z silnika robimy swoje niewiadomo jak długo
i znowu wywolujemy silnik, w ten sposób całość będzie nierównomiernie działała i będą skoki szybkości, ogólnie chaos chyba że będziemy mieli pare duchów tak aby wszystko mieściło się w granicy 1 ramki
8 kilo na tablice masek to troche sporo. tak sie zastanawiam, a moze:
ldx $ffff,y - ksztalt ducha
lda $ffff,y - tlo
and $ffff,x - tablica masek 256 b
ora $ffff,y - ksztalt ducha
sta $ffff,y - sprajt
predkosc spada do 14 duchow na 3 ramki, czyli do predkosci jaka dysponuje wersja bez procedury modyfikujacej na stronie zerowej
jest tylko małe ALE
akualna wersja zajmuje na stronie zerowej 12*16 = 192 bajty + 7 bajtow na ośmiokrotne petlenie sie
dey
smi
jmp $0009
rtsw sumie na stronie zerowej tym sposobem zajetych jest 199 ($C7) bajtow + 8 bajtow na zmienne, razem aktualny silnik zajmuje $CF bajtów strony zerowej
Twoja wersja XXL jest oszczedna dla pamieci masek, jednak nie dla strony zerowej bo 15*16+7 = 247 ($F7) bajtow, do dyspozycji uzytkownika zostaje 8 bajtow na stronie zerowej jesli tylko zabrać silnikowi aktualne zmienne na stronie zerowej, albo procedure umieścić poza strona zerowa co oznacza strate 1 ducha i wyjdzie rzeczywiscie 13 duchow w 3 ramkach
p.s.
nastepny kod zrodłowy, jak tylko dorzuce obsluge duchow 8x24
"and $ffff", ta operacja jest potrzebna aby zrobic miejsce pod duchem czyli usunac pixle grafiki, mozemy zrezygnowac z AND ale wtedy duch po nalozeniu na grafike w extremalnym przypadku wogole zniknie i nie bedzie go widac, ogolnie sama operacja OR bedzie tworzyć z tłem obrazu jakies nieprzewidywalne kolory
pamiec z danymi duchow wyglada tak:
; $4000-$47FF shp.shr0
; $4800-$4FFF shp.shr2
; $5000-$57FF shp.shr4
; $5800-$5FFF shp.shr6
;
; $6000-$67FF msk.shr0
; $6800-$6FFF msk.shr2
; $7000-$77FF msk.shr4
; $7800-$7FFF msk.shr6shr0 - przesuniecie o 0 bitow w prawo
shr2 - przesuniecie o 2 bity w prawo
shr4 - przesuniecie o 4 bity w prawo
shr6 - przesuniecie o 6 bitow w prawo
shp.shr zawiera N klatek animacji ducha z zadanym przesunieciem
msk.shr zawiera N klatek masek animacji ducha z zadanym przesunieciem
N = 0..15, czyli duch moze miec maksymalnie 15 klatek, dlaczego ? bo $800/136 = 15, a skad 136 sie wzielo ? 17*8 = 136, bo kazda klatka zapisana jest nie za pomoca 16 znakow tylko 17, 17 znak jest pusty i jest potrzebny aby nie było widać śmieci które pojawialy sie przy ruchu pionowym
mam pytanie, and $ffff,y - co zawiera ta tablica jaka jest jej wielkosc i gdzie lezy?
tablice dla AND to msk.shr0, msk.shr2, msk.shr4, msk.shr6 i leżą one pod stałymi adresami w/w
tablice dla ORA to shp.shr0, shp.shr2, shp.shr4, shp.shr6 i leżą one pod stałymi adresami w/w
http://mads.atari8.info/softsprt_OK.zip
wszystko idzie w dobrym kierunku, wczesniejszy pomysl ulegl malej modyfikacji, zalaczona wersja potrafi wyswietlic 17 duchow w 3 ramkach i zajmuje najmniej miejsca kosztem strony zerowej, ktora wykorzystuje prawie w calosci
na stronie zerowej umieszczona zostala rozpisana procedurka realizujaca to (struktury mads-a czynia cuda):
lda $ffff,y
and $ffff,y
ora $ffff,y
sta $ffff,yprocedurke ze strony zerowej mozna takze wykorzystac do tworzenia duchow 8x24, duchy 8x24 beda potrzebowac tylko dwoch dodatkowych bankow z rozpisana procedura inicjalizacji, pozatym obecnosc duchow 8x24 bedzie mozna wykorzystac do optymalizacji dzialania duchow 12x24 (dla pozycji "x and 3=0")
w zalaczonej wersji, ktora najbardziej mi sie podoba ze wzgledu na zrownowazone parametry szybkosci i pamieciozernosci ustalony jest staly podzial pamieci banku dla danych duchow, tak ze maksymalnie duch moze skladac sie z 15 klatek animacji i zajmuje tylko 1 bank pamieci
podkladania PMG jeszcze nie zrobilem, ogolnie napisalem ze jest to mozliwe z poziomu programow obslugi ducha, poniewaz kazdy duch ma swoj program obslugi, najprostszy program obslugi to RTS :)
w zalaczonym przykladzie wyswietlane sa 4 duchy i 4 pociski z piorytetem 8, piorytet 0 dziala tylko zadowalajaco dla dwoch pierwszych duchow i dwoch pierwszych pociskow
ogolnie mozna zajrzec do G2F, tam to wszystko jest podane w zakładce EDIT PMG
dla piorytetu GTICTL=8 duchy przykrywaja kolory z rejestrow COLOR2, COLOR3 (invers), a jako ze inversu duchy programowe nie uzywaja oznacza to ze duchy programowe bede miały zmieniany tylko jeden kolor konkretnie ten z rejestru COLOR2 (710)
4 duchy sprzetowe moga calkowicie podbarwiac ducha programowego 12x24
4 pociski sprzetowe moga calkowicie podbarwic ducha programowego 8x24 (tym samym kolorem co duchy lub kolorem z rejestru COLOR3=kolor inversu)
wlasnie wpadlem na pomysł trzeciego sposobu, który bylby połączeniem obu wcześniejszych, szybkości i małej zajetości banków pamieci, kosztem pamięci podstawowej
musimy z gory założyc jaka może być maksymalna liczba klatek animacji ducha, np. 8 i nie więcej
dla tych 8 klatek rozpisujemy procedure modyfikujaca zestaw znakow, zajmuje ona dokładnie $516 (1302) bajtów, wersja dla ducha na pozycji PIXEL=0 zajmuje $456 (1110) bajtów (modyfikujemy 12 a nie 16 znakow)
dane wszystkich klatek animacji lacznie z przesunieciem o pixel w prawo beda pod stalymi adresami w obszarze $4000..$7FFF czyli w banku pamieci
wystarczy przelaczyc bank, aby procedury modyfikujace z pamieci podstawowej zaczely czytac dane opisujace innego ducha :)
wersja najszybsza zajmie 8*1302+8*1110=19296 ($4B60) bajtow pamieci podstawowej, wersja wolniejsza 8*1302=10416 ($28B0) bajtow pamieci podstawowej
oczywiscie jesli przyjmiemy wieksza liczbe dopuszczalnych klatek animacji np. 10,12 bedzie potrzeba wiecej pamieci podstawowej, tak ze moze jej nie starczyc do innych celow (obszar $4000..$7FFF jest uzywany przez banki, wiec niewiele z niego skorzystamy)
ogolnie ta wersja wydaje sie najbardziej atrakcyjna, mimo tego że narzuca ograniczenie co do ilosci maksymalnej liczby klatek animacji i jest mało gospodarna w wykorzystaniu pamieci bankow, bo 8 klatek zajmie niecałe 9kB banku
wersja zajmujaca mniej pamieci, wszystkie klatki animacji ducha w 1 banku
http://mads.atari8.info/softsprt_slow.zip
nie jest to wersja finalna, jeszcze cos sie "kaszani", ogolnie po dodaniu potrzebnych obliczen itp engin zwolnil dla 3 ramek aż o 5 duchow (mozna jeszcze dokonac malej optymalizacji wtedy strata bedzie może rzędu 3 duchow)
na chwile obecna 14 duchow = 3 ramki (wersja pamieciozerna 3 ramki = 19 duchow)
BTC scena nie zna ograniczeń
Vega nie wiem skad Ci wyszlo to 820kb
4 banki zawieraja np. 10 klatek animacji dla ducha + te same klatki animacji z przesunieciem o pixel w prawo, i to wszystko jesli chodzi o animacje jednego ducha, potem mozemy wykorzystywac ta jedna animacje do tworzenia innych duchow, to nie zajmuje juz wiecej pamieci
w Bubble masz powiedzmy na dana chwile 4 rodzaje przeszkadzajek (duchow), czyli:
- 10 klatek animacji ducha #1 ruch w prawo = 4
- 10 klatek animacji ducha #2 ruch w prawo = 4
- 10 klatek animacji ducha #3 ruch w prawo = 4
- 10 klatek animacji ducha #4 ruch w prawo = 4
- 10 klatek animacji ducha #1 ruch w lewo = 4
- 10 klatek animacji ducha #2 ruch w lewo = 4
- 10 klatek animacji ducha #3 ruch w lewo = 4
- 10 klatek animacji ducha #4 ruch w lewo = 4
to wszystko zajmie 512kb, na tej podstawie mozesz stworzyc np. 16 (albo wiecej) roznych duchow o maksymalnie 4 rodzajach ksztaltow i 2-och kierunkach poruszania sie
p.s.
nowsza wersja uwzglednia programy obslugi dla kazdego ducha, w programie obslugi mozna zmieniac pozycje x,y, dodac podbarwienie duchem sprzetowym, wykrywac kolizje, reagowac na kolizje itp itd.
p.s.#2
mozna skrocic 4 banki do 1 banku jesli skorzystac z adresowania indeksowego, obecnie jest tak:
lda (src),y
and msk,x
ora shp,x
sta (dst),ywersja krotsza ale dluzsza w cyklach:
lda (src),y
and (msk),y
ora (shp),y
sta (dst),yz pobieznych testow wynika ze tym sposobem tracimy tylko jednego ducha, czyli zamiast 5 duchow w 1 ramce, bedziemy mieli 4 duchy w 1 ramce
2 banki na procedury inicjujace BUF2, BUF3 i kazde nastepne 4 banki na nowy kształt (animacje) ducha
zalaczony przyklad zajmuje 2+4+4 = 10 bankow pamieci - 1 = 9, bo jednym z bankow pamieci jest tak naprawde bank $FE a ten miesci sie przeciez w podstawowej pamieci RAM :)
pamiec podstawowa (plik GLOBAL.HEA) $A000..$CFFF:
B1scr = $a000 ; dane obrazu dla BUFOR #1 (ten obszar jest kopiowany do BUFOR #2, BUFOR #3)
B1inv = B1scr+$400 ; dane inversu dla BUFOR #1 (stale wartosci, jesli modyfikujemy B1SCR to tutaj musimy uaktualnic invers)
B2scr = B1inv+$400 ; dane obrazu dla BUFOR #2 (ulega modyfikacji podczas nakladania duchow)
B3scr = B2scr+$400 ; dane obrazu dla BUFOR #3 (ulega modyfikacji podczas nakladania duchow)
B2fnt0 = B3scr+$400 ; zestawy znakow dla BUFOR #2
B2fnt1 = B2fnt0+$400
B2fnt2 = B2fnt1+$400
B2fnt3 = B2fnt2+$400
B3fnt0 = B2fnt3+$400 ; zestawy znakow dla BUFOR #3
B3fnt1 = B3fnt0+$400
B3fnt2 = B3fnt1+$400
B3fnt3 = B3fnt2+$400program obslugi $2000..$2FFF
p.s.
Vega Ty chyba nie chcesz uzywac duchow sprzetowych do wykrywania kolizji ? bo to da sie zrealizowac programowo, obliczyc odległość srodka jednego ducha od drugiego, wartosc z odpowiedniego przedzialu bedzie oznaczac kolizje
p.s.#2
podbarwic na calej szerokosci mozna tylko duchami o podwojnej szerokosci, pociski nawet najszersze podbarwia tylko 8 pixli
mozna dodac taka opcje, oczywiscie max 8 duchow byloby w ten sposob podbarwione, bo multiplexera tutaj nie ma
pozatym mozna wykorzystac piorytet 0 duchow, przez co duch podbarwi (rozjasni) danym kolorem wszystkie pixle grafiki ducha programowego
p.s.
usprawiony mads http://mads.atari8.info/asembler.exe podczas pisania zauwazylem pare mozliwych udogodnien i uaktualnilem mads'a przez co tylko ta wersja poprawnie asembluje kod silnika duchow
http://mads.atari8.info/softsprt.zip - wersja silnika z kodem źródłowym
przyklad dzialania nowego silnika http://mads.atari8.info/softsprt.zip
duchy o rozmiarze 12x24 pixle
5 duchow = 1 ramka
11 duchow = 2 ramki
19 duchow = 3 ramki
w zalaczonym przykladzie wyswietlanych jest 16 duchow, znaki tła maja kody 0..63, wiecej duchow oznacza ze tlo będzie składać sie z mniejszej liczby znaków
na chwile obecna moj silnik dla spritow na znakach potrzebuje 12..17 linii obrazu (wartosc z $D40B) na przepisanie i modyfikacje 16 znakow z 4 zestawow, predkosc uzalezniona od linii w ktorej startuje procka
a ile zajmuje :), dwie procedury dla dwóch buforów inicjalizujace zmienne i bufory to 2 banki pamieci
8 klatek animacji ducha z przesunieciem o 1 pixel w prawo to 4 banki pamieci
ogolnie wszystko rozpisane i rozpetlone
w Nibbly zrealizowane zostało to podobnie, ekran o szerokosci 40 bajtow podbarwiany jest dwoma duchami o maksymalnej szerokosci, dwoma bo rozmnażane sa one w linii, dodatkowo co 8 linii zmieniany jest ich kolor, przez co Nibbly jest bardzo kolorowe jak na tryb znakowy, pozatym do dyspozycji zostaja jeszcze 2 duchy i 4 pociski
podobnie realizowany jest panel na dole ekranu, z tym ze sa tam uzyte duchy 4 kolorowe ktore sa rozmnazane w linii
p.s.
nie wykluczam ze ekran o szerokosci 32 bajtow udaloby sie podbarwic tylko 1 duchem
p.s.
zaleta trybow tekstowych jest mniejsze zuzycie pamieci
Sipowitz ten mały zasilacz ATX z Allegro w/w kosztuje 7 zł, to dużo ?
ten zasilacz ATX jest mniejszy http://www.allegro.pl/show_item.php?item=118296568
XXL po tym przykładzie widać że masz problem z płynnym scrolem :) W Phantom duchy stawiane są co znak a nie co pixel, jest to najbardziej prymitywna metoda, jeśli miałbyś robić gry w ten sposób to daruj sobie.
obejrzyjcie sobie gre POOYAN, jest na znakach
Vega możliwe, jednak musisz miec bufory, zeby nie zerwało synchronizacji
p.s.
napisze engine do znakowych taki ze pamieci Atari nie starczy
Vega, nie wspomnialem o tym wczesniej, ale wydawało mi sie to oczywiste że powinieneś rozpisać wszystkie klatki animacji ducha (12x24 pixli) na 4 fazy (przesuniete o 1 pixel w prawo)
Vega masz przecież UltraXE, udaje mi się na tym odpalić wszystko co napisałem dla 65816 łącznie z XLPMax 2.6
tak Scorpio, dla samego "sportu" mozna i samemu przepisywać przy wylaczonym DMA, ale jest to tak nieefektywne że wogole nie warto o tym wspominac
atari.area forum » Posty przez tebe
Wygenerowano w 0.091 sekund, wykonano 14 zapytań