1 Ostatnio edytowany przez laoo/ng (2024-06-25 09:20:46)

Nie jestem pewien do jakiego działu to pasuje, bo to trochę interdyscyplinarne, ale lecim...

Kiełkowała mi od kilku lat idea zrobienia alternatywnego rdzenia do VBXE, który byłby bardziej dostosowany do typowych wyzwań stawianych przez gry i wygląda na to, że projekt ma szansę na materializację przy wielkiej i nieocenionej pomocy MatGuru.
Pod pojęciem "bardziej dostosowany do typowych wyzwań stawianych przez gry" rozumiem "coś mniej więcej jak zrobili w Atari Lynx". A w szczególności chcę wzorować się na lynksowym blitterze, którego principia działania nie polegają na przepuszczaniu pamięci przez operacje logiczne (tak jak działa to w klasycznym blitterze rodem z Amigi, Atari ST i w rezultacie też takim jaki został zaimplementowany w VBXE), lecz raczej... na rysowaniu sprajtów na ekranie.  Nie jest to teraz miejsce na zgłębianie ogólnych mechanizmów działania tego blittera, zainteresowanych mogę odesłać do dokumentacji. Mnie teraz w szczególności interesuje jeden jego aspekt, a jest nim schemat kompresji grafiki zastosowany w ustrukturyzowanych danych lynksowego sprajta.

Przygotowałem uproszczony (wyrzuciłem rzeczy, które nie są teraz istotne) schemat struktury danych sprajta:

https://i.imgur.com/CZTkKFq.png

Nigdzie w strukturze sprajta nie jest zadeklarowana jego szerokość, ani wysokość, lecz jest on strukturalnie podzielony na wiersze, nagłówek wiersza jest offsetem do następnego wiersza, offset = 0 oznacza koniec sprajta. Pomiędzy offsetami są dane wiersza, które są podzielone na pakiety. Pakiet składa się z 5-bitowego nagłówka - 1 bit na wyznacznik, czy dane są literalne (1), czy powtórzone (0) oraz 4 bitów długości pakietu (N). W przypadku danych literalnych zawartość pakietu to dane N pikseli, w przypadku danych spakowanych jest to jeden piksel, który ma być powtórzony N razy. Czyli dość klasyczne RLE.

Dekompresor tego jest zrealizowany sprzętowo i też tak samo "sprzętowo" (w FPGA) będzie musiało to być zrealizowane w VBXE. Zagadnienie z jakim się zwracam na forum to:

Czy można wymyślić coś o lepszym stopniu kompresji, co nie byłoby trudne do implementacji w FPGA?

Nie muszę robić wiernej kopii rozwiązania z Lynksa, bo nie zależy mi na kompatybilności 1:1, np już uprościłem sobie strukturę ustalając na sztywno liczbę bitów na piksel do 4. Nie chciałbym wychodzić poza RLE - rozwiązania słownikowe wydają się zbyt skomplikowane. No chyba że ktoś uzasadni, że jakieś "LZ" byłoby do zrobienia i miałoby sens.

Na takie pomysły zmian wpadałem do tej pory:
* Można w strukturze opisu sprajta zawrzeć liczbę bitów do kodowania długości pakietu (w Lynksie jest to zawsze 4).
* Można liczbę bitów długości pakietu kodować per wiersz (np na trzech bitach od 0 do 7)
* A może w strukturze opisu sprajta zawrzeć liczbę pakietów, co ile ustalane byłoby ile bitów ma długość pakietu? Może pozbyć się wyznacznika literal/repeated?


Ogólnie ja nie wiem, czy można wymyślić coś lepszego, co dalej byłoby RLE. Pomysły i tak trzeba byłoby jakoś empiryczne zbadać na jakichś danych testowych. Zaznaczę tylko, że przeznaczeniem tej kompresji byłoby pakowanie 16-kolorowych sprajtów, które kodują przezroczystość na kolorze 0 i zwykle nie są jakoś bardzo duże. Maksymalny sensowny rozmiar, to 336 pikseli szerokości ekranu i każdy wiersz sprajta rozpatrujemy osobno jako niezależnie kompresowany ciąg.

Jest na sali jakiś spec od kompresji (wiem, że są ;p), który miałby jakieś pomysły w ramach burzy mózgów?

2

Tutaj dorzucę swoje 5 groszy, "co nie byłoby trudne do implementacji w FPGA?" chodzi tutaj głównie o 'koszt" zasobów niezbędny do implementacji. VBXE jest konstrukcją dosyć leciwą a jego zasoby, jak na dzisiejsze czasy, dość skromne :)

Mój jest ten kawałek podłogi ...

3

tak, to dobry pomysł pytać się wielbicieli Basica o kompresję spritów, jesteś nie z tej Ziemi Laoo

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

4 Ostatnio edytowany przez laoo/ng (2024-06-25 18:50:18)

Nie tylko wielbiciele BASICa zaglądają na to forum i różne mądre dyskusje tutaj już były. Jak nikt się nie znajdzie, to trudno. Jakieś tam swoje pomysły już mam.

5 Ostatnio edytowany przez tOri (2024-06-25 20:12:35)

Hej,

Tak myślę, że powinny być gdzieś dostępne sprzętowe rozwiązania. Przykładowo tylko: https://www.xilinx.com/products/intelle … oductspecs

Ale to tylko przykład. Możliwe, że gdzieś, ktoś ma gotowca za free?

tOri

edit:

https://souktha.github.io/hardware/runlenth/

artykuł: https://www.ijsr.net/archive/v9i3/SR20306192039.pdf

Różne różności dla Atari i nie tylko - przydatne, bądź nie ale i tak warto zajrzeć...
http://atari.myftp.org  Atari - Power without price and necessary elements with some sh*t onboard
https://reversing.pl SSL enabled site

6

@tOri, ja wywnioskowałem, że tu chodzi o nowy rdzeń do VBXE, stąd te ograniczenia. Więc tylko programowe
@laoo/ng: wydaje mi się, że wskazanym jest uderzyć bezpośrednio do Foxa lub XXL-a

Sikor umarł...

7

@Sikor - a ja zrozumiałem, że to ma być sprzętowy moduł dekompresora RLE do wrzucenia w FPGA.

tOri

Różne różności dla Atari i nie tylko - przydatne, bądź nie ale i tak warto zajrzeć...
http://atari.myftp.org  Atari - Power without price and necessary elements with some sh*t onboard
https://reversing.pl SSL enabled site

8

@tOri, ja się opierałem na tym:

laoo/ng napisał/a:

Kiełkowała mi od kilku lat idea zrobienia alternatywnego rdzenia do VBXE, który byłby bardziej dostosowany do typowych wyzwań stawianych przez gry i wygląda na to, że projekt ma szansę na materializację przy wielkiej i nieocenionej pomocy MatGuru.

Więc chyba jednak chodzi o rdzeń VBXE.
Wskazuje też na to to:

laoo/ng napisał/a:

Dekompresor tego jest zrealizowany sprzętowo i też tak samo "sprzętowo" (w FPGA) będzie musiało to być zrealizowane w VBXE.

Oraz odpowiedź MatGuru:

MatGuru napisał/a:

chodzi tutaj głównie o 'koszt" zasobów niezbędny do implementacji. VBXE jest konstrukcją dosyć leciwą a jego zasoby, jak na dzisiejsze czasy, dość skromne :)

Dla mnie jest to jednoznaczne, ale co ja wiem, nie potrafię czytać ze zrozumieniem... :D

Sikor umarł...

9

Sikor napisał/a:

@laoo/ng: wydaje mi się, że wskazanym jest uderzyć bezpośrednio do Foxa lub XXL-a

xd

10

OK.

Niech laoo/ng sprecyzuje ponieważ ten moduł RLE trzeba by wkomponować "sprzętowo" własnie w rdzeń VBXE :)
Zresztą - pytanie było o coś lepszego niż RLE - to wszystko kwestia dostępnych zasobów w FPGA no i zręcznego projektanta, hehe.

tOri

Różne różności dla Atari i nie tylko - przydatne, bądź nie ale i tak warto zajrzeć...
http://atari.myftp.org  Atari - Power without price and necessary elements with some sh*t onboard
https://reversing.pl SSL enabled site

11

to musi być nowy rdzeń niezależny od istniejących, ponieważ do istniejących nie ma możliwości dodać czegokolwiek z braku miejsca

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

12 Ostatnio edytowany przez laoo/ng (2024-06-27 06:16:40)

Hej.
Trochę niefortunnie wyszło, bo nie jestem mistrzem w pisaniu zwięźle. Może jakby pierwszy temat był w dwóch zdaniach, a nie na całą stronę, to byłoby jaśniej.
W skrócie chodzi o zupełnie nowy rdzeń do VBXE, który będzie robił trochę inne rzeczy i pomyślałem, że może ktoś ma w rękawie jakieś fajne pomysły, jak zmodyfikować format kompresji z Lynksa, aby było jeszcze fajniej. Jak nikt nie ma, to nie ma problemu, bo jakieś tam pomysły już mam. Dzięki za odzew!

Kiedyś czytałem o engine graficznym w GameBoyu, i jest on wprawdzie (na dzisiejsze czasy) prymitywny, ale też daje bardzo dobre możliwości - może jakieś twórcze rozwinięcie tego?
Wydaje mi się że jeśli chodzi o sprajty to najbardziej wypasny engine miało NeoGeo - może warto poszukac o tym informacji i zyskać jakieś inspiracje.

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

14

Dałoby się ciekawą pracę magisterską napisać analizując i porównując sposoby, w jakie była generowana grafika w konsolach 8 i 16 bitowych.
Przez 18 lat nikt nie wziął i nie napisał innego rdzenia do VBXE, każdy, który by się za to brał, miałby swoją wizję. Moja wizja jest rezultatem moich doświadczeń i przemyśleń i uważam, że jest dobra. Póki nie okaże się, że w VBXE zrobić tego się nie da, rewolucji na miarę "zróbmy NeoGeo" nie przewiduję, bo to zupełnie inna filozofia (no i NeoGeo swoją wypaśność zawdzięcza bardziej grubej rurze, którą lecą piksele z cartridge'a na ekran, a nie jakiejś finezji - a takiej rury w VBXE nie mamy).

15

to będzie coś na wzór ZX Next, razem z tytułem produkcji jest informacja jaki firmware trzeba wgrać aby tytuł zadziałał

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

16

VBXE ma kilka slotów we flaszu. Jeszcze nie wiem jak to będzie można najlepiej technicznie rozwiązać, ale tak, trzeba będzie raz wgrać alternatywny rdzeń do VBXE i się na niego przełączyć, żeby odpalić grę, która go potrzebuje (to czego nie wiem, to czy gra będzie mogła poszukać sobie tego rdzenia i przełączyć się na niego sama, czy użytkownik będzie musiał sam się na niego przełączyć przed odpaleniem gry, ale to technikalia do ogarnięcia później).

17

Na poczatku sie zastanawialem PoCo? Ale jak do VBXE w obecnej formie to ma sens.
Niewielki ale ma :D (moje zdanie)

Mam kilka pytan.

Czy do VBXE jest dostepne cokolwiek od czego mozna zaczac? Czy wszystko od zera trzeba? Czy moze na zasadzie Zrobmy burze mozgow, ktos to zlozy w calosc i nikt tego nie zobaczy w formie zrodlowej?

Jaki jest cel tej kompresji?
Trzymanie tego w RAM w formie rozkompresowanej (rozkompresowanie i zaladowanie do RAM), Czy raczej dekompresja w locie w razie potrzeby?

W.

"tatusiu zobacz, narysowałam tobie takie same coś jak na twojej koszulce" 
https://github.com/willyvmm/mouSTer
jmp $e477

18 Ostatnio edytowany przez solo/ng (2024-06-27 22:48:20)

willy napisał/a:

Na poczatku sie zastanawialem PoCo? Ale jak do VBXE w obecnej formie to ma sens.
Niewielki ale ma :D (moje zdanie)

Mam kilka pytan.

Czy do VBXE jest dostepne cokolwiek od czego mozna zaczac? Czy wszystko od zera trzeba? Czy moze na zasadzie Zrobmy burze mozgow, ktos to zlozy w calosc i nikt tego nie zobaczy w formie zrodlowej?

Jaki jest cel tej kompresji?
Trzymanie tego w RAM w formie rozkompresowanej (rozkompresowanie i zaladowanie do RAM), Czy raczej dekompresja w locie w razie potrzeby?

W.

Cala idea jest taka, aby (jak juz wszystko bedzie gotowe), kazdy majac minimalna wiedze asm/madp mogl sobie rysowac fajne sprity, majac viewport itd. Cel jest taki, ze nic takiej osoby ma nie interesowac. Wszystkie wczesniejsze shanigans, ktore powstawaly jak tworzylismy na Lynxie beda uzyte. Sprity beda spritesheetami w png i juz. Moga byc nawet 24bit. Automat dobierze najblizsze kolory i zaladuje do pamieci, a osoba piszaca gre/prodke zrobi ldx pox ldy pox lda sprite jsr rysuj , sta dziekuje.

Tak w uber tl;dr. Cel - ma byc tak prosto, ze majac demencje zakodzi sie fajna strzelanke. xd.

Co do kompresji - idea taka, aby dane spritow byly zawsze spakowane, a blitter w locie dekompresowal. Przy 4bitowych assetach  i ogolnie pixelowkach dobrze sie pakuje slownikowo. Osobe, ktora bedzie robila gre/itd nic ma nie interesowac - ma ladne sprity w png i tyle. A potem lda #SPRITES.enemies.hellcat jsr narysuj_mi_sprita i sie narysuje.

Planuje zrobic duzo przykladow, mockupow oraz pelnych produkcji, kazda bedzie publicznie dostepna.

19

rozmiar sprita będzie dowolny? jak ten system będzie rozpoznawał rozmiar jak dostanie PNG 'sprite sheet' z N-liczbą klatek animacji ? Aseprite pozwala generować 'sprite sheet' pionowe i poziome...

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

20 Ostatnio edytowany przez laoo/ng (2024-06-28 10:01:01)

willy napisał/a:

Na poczatku sie zastanawialem PoCo? Ale jak do VBXE w obecnej formie to ma sens.
Niewielki ale ma :D (moje zdanie)


VBXE ma już 18 lat (to już powoli retro bo jest starszy niż nasze Atari podczas rozkwitu sceny :)), więc próba tchnięcia w stary sprzęt nowego życia za pomocą świeżego firmware'u jest wg mnie jak najbardziej w duchu sceny.
Dodatkowo jest tego naklepane setki sztuk, więc może mieć to nawet wymiar dość praktyczny, jeżeli dałoby się tego użyć prościej.

willy napisał/a:

Czy do VBXE jest dostepne cokolwiek od czego mozna zaczac? Czy wszystko od zera trzeba? Czy moze na zasadzie Zrobmy burze mozgow, ktos to zlozy w calosc i nikt tego nie zobaczy w formie zrodlowej?

Nie potrafię odpowiedzieć na to pytanie, ale nie wiem, czy jest to witalne zagadnienie. Skoro przez 18 lat nikt się tym nie interesował, to dlaczego nagle teraz miałby być wysyp zainteresowanych? Na razie są wczesne prace nad pomysłem, o którym myślę sobie od paru lat, mam prototyp funkcjonalności w Altirrze (więc od razu będzie emulacja) oraz pracujemy z Mateuszem nad prototypową implementacją w MiSTerze, jak będzie z wciśnięciem tego co wyjdzie do VBXE to zobaczymy. Jak się nie uda, to nie będzie tematu :)

willy napisał/a:

Jaki jest cel tej kompresji?
Trzymanie tego w RAM w formie rozkompresowanej (rozkompresowanie i zaladowanie do RAM), Czy raczej dekompresja w locie w razie potrzeby?

Dekompresja jest w locie podczas rysowania sprajta. Szału nie ma, ale w zależności od sprajta kilkadziesiąt procent rozmiaru można być do przodu.

tebe napisał/a:

rozmiar sprita będzie dowolny? jak ten system będzie rozpoznawał rozmiar jak dostanie PNG 'sprite sheet' z N-liczbą klatek animacji ? Aseprite pozwala generować 'sprite sheet' pionowe i poziome...

To zależy od narzędzi. Mamy już jakieś narzędzie do robienia rzeczy na Lynksa, tutaj blitter będzie dość kompatybilny z tym Lynksowym, więc narzędzia projektujemy analogiczne. Tu jest mój program do konwertowania PNG do sprajtów Lynksowych, mam już wersję dla "nowego rdzenia VBXE". Można poczytać co on potrafi - jest projektowany na generowanie scen, które mają wspólną paletę. Rozmiar sprajta z grubsza dowolny. Można trzymać wiele klatek animacji poziomo.

21 Ostatnio edytowany przez tebe (2024-06-28 12:49:38)

coś czuję że Mortal Kombat wyjdzie na ten rdzeń :)

a kolizje sprzętowo przez VBXE? czy programowo przewidujecie? obecnie w przypadku detekcji przez VBXE paleta kolorów jest rozdzielona na kolejne sprity, ayby można było to sprzętowo realizować

no ale taki Mortal Kombat to bardziej przez hitboxy

p.s.
czy Wy nie knujecie z myślą aby zrealizować 'fillpolygon' jak ma to miejsce na Lynxi-e, przez 2 sprity trójkątne ?

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

22

tebe napisał/a:

a kolizje sprzętowo przez VBXE? czy programowo przewidujecie? obecnie w przypadku detekcji przez VBXE paleta kolorów jest rozdzielona na kolejne sprity, ayby można było to sprzętowo realizować

no ale taki Mortal Kombat to bardziej przez hitboxy

Doświadczenie pokazuje, że taki rodzaj wykrywania kolizji jest bezużyteczny. Sens mają tylko hitboxy.
Jeżeli starczy miejsca, to chciałbym dodać do rdzenia sprzętowy "akcelerator hitboxów" - trzymałoby się w pamięci VBXE tablice boxów i FPGA mogłoby wykryć kolizje pomiędzy wybranymi zestawami. Ale to zobaczymy ile się zmieści.


tebe napisał/a:

p.s.
czy Wy nie knujecie z myślą aby zrealizować 'fillpolygon' jak ma to miejsce na Lynxi-e, przez 2 sprity trójkątne ?

Na razie vanilla-prostokąty bez udziwnień. Lepiej żeby było szybciej niż fikuśniej. Ale można mieć z tyłu głowy, że goście od Lynksa zrobili potem 3DO ;)

23

Zwracam uwagę, że pisząc VBXE, mamy na myśli tylko i wyłącznie sprzęt VBXE w wersji 2 (FPGA, SRAM).
To będzie zupełnie nowy core z zupełnie innymi rejestrami i funkcjami.

Mój jest ten kawałek podłogi ...

Jeśli może to być kompresja stratna to może coś z rodziny S3TC się nada.

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

25

laoo/ng napisał/a:
willy napisał/a:

Czy do VBXE jest dostepne cokolwiek od czego mozna zaczac? Czy wszystko od zera trzeba? Czy moze na zasadzie Zrobmy burze mozgow, ktos to zlozy w calosc i nikt tego nie zobaczy w formie zrodlowej?

Nie potrafię odpowiedzieć na to pytanie, ale nie wiem, czy jest to witalne zagadnienie. Skoro przez 18 lat nikt się tym nie interesował, to dlaczego nagle teraz miałby być wysyp zainteresowanych? Na razie są wczesne prace nad pomysłem, o którym myślę sobie od paru lat, mam prototyp funkcjonalności w Altirrze (więc od razu będzie emulacja) oraz pracujemy z Mateuszem nad prototypową implementacją w MiSTerze, jak będzie z wciśnięciem tego co wyjdzie do VBXE to zobaczymy. Jak się nie uda, to nie będzie tematu :)

Martwi mnie to ostatnie zdanie .. Ja bym sie raczej skupil na implementacji celowej dla VBXE.
W moim pytaniu chodzi bardziej o to czy rdzen zostanie opubikowany w rodzaju jakiegos OpenSource.

Wracajac do samych algorytmow kompresji to sa one raczej FPGA unfriendly. I zostaly zaprojektowane go streamowego przetwazania danych i ciezko bedzie w tym wypadku wykorzystac zalety FPGA. Dodatkowo niezdefiniowany rozmiar sprita jest dodatkowym utrudnieniem. Jak ma byc latwe do uzycia to musi byc proste. Zdefiniowany rozmiar, albo ... kompilator do rdzenia ktory przygotuje bitstream do FPGA pod konkretne wymagania rozmiaru.

Sama dekompresja danych dosc powaznie zwieksza zapotrzebowanie na przepustowosc pamieci - jesli ma to byc dekompresja *inplace*.
Jeden strumien na dane wejsciowe(tokeny), prawdopodobnie drugi na dane nazwijmy je losowe(literale) i trzeci na zdekompresowane dane.

Dlatego bylo moje pytanie o cel kompresji.
Zeby zoptymalizowac proces, mozna by wydzielic staly bufor na sprity(staly bufor => staly rozmiar) i w chwili gdy mamy wolne pasmo w strumieniu z Ram (potrzebny tu bedzie arbiter) dekompresowac dane do sprajtow nastepnej ramki. A potem juz prosty blitter zrobi swoje.

Ot takie przemyslenia.
Mam ich nieco wiecej, ale nie bede wszystkich na raz pisal ;)

"tatusiu zobacz, narysowałam tobie takie same coś jak na twojej koszulce" 
https://github.com/willyvmm/mouSTer
jmp $e477