51 Ostatnio edytowany przez tebe (2006-08-16 19:24:34)

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,y

procedurke 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)

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

52

No tebe - gratulacje. Rispekt.

Czy możecie wyjaśnić, Stirlitz, dlaczego wasz służbowy adres stirlitz@rsha.gov.de ma aliasa justas@gru.su?
Nie czytam PM. Proszę używać e-mail.

53

zaraz, ale czym sie steruje, fajer nie dziala tez.


zartuje. rewelacja. na takim silniczku wszystko mozna zrobic.

mam pytanie, and $ffff,y - co zawiera ta tablica jaka jest jej wielkosc i gdzie lezy?

http://atari.pl/hsc/ad.php?i=1.

54 Ostatnio edytowany przez tebe (2006-08-16 20:43:08)

"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.shr6

shr0 - 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

xxl napisał/a:

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

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

55 Ostatnio edytowany przez xxl (2006-08-16 20:54:37)

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

pare cykli wiecej a tablica masek dla wszystkich mozliwych sprajtow bedzie miala tylko 256 bjtow ?

do ilu by spadla ilosc duchow? 13 ? to i tak mistrzostwo swiata
dobrze czy zle zrozumialem ?

http://atari.pl/hsc/ad.php?i=1.

56 Ostatnio edytowany przez vega (2006-08-16 23:51:17)

tebe napisał/a:

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

A ile zostaje z tej strony zerowej? No bo jakis player muzyki, sam MADS dla wywoływania procedur i sama gra potrzebują trochę miejsca na tej  stronie.

tebe napisał/a:

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)

No i jeszcze PMG przykryje COLBAK (zwykle kolor czarny, żeby ramka była czarna). I tu pojawia się problem bo kolor czarny jest używany na planszy Bubble Bobble w dużej ilości jako tło:(



kiedy kolejny kod źródłowy? bo mnie w sumie to najbardziej interesuje:)

57 Ostatnio edytowany przez tebe (2006-08-17 07:22:57)

xxl napisał/a:

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
rts

w 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

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

58

ja bym sprobowal, wolna strona zerowa, zajetej pamieci na duchy o polowe mniej, wada to "tylko" 13 duchow... moze warto?

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 ?

http://atari.pl/hsc/ad.php?i=1.

59 Ostatnio edytowany przez vega (2006-08-17 11:44:25)

tebe napisał/a:

w sumie na stronie zerowej tym sposobem zajetych jest 199 ($C7) bajtow + 8 bajtow na zmienne, razem aktualny silnik zajmuje $CF bajtów strony zerowej

Jak 49 bajtów zostaje to nie tak źle. W sumie najbardziej krytyczna jest zawsze procka rysująca na ekranie. Reszta kodu może się zwykle obyć bez strony zerowej:)

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?

60 Ostatnio edytowany przez tebe (2006-08-17 18:47:24)

xxl napisał/a:

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.

vega napisał/a:

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

xxl napisał/a:

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

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

61

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

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

62

tebe napisał/a:

....a co jeśli chcesz aby duch miał czarną obwódkę jak jest to zrealizowane w przeszkadzajkach z Dynablaster...

W sumie tylko to brakuje do doskonałości tego silnika, żeby sprite'y mogły mieć czarną obwódkę. To bardzo poprawia widoczność jeżeli mamy w tle jakiś rysunek.

Poza tym nieźle Co to wyszło Tebe:) Gratulacje.

63 Ostatnio edytowany przez tebe (2006-08-18 23:22:51)

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)

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

64

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

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

Brzmi bajerancko! Gratulacje TeBe!

Ja jestem programistyczna lama, wiec chcialem sie tylko spytac, czy te sprajty maja taka sama szybkosc w hi-res? I czy podkladanie PMG bardzo wplywa na szybkosc tych procedur?

Kaz/Rohar
Prowadzę stronę dla obłąkanych: http://atari.online.pl/

66

mamy x,y sprajta, w jaki sposob obliczane jest ktory znak i z ktorego zestawu ma byc brany za tlo dla sprajta ?

http://atari.pl/hsc/ad.php?i=1.

67

w pliku LOOP jest inicjowana zmienna FREE

mva    #charsBAK    free

zmienna FREE wskazuje na kod pierwszego wolnego znaku, numer zestawu znakowego ustalany jest na podstawie numeru wiersza

charsBAK w załączonym przykładzie ma wartość 56, czyli znaki 0..55 przeznaczone sa na tło, znaki 56..127 na duchy

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

68

numer zestawu w zaleznosci od numeru wiersza czytany jest z tablicy pewnie, ale mi chodzilo o wpolrzedna x, czy jest ona dzielona, dodawany adres linii i na tej podstawie obliczany adres znaku tla? (ewentualnie tez czytana z tablic i dopiero pozniej korygowana o adres lini).
wlasciwie interesuje mnie to co nastepuje teraz, pobierany znak jest zapisywany w procedurze aby mogla ona dodac tlo do sprita?

http://atari.pl/hsc/ad.php?i=1.

69

xxl napisał/a:

numer zestawu w zaleznosci od numeru wiersza czytany jest z tablicy pewnie, ale mi chodzilo o wpolrzedna x, czy jest ona dzielona, dodawany adres linii i na tej podstawie obliczany adres znaku tla?

nie ma tablic bo wszystko jest w kodzie programu, procedura odczytu znakow dla kazdego wiersza jest rozpisana, rozpisanie programu realizuje BCALC.ASM, a zaczyna sie tak:

; BCALC
; zadaniem procedury BCALC jest odczytanie 4*COLS znakow i obliczenie ich adresow
; dodatkowo po odczytaniu znakow zastepowane sa one nowymi znakami: FREE, FREE+1 ... FREE+COLS

bcalc
    lda posx
    :2 lsr @
    tax

    lda posy
    :3 lsr @
    tay

    lda ladr,y
    sta _jmp+1
    lda hadr,y
    sta _jmp+2

_jmp    jmp $ffff

pozycja X przeliczana jest na pozycje znaku w wierszu (x/4), na podstawie pozycji Y dokonywany jest skok do odpowiedniego programu obslugujacego wiersz


BCALC wywolywane jest z poziomu BAT-cha z roznymi parametrami, co powoduje wygenerowanie kodu dla 2-och buforow i 2-och roznych szerokosci ducha (cols=4 czyli 12 pixli, cols=3 czyli 8 pixli)

mads.exe bcalc.asm -d:bufor=2 -d:cols=4 -o:b2calc_12.obx -i:global
mads.exe bcalc.asm -d:bufor=3 -d:cols=4 -o:b3calc_12.obx -i:global

mads.exe bcalc.asm -d:bufor=2 -d:cols=3 -o:b2calc_8.obx -i:global
mads.exe bcalc.asm -d:bufor=3 -d:cols=3 -o:b3calc_8.obx -i:global

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

70

sprytne, ale dlaczego draze temat... majac pozycje znaku tla trzeba odczytac jego kod i obliczyc pozycje w zestawie znakow aby wyciagnac zawartosc... jesli tak to wyglada to byc moze mozna pominac ta operacje.

trzeba zorganizowac ekran tak ze kazda linia sklada sie z bajtow od 0 do 39 odpowiednio definiujac zestawy
teraz pozycja x sprajta jednoznacznie okresla adres danych tla wiec nie potrzeba badac kodu znaku i obliczac jego adresu (np na podstawie tablicy pobieramy adres), co wiecej, nie trzeba obliczac kolejnych adresow znakow tla - sa wyzsze o 8.

dobrze mysle?

oczywiscie w przypadku gdy tlo jest w wiekszosci 'czarne' a Twoja procka rozpoznaje znaki 'spacji' i pomija operacje dodawania tla to to co napisalem powyzej jest bez sensu.

http://atari.pl/hsc/ad.php?i=1.