PMD-85 bol slávny osembitový mikropočítač hojne používaný v
Československu v rokoch 1984-1994. Rozšírený bol hlavne cez krúžky tedajšieho ZVAZARMu, domov pionierov a mládeže
i celkovou dostupnosťou v školstve.
Cieľom tejto konštrukcie je umožniť nadšencom postaviť si vlastný klon PMDčka. To znamená vytvorenie zariadenia z ktorého po pripojení televízora, klávesnice a napájacieho zdroja sa prenesiete do rokov 80-tych a zahráte si napríklad obľúbeného MANIC MINERa alebo skúsite niečo naprogramovať v starom programovacom jazyku BASIC-G.
Toto všetko vrátane cca 113 KB pôvodných hier a programov sa podarilo postupnými iteráciami napokon vtesnať iba do dvoch integrovaných obvodov a to: ATmega128-16 a IO 64 KB pamäte RAM. Zobrazovanie obrazu na televízore (TV), generovanie zvuku, obsluha klávesnice ako aj vlastná emulácia chovania procesora Intel 8080, ktorý bol srdcom pôvodného PMD-85, je realizovaná čisto softvérovo.
Samozrejme vždy je rozdiel medzi kópiou a originálom a inak to nebude ani v našom prípade. Niektoré nepodstatné vlastnosti pôvodného PMDčka boli zanedbané alebo vynechané, niečo bolo implementované zjednodušene. Z pohľadu softvéru, pôvodných programov na PMDčku, sa dosiahla kompatibilita takmer 100%, bežia všetky známe programy vrátane výbornej hry HLÍPY od Karla Šuhajdu. Generovanie čiernobieleho TV obrazu vrátane atribútov blikanie a jas je veľmi výborné, náhrada magnetofónu pamäťou FLASH na čítanie taktiež výborná, nehovoriac o niekoľkonásobnom zrýchlení nahrávania programov. Pôvodná klávesnica PMDčka ako jediné vstavané vstupné zariadenie je nahradená lacnou externou PS/2 klávesnicou. Najväčšie momentálne nedostatky v konštrukcií resp. obslužnom softvéri sú pri generovaní zvukového výstupu.
PMD-85 bol domáci 8-bitový mikropočítač so vstavanou klávesnicou a výstupom na klasický TV príjimač. Výstup na TV bol čiernobiely ale bola možnosť pripojiť externý farebný monitor s rozhraním RGB. Ale aj tak boli grafické možnosti PMDčka malé - rozlíšenie 288÷256 pixelov, pričom každá 6-tica mala spoločný 2 bitový grafický atribút. Na vtedajšiu dobu to bol výborný obraz, keďže ZX Spectrum malo ešte nižšie rozlíšenie 256÷192 + grafické atribúty. PMDčko bolo skonštruované a vyrábané niekdajšou Teslou Piešťany okolo roku 1982. Neskôr ho v rôznych obmenách začalo vyrábať viacero domácich výrobcov a vznikli modely PMD-85/2, PMD-85/2A, PMD-85/3, Didaktik Alfa 1,2, Didaktik Beta, Maťo, Zbrojováček C2717 a iné. PMDčko malo vstavanú svojsku nespoľahlivú klávesnicu, zvukový výstup - speaker, zasúvateľný ROM modul s BASIC-G. Ako pamäť na uchovávanie programov slúžil klasický magnetofón.
Čo sa týka softvéru - bola to éra tvorby softvéru nadšencami, vzniklo a bolo preportovaných veľa hier. Veľmi činné bolo trio autorov VBG software - Vlastimil Veselý, Libor Bedrlík a Ladislav Gavar. Na PMD-85 teda existuje par megabajtov hier - Manic Miner, Flappy, Boulder Dash, Fred, Penetrator, Saboter, Pampuch, Wurmi, Galaxia, Mikrotron, Willy atď. Niektoré z nich (dá sa konfigurovať) sú vstavané v tomto klone PMDčka (ktorý interne volám kódom small_pmd_128, 128=veľkosť FLASH pamäte v KB, small=rozmery PMDčka 3x4 cm).
Pôvodné PMD-85 bol mikropočítač postavený z v tej dobe populárnej procerosovej rodiny Intel 8080 (MHB 8080). Jednalo sa o obvody: 8080 - procesor, 8228 - radič zbernice, 8224 - hodinový generátor, 3x8255 - paralelné rozhranie, 8251 - sériové rozhranie apod. Typickým pre systémy z 80-tych rokov bolo použitie aj obvodov s malou hustotou integrácie - TTL logiky. U PMD bol technológiou TTL obvodov zostavený kompletný videoprocesor, starajúci sa o cyklické zobrazovanie videopamäte na pripojenom televízore.
PMD sa skladalo z nasledovných hardvérových modulov:
Nebudeme rozoberať pôvodné obvodové riešenie PMDčka, problematike sú venované monografie dostupné v knižniciach. Uvedieme preto popis realizácie nášho klonu PMD-85/1. V krátkosti treba dodať že verzie PMD-85/1, PMD-85/2, PMD-85/2A, PMD-85/3 boli navzájom čiastočne nekompatibilné a tiež väčšina softvéru vznikla práve pre model PMD-85/1.
Treba tiež dodať že PMD-85/1 komunikovalo s magnetofónom prostredníctvom USART 8251, čo znamená registrovo orientovaný pohľad na komunikáciu s magnetofónom. Je podstatne jednoduhšie emulovať prístup na magnetofónovú pásku po bajtoch s podporou handshake USART-u ako emulovať čítanie z mgf. pásky cez jeden bit (v reálnom čase) - ako bolo realizované u vyšších modeloch PMD. Je však pravda že kvalita BASIC-u i firmware postupne u jednotlivých modelov stúpala, ale veľa softvérového vybavenia vzniklo pre PMD-85/1.
Cieľom konštrukcie je teda vyhotovenie zariadenia, z ktorého sa po pripojení napájacieho zdroja (AC-DC adaptéra), PS/2 klávesnice a klasického televízora so vstupom kompozitného videa/SCART stane plnohodnotné PMD-85/1. Navyše s virtuálnou magnetofónovou kazetou 113 KB hier medzi inými MANIC MINER, BOULDER DASH, PENETRATOR, DUCH&PAMPÚCH, HLÍPA, PAMPUCH, FLAPPY, WURMI či SABOTER.
Na obrázku č.1 je znázornená obvodová schéma. Komunikácia s užívateľom sa realizuje prostredníctvom externej klávesnice a televízneho prijímača. Jeden z kľúčových prvkov konštrukcie je zvládnutie generovania úplného televízneho signálu v rozlíšení 288x256 pixelov, pričom každá šestica pixelov v TV riadku má dvojbitový grafický atribút, presne tak ako pôvodné PMD-85/1. Schéma a doska plošného spoja bola navrhnutá s použitím freeware verzie programu EAGLE 4.1
Generovanie kompozitného videa (analógový signál) COMPOSITE_VIDEO realizuje asymetrický D/A prevodník realizovaný odporovou sieťou R1-R4 a D1-2 ktorá mixuje TTL videodáta VIDEO_DATA a
synchronizačnú zmes SYNC do štandardného čiernobieleho videosignálu cca 1 Všš. Signál COMPOSITE_VIDEO je vyvedený na CINCH konektor VO0. Vopred upozorňujem že na jednovrstvojej doske plošného spoja je nutné prepojiť prepojkou PAD1 s COMPOSITE_VIDEO. Obvod jasového atribútu, zložený z diód D1, D2 a odporu R2 realizuje zvýšenie jasu zobrazovaného pixelu v prípade rovnakej hodnoty signálov BRIGHT=1 a VIDEO_DATA=1. Softvérovo je realizovaná inverzia jasového atribútu BRIGHTNESS po stlačení klávesy ALT+C. Opakované zatlačenie cyklicky prepína význam jasového atribútu.
VIDEO_DATA | BRIGHT | SYNC | COMPOSITE_VIDEO [V] |
---|---|---|---|
L | X | L | 0 (synchro úroveň) |
L | X | H | 0.7 (úroveň čiernej) |
H | L | H | 1.0 (50% jas) |
H | H | H | 1.4 (100% jas = biela) |
Napäťové úrovne signálu COMPOSITE_VIDEO sú veľké približne podľa tabuľky č.1, kde symboly logických úrovní H, L a X majú obvyklý význam. Z tabuľky je zrejmé že úrovne výstupného kompozitného signálu nie sú exaktne podľa odporúčaní TV normy, ale neuberá to na funkčnosti zapojenia či ostrosti generovaného obrazu.
Tiež treba spomenúť fintu, ktorú používalo mnoho 8biťákov - namiesto generovania 625 riadkového obrazu (čiže 2 rôzne polsnímky) s opakovacou frekvenciou 25 Hz, generujú sa 312 riadkové polsnímky (s opakovacou frekvenciou 50 Hz), čiže na TV obrazovke sú každé dva susedné TV riadky úplne zhodné. Zjednodušuje to logiku generovania, šetrí kapacitu videopamäte a obraz je ostrejší.
K procesoru ATmega128 (IC1) je pripojená 128 (alebo 64) KB SRAM pamäť v púzdre SOJ IC2 s dobou prístupu 70 ns, z ktorej sa momentálne využíva iba prvých 64 KB.
Pamäť je adresovaná 17 bitovou adresnou zbernicou, vytvorenou z portov monolitického mikropočítača ATmega128 tak, aby procesor mohol v priebehu 2 taktov vyslať 16 bitovú časť adresy inštrukciou OUT. 16-tym adresným bitom sa prepína medzi dvoma 64 KB bankami pamäte a tento bit sa bežne nezúčastňuje adresnej aritmetiky. Podľa schémy na obrázku č.1 vidíme že adresné bity 0. až 15. sú porozhadzované po portoch PB a PD na prvý pohľad neobvykle, tak aby na jednovrstvovom plošnom spoji nevzniklo kríženie vodičov. Pamät SRAM je necitlivá na výmenu poradia bitov adresnej a bitov dátovej zbernice. Dátová obojsmerná zbernica je riešená použitím celého 8 bitového portu PC. Signály čítania /RD a zápisu /WR sú generované 2 bitmi portu PA.
Pamäť je trvalo selektovaná signálmi tak aby: /E1.E2 = 1.
Pamäť SRAM je použitý (odporúčaný) typ HYUNDAI HY628100B-70. Neodporúčam pamäť SAMSUNG K6X1008C2D, recenzent mal s ňou problém, aj v iných aplikáciach.
Využitie adresného priestoru ATmega128 | ||
interná FLASH, 64 K x 16 bitov (128 KB) |
0x0000 ÷ 0x0C9C | 6.4 KB emulačný program - generovanie TV obrazu, emulácia 256 inštrukcií procesora 8080, obsluha klávesnice, emulácia ostatných periférií PMD-85/1 |
0x0C9D ÷ 0x1E9C | 9 KB obsah ROM modulu pôvodného BASIC G | |
0x1E9D ÷ 0xFFFF | cca 113 KB, obsah magnetofónovej pásky PMDčka - hry, programy. | |
interná EEPROM, 4 K x 8 bitov (4 KB) |
0x0000 ÷ 0x0FFF | 4 KB ROM firmware PMD-85/1 |
interná RWM, 4 K x 8 bitov (4 KB) |
0x0000 ÷ 0x0FFF | 4 KB - všeobecné použitie, zásobník, odkladanie častí obrazu pri zobrazení informácií o emulátore (po stlačení ALT+S), |
externá RWM, 128 K x 8 bitov (128 KB) |
0x00000 ÷ 0x0FFFF | 64 KB - Uloženie obrazu pamäte emulovaného PMD-čka. Oblasť 0x08000÷0x0BFFF je softvérovo chránená proti zápisu. Pri štarte emulátora sa skopíruje obsah internej EEPROM do oblasti 0x08000 ÷ 0x08FFF a následne sa spustí emulátor procesora 8080 od adresy 0x08000. |
0x10000 ÷ 0x1FFFF | Oblasť nie je momentálne využitá, a preto môže byť doska plošného spoja osadená ib 64 KB SRAM |
Takéto riešenie pripojenia externej pamäte RAM umožňuje zvýšiť priepustnosť pamäťového podsystému oproti štandardne používanemu zapojeniu z manuálu s použitím záchytného registra (ušetrí sa teda jeden integrovaný obvod, zjednoduší doska plošných spojov). ATmega128 bohužial nepodporuje lineárny pamäťový priestor externej RAM plných 64 KB, nakoľko vnútorná RAM a registre sú v adresované tými istými inštrukciami ako externá pamäť. Aj z tohto dôvodu nie je použitie odporúčaného zapojenia externej pamäte podľa manuálu výhodné. Na emuláciu správania PMDčka je potrebných lineárnych 64 KB priestoru RAM, ktoré sú využívané nasledovne:
Využitie adresného priestoru PMD-85/1 | |
0x0000 ÷ 0x7FFF | 32 KB RAM |
0x8000 ÷ 0x8FFF | 4 KB ROM firmware |
0x9000 ÷ 0xBFFF | 12 KB neobsadené |
0xC000 ÷ 0xFFFF | 16 KB VIDEORAM |
Videoprocesor periodicky číta obsah videopamäte a zaisťuje generovanie TV signálu cez VIDEO D/A prevodník. Táto činnosť zaberá použitému mikroprocesoru ATmega128 približne 3/4 z celkového strojového času. Zvyšná 1/4 výkonu postačuje na simuláciu chovania procesora 8080, použitom v originálnom PMD-85. Pozrime sa podrobnejšie ako a z čoho sa generuje videosignál.
Videopamäť je 16 KB pamäť RAM, logicky organizovaná do 256 riadkov po 64 bajtoch. Jeden riadok obsahuje 48 "viditeľných" bajtov a 16 bajtov ktoré sa nezobrazujú (doba spätného chodu TV lúča). Jeden bajt je podľa nasledovnej tabuľky organizovaný tak že nesie informáciu o 6 pixeloch a k nim prislúchajúci 2 bitový atribút:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
BLINK | BRIGHTNESS | P0 | P1 | P2 | P3 | P4 | P5 |
Zaujímavé je reverzné poradie pixelov P0 až P5, t.j. pixel vľavo má nižšiu bitovú váhu ako pixel ležiaci vpravo od neho v rámci každej šestice pixelov.
Takto organizovaný pamäťový priestor videopamäte umožňuje zobraziť obraz v rozlíšení 288 × 256 pixelov. Každá horizontálna šestica pixelov môže byť zobrazená navyše v 4-och módoch:
BLINK | BRIGHTNESS | zobrazenie |
---|---|---|
L | L | normálne |
L | H | zvýšený jas |
H | L | normálne + blikanie 1 Hz |
H | H | zvýšený jas + blikanie 1 Hz |
Najpracnejšou úlohou videoprocesora je serializácia jedného TV mikroriadku, t.j. rozklad 48 bajtov do 288 pixelov spolu s grafickými atribútmi v reálnom čase. To vyžaduje spracovať 48 bajtov počas 48 µs, teda zvládnuť konverziu 8 Mb/s dát do 6 Mpx/s (megapixelov za sekundu). To znamená pre každý bajt vyslať adresu na adresnú zbernicu, prečítať ho, vyslať postupne 6 po sebe idúcich pixelov, inkrementovať ukazovateľe .... Pri použití procesora ATmega128 taktovaného na 18 MHz by sme museli jeden pixel vygenerovať za 3 periódy hodín. Keďže bežne dostupný je procesor bežiaci na 16 MHz, bolo nutné urobiť kompromis a generovať nerovnako široké pixely podľa tabuľky:
P0 | P1 | P2 | P3 | P4 | P5 | = 6 pixelov (1 µs) |
---|---|---|---|---|---|---|
3 clk | 2 clk | 3 clk | 3 clk | 2 clk | 3 clk | = 16 clk@16 MHz |
3 clk | 3 clk | 3 clk | 3 clk | 3 clk | 3 clk | = 18 clk@18 MHz |
Dva pixely z každej šestice sú skrátené na 2/3 šírky normálneho pixelu aby 6 pixelov bolo vygenerovaných za 16 periód hodín, t.j. za 1 µs. Pri takte 18 MHz sú pixely (po rekompilácií programu) rovnako široké. Frekvencia procesora je plne voliteľná konštantou v programe. Pri nastavení frekvencie (a rekompilácií) na nižšiu hodnotu ako 16 MHz nie je možné generovať 288 pixelov na TV riadok, ale úmerne sa zníži počat pixelov na riadok. Napríklad pri 8 MHz je to 144 pixelov. Podotýkam o tejto možnosti - pri oživovaní konštrukcie je možné začať s 8 MHz interným RC oscilátorom. Ale na reálne používanie je to veľmi pomalé, obraz sa trasie (pretože RC oscilátor je menej stabilný), je viditeľná iba cca polovica z každého TV riadku. Pri 8 MHz emulácia PMDčka nebeží už v reálnom čase, procesor ide príliš pomaly.
Serializácia videodát spolu s grafickými atribútmi je možná aj vďaka špeciálnemu rozloženiu signálov VIDEO_DATA a BRIGHT na porte PORTE, ktoré umožňuje využiť inštrukciu aritmetického posuvu vpravo (ASR). Blikací atribút BLINK je realizovaný čisto softvérovo.
Na vytvorenie úplneho kompozitného videa potrebujeme okrem modulačného signálu VIDEO_DATA taktiež synchronizačný signál SYNC. Horizontálny synchronizačný signál s opakovacou frekvenciou 15625 Hz a šírkou impulzu 4.7 µs negatívnej polarity je realizovaný interným PWM modulátorom vyvedenom na pine OC3A. Polohu horizontálneho synchronizačného impulzu je možné nastaviť takmer ľubovoľne vzhľadom na začiatok generovania TV mikroriadku - konštantou v programe. V súčasnej verzii sa 6 µs po horizontálnom synchronizačnom impulze sa začína kresliť prvý pixel daného mikroriadku. Za jednu sekundu sa teda zobrazí 15625 mikroriadkov čo tvorí 312 mikroriadkov s opakovacou frekvenciou 50.08 Hz. Je zvolené neprekladané riadkovanie, t.j. susedný párny aj nepárny snímok sú totožné. (Klasická TV norma uvažuje o 625 TV riadkoch, ktoré sa prenášajú s opakovacou frekvenciou 25 Hz systémom: najprv párny snímok tvorený 312.5 riadkami a potom nepárny snímok 312.5 riadkov. 312.5 riadkové snímky sa teda prenášajú frekvenciou 50 Hz.)
Z celkového počtu 312 mikroriadkov sa aktívne zobrazuje 256 mikroriadkov. Zvyšné mikroriadky sú nepoužité alebo slúžia na prenos snímkových (vertikálnych) synchronizačných impulzov. Vertikálny synchronizačný impulz tvorí 5 TV mikroriadkov tvorených s predĺženým horizontálnym synchronizačným impulzom na 32 µs. Poloha - vertikálne a horizontálne posunutie obrazu je možné zmeniť v programe zmenením práve posunutia synchronizácie. Jedná sa o zjednodušené implementovanie TV normy. Konštrukcia bola overená na televízoroch: CTV 2134A a ďaľších. Pri vývoji obslužného programu bola odhalená nutnosť generovať vertikálny synchronizačný impulz ako 5-ticu predĺžených horizontálnych impulzov na 32 µs. Jeden impulz proste niektorým TV prijímačom jednoducho nestačil na snímkovú synchronizáciu.
Keďže ATmega128 je vyťažená generovaním videosignálu, vygenerovanie každého TV mikrotriadku trvá cca 50 µs zo 64 µs. Zvyšný čas spätného chodu lúča cca 12 µs je využitý práve na emuláciu správania procesora Intel 8080 a ostaných obvodov PMDčka.
Konštrukcia plošného spoja bola navrhnutá tak aby bola realizovateľná na jednostrannej doske plošného spoja (freeware EAGLE umožňuje navrhovať max. 10cm×10cm obojstranne) ako vidíme na obrázku č.2. Najpracnejšou úlohou bolo zabezpečiť nekríženie vodičov, čo sa takmer podarilo až na jeden signál, ktorý je nutné prepojiť prepojkou PAD1 s COMPOSITE_VIDEO (CINCH) konektorom. Zabezpečiť nekríženie ostatných signálov na DPS sa podarilo najmä vhodným priradením signálov I/O portov procesora ATmega128, na schéme je to vidieť ako nelogické poprehadzovanie jednotlivých signálov adresnej a dátovej zbernice. Taktiež niektoré bity I/O portov sú použité iba rozvod iných signálov alebo napájania, najmä v priestore pod procesorom.
Obrázok č.2
Postup výroby DPS:
Po správnom osadení všetkých súčiastok a konektorov vyskúšajte pripojiť prúdovo obmedzený zdroj napätia (napr. adaptér) cca 9-15 V jednosmerných na napájací konektor. Na napájacích pinoch procesora skontrolujte prítomnosť napájacieho napätia +5 V. Ak je napájanie procesora v poriadku, pripojte ISP programátor na zbernicu SPI a skontrolujte opäť napätie, či pripojený programátor nemá veľkú spotrebu. Otestujte funkčnosť ISP SPI rozhrania napríklad prečítaním FLASH/EEPROM/fuse bitov z procesora.
Následne je možné prikročiť k nastaveniu poistiek (fuses) procesora a nahratiu obsahuje pamäte FLASH a EEPROM do procesora ATmega128.
Na nahratie (upload) emulačného programu do pamäte FLASH a EEPROM a nastavenia poistiek (fuses) procesora Atmega128 využívame rozhranie SPI vyvedené na konektore JP1 (ISP). Pretože niektoré signály rozhrania sú používané aj rozhraním ku PS/2 klávesnici je bezpodmienečne nutné pred uploadom ju odpojiť, pretože klávesnica by prenos rušila. Počas uploadu môžeme na pripojenom TV sledovať horizontálne čiary, indikujúce prebiehajúci prenos - podobne ako kedysi na legendárnom ZX Spectre pri nahrávaní programov z mgf pásky. Na upload súborov cez SPI rozhranie sa osvedčil program PonyProg a avr-dude z balíka utilít WinAVR.
Na prepnutie procesora do módu ATmega128 a použitie externého kryštálu 16 MHz je potrebné nastaviť poistky takto:
fuse_high_byte = 0x81 fuse_low_byte = 0xFE fuse_ext_byte = 0xFFČiže to znamená:
EESAVE | 0 | Ostatné poistky nastaviť na hodnotu 1 (zakúpený procesor by mal mať tak nastavené). Nula v tabuľke znamená naprogramovaný bit (prepálená poistka). Upozornenie - ATmega128 je od výroby prednastavená v režime kompatibility s ATmega103, je nutné preto nastaviť správne poistky podľa tejto tabuľky, inak obslužný program nebude fungovať správne. M103C=1 |
M103C | 1 | |
BOOTSZ1 | 0 | |
BOOTSZ0 | 0 | |
SPIEN | 0 | |
CKOPT | 0 | |
CKSEL3 | 1 | |
CKSEL2 | 1 | |
CKSEL1 | 1 | |
CKSEL0 | 0 |
V adresári code/ predkompilované obsahy EEPROM pamäte pmd.eep a FLASH pamäte pmd.hex. S ich uploadom by ste nemali mať žiadne problémy. V prípade úspešného nahratia dát do pamätí (a správnom nastavení poistiek) by ste mali na pripojenom TV prijímači káblom CINCH-SCART prečítať hlásenie:
** PMD-85 READY /1.0 **
Následne stačí odpojiť ISP programátor a zasunúť PS/2 konektor AT klávesnice a môžete začať pracovať s Vaším novým PMDčkom. ISP programátor a klávesnica nesmú byť zapojené súčasne!, pretože PC-AT klávesnica zdiela port spolu s ISP programátorom.
Ako do procesora napáliť programy o ktoré máte záujem z pôvodného PMD sa dozviete v nasledujúcich ďalej - je však potrebné mať možnosť prekompilovať zdrojové súbory. Z hľadiska elektromagnetickej kompatibility nie je vhodné mať súčasne pripojený TV prijímač a zasunutý ISP programátor v našom PMD + počítač PC, hrozí nebezpečie vytvorenia zemnej slučky pri nedokonalom oddelení zdrojov jednotlivých prístrojov od siete!
Ako vstupnú perifériu používalo PMD-85-1 neštandardnú QWERTZ klávesnicu, ktorej klávesy sú namapované na PS/2 klávesnicu nasledovne:
ENTER = EOL - ekvivalent ENTER-u na PMDčku
CTRL = STOP - kláves zastavenia programu
ALT = MENU - kombináciou ALT a iného klávesu sa vyvolávajú špeciálne funkcie:
Esc | K0 | K1 | K2 | K3 | K4 | K5 | K6 | K7 | K8 | K9 | K10 | K11 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RCL | !1 | "2 | #3 | $4 | %5 | &6 | '7 | (8 | )9 | -0 | =_ | <- | WRK | ?/ | C-D | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
CLR | Q | W | E | R | T | Z | U | I | O | P | @ | ^\ | EOL | INS | HOME | |<- | INS | DEL | |<- | |||||||||||||||||||||||||||||||||||||||||||||||||||
A | S | D | F | G | H | J | K | L | +; | *: | DEL | END | ->| | <- | HOME | -> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Shift | Y | X | C | V | B | N | M | >, | <. | ?/ | Shift | ^\ | |<- | |<- | END | ->| | EOL | |||||||||||||||||||||||||||||||||||||||||||||||||||||
STOP | MENU | MENU | STOP | <- | ->| | -> | INS | DEL |
Treba upozorniť že pôvodné PMD-85/1 bolo osadené nekvalitnou klávesnicou a preto bolo softvérovo realizované potlačenie zákmitov jej kontaktov. Preto niekedy môžete mať pocit že sa klávesnica zasekla, ale je to vlastnosť pôvodného SCAN algoritmu PMDčka, ktorým sa zákmity ošetrovali. Príliš krátke stlačenie alebo príliš rýchle písanie na klávesnici je náchylné na výskyt stavu zablokovanej klávesnice, ale to je dané nedokonalosťou firmware PMD-85/1.
Medzi základné povely, ktoré by som Vám dovolil pripomenúť patria:
MGLD XY(napríklad MGLD 02) spôsobí nahratie hry (alebo programu) z magnetofónovej pásky, ktorá je v našej konštrukcií realizovaná ako časť FLASH pamäte ATmega128. XY je dekadické dvojciferné číslo, pod ktorým je daný program uložený na páske. Niektoré programy v strojovom kóde majú samospúštanie (realizované nahratím časti zásobníka z mgf pásky), niektoré treba spustiť povelom:
JUMP ADDRkde ADDR je 4-ciferná hexadecimálna adresa spustenia. Drvivá väčšina hier pre PMDčko používa na štartovanie tieto adresy: 0000, 0100,1000, 1500 alebo 2000. Ak spúštaciu adresu hry neuhádnete, zrejme spustite náhodné dáta, ktoré Vám premažú RAM-ku a preto je nutné hru alebo program nahrať povelom MGLD ešte raz. Veľmi užitočná je RESETovacia kombinácia kláves ALT+ESC (resp. ALT+1).
DUMP ADDRvýpis obsahu pamäte od adresy ADDR
BASIC Gspustenie interpretera BASIC-u. Na nahrávanie programov pod BASICom treba použiť príkaz:
LOAD Y(napríklad LOAD 10) na nahratie programu z magnetofónovej pásky (Y je dekadické číslo programu, pod ktorým je uložený na páske) a spustiť ho je možné príkazom:
RUN
Samozrejme že PMDčko pozná omnoho viac príkazov, v BASIC G Vám môžem odporúčiť nahrať si nejakú BASIC hru (napr. WURMI, BOMBARDER) a príkazom LIST si pozrieť zdrojový program. Určite sa na nejaké finesy o niekdajšom programovaní rozpamätáte.
Emulačný softvér pre ATmega128 je napísaný v assembleri v kombinácií s preprocesorom - skriptovacím jazykom PHP. Na kompiláciu odporúčam mať nainštalované balíky WINAVR, AVRASSEMBLER a skriptovací jazyk PHP. Prípadne rozdiely v inštalácií nastavte v súbore code/Makefile. Jednotlivé zdrojové súbory sú uložené po adresároch:
adresár | súbor | popis |
code/ | 8080.asm | rozskoková tabuľka jednotlivých 256 kódov inštrukcií procesora 8080. |
basic1.rom | binárny obsah ROM modulu s BASIC-G | |
monit1.rom | binárny obsah ROM PMD 85/1 - firmware (MONITOR) | |
basic1.asm | obsah ROM modulu BASIC-G vo formáte ASM, vygenerovaný skriptom games.php | |
fuses_18.txt | textový popis nastavení konfiguračných fuses | |
Makefile | dávkový súbor pre skompilovanie zdrojových kódov. Nastavuje sa v ňom adresár $(MGFDIR), z ktorého sa prikompilujú PMD-85/1 programy do vstavanej magnetofónovej pásky. Príkazom make all skompilujete všetky zdrojové kódy a nahráte obsah pamätí FLASH a EEPROM do mikroprocesora. Príkazom make pmd.hex preložíte zdrojové kódy, príkazom make eeprom preložíte zdrojové kódy a nahráte obsah EEPROM pamäte a napokon make flash preložíte zdrojové kódy a nahráte ich do FLASH pamäte. | |
macro.asm | definície priradenia jednotlivých I/O pinov procesora, jednoduché makrá | |
kbd.php | prerušovacia obslužná rutina príjmu znaku od USART0 od klávesnice PC-AT. Po príjme znaku sa v internej bitovej mape vo formáte 16x5 bitov zaznačí informácia o stlačení alebo pustení jednotlivého klávesu. Taktiež je realizovaná OSD obrazovka po stlačení ALT+S, reset PMDčka po stlačení ALT+1 (ALT+ESC). | |
kb_lookup.asm | Mapovacia tabuľka SCAN kódov klávesnice na ich pozíciu v matici kláves PMD-85 | |
monit1.asm | obsah ROM pamäte PMD-85/1 vo formáte ASM vygenerovaný skriptom games.php. Je uložený do pamäte EEPROM | |
video.php | generovanie TV obrazu, serializácia TV riadku, synchronizačných impulzov, zvuku. | |
pmd.php | Hlavný zdrojový súbor, inicializácia, emulácia jednotlivých inštrukcií procesora 8080. | |
pmd.hex | obsah FLASH pamäte ATmega128, získaný kompiláciou | |
pmd.eep | obsah EEPROM pamäte ATmega128, získaný kompiláciou | |
pmd.asm | Zdrojový assemblerovský súbor získaný po prejdení pmd.php vykonaním PHP programu | |
pmd.lst | výpis - listing po preložení pmd.asm | |
pmd.map | výpis priradenia assemblerovských symbolov, získaný kompiláciou pmd.asm | |
games.php | Skript na konverziu binárnych ROM modulov do assemblerovskej formy. Taktiež je určený na zbalenie obsahu romXY adresárov, ich RLE kompresiu do jedného súboru | |
games_rom.asm | obsah magnetofónovej pásky PMD-85/1 vo formáte ASM vygenerovaný skriptom games.php. Dáta su komprimované RLE metódou - opakujúce bajty sú nahradené značkou, hodnotou a počtom opakovaní. | |
docs/ | index.html | Dokumentácia |
schema/ | schema128.sch | Schéma zapojenia emulátora PMD-85/1 vo formáte EAGLE 4.10 |
schema128.brd | Obrazec dosky plošného spoja vo formáte EAGLE 4.10. Opäť upozorňujem na nutnosť jednej prepojky vo vedení signálu COMPOSITE_VIDEO | |
plosak_top_mirrored.eps | Zrkadlový obrazec dosky plošného spoja vo formáte EPS- postscript, vhodný na tlač na fóliu pri výrobe DPS fotocestou. Opäť upozorňujem na nutnosť jednej prepojky vo vedení signálu COMPOSITE_VIDEO | |
rom0/ |
AUTO.PMD BOMBARDE.02B Boulder Dash.06$ FRED.04$ HORAC.25$ INVAZE.PMD MANIC1.02$ PAMPUCH.18$ PENETRAT.05$ Tank.00$ Tehly.PMD WURMI.07B ZABY.PMD | Obsah mgf pásky - hry a programy v strojovom kóde a v BASIC-u PMD-85/1. Kedže je limitovaný obsah internej FLASH pamäte (na hry a PMDčkové programy zostáva cca 113 KB), nepodarilo sa ani po kompresií uložiť viacej PMD-85/1 programov. Ak chcete zaspomínať na iné hry, odporúčam pozrieť či sa nenachádza v inom adresári romXY/. Prepísať v code/Makefile premennú $(MGFDIR) na hodnotu rom1 alebo rom2. Alebo môžete vytvoriť vlastný romXY/ adresár s vlastným obsahom. |
rom1/ |
BLUDISTE.23$ Ceres1.pmd FLAPPY.24$ KANKAN.27$ KARE3D2.00$ MANIC23.03$ PUZZLE.02$ | Obsah mgf pásky - ďaľšie hry a programy v strojovom kóde PMD-85/1. |
rom2/ |
HLIPA.21$ HORAC.25$ PEXESO.PMD SABOTER.28$ WILLY.15$ | Obsah mgf pásky - ďaľšie hry a programy v strojovom kóde PMD-85/1. |
Vlastná emulácia procesora 8080 je pekným príkladom extrémného programovania za účelom vyžmýkania maximálnej priepustnosti programu. Vlastne je to dôsledok RISC architektúry, keď sú inštrukcie procesora optimalizované pre programátora a súčasne na rýchlosť vykonávania. Spolu s 32 takmer voľne použitelnými registrami je radosť programovať. Vôbec sa to nedá porovnávať s programovaním INTEL 8080, kde bol jeden univerzálny register a programovanie bolo ako valčík: 1.vlož do akumulátora jeden operand, 2.vykonaj operáciu, 3.ulož výsledok z akumulátora.
Emulátor PMDčka je komplexný program napísaný v assembleri z ktorého asi najzaujímavejšie časti sú:
i_cycle: _nop: 00053d bbc2 out ADDRL,_PCL 00053e bbd8 out ADDRH,_PCH 00053f 9621 adiw _PCL,1 ; wait a minute 000540 e0fa ldi ZH, high(i_table) 000541 b3e3 in ZL, DATAIN 000542 9409 ijmp .... i_table: 000a00 cb3c rjmp _nop 000a01 cd8f rjmp _lxi_b 000a02 c144 rjmp _stax_b 000a03 cd72 rjmp _inx_b .... _inx_b: 000776 194b sub C, _255 000777 088b sbc B, _255 000778 cdc4 rjmp i_cycle
_mov_ma: 000574 bad5 out DATAOUT,A 000575 9adf sbi CONTROLRAM,MEMRD 000576 bab4 out DATADIR,_255 000577 bae2 out ADDRL,L ; output 16 bit address 000578 baf8 out ADDRH,H 000579 fcf7 sbrc H,7 ; skip if address < 0x8000 00057a fcf6 sbrc H,6 ; skip if 6th bit is clear 00057b 98de cbi CONTROLRAM,MEMWR 00057c 9ade sbi CONTROLRAM,MEMWR
000054 b923 out VIDEOPORT,video_tmp ; 0.bit 000055 9525 asr video_tmp 000056 ba92 out ADDRL,video_ptr_l ; output low address 000057 b923 out VIDEOPORT,video_tmp ; 1.bit 000058 9525 asr video_tmp 000059 b923 out VIDEOPORT,video_tmp ; 2.bit 00005a 9525 asr video_tmp 00005b 9493 inc video_ptr_l 00005c b923 out VIDEOPORT,video_tmp ; 3.bit 00005d 9525 asr video_tmp 00005e b3a3 in XL,DATAIN ; load next 6 pixels :X X 5 4 3 2 1 0 00005f b923 out VIDEOPORT,video_tmp ; 4.bit 000060 9525 asr video_tmp 000061 b923 out VIDEOPORT,video_tmp ; 5.bit 000062 912c ld video_tmp,X
Záverom možno už iba dodať že konštrukcia dokazuje pokrok v technológiach v priebehu približne 20-tich rokov (1985-2005) v kategórií tuctových mikroprocesrov - Intel 8080 a ATMEL MEGA128 a celkovú technickú úroveň dnešnej doby.
Tiež konštrukcia niekdajšieho PMD-85/1 z produkcie TESLY Piešťany je veľmi vďačná v tom že sa vlastne zobral pôvodný softvér, ktorý tvorilo a ladilo množstvo šikovných ľudí. Efekt je takmer dokonalý - klasické hry (FLAPPY, BOULDER DASH, MANIC MINER, TETRIS...) v kombinácií jednoduchej konštrukcie s novým procesorom... Bez výborného softvéru by vlastne vznikol len ďalší generátor testovacích televíznych obrazcov. Len moje laborovanie ako vtesnať PMDčko do iného procesora je niekoľkoročné úsilie a na vývoj každej zložitejšej hry bol ich autorom obetovaný čas rádovo tiež roky, suma sumárom - keby začnete vyvíjať takéto zariadenie (malú hernú konzolku) od nuly, bude Vám to trvať zrejme niekoľko desaťročí.
Forever 8 bits, forever PMD-85 ...
Ing. Peter Chrenko, © 2006