1 Ostatnio edytowany przez laoo/ng (2021-10-31 21:20:16)

Tak jakoś się złożyło, że wkręciłem się trochę w Lynksa. Fajna konsolka, z fajnymi możliwościami, a w środku wciąż 6502 :)
Jedyny problem, że doczekała się jednego, jedynego emulatora i to napisanego 25 lat temu, którego jakość mógłbym ocenić może lekko powyżej Xformera (ktoś jeszcze pamięta te cudo?).  Napędzany frustracją, postanowiłem wykorzystać lockdown covidowy, żeby spróbować swoich sił w temacie i sprawdzić, jakie byłoby to trudne, żeby napisać od zera własny emulator tej konsolki.
W efekcie w pół roku kodowania (z długimi przerwami, bo zacząłem w maju 2020) zrobiłem coś, co można uznać, że ma status pre-alfy i roboczą nazwę Felix (skrót od Felis lynx).
Projekt trzymam na githubie: https://github.com/laoo/Felix
Są tam też releasy na razie dla Windowsa: https://github.com/laoo/Felix/releases

Emulator nie ma póki co UI, a odpala się go albo ze ścieżką do pliku lnx/lyx/o jako argument, albo robiąc drag&drop takiego pliku na okienko emulatora. Klawiszologia to strzałki, X, Z, 1, 2, 3.

Póki co jest tylko na Windowsa, bo na tym się znam i wymaga DX11, bo jestem leniwy, ale rdzeń emulacji jest w czystym C++20 i nie powinno być problemów z przeportowaniem na cokolwiek (wystarczy napisać front-end, który dostarcza stan klawiszy i odbiera sample audio i klatki video). Na pewno chciałbym zrobić przynajmniej wersję w WebAssembly odpalaną w przeglądarce (a Good Enough Emulator przeciera szlaki).
Jednak zanim to nastąpi, chciałbym ustabilizować emulację, bo nie wszystko chodzi poprawnie. Wiem, że w Polsce miłośników Lynxa można policzyć na palcach jednej ręki (stąd w pierwszej kolejności założyłem już wątek na Atari Age), ale jeżeli komuś chciałoby się odpalić emulator, trochę się pobawić i wrócić z jakimś (konstruktywnym) feedbackiem, to byłbym wdzięczny i zapraszam do dyskusji.

2 Ostatnio edytowany przez Cyprian (2021-10-31 23:50:50)

Dobra robota.

Pierwsze co sprawdziłem to "Unlit" no i działa :)
Czy to oznacza że GameDrive jest tutaj emulowane?

Przydał by się efekt ekranu Lynxa oraz drugi ze scanline,

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

3

Cyprian napisał/a:

Pierwsze co sprawdziłem to "Unlit" no i działa :)

Co za przypadek? ;)

GameDrive emulowany jest póki co tylko do odczytu, bo tylko tyle potrzebowaliśmy.
Detale kosmetyczne zostawiam na później - na razie kuleje wiele innych istotnych rzeczy (chociażby brak UI).

4

Bardzo ciekawy projekt. Gratki! I na Lynx'a przyjdzie kiedyś u mnie czas;)

Maciek
--------
Atari 65XE + Ultimate 1MB + Stereo + SIO2SD | Atari 520STE + 4MB + UltraSatan | Atari Falcon 030 + CT60e + 14MB ST + 256MB TT + 68882  + CF + Netusbee | Amiga 500 + 1MB + Gotek | Amiga 600 + 2MB Chip + 8MB Fast + CF

5 Ostatnio edytowany przez Cyprian (2021-11-01 12:29:57)

@laoo/ng

dla mnie GUI teraz jest ok, więcej nic nie trzeba.
Obsługę efektu LCD/scanline można dodać np skrótek klawiszowym.

Jeszcze jedna rzecz by się przydała, dobry graficzny debugger, taki w stylu Steem, plus funkcjonalność profilowania z Hatari.

A jak wygląda kwestia wydajności procesora - Lynx vs Felix?

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

6

Cyprian napisał/a:

Jeszcze jedna rzecz by się przydała, dobry graficzny debugger, taki w stylu Steem, plus funkcjonalność profilowania z Hatari.

No to byłoby ekstra, jakby  ktoś coś takiego dopisał.

Cyprian napisał/a:

A jak wygląda kwestia wydajności procesora - Lynx vs Felix?

Chodzi Ci o Handyego? Podejrzewam, że Felix spala trochę więcej CPU, bo z założenia ma być cycle-exact. Aczkowiek obaj zużywają u mnie w okolicy 1% CPU, więc nie wiem, czy jest sens zawracać sobie tym głowy.

7

laoo/ng napisał/a:

Chodzi Ci o Handyego? Podejrzewam, że Felix spala trochę więcej CPU, bo z założenia ma być cycle-exact. Aczkowiek obaj zużywają u mnie w okolicy 1% CPU, więc nie wiem, czy jest sens zawracać sobie tym głowy.

Chodzi o emulowane środowisko. Np z tego co pamiętam to ten sam kod na Handy wykopuje się trochę szybciej niż na Lynxie.

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

8

To jest dość delikatne zagadnienie. Wewnętrzne sprawy Lynxa są bardzo mało poznane. W sumie główna nadzieja, że ktoś dotrze do RJ Micala i dostanie od niego jakieś papiery jak to zostało zaprojektowane. Podstawowe dwa zagadnienia, jakie składają się na nieprecyzyjną prędkość to:
1. Cykl 6502 (czyli cykl dostępu do szyny) może trwać 4 ticki zegara albo 5. 5 Trwa jeśli pamięć jest adresowana w pełni, a 4 jeśli adresujemy wewnątrz aktualnej strony. Mikey ma zaszytą jakąś logikę, które decyduje kiedy jak adresować. No oczywiście dokumentacja mówi, że zrobili to jakoś tak żeby było fajnie. Osobiście podejrzewam, że to radosna twórczość i już nikt nie pamięta jak. Żeby to odtworzyć, trzeba napisać serię testów, które sprawdzają ile trwa cykl dostępu do szyny w różnych scenariuszach. Póki co Felix ma to zrobione "mniej więcej" na zasadzie, że jeśli adresujemy po sobie dwa kolejne adresy, to wtedy 4, a jak jest "random access" to 5 (tak jak robi to w sumie ARM).
2. Prędkość blitowania sprajtów to prawdziwa niewiadomo. Ja oparłem swoje timingi na założeniu, że logika Suzy "nic nie trwa" a trwają tylko dostępy do pamięci. Podejrzewam, że emuluję to trochę za szybko. Ale znowu - bez napisania testów i pomiarów nie wiadomo ile to powinno trwać. A wpisywanie opóźnień z palca, żeby się mniej więcej zgadzało nie chcę. Nie wiadomo też jak jest z przerywaniem działania Suzy (przerwanie CPU potrafi przerwać rysowanie sprajta, które można później kontynuować). Hady nie miał przerywania wcale (tam cały sprajt rysował się w całości, stąd rysowanie sprajtów tam jest dużo szybsze niż w rzeczywistości), ja zaprogramowałem przerywanie przy dowolnym dostępie do pamięci, prawda jest gdzieś po środku, a gdzie, to nie wiadomo.

Reasumując nie robiłem jeszcze porównań prędkości działania. Prędkość CPU powinna być dość wierna, Suzy mniej wierna, ale możliwe, że całość jest sumarycznie bardziej wierna niż Handy. Ale to tylko moje przypuszczenia i mogę się mylić.

9

Hej,

Ogólnie wielkie brawa. W 2014 pomogłem popełnić to małe coś (https://www.pouet.net/prod.php?which=64409) i walka z Handy a szczególnie z dzwiękiem to była masakra. Tu dzwięk chodzi super! Co więcej, Sage (głowny koder) dodał na końcu (za wyświetlanym info textem a przed zapętleniem) małą niespodziankę, która miała wyświetlać się tylko na real-hardware - a tu działa :) Z drugiej strony, wektorowy obiekt Atari tutaj jeszcze się kwasi, na Handy chyba chodził ok.

Na pewno po solidne wsparcie odezwał bym się do Sage'a i 42Bastian (chyba: 42Bastian Schick, http://www.monlynx.de/lynx/). Obaj panowie z wielką wiedzą.

To tyle feedbacku ode mnie. Gdyby finalnie był jeszcze jakiś sensowny debugger, to byłby CZAD.

3mam kciuki za projekt, bo bardzo brakuje nowoczesnego emu dla Ryśka!

10

Dzięki!
"Walka z Handy" była jednym z motywatorów do podjęcia tego wysiłku :)
Problem z obiektami 3d jest najprawdopodobniej związany z jakimś nienamierzonym jeszcze bugiem z arytmrtyką na Suzy, bo samo "sprzętowe" rysowanie trójkątów jest ok (st-niccc działa).
Z 42BS jestem w kontakcie i działamy. Debugger teraz piszę bardziej od strony skryptów w lua, bo taki z GUI to jednak spore przedsięwzięcie (szczególnie gdy nie ma GUI i nie ma jeszcze komu go napisać)

11 Ostatnio edytowany przez sachy (2021-11-03 21:11:43)

Co do arytmetyki Suzy nie mam pojęcia nawet co zasugerowć, ale pewnie z czasem udoskonalisz sprawy i będzie git.

GUI do debuggera/disasemblera/monitora w zasadzie nie jest niezbędne. W sumie wystarczył by jakiś w trybie znakowym. Amigowy Action Replay tak działał i rządził :) Jak zrobisz podstawowy freezer i kod będzie dostępny to na pewno ktoś pokusi się o rozszerzenie funkcjonalności. Freeze/go, display/edit reg, display/edit/load/save mem, search, single step i w zasadzie dużo więcej nie trzeba :)

12

@laoo/ng
jakieś skróty klawiaturowe są teraz obsługiwane?
Jeśli chodzi o Lua, to czy oprócz poniższego można jeszcze coś skryptami zarządzić?

lnx = "full/path/to/image/file";

Log{ path = "full/path/to/trace/file.log" };
Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

13

Strzałki, z, x, 1, 2, 3.

Jeszcze jest f10 pause i f9 unpause, ale jest coś zbugowane.

Muszę zrobić stronę wiki na klawiszologię. Mam też issue żeby było konfigurowalne.

Do opisu lua też dodam wiki

14

laoo/ng napisał/a:
Cyprian napisał/a:

Pierwsze co sprawdziłem to "Unlit" no i działa :)

Co za przypadek? ;)

GameDrive emulowany jest póki co tylko do odczytu, bo tylko tyle potrzebowaliśmy.
Detale kosmetyczne zostawiam na później - na razie kuleje wiele innych istotnych rzeczy (chociażby brak UI).

szukam dokumentacji GameDrive, jakie ma funkcje i jak z nich korzystać. np jak ładować pliki. Miałbyś cośtakiego?

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

15

Zasadniczo API jest te samo co w starym LynxSD, tylko funkcja inicjalizacji może być pusta. GD ma tylko inne timingi - pomiędzy operacjami trzeba trochę poczekać (zapętlenie X od 0 do 255 u mnie wystarczało).
Dokumentacji jako takiej nie ma, ale są źródła np te i te. Można użyć albo przepisać sobie na asembler (ja przepisałem).

16

dzięki

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

17

Jest nowa wersja Feliksa. Sporo zmian, więc skok na wersję 0.5.0

Wspominam, bo jest GUI, można przekonfigurować sobie klawisze, użyć game-pada i pozmieniać konfigurację emulatora. Jeszcze sporo roboty, ale nie jest już taki bardzo siermiężny jak był.