To czy coś jest emulatorem czy nie to dobra rozkmina dla filozofów.
Dla użytkownika końcowego liczy się kilka rzeczy
1. kompatybilność programowa z oryginalnym systemem
- czy programy wykonują się tak samo
- czy piksele są rysowane w taki sam sposób
- czy dźwięk brzmi autentycznie
2. kompatybilność sprzętowa z oryginalnym systemem
- jakie porty udostępnia
- jakie ekrany można podłączyć i czy obraz wygląda tak samo
- jakie urządzenia wejścia HID można podłączyć
3. czas reakcji emulowanego systemu na interakcję użytkownika
re. 1
Emulatory ze względu na moc obliczeniową zazwyczaj mają problemy kompatybilności wynikające z tego że obraz nie jest składany piksel po pikselu wykonując za każdym razem wszystkie operacje jakie robi emulowany system. Dla innych układów które mają zegar też wszystko powinno być wykonywane cykl za cyklem. Zamiast tego robione są pewne uproszczenia np. jeśli mamy system który ma sprajty i spodziewamy się że może ktoś zmienić coś podczas hblank to można w pewnym momencie np. pod koniec hblank-u wziąć stan rejestrów i na tej podstawie narysować linię. Większość gier będzie działała dobrze z taką optymalizacją a emulator będzie działał na słabszym systemie. Może się jednak okazać że jakaś gra zmienia coś podczas rysowania linii i to nie będzie odzwierciedlone.
Tego typu problemy są w emulatorach. Emulowanie wszystkiego w np. SNESie z rozdzielczością co piksel daje emulator który może się okazać potrzebuje procesora ponad 3GHz. I nie Pentium 4 a jakiegoś Core. Można natomiast zoptymalizować emulator aby wykrywać pewne rzeczy lepiej i nie próbować robić wszystkiego na brute-force. Tutaj może to zadziałać ale może się okazać że jakiegoś typu kombinowania programisty nie wykryje.
FPGA z drugiej strony zawsze wszystko robi cykl co cykl. Nawet jak jest kilka układów z różnymi zegarami to każdy jest odtwarzany co cykl. Zmienia to też sposób pisania kodu i effort zamiast iść na 'jak to sprytnie zoptymalizować' na 'jak to w ogóle mogło być zaimplementowane'. Gdy w MISTerze ktoś wykryje że w jakiejś grze piksel się nie zgadza w jakiejś grze (tak, nawet jedne piksel

) to siada developer i np. przestawia kolejność operacji aby ogólnie wynik był taki sam ale w przypadku jakiegoś race condition wynik był taki że ten piksel zgadza się z prawdziwym sprzętem.
Projektując układ fizycznie czasami zachodzi potrzeba dodania czegoś do układu albo poprawienia błędu i tutaj nie było tak że sobie inżynier dopisuje linijkę kodu a program mu zsyntezuje z tego układ w pół godziny. Jakiekolwiek zmiany wymagające poprzestawiania bloczków w układzie to miesiące żmudnej pracy. To jest później widoczne w grach. I jeśli nawet ten piksel co się nie zgadzał jest poprawiany tak aby właśnie efekt końcowy wyglądał na artefakt (tj. wcześniej gra wyglądała dobrze i się próbuje ją 'zepsuć') to się dodaje ten artefakt. To żmudny proces ale tam ludzie siedzą i dodają takie zmiany. W emulatorach zresztą też tylko jeśli chodzi o emulatory to pewne rzeczy są praktycznie niemożliwe do odtworzenia właśnie ze względu że nikt nie emuluje wszystkiego co cykle zegara a raczej używa optymalizacji aby emulator mógł być uruchomiony na typowym komputerze. Dzisiaj są to szybsze komputery niż np. 20-25 lat temu a same emulatory miały więcej czasu na dopracowanie więc i jakość emulacji jest lepsza. FPGA za to ogólnie cieszy się lepszą opinią jeśli chodzi o dokładność w przypadku tego typu dziwnego zachowania się gier wynikającego z działania oryginalnych układów.
re. 2
Emulator emuluje wszystko i nie ma portów. FPGA często są wynikiem prac nad konsolami FPGA gdzie używa się oryginalnych urządzeń we/wy czy źródła programów. Do tego stopnia że specjalne flash carty które używają najdziwniejszych workaroundów (np. zapis stanu gry) działają. Nie wszystkie wsady dla MISTera miały taką genezę ale technologia na to pozwala. Sam sposób pisania wsadów pozwala na to aby się zwyczajnie "wpiąć" w jakieś sygnały i wyprowadzić je na port I/O. MISTer ma opcje podłączenia oryginalnych padów/joyów i innych akcesoriów.
Odnośnie obrazu to domyślnym zazwyczaj wyjściem dla którego programuje się wsady to wyjście RGBS tj. jak mamy np. Amigę to zakładamy ze będzie podłączona do monitora/telewizora 15KHz i wyjście ma zachowywać się dokładnie tak samo jak te z prawdziwej Amigi. I tak właśnie jest. Cykl zegara za cyklem zegara wszystko co robiłby oryginalny układ na wyjściu video jest tak samo tutaj odtwarzane. Wszystkie dziwne tryby video działają tak samo.
Emulator natomiast musi złożyć użyteczny obraz tj. bitmapę z tego co robi emulowany system. Potem to sobie można wyświetlić tam gdzie się chce np. nawet monitor 15KHz. Ale jak ustawię sobie tryb 288 linii w 50Hz to to jest coś z czym emulator musi pracować.
re. 3
Emulator zazwyczaj tworzy bitmapy klatka po klatce i tak wysyła do systemu (np. Windows, Android, itp). Podobnie składa dźwięk w bloczki i później całe bloczki wysyła do systemu. To wynika z ograniczeń systemów które oczekują klatek i bloczków dźwięku ale i z tego że programy muszą walczyć o czas procesora a mając więcej czasu na przygotowanie outputu jest duża szansa że się wyrobią ze wszystkim. Z tego też powodu że tam jest walka o czas i potrzebne jest więcej czasu na wszystko to domyślnie emulatory wręcz buforują więcej niż jedną klatkę obrazu. To prowadzi natomiast do opóźnień w wyświetlaniu. Naciśniesz przycisk skakani a Mario odczeka cierpliwie 2-3 klatki (po 16.6ms każda) na zaczęcie animacji skoku. Podobnie dźwięk będzie trochę opóźniony.
FPGA robi wszystko w real-time. Program który czyta stan np. paletki (takiej jak z Atari 2600) i rysuje kropkę (np. ustawia sprite w tej pozycji) oddaloną od lewej krawędzi o tyle pikseli ile jest wychylenia paletki jak zaczniesz nagrywać kamerą z bardzo dużą ilością klatek na sekundę i zmieniać losowo ustawienie na potencjometrze wykaże że na FPGA masz dokładnie takie same opóźnienie jak na prawdziwym Atari 2600. Oczywiście podłączasz ten sam kontroler i tu i tu. Na emulatorze nawet jak podłączysz jakoś tą paletkę i uruchomisz taki test to będzie opóźnienie nie na zasadzie że w następnej linii jest sprajt już odświeżony tylko będą pionowe linie (tak wysokie jak częstotliwość odczytu stanu potencjometra - lub całkowicie pionowe jeśli emulator w sam czyta stan tylko raz na klatkę) które reagują z opóźnieniem liczonym w klatkach.
Oczywiście emulator mógłby być tak napisany aby próbował liczyć wszystko na bierząco. Nie jest jednak możliwe uzyskanie efektu jak na FPGA tj. całkowicie bez opóźnień. Samo z siebie w ogóle próba zrobienia czegoś takiego byłaby programistycznym koszmarem który skończyłby się szaleństwem programisty

Systemy operacyjne zwyczajnie nie zakładają że ktoś będzie składał obraz linia po linii w czasie rzeczywistym. Tam są zawsze bufory i składa się obraz w buforach a potem daje systemowi całą klatkę.
Ale ot nie jest nawet aż taki problem. Dobrze napisany emulator na porządnym sprzęcie z szybki monitorem np. HDMI 2.1 ma na tyle zapasu i możliwości dostosowania prędkości wyświetlania że w grach opóźnienie będzie minimalne, poniżej jednej klatki. Problem jest tylko taki że tego typu aspekty nie są priorytetem. Tj. developer emulatora skupia się na poprawności emulacji a nie aspektach wyświetlania. Trochę lepiej jest dzisiaj bo są całe duże projekty które mają specjalne API dla emulatorów a rysowaniem zajmują się same. Tutaj gwarancji małych opóźnień nie ma a już szczególnie na każdym systemie (komputerowym powiedzmy) ale jest trochę lepiej i możliwości są aby na tyle ustawić emulatory aby przynajmniej te opóźnienia nie było za bardzo widoczne.
W FPGA za to jakakolwiek próba dodania opóźnień jest koszmarem programistycznym bo trzeba by specjalnie dodawać obsługę pamięci aby tam wrzucić bufor pamięci aby tam buforować klatki. Prościej jest cykl do cyklu w czasie rzeczywistym robić to co prawdziwy sprzęt by robił i tak też dzięki temu nie ma żadnych opóźnień.
Odnośnie dźwięku to w FPGA dźwięk jest składany jako stan wychylenia membrany cykl do cyklu i tak też trafia do prostego 1-bit DACa ΔΣ
BTW.
W FPGA takie zero zero opóźnień na 100% działa mając analog I/O board.
Używając HDMI sprawa się komplikuje o tyle że dochodzi problem buforowania audio. Tj. będzie lekkie opoźnienie w dźwięku. Zdaje się HDMI audio wysyła bufory dźwięku co klatkę obrazu. Oczywiście urządzenia wejściowe mogą mieć dalsze bufory.
Jeśli chodzi o video to można nie skalować obrazu i wtedy jest 1:1 to samo co z wyjścia VGA/RGB. Jak używa się skalera to są 3 tryby działania
1. buforowanie całych klatek - coś jak to jak działają skandoublery Indivision - to jest tryb kompatybilności. Ustawiasz tryb video np. telewizyjne 1080p i działa na każdy, telewizorze
2. buforowanie całych klatek ze zmianą zegara HDMI aby dopasować prędkość klatek - tutaj klatki dalej są buforowane ale przetaktowany jest zegar HDMI aby uzyskać płynny obraz. Kompatybilność jest gorsza niż trybu 1-szego bo tutaj już wyświetlacz musi obsługiwać tak przetaktowany sygnał. Monitory raczej nie mają problemów ale TV już mogą mieć. Czasami nie ma obrazu albo ma artefakty (np. u mnie na plaźmie) a czasami obraz jest ale wyświetlany z częstotliwością jakiej TV oczekiwał tj. on sobie buforuje klatki sam
3. buforowanie pojedynczych linii wraz ze zmianą zegara HDMI - tak jak w poprzednim trybie ale nie buforuje się całych klatek. W zasadzie kompatybilność powinna być taka sama jak poprzedniego trybu. Poprzedni tryb ostał się z historycznych powodów i dla ewentualnego debugowania bo bywają systemy które mają np. nierówną długość linii i one mogą lepiej działać w trybie 2 na niektórych wyświetlaczach.
W tym ostatnim trybie podobno ma być do chyba 3 linii opóźnienia niezależnie od rozdzielczości ekranu, odtwarzanego systemu i trybu skalowania. Ja w to nie wierzę bo za dużo analizowałem ten temat i mi się to zwyczajnie nie widzi. Zakładając że zrobili to optymalnie to będzie tych linii raczej na tyle niewiele że opóźnienie będzie liczone w pojedynczych milisekundach i daleko do nawet połowy czasu klatki.
Tutaj test z paletką który opisałem wcześniej na oko wyglądałby że działa tak samo ale można by wyłapać drobne opóźnienia szybką kamerą. Oczywiście testujac na odpowiednim wyświetlaczu który sam nie daje laga. Acha, i można też użyć prostego scan-doublera zamiast skalera i tutaj opóźnienie to faktycznie jedna-dwie linie ale wtedy z rozdzielczości systemu robi się zawsze 2x rozdzielczosć. Na CRT działa to świetnie i na dużej części monitorów LCD też. Gorzej telewizory... choć tryb 480p czy 576p to w zasadzie 2x 480i / 576i więc kompatybilność nie jest tragiczna.
---Suma sumarum, tl;dr---
FPGA i emulacja programowa są 'tym samym' tylko jeśli chodzi o to że oba rozwiązania są efektem inżynierii wstecznej bazującej na dokumentacji i obserwowaniu efektów działania oryginalnych układów. Za to pod względem technicznego działania to coś zupełnie innego. Inaczej programuje się emulator i inaczej się go debuguje. Pewne problemy kompatybilności emulatorów jest rozwiązać trudniej podczas gdy na FPGA jest prościej. Stworzenie wsadu FPGA wymaga innej wiedzy i trochę innego podejścia tj. należy zastanowić się nad tym jak działał sprzęt i z czego może wynikać dana różnica w efekcie działania. W emulacji raczej dodaje się workaroundy na efekt działania i tak masz w nich często specjalne tryby kompatybilności. Samo to sprawia że FPGA jest bliżej działania oryginalnego sprzętu.
Pod względem efektu dla użytkownika o ile nie ma problemów z kompatybilnością softwareową to FPGA daje dokładnie takie same doświadczenie jak oryginalny sprzęt tj. zero opóźnień. Jeśli chodzi o skaler to MISTer daje podobne możliwości i opóźnienia co prawdziwy sprzęt podłączony do zewnętrznych skalerów takich jak OSSC czy RetroTink
Tak więc... można sobie zrównywać FPGA z emulacją programową ale warto by się zastanowić czy nie robi się z siebie kretyna. Jak ktoś wybiera FPGA ze względów zalet jakie opisałem a my ciągle uporczywie piszemy że to zwykły emulator bo dla nas liczy się tylko czy to Amiga czy !Amiga a pomija się całkowicie kwestię użytkowe to właśnie wygląda się na niewyedukowanego idiotę.
ps. Acha, i jeśli chodzi o nowoczesne ekrany to zdecydowana większość użytkowników prawdziwej Amigi ma większe opóźnienia i gorszą jakość obrazu niż gdyby podłączyli MISTera do tych samych ekranów. Amiga -> takni skaler (np. wbudowany w telewizor/monitor albo za 100zł za allegro)-> monitor ma znacznie większego laga niż MISTer -> monitor