HT-1080Z kazetta beolvasása IBM gépre

Ezen az oldalon található egy dokumentáció egy a HT kazetták IBM gépre beolvasását megoldó interfészről és a hozzátartozó programokról. Ezt az interfészt és programot Gál Gábor fejlesztette még régebben, az illesztő és a program egy 80x286 processzor, 10 MHz, 1 MB RAM, 2*20 MB merevlemez, 5.25 hüvelykes hajlékonylemez, CGA videokártya konfigurációjú gépen futott. Gábor jó sok (~100) programot annak idején be is olvasott, és BASIC text formára konvertált. (Ezek várhatóan nemsokára felkerülnek az oldalra.) Na vágjunk is bele...


HT-n immár...

Az egyik Eszes ismerősöm -- megörülve új nyomtatómnak -- megkért, ugyan már listáznám ki néhány HT-s programját. A kezembe nyomott tucat kazettának és köteg A/4-nek nem tudtam ellenállni. Bár a feladatot egyszer már megoldottam pár éve ZX Spectrumon, de az a gép most rokoni látogatáson van Pomázon. Így maradt az IBM AT.

És felszáll a fehér füst

Mottó: A tervező nem akkor tudja, hogy tökéleteset alkotott, ha már nincs mit hozzátenni, hanem ha nincs mit elvenni.
(Antonie de Saint-Exupéry)

Először egy kazettás magnetofont kellett illesztenem az IBM-hez. Mivel új HT-s állomány szalagra írására nem volt szükség, ezért csak az egyik irányt, a szalagról való beolvasást kellett megcsinálnom (hát persze, hogy a másik az egyszerűbb...).

A nyomtatóillesztő (Centronics port) megfelelőnek látszott a feladatra, ugyanis tucatnyi ki- és vagy 5 bemenete van (ami bőven elegendő), 5 V-os TTL (transistor-transistor logic) szintekkel működik, könnyen programozható (irodalom[1..2]). Nos, a magnó (MK-29) fejhallgatókimenetét (egyrészt ez általában van, másrészt ez a kimenet terhelhető, harmadrészt lekapcsolja a magnó hangszóróját, ami felettébb idegkímélő, szóval ezt a kimenetet) kellett TTL szintre illesztenem.

Az magnóillesztőm tehát a magnó fejhallgatókimenete és a PC nyomtatóvezérlője közé került. A magnó analóg jelet szolgáltat, ez a számítógép pedig digitális, tehát egy egybites analóg-digitál átalakítóról van szó. Gyakorlatban ez például egy komparátor, ami legegyszerűbben egy nagyon nagy erősítésű erősítővel valósítható meg. Az egyszerűség jegyében erősítőként (aktív elemként) egyetlen tranzisztort használtam (kis teljesítményű szilícium npn tranzisztor nagy erősítéssel, pl. BC238C, BC107C, ami van a fiókban).

A komparálási szintet egy trimmerpotméterrel (olyan, mint a hangerőszabályzó) állíthatóra terveztem, amire szükség is volt, ugyanis a szalagokon igen eltérőekre sikerültek a felvételek. Végül is három állítási lehetőség van a felvétel korrigálására: a magnó hangerőszabályzója, hangszínszabályzója és a komparálási szint állítása az illesztőben. Erről bővebben a tesztprogramnál írok.

Nem szóltam még az illesztő tápfeszültségéről. Ennek biztosítására is a nyomtatóillesztőt használom, ami első pillanatra meglepő lehet. Talán másodikra is. Nos, egyrészt a soros vonalra csatlakozó egér is hasonlóképp lop áramot, pedig azt nagy cégek gyártják, másrészt működik. (Utána is.) Mindenesetre nem illik nagyon megterhelni a (tulajdonképpen) adatvonalakat, ezért a rajzon szereplő ellenállások értékét nem célszerű csökkenteni (nagyobb ellenállás kisebb áram).

A kapcsolási rajz alább látható. Az egész kapcsolás egy tranzisztorból, két kondenzátorból, egy potméterből és két ellenállásból valamint egy 3.5-es Jack dugóból és egy D25-ös papa csatlakozóból és végül némi vezetékből áll. Célszerű árnyékolt kábelek használata, ugyanis az árnyékolatlan zavart szedhet össze. Nyáktervet nem adok, az egész kapcsolás fél óra alatt összedobható próbakártyán. Én a bevált "AS" módszer légszerelés technológiát alkalmaztam (AS = ahogy sikerül).

Próba - szerencse

Következő lépés egy egyszerű tesztprogram írása volt, hogy egyáltalán működik-e az illesztő? (Amit a forrásprogram fordításáról tudni kell, később ismertetem.)

Nos, a TSTCAS (TSTCAS.PRJ) program beolvassa a magnóról érkező jelet és kiküldi a PC hangszórójára és a CGA képernyő keretére. Ezt a programot és a beolvasóprogramot is a gép Turbo állásában célszerű futtatni.

Ha csatlakoztatta a kazettaillesztőt a PC-hez és a magnóhoz, állítsa a komparálási szint potméterét és a magnó hangszínszabályzóját középállásba, a hangerőszabályzót 3/4-re és tegyen a magnóba egy HT-s kazettát. Ha elindította a tesztprogramot és a magnót, akkor a hangszóróból csipogás hallatszik, a CGA képernyő keretén pedig fekete-fehér csíkok láthatók.

Ha ez megvan, a zajhatárt kell megállapítani. Állítsa teljes magashangkiemelésre a magnót, vegye ki a kazettát, üresen kapcsolja lejátszásra, és a növelje a hangerőt amíg jelet nem hall-lát. Ha teljes hangerőn sincs zavar, akkor gratulálhat magának. Egyébként, ha van zavar, próbálja megszüntetni pl. árnyékolt vezetékkel, zavaró berendezések kikapcsolásával. A zavarszintet jelölje be a hangerőszabályzón, ugyanis annál nagyobb erősítésnél még remény sincs a helyes beolvasásra.

Itt az ideje az első HT-állományhoz beállítani az illesztőt és magnót (három állítási lehetőség!). Jó beállításban a hangszóróból szép digitális hangot kell hallani, inkább kevesebb, mint több magashanggal. A kereten félkarakter-magas csíkokat kell látni, kis vékony csíkok nélkül. A tesztprogram (és a beolvasó program is) az első nyomtatóportot használja és el sem indul, ha nem találja. Ha elindult, bármely billentyű leütésére leáll.

Fordíts!

Mivel a hardware igen egyszerű, a beolvasást teljesen programból kellett megcsinálni. Kipróbáltam, a C fordító kellően gyors kódot generál-e másodpercenként 500 bit beolvasásához. A tapasztalat szerint igen, ezért nem assemblyztem össze magam: az összes programot C-ben írtam.

Mindenesetre a teszt és beolvasó programot a lehető leggyorsabbra kell fordítani. (Például Tiny vagy Small modell, 286-os utasításkészlet AT-n, szóhatárra igazítás, verem keretezetlen (stack frame off), veremtúlcsordulás figyelés kikapcsolva, sebességre (és nem méretre) optimalizálás, regiszterváltozók használata, regiszterek használatának optimalizálása, ugrások optimalizálása).

Kivétel csak a ciklusok optimalizálása, ugyanis időhúzásra üres ciklusokat használok. (Az MSC képes likvidálni a magtalan ciklusokat, ami most éppen helytelen.) A beolvasó program alapja rövid idők mérése. Ezért minden zavaró körülményt ki kell zárni, ha csak lehet.

Minden megszakítást letilt a program -- kivéve a billentyűzetét, de azt is átírja. Egy megszakítás ugyanis akármikor becsaphat és nem tudni mennyi ideig tart, s mivel az alatt az idő alatt nem ácsorog a szalag, elveszhet néhány bit. Természetesen a rendszeróra 18-ad másodpercenkéni megszakításait is le kellett tiltani, ami azzal a hátránnyal jár, hogy "megáll az idő". A tesztelések, beolvasások után célszerű tehát a DOS TIME parancsának használata.

Le kellene tiltani (lassítani?) a memóriafrissítés DMA-ját is, de akkor túl feledékeny lenne a gép. Az időzítésre visszatérve nyilvánvaló, hogy gyorsabb gép hamarabb végez az időzítő ciklussal. Hogy ez ne így legyen, a várakozóciklusokat a géphez kell igazítani, gyorsabb gépen nagyobb időállandót kell használni.

Sajnos ez az érték nem csak a gép sebességétől, hanem a C fordítótól is függ. Beolvasáskor használja mindig Turbo módban gépét! Ha a gépe nem CGA kártyás, módosítsa a PPACAS.H állományt.

Hátétuning

A HT-állományok sok (kb. 255) 00H értékű byte-ot követő A5H byte-al kezdődnek. Az egyes byte-ok 8 bitből állnak, nincs sem startbit, sem stopbit, sem paritásbit Az egyes bitek felépítésének rajza az alábbiakban látható. A beolvasóprogramnak (IBMHT) kell a megfelelő időállandót megadni.

Egy 80286-os, 10 MHz-es gépen 420-as érték kellett. 20 MHz-en tehát kb. 800-840. Célszerű 10-es lépésközzel többször megpróbálni a beolvasást. Valami ilyesmi fog történni: 400-nál nem olvas be, 410-nél hibázik, 420-nál jó, 430-nál megint hibázik, 440-nél nem olvas be. Nem kell minden próbához újrafordítani a programot, az időzítőállandó megadható paraméterként.

Ha megvan az Ön gépéhez tartozó érték, írja át a forrásprogramban ( PPACAS.H ), majd fordítsa le újra a beolvasóprogramot. Az IBMHT programnak tehát csak egy paraméter, az időállandó adható meg. Ha nem adja meg, a forrásprogramban szereplő érték marad érvényes.

A program automatikusan megáll egy állomány végén, de leállítható egy tetszőleges billentyű leütésével is. A beolvasott állomány neve HT.HT, amit -- ha az eredeti HT-s állományt meg akarja őrizni -- át kell nevezni, ugyanis a következő beolvasás felülírja. Mivel a listázóprogram (PRIHT) ugyanezt az állományt listázza, kevesebbet kell gépelnie.

Az átnevezés után ajánlom Norton bácsi FI - File Info programját, hogy pl. a szalagszámláló állását feljegyezze. Akár három számot is leírhat, ugyanis a HT-k (legalább) kétfajta magnóval kerültek forgalomba. Az egyik a bal, a másik a jobb oldali orsóról hajtott számlálóval rendelkezett, nehogy egyszerű legyen az átszámítás. Harmadik variáció nem lévén rövidesen meg is szüntették az egész gép gyártását ( ;-> ).

A beolvasás folyamata CGA kártyás gépen jól nyomon követhető a kereten (ez nálam Spectrumos hagyomány...), a bevezető nullák alatt az addigi zöld keret pirosra vált, majd minden byte első bitje sárga, a többi zöld. Beolvasás alatt a pc hangszórója csendben marad, ami nem csekély erénye a programnak. Új szalag, másik állomány beolvasásakor, ha hibázást észlel, futtassa a tesztprogramot és próbálja a három potmétert a felvételhez állítani.

Lássuk a medvét!

A HT legalább négyféle kazettás állományt ismer-kezel: adatrekord, gépi kódú program (tártartalom közvetlen betöltése szalagról), Assembly forrásprogram, Basic forrásprogram. Szerkezetük megtalálható az irodalom[5] 109. oldalán.

Mind a négy típust listázására képes a PRIHT (PRIHT.PRJ) program, aminek megadható a listázandó állomány neve, ami alapértelmezésben HT.HT. A lista a standard output állományra íródik (képernyő), amit át lehet irányítani akár lemezes állományba, akár nyomtatóra.

Az adatrekord ugye az, ami. A gépi kódú program Z80-as processzort feltételez, igy az csak emulátorral használható IBM PC-n. Az Assembly forrásprogramok szintén Z80-asak, PC-n crossassemblerrel lefordíthatók. Maradnak a Basic forrásprogramok, tulajdonképpen ezért készült az egész rendszer.

3... 2... 1... Állj!

Szorgalmi feladatként írtam még egy programot, amivel GW-Basic-nek és BasicA-nak megfelelő formátumba lehet konvertálni egy HT-Basic programot (nem a listáját, hanem az eredeti (HT.HT) programot!). A program neve GWHT (GWHT.PRJ), megadható neki a HT-s és a GW-Basic állomány neve, alapértelmezésben HT.HT és HT.BAS.

Célként csupán annyit jelöltem meg, hogy a GW interpreterbe betölthető programot kapjak a HT-s programból. Futásról szó sincs! Csupán betölthetőségről. Van ugyanis néhány olyan HT-s kulcsszó (token), ami nincs meg a GW-ben. Iyen a CLOAD, CLOAD?, CMD, CSAVE, MEM és SET.

Részletesebb összehasonlító nyelvelemzést ugyan nem végeztem, de más szintaktikai problémák is lehetnek. A GW-Basic a számkonstansokat is belső formában ábrázolja, míg a HT nem változtat a beírt (ASCII) alakon. Nos én sem tokenizáltam a számokat, amit elsőre nem tolerál a GW, de egyszerűen meg lehet nyugtatni: ki kell listázni a képernyőre a programot és ENTER-rel újra tároltatni.

A GW ekkor elvégzi a piszkos munkát (helyettem), azaz konvertálja a számokat (is). Ez nem nagy megszorítás, a programot úgyis tüzetesen át kell nézni. Van még néhány hardware-függő utasítás: PEEK, POKE, INP, OUT. Ezeket és a grafikát mindenképp át kell írni.

Forradalom

A C programok írásakor megpróbáltam a Hungarian Notation (Magyar Jelöléstan) ajánlásait alkalmazni. Sajnos erről mindössze egy Byte-beli cikket (irodalom[6]) olvastam, ezért az esetleges nyelvbotlásaimért elnézést kérek.

Forrásprogramok letöltése

Az eredeti dokumentáció letöltése

Irodalom

[1] Dr. Kónya László: PC-elektronika. Műszaki, 1991.
[2] Pálinkás Tibor: Portvezérlés PC-vel a Centronics-porton keresztül [2,1..3].Rádiótechnika folyóirat [2,1]: 1991 szeptember 419. o., [2,2]: 1991 október 467. o., [2,3]: 1991 november 515. o.
[3] Pethő Ádám: IBM PC/XT 3. A ROM BIOS és ami mögötte van. Számalk, 1988.
[4] Donald Alcock: Ismerd meg a Basic nyelvet! Műszaki, 1983.
[5] Kőhegyi János (szerk.): Ismerd meg a Basic nyelvjárásait! HT-1080Z, ABC80, ZX81. Műszaki, 1984.
[6] Charles Simonyi, Martin Heller: The Hungarian Revolution, Byte folyóirat 1991 augusztus, 131. o. 

Gábor (gg630504)