1,701

(709 odpowiedzi, napisanych Fabryka - 8bit)

Electron sprzedał projekt zagranicznej firmie, ktora wlożyła go do sejfu i tyle

1,702

(3 odpowiedzi, napisanych Software, Gry - 8bit)

a nie na a7800 ?

1,703

(31 odpowiedzi, napisanych Emulacja - 8bit)

6r7gytv na nowo odkrywasz Ameryke

1,704

(6 odpowiedzi, napisanych Software, Gry - 8bit)

dzięki Miker

1,705

(3 odpowiedzi, napisanych Programowanie - 8 bit)

:) player na przerwaniu VBL wystarcza, w czym problem, trzeba tylko zadbać o to aby zawartość rejestrow AXY została zachowana

bo kazdy ma internet i moze go sciagnac, nie musi uzywac, INFLATE jest w formacie XASM

1,707

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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)

1,709

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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)

1,710

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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

1,711

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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

1,712

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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

1,713

(69 odpowiedzi, napisanych Programowanie - 8 bit)

"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

1,714

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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)

1,715

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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

1,716

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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)

1,717

(69 odpowiedzi, napisanych Programowanie - 8 bit)

BTC scena nie zna ograniczeń

1,718

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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

wersja krotsza ale dluzsza w cyklach:

 lda (src),y
 and (msk),y
 ora (shp),y
 sta (dst),y

z pobieznych testow wynika ze tym sposobem tracimy tylko jednego ducha, czyli zamiast 5 duchow w 1 ramce, bedziemy mieli 4 duchy w 1 ramce

1,719

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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+$400

program 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

1,720

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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

1,721

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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

1,722

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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

1,723

(69 odpowiedzi, napisanych Programowanie - 8 bit)

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

1,724

(21 odpowiedzi, napisanych Sprzęt - 8bit)

Sipowitz ten mały zasilacz ATX z Allegro w/w kosztuje 7 zł, to dużo ?

1,725

(21 odpowiedzi, napisanych Sprzęt - 8bit)

ten zasilacz ATX jest mniejszy http://www.allegro.pl/show_item.php?item=118296568