Emuláció: Spectrum emuláció Enterprise-on

4 csillagos Cikk értékelése: 4,96 (25 szavazatból)

Első lépések

A Spectrum emuláció első lépésének az a útmutató tekinthető amit a Enterprise cég adott ki a szoftverfejlesztőknek, azzal a céllal, hogy Spectrumra fejlesztő programozók Enterprise-ra is adják ki a programjaikat. (Converting) Ebben a dokumentumban leírták, hogyan kell a Spectrum-os memóriakonfigurációt és képernyő felépítést előállítani, valamint útmutatást adtak, hogyan kell a billentyűzet és hangkezelést megoldani, valamint az attribútumbájt kezelést módosítani. Ennek eredményeként született meg sok tucat Spectrum játék gyári EP-s kiadása, majd később sok száz nem hivatalos átirat.

Már az előbbi dokumentum célzott rá, hogy ROM emulációval már létező Spectrum programok is futnának Enterprise-on, gyakorlatilag csak az előbb leírtak alapján megteremtett Spectrumos keretbe kell berakni egy olyan Spectrum ROM-mot, amiben a hardver közeli részeket (billentyűzet, hang és magnó rutinok) EP hardverhez vannak módosítva, és kész is a Spectrum emulátor! Erre az ötletre egymástól függetlenül számos programozó eljutott, így összesen körülbelül egy tucatnyi szoftveres Spectrum emulátor készült. Azonban hiába tűnik nagyszerűnek az ötlet, a szoftveres emulációnak számos hiányossága van:

  • csak azok a programok működnek, amelyek ROM rutinokon keresztül kezelik a hardvert
  • az attribútumbájtok eltérő felépítése miatt nem színhelyes a megjelenítés. Ezt némelyik emulátorban úgy oldották meg, hogy az 50Hz-es megszakítási rutinban elhelyeztek egy konvertáló rutint, ami az egész attribútum területet átkonvertálja egy másik EP-s területre. Ez erősen negatívan hat az emuláció sebességére, de egyszerűbb programoknál elfogadható eredményt ad.
  • IM2-es megszakítást használó programok se működnek
Tehát lényegében játékok futtatására egyáltalán nem megoldás a szoftveres emuláció, leginkább csak BASIC programok futtatására alkalmas. Ezen emulátorok mezőnyéből kiemelkedik a MICROTEAM Spectrum Simulator amely játékok helyett eleve a komolyabb felhasználói programok (Masterfile, Tasword, stb) futtatását tűzte ki célul, ennek megfelelően rendelkezik Microdrive emulációként megvalósított lemezkezeléssel, valamint MICROTEAM FX.4 típusú EPSON kompatibilis nyomtatóvezérlő emulációval.

Egyértelmű, hogy az előbb felsorolt hátrányokat csak egy hardveres emulátorral lehet megoldani. Ennek megvalósításába elsőként az angol Tim Box fogott bele, aki az angol Enterprise élet vezéregyénisége volt. Sajnos erről az emulátorról semmilyen részletes információ nem került még elő, egyedül egy távoli fotó van róla, valamint az ára ismert: 45 font. A Spectrum-os körökben is ismert Andrew Richardstól (aki közreműködött ennek az emulátornak szoftverében is) tudjuk, hogy Tim kapcsolatban volt magyar fejlesztőkkel, feltehetően az 'a' Studióval, és a magyaroknak meg lett mutatva ez az angol emulátor is. Nem tudni, hogy van-e bármi összefüggés a magyar emulátorral, mindenesetre voltak más angol fejlesztések, amelyek jelenleg tisztázatlan körülmények között kerültek Magyarországon kiadásra, a szerzőjük tudta nélkül...

A magyar hardveres emulátor története

Már az EP hazai 1987-es megjelenése után több újsághír is beharangozta a Spectrum Emulátor készültét. Amire elég nagy igény lett volna, lévén elég kevés program volt kapható EP-hez. Később se lett sokkal több :-(
Végül sok várakozás után '88 végén-'89 elején került a boltokba. A Spectrum Világ 8-as számában jelent meg egy rövidebb (még megjelenés előtti), a 15-ös számban egy részletesebb teszt.
Ezekből ki is derülnek az Emulátor főbb hibái:

  • ha csatlakoztatva van a géphez, csak Spectrumként üzemel, ha vissza akarunk térni az EP módhoz, le kell húzni az Emulátort. Ez egyrészt nem tesz jót a csatlakozóknak, másrészt a szocialista másolata az eredeti csatlakozóknak nem sikerült túl jól, így akár négy-ötször is neki kell futni mire sikerül egyszer jól csatlakoztatni...
  • se a belső se a külső joystickok nem használhatóak
  • a billentyűzet emuláció hibás, idézet az SpV-ból: "Találkoztunk egy érdekes jelenséggel is, melynek nem értjük az okát. Gyakran előfordul, hogy az alsó sor a "C" billentyűtől kezdődően "elhal". A dolog érdekessége, hogy időnként a felettük lévő billentyűk pl. az "M"-nél a "K", az "N"-nél a "J", a "SPACE" helyett az "ENTER", stb.) kezdtek el jól, máskor pedig "tudathasadásosan" működni. Eme jelenséget nem egy EMULÁTOR-nál tapasztaltuk, tehát az kizárható, hogy a mi példányunkban, vagy a gépünkben volna a hiba! Megint érdekes, hogy ez csak a gépi-kódú programok futtatásakor jött elő!"
  • az hardver adottság, hogy az EP nem ismeri a FLASH-t, SpV: "Ez a játékoknál nem túl érdekes, de az kifejezetten kellemetlen, ha a szerkesztő sorban "elvész" a kurzor!! Ha legalább inverz volna!"
  • az IM2 módot használó játékok sokszor nem, vagy csak hibásan működtek
  • SpV: "Nagy kár, hogy az EXDOS-t nem használhatjuk, pedig milyen klassz, is volna, ha a SPECTRUM programokat lemezről is töltögethetnénk!!!"
Ezek után nem túl meglepő, hogy nem tolongtak a vevők az Emulátorért, különösen ha azt is hozzávesszük, hogy eddigre már futószalagon készültek a házi programátíratok! Pl mi se vettünk :-) Egy 1991-es interjúban közölte is a hazai Enterprise képviselet vezetője, hogy azért nem árulnak SEMMI új kiegészítőt EP-hez mert tele vannak a raktárak Spectrum Emulátorral (meg SZJA88 adószámítóprogrammal...) ENTERPRESS

A nagy fordulat 1993-ban következett Emulátor ügyben: Matusa István barátom (az Enterpress akkori főszerkesztője) közölte, hogyha a kedvenc játékát (Equinox) átírom EP-re, hogy tudja floppyról játszani, akkor nekem adja az Emulátorát. Életem első átirata pár nap alatt elkészült, én pedig gazdagabb lettem egy Emulátorral... ...amit természetesen azonnal szétszedtem, hogy mi ez, és hogyan működik. Az ismerkedés eredménye némi hardver hibajavítás lett, és egy szinte teljesen újraírt ROM program lett.

Lássuk hogyan működik

Az alapötlet zseniálisan egyszerű! Az Emulátor logikai áramkörei figyelik a rendszerbuszt, és ha valami Spectrumos eseményt észlelnek (I/O művelet az FEH porton, ill. írás az attribútum területre), akkor NMI-t generálnak. A ROM-ban elhelyezett NMI rutin kiolvassa a kártya regisztereiből, hogy mi váltotta ki az NMI-t, majd az EP hardvernek megfelelően elvégzi a szükséges műveletet.

Ezután lássuk, hogy mit tud az általam elkövetett 4.0-ásnak elnevezett ROM program. (Az eredeti 3.5-ös volt) Ennek megírása során az volt a célom, hogy a korábban felsorolt hibák mindegyike ki legyen javítva.

  • elöször is rendes EP-s rendszerbővítő lett belőle, így a gép normál EP-ként üzemel, a Spectrum módba a :ZX paranccsal lehet belépni. Sőt vissza is lehet jutni EP módba teljes újraindítás nélkül.
  • Spectrum módban a reset egyszeri megnyomása Spectrum resetet eredményez (az eredetiben teljes újraindítást)
  • billentyűzet emuláció újraírva, és kijavítva, az SpV-ben leírt igen furcsa jelenség egyik oka az volt, hogy az A15-t elfelejtették rákötni az egyik IC-re... A másik ok az, hogy az EP-n az A14 és az A15 az nem a Z80-ból jön, hanem a Dave-ből, és függ a belapozott szegmensektől. Mivel a Spectrumos billentyűzet kezelésnél a Z80 azon tulajdonságát használták ki, hogy IN A,(n) utasításánál az A regiszter, az IN r,(C ) esetén pedig a B regiszter értéke kerül a címbusz felső 8 bitjére (A8-A15), és ez adja meg, hogy a billentyűzet mátrix mely sorait kell beolvasni, így ha az A14,15 értéke nem megfelelő, akkor nem a kívánt billentyűk lesznek beolvasva.
  • mivel Spectrumon a legtöbb joystick billentyű lenyomásokat emulál, így gyerekjáték volt beletenni az új billentyűemulációs rutinba ezek kezelését is. (A belső+ALT gomb a Cursor, a két külső pedig a Sinclair 1/2 kiosztásnak felel meg.) Ezt nagyon nem értem, miért nem csinálták meg eredetileg, nagyságrendekkel növelte volna az Emulátor sikerét!
  • a FLASH-es attribútumok inverzek lettek
  • IM2 mód is le lett kezelve. Igaz ez se 100%-os, de a gyakorlatban elég jól bevált :-) az NMI rutin figyeli az I regiszter változását, így detektálja az IM2-re való áttérést. A probléma egyébként az, hogy EP-n nem elég a EI, a Dave-ben is engedélyezni kell a megszakításokat. (Többféle forrás is lehet, Spectrum módhoz persze csak az 50Hz-es videó megszakítás kell.)
  • ... és a legfontosabb kérdés az EXDOS használata: ekkora már rendelkezésre állt buszbővítő kártya az EP-hez, így semmi akadálya nem volt, hogy mindkét kártya a géphez csatlakozzon. (Egyébként eredetileg is terveztek ilyen egységet a géphez, de tudtommal nem került kiadásra.) Az Emulátor új ROM programja pedig a magnóbemenet helyett a szabvány EXOS fájlkezelést használja, így már semmi akadálya a floppy használatnak, vagy ma már akár vinyóról is lehet tölteni a Speccy programokat EP-be.
    LOAD vagy SAVE esetén megnyílik egy kis ablak a Spectrum képernyő alatt, itt meg lehet adni a fájlnevet, ill. akár DOS parancsokat is lehet használni. A ROM-ban mellékelve lett még egy SCOPY nevű segédprogram is, amivel Spectrum kazettákat lehet EP fájlokba menteni. (Ez SpV-ben átírós cikkében közölt program továbbfejlesztett változata)
  • és végül lett egy extrafunkció is: amikor az Emulátorral foglalkoztam, egy SpeccyDOS-os Spectrum volt kölcsön nálam. Ennek a MAGIC funkciója nagyon megtetszett, így azt is beleraktam az új ROM-ba, hogy az ilyen mentést be tudja tölteni. Sőt a billentyű emulációba elrejtettem egy MAGIC gombot is: a HOLD+STOP lenyomásakor kimenthetünk ilyen formában, ill. visszatölthetünk egy korábbi mentést. Ez RAMDISK használatával kombinálva jól tud jönni sok játéknál, de ma már gondolom a PC-s emulátorok korában mindenki ismeri a snapshotok előnyeit :-)
  • van lehetőség "POKE fájl" betöltésére is
Amikor a javított Emulátor leírás megjelent az 1993/4-es Enterpressben, hirtelen megnövekedett az érdeklődés az Emulátor iránt :-)

Új fejlesztések

A következő fejlesztés 2005-ben volt. Az EP fórumon jött a hír, hogy néhány angol fickó fénykép alapján próbál Emulátort építeni... Gondoltam ne szenvedjenek sokat, megcsináltam a kártya kapcsolási rajzát. :-)

Ekkor fedeztem fel még egy súlyos tervezési hibát, aminek az eredményével korábban is találkoztam. Bár az NMI generálás szoftverből ki/bekapcsolható a kártya egyik portján keresztül, de ez a funkció nem igazán működött, ha ki is kapcsolta az ember, 1-2 másodperc múlva újra bekapcsolt... Ezért a '93-as átalakításnál (amit mostanában csak ISS2 változatnak nevezünk), egy kapcsoló került az NMI vezetékre, a ROM program felszólít induláskor a bekapcsolásra, ill. ha kikapcsoljuk, és úgy nyomunk resetet, akkor visszajutunk EP módba. A hiba ami miatt nem működött szoftveres kikapcsolás: a tervezők nem vették figyelembe a Z80 azon tulajdonságát, hogy az IORQ nem csak port IO műveletnél aktív, hanem megszakítás elfogadás során is. Tényleges IO művelethez szükség van még az RD/WR jelek egyikének aktivitására is. Mivel erre nem figyeltek, így a kártya engedélyező regisztere véletlenszerűen felülíródott, aminek jó nagy fagyások lett az eredménye, ha nem az Emulátor ROM futott éppen. A hiba pár plusz kapu beépítésével javítható, itt a javított kapcsolás.

Ennek a változatnak a neve lett ISS3, Ennél már nincs szükség a kapcsolóra, mindent a szoftver tud intézni. Készült egy újabb 4.1-es ROM is, először is mivel nincs már kapcsoló, így az EP módhoz úgy lehet visszatérni, ha a STOP gomb nyomvatartása közben nyomunk egy resetet. És haladva a korral, mivel manapság már nem kazettáról gyűjti az ember a programokat hanem a netről, így bekerült a TAP/TZX fájlok kezelése is. Kényelmi szolgáltatásként már :ZX fájlnév paranccsal egyből programbetöltéssel is indítható az Emulátor.

Végezetül néhány szó az Emulátor korlátairól

  • mivel a töltéshez a ROM rutin van meghekkelve, így nyilvánvalóan csak azok a programok futnak, amik a szabványos ROM rutint hívják betöltéshez.
  • olyan programok amik folyamatosan zenélnek (pl. Manic Miner), futnak, csak eléggé lelassulnak... oka az, hogy az egy OUT (0FEH) végrehajtásához kb egy tucat utasítás is lefut az NMI rutinban. Eegy 6-7 Mhz-esre tuningolt EP valamit segíthet ilyenkor :-)
  • vannak olyan programok, amik össze-vissza variálnak a veremmel, és ilyenkor már az is gondot okozhat ha az NMI-nél elmentődik a visszatérési cím, meg néhány regiszter... (Pl: Quest for Tires, Foxx Fights Back)