16. 10. 2019

Emulácia: SW versus HW


Žiadne retro, prudko progresívny rock@roll. Kúzlo FPGA. Aj váš AMD Ryzen alebo i9ka si v prototypovom štádiu prešiel touto fázou a je možné ju použiť aj ako definitívu. Ale poporiadku. ZX Spectrum Next  - oficiálna kickstarter stránka. Speccy, ZXS, 48K alebo "gumák" je archaický stroj, ktorý sa nikdy nemal stať herným gigantom, zakladateľom iks herných žánrov, nesmrteľnou legendou ale zadarilo sa a prerazil. Košatý príbeh, nie však dnes. Dnes sa totiž snažíme tuto mašinku zachrániť pre večnosť tak, že ju implementujeme do FPGA v podobe ZXN alias ZX Spectrum Next, lebo viete, všetky tie viac ako 35 rokov staré matičné dosky, čipy, kondenzátory, rezistory majú svoju ohraničenú životnosť.

FPGA /Field programmable gate array/ - po slovensky pole logických členov programovateľné užívateľom nie je nič iné ako všeobecný "procesor" bez identity. Ak doňho nenahrajte HW konfiguráciu príslušného čipu je ničim, ak to urobíte môže byť hocičím. Motorola CPU pre amigu, DSP atari falcona, zvukovka SNESu, ten 8 jadrový intel alebo celé to naše ZX Spectrum. Geniálne a reprogramovateľné. Reprogramovateľné a teda si danú HD konfiguráciu ladíme do halelúja. A pretože ZX Spectrum Next je FPGA projekt, tak presne to aj urobíme. Ideme sa v tom vŕtať a vylepšovať. Pokec hlavne o grafike.

Originálne ZX Spectrum – to iba jedno grafické rozlíšenie 256x192 pixel, paleta s 15 farbami. Každý pixel obrazovky však nemôžu mať slobodne jednu z tých pätnástich, namiesto toho je frame rozdelený do 32x24 buniek, každá 8x8 pixel, kde každý tento „atribút“ môže mať naraz v tomto štvorčeku iba 2 farby, ak tam skúsite dať tretiu, tak premaže jednu z tých dvoch a vyzerá to hrozne. Matematicky ide o 6144 bajtov pre pixel grid a 768 bajtov pre „farbu“ a máte video frame v jednej 8KB mem banke. RAM bola vtedy veľmi drahá. Geniálne, rýchle a povestné atribútové kolízie ako bónus.

Iba jedna vrstva grafiky, žiadne HW sprajty, žiadne scroll registre, teda zabudnite na super plynulý HW skrolling po X/Y osi či diagonále, žiadne DMA, blitter, copper, proste nič. Všetko ťahá ako krava pluh softvérovo 8 bit Zilog CPU na 3.5Mhz a je neuveriteľne veľmi náročené z toho dostať dobrú farebnú grafiku bez artefaktov a s aspoň 12.5fps skrolingom, teda ¼ PAL 50Hz frame času. Grafiku by som skôr definoval ako tile-map based, než bitmap based. Vysvetlíme neskôr.

ZX Spectrum Next /specnext/ – jedna z prvých verzií jeho nového grafického FPGA jadra priniesla ďalšiu vrstvu grafiky nazvanú Layer 2 /legacy mód nech je Layer 1/. L2 je plne bitmapová mapa, žiadne bitplán blbosti ala amiga, full frame veľkosti 256x192 pixel s 256 paletou, kde každý bod môže niesť ľubovoľnú farbu z tejto 8 bit palety. Z 6912 bajtov pôvodnej grafiky je však zrazu 49 152 bajtov /staré speccy gumák má presne toľko pamäte pre všetko: kód, audio, grafika/. Tento 8 násobný nárast dát je ohromný vo svete osembitov a CPU to len tak bez pomoci nezvládne a kdeže je ešte double buffering teda 2x48KB. Monštruózne.

Museli teda pribudnúť HW scroll registre, neskôr aj špeciálne nové inštrukcie /niečo ako MMX ala pentium/, DMA – priamy prístup do pamäte bez asistencie CPU a pôvodný kmitočet CPU sa z 3.5Mhz navýšil na 7Mhz. A verte mi, že to len tak tak stačilo. Jadro sa teda ladilo ďalej. Paleta išla z 256 na 512 farieb /9 bit/ a CPU na kombinovaný 14/7Mhz režim.

HW Sprajty. Veľká zmena. Sprite engine zvládal 64 x 256 farebných HW sprajtov o veľkosti 16x16 pixel naraz na ploche, tvrdý limit 12 sprajtov na scanline riadok. Sprite pixel výkon na štandardný 256 pixelový riadok bol teda iba 192 sprite pixelov /12x16/, sprajty nevedeli pokryť celú jeho šírku. K sprajtom sa neskôr dopracovala schopnosť ich zrkadlenia, farebného offsetu a rotácie okolo osi po 90 stupňoch bez asistencie CPU. Ešte neskôr aj rozšírená kontrola nad line-interuptom.

staré, neaktuálne ZXN jadro - obligátne Shadow of the Beast tech demátko 
/mixuje L2 v popredí a Low Res layer v pozadi/

Keď sa to všetko nahádzalo na plochu, tak to už vyzeralo ako malá amiga ale malo to kopu hrubých hrán a príliš veľa brute force prístupu, aj niekoľko drakonických obmedzení na strane sprite enginu /12 HW sprajtov na scanline im prišlo málo, amiga má 8 a megadrive zas 20/. Ukážka HW a softvérových sprajtov specnextu naraz, aby sa obišiel HW limit na scanline.

Nakódoval sa tam aj copper procesor ala amiga. Ide o zvláštnú vecičku, ktorá bez asistencie CPU vie per scanline alebo uprostred neho meniť napríklad aj tie grafické informácie. Umožňuje teda mať na ploche grafiku v rôznom rozlíšení, rôznej palete, sprite multiplexor /jeden sprite „rozmnožíte viacnásobne po celej ploche“/ a mnoho mnoho ďalšieho. Spolu s DMA vie do systému pustiť aj plne digitalizovaný audio stream /bežné nekomprimované PC WAVko, ZXN je defaultne nalepené na úložisko v podobe SD flash karty, na MG pásky zabudnite/.

Chvíľu bol pokoj a potom prebral nad jadrom kontrolu iný človiečik dev tímu, ďaleko talentovanejší a sprite engine sa kompletne prepracoval. Z 64 HW sprajtov je ich zrazu 128 !!, schopnosť mixovať 4 bit a 8 bit sprajty, teda 16 a 256 farebné, HW škálovanie veľkosti sprajtov 2-4-8 krát po oboch osiach, otravný sprite limit na riadok technicky padol !!, po novom scanline znesie aj 100ku sprajtov, teda 1600 pixelov na 192 pixelový riadok, čo je už vysoko prevysoko nad možnosti akejkoľvek nenaturbenej amigy vátane Sega Megadrive.

novšie "2.x" jadro - mohutné scroll paralaxy, všetko čo vidíte sú vlastne sprajty, 
tie vrstvy, stovky a stovky sprajtov

Sprajty inak vedia lietať po väčšom priestore než základných 256x192, konkrétne 320x256 a nový engine z nich umožňuje urobiť aj niekoľko celo-obrazových vrstiev grafiky. Takže sa blíži mohutné paralaxovanie. Malé zmeny sa robili aj na starej legacy "atribútovej" grafike, proto-verzia HW skrolingu, tiež špeciálne inštrukcie pre zrýchlenie vykresľovania grafiky, extra ULA Next paleta a špecialny lores mód 128x96 /Radastan, to aby sme boli kompatibilný so všetkým možným už vymysleným/.

Nezastavujeme, ešte to chce riadne máknuť. Bitmap grafika s 48 kilovým videobufferom je príliš ťažkotonážna, takže tu bol veľký tlak na tile-map based grafiku. Teda obrazovka, grafika vytvorená z dlaždíc /v prípade specnext tu je priestor na 512 tiles plus rotácie, mirror, offset/ z ktorých si tu hernú grafiku poskladáte ako to robil NES, SNES, Megadrive. Celý tile-map frame má do 12 kilo, je extrémne rýchly a môžte ho kombinovať s bitmap based L2 vrstvou. V čiste tile-map móde sa vyšplháte až do hires rozlíšenia 640x256 pixelov, jednotlivé dlaždice majú každá vlastnú 15 farebnú vlastnú paletu + alfa z celkových 512 farieb /a copper procák vám dokáže tých 512 farieb dostať naraz na ploche, žiaden problém/. Už to nie je amiga, či megadrive ale plne vybavený, malý domáci arkáde systém.

Koniec ? Absolútne nie. Najnovšie, ešte experimentálne, "3.x" jadro je tak čerstvé, že nie je ani zdokumentované. Ide však o totálne prepracovanie všetkého doterajšieho so stovkou úprav. Napríklad takt CPU je už plných 14/14Mhz /border, plocha/, DMA detto na 14MHz, bitmap grafika už môže ísť aj do 320x256 rozlíšenia bez sprite trikov /dobre pre adventúrky ako Monkey Island/, nové špeciálne tile-map módy. Stará grafika, tá originálna, má už aj jemný HW pixel scroll. Copper procák išiel z 14 na 28Mhz a dáva tuším 20MIPS, takže rýchlosť svetla. A špeciálna pozornosť venovaná návrhu spojenia - zbernice medzi specnext jadrom a vnútornou „turbo kartou“ ležiacou na akceleračnom porte. Niečo ako tie 030/50ky pri tých starých amigách pod padacími dvierkami. V specnext tam je štandardne RaspPi Zero na 1GHz s vlastnou 512 mega RAM a so slušnou OGL 3D grafikou. Možnosti totálne nekonečné. Najnovšie sa to dá použiť aj jako zvukovka /amiga, PC, C64 audio formáty, mp3, ogg .. čo len chcete/ a mixuje sa to podľa voľby ku vlastnej zvukovke specnextu /9 kanálový AY čip/.

Celý projekt teda začal jako klasické ZX Spectrum v FPGA forme s diskrétnymi úpravami /statická 256 grafika v pozadí/ a po 2 rokoch bavkania prevalcoval postupne Atari ST, AMIGA 500, Megadrive a je to dnes technicky mladší brat Neo Geo. Z podstaty FPGA vyplýva, že sa mašina môže a bude ladiť ďalej, hlavne DMA radič potrebuje ešte trochu pomôcť. Zoznam požiadavok vývojárov je tiež dosť dlhý. Kapacita FPGA alebo jeho vlastnej BRAM nie je nekonečná, niekde sa proste zastaviť nakoniec musíte. Nepýtajte sa ma na reálne, hrateľné ukážky /WIP port z PC/. Systém je objektívne báječne výkonný /CPU, GPU, RAM, SD mechanika/ a hra ktorá ho plne vyťaži preto zákonite bude drahá na človekohodiny a kapitál. Veľkosť uživateľskej základňe je na rečnícku otázku. Štandardné limitujúce faktory. SpecNext zvládne Metal Slug klony, Turricana, Raymana, Dune 2 dokonca aj jednoduché 3D veci alebo nejakého FPS Wolfika, Ultimu Underworld v "malom okne", kto ich však urobí, že áno.

FPGA scéna je dnes mimoriadne silná. Viď Megadrive v tomto formáte, Amiga Vampire, MISTer. Pred sekundou pribudol aj "Gameboy". Dostatočné veľké FPGA, ktoré kapacitne pokryje všetky vaše potreby aj s prislušnou matičnou doskou a konektormi máte za cca 130 euro. Na opačnom konci máte super high end za 31 000+ euro. Učiť sa špeciálny programovací jazyk začnite už dnes /VHDL, Verilog/.

Konečne odpoveď na otázku - SW alebo HW ? Laickým konzumentom je to šumafuk. Purista a nerd volí FPGA. Duch hardvéru je pomocou FPGA zachytený najviac podobne originálu. Praktické hľadisko vyzerá následovne. Na HW emuláciu Spektra alebo SNES na 3.5Mhz vám stačí FPGA čo žerie 2-4 watty a beží na 3.5Mhz. Na 7 megahertzovú amigu rovnako taktované FPGA. Rozumiete. Výrobca to vyrába na 28nm procese /na 7nm to tak skoro nebude a  na 14nm si to môže dovoliť iba Intel a je to drahé/. Ak si pozriete PCB specnext uvidíte, že to FPGA tam leží nahé, ani len ten pasív, pliešok hliníkový, nič. Nenáročné. Pri SW emulácii to chce aspoň 45-65 wattové niečo od Intel/AMD so sakra vysokým výkonom na jedno vlákno a patričné chladenie. Osobne vidím ako súperov v hobby segmente dva tábory - FPGA /HW emulácia/ a šikovné RaspPI /SW emulácia/. Pikoška - RaspPI Zero /utiahne hravo Quake 3/, ktoré sa nachádza vnútri specnext ani omylom nestačí na jeho úplnú a presnú emuláciu v reálnom čase.