Virtuális retro: emulátorban fejleszteni? (Avagy: így programoz(t)unk mi!)

Anno az ámítástechnikát – nem röhögni! – egy C16-os „home computer”-en kezdtem még az általánosban. Az se ma volt... Viszont kedvencnek máig megmaradt ez a széria, amit a Commodore 264-nek hívott. Ebből a szériából Magyarországon igen sokat adtak el anno, a C16 meg a Plus/4 volt az „iskolaszámítógép” a hazai gyártású készülékekkel együtt. Így nem csoda, ha a leglelkesebb felhasználótábor Magyarországon volt, sőt van még a mai napig! (Nyilván töredék méretű a „régi szép idők”-höz képest, de akkor is...)

A programfejlesztés régen úgy ment, hogy az ember begépelte a mágikus MONITOR parancsot, ezzel belépett egy egyszerű assembly nyelven programozni / hibát keresni segítő „felületre”. Ez volt a TEDMON, ami igen nagy segítség volt ahhoz, hogy gépi kódban az ember elkezdjen alkotni. A C64-ből pl. hiányzott ez a „segédprogram”, ott egy csomó ilyet készítettek, de mindet be kellett tölteni, foglalta a memóriában az amúgy se bőséges helyet. (Persze a bővítőkártyák, mint az Action Replay meg a Final Cartridge már megoldották ezt a problémát, sőt, de ez itt erősen off.)

Ezzel a kis utility-vel a memóriát lehet közvetlenül turkálni, mindenféle módon nézegetni, de az alapvető I/O műveleteket is el lehet innen végezni. (Memóriába betöltés / memóriából mentés kazettára / floppyra leginkább...) Nem egy „bolondbiztos”, „felhasználóbarát” dolog, de ahhoz képest igen érdekes alkotások születtek a segítségével. (Nem „Felhasználóbarát”? Mit szólnak ehhez a kijelentéshez azok, akik lyukkártyákkal nyomták... :) ) Persze ma már hosszabb programok lekódolásához nem állnák neki a segítségével, de régen nem volt más. Voltak persze különböző assemblerek, de mindegyiknek megvolt az a hátránya, hogy foglalták a memóriát. Ez még nem az az éra, amikor a beírt parancsot a háttértárról töltjük be gyorsan... Szóval maradt „ez”.

Nálam egy későbbi időszakban már PC-n „folyt” a fejlesztés. DOS-ra volt egy cross-compiler, a TASM, ami akkor szinte „szabvány” keresztfordító volt, egy csomó fajta CPU-t támogatott, köztük a 6502-őt is. Ennek a processzornak a leszármazottja, egy vele teljesen kód-kompatibilis CPU van a plus/4-ben, 8501 típusszámon. (A C64-ben levő 6510 is 6502-es „mag”.) (Érdekesség: ez a fordító úgy tudott sok fajta CPU-t, hogy az architektúrák „leírása” egy mezei szövegfájlban van, mindegyik targethez saját. Másik processzort hozzáadni emiatt nem egy bonyolult feladat, a linkelt archívban is van vagy 10 fajta...)

Az assembler csak egy dolog, a leforgatott cuccot valahogy át kellene varázsolni a „célgépre”, ami nem egy egyszerű feladat. (...volt akkoriban.) Hiába volt (mert akkor még nekem volt) 5¼-es floppy meghajtó a pécében, azzal nem lehet olyan formátumban írni a lemezt, hogy egy 1541 (ill. 1551) el tudja olvasni, így más megoldás kell... Az egyik az, hogy magát az 1541-et kapcsolom a PC-hez, erre akkortájt már volt lehetőség (X1541 kábel és különböző változatai, emlékszik még rá valaki? :) ), de két meghajtóm nem lévén, elég szívás a szituáció. Meg egyébként is, lemezezni kényelmetlen. A megoldás az lett, hogy a PC párhuzamos portot összekötöttem a Plus/4 USER portjával, így volt 12 jelem adatátvitel + handshake céljára. Ehhez készült négy program, vagyis két programpár. Az egyik pár a PC → plus/4 a másik meg a plus/4 → PC irányt valósította meg. A PC-s oldal TurboPascal-ban készült, az adatátvitel 8088 assemblyben. (Ezt valamennyit még a szakközépben tanultam, akkor döntöttem el, hogy ezt a sz... én nem fogom programozni... :) ) A plus/4-es oldal egyértelműen asm, csak annyival lett megvadítva, hogy a KERNAL-t (a gép ROM-jában levő FW egy része) egy kicsit „megmókoltam”, megszakításból figyelte a PC-s kommunikáció igényét, ha akart valami jönni, akkor mindenféle user aktivitás nélkül szépen „elszedte”. A DOS alatt használt VC-ben a lefordított „ojjektum” kiterjesztésére beállítottam a fájl-küldést, így a lefordított cuccot egy mezei ENTER-rel simán átküldtem a plus/4-be. Ez így már eléggé „user-friendly”. (A V2.0-s változat: a fordításhoz úgyis készítettem egy batch fájlt, az „áttolás” bekerült a végére, még egypár gombnyomkodás megspórolva... :) )

Azóta azért pár év eltellett, de még manapság is eszembe jut, hogy jó lenne újra nekiállni plus/4-re kódolni. A lelkesedés mondjuk elég hamar elmúlik... :) De ha mégis megmarad, akkor mi a legegyszerűbb módja a dolognak? Hát persze hogy a PC-s emulátor, mivel ezek a mai vasak már elég erősek ahhoz, hogy egy 27 éves hardvert emulálni tudjanak. Szóba jöhet két program, mondanom sem kell, mindkettő „hazai” fejlesztés. (Ill. van még pár... A VICE is jó lehetne, de ez inkább C64 emulációban erős. Aztán ott a minus4, ill. ennek a JAVA-s változata, az utóbbi megy böngészőben applet-ként... :) ) A most de facto szabványnak tekintett emu a Yet Another Plus/4 Emulator, vagy ahogy mindenki ismeri a YAPE. Jó kis stuff, de sajnos csak Windows verziója van. (Van neki egy OS, SDL-es változata is, de ősrégi, az alapgépen kívül gyakorlatilag semmit se emulál, emiatt maximum érdekességnek jó.) A program a wine segítségével tulajdonképpen használható Linuxon is, de eléggé „nemszeretem” módszer, jobb lenne a natív megoldás... (A tisztelt fejlesztő urat ugyan megkértük párszor, hogy az SDL-es változatot aktualizálja, de nem tűnik úgy, hogy magas prioritásúnak kezelné a feladatot... :) (Update: azóta azért ez a feladat is haladt sokat, most már ~elég jó az SDL-es verzió is.)) Mindenesetre ez az emu az, amivel a legtöbbször összefut az ember. De most nem erről lesz szó...

A másik emulátor a „nagy rivális”, a beszédes nevű plus4emu, ez egy „szép” multiplatformos szoftver. Viszont erről nem sokat hallani, vajon miért? Emulál mindent, amit kell, de nekem eddig nem sikerült beizzítanom valami miatt. Emlékeim szerint ezt anno le akartam magamnak forgatni, de az azért annyira nem egyszerű, kell hozzá egy marék devel cucc... Viszont most ahogy nézem a letöltési oldalt, vannak linuxra is előfordított bináris pakkok... A dátumokból ítélve ezek már akkor ott voltak, amikor próbálkoztam a forgatással. Azokról viszont semmi emlék... Valószínűleg a CenOS5-ben jó régi volt pár lib (szokás szerint...), ami miatt el se indultak, emiatt próbálkoztam volna? Na mindegy végül is, CentOS6 alatt most újra megpróbálva, hibátlanul megy, ráadásul az x86_64-es verzió. (Nesze neked wine-s YAPE... :) )

A „szép” nem véletlenül van idézőjelben; a felület az FLTK-re épül, pici, gyors, de legalább csúnya. (Persze ez ízlés kérdése... Nekem jobban bejön egy GTK-s vagy Qt-os felület, de jelentősége kb. semmi, úgyse azt nézzük... :) ) Ami egy kicsit „idegen” a menürendszerében, hogy a beállítások szét vannak szórva mindenfele, ez a rész nem túl barátságos, de persze meg van benne a logika. Jó esetben úgyis egyszer fogja az ember beállítani, utána már úgyse lényeges. De beállítani szó szerint MINDENT be lehet, ahhoz képest hogy milyen „sutácska” benyomást kelt, a tudása elég meggyőző... Az én „alap” beállításaim mellett kb. 40% körüli a CPU használata, de van egy izgalmas video-üzemmódja, ahol az emulált gép képfrissítési frekvenciáját „odakonvertálja” az éppen használt megjelenítőjéhez. Ez elég szépen megfekszi a gyomrát a gépnek, ilyet még nem láttam:

Olyat, hogy egy process 135%-os CPU terhelést okozzon, azért nem semmi elérni... :) Ettől függetlenül szépen működik döcögés nélkül így is... Tulajdonképpen arról van szó, hogy egy sok gigahertzes géppel emulálunk egy 886KHz/1.77MHz-s gépet... És kell is alá a vas. :) (Ez az, amikor izomból emulálunk egyszerű célhardvereket...)

Emu az van, kellene valami „környezet”, amivel fejleszthetek... A TASM-ot lehetne használni DosBox-szal, de az megint ilyen „nyögvenyelős” történet, azt inkább kihagynám. De volt anno egy másik assembler, amit használtam, arról az rémlett, mintha Open Source lenne... Csak mi is volt a neve? Talán AS? De erre rákeresve elég sok olyan találat jön, aminek köze sincs ahhoz, amire vadászok. De némi kergetőzés, meg verziószám keresés után meglett a darab: The Macroassembler: AS. „Ő” lesz az... Ebből az utolsó stabil az nem mai gyerek, de végül is ha működik, akkor nem baj ha régi. Viszont ebből tényleg nincs előfordított linuxos verzió, szerencsére nem túl bonyolult a fordítás. A README fájlban azt írják, hogy az installáláshoz olvassam el az INSTALL fájlt. Jó... Abban az írják, hogy:

  1. see if there are additional README files for your platform
  2. create a Makefile.def
  3. compile
  4. execute the test suite
  5. build the documentation
  6. install into the system directories

Az 1.41r8 változat 1999-es dátumú, szinte még friss ropogós... És persze nem akar fordulni (gondolom azóta történt egy s más a gcc háza táján...), de a „latest” az pörög egy kis túrás után. A második pont lényeges: a Makefile-ba belenézve „behúzza” az elején a Makefile.def-et. Ezt kell megalkotni, de szerencsére van egy Makefile.def-samples könyvtár, ott van jó pár minta a különböző platformokhoz. Ebből nekem a Makefile.def-i386-unknown-linux2.x.x a szimpatikus, ezt kell kimásolni a „gyökérbe” a Makefile mellé Makefile.def néven. Majd jöhet benne pár módosítás:

CFLAGS = -g -O3 -mcpu=i586 -fomit-frame-pointer -Wall
BINDIR = /usr/local/bin 
INCDIR = /usr/local/include/asl 
MANDIR = /usr/local/man 
LIBDIR = /usr/local/lib/asl 
DOCDIR = /usr/local/doc/asl 

Ezek a sorok módosulnak, mégpedig erre:

CFLAGS = -g -O3 -mtume=generic -fomit-frame-pointer -Wall
BINDIR = /usr/bin 
INCDIR = /usr/include/asl 
MANDIR = /usr/share/man 
LIBDIR = /usr/lib64/asl 
DOCDIR = /usr/share/doc/asl 

Az első sor csak annyit tesz, hogy nem i586 lesz a lefordított pakk architektúrája, hanem annak az alapja, amin a fordítás készül. Esetemben ez egy alap x86-64 lesz. A többi csak az install könyvtárak megadása, hogy kb. hasonlítson a jelenlegi felépítésre... A lib64-ben tulajdonképpen architektúra-független fájlok fognak kerülni (A lefordult binárisok szövegei), de mindegy...

Ezután jöhet a fordítás (make), majd egy teszt (make test). Ez annyit csinál, hogy az összes támogatott architektúrára fordít egy tesztet az imént készült fordítóval. A végén kiír egy összegzést, hogy hány fordítás volt sikeres/sikertelen. Ha a sikertelen = 0, akkor örülünk... :) Aztán jönne a dokumentációk „fordítása” (make docs), de nincs LaTeX telepítve, ehhez meg az kellene... Mindegy, ez nem fontos, a man oldalak ettől még megvannak. Majd az install (root-ként make install), ez a helyére másol mindent. Látszólag rendben az egész... Valamivel le kellene tesztelni.

Először is: az előző „tesztprogramom” egy text fájlban (test.asm) a következőképpen néz ki:


	cpu	6502				;CPU típusa

start_addr	=	$1100			;Kezdőcím 

monitor		=	$ff52			;MONITOR belépési címe 
irq_continue	=	$ce0e			;Gyári IRQ rutin 

	ORG	start_addr-2 
		ADR	start_addr		;Töltési cím berakása 

		sei 
		lda	#interrupt & $ff	;IRQ cím LO BYTE
		sta	$0314 
		lda	#interrupt >> 8		;IRQ cím HI BYTE
		sta	$0315 
		cli 
		jmp	monitor 

interrupt	lda	$ff19 			;Keretszín beolvasva
		eor	#$46 			;Forgatva
		sta	$ff19 			;Visszaírva
		jmp	irq_continue 		;Eredeti megszakítás-rutin végrehajtása

	END 

Ezt ezek után le kellene fordítani:

asl test.asm -L -u -x

Az -L paraméter bekapcsolja a fordítás közbeni listafájl generálását, az -u engedélyezi a memória-használat vizsgálatát (mivel több ORG direktíva is megadható, ennek a segítségével figyelhető az esetleges „overlapping”), az -x meg „bővebb” (mihez képest... :) ) hibakiírásokat eredményez. (Elvileg...) A fordítás kész, de a végeredményhez csak egy test.p fájl lett, ebből még meg kell kreálni a plus/4-be (ill. most az emulátorba) tölthető programot:

p2bin test.p test.prg -r '$-$' -l 0 -k

Ide is jöhet pár magyarázat: az -r paraméter azt mondja meg, hogy milyen memóriaterületet kell „kimásolni” a végeredmény fájlba. Itt az -r '$-$' paraméter azt jelenti, hogy az első használt címtől az utolsóig történjen a másolás. Az -l 0 azt adja meg, hogy azokon a helyeken, ahol a .p fájl nem tartalmaz adatot, azt milyen értékkel töltse föl. (Itt 0 lesz. A fordított programban lehet több ORG direktíva, a végeredményben viszont így lehetnek „lukak”, üres területek, ez ezekről a területekről szól.) A -k csak annyit tesz, hogy ha a „kimásolás” kész, a .p fájlt letörölheti, mivel az már nem kell.

Mivel ezt a „fordítás + másolás” mókát mindig el kell játszani, ezért készült hozzá egy sima szkript, amivel „egyszerűsíthető” a művelet (beszédes _ass.sh nevet találtam... :) ):

#!/bin/sh
PARAM=$1
asl $PARAM.asm -L -u -x
p2bin $PARAM.p $PARAM.prg -r '$-$' -l 0 -k

Ezek után a fordítást egy egyszerű _ass.sh test parancs kiadásával le lehet zavarni.

A végeredmény egy 28 byte-os fájl lett (test.prg), amit már be lehet tölteni az emulátorba:

És igen, működik, és igen, jól... A mai napra is megvan a sikerélmény. :) Most már neki is lehet állni kódolni. Csak a lelkesedésem tűnt el... :) De azért nem rossz ez. Viszont az „emulátorozás” valahogy nem hozza azt a „feelinget”, mint az eredeti vas. Azt hiszem elő kell szednem azt a „programletöltő” kábel projectet, van is pár ötletem...

balagesz

---

2011.10.19
2019.12.06. D8.

Hozzászólások

Kis érdekesség a fent említett assemblerhez: aaa - The Amazing AWK Assembler. Amúgy tetszett az írás. (Amúgy persze úgy könnyű, ha van az embernek monitorja. C64-esként nekem bizony kellett a floppimeghajtó és valami fejlesztőeszköz. De már gőzöm nincs, mit használtam, pedig nem keveset dolgoztam vele.)

Az a kerdes: programoztal-e C64-et? Ha igen, volt-e hozza valami "bovitesed", ami segitett? Egy "aranyos" tortenet jutott az eszembe abbol az idobol... A helyszin valamilyen klubhelyseg, valaki hozott egy C64-et, hogy valoszinuleg problema van a JOY portjaival, le tudnank-e tesztelni? Az egyik cimbi, rutinos Plus/4 juzer, egybol raugrott a feladatra. Gep bekapcsolva, Joystick bedugva, lenduletbol beirt egy 4 parancsbol allo basic sort, tesztelendo a portot... Majd egy RETURN utan kapott egy ?SYNTAX ERROR sort. Nezett butan, hogy mi van... Megneztuk hogy mit irt be, es konstans rohogesben tortunk ki paran. A beirt 4 parancsbol a C64 BASIC osszesen egyet ismert. :) A jot konnyu megszokni. Pedig egy "komoly" dologra hasznalhatatlan BASIC interpreterrol van szo. Hihetetlenul "bajban tudtunk lenni", ha egy C64 ele kellett valami miatt leulni... :) Ha nem hasznaltal elotte Plus/4-et, akkor valoszinuleg tenyleg nem hianyzott volna semmi. De errol is lehetne egy komplett blog-bejegyzest irni, hogy melyik gepnek mik az erossegei... Az igaz, hogy ami a C64-et sikeresse tette, azt a Commodore a 264-es szeriabol kihagyta. (Hivatalosan: mas piacra pozicionalta ezeket a gepeket. Szerintem: nem akart az amugy igencsak jol fogyo C64-nek konkurenciat allitani hazon belul. Ha a Plus/4-ben is lettek volna Sprite-ok, ill. a hangja legalabb olyan lett volna mint a C64-e, mindezt 3-ad aron, vajon mi lett volna? Sose tudjuk meg. :) )

igen, a BASIC nagyon jo volt a +4-ben (ill. a C16-ban, ugyanaz volt az is ha jol emlekszem, csak negyedannyi memoriaval), ezert szuletett egy rakas bovites C64-hez (pl. Simon's BASIC), persze azok csak meg jobban lezabaltak a memoriat
osszessegeben elmondhato, hogy a +4 szoftveresen, a C64 hardveresen volt nagyon jo (marmint a gyari csomagot tekintve)

anno mikor az elso gepemre acsingoztam, C16/+4-en megtanulva az alapokat nem is akartam C64-et pont a BASIC 2.0 miatt, aztan szerencsere megis az lett
lehet hogy ha +4-en kezdek, akkor assemblyt sem tanultam volna olyan behatoan :D
-
Slackware current / OSX Snow Leopard

Igen, programoztam. Azt ugyan nem állítom hogy a csapat aminek tagja voltam világhírű. Ettől még sok party-n ott voltunk, személyes ismeretségeim vannak a mai napig. Külföldi demo csapatokkal swap ment.
Kaptam email címet a c64.org -on, stb.

Először BASIC-ben programoztam, de rövid úton átálltam turbo assembler-re és később Action Replay-t vettem.

Ez az utolso mondant a lenyeg. :) Ha nincsenek ilyen "dolgaid", C64-en erosen "labon vagy love". Plus/4-en legalabb ott a beepitett MONITOR. Az azert meg ide kivankozik, hogy a Plus/4 joval olcsobb volt a C64-nel, nalunk azert is lett elterjedt. De az ar miatt sokunknak meg Floopy meghajtoja se volt, csak a Datasette. Assemblerezni, plane kazettaval meg eleg humoros... (Ez a kazettas dolog is erdekes: C64-es tulajok koreben sokkal tobb volt az 1541 is. Latszik is: egy normalis kazettas turbo nincs C64-re, Plus/4-en meg dunat lehetne veluk rekeszteni.) Az AR es tarsai viszont igen jo cuccok, az alapgep hianyossagait jol potoltak. Ilyen oldalrol (marmint kulonbozo HW bovitesek...) a Plus/4 a mai napig igen erosen le van maradva.

balagesz azért ne essünk a ló másik oldalára :)
simán monitorban asseblyzni egy ideig jó volt, amíg csinálsz egy rasterhurkát vagy dycp-et azaz pár egyszerű rutint, vagy rippelni dolgokat. De ha a kód amit csináltál elért egy bizonyos komplexitást és a sorszám már meghaladta a pár száz sort akkor sima monitor fényévekre van egy floppy+tasm+actionreplay kombótol. Azért a tasm-os macrok elég hasznos segítségek voltak.

Nem esek at a lo masik oldalara; azt hiszem nem egyrol beszelunk. :) Nem vitatom az assemblerek "letjogosultsagat", ezert is forgattam most magamnak egyet. Csak annyit szerettem volna mondani, hogy egy OOtB Plus/4-en van eselyed asm-ben kodol(gat)ni, mig C64-en ugyanez nem megy. Ott kell egy Floppy, egy assembler meg egy AR. :) Ill. az teny, hogy MONITOR-ban hosszabb kodokat irni nem eppen hatekony, de annakidejen igen sokan muveltek ezt a hobby-t megis. Termeszetesen Plus/4-en. (Tudom, en is csinaltam... :) )

Erre csak annyit tudok mondani hogy bár nekem sose volt sajnos +4-em azt viszont hamar észrevettem hogy mire anno rájöttem c64-en hogy mi az a monitor meg assembly addigra a +4 haverok már rég demokat kódoltak és igen amíg nem szereztem cartridge-t addig kifejezetten hiányoltam egy nem memoriát foglaló beépített monitort, meg hozzátenném hogy a +4-es basic az akkori időkben azért nem volt rossz cucc. Amúgy minden más szempontból én se irigyeltem a +4-et kivéve a gép házat :)

na igen, az internet elotti idokben nekem sem volt assemblerem, ugyhogy egy ido utan remekul mentek fejbol az assembly mnemonicok numerikus ertekei :)
ugyhogy tenyleg gepi kodot irtam, DATA sorokban volt a teljes gepi kod, byte-onkent felsorolva, nem volt egy leanyalom, de a rovid assembly betetekhez eleg volt (pl. szintetizator programhoz a lejatszas rogzitese, ahhoz a basic mar nagyon lassu volt)
-
Slackware current / OSX Snow Leopard

Nekem ezek szerint mákom volt. Ha nem is hamar, de sikerült asszem Turbo Assembler-t szerezni kazettára. Nehézkes volt így programozni, a végén lett is egy 1541/II-őm meg Action Replay kártyám.

Bennem is megvan a retro, újra assembly-ben kellene nyomni és C64-en. Ennek ellenére az emulátorhoz nekem sincs sok kedvem. Abban max játék, demo ha eljutok odáig.

A TASM-ról eszembe jutott egy régesrégi eset. Történt ugyanis, hogy én Borland C 2.0-ban programoztam, de ahhoz valami pattintott kőkorszakbeli TASM-ot adtak, nekem meg nagy vágyam volt egy újabb verzió, amihez nem nagyon tudtam hozzájutni. (a BBS és a 2400 baudos korszak csak később köszöntött be)

Egyszer látogatóban voltam egy ismerősömnél, aki a számítógépét gyakorlatilag csak játékra használta. Egyszercsak, a játékai között az egyik eldugott alkönyvtárban találtam egy roppant friss TASM.EXE-t. Örültem is magamnak, mire az illető kérdőn nézett rám... Kiderült ugyanis, hogy ő azt hitte, hogy az a Tasmania (helyesen: Taz-Mania) nevű játékprogram, csak "valamiért nem indul el, csak kiír valamit a képernyőre"... :)

Bár soha nem sikerült gepikodban (kopirájt báj Sótész Gögy) megtanulnom programozni, nagyon jó volt olvasni az írásodat, már csak a retro gépek iránt érzett abnormális vonzódásom miatt is :-D.
Mikor várható az első megademó? :-D

----
www.retrocomputer.tux.hu
www.sfveteran.hu

" Viszont az „emulátorozás” valahogy nem hozza azt a „feelinget” "

ebben van valami, van itthon winuae alá fullosan belőtt amiga rendszer golded+sasc-vel meg stb. de valahogy a lelkesedés addig tartott nálam amíg összeraktam a rendszert. Viszont még jó múltkor átugrottam egy öreg cimbihez szerzet egy amiga500-ast valahonnét, lényegében az alap a500 1 mega memóriával se hdd se más, floppyn betöltöttük masterseka-t és egész hajnalig ott lógtunk a gépen nagy élmény volt :)