18. decembra 2011

Projekt: GPMD85Emulator

GPMD85emu

GPMD85emulator je port nášho PMD 85 Emulátora, ktorý z pôvodného proprietárneho softvéru určeného pre Windows platformy prešiel na vlastnú vývojovú vetvu softvéru s otvoreným kódom pod GPL licenciou, určeného primárne pre *nix platformy. Do tohto portu sa z pôvodného kódu použili iba triedy emulácie všetkých integrovaných obvodov a ich základnej funkcionality PMD 85, no aj tie museli byť prispôsobené pre GCC compiler. Ostatné časti už boli naprogramované od základov: od generovania obrazu, zvuku až po kompletné grafické užívateľské rozhranie...

Ako vznikal GPMD85emulator?

Počiatky projektu boli veľmi ťažké, keďže Roman, ako hlavný vývojár pôvodného PMD 85 Emulátora sa dištancuje od linuxu ako takého, takže som na to ostal sám. Všetko to začalo už v januári 2010, kedy som vytvoril prvú jednoduchú okennú aplikáciu pod knižnicou GTK+ a preprogramoval do C++ generovanie obrazu z pôvodného emulátora, kde je realizované priamo v assembleri x86. Tento krok bol nutný z dôvodu prenositeľnosti a nezávislosti na architektúre cieľového procesora. O samotné zobrazovanie sa už vtedy starala (snáď najznámejšia) multi-platformová direct-media knižnica SDL. Na moje prekvapenie, už len samotné generovanie a zobrazovanie obrazu vtedy spotrebovalo viac než polovicu systémového času. To som ešte nevedel, čo to spôsobuje a myslel som si, že to v C lepšie nebude. Napriek tomu som sa pustil do portovania tried samotnej emulácie obvodov a ich funkcionality. Hneď som ale v zdrojákoch narazil na špecialitu Borlandu, closure metódy, pred ktorými ma Roman už dávno vystríhal. Nič podobné GCC nemá a preto začalo niekoľko-mesačné pátranie po spôsobe, akým zapracovať vzdialené volanie metódy z konkrétne inštanciovanej triedy z inej metódy v inej triede...

Znie to zložito, ale v podstate ide iba o callback medzi triedami. V slušnej spoločnosti sa tejto technike nadáva "Signal/Slot systém". Nakoniec som našiel knižnicu sigc++, ktorá by práve túto funkcionalitu mohla zabezpečiť a tak sa mi podarilo portnúť gro emulácie PMD 85. Prišiel však ďalší problém: GTK+ úplne prevzalo kontrolu nad klávesnicou a nebolo možné ošetriť celú mapu klávesnice v SDL, čo je pre testovanie v zákazníckych obvodoch PMD 85 veľmi dôležité. Preto som opäť nechal celý projekt stáť niekoľko mesiacov až kým som sa definitívne nerozhodol, že GTK+ pôjde preč a celé užívateľské rozhranie a menu si naprogramujem sám, tak, aby bolo jednoduché, prehľadné, účelné, ale priamo vykresľované do obrazu. Navyše sa tým zabezpečí ešte vyššia portabilita. A tak som sa v októbri 2011 pustil do vyrábania vlastnej grafickej nadstavby nad SDL a vytvorenia samotného GUI. Už zanedlho som mal to najdôležitejšie - menu - a konečne začal byť emulátor použiteľný...

Vyskytol sa tu ale ďalší problém: neprimeraná záťaž procesora. Na mojom výkonnom hyperthreadovanom dvoj-jadre to bolo použiteľné a záťaž sa stále držala pod 50%, no mnohým alpha-testerom to zožieralo kompletne celý výkon stroja... a to bolo neprijateľné!
Roman ma ale naviedol na veľmi zaujímavý test: Odporučil mi zistiť si, koľko zaberá samotné generovanie obrazu úplným odstavením emulácie a následne, skúsiť ponechať iba emuláciu procesora odstavením všetkých signal/slot volaní od ostatných podporných obvodov. Odhalenie bolo šokujúce: Samotné generovanie obrazu zaberá minimum výkonu aj napriek tomu, že je napísané v C++, čiže tá GCC optimalizácia pravdepodobne naozaj dokáže vygenerovať slušne rýchly výsledný kód. Ešte prekvapivejšie bolo ale zistenie, že po odpojení všetkých signal/slot volaní od procesora zaberala emulácia tiež iba mizivé percentá výkonu procesora. Kde sa potom strácal ten zbytok? Odpoveď sa odhalila sama pri postupnom pripájaní jednotlivých signal/slot volaní. S každým jedným pripojeným signálom postupne rástla celková spotreba...
Áno, správne, problémom bolo sigc++. Knižnica je to síce pekná a hojne využívaná (napríklad aj v GTK+), ale na naše účely príliš komplikovaná a "oplácaná" haldou kódu, ktorý slúži rôznym iným častiam a funkcionalitám knižnice, no v našom prípade absolútne nepotrebným.

Nakoniec sa opäť našlo riešenie po niekoľkých dňoch pátrania. Pani Sarah Thompson už pred desiatimi rokmi vytvorila jediný hlavičkový súbor sigslot.h, ktorý zabezpečuje funkcionalitu Signal/Slot systému - nič viac, nič menej. A tak sa mi to s pomocou niekoľkých opravných patchov zo sourceforge podarilo vložiť do projektu a skompilovať. Výsledok? Takmer o polovicu nižšia záťaž!

Aktuálny stav projektu

Keďže sa projekt stále vyvíja, v tomto archíve nájdete vždy najaktuálnejšiu verziu emulátora (tj. možno aj vyššiu ako je popisovaná v tomto článku!) s niekoľkými ukážkovými súbormi v adresároch disk, snaptape. Popis týchto novších verzií nájdete vždy v tejto sekcii blogu »».
K dispozícii je samozrejme aj github repo, kde nájdete vždy najaktuálnejšie "nightly" zdrojové kódy.

[ download latest GPMD85emulator ]

Changelog:

v0.9.1206 beta »»
v0.9.1202 beta »»
v0.9.1112 alpha
  • emulácia všetkých integrovaných obvodov PMD 85: MHB 8080, 8255, 8253, 8251
  • emulácia základných modelov PMD 85-1, PMD 85-2, PMD 85-2A, PMD 85-3
  • emulácia klonov Maťo, Consul 2717, Didaktik Alfa a Didaktik Alfa 2
  • emulácia ROM modulu
  • emulácia disketovej jednotky PMD 32
  • voľba troch násobkov veľkosti zobrazenia
  • voľba spôsobu zobrazenia v násobkoch zväčšenia (angl. "scaler")
  • adaptívny full-screen režim používajúci natívne nastavené rozlíšenie
  • možnosť voľby farebného zobrazenia a nového režimu ColorAce
  • zvuk
  • snapshoty
Čo ešte treba dokončiť/zapracovať?  (zoradené podľa priority)
  • emuláciu mgf. pásky
  • možnosť editácie obsahu pásky
  • ukladanie konfiguračného súboru pri ukončení emulátora
  • uloženie/načítanie časti pamäti do/zo súboru
  • uloženie aktuálnej snímky obrazu do súboru
  • integrovaný debugger
  • doladiť emuláciu rozšírených príkazov PMD 32
  • možnosť vytvoriť si vlastné ROM modulové balíčky
  • disassembling do súboru
  • POKE dialog
  • emuláciu joysticku 4004/482
  • emuláciu myší - Myš 602 a Myš Poly-08

Ako môžete pomôcť?

Každá pomocná ruka sa zíde. Pomôcť môžete už len tým, že nájdete chybu, alebo proaktívne prispejete k jej odladeniu. Určite vždy pomôže presný popis chyby, postup, ako ju nasimulovať, popis vašej konfigurácie, distribúcie atď. Neváhajte a napíšte mi o tom, prípadne rovno využite príslušné issues na githube.


5 komentárov:

  1. parada.... By som dnes nazval programovanie kde niektore kniznice, frameworky maju dost pekelny overhead...

    Kde su tie casy co "moj" emulator PMD-85 bezal na 286 a len 8 MHz realtimeovo.... Dnes by som to ohodnotil slovom "zlatanina", ale vtedy sa tak programovalo. Od odchytavania preruseni od klavesnice po vykreslovanie priamo vo VGA/HCG. A samomodifikovatelny kod bol uplne samozrejmy. Aj sa dost spoliehalo na procesor, SAHF/LAHF instrukcie, ktore boli vyprojektovane na rekompilaciu 8080 programov do x86. a *.exe malo 30 KB (vratane rom modulov) a ladilo sa v Turbo Debuggri....

    wurmi Peto Chrenko

    OdpovedaťOdstrániť
  2. Áno Peťo, všetko toto uznávam, ale ... teraz je už iná doba... Dnes už dopredu nevieš, na akom procesore sa to bude spúšťať... Už ani zobrazovanie nie je taká triviálna záležitosť poslania páru bajtov priamo na VGA (akurát včera Dušky do emulu dorábal 4-násobné zväčšenie, kvôli fullscreenu na FullHD monitoroch a obhospodáriť 1.179.648 pixelov, navyše 32bitových, 25 krát za sekundu nie je úplná sranda ;) ...
    Ja som sa snažil tento port pojať čo možno najuniverzálnejšie, aj keď viem, že to je ešte dlhá cesta a mnoho ďalších developerov, ktorí to budú musieť dotiahnuť na tú svoju architektúru/platformu, ale myslím, že má to svoj význam. Nechcem týmto nahradiť náš pôvodný Windows emulátor - ten stále bude "Rich featured, user-friendly" ... GPMD85emulator je alternatíva, ktorá možno niekedy bude bež na malom boxe, veľkom ako tvoj hardwarový emulátor ;)

    OdpovedaťOdstrániť
  3. ono zasa, ani nie kvoli fullscreenu na fullhd... fullhd je 1080 na vysku, kdezto pri 4x4 je zobrazovacia plocha 1152 na vysku.. ale skor kvoli monitorom ktore su 16x10 a tak maju rozlisenie 1200 na vysku

    ub

    OdpovedaťOdstrániť
  4. ub880d: opravim ta, pri 4x4 je to 1152x1024, cize sa to pekne vojde aj do 16:9koveho FullHD ;)

    OdpovedaťOdstrániť
  5. pravdu vravis ;] tych 1152 som si pamatal ze som pisal do zdrojaku, na tych 1024 som si uz nespomenul ;]

    ub

    OdpovedaťOdstrániť