Először is egy bocsánatkéréssel tartozom: az előző számba a "nyomda kisördögének" köszönhetően (de jó, hogy rá lehet kenni valakire), a lemez-mellékletbe egy hibás GLOBCOMM.PAS-t tartalmazó ZIP került - amint azt gondolom többen észrevették. Bár avatott kezek a hibát néhány (tíz-)perces hibakeresés után kijavíthatták, feltételezem, hogy nem mindenki vette a fáradtságot erre. Ezért az e havi lemezmellékletbe felkerült a most már helyes .PAS-t tartalmazó javított verzió is, ami így most már mindenki számára használható. Egyúttal szeretnék mindenkit megkérni, hogy a hibás régebbi verziót irtsa le minden törölhető médiáról. Köszönöm és elnézést...
Nos, akkor nézzük a GLOBCOMM használatát és a beígért terminál-emulációs programot.
A terminál-emuláció
Mi is az a terminál-emuláció? Bár modemes körökben bevett és mindennapos a terminál-emulációs program (röviden terminál-program) szó használata, valójában kevesen tudják valójában honnan is származik és mit jelent ez a név. A terminál tipikusan a UNIX operációs rendszerhez vagy az azzal azonos architekturájú megoldásokhoz kapcsolható kifejezés, ahol is az egész rendszert egy nagy teljesítményű központi mag (pl. szerver) valamint több - előbbihez mérve - kisebb teljesítményű ún. terminál alkotja. A terminálok - legalábbis a központi géphez képest - meglehetősen "buta" szerkezetek melyeknek funkciói és képességei a legegyszerűbb rendszerekben mindössze a billentyűzet és a képernyő kezelésére korlátozódnak (ezáltal gyakorlatilag csak a központi gép kihelyezett monitorát és billentyűzetét alkotják), míg a számítás-igényes feladatokat és a háttérműveleteket a központi gép végzi el. A központi gép minden egyes terminálhoz egy-egy teljesen külön ún. virtuális gépet (virtual machine - VM) hoz létre, ami a kihelyezett billentyűzeten és megjelenítőn, azaz a terminálon keresztül kommunikál a felhasználóval. Bár a "terminál" és a "központi gép" teljesen logikai fogalmak általában mégis nem egyetlen gépen (processzoron) kapnak helyet, hanem fizikailag is jól elkülöníthető egységet alkotnak ; előbbi esetlegesen magasabbrendű funkciók elvégzésére is alkalmas eszközökkel kiegészítve.
A terminál és központi gép közti "párbeszéd" szabályainak meghatározására számos ún. terminál-protokollt dolgoztak ki (pl. ANSI, VT100, VT102, stb.). E protokollokat úgy alakították ki, hogy a legkülönbözőbb környezetekben, a legkülönbözőbb hardveren is elláthassák feladatukat. Ezt teljesen általános célú ún. vezérlő-szekvenciák (parancs-sztringek) kialakításával oldották meg, amelyek bármilyen célú felhasználás esetén egységesen és effektíven, a konkrét (terminál-)futtató-hardver ismerete nélkül alkalmazhatók.
A terminál-emulációs programok gyakorlatilag valamilyen fizikai illesztésen (általában modem) keresztül az esetleges eszköz-kezelésbeli eltéréseket áthidalva kapcsolódnak a központi géphez, azaz, az alkalmazott terminál-protokollnak megfelelően - a terminál konkrét fizikai megvalósításait elfedve - vezérlik a képernyőt és továbbítják a központi gép felé a billentyűzeten kiadott utasításokat (gombnyomásokat).
Az ANSI vezérlő-szekvenciák
Az egyik leginkább elterjedt és leggyakrabban alkalmazott terminál-emulációs protokoll az ANSI. Az ANSI egyértelműen legerősebben a képernyő-kezelést támogató protokoll, amely kevés lehetőséget nyújt a billentyűzet funkcióinak átdefiniálására, vagy intelligens terminál-műveletek és lekérdezések végrehajtása. Éppen ezen tulajdonságainak és egyszerűségének köszönheti a BBS-ek vezérlőszoftverei által támogatott protokollok között elfoglalt előkelő helyét.
Általánosságban elmondható minden terminál-emuláció esetén, hogy a központi gép felől érkező adatok a terminál kijelzőjén kerülnek megjelenítésre, míg a terminál billentyűzetének lenyomásait az a központi gép felé továbbítja. Az átviteli protokollok speciális, az átvitel során egyéb helyzetekben nem generált szekvenciákat (karaktersorozatokat) definiálnak, melyek a terminált valamilyen művelet végrehajtására utasítják.
Az ANSI-protokoll a képernyő vezérlésére
meglehetősen sokrétű és általános utasítások kiadását teszi lehetővé. Minden
ANSI vezérlőszekvencia az ESC+'[' karaktersorozattal (dec 27, 91) kezdődik
- a terminál innen tudja, hogy a következő karaktereket ANSI parancsként
kell értelmezni ; a speciális prefix nélkül érkező karaktereket a terminál
egyszerűen a soron következő karakter-pozicíóba írja, majd lépteti a kurzort.
A lenyomott billentyűknek megfelelő ASCII kódokat pedig egyszerűen elküldi
a központi gép felé. A leggyakrabb ANSI szekvenciák a következők:
|
|
ESC[#;#H | kurzor mozgatása a #.sor, #. oszlopába |
ESC[#A | kurzor mozgatása # sorral felfelé |
ESC[#B | kurzor mozgatása # sorral lefelé |
ESC[#C | kurzor mozgatása # pozícióval jobbra |
ESC[#D | kurzor mozgatása # pozícióval balra |
ESC[#s | kurzor-pozíció elmentése későbbi visszatöltés céljára |
ESC[#u | utolsó elmentett kurzor-pozíció visszatöltése |
ESC[2J | képernyő törlése és a kurzor pozícionálása a bal felső sarokba |
ESC[#;#;..;#m | attribútumok állítása (színek, villogás, aláhúzás, stb.) |
Az e havi lemezmellékleten található LIGHTERM egy egyszerű ANSI-terminál emulációs program. A program szolgáltatásai mindössze a modemes kapcsolat felépítésére, valamint a terminál-emulációra korlátozódnak, mégis eredményesen használható bármilyen az ANSI-protokkolt támogató BBS-sel való kommunikációra. A program kezelése teljesen intuitív, így arra nem is vesztegetnék szót.
Ja, még valami: a programot - és persze a GLOBCOMM-ot is - TVSUPPORT és HUN direktívákkal kell lefordítani (lásd a Pascal Options|Compiler menüpontjának Compiler directives sorát).
A GlobComm használata
Nos, a unit használata nagyon egyszerű. A GlobComm mindent elvégez helyettünk nekünk csak azt kell megmondani neki, hogy melyik soros porton milyen paraméterek mellett kommunikáljon. A port megnyitását a ComOpenPortS eljárás meghívásával tehetjük meg átadva a port számát, az alkalmazni kívánt baudrátát és kommunikációs paramétereket, hogy kívánunk -e alkalmazni flow-controlt és hand-shake-et, valamint a fogadási- és küldési gyűrű-puffer méretét. A kommunikációs paraméterek megadására értelemszerűen a deklarált konstansokat alkalmazzuk, amik úgy vannak kialakítva, hogy sorrendjük esetleges összekeverése se okozzon gondot. Az eljárás sikeres megnyitás esetén true értékkel tér vissza; false esetén valami nem jött össze.
Ezek után adatokat a ComSendChar ill. ComSendString utasítások segítségével helyezhetünk a küldési gyűrű-pufferbe, amit a program alkalom adtán elküld. A még éppen a gyűrű-pufferben "tartozkódó" bájtok számát a ComGetSendDataSize függvénnyel kérdezhetjük le. A fogadott, de a pufferből még ki nem olvasott bájtok számát a ComGetDataSize függvény adja vissza, aminek zérustól eltérő értéke esetén az adatokat a ComGetChar segítségével olvashatjuk ki. A küldési ill. fogadási gyűrű-puffer bármikor üríthető (törölhető a benne lévő bájtok elküldése nélkül) a ComClearSendFIFO ill. ComSendFIFO utasításokkal. A kommunikáció befejeztével a portot a ComClosePort-tal kell lezárni. Amennyiben több, azonos IRQ-t használó portot is megnyitottunk egyszerre, figyeljünk rá, hogy a megnyitással ellentétes sorrendben zárjuk le őket, mert csak így áll vissza helyesen a megszakítási lánc.
Még egy dologra szertném felhívni a figyelmet: a ComSendChar ill. ComSendString eljárások végrehajtása nem feltétlenül jelenti az átadott bájtok elküldését is, hiszen azok azt csak a gyűrű-pufferbe helyezik el - az adatok elküldését a megszakítási rutinok intézik. Az adatok elküldése csak a ComSendDataSize=0 feltétel vizsgálatával állapítható meg.
A következő számban kicsit még szétnézünk
a modemek alkalmazási területein, majd elkezdünk egy hálózati programot
írni. Várom észrevételeiteket és javaslataitokat a sorozattal kapcsolatban
a sting2@freemail.c3.hu címen.