26

(128 odpowiedzi, napisanych Programowanie - 8 bit)

Sprawdziłem najnowszą wersję na najnowszym MADSie. W emulatorze działa. Na oko tak samo, ale jak policzyłem instrukcje to spadło z 3045851 do 2780943. Ostateczny test trzeba zrobić na prawdziwym Lynksie.

Zresztą ściagnij Felixa i podaj mu upkr_math.lyx za argument (albo zrób drag&drop) i zobacz. Jak w tym samym folderze co upkr_math.lyx będzie upkr_math.lyx.lua to wygeneruje Ci trace z dekompresji (w folderze roboczym, czyli teraz tam gdzie jest Felix.exe, muszę to zmienić na folder z obrazem cartridge'a). Tak, w skrypcie jest literówka, muszę to poprawić :)

EDIT: kod miał błąd - nie działał na prawdziwym Lynksie. Dodałem poprawiony niżej

27

(128 odpowiedzi, napisanych Programowanie - 8 bit)

Zrobiłem test dla Lynksa kompresując jakiś losowy obrazek z sieci, wygenerowałem trzy wersje: z pętlą, z tablicami oraz z użyciem sprzętowego mnożenia i prawdę mówiąc "na oko" te dwa ostatnie są bardzo zbliżone. Nie potrafię od ręki policzyć czasu, ale w emulatorze policzyłem wykonane instrukcje i wyszło mi:

loop: 5527257
table: 3172612
math: 3045851

Z tym, że wersję ze sprzętowym mnożeniem można jeszcze podrasować, ale to trzeba testować na prawdziwym Lynksie, do którego nie mam teraz dostępu.

Załączam źródła, obrazek i binarki, teraz skompiluje się wersja z pętlą, łatwo przestawić na wersję z tablicami, ale wersja z mnożeniem wymaga hakowania źródeł, bo faktycznie MADS nie potrafi tego skompilować.

28

(5 odpowiedzi, napisanych Programowanie - 8 bit)

Weź mi nie wspominaj o tej dekadenckiej manierze ;)

29

(5 odpowiedzi, napisanych Programowanie - 8 bit)

Za obliczenia odpowiada chip Suzy, który jest 16-bitowy. Wszystkie jego rejestry są 16-bitowe i mają tę samą właściwość - zapis młodszego bajtu zeruje starszy, ale nie jest to traktowane jako zapis do starszego bajtu, tylko jako zapis liczby 16-bitowej, gdzie starsze 8 bitów jest uzupełnione zerami. Zapis do A jest konieczny, gdyż w przypadku mnożenia pod zapis starszego bajtu pary AB podpięty jest start mnożenia. Z tego co widzę w unupkr jest poprawnie - najpierw zapis do D (co zeruje C), potem do B (zerując A) a na końcu do A startując mnożenie.

Fox napisał/a:

Czy te rejestry są też do odczytu?

Wszystkie rejestry matematyczne są też do odczytu, mają jednak specyficzne funkcje. Rejestry AB i CD służą do przyjmowania argumentów dla mnożenia, za to jest do nich zapisywany wynik dzielenia. Nigdy tego nie sprawdzałem, ale zakładam, że po wykonaniu mnożenia są w nich niezmienione argumenty - tak przynajmniej zrobiłem w emulatorze i żadna aplikacja do tej pory się nie wywróciła na operacjach arytmetycznych, więc chyba tak jest.
Co do szczegółów działania można poczytać emulator: zapis i odczyt rejestrów oraz same obliczenia

Jeszcze jedna rzecz - w przypadku mnożenia bez znaku i bez akumulacji (domyślnie jest to wyłączone, można to aktywować w rejestrze SPRSYS) mnożenie trwa 44 cykle 16 MHz. Odczyt dowolnego rejestru Suzy zajmuje minimalnie 5 + 4 + 4 + 9 = 22 cykle, a np operacja RMW zerostronicowa minimalnie 5 + 4 + 5 + 4 + 5 = 23, więc "INC $xx; LDA H" powinno wystarczyć, ale trzeba byłoby to sprawdzić. Tak jak pisałem w drugim temacie - znajdę wystarczająco czasu, to napiszę test.

30

(128 odpowiedzi, napisanych Programowanie - 8 bit)

Znajdę czas to sprawdzę czy i jak działa mnożenie na Lynksie.

"Urządzenie" ma już wymyśloną minimalną funkcjonalność. Jest już zaimplementowane na brudno w Altirrze jako kolejna wersja / alternstywa dla rdzenia FX dla VBXE. Jesteśmy w trakcie implementowania tej funkcjonalności jako modyfikacją GTIA w rdzeniu Atari800 w MiSTerze ze względu na wygodę developiwania. Jak uruchomimy, to znaczniemy przenosić to do docelowego VBXE. Jeżeli się to nie uda, to znaczy, że projekt był przestrzelony, bo te minimum, które zaprojektowałem, to serio minimum którego próba obcięcia jest bez sensu. Ale będę się tym martwił jeśli to nastąpi, na razie na podstawie tego co wiem, że jest w rdzeniach FX jestem nastawiony optymistycznie - dlatego w ogóle to robimy.

To, czy rdzeń będzie opublikowany jako OpenSource - tego nie wiem. Ani ja o tym decyduje ani nie mam też zdania jak w tym konkretnym projekcie powinno być, coś mi się jednak wydaje że nawet jakby to otworzyć to i tak nic by z tego nie wynikło - mam za dużo otwartych projektów na githubie, żeby wierzyć, że komuś zrobi to różnicę. Na pewno mogę Cię jednak zapewnić, że jeśli projekt się powiedzie, to zostanie opisany i każdy będzie mógł napisać sobie grę używając tego rdzenia.

Jeśli chodzi o algorytmy komoresji to nie chce wychodzić jednak zbyt dalego poza kompresję jaka już jest, czyli wzięty z Lynksa RLE, który jest bardzo miły dla przepustowości pamięci, bo pozwala na czytanie mniej bajtów niż trzeba zapisać w pamięci obrazu, więc wychodzi lepiej niż kopiowanie i więcej nie trzeba.

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

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.

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

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

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!

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.

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?

A tego właśnie nie wiedziałem, czy pierwsze wgranie emutosa jest flaszerem czy programatorem. Tylko flaszer ingeruje w obszar opisu wgranych TOSów, więc rzeczywiście przy pierwszym uruchomieniu będzie wyglądał na pusty. Dodatkowo błąd weryfikacji też nie uaktualnia tego wpisu (że też będzie pusty).
Mam nadzieję, że niedługo powstanie więcej software'u, ale mam teraz urwanie głowy z milionem innych rzeczy i jeszcze nie dałem rady do tego usiąść.

Tosster jest wielorazowego użytku. Możesz zaryzykować ;)

Wygeneruj sobie flaszer fabrycznego 1.62 i zaflaszuj na inny slot. Flaszer po starcie wydrukuje gdzie jest emutos a które są wolne.

Jakby pojawił się błąd weryfikacji, to możesz albo powtarzać aż się zweryfikuje albo zignorować bo to false negative przy odczycie zaflaszowanego rdzenia - soft jest do korekty.

Jeszcze jedno - teraz kabelek jest potrzebny bo nie dopisałem w software opcji przełączania rdzenia, trzeba resetem.

42

(12 odpowiedzi, napisanych Bałagan)

Nie może. USB-C to ikona nowiczesności. A bycie nowoczesnym oznacza używanie feminatywów.

43

(80 odpowiedzi, napisanych Zloty)

Ja miałbym bez sprzętu przyjechać? Z roku na rok nawet przywożę więcej!

44

(15 odpowiedzi, napisanych Programowanie - 8 bit)

Feature, który zmienia swoje działanie pomiędzy wersjami 1.7.9, a 1.8.0 to taki wątpliwy feature ;)

45

(15 odpowiedzi, napisanych Programowanie - 8 bit)

Fajne wykopaliska :)
Ja u siebie najbliżej dokopałem się do 1.7.6 i 1.8.0, a najdalej do 1.6.9.
A konkretnie chodzi o jakiś błąd, który był w 1.7.9?

MatGuru na discordzie szacował na 160 zł (nie wiem jak te wersje na 6 układów ale pewnie rząd wielkości się nie zmieni).
Gdzie i orientacyjnie: na Lost Party 2024

@Tori: MatGuru będzie sprzedawał gotowce do samodzielnego montażu.

Hej!
MatGuru nie ma tu konta, a skoro też jestem w to lekko zaangażowany, to wklejam info od siebie.

MatGuru napisał/a:

Podczas pewnej pogawędki na discord zostałem wkręcony w projekt wykonania przełącznika TOS do STe programowalnego z poziomu Atari.

Projekt udało się doprowadzić do końca. Urządzenie jest bardzo kompaktowe, po zamontowaniu, ponad nim do stacji jest prawie 1cm luzu, praktycznie nie wystaje też poza podstawki po eprom z TOS.

Przełącznik posiada 4 sloty po 256kb każdy, aktywny slot jest sygnalizowany za pomocą buzzera w sposób binarny :), czyli 2 tony niskie oznaczają slot0, wysoki i niski slot1, niski i wysoki slot2, 2 wysokie slot3.

Montaż urządzenia polega na wyjęciu kości eprom z TOS i zainstalowaniu w nich TOSSTer'a. Dodatkowo do prawidłowej pracy zaleca się podłączenie przewodu od przycisku RESET (rezystor R100 na mojej płycie). Na przełączniku jest zamontowany golpin pozwalający podłączyć w/w przewód.

Jest możliwa praca urządzenia bez tego przewodu, ale wtedy po włączeniu oraz przełączeniu TOS (jest to możliwe programowo z poziomu Atari) po sygnale z buzzera konieczne będzie naciśnięcie RESET żeby układ prawidłowo się uruchomił.


Podłączenie RESET do TOSSTer'a eliminuje tą niedogodność dodatkowo pozwalając na przełączanie TOS poprzez naciśnięcie i przytrzymanie przycisku RESET dłużej niż około 3s, wtedy buzzer zacznie cyklicznie odliczać kolejne TOS, puszczenie przycisku po usłyszeniu żądanego TOS (numeru slotu) spowoduje restart i uruchomienie Atari z wybranym TOS.

Dodatkowo ostatnio wybrany TOS (slot) zapisywany jest w pamięci flash i przy kolejnym włączeniu Atari jest ładowany.

TOS'y są przechowywane w szeregowej pamięci flash, która służy również do przechowywania konfiguracji układu FPGA (co dodatkowo umożliwia w przyszłości upgrade tej konfiguracji, czyli wgrywanie nowego firmware), podczas włączenia/przełączenia slotu, TOS z szeregowego flash jest ładowany do równoległej pamięci SRAM a następnie ta pamięć jest "podstawiana" do Atari jako TOS ROM i wykonywany jest reset (jeżeli jest przewód do automatycznie, jeżeli go nie ma to należy go wykonać ręcznie).


Oprogramowanie do flashowania slotów i firmware wykonał laoo/ng.
Zrobił to w ekspresowym tempie i na dodatek bez fizycznego kontaktu z urządzaniem, tylko na podstawie dokumentacji.
Zanim Inpost dowiózł mu paczkę z TOSSTer'em ja już programowałem swój egzemplarz :)

Magia. Wielki szacun.

Źródła znajdują się tutaj: https://github.com/laoo/TossterCommander

Na PC uruchamiamy TossTosser.exe gdzie jako parametry podajemy obraz TOS (256kb) który chcemy sflashować oraz nazwę pliku wyjściowego.
Wygenerowany plik .tos zawiera w sobie flasher oraz obraz TOSu. Po uruchomieniu go na Atari flasher pyta do którego soltu chcemy wgrać nasz obraz. Wyboru dokonujemy cyframi od 1-4 co odpowiada slotom od 0-3.
Dodatkowo flasher wyświetla co aktualnie znajduje się w każdym ze slotów.

Obecnie projektuję wersję płytki do ST z 6 podstawkami pod TOS, będzie też ona dostosowywane do pozostałych płyt ST.

Gdyby ktoś był zainteresowany przełącznikiem to proszę o kontakt, uwzględnię to przy kolejnym zamawianiu PCB.

Poniżej wrzucam kilka zdjęć, oprogramowanie TossToser.exe oraz dwa gotowe emutos do przetestowania w językach czeskim i greckim :)

Od siebie mogę TOSSTERa gorąco polecić. Kawał dobrej inżynierii!
Instalacja prosta, jak tylko ktoś potrafi przylutować kabelek (mi to zajęło tylko jeden wieczór ;p), ale MatGuru wspominał coś o możliwej opcji z klipsem, żeby zaczepiać się o ten rezystor bez konieczności lutowania, więc wtedy to całkiem solderless lajcik.
Za flaszery odpowiadam ja, więc jakieś uwagi proszę zgłaszać jaki issue na githubie. Na razie kompiluje się na Windowsie, ale przy odrobinie samozaparcia można zrobić wersję na lin/mac trzeba tylko zrobić skrypt dla linkera, bo flaszer ma wbudowany obraz programu dla ST, który na Windowsie jest po prostu jako zasób. Albo można napisać prosty skrypt w pythonie czy czymkolwiek bo wszystko co program robi to zastępuje łatwo zauważalny ciąg 256k znaków na obraz TOSa oraz następne 32 bajty na opis.

https://i.imgur.com/VbJbYAi.jpeg
https://i.imgur.com/Bntw4N6.jpeg
https://i.imgur.com/qA6PLmb.jpeg
https://i.imgur.com/qiX8Rnj.jpeg
https://i.imgur.com/GSghEit.jpeg
https://i.imgur.com/3SHIjqj.jpeg
https://i.imgur.com/kLrB8K2.jpeg
https://i.imgur.com/Fmgl8sC.jpeg
https://i.imgur.com/oKLVl1E.jpeg
https://i.imgur.com/CwhzcSw.jpeg
https://i.imgur.com/fQzNiap.jpeg
https://i.imgur.com/iogeX4N.jpeg
https://i.imgur.com/ONQYZOk.jpeg
https://i.imgur.com/dSDETlq.jpeg

49

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

Kiedyś kupowałem wkręty do ST: http://www.atari.org.pl/forum/viewtopic … 23#p280623
Te mniejsze pasują do obudowy XE

50

(6 odpowiedzi, napisanych Konsole)

Teraz na rynku są dwa flashcarty:

https://www.retrohq.co.uk/products/atar … -cartridge
https://bennvenn.myshopify.com/products … -pre-order

W praktyce oba dobra, choć na pierwszym działają nasze demka a na drugim nie (ale próbuję go rozgryźć, może coś się uda).

ekranik polecam od tego drugiego pana:

https://bennvenn.myshopify.com/products … ps-lcd-kit

Ekranów McWill (jeśli jeszcze można je dostać) nie polecam, bo mam i jednak jakościowo gorsze. BennVenn jest o klasę wyżej teraz.

Można poszukać resellerów bo koszty transportu mogą być zabójcze.