Primo-GA...

... azaz a Primo számítógép újraépítése mai alkatrészekből egy FPGA (Field Programmable Gate Array) áramkörben.


(Ez egy gyorsan összedobott dokumentum, elnézést az esetleges stilisztikai és helyesírási hibákért. A dokumentum nem végleges, bővíteni fogom...)

A ReRun hardver

 

A Primo-GA alapját az általam tervezett ReRun hardver adja meg. Ennek tervezésekor (más források alapján) az volt a célom, hogy egy olyan hardvert építsek, amely képes lehet a nyolcvanas évek tipikus 8 bites számítógépeinek, kiemelten a magyar gépeknek a megvalósítására. A modern FPGA áramkörök lehetővé teszik, hogy ugyanazon fizikai hardverben (ez maga az FPGA chip) más-más kapcsolásokat valósítsunk meg.
A cél tehát NEM önmagában csak a Primo újratervezése volt, hanem egy olyan általános hardver megépítése, amibe aztán később majd beletehetünk egyéb 8 bites gépet is. Éppen ezért a hardver erőforrásai (gondolok itt a színek számára, a memória nagyságára, vagy az Audio kimenetre) túlmutatnak a Primo keretein, de ez szándékos.
Terveim között szerepel más gépek realizálása is, elsősorban a magyar gyártmányok, de a számomra nagyon kedves ZX-Spectrum, VIC-20, C16 is kivitelezhető ezzel a hardverrel. Az ötlet egyébként nem új és nem saját. A C-One vagy a Commodore-DTV, illetve az Amiga-t újra életrehívó MiniMig projektek mind hasonlóak.

 

A hardver fizikailag három IC-ből áll (ha eltekintünk a tápfeszültséget előállító áramköröktől):


  1. Egy Xilinx XC3S400 Spartan-3 típusú FPGA, amelyben a tulajdonképpeni megvalósítás történik. Ez az FPGA elegendően nagy ahhoz, hogy egy komplett 8 bites gép elférjen benne.
    (Például az általam megvalósított Primo-GA a Z80 processzorral és a kibővített hardver elemekkel együtt sem foglal többet, mint az FPGA erőforrásainak 60%-a.)
  2. Egy 512K kapacitású statikus RAM, ami a megvalósított géphez az operatív tárat szolgáltatja.
  3. Egy AVR AtMega32 mikrokontroller, amelynek feladata az FPGA indítása (config mód), valamint a csatlakoztatott SD kártya kezelése háttértárként, amikor a HOST már elindult (device mód).

 

A hardver a külvilág felé az alábbi portokat, egységeket szolgáltatja:


  1. SD/MMC kártya , ezt az AVR kezeli, és a memóriakátyát egyszerű háttértárolóként használhatjuk. Nagyon fontos, hogy az FPGA konfigurációs bitstream is a kártyán van, ezért a hardverhez mindenképp szükséges a memórikártya. (A Primo-GA módosított ROM-ja képes úgy látni az SD kártyát, mintha az egy FAT merevlemez lenne.)
  2. PS2 billentyűzet és és egér portok. (A Primo-GA esetében a billentyűzetet használjuk.)
  3. RGB video kimenet, ami képes a PAL-frekvenciával működő  RGB eszközök (pl hagyományos TV Euro-Scart bemenettel), illetve VGA bemenettel rendelkező eszközök csatlakoztatására is. (A PAL/VGA frekvenciaváltást jumperrel állíthatjuk be.) A video kimenet analóg RGB jelet ad 4096 színnel, és digitális szinkron jeleket.
  4. Egyszerű speaker hangkimenet, valamint stereo audio hangkimenet. (A Primo-GA csak a speakert használja.)
  5. I/O vonalak további fejlesztésre. (A Primo-GA ezeket egyelőre nem használja.)

 

A Primo-GA

 

A Primo-GA természetesen kompatíbilis az eredeti Primo A64-el, illetve, mivel az A sorozat és a B is kompatíbilisek, ezért a B sorozat gépeivel is, de a színes képet másképp állítja elő, mint a Primo C, ezért azzal NEM kompatíbilis.
A megvalósítás tartalmazza a kor követelményeit, ezért vannak apróbb eltérések, de ez nem okoz gondot a programok futtatásakor. (Ilyen tipikusan az SD kártya kezelése, hiszen ki akarna ma már magnóról betölteni egy programot) Természetes, hogy 2011-ben nem ugyanazokat az áramköri elemeket és technikát használjuk, mint a 80-as években. A mai FPGA áramkörök nagyteljesítményűek, alacsony fogyasztásúak és sokkal gyorsabbak, mint a hagyományos TTL rendszer elemei.
(Megjegyzem, hogy az alkalmazott Xilinx Spartan-3 is elavultnak számít már).
Az FPGA olyan elemeket és lehetőségeket nyújt, amelyek gyökeresen eltérő utakat is megengednek. Persze a kompatíbilitás fontos, de egy ilyen hardver esetében miért ne használnám ki a kor adta előnyöket. Például miért vesződnék a video-cpu összehangolásával a videomemória számára, amikor az FPGA tálcán kínálja a megoldást (dual port block ram), amely feleslegessé teszi a két egység szinkronizációját? Vagy, miért ne adnánk új utasításokat a Z80-nak, amikor az FPGA-ba ez belefér? Miért ne csinálnánk olyan hardvert, amely egyaránt képes a hagyományos televíziók és a VGA monitorok meghajtására is?

Az alábbiakban felsorolom az eltéréseket, amelyek néha talán öncélúnak tűnhetnek, mégis, mindennek célja és oka van :-)

  1. 7MHz-es pixel órajel az eredeti 7.5MHz helyet. Ez kissé megnyújtja a képet vízszintesen, tehát a border rész kisebb lesz.
  2. Színes üzemmód. A rendszer 4 bites videojelet használ, ami egyszerre 16 szín megjelenítését teszi lehetővé egy paletta segítségével. Normál primo üzemmódban beállíthatjuk a keret, az háttér és az előtér színét.
  3. További video üzemmódok, például 320x200-as felbontás, attributum bájtok, kevert video üzemmód.
  4. Sprite-ok.
  5. 12 bites RGB paletta, ez összesen 4096 szín megjelenítését teszi lehetővé.
  6. Állítható órajel a Z80 számára.
  7. 512K operatív tár, amelyet lapozással tudunk elérni a Z80 64K-s címterületén belül.
  8. 50/60Hz képrissítési mód a beállított kimenet függvényében. (PAL vagy VGA frekvencia)

 

A rendszerindítás lépései:


  1. A tápfeszültség megjelenésekor az FPGA üres, az AVR pedig config módban elindul. Betölti az fpgacore.bin fájlt és ezzel felkonfigurálja az FPGA-t. Amint az FPGA elindul, az AVR device módba kapcsol, és vár arra, hogy a HOST elinduljon.
  2. Az alap Primo nem tartalmazza a ROM fájlt, hanem csak egy 256 bájtos BOOT ROM-ot, ami a konfigurálás után elindul. Ez a Z80 kód megnyitja és betöltii a primo.rom nevű fájlt,
  3. A betöltés után egy rövid statup kódot kimásolunk a ram-ba a $8000-es címre, mert a BOOT ROM-ot ki kell kapcsolni. Ez a startup kód kikapcsolja a BOOT ROM-ot, aktiválja a valódi Primo ROM-ot, majd elindítja egy rst 00 utasítással.


Az FPGA konfigurálása a jelenlegi belső oszcillátor órajele mellett nagyjából 2 másodperc. A primo.rom betöltése szintén körülbelül 1 másodpercet vesz igénybe. Bár a konfigurációs fájl 200K, a primo.rom pedig csak 16K, a két betöltés eltérő kommunikációs protokollt használ, és ne feledjük, hogy a ROM-ot már egy Z80 kód tölti be, ezért aránylag ez lassabb. Az indulás sebességét befolyásolja még természetesen a használt SD vagy MMC kártya sebessége is, általánosságban az mondhatjuk, hogy a Primo-GA a bekapcsolás után nagyjából 3-4 másodperc után jelentkezik be, természetesen hibamentes állapotokat feltételezve. Ha az fpgacore.bin vagy a primo.rom fájl hiányzik a kártyáról, a rendszer nem tud elindulni.

A Primo-GA teljes, részletes hardveres ismertetését, illetve a ROM-ban végzett egyéb módosításokat idővel majd publikálom, egyelőre annak is örülök, hogy a design végre elindult, és képes eredeti Primo programokat futtatni. Végezetül következzen néhány fotó (mobiltelefonnal csináltam őket, elnézést a minőségért), amik a hardvert működés közben mutatják. Prototípus panel még nem készült, egyelőre egy gyári FPGA fejlesztői panelen dolgozom, ezt egyrészt kissé módosítottam az eklépzeléseimnek megfelelően, másrészt kézzel festéses módszerrel elkészítettem a kiegészítő panelt, ami a mikrokontrollert és az SD kártyát tartalmazza. (Ez nem lett túl szép, de legalább működik.)




A fejlesztőkörnyezet a PC-n. Xilinx ISE Webpack. Igaz, nem sokminden látszik. Ezen "írtam" a Primo-GA-t.
Az eredeti Z80 core nem az enyém, azt az http://opencores.org/-ról szedtem le és módosítottam kicsit.


A hardver, bal oldalon a Digilenc Inc FPGA fejlesztőkártyája, jobb oldalt pedig az én
próbapanelem, ami az AVR mikrokontrollert, az SD kártyát és a Speaker-t tartalmazza.


A Primo-GA bejelentkező képe egy 19 colos 16:9-es LCD VGA monitoron.


A Primo-GA bejelentkező képe egy hagyományos Commodore 1084S RGB monitoron (PAL compatibilis módban)
A látható vízszintes interferencia csíkokat csak a fényképezőgép látta, a kép szabad szemmel természetesen tökéletes.


A Primo-GA bejelentkezés után a cmd parancs kibővítésével éri el az SD kártyát.
A képen látható üzenetet az AVR (ekkor már device módban) küldi.


A border színét megváltoztattam a megfelelő out utasítással. Most is látjuk az AVR válaszait.



Minden összedugva, egy demo program fut éppen, eredménye a monitoron látható.


Talán látható, a DIR parancs eredménye a képernyőn.


Egy játék képe, amint éppen fut a Primo-GA-n.


Egy másik játék képe, amint éppen fut a Primo-GA-n. Itt átállítottam a színeket.


A Single Attribute video mód tesztje, ez a Basic program forrása.


A Single Attribute video mód tesztje, ez pedig az előző program futásának eredménye, az attributum
bájtok megváltoztak. Ez a mód a ZX-Spectrum-hoz hasonló 32x24 attribútum cellát hoz létre a képen.


A keret (border) színének váltogatása. A fényképezőgép itt sem azt látja, amit az emberi szem. :)


Megint egy játék képe. Ezt most egy SUN 17 colos CRT VGA monitoron látjuk. Ez is működik.


Sprite-ok a primo képernyőjén. A Primo-GA nyolc darab 16x16-os négy színű hardver sprite kezelésére képes.
Jól látszik, hogy a sprite-ok a grafikus kép "felett" vannak.

Hát, egyelőre ennyi. Idővel még újabb információkat is közzé teszek ezen az oldalon, ha erre igény lesz...

Referenciák:

joco