EXOS 2.1

Műszaki Leírás


Tartalom

I. Rész: EXOS-Kernel
1. Bevezetés
2. Az EXOS-környezet áttekintése
2.1. Az EXOS be / kiviteli rendszer
2.2. A memóriafelosztás
2.2.1. Memóriaszegmensek és lapok
2.2.2. Felhasználói szegmenskiosztás
2.2.3. Az EXOS RAM használata és a csatorna-RAM
2.3. Rendszerbővítések (ROM és RAM)
3. A rendszer inicializálása és a melegindítás
3.1. A hidegindítási folyamat
3.2. A melegindítási folyamat
4. Alkalmazói Program Interface
4.1. EXOS rendszerhívások - általános információk
4.2. Hardver- és szoftvermegszakítások
4.2.1. Felhasználói hardvermegszakítás rutin
4.2.2. Szoftvermegszakítások
4.3. A STOP billentyű
5. A szegmenskijelölés
5.1. Felhasználói és perifériához / bővítőhöz tartozó szegmensek
5.2. A rendszerszegmensek és az EXOS-határ
5.3. A megosztott szegmens és a felhasználói határ
5.4. A rendszerszegmens használata
6. A periférialeírók
6.1. A periférialánc
6.2. A periférialeírókra vonatkozó részletes információk
6.3. ROM-bővítő egységek
6.4. Felhasználói perifériák
7. A perifériakezelők
7.1. A perifériakezelő alprogramok - Általános információk
7.2. A perifériainicializáló alprogram
7.3. A csatorna-RAM kijelölés (allokálás)
7.4. A puffermozgató alprogram
7.5. Periféria-megszakítási alprogramok
7.6. Perifériacsatorna hívások
7.6.1. A csatorna-megnyitási és csatorna-létrehozási alprogramok
7.6.2. Blokk olvasási és írási alprogramok
8. Az EXOS-változók
9. Rendszerbővítő interface
9.1. A rendszerbővítők hívása
9.2. Az akciókódok
9.3. Új alkalmazói program indítása
10. ENTERPRISE file-forma és EXOS betöltési funkciók
10.1 Az Enterprise file-forma
10.2. Enterprise-formájú file-ok betöltése
10.3. Az áthelyezhető adatforma
10.4. A felhasználói áthelyezhető modulok
10.5. Az áthelyezhető és az abszolút rendszerbővítők
10.6. Új alkalmazói programok
11. Az EXOS funkcióhívások részletes ismertetése
11.1. A periférianév és a file-név szintaxisa
11.2. 0-ás funkció: rendszer reset
11.3. 1-es funkció: csatorna megnyitása
11.4. 2-es funkció: csatorna létrehozása
11.5. 3-as funkció: csatorna lezárása
11.6. 4-es funkció: csatorna megszüntetése
11.7. 5-ös funkció: karakter olvasása
11.8. 6-os funkció: blokk olvasása
11.9. 7-es funkció: karakter írása
11.10. 8-as funkció: blokk írása
11.11. 9-es funkció: csatornaolvasási állapot
11.12. 10-es funkció: csatornaállapot megadása és olvasása
11.13. 11-es funkció: speciális funkció
11.14. 16-os funkció: EXOS-változó olvasása, írása vagy átbillentése
11.15. 17-es funkció: csatorna megszerzése
11.16. 18-as funkció: csatorna átirányítása
11.17. 19-es funkció: alapértelmező periférianév beállítása
11.18. 20-as funkció: rendszerállapot lekérdezése
11.19. 21-es funkció: periféria felvétele
11.20. 22-as funkció: EXOS-határ olvasása
11.21. 23-as funkció: felhasználói határ beállítása
11.22. 24-es funkció: szegmens kijelölése
11.23. 25-ös funkció: szabad szegmens
11.24. 26-os funkció: rendszerbővítő letapogatása
11.25. 27-es funkció: csatornapuffer kijelölése
11.26. 28-as funkció: hibakód értelmezése
11.27. 29-es funkció: modul betöltése
11.28. 30-as funkció: áthelyezhető modul betöltése
11.29. 31-es funkció: idő beállítása
11.30. 32-es funkció: idő olvasása
11.31. 33-as funkció: dátum beállítása
11.32. 34-es funkció: dátum olvasása

II. rész: Az EXOS funkció és hibakódjai
1. Rendszer szegmens címek
2. EXOS funkciókódok
3. Hibakódok
3.1. Figyelmeztető kódok
3.2. Általános kernelhibák
3.3. Általános eszközhibák
3.4. Eszközfüggő hibák
4. EXOS változók
5. Szoftvermegszakítási módok
6. A speciális funkciók alfunkciói
7. A rendszerbővítők akciókódjai
8. A file-betöltés modultípusai

III. rész: A videókezelő specifikációja
1. Bevezetés
1.1. Koordináta-rendszerek
2. A videolapok vezérlésének alapjai
2.1. Kijelzési módok
2.3. Színmódok
2.3. Lapméret
2.4. Kijelzésvezérlés
3. A video üzemmódok használata
3.1. Hardver szövegmód (0-s mód)
3.2. Szoftver szövegmód (2-es mód)
3.3. Képpont grafikamódok (1-es és 5-ös mód)
3.4. Attribútum grafikamód (15-ös mód)
4. Karakter output
4.1. Karakterek kiíratása
4.2. Vezérlőkódok és escape szekvenciák
5. ESCAPE szekvenciák
5.1. A kurzor pozícionálása
5.2. Karakter definiálása
5.3. Palettaszínek
5.4. Tinta és papír szín

5.5. Grafikus vonaltípus
5.6. Grafikus vonalmód
5.7. Az attribútumjelzök byte-ja
5.8. A grafikus kitöltés - kifestés
5.9. Grafikus ellipszis rajzolása
6. Karakterolvasás
6.1. Egyszerű karakterbeolvasás
6.2. A kurzor helyzetének kiolvasása
6.3. A sugárpozíció olvasása
7. Vegyes információk
7.1. Az állapotsor
7.2. Képernyőkeret és a FIXBIAS regiszter
7.3. A karakterkészlet alapállatba állítása
8. Video-összefoglaló
8.1. EXOS-hívások
8.2. EXOS-változók

IV rész: A hangkezelő specifikációja
1. Bevezetés

2. Általános periféria interface
3. A burkolók

3.1. A burkolók általános ismertetése
3.2. A burkolómeghatározás formája
4. A hang előállítása
5. A hangok feldolgozása
5.1. Frekvencia- és amplitúdószabályzás
5.2. A burkológörbe feldolgozásának folyamata
5.3. Burkológörbe fázis vezérlés
5.4. A hang hosszának vezérlése
5.5. Szinkronizáció
6. Egyéb vezérlési funkciók
6.1. Belső hangszóró vezérlés
7. Más perifériákkal való együttműködés
7.1. A hangregiszterek elérése egyéb eszközökkel
7.2. A billentyűzet hangjelzése
8. Hangösszefoglaló

V. rész: A magnókezelő specifikációja
1. Bevezetés
2. Magnó file forma
2.1. Fejrészszelet
2.2. Adatszeletek
3. A magnókezelő használata
3.1. Csatornák megnyitása olvasásra
3.2. Adatok olvasása
3.3. Csatornák létesítése íráshoz
3.4. Adatok írása
3.5. A csatornák lezárása
4. A magnó egyéb jellemzői
4.1. A STOP billentyű
4.2. A kiviteli sebesség és szint
4.3. Az olvasás szintjelzője
4.4. A távvezérlő relék
4.5. A magnóegység használata távvezérlés nélkül
4.6. A magnó hangcsatolása
4.7. Másolás elleni védelem
5. A hardver
6. Adatforma
6.1. A kazettásegység jelei
6.2. Szeletforma
6.3. Belső szeletforma
6.4. Fejrész szeletforma
6.5. CRC ellenőrzés
7. Magnó összefoglaló

VI. rész: A billentyűzetkezelő specifikációja
1. A jellemzők áttekintése
2. Karakterbevitel
2.1. Reteszelési üzemmódok (LOCK)
2.2. Billentyűkódok
3. Speciális jellemzők
3.1. A billentyű hangvezérlése
3.2. Az automatikus ismétlés vezérlése
3.3. A funkcióbillentyű programozása
3.4. A STOP-billentyű vezérlése
3.5. A HOLD-billentyű vezérlése
3.6. Közönséges billentyűkkel generált szoftvermegszakítások
3.7. A botkormány (joystick) közvetlen leolvasása
4. Billentyűzet összefoglaló

VII. rész: A soros / hálózati meghajtó specifikációja
1. Bevezetés
2. Hardver
3. Soros periféria
3.1. Alapszintű működés
3.2. A soros periféria használata
4. Hálózat
4.1. Adatátviteli protokoll
4.2. A hálózati működés részletei
4.3. A hálózat használata
5. Soros / Hálózati összefoglaló

VIII. rész: A nyomtatókezelő specifikációja
1. Bevezetés
2. A hardver
3. Nyomtató-összefoglaló

IX. rész: A szövegszerkesztő program specifikációja
1. Bevezetés
2. A csatornák megnyitása
3. A szövegszerkesztő általános jellemzői
3.1. A szövegszerkesztő szövegpuffere
3.2. Amikor a puffer megtelik
3.3. A margók és a vonalzósor
3.4. Bekezdés
3.5. Szavas tördelés
3.6. Hosszú sorok
3.7. A kurzor villogtatása
4. Írás a szövegszerkeztőbe
5. Olvasás a szövegszerkesztőből
5.1. A szövegszerkesztő alapvető olvasási tevékenysége
5.2. A szövegszerkesztő olvasás jelzői
5.3. Tipikus jelzőkombinációk
6. Szerkesztési funkciók
6.1. A kurzor mozgatása (a botkormány)
6.2. A beszúrás és a beszúrási üzemmód vezérlése
6.3. Kiejtés és törlés
6.4. TAB billentyű
6.5. A szerkesztési funkcióbillentyűk
7. Speciális funkcióhívások
7.1. Margópozíciók beállítása
7.2. Szövegfile-ok betöltése és tárolása
8. A hibakezelés
9. Szövegszerkesztő összefoglaló

X.rész: A Nick chip programozása
1. Video RAM címzés
2. Sorparaméter tábla
3. Sorparaméter bázismutató
4. Sorparaméter blokk
5. Jobb és bal margók
6. Szín mód és paletta regiszterek
7. Pixel grafikus módok
8. Karaktermódok -64, 128 és 256
9. Attribútum grafikus mód
10. Függőleges szinkronizáció (VSYNC mód)
11. Video megszakítások
12. A színek meghatározása
13. Vezérlő regiszterek

XI. rész: A DAVE-chip programozása
Regiszter Ismétlés

Kimenetek választása
Néhány kiegészítés a DAVE dokumentációjához

ENTERPRISE csatlakozási pont információ


I. Rész: EXOS-Kernel

1. Bevezetés

Az EXOS-szal (EXtendable Operating System) az Enterprise mikroszámítógép operációs rendszere bővíthető. Illesztési lehetőséget biztosít az alkalmazói program (pl. az IS-BASIC interpreter, vagy más szóval értelmezőprogram) és a gép hardvere között. Az EXOS fő jellemzői a csatornaalapú I/O (be- és kiviteli) rendszer, valamint a bonyolult memóriakezelési lehetőségek. A be- és kiviteli rendszer perifériatípustól független kommunikációt tesz lehetővé számos beépített eszközzel, továbbá a felhasználói kiegészítő, pótlólagos perifériakezelőkkel is.
Az Enterprise ROM-jában (csak olvasható memóriájában) az EXOS-kernel (felügyelőprogram) mellett az alábbi eszközök találhatók meg:

  1. Videokezelő, a szöveg és grafika kezeléséhez.
  2. Billentyűzetkezelő program, a botkormány, az automatikus ismétlés, valamint a programozható funkcióbillentyűk kezeléséhez.
  3. Szövegfeldolgozási lehetőségekkel is rendelkező képernyőszerkesztő.
  4. Négyforrásos sztereo hanggenerátor.
  5. Magnó file-kezelő.
  6. Centronics-kompatibilis párhuzamos illesztőegység.
  7. RS232 típusú soros illesztőegység.
  8. Intelligent Net háromhuzalos hálózati illesztőegység.

Ez a dokumentum az EXOS-kernel lehetőségeit ismerteti, ami illesztést jelent az alkalmazói program és a különböző eszközök között, ellátja a tárkezelés feladatát és számos mást is kínál. A kernel működését mind a berendezések, mind az alkalmazói programok szempontjából megmagyarázza. A beépített perifériakezelőket egyenként külön-külön dokumentumok ismertetik. Ezek közül néhány hivatkozik a jelen Kernel-Specifikációra.
Szándékunk szerint ez a dokumentum, a különböző perifériakezelő leírásokkal együtt, elegendő információt tartalmaz ahhoz, hogy alkalmazói programokat lehessen írni az EXOS használatával, vagy új EXOS perifériakezelő programokat lehessen létrehozni. A könyvben közreadott összes információ az EXOS 2.1 változatára vonatkozik.

2. Az EXOS-környezet áttekintése

Amikor az EXOS fut, mindig van egy ún. aktuális alkalmazói program, ami ellátja a gép általános vezérlését. E programnak módjában áll hívni az EXOS-t, hogy valamelyik lehetőségét - például a csatorna I/O rendszert vagy a memória lefoglalási funkciót - igénybe vegye. Normál gépi konfigurációnál az aktuális alkalmazói program vagy a beépített szövegfeldolgozó program (WP), vagy pedig az IS-BASIC értelmezőprogram ROM modulja, de lehet bármilyen más program is, amit a ROM bővítő modulról vagy magnóról a RAM-ba (a véletlen hozzáférése memóriába) betöltöttünk.
Jelen leírásban a "felhasználó" fogalma alatt az aktuális alkalmazói programot értjük, tekintettel arra, hogy ez a program használja az EXOS-t.

2.1. Az EXOS be / kiviteli rendszer

Mint már a fentiekben is említettük, az EXOS I/O rendszere, a perifériakezelők készletéből áll. A perifériakezelő olyan gépi kódú program, ami tartalmazta az általa kiszolgált eszköz vezérléséhez szükséges összes rutint (alprogramot), és szabványos illesztési lehetőséget (interface-t) nyújt az EXOS felé. A perifériakezelő ténylegesen nem vezérel fizikai berendezést, viszont tisztán szoftver eszközökkel olyan perifériákra jellemző szolgáltatásai vannak, mint például karakterek olvasása vagy írása.
Amikor az EXOS futni kezd, először is megkeresi az összes beépített perifériakezelőt és belső listát készít róluk. A lista tartalmazza a bővítő ROM-modulokban fellelhető perifériakezelőket is, amelyeket a számítógéphez csatlakoztattunk. Ha a felhasználó további eszközöket is csatlakoztat (ún. felhasználói perifériákat), azok is szerepelni fognak a listában. A listán szereplő minden egyes eszközt egy periférianév azonosít. Például: VIDEO, NET (hálózat) vagy KEYBOARD.
Az I/O rendszer csatornaalapú, ami azt jelenti, hogy egy adott perifériával folytatott információforgalmazáshoz először egy csatornát kell megnyitni. A csatorna megnyitásához meg kell adni az EXOS számára a kért periféria nevét és az egy byte-os csatornaszámot. Ez a perifériához egy kommunikációs utat létesít, amelyen át karaktereket küldhetünk mindkét irányba, akár egyenként, akár pedig általunk meghatározott mérete blokkokban, továbbá speciális parancsokat adhatunk a berendezésnek.
Egy file-alapú perifériánál (pl. kazettánál vagy lemeznél) a csatornát egyetlen átviteli műveletre nyitják meg, majd újra lezárják. Nem file-os perifériáknál (pl. billentyűzetnél) a csatornát célszerűen csak egyszer nyitják meg, majd az összes jövőbeni hozzáférés céljára egyszer s mindenkorra nyitva hagyják.
Az EXOS lehetővé teszi, hogy egyidejűleg több csatornát nyissunk meg egyetlen perifériához, bár ezt bizonyos berendezések nem engedik meg. Így például a videokezelő tűri a sok csatorna megnyitását, a billentyűzetkezelő viszont csak egyet enged meg. A csatornák mindaddig megnyitva maradnak, ameddig a felhasználó le nem zárja ezeket.
Egy csatorna megnyitásakor az EXOS annyi RAM-területet utal ki, amennyit a periféria igényel a pufferek (átmeneti tárolók) és a változók részére.

2.2. A memóriafelosztás

Az EXOS memóriafelosztási lehetőségeinek jobb megértése érdekében először meg kell értenünk az Enterprise számítógép memóriaszervezését.

2.2.1. Memóriaszegmensek és lapok

Az Enterprise számítógép szegmentált memóriaszervezést használ a Z-80-as mikroprocesszor 64 kbyte címtartományának kiterjesztésére 4 Mbyte-ig. A szegmentáció 16 kbyte-os szegmenseken alapul.
A Z-80-as címtartománya négy darab 16k nagyságú - 0-tól 3-ig számozott - lapra osztott. Ez a négy lap a következő címtartományt tartalmazza (hexadecimálisan)

0. lap 0000h - 3FFFh
1. lap 4000h - 7FFFh
2. lap 8000h - BFFFh
3. lap 0000h - FFFFh

A 4 Mbyte-os címtartomány 256 db, egyenként 16k nagyságú szegmensre osztott. Így a rendszermemória minden egyes 16k nagyságú részletének megvan a maga szegmensszáma, ami a hexadecimális (00h - FFh) tartományba esik. Bizonyos memóriaszeletekhez meghatározott állandó szegmensszámok tartoznak. Ilyenek például a:

Belső, 32k ROM - 00h - 01h szegmensek
64k nagyságú külső bővítő modul - 04h - 07h szegmensek
Belső, 64k RAM - FCh - FFh szegmensek
2. belső 64k RAM - F8h - FBh szegmensek

A 4 db Z-80-as lap mindegyikének van egy 8 bites lapregisztere a Z-80-as egy I/O portján (felhasználói kapuján). E regiszterek tartalma meghatározza, hogy a lehetséges 256 darab szegmens közül melyeket érhetjük el az egyes Z-80-as lapokon. A megfelelő lapregiszterbe szegmensszám beírásával bármelyik szegmens megcímezhető bármelyik Z-80-as lapon. Ha szükséges, akkor egy szegmenst egyidejűleg két vagy több lapon is megcímezhetünk úgy, hogy ugyanazt az értéket helyezzük el a különböző lapregiszterekbe.
A NICK-chip csak a belső négy RAM-szegmenst (azaz FCh-tól FFh-ig) képes megcímezni, videokijelzések létrehozására. Emiatt ezekre a szegmensekre video-RAM néven szoktunk hivatkozni. Hozzáférésük lassúbb, mint bármely más memóriához, mivel a Z-80-as címzést a NICK-chip-hez kell szinkronizálni.

2.2.2. Felhasználói szegmenskiosztás

Amikor az EXOS működni kezd, megkeres és tesztel minden rendelkezésre álló RAM-szegmenst, és listát készít róluk. A vezérlés felhasználói átadásakor, a megfelelő szegmenst (ami rendszerint egy ROM-szegmens) leteszi a Z-80-as 3-as lapjára, majd ráugrik. Ebben az esetben az 1. és 2. lapok tartalma határozatlan, a 0. lap viszont egy RAM-szegmenst címez, amit nullás lap szegmensnek nevezünk.
A nullás lap első 256 byte-ja bizonyos rendszerbelépési pontokat és rendszerprogramokat, valamint olyan területeket tartalmaz, amelyek a CP/M emulálására fenntartottak. A nullás lap szegmens többi részét a rendszer nem használja és így az korlátlanul a felhasználó rendelkezésére áll. A rendszerbelépési pontok miatt (amelyek között megszakítási kezdőcím is van) a nullás lap szegmensnek állandóan belapozott állapotban kell lenni.
Ha a felhasználónak több RAM-ra van szüksége, akkor az EXOS-tól további szegmenseket kérhet. Erre az EXOS további szegmenseket utal a listából, kivéve, ha nincs több üres szegmens. Megtörténhet az is, hogy az EXOS olyan szegmenst szabadít fel, amit már korábban kiutalt, de nincs már rá szüksége a továbbiakban. Ezeket a járulékos szegmenseket az EXOS explicit módon nem fogja belapozni, a felhasználónak kell ezt megtennie (rendszerint az 1. és 2. lapra), amikor szüksége van szegmensekre.
Az is lehetséges, hogy a felhasználó egy ún. megosztott szegmenst kap. Ez olyan szegmens, amelyiknek csak egy részét használja a felhasználó, a többit pedig az EXOS hasznosítja. Ezt a lehetőséget a későbbiekben részletesen ismertetjük, (l.az 5.3. alfejezetet).

2.2.3. Az EXOS RAM használata és a csatorna-RAM

Az 0FFh számú szegmenst, amely egyike a video RAM szegmenseknek, mindig az EXOS használja, ezért ezt rendszerszegmensnek nevezzük. A szegmens használatára vonatkozó bővebb információkat az 5.4. alfejezetben ismertetjük. Most csak annyit említünk meg, hogy RAM-területeket tartalmaz a rendszerváltozók, a rendszerveremtár (stack), a beépített perifériakezelő-változók, a sorparaméter-tábla, a RAM- és ROM-szegmenslisták, valamint a bővítő ROM-okhoz a rendelkezésre álló perifériák és a RAM-foglalás céljaira. Ezek a RAM-területek a szegmens tetejénél kezdődnek és lefelé a szükséges mélységig terjednek.
Ez alatt a rendszer RAM foglalás alatt található az ún. csatorna-RAM terület. Ebben meghatározott méretű tárterület van hozzárendelve minden megnyitott állapotú csatorrához. Az egyes területek nagyságát a kérdéses berendezés határozza meg a csatorna megnyitásakor és számszerűleg néhány byte-tól több kbyte-nyi méretig terjedhet. Az említett csatorna-RAM területek mindig a rendszerszegmensben kezdődnek, de tetszés szerinti számú más szegmenst is lefoglalhatnak. A csatorna lezárásakor azonban az adott csatorna részére kiutalt RAM-terület szabaddá válik és így ez a tárkiosztás nem állandó jellegű.

2.3. Rendszerbővítések (ROM és RAM)

Amikor az EXOS működni kezd és elkészíti a rendelkezésre álló RAM-terület listáját, akkor minden, a rendszerbe bekapcsolt ROM-bővítést megkeres, és listát készít ezekről is. Ezen ROM-bővítések olyan EXOS perifériakezelőket is tartalmazhatnak, amelyek ugyanúgy a rendszerhez kapcsolódnak, mint maguk a beépített berendezések. Mindegyik ROM különböző célú belépési pontot is tartalmaz.
Induláskor mindegyik ROM esélyes arra, hogy az aktuális (kiválasztott állapotú) alkalmazói ROM legyen. Ha egyik ROM sem él ezzel a lehetőséggel, akkor a belső szövegfeldolgozóé a vezérlés.
Adott időközönként lefut egy bővítő letapogatási művelet, ami a listában szereplő ROM-oknak lehetőséget ad bizonyos szolgáltatások teljesítésére. Ilyenkor a ROM-oknak módjukban áll hibaüzeneteket és a felhasználót segítő (help) üzeneteket küldeni, valamint különböző egyéb rendszerfunkciókat elvégezni. Bővítő letapogatásit a felhasználói program kezdeményezhet, ami viszont egy parancs-jelsorozatot továbbít minden egyes ROM-hoz. Ez lehetővé teszi, hogy a bővítő ROM szolgáltatást nyújtson, vagy egy parancsot végrehajtson és ezután visszatérjen a fő alkalmazói ROM-hoz. Ez a lehetőség felhasználható egy, az aktuális alkalmazói programtól eltérő ROM indítására is.
Az EXOS-ban a rendszernek módja van arra, hogy programokat töltsön a rendszer RAM-ba (amely pl. olyan RAM, ami nincs kiutalva felhasználónak) és ezeket hozzákapcsolja a ROM-ok listájához. így minden olyan lehetőség, ami a bővítő ROM-ok rendelkezésére áll, a RAM-okba betöltött programoknak is elérhető. Ezeket a RAM-bővítéseket betölthetjük egyenként egy-egy 16k nagyságú teljes szegmensbe, vagy ha áthelyezhető formában vannak, akkor egy szegmensbe több program is tölthető egymás mellé, ami a lefoglalt RAM-terület nagyságát csökkenti.

3. A rendszer inicializálása és a melegindítás

3.1. A hidegindítási folyamat

Hidegindítási (reset) folyamat játszódik le, amikor a gépet először feszültség alá helyezzük és amikor a RESET (alapállapotba állító) gombot megnyomjuk, kivéve azt az esetet, mikor a felhasználó egy ún. melegindítási címet hozott létre (l. 3.2.). Ez a művelet újraindítja a rendszert, és így minden olyan információ, ami az indítás előtt létezett, elvész.
A hidegindítás először a 32k kapacitású belső ROM ellenőrzőösszeg vizsgálatát végzi el. Ha ezen már túljutott, akkor megkeresi a rendszerben fellelhető összes RAM-ot. A belső ROM-tól és a bővítő modul csatlakoztatási helyétől eltekintve (ezek a 00-tól a 07-ig számozott szegmensek), végigkeresi a teljes 4 Mbyte-os címtartományt. Sorban megvizsgál minden egyes 16k nagyságú szegmenst és mindegyiken elvégzi a tártesztet. Ha egy szegmens megfelel a tártesztnek, akkor erről feljegyzés készül a rendelkezésre álló RAM-szegmensek listájába. Minden bővítő RAM-ot teljes egészében dekódolni kell. A tárteszt megsemmisíti a vizsgált RAM-szegmensben korábban esetleg elhelyezett összes adatot.
A RAM-teszt után, a rendszer bővítő ROM-okat keresve ismét megvizsgálja a 4 Mbyte memóriatartományt. A ROM-keresés csak olyan szegmensszámú ROM-okat talál meg, amelyek 16-nak egész számú többszörösei. Ez azt jelenti, hogy a bővítő ROM-okat csak a 256k-s határokra kell dekódolni. Ez alól kivétel a bővítő modul, mert itt mind a négy szegmensben van ROM-keresés. Ellenőrzi, hogy a bővítő-modul csatlakozóba dugaszolt bármely két ROM különbözik-e egymástól. A bővítő ROM-okra vonatkozó részletes tudnivalókat a 6.3. alfejezetben ismertetjük.
A ROM-lista elkészülte után a rendszer különböző belső változókat hoz létre, beleértve a nullás lap szegmens elején található rendszerindítási pontokat is. Az I/O rendszer többi részének inicializálása ezt követően - a későbbiekben részletesen is ismertetésre kerülő módon - a beépített és bővítőeszközök beszerkesztésével és inicializálásával, valamint az összes ROM-bővítés inicializálásával valósul meg. A következő mozzanat a kijelző program indítása, ami kiírja a villogó ENTERPRISE és az Intelligent Software Ltd. Copyright üzenetet a képernyőre. Ezek az üzenetek a képernyőn maradnak mindaddig, amíg a felhasználó le nem üt egy billentyűt. A fenti kiírást és billentyűleütésre várást elnyomhatjuk olyan bővítő ROM segítségével, ami a CRDISP_FLAG változóba nem zérus értéket tölt az inicializálás alkalmával (l. alább a ROM inicializálás ismertetését).
Amikor leütünk egy billentyűt, a kijelzés eltűnik és a rendszer sorban hívja az egyes ROM-bővítéseket az 1-es akciókóddal. (Az akciókódok magyarázata is megtalálható a 9. fejezetben.) Ekkor bármelyik ROM, aktuális alkalmazói program kíván lenni, egyszerűen végrehajt egy ún. EXOS indítás hívást (l. később), amivel jogot formál a rendszerre, majd ez után a teljes vezérlés átvételére.

3.2. A melegindítási folyamat

Melegindítási végrehajtásra kerül sor akkor, amikor a gépen lenyomjuk a RESET billentyűt, feltéve, hogy a felhasználó előzetesen már létrehozott egy melegindítási címet, és ha a rendszerváltozók területét még nem tettük tönkre. Melegindítási címet úgy hozhatunk létre, hogy a kívánt címet egyszerűen beírjuk az RST_ADDR nevű változóba, ami a rendszerszegmens egy meghatározott helyén található. Az így tárolt címnek a Z-80-as nullás lapon kell lennie és a melegindítás befejezésekor ide fog átadódni a vezérlés. A melegindító rutin mindig a RAM-ban lesz, tekintettel arra, hogy a nullás lap szegmens maga is RAM.
A melegindítási szekvencia nem végez RAM-vizsgálatot vagy ROM-keresést. A felhasználónak kiutalt összes memória ilyenkor ép marad és megmarad minden olyan rendszer-RAM-bővítés vagy felhasználói perifériakezelő is, ami előzetesen a rendszerhez volt kapcsolva. Ezzel szemben viszont kényszerűen lezárásra kerül az összes 'csatorna, az összes berendezés újra inicializálódik, továbbá felszabadul minden olyan RAM, ami csatorna-RAM területként került kiosztásra. Gyakorlatilag egy EXOS-indítás hívást szimulálunk 10h, értékre állított indításjelzőkkel. Ennek részletes kifejtésére később kerül sor.
Az EXOS az RST_ADDR változó értékét visszaállítja nullára, mielőtt a melegindítási címre ugrik. Ez biztosítja, hogy a rendszer összeomlása esetén a RESET billentyű másodszori megnyomásával hidegindítást lehessen végrehajtani. így tehát írása a RESET billentyű kétszeri gyors megnyomásával mindig hidegindítás jön létre.
A melegindítás indítási pontjánál található program pontosan úgy kerül indításra, mintha EXOS indítás hívás hajtódna végre; azaz létre kell hozni egy saját veremmutatót és újra engedélyezni kell a megszakításokat (l. az EXOS indítás hívását ismertető 11.2. alfejezetet). Az 1., 2. és 3. Z-80-as lapok tartalmai határozatlanok lesznek, ezért azokat a felhasználónak kell saját céljára beállítani. Különösen olyan ROM alkalmazói program esetén szükséges a saját ROM visszalapozása, amelyik a 3. lapon fut. Ez természetesen azt jelenti, hogy az alkalmazói programnak a nullás lap szegmensben kell tárolnia a szegmensszámot azért, hogy a melegindítási alprogram azt vissza tudja állítani. Jegyezzük meg azt is, hogy minden (később ismertetett) szoftver-megszakítási cím is elvész, és így azt újból létre kell hozni.

4. Alkalmazói Program Interface

A nullás lap szegmens - amely mindig a Z-80-as nullás lapján található - első 256 byte-jának felépítése és kiosztása a következő:

00h - CP/M emulálási célokra fenntartva
08h - Szabad
10h - Szabad 18h Szabad 20h Szabad 28h Szabad
30h - EXOS rendszerhívás indítási vektora
38h - Megszakítási vektor Szoftver ISR cím
40h
48h - Az EXOS program és adatok számára fenntartva
50h
58h - /
60h - CP/M emulálási célokra fenntartva
68h - (Alapértelmezésben: File Vezérlő Blokk, FCB)
70h
78h
80h - CP/M emulálási célokra fenntartva
. . . - (Alapértelmezésben: pufferterület)
. . .
. . .
FBh

A CP/M emulálási céljaira fenntartott területeket bármely program felhasználhatja, amelyik nem igényel CP/M kompatibilitást, az EXOS viszont soha nem használja. A rendszer belépési pontjait a következőkben ismertetjük.
Egy alkalmazói programot a belépéspont címénél egy bizonyos akciókóddal és esetleg egy parancsjelsorozattal indíthatjuk (l. 9.2. alfejezet). A rendszervezérlés átvételéhez, a felhasználónak egy EXOS indítás hívást kell végrehajtania a RESET jelzőknek az akciókódtól függő beállításával (l. 9.3. és 11.2. alfejezetben). E hívás végrehajtása után a felhasználónak létre kell hoznia saját veremtárát, majd engedélyeznie kell a megszakításokat. Ezt követően a rendszer teljes vezérlése hozzá kerül át.
Az alkalmazói programot tartalmazó szegmenst, például ROM-bővítő modult, az EXOS lapozza be és, az kivétel nélkül mindig a Z-80-as 3. lapjára kerül. Kényelmi szempontokból rendszerint folyamatosan ott is marad, bár el is vihető onnan ha úgy kívánatos. Ha az EXOS-t hívjuk, vagy ha megszakítás fordul elő, akkor az 1.,2. és 3. lap tartalma megváltozik
esetleg többször is de mindig visszaállításra kerül a eredeti szegmensekbe, mielőtt a vezérlés újra a felhasználóhoz kerül. Így bármilyen lapfelosztást hoz létre a felhasználó, az az összes EXOS hívás és a megszakítások is megőrzik.

4.1. EXOS rendszerhívások - általános információk

EXOS-hívást úgy valósíthatunk meg, hogy végrehajtunk egy RST 30h utasítást. A vezérlésnek az EXOS fő ROM-jára való átadását, valamint annak a felhasználóhoz való visszatérését, kezelő programot a 30h-tól az 5Bh-ig terjedő terület tartalmazza. Ezt a területet - kivéve a 3Dh és 3Eh címen található szoftvermegszakítási címet - az alkalmazói programnak módosítania nem szabad.
A különböző EXOS-hívásokat egy 1 byte-os funkciókód határozza meg, ami közvetlenül az RST 30h utasítást követi. Az EXOS-hívások számára a paramétereket az A-, BC- és DE-regiszterekben adjuk át és ugyanezekben kapjuk vissza az eredményeket is. Az A-regiszter mindig állapotértéket hoz vissza, ami nulla, ha a hívás sikeres volt, és nem nulla, ha hiba vagy váratlan helyzet állt elő. Rendelkezésünkre áll egy olyan funkcióhívás is, ami ezeknek az állapotkódoknak egyszerű szöveges magyarázatát adja.
Bizonyos meghatározott eseteket kivéve, amelyeket a hívások részletes ismertetése során tárgyalunk, az AF-, BC- és DE-regiszterek tartalmát az EXOS-hívások nem őrzik meg. Az összes többi regiszter (a HL-, az IX-, az IY - regiszter és az AF'-et is magába foglaló háttér regiszterkészlet), valamint a négy darab Z-80-as lap regiszter tartalmát az összes EXOS-hívás megőrzi, kivéve néhány esetet, amit majd a 11. fejezetben tárgyalunk.
Az EXOS, valahányszor hívásra kerül, mindig átvált egy, a rendszerszegmensben lévő belső rendszerveremtárra, ezért csak nagyon kevés helyet foglal le a felhasználó veremtárában. Pontosan 8 byte-nak mindig rendelkezésre kell állnia a veremtár tetején. Még ha nincs semmilyen EXOS-hívás, erre a területre akkor is szükség van a megszakítások kiszolgálásánál. A program veremtárát korrekt módon kell kezelni, azaz a veremtár mutatója fölött soha ne legyen szükséges információ. A programverem a Z-80-as memóriában bárhol lehet, de természetesen csak a RAM-ban.
A rendszerhívásokat a későbbiekben részletesen ismertetjük. Itt felsoroljuk és megadjuk a hozzájuk tartozó funkciókódokat.

Kód Funkció
0
1
2
3
4
5
6
7
8
9
10
11
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
A rendszer reset
Csatorna megnyitása
Csatorna létrehozása
Csatorna lezárása
Csatorna megszüntetése
Karakter olvasása
Blokk olvasása
Karakter írása
Blokk írása
Csatorna olvasási állapota
Csatornaállapot megadása és olvasása
Speciális funkció
EXOS-változó olvasása / írása / átbillentése
Csatorna megszerzése
Csatorna átirányítása
Az alapértelmű egységnév beállítása
Rendszerállapot lekérdezése
Periféria felvétele
EXOS-határ olvasása
Felhasználói határ beállítása
Szegmens kijelölése
Szabad szegmens
Rendszerbővítők letapogatása
Csatornapuffer kijelölése (csak perifériafunkció)
Hibakód értelmezése
Modul betöltése
Áthelyezhető modul betöltése
Idő beállítása
Idő olvasása
Dátum beállítása
Dátum olvasása

Az 1-től 11-ig terjedő funkcióhívások perifériahívások. Mindegyikhez az A-regiszterben kell megadni a csatornaszámot, és az EXOS a hívást ezen a csatornán keresztül a megfelelt perifériakezelőhöz továbbítja. Majdnem minden többi funkció kezelése az EXOS-kernel belsejében történik. Kivételek:

funkciók, amelyek bármelyik bővítőnek felkínálják paramétereiket, ha felismerésük nem történik meg.
Ha egy periféria vagy rendszerbővítő ezen-hívások egyikének eredményeként megszerzi a vezérlést, akkor képessé válik arra, hogy maga is EXOS-hívásokat kezdeményezzen. Ily módon az EXOS újra hívható (re-entrant), noha erre vonatkozóan bizonyos korlátozások is vannak. A perifériakezelők nem nyithatnak meg és nem zárhatnak le csatornákat, ha náluk van a vezérlés (csatornapuffer problémák miatt, amelyekről a 7.3. és 7.4. alfejezetben lesz szó). A csatornapuffer kijelölés (27. kód) hívást csak periféria adhatja ki egy csatornamegnyitás hívás során; a felhasználó soha nem kezdeményezheti ezt a hívást.
Az olyan EXOS-hívások, amelyek egymásba ágyazott EXOS-hívásokat eredményezhetnek, elvégzik a veremtár ellenőrzését, hogy a belső-rendszerveremtár túlcsordulása ne következhessen be. Ez a megengedett egymásba ágyazási mélységet lényegesen korlátozza, bár létezik egy 127-es abszolút határ is, amelyen túl a rendszer egyáltalán nem képes működni. Nehéz azonban elképzelni azt, hogy szükség lehetne ilyen mélységű egymásba ágyazásra.

4.2. Hardver- és szoftvermegszakítások

Az EXOS órájának és naptárának működtetéséhez hardver- és szoftvermegszakításokat használ. A perifériakezelőnek is lehet olyan megszakítási rutinja, amit az EXOS hív egy meghatározott típusú megszakítás előfordulásakor. Az erre vonatkozó részleteket a periférialeírók magyarázatánál ismertetjük.

4.2.1. Felhasználói hardvermegszakítás rutin

A felhasználó megadhatja a megszakításkezelt rutinjának kezdőcímét a rendszerszegmens USER_ISR változójában. Az alapérték nulla, amely azt jelenti, hogy nincs felhasználói rutin. A címnek a nullás lapon kell lennie.
Ez a rutin minden megszakítás alatt megkapja a vezérlést. A D regiszter megfelelő bitjének 1 értéke adja meg a megszakítás forrását:

b1 - hangmegszakítás
b3 - 1Hz-es megszakítás
b5 - videomegszakítás
b7 - külső (hálózat) megszakítás

Az 1. lap tartalma ismeretlen, tetszés szerint állítható. A 2. és 3. lap tartalma megőrzendő, valamint a 2. lap mindig a vermet tartalmazó rendszerszegmens lesz. A nullás lap az alapszegmenst tartalmazza, és természetesen változatlanul kell hagyni. Mivel az EXOS mindent ment, ezért a felhasználói rutin mindegyik regisztert (beleértve az index- és háttér-regisztereket is) elronthatja. Viszont a rutin nem törölheti a megszakítási hardvert a Dave-chipben, ezt majd a visszatérés után az EXOS megteszi.
A felhasználói rutin még a periféria-megszakítási rutinok előtt meghívásra kerül, így igen gyorsan hozzáfér a felhasználó a megszakításhoz. Jegyezzük meg, hogy a megszakítási rutin címe rendszer reset esetén törlődik (akár EXOS-hívásból, akár meleg-indításnál), így ilyenkor újra be kell állítani.

4.2.2. Szoftvermegszakítások

A szoftvermegszakítás lehetővé teszi a felhasználó "riasztását" különböző események bekövetkezésekor az EXOS-ból. A szoftvermegszakítás az eszközkezelők megszakítási rutinja által érzékelt speciális események (mint például blokk vétele a hálózatról a hálózatkezelő rutin által) bekövetkezésével áll szoros időkapcsolatban. Egy ilyen esemény bekövetkezése esetén az eszköz egy szoftvermegszakítás kódot - helyez el a rendszerszegmens FLAG_SOFT_IRQ változójában. Ez az érték jelzi, hogy milyen okból következett be a szoftvermegszakítás.
Semmi sem történik addig, amíg az EXOS vissza nem tér a felhasználóhoz, ami bekövetkezhet közvetlenül a megszakítási rutin után, vagy akár jóval később is, ha az esemény egy eszközkezelő rutin végrehajtása során következett be. Ekkor viszont amennyiben adott egy nem nulla szoftvermegszakítás rutin cím, akkor az EXOS végrehajtja azt. Ezt a címet egyszerűen nullás lap 3Dh és 3Eh helyeire kell letenni, ami lényegében egy JP utasítás operandusa.
A szoftvermegszakítás végrehajtása abból áll, hogy az EXOS a megszakítási rutinra ugrik (amely bármelyik lapon lehet) ahelyett, hogy egyszerű RET utasítást hajtana végre, amely visszaadná a vezérlést a felhasználónak. A környezet már teljesen olyan lesz ekkor, mint amilyen a visszatéréshez kell, vagyis a verem, a regiszterek és a lapok az eredeti állapotukban lesznek. A visszatérési cím a verem tetején található, így a rutin egyszerűen visszaadhatja a vezérlést a főprogramnak. Ebben az esetben azonban az összes regiszter tartalmát meg kell őrizni, mivel a megszakítás a felhasználói program bármely részén történhet.
A szoftvermegszakítás-kezelő programnak nem feltétlenül szükséges visszatérnie a felhasználóhoz, okozhatja a felhasználói program egyfajta melegindítását is.
A szoftvermegszakítás rutin a CODE_SOFT_IRQ EXOS változó kiolvasásával megállapíthatja a megszakítási kódot. Ez lényegében csak másolata az eszköz által beállított kódnak, mivel az eredeti kód nullázódik közvetlenül a rutinra ugrás előtt, hogy megakadályozza a rutin többszöri hívását. Amennyiben a szoftvermegszakítás kezelése előtt több megszakítási kérés is érkezik, csak a legutolsó lekezelése történik meg.
A beépített perifériák összes szoftver-megszakítási forrása engedélyezhető vagy letiltható a megfelelő EXOS-változók beállításával, vagy különleges funkcióhívások elvégzésével. A beépített eszközöktől származó kódok a következők:

10h...1Fh
- ?FKEY
A billentyűzet funkcióbillentyűje lenyomva.
20h
- ?STOP
A billentyűzet STOP billentyűje lenyomva.
21h
- ?KEY
A billentyűzet valamelyik billentyűje lenyomva.
30h
- ?NET
Hálózati adat vétele.
40h
- ?TIME
A Timer EXOS-változó értéke elérte a 0-t.

4.3. A STOP billentyű

A STOP billentyű a lehetséges szoftvermegszakítások egyik forrása az EXOS-ban. Ez azonban egy meglehetősen speciális eset. Ennek az az oka, hogy a STOP billentyű megnyomásának mindig egy azonnali vagy majdnem azonnali választ kell eredményeznie. A rendszer viszont gyakran várakozik egy eszközkezelő rutinban valaminek a megtörténtére (pl. a szerkesztőprogram vár egy billentyű leütésére), vagy valami olyasmit csinál, ami- sok időt igényel (pl. a videokezelő színez egy területet). Ilyen esetekben, ha a STOP billentyű csak szoftvermegszakítást okozna, nem kapnánk azonnali választ.
Erre a problémára az a megoldás, hogy valahányszor bármely berendezés valami olyasmit csinál, ami a dolog természeténél fogva lassú, vagy nem befejeződő folyamat, akkor a rendszer periodikusan ellenőrzi a FLAG_SOFT_IRQ változó értékét. Ha az tartalmazza a ?STOP kód értékét, akkor lenyomták a STOP billentyűt. Ekkor a berendezés azonnal vagy legalábbis hamarosan visszatér az EXOS-hoz egy STOP. állapotkóddal. Ez a kód végül is megtalálja visszafelé az utat a felhasználóhoz és bekövetkezik a szoftvermegszakítás.
Gyakorlatilag a helyzet bizonyos esetekben ennél rosszabb, mivel néha olyan folyamatot kell megszakítani, ami letiltott, szabályos EXOS-megszakítások mellett fut és így a billentyűzet lekérdezése sem folyik. Erre példa a magnókezelő, ami szalagra ír vagy arról olvas. Ilyen esetekben az eszköz maga tartalmaz egy olyan rutint, ami a STOP billentyűt figyeli és előidézi a szoftvermegszakítást, megadja magát a hibát is.

5. A szegmenskijelölés

A szegmenskijelölést röviden már megmagyaráztuk a rendszer áttekintése során, itt pedig részletesen ismertetjük. A hidegindításkor az EXOS listát készít a rendelkezésre álló összes RAM-szegmensről és mindegyiket le is teszteli. A rendszer csak akkor működik, ha legalább 32k nagyságú, azaz két szegmensnyi memóriaterület rendelkezésre áll, ennek magába kell foglalnia a 0FFh szegmenst is, ami a rendszerszegmens.
A listából a rendszer kiveszi a legkisebb számú RAM-szegmenst és ezt nullás lap szegmensként fogja használni. Ez a szegmens a kijelölés semmilyen formájánál nem kerül felhasználásra, mindig a Z-80-as nullás lapján marad.
A listán szereplő minden egyes RAM-szegmens az alábbi öt különböző állapot valamelyikében lehet:

Az imént említett kategóriákhoz tartozó szegmensek számát e rendszerállapot lekérdezése EXOS-hívás (20. kód) kiadásával határozhatjuk meg, amit a 11.18. alfejezeteben részletesen ismertetünk.
A rendszerszegmens (azaz a 0FFh számú szegmens) mindig kijelölt állapotú; vagy csak a rendszeré, vagy pedig megosztott, de soha nem lehet szabad. Az összes többi szegmens eredetileg szabad, kivéve a nullás lap szegmenst, ami nem tartozik a most tárgyalt kijelölés hatálya alá.

5.1. Felhasználói és perifériához / bővítőhöz tartozó szegmensek

Amikor a felhasználó kiad egy szegmens kijelölése EXOS-hívást (24. kód), akkor - ha van szabad szegmens - ezek közül kijelölésre kerül egy, a szegmens számát pedig visszajelzi a rendszer. A felhasználó ezzel a módszerrel annyi szegmenst igényelhet meg, amennyit csak akar. A korlátozást egyedül a rendelkezésre álló szegmensek száma jelenti. A szabad szegmens EXOS-hívás (25. kód) végrehajtásával szabaddá teheti bármelyik, korábban már kijelölt szegmenst.
A szegmenseket különböző módszerekkel lehet a perifériák/bővítők részére kijelölni. A perifériakezelő, hasonlóan ahhoz, ahogy a felhasználó teszi, kiadhat egy szegmensjelölési hívást, és ha ilyenkor rendelkezésre áll legalább egy szegmens, akkor azt jelöli az EXOS a perifériához/bővítőhöz. Ezen kívül a periféria is - ugyanúgy, mint a felhasználó - fel tud szabadítani szegmenseket. Periféria szegmensek kijelölhetők valamely rendszerbővítő betöltésekor is (ennek részleteit l. a 10.5. alfejezetben) vagy hidegindításkor, amikor egy ROM-bővítés beszerkesztését végezzük (feltéve, hogy a ROM igényt tart szegmensre - l. 9.2.7 pontot).
Melegindítást követően a perifériák vagy a felhasználó számára kijelölt minden szegmens továbbra is megmarad. Ugyancsak megmaradnak a perifériához kijelölt szegmensek akkor is, amikor egy új alkalmazói programot indítunk (de ez nem áll a felhasználói szegmensekre). Gondosan kell ügyelnünk arra, hogyha egy eszköz maga is kijelölhet RAM-szegmenseket saját részére, akkor ezek a szegmensek szabaddá váljanak, amikor már nincs rájuk szükség. Különös figyelmet kell szentelnünk a periféria inicializálásra, mivel az egység újra inicializálása esetleg úgy megy végbe, hogy továbbra is megmaradtak a korábban kijelölt szegmensek. Ilyenkor meg kell akadályozni, hogy új szegmenseket jelölhessen ki a maga számára.
Valahányszor egy felhasználói vagy perifériához társítandó szegmenst kérünk, a rendelkezésre álló szegmensek közül mindig az kerül kijelölésre, amelyiknek a legkisebb a száma. Ez biztosítja azt, hogy a videoszegmenseket, amelyeknek a legmagasabb a számuk, a lehető legtovább őrizze a rendszer, és azok a videocsatornák rendelkezésre állhassanak.

5.2. A rendszerszegmensek és az EXOS-határ

A rendszer számára kijelölt szegmenseket alapvetően csatorna-RAM területek céljaira alkalmazzuk. A rendszer a RAM-ot a rendszerszegmens tetejétől kezdve használja lefelé a szükséges mélységig, és ez esetleg átnyúlik más szegmensekbe is. rendszerszegmens tetejét a rendszerváltozók, a rendszer-veremtár, az egység RAM-területek (l. az egységekre és az egység leírásokra vonatkozó magyarázatokat), valamint a bővítő ROM-ok RAM-területei foglalják el.
Ezeknek kivétel nélkül a rendszerszegmensekben kel lenniük. Alattuk található a csatornaleírók lánca, amelynek, minden tagjához egy-egy RAM-terület tartozik. Ezek a RAM-területek annyi szegmenst vehetnek igénybe, amennyir szükség van. Ezt a későbbiek során részletesebben is ismertetjük.
Minden olyan szegmens, amit csatorna-RAM területnek használunk kap, a rendszer számára van kijelölve. Mindegyik szegmens felhasználása fentről lefelé történik, ameddig meg nem telik. Ekkor egy másik szegmens kijelölésére kerül sor. Így az összes rendszerszegmens teljesen ki van használva, kivéve a legutolsót, amelynek alján esetleg lehet még bizonyos mennyiségű szabad hely. Az ún. EXOS-határ nevű rendszerváltozó mondja meg az utolsó rendszerszegmensben még felhasznált legkisebb címet. Ezt az EXOS-határ olvasása (22. kód) hívása segítségével olvashatjuk ki, és 0000h-tól 3FFFh-ig terjedő tartományba esik.
Új rendszerszegmenseket egy csatorna megnyitásakor jelölhetünk ki vagy akkor, amikor egy periféria, vagy rendszerbővítő beszerkesztése történik. Amikor egy csatornát lezárunk, a hozzá tartozó csatorna-RAM felszabadul, ez azt eredményezi hogy szabaddá válik a szegmens. Ilyenkor az EXOS-határ is az előző szegmensre tolódhat.
Az EXOS mindig a rendelkezésre álló legnagyobb számú szegmenst utalja ki, amikor a rendszernek szüksége van új szegmensre. Ez az eljárás biztosítja, hogy a lehető legnagyobb, folytonos video-RAM terület álljon a videocsatornák rendelkezésére, tekintettel arra, hogy a videoszegmensek száma a legnagyobb. Ha egy videoszegmens olyankor szabadul fel, amikor a rendszer egy nem videoszegmenst használ, akkor a két szegmens felcserélődik, bár erre csak akkor kerül sor, amikor legközelebb megnyitunk egy csatornát.

5.3. A megosztott szegmens és a felhasználói határ

A rendszerben legfeljebb egy olyan RAM-szegmens lehet, amit a felhasználó és a rendszer közösen használ. Ha van ilyen szegmens, akkor az mindig a rendszer által utoljára igényelt szegmens lesz és így tartalmazza a már ismertetett EXOS-határt is. megosztott szegmenst. Ilyen esetben a szegmens rendszerszegmens lesz. Azt követően, hogy a felhasználó szabaddá tett egy szegmenst, természetesen mindig módjában áll azt újra kijelölni.
Amikor egy csatornát megnyitunk és a rendszerben van egy megosztott szegmens, akkor az EXOS-határt rendszerint lefelé kell mozgatni. Emiatt a felhasználói határt is lefelé kell mozgatni ameddig csak lehetséges, hogy helyet csináljunk, mielőtt megnyitnánk a csatornát. Ezen kívül, ha egy szegmens szabaddá válik és ugyanakkor a rendszerben létezik egy megosztott szegmens (a szegmenst felszabadíthatta a felhasználó, egy készülék vagy valamelyik bővítő), akkor az EXOS nem tudja ezt a felszabadult szegmenst a rendszer számára lefoglalni, viszont az kijelölhető a felhasználónak. Ez azt jelenti, hogy a felhasználónak a RAM legjobb hasznosítása érdekében ajánlatos a közösen használt (megosztott) szegmenst minél hamarabb szabaddá tenni, például tartalmának egy új szegmensbe való átmásolásával.

5.4. A rendszerszegmens használata

Az előzőekben már több említést is tettünk a rendszerszegmensről. Ez a fejezet most részletesebben tárgyalja használatát, ill. ismertet bizonyos címeket. Azokat a további tudnivalókat, amelyek a különböző RAM-részeknek a rendszerszegmensbe való telepítését tárgyalják, a megfelelő fejezetekben kifejtjük.
A rendszerszegmens legfelső része néhány olyan változónak ad helyet, amelyek definiált abszolút címeken vannak és amelyeket mind a felhasználó, mind az eszközök használhatnak. Ezek közül néhányat már ismertettünk, másokat pedig a későbbiekben fogunk tárgyalni. A következő lista csak a címeket és neveket adja meg, egy rövid ismertetés kíséretében.

0BFFFh - USR_P3 Ezek tárolják a négy lapregiszter
0BFFEh - USR_P2 tartalmát az EXOS utolsó hívásakor. A
0BFFDh - USR_P1 tartalmakat a perifériák használják
0BFFCh - USR_P0 felhasználói címek megadásakor.
0BFFA/Bh- STACK_LIMIT A perifériák által végzett veremtár-ellenőrzéshez, amikor az alapértelmezés szerintinél nagyobb méretű verem szükséges.
0BFF8/9h - RST_ADDR Felhasználói melegindítási cím.
0BFF6/7h - ST POINTER Az állapotsor memóriacíme. Az e címtől található 42 byte az állapotsor (l. a videokezelő specifikációja).
0BFF4/5h - LP_POINTER A sor-paramétertábla elejének címe (l. a videokezelő specifikációját).
0BFF3h - PORTB5 A 0B5h általános kiviteli port aktuális értéke. Azok a perifériák használják, amelyek hozzáférnek ehhez a kapuhoz. Az ismertetést l. a perifériakezelők specifikációinál.
0BFF2h- FLAG_SOFT_IRQ A szoftvermegszakítás indítása.
0BFF0/1h - SECOND_COUNTER 16 bites másodpercszámláló.
0BFEFh - CRDISP_FLAG A bejelentkezési üzenet elnyomásának jelzője.
0BFED/Eh - USER_ISR Felhasználói megszakítási rutin címe. Ha nincs ilyen igény, értéke nulla.

A rögzített változók alatt találhatók az EXOS-kernel belső rendszerváltozói, valamint az összes beépített eszközhöz tartozó RAM-terület is. Ezek a RAM-területek tartalmazzák a sorparamétertábla, a karakterkészlet, a funkcióbillentyű-füzérek, a hangsorok stb., valamint az egyes perifériákhoz tartozó változók részére szükséges helyet. Ugyancsak ez a RAM-terület tartalmaz helyet az EXOS-rendszer veremtára számára, amit minden berendezés és rendszerbővítő felhasznál. E terület nagysága az EXOS minden egyes verziójánál. rögzített érték.
Ez alatt a rögzített nagyságú terület alatt van a RAM-szegmensek listája, ez utóbbi alatt pedig a ROM-bővítők jegyzéke. Mindkettő mérete változik a rendszerhez csatlakoztatott ROM- és RAM-bővítő egységek számától függően. Az említett listák alatt találhatók azok a rendszerszegmens RAM-ok, amelyek a ROM-bővítőkhöz tartoznak, feltéve, hogy ez utóbbiak inicializált állapotúak. (Ennek magyarázatát l. később.) A fenti területek a hidegindítás idején alakulnak ki és ezt követően rögzítettek maradnak.
Ezalatt található az összes beépített perifériakezelőhöz tartozó periférialeíró, továbbá minden olyan perifériakezelő is, amit a ROM-bővítők tartalmaznak. Ez persze magába foglalja a bővítő ROM eszközök által igényelt periféria-RAM területeket is. A beépített berendezésekhez szükséges RAM-területeket - állandó jelleggel - a rögzített RAM-területből kerülnek kijelölésre és így itt RAM-ot egyáltalán nem igényelnek. A tárgyalt terület mindannyiszor újonnan jön létre, valahányszor végrehajtunk egy EXOS-indítás hívást az indításjelzők (reset flags) olyan beállítása mellett, amelyek a perifériák újraszerkesztését eredményezik, (l. a 11.2. alfejezetet). Ez általában akkor fordul elő, amikor egy új alkalmazói program ragadja magához a vezérlést.
Amikor egy felhasználói perifériát csatlakoztatunk, ez a terület lefelé megnagyobbodik, hogy magába foglalhasson minden olyan periféria-RAM-ot, amire az új eszköznek szüksége van. Következésképpen minden, ami ez alatt található, lefelé fog eltolódni. Ha egy ilyen periféria-RAM-ot már kijelöltünk, akkor az mindaddig megmarad, ameddig újra nem szerkesztjük az eszközöket (l. fentebb), ami törli a felhasználói periféria kezelőjét.
A fent említett területek mindegyikének teljes egészében a rendszerszegmensen belül kell elhelyezkednie. Minden olyan RAM-felosztási kísérlet, amelynek eredményeként e területek kikerülnének a rendszerszegmensből, kudarcot vall.
Közvetlenül a felhasználói perifériák RAM-területe alatt van a csatorna-RAM terület eleje. Ennek a rendszerszegmensben kell ugyan kezdődnie, de lefelé annyi szegmensre terjedhet ki, amennyire csak szüksége van. A csatorna-RAM terület minden egyes, éppen megnyitott állapotú csatornához tartalmaz egy csatornaleírót és egy RAM-területet. Ez utóbbi RAM-területeket az EXOS szabadon átszervezheti, amikor más csatornákat megnyitunk vagy lezárunk, vagy amikor felhasználói perifériákat kapcsolunk a konfigurációhoz. Ezeket a kérdéseket részletesen is kifejtjük a csatorna-RAM kijelölését tárgyaló fejezetben.
A fenti leírásból nyilvánvaló, hogy a tárgyalt területek zömének nagysága és címe a hardver- és szoftver-konfigurációtól függően változik. Az alább ismertetett példa egy 64k memóriájú, egyetlen ROM-bővítő modullal rendelkező átlagos géphez mutatja be a címeket. Ilyen bővítőmodul például a csatlakoztatott IS-BASIC cartridge. Az ismertetést csak útmutatásként szabad felhasználni, tekintettel arra, hogy a pontos méretek és címek a különböző verziókban változhatnak. A címek a Z-80-as 2. lapján adottak, mivel normál körülmények között az EXOS és a berendezések itt férnek hozzá a rendszerszegmenshez, bár azt természetesen bármely másik Z-80-as lapra is belapozhatjuk.

Cím
Méret
 
BFFFh
17
Változókhoz rendelt tartomány (listájukat l.
BFEFh   fentebb)
BEE4h
267
Belső EXOS rendszerváltozók
B258h
3212
A beépített egységek RAM-területeihez
B21Ch
60
Hely az EXOS RAM rezidens kódja részére
ABD6h
1604
Rendszerveremtár
ABD2h
4
RAM-szegmenslista, szegmensenként 1 byte
ABC6h
12
ROM-bővítő lista, ROM-onként 4 külön byte
 
0
RAM-területek a ROM-bővítők számára
AB42h
132
132 Periférialeírók a beépített egységekhez
...   A csatornaleíró lánc kezdete

6. A periférialeírók

6.1. A periférialánc

Minden perifériakezelőhöz tartozik valahol a RAM tárban egy periférialeíró, amely megadja az egység nevét, a perifériakezelő program kezdőcímét és még néhány egyéb információt. Ezek a leírók láncba vannak szerkesztve, amelyet periférialáncnak nevezünk. Ha megnyitunk egy csatornát, az EXOS végignézi ezt a láncot megkeresve azt a perifériát, amelynek neve megegyezik a kért névvel, majd megnyitja számára a csatornát.
A periférialánc, valahányszor végrehajtunk egy EXOS-indítás hívást újraépül. Az indításjelzők beállítása a perifériák újraszerkesztését eredményezi (l. az EXOS indítási hívás ismertetését). Ez a helyzet hidegindításkor, valamint olyan esetekben fordul elő, amikor egy alkalmazói program magához ragadja a vezérlést. A lánc eredetileg a minden egyes beépített perifériakezelőhöz, továbbá minden, a ROM-bővítőben lévő perifériakezelőhöz tartozó leíróból jön létre.
A felhasználó vagy valamilyen rendszerbővítő egy egyszerű EXOS-hívás segítségével új perifériákat csatlakoztathat rendszerhez. Ezek hozzáadódnak a lánchoz, de elvesznek a lánc újraszerkesztésekor.

6.2. A periférialeírókra vonatkozó részletes információk

Ebben a fejezetben a periférialeírók formáját tárgyaljuk. Mindegyik elem egy byte nagyságú, eltekintve a periféria nevétől, amelynek mérete változó. A megadott eltolási értékek (offset) a DD_TYPE nevű mezőtől értendők, mivel ez az a hely, ahová a periférialánc-mutatók mutatnak.

-3 DD_NEXT_LOW A következő leíró DD_TYPE nevű mezőjének
-2 DD_NEXT_HI 24 bites címe. A cím a Z-80-as 1. lapon lesz.
-1 DD_NEXT_SEG A lánc végét a DD_NEXT_SEG = 0 jelzi.
+0 DD_TYPE Nullának kell lennie.
+1 DD_IRQFLAG A perifériamegszakítás kezelését határozza meg.
+2 DD_FLAGS b0 beállítva videoperiféria esetén b1-b7 törölt
+3 DD_TAB_LOW A periféria belépési pont táblázatának
+4 DD TAB_HI 24 bites címe. A címnek a-Z-80-as
+5 DD_TAB_SEG 1. lapján kell lennie.
+6 DD_UNIT_COUNT Normál esetben értéke nulla. Ha nem az, akkor megengedjük, hogy több periféria létezzen azonos néven.
+7 DD_NAME A periférianév betűi.

A DD_TYPE nevű mező a további bővítési lehetőségekre, valamint a perifériatiltásokra van fenntartva. A letiltás iránti igény például olyankor lép fel, amikor egy már létező periféria nevével egy új egységet csatolunk a konfigurációhoz. Ilyenkor a régi periféria letiltódik - kivéve, ha a DD_UNIT_COUNT értéke nullától eltérő.
A DD_IRQFLAG nevű mezőben egy-egy bit van hozzárendelve az Enterprise számítógépben lehetséges négy megszakításforrás mindegyikéhez. Ha a megfelelő bit beállított állapotú, akkor az érintett perifériakezelő megszakító alprogramja mindig végrehajtódik, amikor az adott típusú megszakítás előfordul. A bitek bármilyen kombinációja megadható. A bithozzárendelések a következők:

- b1 : Programozható hangmegszakítások
- b3 : 1Hz megszakítások
- b5 : Videomegszakítások (50 Hz)
- b7 : Külső megszakítások (hálózat)
- b0 : Kötelezően nulla értékű
- b2 : Kötelezően nulla értékű
- b4 : Kötelezően nulla értékű
- b6 : Kötelezően nulla értékű

A DD FLAGS nevű byte 0. bitjét a csatorna-RAM kiosztás vezérlésére használjuk, ami eltérő a video-, ill. nem video jellegű perifériák esetében. A kérdést a 7.3 alfejezetben fogjuk ismertetni. A belépési pont táblázat címe (DD_TAB_SEG, DD_TAB_HI és DD_TAB_LOW) egy olyan 2 byte-os hívási címeket tartalmazó táblázatra mutat, amelyben egy-egy cím tartozik a periféria által teljesítendő minden egyes funkcióhoz. A leíróban megadott címnek a Z-80-as 1. lapon kell lennie, mivel az EXOS itt fér a táblázathoz. A táblázatban található bejegyzéseknek viszont a Z-80-as 3. lapján kell szerepelniük, tekintettel arra, hogy az EXOS a perifériakód-szegmenst a 3. lapra teszi le, amikor egy perifériát hív. A belépési pontoknak kivétel nélkül ugyanabban a szegmensben kell lenniük, mint amelyikben a belépési pont táblázat van. Az alábbiakban jegyzékszerűen felsoroljuk a táblázat bejegyzéseit, ismertetésükre pedig a perifériakezelőket tárgyaló fejezetben visszatérünk.

+ 0 : Megszakítás (Nem kell érvényesnek lennie akkor, amikor DD_IRQFLAG = 0)
+ 2 : CSATORNA MEGNYITÁSA
+ 4 : CSATORNA LÉTREHOZÁSA
+ 6 : CSATORNA LEZÁRÁSA
+ 8 : CSATORNA MEGSZUNTETÉSE
+10 : KARAKTER OLVASÁSA
+12 : BLOKK OLVASÁSA
+14 : KARAKTER ÍRÁSA
+16 : BLOKK ÍRÁSA
+18 : CSATORNAÁLLAPOT OLVASÁSA
+20 : CSATORNAÁLLAPOT BEÁLLÍTÁSA
+22 : KÜLÖNLEGES FUNKCIÓ
+24 : Inicializálás
+26 : Puffermozgatás

A nagybetűkkel írt hívási pontok közvetlenül megfelelnek a tárgyhoz tartozó EXOS-hívásoknak, a többi viszont az EXOS-on belül alakul ki.
A DD_UNIT_COUNT mező általában nulla értékű. Nullától különböző értékre állítva, több azonos nevű periféria kezelését az egységszámokkal tesszük lehetővé. Ezt a lehetőséget ismertetjük a csatornák megnyitását tárgyaló fejezetben (l. 11.1.).
A DD_NAME mező maga a periféria neve. Ennek első byte-ja a név hossza, amit az ASCII karakterekkel megadott név követ. A név maximum 28 karakter hosszúságú lehet és csak nagybetűkből állhat.

6.3. ROM-bővítő egységek

A 0008/9h relatív címen minden ROM-bővítőben egy mutató található, ami egy periférialánc elejére mutat. Ha a ROM-ban nincsenek perifériakezelők, akkor a mutató értéke szükségszerűen nulla. A láncban szereplő minden egyes elem tulajdonképpen egy periférialeíró, az előbbiekben meghatározottak szerint, de bizonyos mezői vagy hiányoznak, vagy a mezőket más információk helyettesítik. Egy ilyen álleíró felépítése pl. a következő:

XX_NEXT_ LOW 16 bites mutató, ami a következő álleíró
XX_NEXT_HI XX SIZE mezőjére mutat (1. lap)
XX_RAM_LOW  
XX_RAM_HI A szükséges periféria-RAM mennyisége.
DD_TYPE Ezek a mezők pontosan ugyanazok, mint az
DD_IRQFLAG előbbiekben definiált teljes leírók megfelelő
DD_FLAGS mezői. A DD TAB SEG nevű mező tetszés
DD_TAB_LOW szerinti értékű lehet, tekintettel arra,
DD_TAB_HI hogy az EXOS úgyis újratölti,
(DD_TAB_SEG) amikor csatlakoztatja a perifériát.
DD_UNIT_COUNT  
DD_NAME  
XX_SIZE Az álleíró mérete (l. a szöveges ismertetést).

A ROM elején található periférialánc-mutató az 1. lapon az első álleíró XX_SIZE mezőjére mutat. Hasonlóképpen az egyes álleírókban található láncmutatók (XX_NEXT_LOW és XX_NEXT_HI) a Z-80-as 1. lapon a következő álleíró XX_SIZE nevű mezőjére mutatnak. A lánc végét egy olyan álleíró jelöli ki, amelyikben mind a DD_NEXT_HI, mind a DD_NEXT_LOW mező értéke nullára van állítva.Az XX_SIZE mező adja meg a DD_TYPE-tól a periféria nevéig terjedő byte-ok számát a leíróban. így ha a periféria neve egy byte hosszúságú, akkor a DD_SIZE értéke 9.
Amikor a perifériát a konfigurációhoz csatlakoztatjuk, akkor a fontosabb leírómezők (azaz a DD-vel kezdődő mezők) egyszerűen bemásolódnak a RAM-ba, ez az induláskor kiegészül egy 3 byte hosszúságú elemmel és létrejön a teljes periférialeíró. Emlékezzünk azonban arra, hogy az EXOS tölti ki a DD_TAB_SEG mezőt, tekintettel arra, hogy a bővítőben lévő ROM nem tudja, hogy melyik szegmensben lesz a helye. Más szavakkal ez azt jelenti, hogy a belépési ponttáblázatnak ugyanabban a szegmensben kell lennie, mint amelyikben az álleíró van.
Az XX_RAM_HI és XX_RAM_LOW mezők meghatároznak egy 16 bites számot, ami a szóban forgó periféria részére a rendszerszegmensben igényelt ún. periféria-RAM nagyságát jelenti. Ezt a számot kettes komplemens alakban kell megadni, megnövelve egy olyan relatív értékkel, ami lehetővé teszi azon 3 byte-os láncmutató beiktatását is, amit az EXOS rak a leíró elejére. Ha nincs szükség periféria-RAM-ra, akkor az értéknek FFFEh-nak (vagyis -2-nek) kell lennie. Ha egy byte szükséges, akkor az érték FFFDh (-3), és így tovább.
Valahányszor a perifériát behívjuk, az IY-regiszter tartalma a perifériakezelőket tárgyaló fejezetben kifejtettek szerint a megfelelő periférialeíróra mutat. Mivel a periféria-RAM közvetlenül a leíró alatt foglal helyet, ezért a periféria-RAM-ot az IY-hoz viszonyítva lehet elérni. Ha n byte-ot kérünk, akkor ezekhez. a következő címeken lehet hozzáférni:

IY-4, IY-5, ... , IY-4-n.

6.4. Felhasználói perifériák

Felhasználói perifériáknak számítanak azok az egységek, amelyeket egy periféria felvétele EXOS-hívás segítségével csatolunk a rendszerhez. Ezt vagy a felhasználó, vagy egy rendszerbővítő kezdeményezheti. A felhasználói periférialáncolásához egy teljes periférialeírót kell létrehozni a RAM-ban. A leíró minden mezőjének hiánytalannak kell lennie, kivéve a 24 bites láncmutatót (DD_NEXT_SEG, DD_NEXT_HI és DD_NEXT_LOW). Az EXOS-hívást ezután úgy hajtjuk végre, hogy a DE-regiszter a szóban forgó leíró TYPE nevű mezőjére mutasson, ami bármelyik Z-80-as lapon lehet.
Periféria-RAM területet egyszerűen kérhetünk, ha a szükséges nagyságot képviselő értéket megadjuk a BC regiszterben. A kért nagyságú RAM- a ROM-bővítő egységekhez tartozó periféria-RAM területek alatt kerül kijelölésre. A kijelölt RAM címét a perifériakezelőnek az IX-regiszterben kapja meg, amikor először inicializáljuk ezt az eszközt. Ha n byte-ot kérünk, akkor a RAM-területekhez a következő címeken lehet hozzáférni:

IX-1, IX-2, ... , IX-n.

Ne feledjük, hogy ez a cím az IX regiszterben csak az első inicializáláskor kerül átadásra. A perifériakezelő feladata, hogy a későbbi alkalmazásoknál emlékezzen a címre, még újrainicializálás, például egy melegindítás után is.

7. A perifériakezelők

Egy perifériakezelő alprogramok olyan halmazából áll, ahol külön-külön rutinok feladata az előző fejezetben ismertetett belépésipont-táblázatban szereplő 14 hívási pont mindegyikének végrehajtása. Ez a fejezet az egyes alprogramok funkcióit tárgyalja, beleértve a regiszterhasználattal kapcsolatos tudnivalókat is.

7.1. A perifériakezelő alprogramok - Általános információk

A már említett 14 perifériakezelő hívási pont közül tizenegy közvetlenül megfelel az 1 - 11-ig terjedő EXOS funkciókódnak. Valahányszor a felhasználó végrehajt egyet ezek közül az EXOS hívások közül, az EXOS kideríti, hogy melyik periféria tartozik a szóban forgó csatornához és átadja a vezérlést a perifériakezelő megfelelő belépési pontjára. Ezeket a hívásokat perifériacsatorna-hívás néven szoktuk emlegetni.
A másik három perifériakezelő hívási pont inicializálási, megszakításkezelési és csatornapuffer mozgatási célokra alkalmas. Az e három rutinra irányuló hívások az EXOS-kernel belsejében lesznek lekezelve. Az alábbiakban ezek mindegyikét részletesen is tárgyaljuk.
Valahányszor egy perifériakezelt alprogramot meghívunk, a Z-80-as 3. lapjára kerül a hívási pontot tartalmazó szegmens. A 2. lap mindig a rendszerszegmenst (azaz a 0FFh szegmenst), a 0. lap pedig természetesen a nullás lap szegmenst fogja tartalmazni. Perifériacsatorna-hívások esetén a csatornaleírót és a csatorna-RAM-ot tartalmazó szegmens az 1. lapon lesz, más hívásoknál viszont az 1. lap tartalma határozatlan. A veremtármutató a rendszerveremtárra, a Z-80-as 2. lapjára áll be. A veremtárban a megszakítások kiszolgálásához szükséges mennyiségen felül (egy megszakítási alprogramhoz ez csak 50 byte) legalább még 100 byte fog rendelkezésre állni.
Amikor egy perifériakezelőt hívunk, akkor az IY-regiszter mindig a periférialeíró DD_TYPE nevű mezőjének a címét tartalmazza a 2. lapon. Bővítő perifériák esetén (amelyeket a ROM-bővítőkből csatlakoztattunk a rendszerhez), ez a periféria-RAM-hoz való hozzáférésre használható fel, ami a rendszerszegmensben közvetlenül a periférialeíró alá van elhelyezve. Egy felhasználói perifériának néha a saját periférialeíróhoz relatívan kell elérnie a RAM-ot, ami nem lesz benne a rendszerszegmensben. Emiatt be kell lapoznia a megfelelő szegmenst (nem feledkezve meg a megszakítások átmeneti letiltásáról, mivel a veremtár viszont kilapozódik, azaz kikerül a lapról). Annak érdekében, hogy a felhasználói perifériát ennek elvégzésére alkalmassá tegyük, a hozzá tartozó periférialeírót tartalmazó szegmens száma bekerül a B'-regiszterbe, valahányszor hívjuk a kérdéses perifériát.
A perifériakezelő alprogramok tönkretehetik az összes regiszter - közöttük az indexregiszterek és az alternatív regiszterkészlet regisztereinek - tartalmát, mivel ezek a tárolását az EXOS hajtja végre. A perifériakezelő ezen kívül a Z-80-as 1. lap tartalmát is szabadon elronthatja, de gondot kell fordítanunk a többi Z-80-as lap épségének megőrzésére. Általában az A-, BC- és DE-regisztereket szoktuk arra használni, hogy paramétereket adjunk át az alprogramoknak, ill. arra, hogy eredményeket kapjunk vissza az alprogramokból.

7.2. A perifériainicializáló alprogram

A perifériainicializáló rutin nem vesz át paramétereket (eltekintve a B'-ben és IY-ban lévő csatornaleíró szegmenstől és címtől), továbbá nem ad vissza eredményeket. Akkor hívjuk meg, amikor a perifériát először csatoljuk a rendszerhez, majd mindannyiszor újrahívjuk, valahányszor végrehajtunk egy EXOS-indítás hívást. Erre melegindításkor vagy olyankor kerül sor, amikor egy új alkalmazói program átveszi a vezérlést.
Minden olyan csatorna, amelyik esetleg a periféria számára nyitott megszűnik, amikor ezt az alprogramot futtatjuk, és emiatt ilyenkor a periféria minden változóját, ill. adatterületét törölnünk kell. Jegyezzük meg, hogy ilyen esetekben a perifériának kiutalt RAM-szegmensek nem szabadulnak fel, ezért a perifériának emlékeznie kell arra, hogy a soron következő inicializálások után ezek a szegmensek továbbra is hozzá tartoznak.

7.3. A csatorna-RAM kijelölés (allokálás)

Minden megnyitott csatornának van egy kijelölt csatorna-RAM területe. A csatornamegnyitás vagy a csatornalétrehozás nevű alprogram feladata egy pufferkijelölés EXOS-hívás végrehajtása, hogy a csatorna megkapja a szükséges nagyságú RAM-területet. A pufferkiutalási EXOS-hívást a 11.25. alfejezetben ismertetjük. Ezt a funkcióhívást az előtt kell meglenni, mielőtt a csatornamegnyitási vagy csatornalétrehozási rutin visszatér az EXOS-hoz. Még abban az esetben is így van, ha nulla nagyságé csatorna-RAM szükséges, mivel a hívás egy csatornaleírót is létrehoz.
Amikor a pufferkijelölés hívást végrehajtjuk az visszaadja a csatorna-RAM címét az IX-regiszterben. Ez a Z-80-as 1. lapján található és emiatt a megfelelő szegmenst be kell lapozni az 1. lapra. Valahányszor ezután a perifériakezelőt csatornahívással hívjuk ehhez a csatornához, az 1. lap és az IX-regiszter tartalmai helyesen beállnak. Ha n byte nagyságú csatorna-RAM kerül kijelölésre, akkor azokat a következő címeken lehel elérni:

IX-1, IX-2, ... , IX-n.

A közvetlenül a csatorna-RAM fölött lévő 16 byte (IX+0, ... IX+15) tartalmazza a csatornaleírót. Ez utóbbi pedig a csatornára vonatkozó rendszerinformációkat , amit a perifériának nem szabad módosítania.
Nem video jellegű perifériák esetén az összes csatorna-RAM terület egy szegmensben lesz. Videoperifériák esetén azonban csak egy bizonyos, a szóban forgó periféria által meghatározott nagyságú, és az IX-1-nél induló RAM-mennyiség lesz határozottan egy szegmensen belül, a fennmaradó rész pedig továbbnyúlhat lefelé más szegmensekbe. Ha ilyen esetről van szó, akkor minden egyes új szegmensnek eggyel kisebb lesz a száma, mint az előző szegmensé és minden ilyen szegmens videoszegmensnek fog számítani (0FCh-tól 0FFh-ig). Ez lehetővé teszi, hogy egy videoegység megfelelő mennyiségű RAM-ot kaphasson egy nagynak minősülő videolaphoz. Normál körülmények között csak a beépitett videokezelő lesz videoperiféria, noha bármelyik egység videoperifériát csinálhat magából, egyszerűen úgy, hogy beállit egy bitet a periférialeíróba (l. 6.2.).
Az EXOS-nak módja van arra, hogy a már kijelöl csatorna-RAM-ot áthelyezze. Ez persze csak olyankor fordulhat elő, amikor egy másik csatornát megnyitunk vagy lezárunk, vagy amikor a rendszerhez egy felhasználói perifériát csatolunk.
Mivel a perifériák nem adhatnak ki egyetlen ilyen EXOS-hívást sem, ezért lehetetlen a csatorna-RAM mozgatása ilyenkor. Valahányszor a csatorna-RAM-ot mozgatjuk, a rendszer behívja a perifériakezelő ún. puffermozgatás rutinját. Ezt a hívási pontot a következő fejezetben ismertetjük.

7.4. A puffermozgató alprogram

A puffermozgatás rutint az EXOS hívja be közvetlenül az után, hogy a kérdéses periféria csatornapufferét mozgatta. Ez az alprogram nem küld vissza eredményeket, viszont megkapja az alábbi paramétereket:

B' : IY = Periférialeíró szegmense és címe (szokásosan)
  IX = A csatornaleíró új címe, belapozódik a Z-80-as 1. lapjára
  A = A mozgatott csatorna száma.
  BC = A csatornapuffer által végzett elmozdulás nagysága.

A csatornapuffer a mozgatás során esetleg átkerülhet egy másik szegmensbe. Ha a perifériának erről tudomással kell bírnia, akkor módjában áll az új szegmensszámot kiolvasni az 1. lap regiszteréből. A BC-regiszterben lévő elmozdulás-paraméter szigorúan véve egy 17 bites előjeles szám, amiből hiányzik az előjelbit. Így például ha az 1 értéket adjuk át a BC-regiszterben, akkor ez jelentheti azt is, hogy a puffer 1 byte-tal mozdult felfelé, vagy azt is, hogy 65535 byte-tal lefelé. A gyakorlatban ennek az eltérésnek nincs különösebb jelentősége, mivel csak az új szegmensszámra van hatással, azt pedig külön is meg lehet határozni.
Valahányszor a puffermozgatás rutint hívjuk, a megszakítások letiltódnak és azokat a perifériakezelőnek nem is szabad újraengedélyezni. Ennek az a célja, hogy a periféria megszakítási alprogramját ne lehessen hívni addig, amíg az közbülső állapotban van.

7.5. Periféria-megszakítási alprogramok

Az EXOS tudja kezelni az Enterprise számítógépen lehetséges négy forrás bármelyikéből származó megszakításokat (video-, hang-, 1 Hz-es és külső megszakítások). Egy megszakítás létrejöttekor az EXOS megvizsgálja a DAVE chip-et, hogy meghatározhassa a megszakítás forrását. Ezután végigfut a periférialáncon és behívja minden egység megszakítási rutinját, amelyik a keresett típusú megszakítás kiszolgálását kérte (periférialeírója DD_IRQFLAG nevű mezőjében egy bit bebillentésével). Amikor már az összes perifériakezelő hívása megtörtént, akkor a megszakítás törlődik a DAVE chipen, az összes regiszter tartalma és a lapkiosztás visszaállításra kerül, az EXOS pedig visszatér a félbeszakított programhoz.
Megszakítások bármikor előfordulhatnak, beleértve azt az időt is, amikor perifériakezelő program végrehajtása folyamatban van, kivéve azt az esetet, amikor bizonyos rendszerváltozók aktualizálása folyik, vagy amikor csatornapuffer mozgatásokat végez a rendszer. Ezen kívül a megszakítások letiltódnak arra az időre is, ameddig egy korábbi megszakítás kiszolgálása folyik azaz a megszakítások egymásba ágyazására nincs lehetőség. Ha olyankor lép fel egy másik forrásból származó megszakítás, amikor egy megszakítás kezelése már folyamatban van, akkor az újabb megszakítást mindaddig várakoztatja a rendszer, amíg az előző megszakítás kiszolgálása be nem fejeződött. Így megszakítások ugyan nem vesznek el, de megtörténhet, hogy csak késve kerülnek sorra.
Egy perifériakezelő megszakítás rutinja választható; csak akkor kerül sorra, ha a perifériakezelő DD_IRQFLAG mezőjének értéke nullától eltérő. Amikor egy perifériát a rendszerhez kapcsolunk, az EXOS gondoskodik róla, hogy minden olyan megszakításforrás, amit az egység ki akar szolgálni, engedélyezve legyen a DAVE chipen.
A periféria megszakítási rutinjának meghívása pontosan úgy történik, mint bármely más esetben, tehát a B'- és IY-regiszterekkel, amelyekbe a megszokott módon a periféria-leíró szegmense és címe be van írva. A megszakítási rutin. nem ad vissza semmilyen eredményt, viszont az összes regiszter (AF, BC, DE, HL, IX, IY, AF', BC', DE', HL') tartalma megváltozhat. A rutin hívása letiltott megszakítások mellett történik és azokat nem is szabad újraengedélyezni. Továbbá a perifériának tilos kísérletet tennie a DAVE chipben lévő megszakításjelző visszabillentésére - ezt az EXOS végzi el.

Paraméterek:

B' : IY = Periférialeíró szegmense és címe (szokásosan).
A:   megszakítás kódja:
b1 - beállítva jelzi a hang IRQ-t (megszakításkérést).
b3 - beállítva jelzi az 1 Hz-es IRQ-t.
b5 - beállítva jelzi a video IRQ-t.
b7 - beállítva jelzi a külso IRQ-t.

A rendszerben lévő IRQ_ENABLE:STATE EXOS-változó (l. 8. fejezet) meghatározza, hogy a négy megszakítási forrás közül éppen melyik az engedélyezett. Bármelyikük engedélyezhető vagy tiltható a fenti EXOS-változó megváltoztatásával és értékének a DAVE chipben lévő megszakítás engedélyezési regiszterbe írásával. Ezt azonban óvatosan kell végrehajtani, mivel a billentyűzet lekérdezése szünetel, ha videomegszakításokat tiltunk le, és nehézségeket okozhat az ebből való kikerülés.

7.6. Perifériacsatorna hívások

A perifériacsatorna hívások azok a periféria belépési pontok, amelyek megfelelnek az 1-től 11-ig terjedő EXOS funkciókódoknak. Az ezekre az EXOS-hívásokra vonatkozó részletes információk a 11. fejezetben találhatók. Ez a fejezet az említett hívásokat, ill. rutinokat csak a periféria szempontjából ismerteti.
Az itt tárgyalt összes rutinnak bizonyos közös paraméterei és eredményei vannak. Ezek a következők:

Paraméterek:

B' : IY = Periférialeíró szegmense és címe (szokásosan).
  IX = Mutató a csatorna-RAM-hoz a Z-80-as 1. lapján.
  A = Csatornaszám + 1 (l. a következő bekezdésben).
BC és DE = Általános paraméterek rutin részére.

Eredmények:
A = Állapotkód, visszaküldve a felhasználónak.
BC és DE = Az alprogramból származó általános eredmények.

A periféria alprogramnak átadott csatornaszám paraméterértéke eggyel nagyobb, mint a felhasználó által előírt csatornaszám. Ez az EXOS csatornaszám belső kezelési módszerének következménye és azt jelenti, hogy egy perifériának soha nem lehet nulla értékű csatornaszámot átadni.
A perifériakezelő nem igényel olyan visszatérést, hogy az állapotregiszter az A-ban visszaküldött értékektől függően legyen beállítva. A feltétel biteket az EXOS állítja be, mielőtt visszatérne a felhasználóhoz.

7.6.1. A csatorna-megnyitási és csatorna-létrehozási alprogramok

A perifériák többségénél a csatorna-megnyitási és csatorna-létrehozási alprogramok egyezőek lehetnek. A különbség csak a file-kezelő perifériáknál jelentős, ahol a megnyitás feladata egy már ténylegesen létező file megnyitása, a létrehozás funkciója pedig egy új file megteremtése.
A rutin számára a DE regiszterben át kell adni a file-név kezdetének tárolási címét. A rutin a nevet átmásolja egy rendszerszegmensbeli átmeneti tárolóba, közben "nagybetűsíti" (átírja csak nagybetűkből álló alakba), valamint ellenőrzi szintaktikai megfelelőségét és a hosszát (maximum 28 karakterből állhat). Ha a felhasználó nem adott meg semmilyen file-nevet, akkor a file-név egy nullfüzér lesz.
A felhasználó által meghatározott (vagy az alapértelmezés szerinti) egységszámot a C-regiszterben adjuk át. Az egységszámokra vonatkozó tudnivalókat a csatornamegnyitás EXOS-funkciót tárgyaló fejezetben magyarázzuk meg (11.1.).
Feltételezve, hogy a periféria úgy dönt, hogy elfogadja a csatorna-megnyitási hívást, végre KELL hajtania egy puffer-kijelölése hívást, hogy létrejöjjön a csatornaleíró és hogy hozzájuthasson bizonyos nagyságú csatorna-RAM területhez, amire ennek a csatornának szüksége lehet. A szóban forgó hívásra vonatkozó részletes információkat a 11.25. alfejezetben találhatjuk meg. Ez a funkcióhívás egy a RAM-ra mutató címet ad vissza az IX-regiszterben és be is lapozza az 1. lapra. Az EXOS-hívásoknak ez az egyetlen olyan esete, amikor a regiszterek vagy a lapkiosztás megváltozik.

7.6.2. Blokk olvasási és írási alprogramok

Minden perifériának biztosítani kell egy olyan blokk, olvasási és írási alprogramot, ami 65535 byte-ig tud olvasást vagy írást végezni. Bizonyos egységek (például a lemez) ezeket a műveleteket intelligens módon hajtják végre, vagyis az adatátvitelt közvetlenül a felhasználói pufferrel bonyolítják le. A legtöbb egység azonban egyszerűen csak újra meg újra hívja saját karakterolvasó vagy karakteríró rutinját és az egyes byte-okat bemásolja a pufferbe vagy kimásolja a pufferből.
Különös gondot kell fordítani a felhasználói pufferterülethez való hozzáférésre. A puffermutató közvetlenül a felhasználói hívásból kerül átadásra a DE-regiszterben. Ez a mutató a négy Z-80-as lap bármelyik címére mutathat és arra a szegmensre hivatkozik, amelyik a szóban forgó lapon akkor volt megtalálható, amikor a felhasználó az EXOS-t hívta, és nem akkor, amikor az EXOS hívta a perifériakezelő - alprogramját. A perifériakezelőnek ezért ezt a címet egy Z-80-as 1. lap címre kell letennie és be kell lapoznia a megfelelő szegmenst azért, hogy a pufferhez tudjon férni. Közben nem szabad megfeledkezni arról a szegmensről sem, amelyik az ő csatorna-RAM-ját tartalmazza. A szegmensszám meghatározása érdekében a rendszerszegmensben négy olyan változó áll rendelkezésünkre, amelyek megadják azt a négy szegmenst, amelyek az EXOS-hívás időpontjában a lapokon voltak. A négy változó neve rendre USR_P0, USR_P1, USR_P2 és USR_P3, címeiket pedig korábban már megadtuk. Ezeket a változókat újrahívási jelleggel kezeljük, így a változók az egymásba ágyazott EXOS-hívásokat képesek sértetlenül túlélni.
Jegyezzük meg azt is, hogy a felhasználói puffer keresztezheti egy szegmens határát és emiatt a szegmenst esetleg meg kell változtatni, a címet pedig esetleg többször is be kell álltani. Az elmondottakon túlmenően a perifériának egy nulla byte nagyságú blokk problémáját is helyesen kell kezelnie, egyszerűen úgy, hogy visszaküld egy nulla állapotkódot anélkül, hogy bármi továbbit tenne.
Ha egy blokkolvasási vagy blokkírási művelet közben hiba keletkezik, akkor a DE- és BC-regiszterekben lévő értékeket úgy kell visszaadni, hogy azok helyesen jelezzék azt, hogy mennyi olvasás vagy írás történt meg.

8. Az EXOS-változók

Az EXOS-változó olvasás / írás / átbillentés EXOS-hívás - amit a 11.14. alfejezetben ismertetünk - módot ad a felhasználónak, perifériakezelőnek vagy rendszerbővítőnek arra, hogy hozzáférjen a rendszerváltozókhoz anélkül, hogy a tényleges címeiket ismerné. Ezek a változók a rendszer sokféle funkcióját irányítják, de különösen a periféria opciók létrehozatalát segítik, mielőtt csatornákat nyitnánk meg részükre. Ezek közül azokat, amelyek különösen a beépített perifériakezelők szempontjából lényegesek, a megfelelő perifériakezelő leírások keretein belül ismertetjük. Itt azonban megadjuk teljes jegyzéküket.
Mindegyik változónak van egy 8 bites értéke és minden változót egy-egy ugyancsak 8 bites EXOS-változószám azonosít. A közölt lista felsorolja az EXOS-kernel által használt összes változót, de a rendszerbővítő továbbiakat is létrehozhat 127 fölötti azonosítószámokkal (l. 9.2.4. pontban).
Bármelyik változót beállíthatjuk tetszés szerinti értékre nulla és 255 között. A változók közül azonban jónéhány kapcsolóként működik, be- illetve kikapcsol valamit. Ezekben az esetekben a nulla a be- állapotnak, a 255 pedig a ki- állapotnak felel meg. Manipulálásukra egy EXOS-hívás, az ún. átbillentési használható, ami a kérdéses érték egyes komplemensét képezi és így nulláról 255-re kapcsol át és fordítva.

0 - 0 - IRQ_ENABLE_STATE
megszakításkérés engedélyezettségi állapota

b0 - beállítva engedélyezi a hang IRQ-t (megszakításkérést).
b2 - beállítva engedélyezi az 1 Hz-es IRQ-t.
b4 - beállítva engedélyezi a video IRQ-t.
b6 - beállítva engedélyezi a külső IRQ-t.
b1,3,5,7 - ezeknek nullának kell lenniük.

1 -
FLAG_SOFT_IRQ
szoftvermegszakítás-beállítás jelzője. Szoftvermegszakítás előidézésére a periféria ezt a byte-ot állítsa nullától különböző értékre, A felhasználó is beállíthatja közvetlen szoftvermegszakítás érdekében. Ez a változó egy korábbi fejezetben megadott rögzített címen szintén rendelkezésre áll.
2 -
CODE_SOFT_IRQ
szoftvermegszakítási kód. Ez a byte a periféria által beállított jelző másolata. A szoftvermegszakítást kiszolgáló alprogramnak meg kell vizsgálni a megszakítás okának kiderítésére.
3 - DEF_TYPE
Az alapértelmezés szerinti periféria típusa.
0 esetén : nem file-kezelő periféria, például magnó.
1 esetén : file-kezelő periféria, például mágneslemez.
4 - DEF_CHAN
Az alapértelmezés szerinti csatornaszám. Ez kerül felhasználásra, amikor 255-ös csatornaszámmal történik a csatornahívás.
5 - TIMER
1 Hz-es időzítő. Amikor a visszaszámlálás nulla értékhez ér, szoftvermegszakítás történik és a számláló leáll.
6 - LOCK_KEY
A Lock billentyű aktuális állapota (reteszeletlen, CAPS, SHIFT, ALT)
7 - CLICK_KEY
0 esetén a billentyűzet hangadása engedélyezve.
8 - STOP_IRQ
0 esetén a STOP billentyű szoftver IRQ-t (megszakításkérést) okoz.
Nem-nulla esetén STOP billentyű kódot küld vissza.
9 - KEY_IRQ
0 esetén bármelyik billentyű leütése IRQ-t okoz, valamint visszaküld egy kódot.
10 - RATE_KEY
A billentyűzet automatikus ismétlés funkciójának ismétlési sebessége 1/50 másodpercben.
11 - DELAY KEY
Késleltetés, amíg az automatikus ismétlés elkezdődik. 0 esetén nincs automatikus ismétlés.
12 - TAPE_SND
0 esetén magnóhang engedélyezve.
13 - WAIT_SND
0 esetén a hangkezelt vár, ha a sor megtelt.
Nem-nulla esetén visszaküldi a .SQFUL hibajelzést.
14 - MUTE_SND
0 esetén a belső hangszóró aktív állapotú.
Nem-nulla esetén a belső hangszóró le van tiltva.
15 - BUF_SND
hangburkoló tárolóméret fázisokban.
16 - BAUD_SER
a soros átviteli sebességet (baud rate) adja meg.
17 - FORM_SER
a soros szóformátumot határozza meg.
18 - ADDR_NET
a gép hálózati címe.
19 - NET_IRQ
0 esetén a hálózatról vett adat szoftvermegszakítást okoz.
20 - CHAN_NET
a vett hálózati blokk csatornaszáma.
21 - MATCH_NET
a hálózati blokk forrásgépének száma.
22 - MODE_VID
video üzemmód.
23 - COLR_VID
színes üzemmód.
24 - X_SIZ_VID
X oldal mérete
25 - Y_SIZ_VID
Y oldal mérete. (Ez utóbbi négy változó határozza meg a megnyitott video lap jellemzőit.)
26 - ST_FLAG
0 esetén az állapotsor kijelezve a képernyőn.
27 - BORD_VID
a képernyő keretszíne.
28 - BIAS_VID
szín eltérés a 8...16 palettaszínekhez
29 - VID_ EDIT
a szerkesztő (editor) videolap csatornaszáma
30 - KEY_EDIT
a szerkesztő billentyűzet csatornaszáma
31 - BUF_EDIT
a szerkesztő puffermérete (256 byte-os lapokban)
32 - FLG_EDIT
jelzők a szerkesztőből történő olvasás vezérléséhez
33 - SP_TAPE
nem-nulla lassú szalagmentéshez (SAVE)
34 - PROTECT
nem-nulla védett file magnóra írásához
35 - LV_TAPE
a magnó kimeneti szintjét vezérli
36 - REM1
a magnó távvezérlés állapota (0 esetén BE, nem-nulla esetén KI).
37 - REM2
a magnó távvezérlés állapota (0 esetén BE, nem-nulla esetén KI).
38 - SPRITE
külső sprite szín prioritás vezérlése
39 - RANDOM_IRQ
Minden megszakításnál inkrementálódik. Nem túl gyakori felhasználásnál véletlenszám-generátorként működhet.

9. Rendszerbővítő interface

Az EXOS hidegindításkor listát készít a rendszerhez csatlakoztatott összes ROM-bővítőről. Mindegyik ilyen ROM-nek van belépési pontja, amit bizonyos körülmények fennállásakor egy akciókóddal hívunk. Ez az akciókód határozza meg, hogy a ROM-nak milyen funkciót kell teljesítenie. Jelen fejezet az akciókódokat és a rájuk adandó válaszokat ismerteti.
Egy rendszerbővítő ROM első 8 karaktere az "EXOS_ROM" ASCII kódja kell hogy legyen. Ezt használja a Kernel hidegindításkor az érvényes ROM-ok felismerésére. Az ezt követő két byte egy eszköz álleíró első elemére mutat (l. 6.3.). A következő byte a fent említett ROM belépési pont. Disassemblált formában így néz ki:

0c000h:
0c008h:
0c00Ah:
defm "EXOS ROM"
defw DEVICE_CHAIN

; 0, ha nincs eszköz
; ROM belépési pont

Lehetőség van arra, hogy betöltsünk egy programot a RAM-ba és rendszerbővítésként láncoljuk be. Az egyszer betöltött RAM rendszerbővítőt az EXOS pontosan úgy kezeli, mintha ROM bővítő lenne, és csak akkor kapcsolja ki, amikor hidegindítást hajtunk végre..
Egy speciális EXOS hívás adott fűzért küld körbe az összes rendszerbővítőnek, lehetőséget adva nekik néhány feladat végrehajtására. Ennek során a bővítők 2 (parancs fezér vagy 3 (segítség fűzér) akciókóddal kerülnek hívásra. Ezek jelentését ebben a fejezetben adjuk meg. Magának a "bővítők letapogatása" funkciónak a leírását a 11.24 alfejezetben találjuk meg.

9.1. A rendszerbővítők hívása - Általános információk

A rendszerbővítőket az EXOS-kernel egyetlen belépési pontjuknál hívja és azok mindig a Z-80-as 3. lapjára kerülnek. A 2. lapon lesz a rendszerszegmens (azaz a 0FFh szegmens), ami tartalmazza a veremtárat, a nullás lapon pedig természetesen a nullás lap szegmens lesz. A ROM-bővítőkhöz a hidegindítás idején lehet RAM-területeket kijelölni (l. 9.2.7.). A RAM-ot tartalmazó szegmens az 1. lapon helyezkedik el, és az IY-regiszter mutat rá. RAM-rezidens (azaz állandóan a RAM-ban tartózkodó) bővítők esetén az 1. lap, valamint az IY-regiszter határozatlanok lesznek.
Jegyezzük meg, hogy a ROM-bővítők kiadhatnak bővítő-letapogatás EXOS-hívásokat, miközben a RAM-kijelölés alprogramjuk fut. Ez olyan ROM-ban léphet fel, amit 2-es vagy 3-as akciókóddal léptetünk be, még azelőtt, mielőtt bármilyen RAM kiutalásra került volna. Azt, hogy ilyen helyzet áll-e fenn, úgy deríthetjük ki, hogy a Z-80-as 1. lapján teszteljük a nulla szegmensszámot, ami csak a RAM kijelölést megelőzően, vagy olyankor fordulhat elő, ha nem volt RAM-kérés.
Akciókód mindig a C-regiszterben található, a B- és, DE-regisztereket pedig arra használjuk, hogy különböző paramétereket adjunk át a rendszerbővítőnek, ill. hogy ezekben kapjunk vissza eredményeket. Az összes többi regiszter (AF, HL, IX, AF', BC', DE') HL') tartalmát elronthatjuk, ha szükséges.
A rendszerbővítőket rendszerint egy bővítő-letapogatás végrehajtásával hívjuk be, ami egy felhasználói EXOS-hívásból származhat, vagy a kernel generálja. A művelet abból áll, hogy sorban mindegyik rendszerbővítőnek átadjuk ugyanazt az akciókódot és ugyanazokat a paramétereket. Ha a rendszerbővítő az akciókódot változtatás nélkül adja vissza, akkor a BC- és DE-regiszterben visszaküldött értékeket továbbadjuk a listában szereplő következő bővítőnek. Így ha egy rendszerbővítő nem igényli a megadott akciókódot vagy parancsot, akkor a BC- és DE-regisztertartalmakat változtatás nélkül kell visszaküldenie a letapogatás folytatására.
Ha egy rendszerbővítő a C-regiszter tartalmát nullára állítva adja vissza, akkor a bővítő-letapogatás leáll és a BC-, valamint DE-regiszterben kapott értékeket eredményeknek tekintjük; ez utóbbiak értelmezése az akciókódtól függ, Ilyen esetekben az A-regiszterben kapott érték állapotkód, ami a, szokásos EXOS állapotkód értékeknek megfelelten jelzi a sikerességet vagy hibát.
A bővítő-letapogatás először a RAM-rezidens bővítőket hívja, majd ezeket követi a bővítő ROM-ok hívása. A láncban a legutolsó bővítő a beépített szövegszerkesztő program.

9.2. Az akciókódok

Az alábbiakban az egyes akciókódokra vonatkozó részletes információkat ismertetjük. A felsorolásban nem szereplő értékek a később fejlesztésre kerülő bővítők számára vannak fenntartva és azokat minden rendszerbövítőnek figyelmen kívül kell hagynia, azaz változtatás nélkül kell visszaküldeni a BC és DE tartalmakat. Az akciókódokat numerikus sorrendben ismertetjük, noha az inicializálási és RAM-kiutalási kódok meglehetősen speciális esetek.
Egy rendszerbővítő a felsorolásra került akciókódok bármelyikét figyelmen kívül hagyhatja, ha úgy tetszik, ugyanis ezek a kódok mind válaszhatóak. A nem igényelt akciókódnál a rendszerbővítőnek változtatás nélkül kell visszaküldenie a BC- és DE-regisztertartalmakat. Elfogadható (bár nem szerencsés) megoldás a rendszerbővítőnél, hogy csak egy RET utasítás álljon a belépési pontjánál.
A rendelkezésre álló akciókódok a következők:

  1. Hidegindítás
  2. Parancsfűzér (command-string)
  3. Segítségfüzér (help string)
  4. EXOS-változó
  5. Hibakódok magyarázata
  6. Modul betöltése
  7. RAM kijelölés
  8. Inicializálás

9.2.1. 1-es akciókód : hidegindítás

Ez az akciókód a ROM-bővítők közt hidegindításkor, a bejelentkező program lefutása után körbe jár, hagy lehetővé tegye a ROM-bővítők egyikének saját maga kijelölését az aktuális alkalmazói program szerepére. A másik alkalom, az akciókód fogadására, ha egy új alkalmazói program betöltése nem sikerül (l. a 10.6. alfejezetet). Ezzel az akciókóddal paramétereket nem adunk át és eredményeket sem kapunk vissza.
Ha a bővítő aktuális alkalmazói program kíván lenni, akkor egyszerűen csak végrehajtja a 9.3. alfejezetben ismertetett indítási eljárást, és nem tér vissza ebből a hívásból. Ha a bővítő ezt nem akarja, akkor változatlan C-regiszterrel (akciókóddal) tér vissza ebből a hívásból.

9.2.2. 2-es akciókód : parancsfüzér

Ezt az akciókódot egy bővítő-letapogatás EXOS-hívás eredményeként kapjuk. A DE-regiszter egy jelsorozatra mutat. A jelsorozat első eleme egy hosszúság-byte. A jelsorozat a veremmemóriában lesz tárolva. Emiatt a bővítő-letapogatás újra hívható. A füzér első szavát (az első szóközjelig) nagybetűsíti a rendszer, a B-regiszter pedig azt a számot tárolja, amelyik megmondja, hogy hány byte-bál áll az első szó.
Az első szó egy parancs, egy szolgáltatás vagy egy program neve. Minden egyes bővítőhöz tartozik parancskészlet. Ha a bővítő ebben nem ismeri fel a parancsot, akkor a BC és DE tartalmának megőrzése mellett vissza kell térnie a hívásból. Ha viszont felismeri a parancsot, akkor válaszolnia kell rá. Visszatéréskor a C-regiszter tartalma nulla, az A-regiszterben pedig egy állapotkód legyen, hacsak nem azt akarja, hogy más bővítők ugyancsak erre a parancsra válaszoljanak.
A parancs végrehajtása során a rendszerbővítő bármilyen EXOS-hívást kiadhat, beleértve további bővítő-letapogatás hívásokat is. Képernyős inputok/outputok készítésénél gyakran nagyon hasznos az alapértelmezés szerinti csatorna használata, mivel nem tudhatjuk, hogy milyen más csatornák állnak még rendelkezésre.
A bővítő a parancsot indítójelként is értelmezheti, hogy aktuális alkalmazói programként működjön. így például a megfelelő nyelv modulok (cartridges) a "BASIC", "LISP" és "FORTH" jelsorozatokat ilyeténképpen fogják értelmezni. Ennek keresztülvitelére a bővítő pontosan úgy viselkedik, mintha az 1-es akciókódot (hidegindítás) kapta volna. Az indítási eljárás részleteit a következőkben ismertetjük.

9.2.3. 3-as akciókód : segítségfűzér

Ezt az akciókódot ugyancsak egy bővítő-letapogatás EXOS-hívás eredményeként kapjuk, amikor a jelsorozat első szava a HELP szó. A művelet a jelsorozatról leválasztja a HELP szót (és az azt követő szóközjelet), majd a megmaradt füzért pontosan úgy kezeli, mintha az EXOS-hívásnak átadott eredeti jelsorozat lenne. Így a tárgyalt akciókód paraméterei ugyanazok, mint az előzőleg ismertetett 2-es akciókódé (parancsfűzér).
Ha a füzér nulla (azaz a B-regiszter nulla), akkor ez egy olyan általános HELP hívás, ami az összes bővítőnek szól. Ebben az esetben a bővítőnek csak a nevét és változóját kell az alapértelmezés szerinti (255-ös) csatornába írni, majd a BC és DE tartalmakat megőrizve visszatérni.
Ha a füzér nem nulla, és az első szó valamelyik a szóban forgó bővítő által felismert 2-es akciókód-parancsok közül, akkor a kérdéses parancsra vonatkozó specifikus információkat ki kell írni az alapértelmezés szerinti csatornába, továbbá a C-regiszterben egy nulla értéket, az A-regiszterben pedig egy (általában nulla) állapotkódot kell visszaküldeni. Ha szükséges, akkor a jelsorozat fennmaradó részét szabad további olyan paramétereknek értelmezni, hogy milyen információk kerüljenek képernyőre.
Ha a jelsorozat nem nulla és az első szó a kérdéses bővítő számára nem érvényes parancs, akkor a BC- és DE-regiszterek tartalmát változtatás nélkül kell visszaküldeni.

9.2.4. 4-es akciókód : EXOS-változó

Ez az akciókód lép fel, ha olyan változószámmal hajtunk végre egy EXOS-változó olvasás / írás / átbillentés hívást, amit a belső ROM nem ismer fel (l. az előző fejezetben). Lehetővé teszi, hogy a rendszerbővítők további EXOS-változókat hozzanak létre. Különösen olyan ROM-bővítéseknél bizonyulhat hasznosnak, amelyek maguk is tartalmaznak bővítő perifériákat. Az akciókódnak átadott paraméterek a következők:

B = 0, 1 vagy 2 - az OLVASÁS-hoz, az ÍRÁS-hoz és a ÁTBILLENTÉS-hez (egyes komplemens).
E = EXOS-változó száma
D = az írandó új érték (csak ha B = 1).

Ha a változószám ismeretlen marad, akkor a bővítőnek változatlan BC és DE tartalmakkal kell visszatérnie. Ha a változószámot a bővítő felismeri, akkor végre kell hajtani a megfelelő funkciót és az alábbi paramétereket kell visszaküldeni:

A = állapotkód (általában nulla),
C = 0,
D = az EXOS-változó új értéke.

A belső EXOS-változókkal vagy bármi más olyan dologgal való konfliktus elkerülése érdekében, ami a jövőbeni verziókban vagy bővítőkben kapcsolódhat a rendszerhez, a rendszerbővítők csak a 127 feletti EXOS-változó számokat használhatják.

9.2.5. 5-ös akciókód : hibakódok magyarázata

Ezt az akciókódot egy felhasználói hibakód értelmezése funkcióhívás eredményeként kapjuk. A hibakód körbejár a rendszerbővítők között, hogy mindegyikük módot kapjon magyarázó szöveg megadására. A belső ROM maga biztosít magyarázó szöveget minden olyan hibakódra, amit az EXOS-kernel vagy bármelyik beépített periféria generál, hacsak egy rendszerbővítő előbb nem küld magyarázatot.
A hibakód a B-regiszterben kerül átadásra és ha azt a bővítő nem ismeri fel, akkor változtatás nélkül kell visszaküldenie a BC-regiszter tartalmát. A beépített hibakódokkal, valamint a jövőbeni változatokban vagy bővítőkben esetleg megjelenő új hibakódokkal való konfliktus elkerülésére a ROM-bővítők a maguk által generált hibákhoz csak a 127 alatti hibakódokat használhatják.
Ha a hibakód felismerésre került, akkor a visszaküldött DE regiszternek a magyarázó szövegláncra kell mutatnia (először egy hosszúság byte szerepel; a maximális hossz 64 karakter). Ez bármelyik szegmensben lehet és nem szükséges, hogy a Z-80-as memóriaterületre belapozzuk, amikor a bővítő visszatér. A kapott eredmények a következők lehetnek:

A = nincs rá szükség, bármilyen érték lehet,
B = az üzenetet tartalmazó szegmens száma,
C = 0,
DE = az üzenet kezdőcíme (bármelyik Z-80-as lapon).

9.2.6. 6-os akciókód : modul betöltése

Az Enterprise file-modul formátumára vonatkozó tudnivalókat a 10. fejezetben fogjuk ismertetni. Ez az akciókód körbejár a rendszerbővítők között a felhasználónak szóló hibajelzés elküldése előtt, ha az EXOS fel nem ismert típusú modulfejrészt (header) olvas be. Lehetővé teszi, hogy a rendszerbővítő saját modultípusainak betöltését minden további speciális parancs igénybevétele nélkül kezelni tudja.
A bővítő két eredményt ad vissza: egy tárcímet a 16 byte-os modulfejrészre vonatkozóan, és egy csatornaszámot, amelyen át a betöltést kell elvégezni.

B = csatornaszám, ahonnan a töltést kell végezni,
DE = mutató a 16 byte-os modul-fejrészre.

A típus byte-ot (a DE+1 címen) meg kell vizsgálni annak meghatározása érdekében, hogy a kérdéses modultípust a szóban forgó bővítés felismeri-e vagy sem. Ha nem, akkor a műveletnek változatlan BC és DE tartalmakkal kell visszatérnie. Ha a modultípust a bővítő felismeri, akkor a modul többi részét az előírt csatornából be kell olvasni, lehetőleg a fejrészből származó más paraméterek felhasználásával, ill. a modult inicializálni is kell, ha ez szükséges. A C-regiszterben ilyenkor nullát, az A-regiszterben pedig egy állapotkódot kell visszaküldeni. Ennek nullának kell lennie, ha a betöltés sikeres volt, ill. valamilyen hibakódnak, ha nem volt sikeres.

9.2.7. 7-es akciókód : RAM kijelölés

Ez az akciókód meglehetősen speciális, mivel csak hidegindítás idején kerül kiadásra és csak a ROM-bővítők kapják meg. Egyszeri hívás, és mindig az első, amit az EXOS-kernel a ROM-nak küld. Az előbbiekben leírtak szerint azonban lehetséges az, hogy a ROM 2,és vagy 3-as akciókóddal még bármilyen RAM-terület kijelölése előtt belépjen. Ezért ha a ROM RAM-kijelölést vár, akkor tesztelni kell, hogy a Z-80-as 1-es lapján a nullás szegmens van-e belapozva.
Ha a ROM-nak nincs RAM-kijelölési igénye, akkor ezt az akciókódot egyszerűen figyelmen kívül hagyja és változtatás nélkül visszaküldi a C-regiszter tartalmát. Ebben az esetben, ha a későbbiekben ebből a ROM-ból történik a .hívás, a Z-80-as 11 lapja, valamint az IY-regiszter tartalma határozatlan lesz,; mivel nincs számukra RAM-terület, ahová mutathatnának.
Ha a ROM igényel RAM-kijelölést, akkor a következő eredményeket kell visszaküldenie:

C = 0 (azt jelzendő, hogy szükség van RAM-ra),
B = RAM típus jelzők,
  b0 beállítva : RAM a 2-es lapon,
  b1 beállítva : RAM az 1-es lapon,
  b2 ... b7 nincs használva, nulla.
DE = a szükséges byte-ok száma.

A ROM-hoz a két RAM-típus valamelyike kijelölhető. A 2-es lapon lévő RAM a rendszerszegmensben van, így a bővítőt attól függetlenül címezheti meg, hogy mit tesz a Z-80-as 1-es lapjára, A 2-es lapon lévő RAM terület nagysága korlátozott, mivel teljes egészében egy szegmensen belül kell lennie és ez a szegmens ráadásul még sok más célra is szolgál. A RAM-kijelölés másik típusa az 1-es lapon lévő RAM. Ebben az esetben olyan szegmens van kijelölve, amit a rendszerperifériára kijelölt szegmensként tart számon, és így - jó közelítéssel - egészen 16k nagyságig terjedhet. Ha ilyen típusú kijelölést végzünk, akkor nagyobb RAM áll rendelkezésre, de ugyanakkor egy teljes szegmenst elveszünk a felhasználótól. Egy szegmensbe több bővítő RAM-területet is elhelyezhetünk és ugyanezt a szegmenst arra is felhasználhatjuk, hogy ide töltsük akár az áthelyezhető, akár pedig abszolút típusú rendszerbővítők programjait (l. 10.5. alfejezetben).
A szükséges RAM-kijelölés típusát egy, a B-regiszterben átadott bitpár határozza meg. Ha a 2-es lap jelzője (0-ás bit) be van állítva, akkor a RAM - ha mód van rá - a rendszerszegmensben kerül kiutalásra. Ha az 1-es lap jelzője (1-es bit) van bebillentve, akkor egy külön. perifériaszegmens felhasználására kerül sor. Ha mind a két jelző beállított, akkor elegendő memóriahely esetén a kijelölés a rendszerszegmensben, egyébként pedig egy külön perifériaszegmensben fog megtörténni.
Ha a RAM-kijelölési kísérlet sikeres, akkor a RAM-terület címét és szegmensét a rendszer tárolja a ROM-bővítők listájában a megfelelő ROM-számmal együtt. Ha ezután a jövőben a ROM-ot hívjuk, akkor a RAM-szegmens betöltődik a Z-80-as 1-es lapjára, az IY-regiszter tartalma pedig a RAM-területre fog mutatni. Ha az 1-es lap jelzője (a B-regiszter 1-es bitje) nulla volt, akkor a RAM a rendszerszegmensben került kiutalásra és következésképpen az IY-regiszter a Z-80-as 2-es lapon lévő RAM-területre mutat. Minden más esetben az IY a Z-80-as 1-es lapján elhelyezkedő RAM-területre mutat, még akkor is, ha a RAM ténylegesen a rendszerszegmensben található (mindkét jelző bebillentett állapotú). Ha n byte nagyságú RAM-ot kértünk, akkor ezekhez a következő címeken lehet hozzáférni:

IY+0, IY+1, ... IY+(n-1).

Ha a RAM-kijelölés azért nem sikerült, mert nem állt rendelkezésre elegendő RAM terület, akkor a szóban forgó ROM érvénytelen megjelöléssel kerül a ROM-listába és soha nem hívható újra.
Jegyezzük meg, hogy a hívás ezzel az akciókóddal nagyon korán, a rendszer inicializálásakor történik meg, még azelőtt, hogy sor kerülhetett volna a perifériakezelőnek rendszerhez csatlakoztatására vagy inicializálására. Ilyenkor bizonyos EXOS-hívások megengedettek, viszont a periféria vonatkozású hívások (például csatorna megnyitása, periféria -csatlakoztatása stb.) nem. Általában ügyelnünk kell a RAM-kijelölés alatti EXOS-hívásokra. Mint már korábban említettük, bővítő-letapogatás hívást szabad kiadni, és ez végig is fog vizsgálni minden ROM-bővítőt, még azokat is, amelyekhez még nincs RAM kijelölve. Ez az egyetlen eset, amikor ROM-bővítőt úgy hívhatunk meg, hogy még nincs a számára kiutalva RAM, ezért ezzel óvatosan kell bánnunk.

9.2.8. 8-as akciókód : inicializálás


A rendszerbővítők inicializálására rögtön a perifériák inicializálása után kerül sor. A művelet eredetileg a hidegindításkor zajlik le (a ROM-bővítőknél), majd mindannyiszor újra lezajlik, valahányszor a megfelelő jelzők beállítása; mellett (az ismertetést l. 11.2.) EXOS reset történik. Továbbá melegindításkor vagy olyankor fordul elő, amikor egy új alkalmazói program átveszi a vezérlést. Az állandóan a RAM-ban tartózkodó (RAM-rezidens) bővítők ugyancsak közvetlenül az után inicializálódnak, hogy betöltésre kerültek. A bővítők itt nem kapnak paramétereket és nem küldenek vissza eredményeket. A C-regiszter tartalmának (azaz az akciókódnak) meg kell maradnia, viszont az összes többi regiszter tartalmát el szabad rontani.

9.3. Új alkalmazói program indítása

Egy rendszerbővítő 1-es vagy 2-es akciókóddal végrehajtott hívás eredményeként határozhat úgy, hogy aktuális alkalmazói programmá válik. Ehhez a következő eljárást kell végrehajtani:

  1. EXOS reset hívás 2-es kód esetén 60h, 1-es kód esetén 00 kóddal. Ez biztosítja, hogy a rendszer egy jól definiált alaphelyzetbe kerüljön felhasználói eszköz vagy felhasználói RAM nélkül, valamint ne legyen csatorna nyitva. A hívás tiltott megszakítással tér vissza.
  2. Létre kell hozni egy felhasználói veremmemóriát valahol a nullás lap szegmensben, mivel más RAM nem áll rendelkezésre. Ez után pedig újra engedélyezni kell a megszakításokat.
  3. Ki kell jelölni az összes többi, szükséges RAM-szegmenst és meg kell nyitni az alapértelmezés szerinti csatornákat.
  4. Létre kell hozni egy melegindítási címet arra az esetre, ha megnyomjuk a reset gombot. Ezt még akkor is meg kell tenni, ha a program teljesen újraindul egy melegindítás hatására, mivel biztosítanunk kell azt, hogy minden RAM-rezidens rendszerbővítő tényleg rezidens is maradjon.
  5. Be kell állítani az alapértelmezés szerinti csatornaszámot a program képernyő I/O csatornájának (ez rendszerint egy (editor) szerkesztői csatorna), hogy a rendszerbővítő kiírhassák help (segítő) üzeneteiket.

Mindezek után a program, mint aktuális alkalmazói program, megkapja a teljes vezérlést és bármilyen EXOS-hívást végrehajthat.

10. ENTERPRISE file-forma és EXOS betöltési funkciók

10.1 Az Enterprise file-forma

Az EXOS-szal betöltött file-oknak követnie kell az alább ismertetett formát. A formát úgy tervezték meg, hogy egy program kezelője - például a BASIC - kiadhasson egy egyszerű parancsot, például a LOAD parancsot, anélkül, hogy tudná, mit is kell ténylegesen betöltenie. Ez lehet egy belső BASIC program, vagy egy áthelyezhető új perifériakezelő, hogy csak kettőt említsünk.
A file egy vagy több modulsorozatból áll. Mindegyik modul 16 byte hosszúságú modulfejrésszel kezdődik, ami meghatározza, hogy a modul többi részében milyen típusú adatoknak kell következniük. Egy file tartalmazhat több modult is. Például egy BASIC program egyidejűleg betölthető olyan új perifériakezelővel, amit maga a program is használ, egyszerűen úgy, hogy egyetlen file-ban fogjuk össze, mint két külön modult.
A fejrész nulla byte-tal kezdődik, ami azt jelzi, hogy Enterprise modul fejrészről és nem valami másról, például ASCII szövegfile-ról van szó. Minden olyan file, ami nem nullával kezdődik, ASCII file-ként kezelödik, annak ellenére, hogy az bármilyen másfajta adat is lehet.
A nulla után egy típus-byte következik, ami meghatározza, hogy a modul többi része milyen típusú adatot tartalmaz. Az ez után következő 13 byte jelentése típusonként eltérő és különböző paramétereket tartalmaz, mint például a méret és a belépési pontok címei. A fejrész legutolsó byte-ja egy változatszám, aminek a jelenlegi változatokban mindig nulla értékűnek kell lennie.

10.1.1. A modulfejrész típusai

A modulok definiált típusai a következők:

0 -
$$ASCII ASCII file
1 -
  Nem használt típusszám
2 -
$$REL Felhasználói áthelyezhető modul
3 -
$$XBAS Többszörös BASIC program
4 -
$$BAS Egyszeres BASIC program
5 -
$$APP Új alkalmazói program
6 -
$$XABS Abszolút rendszerbővítő
7 -
$$XREL Áthelyezhető rendszerbővítő
8 -
$$EDIT Editor dokumentum-file
9 -
$$LISP LISP memóriakép-file
10 -
$$EOF File-vége modul
12 ... 31 -
  Fenntartva az IS / Enterprise céljaira

A nulla ASCII file-ként való felismerése csökkenti annak lehetőségét, hogy egy ASCII file-t tévedésből Enterprise modulfejrésznek vegyünk. Ezt a kérdést az EXOS betöltési funkciókat tárgyaló 10.2. alfejezetben fogjuk megmagyarázni.
Amikor egy modul már be van töltve, következhet egy másik modul, ezért a rendszer kísérletet tesz egy másik fejrész betöltésére. Emiatt szükséges, hogy minden egyes file-t egy file-vége (azaz 10-es típusú end of file) modulfejrésszel zárjunk le, amivel jelezzük, hogy nincs több betöltenivaló.
A 3-as, 4-es, 8-as és 9-es fejrésztípusok specifikusak és konkrét nyelvekhez vagy perifériákhoz tartoznak. Ezeket a megfelelő programok (IS-BASIC, IS-LISP és az EXOS szerkesztőprogram) dokumentációi ismertetik. A továbbiakban itt nem teszünk több említést róluk.
A megmaradt típusok közül a 5-ös, 6-os és 7-es típust teljesen az EXOS-kernel (felügyelőprogram) kezeli, a 2-es típust pedig nagyobbrészt a kernel, de az alkalmazói programok bizonyos fokú közreműködésével. Ezeket a típusokat a következő fejezetekben fogjuk ismertetni.

10.2. Enterprise-formájú file-ok betöltése

Ha a felhasználó egy file-t akar betölteni, gondoskodnia kell, hogy a csatorna, ahonnan a betöltést el kell végezni, nyitott legyen, majd végre kell hajtania egy modul betöltése EXOS-hívást. Ez utóbbi beolvas egy byte-ot a csatornából, majd azonnal visszaküld egy ASCII hibát, ha a byte nem nulla. Mayát a byte-ot visszatéréskor a B-regiszter tartalmazza.
Ha az első byte nulla, akkor beolvas még egy byte-ot (a típusbyte-ot). Ha ez utóbbi is nulla, akkor ASCII file-ról van szó és ezért visszaküld egy ASCII hibát, a típus-byte (azaz a nulla) a B-regiszterbe küldődik vissza. Ez biztosítja azt, hogy ha egy ASCII file egy sorozat nullával kezdődik, akkor ez a file ténylegesen is ASCII file-ként legyen felismerve és csak az első nullája fog elveszni.
Ha a típus-byte nem nulla, akkor tárolódik és a rendszer a modulfejrész kiegészítéséhez még további 14 byte-ot fog beolvasni. Ha ez file-vége fejrésznek (10-es típus) bizonyul, akkor visszaküld egy .NOMOD hibajelzést. Ezt a felhasználói programból figyelmen kívül hagyja, mivel nincs igazán hibáról szó, hanem ez a normál befejezési állapot.
Ha a modul olyan típusú, amit az EXOS belsőleg kezel (5-ös, 6-os és 7-es típus), akkor a modul fennmaradt része betöltődik és inicializálódik (a részleteket a következő fejezet ismerteti). Ha nem olyan típusú, akkor a modulfejrész körbejár a rendszerbővítők között, hogy azok módot kapjanak a betöltésre, ha felismerik a típust. Ha a modul így vagy úgy betöltődik, akkor a felhasználó nulla állapotkódot kap vissza.
Ha a modult sem az EXOS, sem egy rendszerbővítő nem töltötte be, akkor a felhasználó .ITYPE hibát kap vissza. Megkapja a modulfejrészt is egy olyan pufferben,- amit a felhasználó határozott meg. Ekkor a felhasználó megvizsgálhatja a típusbyte-ot és betöltheti a modul megmaradt részét, ha a típust felismeri.
Ha a modult az EXOS, valamelyik rendszerbővítő, vagy a felhasználó betöltötte, akkor egy másik modulbetöltés hívást kell végrehajtani a file következő moduljának betöltésére. Ez addig folytatódik, ameddig NOMOD hibajelzést nem kapunk az EXOS-tól, ami a normál befejeződés, vagy pedig végzetes hiba lép fel. Ez utóbbi vagy a betöltő csatornában, vagy valamelyik modulban történhet, ami persze egy hibaüzenetet eredményez.

10.3. Az áthelyezhető adatforma

Az EXOS egy egyszerű bitmintára épült áthelyezhető adatformátummal támogatja az áthelyezhető modulok betöltését. Az áthelyezhető modulok két típusa létezik. Az egyik a felhasználó által áthelyezhető modulok, a másik az áthelyezhető rendszerbővítők. Ezeket a modultípusokat és betöltésük módjait későbbiekben ismertetjük. Ez a fejezet csak magát az áthelyezhető bitformát ismerteti.
Egy áthelyezhető modul adata egy bitminta abban az értelemben, hogy az egyedi adatmezőket bitek változószáma jelenti, és nem igazodnak a byte-határokhoz. Az adat byte-jainak értelmezése a legnagyobb helyi értékű bittel kezdődik és így a bitminta első bitje lesz az első byte 7. bitje.
Egy teljes áthelyezhető modul olyan tételek sorozatából áll, amelyeket bitmintabeli bitsorozatok határoznak meg. Az alábbi ábra azt mutatja, hogy miként lehet a bitmintát különböző egységekké dekódolni. Magukat az egységeket csak ezek után fogjuk megmagyarázni.

0
=
8 bit :
abszolút byte betöltése
1 00
=
16 bit :
áthelyezhető szó betöltése
. 01 0 0
=
2 bit :
a futási lap beállítása
. .. . 1
=
:
a futási lap visszaállítása
. .. 1
=
16 bit :
új címszámláló beállítása
. 10
=
  modul vége
. 11
=
  illegális bővítők számára fenntartva.

10.3.1. A címszámláló és a futási lap

Amikor az áthelyezhető betöltőprogramot hívjuk, akkor az egy olyan indulási címet kap, ami bármelyik Z-80-as lapon lehet. Ez a program a szóban forgó lapon éppen fellelhető szegmensbe betölti az adatokat, de nem léphet át szegmenshatárt. Egy ún. címszámlálót használ, ami az aktuális címet tartalmazza a byte-ek tárolásához, továbbá amit áthelyezhető szavak betöltésére is használ. A címszámlálóba eredetileg a töltőprogramnak átadott indulási címet írjuk be.
Ha a rendszer egy új címszámláló beállítása tételt talál, akkor a soron következő 16 bit egy olyan eltolást képez, amit hozzá kell adni a címszámláló aktuális tartalmához. Ez az eltolás-hozzáadási művelet a címszámlálót nem viheti át új lapra.
Gyakran hasznos, ha programrészek egy olyan szegmensbe vannak töltve, amihez különböző Z-80-as lapokon fogunk hozzáférni, mivel az ilyen szegmenst különböző lapokra lehet belapozni. Ez különösen akkor igaz, amikor olyan felhasználói perifériakezelőket hozunk létre, amelyeket szabad a nullás lapra betölteni, de amikor végrehajtásra kerülnek, akkor a 3-as lapon fognak futni. Ez a lehetőség igényli, hogy biztosítani lehessen a futási lap beállítása (a futás idején érvényes lap beállítása) és a futási lap visszaállítsa tételeket.
Ha a rendszer egy futási lap beállítása tételt talál, akkor a soron következő két bit egy új lapot határoz meg. Ilyenkor a címszámláló két felső bitjébe ez az új lapbeállítás íródik. Ez nem lesz hatással arra, hogy a byte-ok ténylegesen hová vannak töltve, mivel a lap - tekintettel arra, hogy mindig egyetlen szegmensbe történik a betöltés -, nem játszik szerepet. Hatással lesz viszont az áthelyezhető szavakhoz előállított értékekre, amelyeket betöltünk. Ez azt jelenti, hogy betölthetünk programot egy lapra úgy, hogy az egy másikon fusson.
A futási lap visszaállítása tétel a címszámláló lapszámát visszaállítja arra az értékre, amely a töltőprogram behívásakor volt érvényes, függetlenül attól, hogy azóta esetleg hány új lapot állítottunk be.

10.3.2. Az áthelyezhető szavak és az abszolút byte-ok

Amikor a rendszer egy abszolút byte betöltése tételt talál, akkor a soron következő 8 bitet tárolja a címszámláló aktuális címére, és e számláló tartalmát megnöveli eggyel. Amikor egy áthelyezhető szó betöltése tételt talál, akkor beolvassa a soron következő 16 bitet és az aktuális címszámláló tartalmát ezekhez hozzáadja. Az eredményül kapott szót - először az alsó byte-ot beírva - tárolja a címszámláló címére, majd a címszámláló tartalmát megnöveli kettővel.

10.3.3. A modul vége tétel

Amikor a rendszer egy modul vége tételt talál, befejezi az áthelyezhető programtöltő működését. Az utolsó byte összes megmaradt bitjét nullával tölti fel, a következő byte pedig a következő modulfejrész kezdete lesz.

10.4. A felhasználói áthelyezhető modulok

A felhasználói áthelyezhető modulokat a felhasználói RAM-ba töltjük és a betöltés után az aktuális alkalmazói program részének tekintjük ezeket. A felhasználó feladata megszervezni azon RAM-területek kijelölését, amelyekbe az ilyen modulok betöltődnek. Igen hasznosak felhasználói perifériakezelő funkciók biztosítására.
A felhasználói áthelyezhető modul fejrésze a következő felépítésű:

0 =
1 =
2 ... 3 =
4 ... 5 =
6...16 =
nulla
a modul típusa (2)
a betöltött progam mérete
inicializálási eltolás (0FFFFh ha nincs)
nulla

Ha az EXOS modul betöltés funkcióhívása ilyen típusú fejrészt talál, akkor azt nem ismeri fel, viszont elküld a felhasználónak egy .ITYPE hibaüzenetet. A felhasználó ezután megnézi a típust és látja, hogy az egy felhasználói áthelyezhető modul. A fejrészben található méretmező a betöltött modul teljes helyfoglalási igényét határozza meg. A felhasználónak egy olyan szegmensben kell ekkora nagyságú RAM-területet találnia, amit állandó jelleggel jelölhet ki és ezt a címet át kell adnia az áthelyezhető modul betöltése EXOS-hívásnak a csatornaszámmal együtt.
Az EXOS a modult betölti a RAM-ba, majd egy nulla állapotkóddal visszatér a felhasználóhoz, ha nem volt hiba. Ha az inicializálási eltolás távolsága nem 0FFFFh értékű, akkor a felhasználónak ezt a címet kell hívnia. (Az eltolás a kezdeti betöltési címtől számítandó.) Ez az alprogram a modul számára szükséges összes inicializálást elvégzi.

10.5. Az áthelyezhető és az abszolút rendszerbővítők

Az áthelyezhető és az abszolút rendszerbővítőket automatikusan tölti be az EXOS, amikor a megfelelő modulfejrészt megtalálja. Ezek a rendszerbővítők az EXOS által a perifériákhoz kiutalt szegmensekbe töltődnek, és soha nem is válnak szabaddá. Ha már egyszer be vannak töltve, pontosan úgy viselkednek, mint a ROM rendszerbővítők és egyetlen hívási pontjuk van, ahol átveszik az akciókódokat. A már betöltött bővítők működését az előző fejezetben ismertettük. Ez a fejezet csak a tényleges betöltést és a fejrészformát tárgyalja.
Az EXOS az így kijelölt szegmensekről listát vezet. Ezek a szegmensek áthelyezhető és abszolút típusú bővítők betöltésére, valamint RAM területek ROM-bővítőkhöz való kijelölésére használhatók hidegindításkor. Az abszolút jellegű bővítők mindig egy szegmens aljára kerülnek és így szegmensenként csak egy lehet belőlük. Az áthelyezhető bővítőket és a ROM-bővítések RAM-területeit viszont a szegmens tetejétől kezdve lefelé helyezzük el és annyi lehet belőlük egy szegmensen belül, amennyi csak belefér a szegmensbe.
A két típus modulfejrészének formája a típusbyte-tól eltekintve azonos:

0 =
1 =
2 ... 3 =
4...15 =
nulla
a modul típusa (6 az abszolút, 7 az áthelyezhető moduloknál)
a betöltött program mérete (<16k)
nulla

Az EXOS először megfelelő nagyságú RAM-ot utal ki, amibe a bővítőt betöltheti. Ennél esetleg szükség lehet új szegmens kijelölésére, ha nincs hely egy már korábban kijelölt szegmensben. Ezt követően az adatok betöltődnek a szegmensbe. Abszolút típusú bővítő esetén az adatok úgy töltődnek be, hogy az első byte a OCOOAh címre kerül, ami a bővítő hívási pontja lesz. Áthelyezhető bővítőknél a kód (a Z-80-as 3-as lapján megcímzett) szegmensbe valahová betöltődik, a hívási pont pedig a legelső betöltött byte helye lesz.
Ha töltés közben hiba lép fel, akkor a bővítő elveszik, a számára kiutalt RAM foglaltsága pedig megszűnik. Ez maga után vonhatja egy szegmens szabaddá válását, ha az egy újonnan kiutalt szegmens volt. Ha hiba nem lép fel, akkor az új bővítő hozzákapcsolódik a rendszerbővítők listájának elejéhez, majd inicializálódik a rendszerbővítőkkel foglalkozó fejezetben leírtak szerint. Ezt követően a vezérlés a szokásos módon visszatér a felhasználóhoz.

10.6. Új alkalmazói programok

Az új alkalmazói programmodul-típust automatikusan tölti be az EXOS, amikor a fejrészt megtalálja. Programok betöltésére használható 47,75k nagyságrendig. A program, amit betölt, automatikusan új alkalmazói programként indul el és az előző program elvesztését okozza. Olyan feladatok elvégzésére szánták, mint például a gépi kódú játékprogramok betöltése magnóról, de más célokra is alkalmas.
A modulfejrész formája a következő:

0 =
1 =
2 ... 3 =
4...15 =
nulla
a modul típusa (5)
a program mérete byte-okban kifejezve (elől áll az alsó byte)
nulla

Az EXOS megnézi a program méretét és kideríti, hogy kiutalható-e megfelelő nagyságú felhasználói RAM-terület, ahová a program betölthető. Megosztott szegmenshasználat is lehetséges, hogy egyetlen csatorna se kerüljön lezárásra. Ha nincs elég RAM, akkor visszaküld egy .NORAM hibajelzést, egyébként pedig az EXOS a file betöltésére kötelezi el magát.
Eddig eljutva az EXOS kijelöli a program számára a szükséges felhasználói RAM-szegmenseket és ettől a ponttól kezdve nem tud visszatérni az aktuális alkalmazói programhoz, mivel elrontotta azt a RAM-ot, amit használt. Ha innentől kezdve hiba lép fel, akkor az alapértelmezés szerinti csatornán egy hibaüzenetet küld, majd az összes bővítőt lekérdezi a hidegindítás akciókódjával. Az eredeti hidegindítás esetétől eltekintve ez az egyetlen eset, amikor a bővítők hidegindítási akciókódot kaphatnak.
Ha a szükséges szegmensek már kijelölésre kerültek, akkor a rendszer a csatornából beolvassa az új programot és mint abszolút jellegű byte-okat tárolja a 100h címtől kezdve. Amikor már a teljes program be van töltve, akkor az EXOS a 100h címen található program kezdetére egy melegindítást szimulál. Ezt a melegindítást 20h értékre beállított indításjelzőkkel hajtja végre (l. 11.2.), ami úgy állítja alaphelyzetbe a teljes I/O rendszert, hogy közben nem bolygatja meg a felhasználói RAM-ot. Az új alkalmazói programnak át kell esnie a szokásos indítási eljáráson (amit a 9.3.-ban már ismertettünk). Ebben az esetben nem kell EXOS reset hívást is végrehajtani.
Tekintettel arra, hogy esetleg felhasználói szegmenseket kellett kijelölni, amibe a program betöltődhet, megtörténhet, hogy a program egy megosztott szegmenst foglal le. Ha ilyen esetről van szó, akkor a felhasználói határt közvetlenül a program vége fölé kell beállítani, hogy a csatornák megnyitásához stb. a lehető legtöbb RAM állhasson rendelkezésre.

11. Az EXOS funkcióhívások részletes ismertetése

Ez a fejezet az EXOS funkcióhívások részletes ismertetését tartalmazza. Közülük többet nagyvonalakban már korábban ismertettünk. Most olyan részletekre összpontosítunk, mint a regiszterhasználat és a hibakódok, a funkcióhívásokat pedig a hívást kibocsátó program szempontjából tárgyaljuk.
Az EXOS-hívások a paramétereket az A-, BC- és DE-regiszterekben veszik át, és az eredményeket ugyanezekben a regiszterekben adják vissza. Az A-regiszter állapotkódot hoz vissza, ami nulla, ha a hívás sikeres volt, egyébként pedig egy nullától különböző értékű állapotkód. Az összes többi regiszter (HL, IX, IY, AF', BC', DE', HL') tartalmát minden EXOS-hvás megőrzi és változatlan marad a felhasználói lapkiosztás is. EXOS-hívást bármely Z-80-as lap bármely címéről kérhetünk, és a felhasználói veremmemória is elhelyezkedhet a négy lap bármelyikén.

11.1. A periférianév és a file-név szintaxisa

A csatornamegnyitás és csatornalétrehozás funkcióhívások egy füzér (string) paramétert igényelnek. Ez a jelsorozat határozza meg, hogy melyik perifériameghajtó számára lesz a csatorna megnyitva és emellett ugyancsak meghatároz egy egységszámot és egy file-nevet is.
A szintaxis a következő:

[[Periférianév][["-"] egységszám] ":" ][file-név]

ahol a [ ] szögletes zárójelek választható részt jelölnek, az " " idézőjelek pedig pontosan beírandó karaktert határolnak.
A periférianév maximum 28 karakterből állhat, amelyek mindegyike kötelezően betű. Ezt a rendszer nagybetűsíti és így a betűállásnak nincs jelentősége. Ha hiányzik a név, akkor az EXOS egy alapértelmezés szerinti periférianevet fog használni, amit az alapértelmezésű periférianév EXOS-hívás (19. kód) segítségével állíthatunk be. Ha az egységszám is hiányzik (l. alább), akkor az alapértelmezés szerinti egységszám használatára kerül sor, amit ugyancsak ezzel a hívással állíthatunk be.
Az egységszámot - ha megadtuk - a periférianévtől egy "-" (mínusz) karakterrel választhatjuk el, de közvetlenül is következhet. Az egységszám decimális számjegyek sorozatából áll, amit az EXOS egy 1 byte-os értékké alakít át. Ha a periférianévhez nem tartozik egységszám, akkor az alapértelmezés szerinti - nulla - egységszám használatára kerül sor.
Az opcionális (választható) file-név maximum 28 karakterből állhat, amelyek lehetnek betűk, számjegyek és az alábbi speciális karakterek:

£ $ % & ' ( ) * - . / ? [ \ ] ^ - és az ASCII 60h

A betűk nagybetűsítve lesznek, mielőtt a füzérbe kerülnek. Ha nem szerepel file-név, akkor azt a rendszer nullákból álló karaktersorozatnak (üres füzérnek) tekinti.
A file-név és az egységszám, értelmezése a perifériakezelőben történik. Ha azonban a perifériakezelő periférialeírójában a DD_UNIT_COUNT mező beállított állapotú, akkor az egységszám bizonyos manipulációs folyamaton megy keresztül.
Ha a DD_UNIT_COUNT mező N értékű, akkor ez azt jelenti, hogy a perifériakezelő csak olyan egységszámokat fogad el, amelyek a (0 ... N-1) tartományba esnek. Ha az egységszám ennél nagyobb, akkor azt a rendszer N-nel csökkenti és a periférialánc-vizsgálat így folytatódik. Ha egy ugyanolyan nevű másik periféria bukkan fel, akkor a folyamat megismétlődik. Ha most az egységszám a tartományon belül esik, akkor a rendszer a perifériát a redukált egységszámmal hívja. Ily módon több azonos nevű periféria is kezelhető és az egységszám, szerint lesznek megkülönböztetve. Ezt a módszert semmilyen beépített periféria nem használhatja. Használhatják azonban a járulékosan csatlakoztatott lemezegységek.

11.2. 0-ás funkció: rendszer reset

Ez a hívás alapállapotba állítja az EXOS-t. A L-regiszterben átadott jelzők vezérlik a RESET tevékenységét az alábbiak szerint:

b0 ... b3 nullának kell lenniük.
b4 - beállítva:
erőszakkal felszabadítja az összes csatorna-RAM-ot és újrainicializálja az összes perifériát. A felhasználói perifériák megmaradnak.
b5 - beállítva:
olyan a hatása, mint a 4-es bité, de ezen kívül újra szerkeszti az összes beépített és bővítő perifériát, valamint újrainicializálja a rendszerbővítőket. A perifériaszegmensek kijelölt állapota nem szűnik meg.
b6 - beállítva: megszünteti a felhasználói RAM-szegmens kijelöléseket.
b7 - beállítva: hidegindítás. Ez egyenértékű a gép ki-, majd újra bekapcsolásával. Az összes RAM adat elvész.

Jegyezzük meg, hogy az állapotregiszter beállítása nincs összehangolva az állapotkóddal (az utóbbi mindenképpen nulla), és a BC', DE' és HL' regiszterek tartalmait ez az EXOS-hívás elrontja.
Meleg reset-nél (l. 3.2.) automatikusan meghívódik ez a funkción 10h bit jelzővel. 20h jelzővel történik ez ugyancsak automatikusan, mikor az EXOS belép egy újonnan betöltött alkalmazói programba (l. 10.6. alfejezet).
Amikor egy rendszerbővítés, mint egy új alkalmazói program átveszi a vezérlést (az akciókódtól függően 60h vagy 00 jelzővel), meg kell hívnia ezt a funkciót (l. 9.3.).
Minden reset hívás után - beleértve a fent leírt EXOS által történő hívásokat is - a szoftvermegszakítás címe, és a hardvermegszakítást kezelő rutin címe törlődik, ezért ezt a felhasználónak kell újra inicializálnia.

11.3. 1-es funkció: csatorna megnyitása

A file-név formáját az előzőekben már meghatároztuk. A file-név és az egységszám, értelmezése a perifériakezelőhöz kerül és azt sok periféria figyelmen kívül hagyja. Ha a periféria igényli a file-nevet, akkor visszaküld egy hibakódot, ha a specifikált file nem létezik. Bizonyos perifériáknál szükséges, hogy a speciális funkcióhívással opciókat állítsunk be, hogy használni tudjuk a csatornát. Továbbá bizonyos egységek azt is igénylik, hogy részükre EXOS változók beállításával írjunk elő paramétereket ahhoz, hogy egy csatornát meg tudjunk nyitni. Az egységszámot a magnó- és hálózatkezelő kivételével minden beépített periféria figyelmen kívül hagyja. Ha egységszám megadása nélkül specifikálunk periférianevet, akkor alapértelmezés szerint egy nulla kerül felhasználásra, amit az eszközök, ha szükséges, lefordíthatnak a saját belső alapértékükre.
A csatornamegnyitási funkció sikeres teljesítéséhez a perifériának a saját részére ki kell utalnia egy csatornapuffert, mielőtt visszatér és esetleg visszaküldhet egy hibajelzést, ha nem áll elegendő RAM terület a rendelkezésére.

11.4. 2-es funkció: csatorna létrehozása

A létrehozási funkció azonos a megnyitási funkcióval, kivéve, ha az egység igényli a file-neveket. Ekkor a file létrehozásra kerül, amennyiben nem létezik, ha pedig létezik, akkor egy hibakód jön vissza. A funkció azonos a csatornamegnyitási funkcióval minden beépített perifériára nézve, kivéve a magnókezelőt.

11.5. 3-as funkció: csatorna lezárása

A lezárási funkció kiüríti a puffereket és megszünteti a csatorna által használt összes RAM terület kiutaltsági helyzetét. Az erre a csatornaszámra való további hivatkozások hibát eredményeznek. A perifériakezelő belépési pontja meghívásra kerül a csatorna-RAM kiutalásának megszüntetése előtt.

11.6. 4-es funkció: csatorna megszüntetése

A megszüntetési funkció azonos a lezárási funkcióval, kivéve azt, hogy egy file-kezelő periférián a file törlődik. A funkció azonos az összes beépített periférián.

11.7. 5-ös funkció: karakter olvasása

A karakterolvasás hívása lehetővé teszi karakterek egyenkénti beolvasását a csatornából puffer használata nélkül. Ha a karakter nem áll készen, akkor a funkció vár. Ez a hívás közvetlenül a perifériakezelőhöz továbbítódik.

11.8. 6-os funkció: blokk olvasása

A blokk olvasás funkció egy változó méretű blokkot -olvas be a csatornából. A blokk hosszúsága 0-tól 65535 byte-ig terjedhet és szegmenshatárokat is keresztezhet.
A BC-regiszterben visszaküldött byte-szám még akkor is érvényes, ha az állapotkód hibát jelez, viszont nem érvényes, ha a hiba például nem létező csatorna. Ez lehetővé teszi, hogy újra próbálkozhassunk egy, csak részben sikerült blokk olvasásával az első sikertelen karaktertől kezdve. Ez a hívás közvetlenül a perifériakezelőhöz továbbítódik.

11.9. 7-es funkció: karakter írása

A karakterírás funkció lehetővé teszi karakterek egyenkénti kiírását a csatornába. Ez a hívás közvetlenül a perifériára továbbítódik.

11.10. 8-as funkció: blokk írása

A blokk írás funkció lehetővé teszi változó méretű blokk írását a csatornába. Megjegyezzük, hogy a BC-regiszterben visszaküldött byte-szám még akkor is érvényes, ha az állapotkód hibát jelez. Ez a hívás közvetlenül a perifériakezelőhöz továbbítódik.

11.11. 9-es funkció: csatornaolvasási állapot

Ezt a funkciót olyan perifériák (pl. billentyűzet) lekérdezésére használják, amelyek nem várakoztatják a rendszert karakterük kész állapotáig. A hívás közvetlenül a perifériakezelőhöz továbbítódik.

11.12. 10-es funkció: csatornaállapot megadása és olvasása

Ezt a funkciót véletlen hozzáférési lehetőségek és file-védelem biztosítására használjuk olyan file-perifériákon, mint a lemez vagy egy RAM kezelő.
A paraméterblokk formája a következő:

byte
 
0 ... 3 byte =
file-mutató érték (32 bit)
4 ... 7 byte =
file-méret (32 bit)
8 byte =
védelmi byte (még meghatározandó)
9 ... 15 byte =
nulla (további bővítés céljára fenntartva).

A bithozzárendelések az olvasott és írandó jelzőbyte-ban az alábbiak. (A meghatározott esemény zajlik, ha a bit beállított állapotú.)

 
ÍRANDÓJELZŐK
OLVASOTTJELZŐK
b0 új mutató beállítása a file-mutató érvényes
b1 nem használt (0) a file-méret érvényes
b2 új védelmi byte beállítása a védelmi byte érvényes
b3 ... b7 nem használt (0) mindig nulla

Lehetővé teszi a file-mutató és/vagy a védelmi byte független beállítását vagy olvasását. Ezt a funkciót nem minden perifériának kell kezelnie, gyakorlatilag a beépített egységek egyike sem teszi. Ha a funkciót az egység nem kezeli, akkor egy 'NOFN hibajelentést kell visszaküldenie.

11.13. 11-es funkció: speciális funkció

Ez a funkció periféria-specifikus tevékenységek megvalósítását teszi lehetővé a csatornában. Ha a funkciót a periféria nem kezeli, akkor egy .ISPEC hibajelzést fog visszaküldeni. A B-regiszterben megadott alfunkciószám határozza meg, hogy melyik speciális funkcióra van szükség. Az alfunkciószámoknak az összes perifériáknál különbözőeknek kell lenniük, kivéve ha egyenértékű funkciókat valósítanak meg. A beépített egységekhez tartozó speciális funkciók a következők (a részleteket l. a perifériakezelők előírásainál):

@ @ DISP = 1 VIDEO - lap kijelzése
@ @ SIZE = 2 VIDEO - lapméret és üzemmód visszaadása
@ @ ADDR = 3 VIDEO - video lapcím visszaadása
@ @ FONT = 4 VIDEO - a kezdeti karakterkészlet
@ @ OFKEY = 8 BILLENTYŰZET - funkcióbillentyűk programozása
@ @ JOY = 9 BILLENTYŰZET - botkormány közvetlen olvasása
@ @ FLSH = 16 HÁLÓZAT - kiviteli puffer ürítése
@ @ CLR = 17 HÁLÓZAT - be- és kiviteli pufferek törlése
@ @ MARG = 24 SZERKESZTŐ - lapszélmargók beállítása
@ @ JOY = 25 SZERKESZTŐ - dokumentum betöltése
@ @ JOY = 26 SZERKESZTŐ - dokumentum kimentése

A 0-tól 63-ig terjedő összes többi alfunkciókód az IS-Enterprise céljaira van fenntartva. A 64-es és efölötti kódokat a felhasználói perifériák használhatják.

11.14. 16-os funkció: EXOS-változó olvasása, írása vagy átbillentése

Ez a funkció lehetővé teszi EXOS-változók beállítását vagy olvasását. Ezek a változók a rendszer és a specifikus perifériák különböző funkcióit vezérlik. Jegyezzük meg, hogy az új érték írás és átbillentés esetén is visszaküldésre kerül. A már definiált EXOS-változók listáját a 8. fejezetben megadtuk. A rendszerbővítők további EXOS-változókat is létrehozhatnak.

11.15. 17-es funkció: csatorna megszerzése

A csatorna megszerzés funkció a további olvasási funkcióhívásokat (karakterolvasás, blokkolvasás és állapotolvasás) a fő csatorna helyett a másodlagos csatornába irányítja át. A funkcióhívás kiadásakor a fő csatornának léteznie kell, de a másodlagos csatornaszám létezése tekintetében nem történik ellenőrzés.
A megszerzés a fő csatornára kiadott minden soron következő bevitelre vonatkozik mindaddig, amíg le nem zárjuk a másodlagos csatornát, a csatorna nem küld hibajelzést (pl. file-vége jelzést), vagy a fő csatornát valami más helyről meg nem szerzik. A megszerzés hatását egy 0FFh értékű másodlagos csatornaszám megadásával törölhetjük.

11.16. 18-as funkció: csatorna átirányítása

Az átirányítási funkció hatására a soron következő kivitelek, amelyeket karakterírás vagy blokkírás funkcióhívásokkal a fő csatornára küldünk, a másodlagos csatornára mennek. Az átirányítás mindaddig tart, ameddig a másodlagos csatornát le nem zárjuk, az hibajelzést nem küld vagy amíg a fő csatornát át nem irányítjuk máshová. A 0FFh értékű másodlagos csatornaszám törli a fő csatorna bármilyen átirányítását.

11.17. 19-es funkció: alapértelmező periférianév beállítása

Az alapértelmezés szerinti file-név beállítási funkció periférianevet és (választható módon) egységszámot specifikál, amit majd a soron következő csatornamegnyitás vagy csatornalétrehozás funkcióhívásokban fogunk alkalmazni, ha a felhasználó nem adott meg periférianevet. Eredetileg az alapértelmezés szerinti név a TAPE-1 (1-es magnóegység), de ez a DISK-1 (1-es lemezegység) névre fog megváltozni, ha a rendszerhez mágneslemezegység is csatlakoztatva van. Az előírt periférinevet és egységszámot a rendszer érvényesség szempontjából ellenőrzi (azaz megnézi, hogy a név nem tartalmaz-e érvénytelen karaktereket), de nem vizsgálja, hogy van-e már ilyen nevű egység a periférialáncban.
Ha csak egy egységszámot - például 45 - adunk meg, akkor ez a funkció beállít ugyan egy új egységszámot, de az alapértelmezés szerinti név nem változik meg. Ha csak periférianevet adunk meg, akkor az alapértelmezési egységszám nullára állítódik be.
A C-regiszterben megadott perifériatípus egyszerűen átmásolódik a device type (perifériatípus) nevű EXOS-változóba. Ez az átlagos gépben nulla lesz, mivel az alapértelmezés szerinti periféria a TAPE (magnóegység), ami nem file-kezelő periféria. Ha a rendszerben van mágneslemezegység, akkor a perifériatípus értéke 1-re állítódik be. Az EXOS ezt a változót jelenleg nem használja, viszont felhasználásra kerülhet az alkalmazói programok körében.

11.18. 20-as funkció: rendszerállapot lekérdezése

Ez a funkció megadja a rendszer verziószámát és a RAM-szegmensek rendszerben való használatát leíró különböző paramétereket. A funkció által visszaadott paraméterek sorrendben az alábbiak:

0 A megosztott szegmens száma (0, ha nincs ilyen szegmens)
1 A szabad szegmensek száma
2 A felhasználó részére kiutalt szegmensek száma, nem értve bele a nullás lap szegmenst és a megosztott szegmenst (ha egyáltalán van)
3 A perifériák részére kijelölt szegmensek száma
4 A rendszer részére kijelölt szegmensek száma, beleértve a megosztott szegmenst (ha egyáltalán van)
5 Az összes működő RAM-szegmens száma
6 A nem működő RAM-szegmensek száma
7 Jelenleg nem használt

11.19. 21-es funkció: periféria felvétele

A periféria felvételi funkció hatására a DE által kijelölt periférialeíró a leírólánchoz kapcsolódik. A leíró a lánc elejére kerül és az azonos nevű, már létező periféria pedig érvényét veszti. A DE-nek a leíró TYPE (típus) mezőjére kell mutatnia,és a leíró nem keresztezhet szegmenshatárt. Egy EXOS 21 hívással beláncolt felhasználói perifériánál, mielőtt visszatérne az EXOS hívásból, rögtön meghívja annak inicializálási rutinját. Ha a leíró már felvételre került a láncba, akkor a felhasználónak kell gondoskodnia arról, hogy a periféria rutinja és a leíró ne törlődjenek, amíg egy RESET funkcióhívás nem történik beállított 5-ös bittel (ami leválasztja a felhasználói perifériákat).
A kért nagyságú RAM kijelölésére a rendszerszegmensben kerül. sor. A periféria első inicializálásakor az IX erre a RAM-területre fog mutatni: IX a terület fölé mutat, az igényelt n bájt terület a IX-1, IX-2, ... , IX-n címeken érhető el. Az egységnek emlékeznie kell erre a címre, mivel soha nem kapja meg újra, még az újrainicializálás alkalmával sem.

11.20. 22-as funkció: EXOS-határ olvasása

Az EXOS-határ olvasási funkció megadja az aktuálisan megosztott szegmensen belül a rendszer által használt legalsó byte címét (eltolási távolságát). Ha nincs közösen használt szegmens, akkor a DE oda mutat, ahol az EXOS-határ lenne, ha egyáltalán ki lenne utalva egy megosztott szegmens.

11.21. 23-as funkció: felhasználói határ beállítása

A felhasználói határ beállítási funkció lehetővé teszi, hogy a felhasználó mozgassa a felhasználói határt az aktuálisan megosztott szegmensen belül. Ha nincs közösen használt szegmens, akkor ez a funkció nem megengedett. A határt nem lehet magasabbra állítani, mint az aktuálisan érvényes EXOS-határ.

11.22. 24-es funkció: szegmens kijelölése

A szegmens kijelölési funkció lehetővé teszi, hogy a felhasználó céljaihoz egy másik 16k nagyságú szegmenst szerezzen. Ha rendelkezésére áll szabad szegmens, akkor az kiutalásra kerül és eredményként visszakapunk egy 0 értékű állapotkódot, továbbá a C-regiszterben a szegmensszám, a DE-regiszterben pedig 4000h lesz.
Ha nem állnak rendelkezésre szabad szegmensek, akkor a felhasználó egy megosztott (közösen használt) szegmenst kaphat, majd a C-regiszter megadja a szegmensszámot, DE értéke pedig az eredeti EXOS-határ lesz. Ebben az esetben a funkció egy .SHARE hibajelzést küld. Eredetileg a felhasználói határ az EXOS-határral megegyező értékre van állítva.
Ha nem állnak rendelkezésre szabad szegmensek és már van egy megosztott szegmens, akkor a funkció a .NOSEG hibajelzést küldi.
Ha ezt a funkcióhívást egy perifériakezelő adja ki, akkor a szegmens a periféria számára lesz kijelölve, megosztott szegmens pedig nem kerülhet kijelölésre.

11.23. 25-ös funkció: szabad szegmens

A szegmens felszabadítási funkció lehetővé teszi, hogy a felhasználó szabaddá tegyen egy 16k nagyságú RAM-szegmenst. A szegmensnek ilyenkor a felhasználóhoz kell tartoznia, vagy megosztottnak kell lennie. A nullás lap szegmenst nem lehet szabaddá tenni, mivel az soha nem is volt kifejezetten kiutalva szegmenskijelölés segítségével. Arra nézve, hogy melyik periféria szabadítja fel a szegmenst, nem történik ellenőrzés. Feltételezzük, hogy az egységek szabályosan viselkednek.

11.24. 26-os funkció: rendszerbővítő letapogatása

A funkció hatására a füzér bizonyos feldolgozást követően körbejár a rendszerbővítők között a 2-es akciókóddal, vagy a 3-assal, ha a füzér első szava a HELP (segítség) szó. Ez lehetővé teszi, hogy a rendszerbővítők szolgáltatásokat végezzenek és átkapcsolást is megenged az új programra.

11.25. 27-es funkció: csatornapuffer kijelölése

A csatornapuffer kijelölési funkció csak a perifériák számára áll rendelkezésre, azt az alkalmazói programoknak nem szabad használniuk. Ez a funkció RAM-puffert utal ki a csatorna részére, amikor megnyitjuk. A BC-regiszterben átadott többszegmens-méret paramétert a nem video perifériáknál figyelmen kívül hagyjuk, mivel ezek csatornapufferének egy szegmensben kell lennie. így a nem video egységeknél a hívás végrehajtása előtt nem szükséges a BC-t betölteni.

11.26. 28-as funkció: hibakód értelmezése

Ez a funkció lehetővé teszi, hogy egy EXOS hibakódot rövid szöveges üzenetté alakítsuk át. A fordítás elvégzésére a rendszerbővítők is lehetőséget kapnak. Az EXOS-kernel és a beépített perifériák által generált összes hibakód magyarázatát a belső ROM szolgáltatja. Ha a visszaküldött (magyarázatként adott) jelsorozat nulla hosszúságú, akkor olyan hibakódról van szó, amelyet senki sem ismert fel.

11.27. 29-es funkció: modul betöltése

Ezt a funkcióhívást az Enterprise modul formájú file-ok betöltését tárgyaló fejezetben már megmagyaráztuk. Betölt egy modulfejrészt és aztán vagy maga tölti be a modult, vagy továbbítja azt a rendszerbővítőkhöz, betöltésre. Ha a rendszerbővítők ezt nem teszik meg, akkor a (DE által kijelölt) pufferben visszakerül a felhasználóhoz, hogy az végezze el a betöltést.
Ha a modult az EXOS vagy valamelyik rendszerbővítő rendben betölti, akkor a funkció egy nulla állapotkódot küld eredményként. Ebben az esetben vagy, ha a felhasználó sikeresen betöltötte a modult, a következő modul betöltése céljából meg kell ismételni a modul betöltés funkcióhívást. Ez a folyamat mindaddig folytatódik, amíg .NOMOD hibajelzést nem kapunk, ami azt jelzi, hogy a rendszer egy end of file header (file-fejrész vége)-t talált, vagy amíg végzetes hiba nem fordul elő.
Ha az első byte nem nulla, vagy ha a típus-byte nulla, akkor a file nem Enterprise formátumú file. Emiatt egy .ASCII hibajelzést kapunk, továbbá az első karaktert a B-regiszter fogja tartalmazni. A felhasználó ezután az ASCII adatokkal azt tehet, amit akar, de ne kísérelje meg másik modul betöltését ebből a file-ból.

11.28. 30-as funkció: áthelyezhető modul betöltése

Ezt a funkcióhívást a felhasználó áthelyezhető felhasználói modulok betöltésére alkalmazhatja 2-es típusú fejrésszel, amit a fent leírt modul betöltés hívás visszautasít.
A felhasználónak a fejrészben megadott méretéhez találnia kell egy megfelelő méretű RAM-szeletet, ahová a modult be lehet tölteni. Ha a funkcióhívás nulla hibakódot küld eredményként, akkor a felhasználónak hívnia kell a betöltött program inicializálásának belépési pontját (ha van ilyen), majd újra kell hívnia a modul betöltés funkciót, hogy hozzájusson a következő modul fejrészéhez. Ezt a 10.2. alfejezetben már részletesebben is kifejtettük.

11.29. 31-es funkció: idő beállítása

Ez a funkció beállítja a rendszer belső óráját. A paraméterek helyesség szempontjából ellenőrzésre kerülnek és egy .TIME hibajelzést kapunk, ha hibásak (nem megengedett karaktereket tartalmaznak).

11.30. 32-es funkció: idő olvasása

Ez a funkció leolvassa a rendszeróra aktuális értékét. Az óra minden másodpercben továbblép az Enterprise 1 Hz-es megszakítása segítségével. Amikor éjfélhez ér, a dátum automatikusan szintén lép (l. a következő fejezetben).

11.31. 33-as funkció: dátum beállítása

Ez a funkció beállítja a rendszer belső dátumát. A paraméterek helyesség szempontjából teljes ellenőrzésre kerülnek, beleértve a napok számát is az egyes hónapokban, továbbá a szökőéveket is. A kezdőév 1980, és így C=4 paraméter ténylegesen 1984-et jelent. Ez a megoldás lehetővé teszi, hogy a dátum hosszú távúan is használható legyen.

11.32. 34-es funkció: dátum olvasása

Ez a funkció leolvassa a rendszer belső naptárának aktuális értékét. Ezt a felhasználó állíthatja be és automatikusan lép, amikor a rendszer órája az éjfélhez ér. A rendszer az egyes hónapokban lévő napok számának kérdését és a szökőévek problémáját helyesen tudja kezelni.

II. rész: Az EXOS funkció és hibakódjai

Ez a leírás számos EXOS változót ír le. Ez magában foglalja bizonyos rendszerváltozók leírását, az összes EXOS rendszerhívás kódját, beleértve a hibakódokat. Ezen változók nagy része az EXOS Kernel leírásban is megtalálható, de a teljesség kedvéért itt is szerepelnek.

1. Rendszer szegmens címek

A rendszer szegmens vége (0ffh szegmens) tartalmaz bizonyos, a felhasználó által elérhető címeket. Ezek a következők:

0BFFFH - USR_P3
0BFFEH - USR_P2
0BFFDH - USR_P1
0BFFCH - USR_P0
Ez a négy szegmens az, amely az EXOS legutolsó hívásakor volt belapozva. EXOS-on kívül értéke nem meghatározott.
0BFFAH/BH STACK LIMIT
Az eszközök által használható rendszerverem alsó határa.
BFF8/9H RST ADDR
Melegindítási cím, amelynek a nullás lapon kell lennie.
0BFF6/7H ST_POINTER
Az állapotsor RAM-beli Z-80-as címe.
0BFF4/5H LP_POINTER
A video sorparaméter tábla Z-80-as kezdőcíme.
0BFF3H PORTB5
A 085H Z-80-as port aktuális tartalma, amely bármely bit módosításakor használatos.
DBFF2H FLAG_SORT_IRQ
A jelző egy nem nulla értéket vesz fel a szoftvermegszakítás előidézése céljából. Ennek értéke a megszakítás kódja lesz.
0BFF0/1H SEC_COUNTER
16 bites másodperc számláló, amelyet az EXOS és a beépített eszközök sohasem használnak.
0BFEEH
CR_DISP
Ez egy olyan jelző, amelyet egy ROM bővítő nem nulla értékre állíthat be inicializálása során, hogy az ENTERPRISE képernyő bejelentkező üzenetét megszüntesse.
0BFED/EH
USER_ISR
A felhasználói megszakítás (továbbiakban: it) rutin kezdőcíme, amelynek a nullás lapon kell lennie. Ha nincs felhasználói megszakítás, akkor az értéke: 00000h.

2. EXOS funkciókódok

Az alábbiakban található az EXOS funkciókódok listája. Ezek azok, amelyek az RST 030H-t követik egy EXOS hívás esetén. Minden az alábbiaktól különböző kód .IFUNC hibakódot ad. A hívásokról részletesen az EXOS Kernel leírásban szólunk.

0 EXOS reset
1 Csatorna megnyitása
2 Csatorna létrehozása
3 Csatorna lezárása
4 Csatorna megszüntetése
5 Karakter olvasása
6 Blokk olvasása
7 Karakter írása
8 Blokk írása
9 Csatorna olvasási állapot
10 Csatorna állapot beállítása és olvasása
11 Speciális funkció
   
16 EXOS-változó olvasása / írása / átbillentése
17 Csatorna megszerzése
18 Csatorna átirányítása
19 Alapértelmezés szerinti eszköz beállítása
20 Rendszerállapot lekérdezése
21 Eszköz felvétele
22 EXOS-határ olvasása
23 Felhasználói határ beállítása
24 Szegmens kijelölése
25 Szabad szegmens
26 Rendszerbővítők letapogatása
27 Csatornapuffer kijelölése
28 Hibakódok értelmezése
29 Modul betöltése
30 Áthelyezhető modul betöltése
31 Idő beállítása
32 Idő olvasása
33 Dátum beállítása
34 Dátum olvasása

3. Hibakódok

Minden EXOS hívás állapotkóddal tér vissza, amely nulla, ha a hívás sikeres volt, és negatív, ha hiba történt. A pozitív nem nulla kódok figyelmeztetést jelentenek, bár az EXOS ezeket nem használja kiterjedten, valójában csak egy ilyen van, és ezt az alábbiakban ismertetjük.
A leírásban minden hibára nevével hivatkozunk, amely megállapodás szerint ponttal kezdődik. A nevek a hozzájuk tartozó értékekkel együtt vannak kilistázva. Az idézőjelek közötti szövegeket a 28-as EXOS hívás (l. ott) írja ki adott esetben. Azok a hibák, amelyekhez nem tartozik ilyen szöveg, csillaggal (*) vannak megjelölve.

3.1. Figyelmeztető kódok

07FH * .IFUNC
Egy már kiosztott szegmenst osztottunk ki újra. A 24-es EXOS hívás küldheti vissza.

3.2. Általános kernelhibák

Ezek a hibák az EXOS kernel belsejében keletkeznek, és felhasználói eszközök nem térhetnek vissza ilyen kódokkal.

0FFH .IFUNC
"NEM MEGENGEDETT EXOS KÓD"
0FEH
.ILLFN
"NEM HOZZÁFÉRHETŐ EXOS HfVÁS"
Ez akkor jelentkezik például, ha egy eszköz csatornát próbál megnyitni, ha a felhasználó csatornapuffert akar kijelölni vagy megszakítási rutin EXOS-t hív.
0FDH .INAME
"ÉRTELMETLEN EXOS FÜZÉR"
Akkor fordul elő, ha egy meg nem engedett karakter van az eszköz-, ill. file nevében, vagy ha a füzér túl hosszú.
0FCH .STACK
"EXOS VEREM TÚLCSORDULÁS"
Bármely EXOS híváskor előfordulhat. Általában nem fordul elő mindaddig, amíg túl sok eszközt nem ágyazunk egymásba.
0FBH .ICHAN
"CSATORNA NEM LÉTEZIK"
Megkíséreltünk elérni egy nem létező csatornát olvasásra, írásra stb.
0FAH .NODEV
"ESZKÖZ NEM LÉTEZIK"
Megkíséreltünk csatornát nyitni egy nem létező eszközre.
0F9H .CHANX
"CSATORNA LÉTEZIK"
Egy már létező csatornaszámmal próbáltunk meg csatornát megnyitni.
0F8H *
.NOBUF
Csatornanyitásnál kaphatunk ilyen hibát, ha az eszköz nem hajtott végre előzőleg csatorna puffer kijelölés hívást vagy ezt rossz paraméterekkel tette (pl. több mint 64k RAM-ot kért).
0F7H .NORAM
"KEVÉS MEMÓRIA"
Nincs elegendő memória egy feladat elvégzéséhez. Előfordulhat a következő esetekben: csatornamegnyitás, eszközbeiktatás, rendszerbővítő betöltése, új felhasználás betöltése.
0F6H .NOVID
"KEVÉS A VIDEO MEMÓRIA"
Akkor fordul elő, ha van elegendő RAM, de a csatornapufferek miatt a videocsatorna kikerülne a video RAM-ból.
0F5H * .NOSEG
Szegmens kijelölési hívásnál nincs több szabad szegmens.
0F4H *
.ISEG
Egy szegmens felszabadító hívásnál jelentkezhet, ha az adott szegmens nincs a felhasználó számára lefoglalva. Felhasználói határ állítása esetén is előfordulhat, ha nincs megosztott szegmens.
0F3H *
.IBOUND
Egy megosztott szegmensnél kísérlet történt a felhasználói határ állítására az EXOS határ fölé. Nincs több hely az adott szegmensen.
0F2H
.IVAR
"ISMERETLEN EXOS VÁLTOZÓ SZÁM"
Visszakapjuk, ha az EXOS és a többi rendszerkiegészítő nem ismeri fel az adott változószámot. Felléphet EXOS változó írásánál vagy átbillentésénél.
0F1H .IDESC
"ÉRVÉNYTELEN ESZKÖZ AZONOSÍTÓ"
Egy "eszköz felvétele" kiadásakor az eszköz azonosítója érvénytelen.
0F0H .NOSTR
"FELISMERHETETLEN PARANCSFÜZÉR"
Egyetlen rendszerkiegészítés sem ismerte fel a parncsot, "rendszerbővítők letapogatása" esetén.
0EFH
.ASCII
"ÉRVÉNYTELEN FILE FEJRÉSZ"
"Modul töltés" hívásnál keletkezik, ha a fejrész első byte-ja nem nulla, vagy ha az első két byte nulla. Jelzi, hogy a file nem egy Enterprise modul formájú file.
0EEH .ITYPE
"ISMERETLEN MODUL TÍPUS"
Előfordul, ha a "modul töltés" hívás esetén sem az EXOS, se más rendszerbővítő nem ismeri fel a modul típusát.
0EDH
.IREL
"ÉRVÉNYTELEN ÁTHELYEZHETŐ MODUL"
Akkor kapjuk, ha az "áthelyezhető modul töltés" hívásnál egy érvénytelen bitsorozatot talál a rendszer. "Modul töltés" hívás esetén is lehetséges, ha áthelyezhető rendszerbővítést töltünk.
0ECH *
.NOMOD
"Modul töltés" hívásnál kapjuk, ha a fejrész típusa $$EOF. A másik lehetőség, hogy a modul fejrész első byte-jónak olvasásánál .EOF hiba van. Azt jelzi, hogy a file olvasása szabályos módon a végére ért.
0EBH .ITIME
"ÉRVÉNYTELEN DÁTUM VAGY IDŐ ÉRTÉK"
Érvénytelen megadott értéknél generálódik a "dátum állítás" vagy az "idő állítás" hívásnál.

3.3. Általános eszközhibák

Ezek a hibák az eszközvezérlők által generálódnak és nem tartoznak egyik konkrét eszközhöz sem, bármelyik eszköztől jöhetnek.

0EAH .ISPEC
"ÉRVÉNYTELEN SPECIÁLIS FUNKCIÓHÍVÁS"
Speciális funkcióhfvásnál akkor keletkezik, ha az eszköz nem ismeri fel a megadott alfunkció számát.
0E9H .2NDCH
"ESZKÖZ HASZNÁLAT ALATT"
Megnyitási kísérlet történt egy olyan eszközre, amelyikben már van egy nyitott csatorna, és több nem lehet.
0E8H .IUNIT
"ÉRVÉNYTELEN EGYSÉGSZÁM"
Olyan eszközök küldik ezt a hibát, amelyek csatornamegnyitás vagy -létrehozás esetén ezeket a funkciókat nem tudják végrehajtani.
0E7H
.NOFN
"AZ ESZKÖZ NEM IGÉNYLI A HÍVÁST"
Nem mindegyik eszköz támogatja az összes EXOS csatornahívást (1 ... 11 funkciókódok). Ilyen jellegű hiba lép fel, amikor pl. írni akarunk a billentyűzet csatornába.
0E6H
.ESC
"ÉRVÉNYTELEN ESCAPE SZEKVENCIA"
Néhány eszköz különböző vezérlő funkciókra escape szekvenciákat értelmez. Ha egy eszköz erre nem képes, akkor ilyen hibát ad vissza.
0E5H
.STOP
"A STOP BILLENTYŰ LENYOMVA"
Az eszközök ezt a hibát akkor adják, ha egy funkcó végrehajtása közben működésüket megszakítja, a STOP billentyű által generált szoftvermegszakítás. A hiba felismerésekor a megszakítás már végrehajtódott.
DE4H .EOF
"FILE VÉGE"
Bármely file-kezelő eszköz visszaadhat ilyen hibát, ha a file-vége jelzésen túl próbálunk olvasni.
0E3H
.PROT
"VÉDELEM MEGSÉRTÉSE"
Némely eszköz rendelkezik valamilyen típusú file-védelemmel. Ezek adhatnak vissza ilyen hibát. Az egyetlen ilyen beépített eszköz a kazettameghajtó egység.

3.4. Eszközfüggő hibák

A következő hibákat mindig egy adott eszközvezérlő generálja. A hibaüzenetek teljes és részletes leírása az eszközök dokumentációjában található.

Billentyűzet:
0E2H .KFSPC
"FUNKCIÓ BILLENTYŰ FÜZÉR TÚL HOSSZÚ"
Hang:
0E1H .SENV
"BURKOLÓGÖRBE TÚL NAGY"
0E0H .SENBF
"BURKOLÓGÖRBE TÁRTERÜLET TELE"
0DFH .SQFUL
"HANG SOR TELE"
Video:
0DEH .VSIZE
"ÉRVÉNYTELEN VIDEO LAP MÉRET"
0DDH .VMODE
"ÉRVÉNYTELEN VIDEO MÓD"
0DCH .VDISP
"ÉRVÉNYTELEN KÉPERNYŐ PARAMÉTEREK"
0DBH Nem használt
0DAH .VROW
"GÖRGETÉSHEZ ÉRVÉNYTELEN SORSZÁM"
0D9H .VCURS
"ÉRVÉNYTELEN KURZOR KOORDINÁTÁK"
0D8H .VBEAM
"ÉRVÉNYTELEN SUGÁR POZÍCIÓ"
Hálózat:
0D7H .SEROP
"SOROS VONAL ÉS HÁLÓZAT EGYSZERRE"
0D6H .NOADR
"HÁLÓZATI CÍM NINCS BEÁLLÍTVA"
0D5H .NETOP
"HÁLÓZATI KAPCSOLAT LÉTEZIK"
Szerkesztő:
0D4H .EVID
"EDITOR VIDEO CSATORNA HIBA"
0D3H .EKEY
"EDITOR BILLENTYŰZET CSATORNA HIBA"
0D2H .EDINV
"EDITOR FILE BETÖLTÉSI HIBA"
0D1H .EDBUF
"EDITOR BETÖLTÉSI FILE TÚL NAGY"
Magnó:
0D0H .CCRC
"KAZETTA CRC HIBA"

4. EXOS változók

Az alábbi listában megtalálható az összes változónév, amelyet az EXOS kezel. Részletesebb leírásuk megtalálható a megfelelő eszköz vagy kernel specifikációban.

0 IRQ_ENABLE_STATE
b0 - hang IRQ engedély beállítás
b2 - 1 Hz IRQ eng. Beállítás
b4 - video IRQ eng. Beállítás
b6 - külső IRQ eng. Beállítás
bl, b3, b5, b7 - nulla
1
FLAG_SOFT_IRQ
Ha egy eszköz ezt a byte-ot nem nullára állítja, az szoftvermegszakítást okoz. A felhasználó direkt módon is állíthatja. A változó elérhető egy fix címen is, amelyet a korábbiakban megadtunk.
2
CODE_SOFT_IRQ
Az eszköz által beállított jelzők másolata. A megszakításkezelő programok ezt a byte-ot vizsgálják, és innen tudják meg a megszakítás okát.
3 DEF_TYPE
Az alapértelmezés szerinti
0 = nem file-kezelő eszköz (pl. szalagegység)
1 = file-orientált eszköz (pl. lemez)
4 DEF_CHAN
Az alapértelmezés szerinti csatornaszám. Ezt a csatornát használja a rendszer, ha 255-ös csatornaszámot adunk meg.
5 TIMER
1 Hz számláló. Szoftvermegszakítást generál, ha eléri a nullát, és megáll
6 LOCK_KEY
A LOCK billentyű állapota
7 CLICK_KEY
0 = billentyűhang engedélyezés
8 STOP_IRQ
= 0 - a STOP billentyű szoftver IRQ-t okoz
<> 0 - a STOP billentyű visszatérési kódot ad
9 KEY_IRQ
0 = Bármely billentyű szoftver IRQ-t eredményez visszatérési kóddal
10 RATE_KEY
Billentyűzet automatikus ismétlési sebesség 1/50-ed másodpercben
11 DELAY_KEY
Késleltetés az automatikus ismétlés beindulása előtt
12 TAPE_SND
0 = szalag hang engedélyezés
13 WAIT_SND
= 0 - a hangmeghajtó vár, ha a sor tele van.
<> 0 - .SQFUL hibát ad vissza
14 MUTE_SND
= 0 - belső hangszóró aktív
<> 0 - belső hangszóró kikapcsolva
15 BUF_SND
burkológörbe tárméret "fázis"-okban megadva
16 BAUD_SER
a soros vonal sebessége (baud)
17 FORM_SER
a soros vonal szóformátuma
18 ADDR_NET
a gép hálózati címe
19 NET_IRQ
0 = a hálózaton érkező adat megszakítást okoz
20 CHAN_NET
a hálózatról jövő blokk csatornaszáma
21 MACH_NET
a hálózatról jövő blokk forrásgép száma
22 MODE_VID
video mód
23 COLR_VID
szín mód
24 X_SIZ_VID
X lapméret
25 Y_SIZ_VID Y
lapméret (Videolap megnyitáskor ez utóbbi négy változó határozza meg jellemzőit)
26 ST_FLAG
0 = állapotsor kijelezve
27 BORD_VID
a képernyő keretszíne
28 BIAS_VID
a színeltolás a 8 ... 16 színekhez
29 VID_EDIT
az editor videolapjának csatornaszáma
30 KEY_EDIT
az editor billentyűzetének a csatornaszáma
31 BUF_EDIT
az editorpuffer mérete (256 byte-os lapokban)
32 FLG_EDIT
az editor olvasásánál használt jelzők
33 SP_TAPE
nem nulla lassú kazettamentéshez
34 PROTECT
nem nulla védett file magnóra írásához
35 LV_TAPE
kazettás kimeneti szint vezérlés
36 REM1
Kazettásmagnó távvezérlő
nulla - kikapcsol,
nem nulla - bekapcsolt állapot
37 REM2
Kazettásmagnó távvezérlő
nulla - kikapcsol,
nem nulla - bekapcsolt állapot
38 SPRITE
a külső "szellem" szín prioritást vezérli
39 RANDOM_IRQ
Minden megszakítás esetén inkrementálódik. Ha nem rendszeresen kérdezzük le, akkor véletlenszám-generátorként használható.

5. Szoftvermegszakítási módok

Adott kódú szoftvermegszakítás generálható oly módon, hogy a FLAG_SOFT_IRQ változóba betesszük a kódot. A beépített eszközök által használt kódokat itt felsoroljuk. Az engedélyezés, ill. letiltás részleteiről több információ a megfelelő eszközvezérlő leírásokban található.

10 ... 1Fh
(BILLENTYŰZET)
Funkcióbillentyűk 1-8, és shiftelt 1-8
20h
(BILLENTYŰZET)
STOP billentyű lenyomása
21h
(BILLENTYŰZET)
Bármely normál billentyűlenyomás (alapértelmezésként ez nincs engedélyezve)
30h
(HÁLÓZAT)
Adatblokk érkezett a hálózati csatornán
40h
(KERNEL)
A TIMER EXOS változó leszámolt nulláig

6. A speciális funkciók alfunkciói

Minden speciális funkcióhoz a B-regiszterben tartozik egy alfunkciókód. Ez mondja meg, melyik a kiválasztott funkció. Az alábbiakban felsoroljuk a beépített eszközök által támogatott kódokat. A megfelelő eszközspecifikációkban részletesebben szólunk róluk.

1
(VIDEO)
Videolap megjelenítése a képernyőn
2
(VIDEO)
Lapméret és mód lekérdezése
3
(VIDEO)
Lapméret lekérdezése
4
(VIDEO)
Karakterkészlet újrainicializálása
8
(BILLENTYŰZET)
Funkcióbillentyű programozása
9
(BILLENTYŰZET)
Joystick-olvasás (belső vagy külső)
16
(HÁLÓZAT)
Pufferürítés
16
(HÁLÓZAT)
Puffertörlés
24
(EDITOR)
Margók állítása
25
(EDITOR)
Dokumentum-file betöltése
26
(EDITOR)
Dokumentum-file mentése

7. A rendszerbővítők akciókódjai

Az alábbiakban következő lista tartalmazza azokat a kódokat, amelyek a rendszerbővítőknek mehetnek körbe. Az összes többi érték további bővítésekre van fenntartva. A kódok jelentése az EXOS Kernel leírásban található meg.

0 - nincs akció
1 - hideg reset
2 - felhasználói parancsfüzér
3 - felhasználói segítségfüzér
4 - ismeretlen EXOS változó
5 - hibakód magyarázata
6 - file modul betöltés
7 - RAM kijelölés
8 - inicializálás

8. A file-betöltés modultípusai

Ez a lista definiálja az összes jelenleg értelmezett modultípust. Ezek a kódok a 16 byte hosszú fejrész második byte-jában találhatók. Némely típust nem a beépített programok támogatják, hanem az IS-BASIC vagy más ROM bővítők. Az EXOS vagy más beépített vezérlők által kezelt típusokat csillaggal (*) jelöltük.

0
- ASCII file
1
- IS-FORTH számára fenntartva
* 2
- áthelyezhető felhasználói modul
3
- többszörös IS-BASIC program
4
- egyedülálló IS-BASIC program
* 5
- új felhasználói program
* 6
- abszolút rendszerbővítő
* 7
- áthelyezhető rendszerbővítő
* 8
- editor dokumentum file
9
- IS-LISP számára fenntartva
* 10
- file vége modul

III. rész: A videókezelő specifikációja

1. Bevezetés

A videokezelő végzi az összes ún. videolap megjelenítését a különböző kijelzési üzemmódokban úgy, hogy ennek során felhasználja a NICK chip lehetőségeinek nagyrészét.
A megjelenítés kezelése az ún. videolapokon történik úgy, hogy egy lap megfelel egy, a videokezelő számára megnyitott EXOS-csatornának. A videokezelő részére a csatorna megnyitása előtt az EXOS-változók beállításával a felhasználónak különböző paramétereket kell beállítania, például a videoüzemmód, lapméret stb. Ezt követben lehet csatornát a "VIDEO:" perifériánál megnyitni. Ha ilyenkor file-nevet vagy egységszámot írunk elő, akkor az nem kerül figyelembevételre. A videokezelő kiszámítja, hogy mennyi RAM-ra van szüksége ehhez a videolaphoz, beleértve a változók által igényelt mennyiséget is, és meg is szerzi ezt az EXOS-tól. A videolapok számát csak a rendelkezésre álló memória nagysága korlátozza. A videolapok a video RAM-nak csak a belső 64k kapacitású részét használhatják.
Ha a csatornát ezen a módon már létrehoztuk, akkor a felhasználó a videolapról karaktereket olvashat ki, vagy oda karaktereket írhat be. Az olvasott vagy írt adatok a különböző üzemmódoknál különböző jelentést hordoznak. Különösen áll ez a vezérlő karakterekre és az ún. escape (átkapcsolási) szekvenciákra.
Ebben a fázisban a videolap a képernyőn nem látható. A videolapnak a képernyőn való tényleges megjelenítéséhez egy speciális funkcióhívásra van szükség. Ugyanis csak ekkor jönnek létre a megfelelő sorparaméter-blokkok és jelenik meg a szöveg/grafika. Lehetőség van rá, hogy a videolap tetszés szerinti függőleges részletét a képernyő bármelyik függőleges pozíciójában jelenítsük meg, eltakarva akármit, ami a képsorokban előzőleg ott ki volt jelezve. Ha a lap szélessége kisebb, mint a teljes képernyőszélesség, akkor a margók úgy kerülnek beállításra, hogy a lap a képernyő közepén helyezkedjen el.
A szöveges (text) lapok egy 128 elemből álló karakterkészlet, használhatnak inicializáláskor ez a szabványos ASCII karakterkészlet lesz, de akárhányat átdefiniálhat a felhasználó. A szöveges lapok ezen kívül különböző vezérlési funkciókat is biztosítanak beleértve a kurzor pozicionálását, a lap tetszés szakaszának görgetését (scrolling) és az automatikus görgetést.
Számos egymástól eltérő grafikus üzemmód van, melyek többféle felbontást, szín- és memóriahasználatot tesznek lehetővé. Az összes grafikus mód támogatja vonalak és ellipszisek rajzolását különböző üzemmódban és vonalfajtával (pl. szaggatott vonallal stb.). A karaktereket ugyanazon betűkészlet felhasználásával jeleníthetjük meg, mint a szöveges lapokon. Rendelkezésre áll egy bonyolultkitöltő algoritmus, ami a veremmemóriával összefüggő korlátozásoktól eltekintve tetszés szerinti alakzatot tud kitölteni (fill).

1.1. Koordináta-rendszerek

A grafikai pozícióknál alkalmazott koordináta-rendszer szabványosított, így ha azonos parancsokat adunk két különböző felbontású, vagy színes üzemmódú (video) lapnak, akkor azok a képernyőn egyező méretű ábrát ad. Egy teljes képernyő méretű grafikai lap magassága 972, szélessége pedig 1344 képpont. Ez a maximális vízszintes felbontás kétszeresének és a függőleges irányú felbontás négyszeresének felel meg. Minden sugárhelyzetet ezekkel a koordinátákkal adunk meg, és a szín üzemmódtól függően a tényleges pozíció ebből számítódik ki. Az ismertetett koordináta-rendszer origója (kezdőpontja) a grafikai lap bal alsó sarka.
Szöveges lapok nem ezt a koordináta-rendszert használják. Az ilyenkor használt rendszer a karakterpozíciókon alapul és így a bal felső sarok az (1,1), a jobb felső sarok pedig az (1,42) lesz, feltéve hogy teljes képernyő méretű, kisfelbontású szöveglapról van szó. Jegyezzük meg, hogy a szöveg koordináták origója a lap bal felső sarka.
Az attribútum grafikai üzemmódú lapok a sugárhelyzetet ténylegesen grafikus koordinátákkal, a kurzor pozíciót pedig szöveg koordinátákkal tartják nyilván. Ezek használatát később fogjuk elmagyarázni.

2. A videolapok vezérlésének alapjai

Mint korábban már említettük, mindegyik videolap egy külön csatorna. Amikor a videokezelő számára egy csatornát megnyitunk, akkor létre kell hoznunk egy új videolapot is. A videokezelő megvizsgálja a lap méretet, a lap üzemmódot és a szín üzemmódot meghatározó EXOS változókat. Ezeket a változókat a felhasználónak kell beállítania, mielőtt egy videocsatornát megnyit. Ezekből a változókból a videokezelő meghatározza, hogy mekkora video RAM-ra van szüksége, majd meg is szerzi azt egy EXOS funkcióhívással (csatornapuffer-kijelölés).
A videokezelő abszolút periféria-RAM területének rögzített helyén felépít egy sorparaméter-táblázatot. A sorparaméter-táblázat mindig 28 sorparaméter-blokk tartozik. Ezek mindegyike 9 képsoros (scan line) felbontásra vonatkozik. A táblázat tartalmaz továbbá más paramétereket is a képszinkron és a keret előállításához. Az első sorparaméter-blokk az állapotsor kijelzésnek van fenntartva, ami egy rögzített RAM területen van. A többi 27 sorparaméter-blokk bármelyik lap bármelyik részét megjelenítheti, de a kijelzés mindig 9 képpontnyi függőleges egységben történik. Eredetileg mind a 28 sorparaméter-blokk "üres"-ként van létrehozva (vagyis mindegyik színe olyan mint a képernyőkereté). Az EXOS változók területén található LP_POINTER változó a sorparaméter-táblázat elejére mutat.

2.1. Kijelzési módok

A kijelzési módot a MODE_VID nevű EXOS-változó határozza meg, amelynek megengedett értékei a következők:

0
- Hardver szövegmód (42 kar/sor értékig)
1
- Nagyfelbontású képpont grafika.
2
- Szoftver szövegmód (84 kar/sor értékig)
4
- Kisfelbontású képpont grafika
15
- Attribútum grafika

Minden más érték (.VMODE) hibát okoz, ha kísérletet teszünk csatorna megnyitására. A három grafikus mód a NICK chip PIXEL, LPIXEL és ATTRIBUTE módjainak felel meg (l. külön a NICK chip specifikációt is).

2.2. Színmódok

Minden videolapnak a kijelzési mód mellett, van szín módja is. A szín módot a COLR_VID nevű EXOS-változó specifikálja. E változó megengedett értékei a következők:

0
- Két szín üzemmód
1
- Négy szín üzemmód
2
- 16 szín üzemmód
3
- 256 szín üzemmód

Minden más érték modulo 4 szerint redukálódik, ezért hiba nem keletkezik. A szöveg (text) módoknál csak a 2 szín mód alkalmazható, kivéve ha a karakterkészlet elemeit valamilyen tömb grafika előállítása céljából át nem definiáltuk. Az attribútum grafika módot ugyancsak a 2 szín móddal kell használni, noha 16 szín fog ténylegesen rendelkezésre állni a lapon.

2.3. Lapméret

A létrehozandó lap méretét az X_SIZ_VID és Y_SIZ_VID nevű EXOS-változók határozzák meg. A függőleges méret karaktersor értékben van előírva. Ez tetszés szerinti lehet 1 és 255 között, bár a képernyőn egyszerre csak 27 sor kerül megjelenítésre. A vízszintes méret kis felbontású karakterszélességi értékben van definiálva, 1 és 42 közé eső szám lehet. Az érvénytelen értékek (.VSIZE) hibát okoznak, ha megnyitunk egy csatornát.
A videolap méretének lekérdezésére a speciális funkcióhívás áll rendelkezésre. Ez megadja a sorok számát, valamint a soronkénti karakterek számát. A sorok száma ugyanaz lesz, mint az Y_SIZ_VID EXOS-változó értéke volt a csatorna megnyitásakor. A kapott karakter/sor érték a soronkénti karakterek tényleges száma lesz. Ezért szoftverszöveg üzemmód esetén ez kétszerese annak az értéknek, amivel a X_SIZ_VID változó a csatorna megnyitásakor rendelkezett.
A hívás paraméterei:

2.4. Kijelzésvezérlés

A videolapok a képernyőn mindaddig nem kerülnek megjelenítésre, ameddig a felhasználó azt kifejezetten nem kéri. Ezt a kérést a speciális funkcióhívás jelenti a csatorna felé. A szóban forgó hívás paraméterei a következők:

A három sorparaméter mindegyike sor egységben adott, mivel az előírt képernyőterületnek egész számú sorparaméter-blokknak kell lennie. A megjelenített lap fölülír bármit, ami korábban a képernyőnek ezen a területén volt. Ha a csatornát ezt követően lezárjuk, akkor a képernyőnek mindazon -területei, amelyek a lezárt csatornát megjelenítették felveszik a képernyőkeret színét (úgy, hogy a margót beírják a lezárás által érintett sorparaméter blokkokba).
A képernyőn elfoglalt helyzetre vonatkozóan (az E-regiszterben) megadott 1 érték a képernyőn közvetlenül az állapotsor alatt lévő sorra utal. Nincs mód az állapotsor fölülírására, mivel a rendszer a nulla értéket nem fogadja el.
Ha a lapon elfoglalt helyzetre vonatkozóan (a C-regiszterben) nulla értéket adunk meg, akkor a képernyőnek a másik két paraméter által meghatározott része láthatatlanná válik (vagyis színe olyan lesz, mint a kereté).
Ha a funkcióhívás paraméterei közül bármelyik bármely okból érvénytelen, akkor (.VDISP) hibajelzést kapunk.

3. A video üzemmódok használata

Amikor egy csatornát megnyitunk, akkor a videokezelő megfelelő nagyságú RAM-ot szerez az EXOS-tól a lap kezeléséhez. Ebből bizonyos mennyiség (128 byte) a belső változóké; két-két általános célú byte tartozik a lap minden egyes sorához. A fennmaradó rész a kijelzési memória területe, amelynek nagysága a kijelzési módtól és a lapmérettől függően változik.
Meglegyezzük, hogy bármely kijelzési módnál és lapméretnél a négy lehetséges színmód mindegyike ugyanolyan nagyságú RAM-területet fog használni, mivel ezek a felbontást a színek számának rovására növelik anélkül, hogy a szükséges memóriaméretet befolyásolnák.
Rendelkezésünkre áll egy speciális funkcióhívás, ami a szóban forgó lapra vonatkozóan megadja a kijelzési-RAM tényleges címét. Gyakorlatilag a hívás két címet küld eredményként, mivel bizonyos üzemmódok két különböző memóriaterületet használnak. A címek pontos jelentését az egyes üzemmódokkal összefüggésben még ebben a fejezetben fogjuk ismertetni. A hívás által eredményként megadott címek olyanok, ahogy azt a NICK chip látja. így egy cím,

ami
a 0000h ... 3FFFh tartományba esik,
  a 0FCh RAM-szegmensnek,
ami
ami a 4000h ...-7FFFh tartományban van,
  a 0FDh RAM-szegmensnek felel meg, és így tovább, a 0FEh és 0FFh szegmensek vonatkozásában is.

Megjegyezzük, hogy egy videocsatorna kijelzési-RAM területét az EXOS-nak módjában áll mozgatni és emiatt a hívás által visszaküldött címek nem mindig maradnak ugyanazok. Azokat a műveleteket, amelyeknek hatására a csatorna-RAM területek mozgása bekövetkezhet, az EXOS-kernel specifikáció című fejezetben már ismertettük. Ezek közül legfontosabbak a más videocsatornák megnyitására és lezárására, valamint a felhasználói perifériák, vagy rezidens rendszerbővítők csatlakoztatására vonatkozó műveletek. Ha ilyen típusú műveleteket hajtottunk végre, akkor ezt a speciális funkcióhívást az új címek megszerzésére meg kell ismételni.
A következő fejezetekben, ahol a RAM igények előírásában a MAGASSÁG és SZÉLESSÉG fogalmakra hivatkozunk, ott ezek az értékek az Y_SIZ_VID és X_SIZ_VID változók tényleges értékei. így például egy teljes képernyőméretű szoftver szöveglap szélessége 42, holott a képernyő egy sorában valójában 84 karakter van.
A megadott RAM igények azt a RAM nagyságot jelentik, amit a videokezelő kérni fog. Ezen kívül minden egyes laphoz tartozik egy 16 byte-os csatornaleíró is, amit az EXOS utal ki.

3.1. Hardver szövegmód (0-s mód)

Hardver szövegmódban a lapon levő minden egyes karakterpozícióhoz egy RAM-byte-ot utal ki a rendszer. Ezek a byte-ok tartalmazzák a lapon megjelenített karakter kódjait, amit a NICK chip a betűkészlet felhasználásával karakteralakká fordít le a kijelzésekor. Ha a kijelző-RAM-ban lévő karakterkód legfelső bitje beállított állapotú, akkor ez a karakter a 0 és 1 helyett a 2 és 3 palettaszínek felhasználásával lesz megjelenítve.
Eredendően a képernyő a lap bal felső karakterével kezdődik, majd az első sorban folytatódik, amit a második sor követ és így tovább lefelé a lapon. Ha azonban bármilyen görgetési (scrolling) műveletet már végrehajtottunk, akkor a sorok rendje a lapon eltérő lesz és így a képernyő első byte-ja az egyik, de nem feltétlenül a legfelső sor első karaktere lesz. A sorok tetszés szerinti sorrendbe állíthatók és még a lap törlése sem fogja újrarendezni őket.
A RAM igény és a cím paraméterek a következők:

DE = BC = a kijelző RAM kezdete (ASCII térkép)
Összesített RAM igény = 128 + 2 * MAGASSÁG + SZÉLESSÉG * MAGASSÁG.

3.2. Szoftver szövegmód (2-es mód)

A szoftver szövegmód a lapnak egy ASCII másolatát fenntartja, ami a hardver szöveg üzemmódban használt memóriatartalomnak megfelel. Ez a lapon lévő minden egyes karakterhez egy byte-ot jelent. Ezen kívül van a lapról egy teljes bittérkép is. Maga a videokezelő a karakteralakokat ebben a bittérképben építi fel az adott méretű és típusú jelkészletből. Ezt a bittérképet használja a NICK chip a kijelzés előállítására, az ASCII térképet viszont csak belsőleg használja a videokezelő szoftver.
A bittérkép kezdetben közvetlenül megfelel annak, amit a képernyőn látunk (feltéve, hogy a videolap megjelenített); minden egyes képpontnak egy bit felel meg. Így az első byte megfelel a lap legfelső sorában az első nyolc képpontnak, ami az első karakter legfelső sora. A következő byte megfelel a következő karakter legfelső sorának és így tovább, ameddig az első karaktersor végére nem érkezünk. Az ez után következő byte megfelel az első karakter második képsorának. Ez így folytatódik kilenc képsoron keresztül, amivel aztán teljessé válik az első karaktersor. Az ezután következő karaktersorok ugyanezzel a módszerrel épülnek fel.
A görgetéssel kapcsolatos magyarázatok egyaránt vonatkoznak a szoftver- és a hardverlapokra. A görgetési műveletek a lapon lévő sorokat tetszés szerinti sorrendbe átrendezhetik. Az ASCII-térkép és a bittérkép mindig azonos módon rendeződik át.
Amikor a videokezelő karaktereket tesz át az adott méretű és típusú jelkészletből egy szoftver szöveglapra, akkor maszkolja minden byte legfelső és legalsó bitjét és színinformációkat szúr ezekbe a bitekbe a bittérképen. E két érték vezérli, hogy mely palettaszíneket kell alkalmazni a kérdéses byte kijelzéséhez (a karakternek mind a kilenc byte-ja azonos színű lesz). A bitek jelentése a következő:

0. bit
7. bit
a felhasznált palettaszínek
0
0
0 és 1
0
1
2 és 3
1
0
4 és 5
1
1
6 és 7

A szoftver szövegoldal RAM igénye és cím paraméterei:

BC = A bittérkép kezdetének címe (a bal felső karakter legfelső képsora)
DE = Az ASCII-térkép kezdetének címe (bal felső karakter)
Összesített RAM igény = 128 + 2 * MAGASSÁG + 20 * MAGASSÁG * SZÉLESSÉG

3.3. Képpont grafikamódok (1-es és 5-ös mód)

A két képpont (pixel) grafikai mód a nagyfelbontású (1-es) mód és a kisfelbontású (5-ös) mód. A két mód közötti egyetlen különbség az általuk használt RAM terület mennyiségében és igy a felbontásban van. A képpont grafikai lapnak olyan RAM-területe van, ami a képernyő közvetlen bittérképe. Az első byte az oldal bal felső sarkának felel meg, a következő byte a legfelső képsor második byte-jának, és így folytatódik az első képsor végéig. Ez ismétlődik a következő képsorban, majd folytatódik mindaddig, ameddig el nem érjük az oldal alját.
A tárgyalt byte-oknak képpontokká történő leképzése a szín üzemmódtól függ, amit külön a NICK chip specifikációban írunk le.
A kisfelbontású képpont módban a képernyő teljes szélessége 42 byte, a nagyfelbontású képpont módban pedig 84 byte. A nagyfelbontású képpont mód tehát ugyanazon képernyőterület lefedéséhez és kezeléséhez kétszeres mennyiségű RAM területet használ fel.
A két képpont grafikai mód címparaméterei és RAM igénye:

BC = a kijelző-RAM bal felső byte-jának címe DE = határozatlan
Összesített RAM igény (kisfelbontás) = 128 + 2 * MAGASSÁG + 9 * SZÉLESSÉG * MAGASSÁG
Összesített RAM igény: (nagyfelbontás) = 128 + 2 * MAGASSÁG + 918 * SZÉLESSÉG * MAGASSÁG

3.4. Attribútum grafikamód (15-ös mód)

Az attribútum grafikai lap két egyenlő nagyságú RAM-területet igényel. Ezek közül az első (a képpont adatterület) a videolapnak bittérképe, ami egy az egyben megfelel a két színt használó kisfelbontású képpont lap bittérképének (mindegyik byte nyolc képpontot határoz meg). A második RAM-terület az attribútum adatok területe. Az attribútum adatterületen lévő minden egyes byte két palettaszínt határoz meg, ami a 0...15 tartományba esik és amelyeket a TINTA és a PAPÍR attribútum néven szoktunk emlegetni. A megfelelő- képpont adatbyte-ban lévő nyolc bit határozza meg, hogy melyik képpont PAPÍR, illetve TINTA színű.
Az attribútum adatterületen lévő byte felépítése a következő:

Az attribútum grafikai lap címparaméterei és RAM igénye:

BC = képpont adatterület kezdetének címe
DE = attribútum adatterület kezdetének címe.
Összesített RAM igény = 128 + 2 * MAGASSÁG + 18 * SZÉLESSÉG * MAGASSÁG.

4. Karakter output

A képernyőkezelő támogatja mind az egyetlen karaktert író, mind pedig a blokkírási EXOS funkcióhívásokat. A blokkírás teljesen egyenértékű azzal, mintha az összes karaktert egyenként írtuk volna, de sokkal gyorsabb művelet, mivel elkerüli azokat a veszteségidőket, amiket az okoz, hogy minden karakterhez az EXOS-on keresztül jutunk.

4.1. Karakterek kiíratása

A rendszer minden 31 fölötti karakterkódot nyomtatható karakterként kezel és a videooldalon a megfelelő helyre teszi. Minden üzemmódnak van kurzora, ami a karakter kiírásakor továbbmozog, de a részletek a különböző üzemmódoktól függően változnak.
A karakterek bitképei rögzített, adott méretű és típusú jelkészletben vannak tárolva, és az ASCII karakterkészletre inicializáltak. Mindegyik karakter 8 bit szélessége és kilenc bit mélysége, beleértve a karakterek és a sorok közötti üres helyeket is. A felhasználó az ESCAPE szekvencia segítségével bármelyik karaktert átdefiniálhatja.
A 32-től 127-ig terjedő karakterkódok a jelkészlet megfelelő elemét jelenítik meg. A 128-tól 255-ig terjedő karakterek kiírásra olyan, mint a 0-tól 127-ig terjedő karaktereké. Így a 160-as (128 + 32) karakter kiírása egy videolapra ugyanazt az eredményt adja, mint a 32-es karakteré. A 159-es (128 + 31) karakterkód viszont - ami a jelkészletből a 31-es számú karaktert írja ki a lapra - semmit sem fog csinálni, mivel a 31-es karakter értelmezés szerint egy vezérlőkód, és nincs semmilyen hatása.

4.1.1. Szövegmódú karakter kiírása

A szöveglapok (0-s és 2-es mód) egyetlen, szöveg-koordinátában meghatározott kurzorral rendelkeznek. A kinyomtatható karakter ebben a pozícióban íródik ki, miközben a kurzor a következő karakterpozícióhoz mozog. A sor végén a kurzor automatikusan a következő sor elejére ugrik és automatikus görgetési műveletet is végrehajt, ha a képernyő alsó sora telt be (ez az automatikus görgetés letiltható).

4.1.2. Képpont grafikai módú karakter kiíratása.

A képpont grafikai lapok egy grafikus koordinátákkal meghatározott sugármutatóval rendelkeznek. A nyomtatható karakter ebben a sugárpozícióban megjelenítésre kerül, a sugár pedig tovább mozog a következő karakterpozícióhoz, ami a következő sor elejére való ugrást jelenti, ha a sugár egy sor végén tartózkodott. Karaktereket tetszés szerinti képpontpozícióban - és nemcsak pontosan a karakterhatároknál - lehet kiíratni. Nincs semmilyen görgetési lehetőség. Ha a sugár annyira közel van az oldal aljához, hogy a karaktert nem tudja teljesen beírni a sorba, akkor nem jelez ki semmit.
A karakterek az aktuálisan érvényes tinta színnel íródnak ki, függetlenül attól, hogy a sugár be-, vagy ki- állapotú. A karakter a biteknek a jelkészletből való kiolvasása révén íródik ki. Ha a bit beállított állapotú, akkor az aktuális vonalmóddal és tintaszínnel egy képpont rajzolódik a képernyőre. Ha a bit törölve van, akkor a megfelelő képpont változatlan marad. Így a karakter képpontjai a képernyő régi tartalmához hozzáadódnak, nem pedig helyettesítik azokat.
A karakter alakja mindegyik színmódban helyes lesz, arányuk viszont változik a különböző üzemmódokban. Az olvashatóság javítása érdekében a karaktermagasság a 16 és 256 színű módokban megduplázódik.

4.1.3. Attribútum grafikai módú karakter kiírása

Az attribútum grafikai lap két helymutató kurzort tart nyilván. Egy szöveg-koordinátákkal megadott szövegkurzort és egy külön grafikus sugárkurzort, ami grafikai koordinátákkal meghatározott. A karakterek a szövegkurzor pozíciójában fognak elhelyezkedni. A sor végénél a szövegkurzor a következő sor elejére ugrik, a lap végéről viszont visszamegy a lap bal felső sarkába - görgetés nincs.
A karakter megjelenítési módja a lapra érvényes attribútum jelzőbyte aktuális értékétől függ. Ezt a byte-ot escape szekvenciával lehet beállítani, és a későbbiekben részletesen ismertetjük. Lényegében azt vezérli, hogy a karakterek kiíratása vagy a grafikák megrajzolása az attribútum és képpont adatok mely szakaszára gyakorol hatást.

4.2. Vezérlőkódok és escape szekvenciák

A 0-tól 31-ig terjedő tartományba eső karakterek vezérlőkarakterek és nem nyomtathatók ki. A videolapok az üzemmádtól függően ezek némelyikét értelmezik. A meg nem értett kódok egyszerűen figyelmen kívül maradnak. Speciális vezérlőkód az ESCAPE (ASCII 1Bh) kód, amit különböző funkciók elvégeztetése céljából egy ún. escape szekvencia elindítására használunk.
Az alábbiakban a különböző üzemmódok által értelmezett vezérlőkódok és escape szekvenciák listáját ismertetjük. Ezek közül a bonyolultabbakat elmagyarázzuk a következő alfejezetekben.

4.2.1. Az összes videolapra értelmezett kódok

CTRL Z (1Ah) = A teljes lap törlése és a kurzor visszavitele a kezdő pozícióba.
CTRL J (0Ah)
= Soremelés. A kurzort a következő sorba mozgatja. Görgetést végez, ha a képernyő alján tartózkodik szövegmódban, feltéve, hogy a görgetési funkció engedélyezett.
CTRL M (0Dh) = Kocsi-vissza. Visszaviszi a kurzort az aktuális sor elejére.
CTRL CTRL (1Eh) = Kurzor/sugár a kezdő pozícióba (ASCII RS).
esc K = karakter definiálása
esc C = az összes palettaszín beállítása
esc c = egy palettaszín beállítása
esc I <n> = tintaszín beállítása <n> -re
esc P <n> = papírszín beállítása <n> -re
esc = <y> <x> = kurzor pozíciójának beállítása

4.2.2. Szöveglapokra értelmezett kódok

CTRL Y (19h) = törlés a sor végéig. A kurzort nem mozgatja.
CTRL H (08h) = kurzor balra (ASCII BS)
CTRL I (09h) = kurzor jobbra (ASCII TAB)
CTRL K (0Bh) = kurzor fel (ASCII VT)
CTRL V (16h) = kurzor le (ASCII SYN).
esc ? = kurzorpozíció olvasása, Az attribútum grafikai mód is kezeli.
esc. <n> = kurzorkarakter beállítása az <n> karakterkódra
esc M <n> = kurzor beállítása az <n> palettaszínre
esc O = kurzorkijelzés bekapcsolása
esc o = kurzorkijelzés kikapcsolása
esc S = automatikus görgetés bekapcsolása
esc s = automatikus görgetés kikapcsolása
esc U <m> <n> = az (m-20h)-tól (n-20h)-ig terjedő sorok görgetése fölfelé, m< =n.
esc D <m> <n> = az (m-20h)-tól (n-20h)-ig terjedő sorok görgetése lefelé, m< =n.

4.2.3. Grafikus lapokra értelmezett kódok

esc A <xx> <yy> = sugár pozícionálása az (xx,yy) koordinátákra,
ahol xx és yy 16 bites hexadecimális számok, amelyekben első helyen az alsó byte szerepel.
esc R <xx> <yy> = relatív sugármozgás az (xx,yy) értékkel.
esc @ = sugárpozíció olvasása
esc S = sugár bekapcsolása
esc s = sugár kikapcsolása
esc . <n> = sugár beállítása az <n> vonaltípusra.
esc M <n> = sugár beállítása az <n> vonalmódra.
esc a <n> = attribútum jelzőbyte beállítása <n> -re. Csak az attribútum módban megengedett.
esc F = grafikus kitöltés
esc E = ellipszis rajzolása

5. ESCAPE szekvenciák

5.1. A kurzor pozícionálása

A kurzor pozícionálását végző escape szekvencia minden üzemmódban működik. Szövegmódban egyszerűen a kurzort mozgatja. Attribútum grafika módban a szövegkurzort mozgatja, viszont nem törődik a grafikus sugármutatóval. Képpont grafika módokban a grafikus sugármutatót a megfelelő szövegkoordinátákhoz mozgatja és így karakterhatárra fog állni.
Az escape szekvencia formája:

esc = <y> <x>

A kurzort az (y-20 h) sorra és az (x-20 h) oszlopra állítja. Ha az <x> vagy az <y> egyenlő 20h-val (ilyenkor a sor, vagy az oszlop beállítása nulla), akkor az a koordináta változatlan marad. Ez lehetővé teszi külön csak sor vagy oszlop beállítását is.

5.2. Karakter definiálása

Ez az escape szekvencia lehetővé teszi, hogy a felhasználó a 256 karakter közül egyet átdefiniáljon. Noha a szekvencia egy specifikus csatornára kerül, gyakorlatilag hatással van a globális karakterkészletre is így befolyást gyakorol más csatornákra is. Az lapon már megjelenített karakterekre csak a hardver szöveglapok esetén gyakorol hatást. Más üzemmódokban csak a következő kiírt karaktereket befolyásolja.
Az escape szekvencia formája:

esc K <n> <r1> <r2> <r3> <r4> <r5> <r6> <r7> <r8> <r9>

Ahol:
<n> = karakterszám (0 ... 255)
<r1> ... <r9> = a karakter kilenc sorának byte-jai. <r1> a legfelső sor.
Megjegyzés: A nagyfelbontású szövegmódban ténylegesen a karakterbyte-nak csak-a középső hat bitjét jeleníti meg, mivel a másik kettő maszkolva van és a színválasztás vezérlésére alkalmas.

5.3. Palettaszínek

Minden videolapnak van egy nyolcszínű palettája, ami a csatorna megnyitásakor egy hasznos színkészletre redukálódva inicializálódik. Ezzel az escape szekvenciával a felhasználónak módja van a színeket változtatni.
A szekvencia formája:

esc C <c> <c> <c> <c> <c> <c> <c> <c>

Mindegyik <c> a palettaszínek egyikét jelöli ki, és belőlük mindig nyolcat kell megadni.
Van egy másik escape szekvencia is, amivel csak egy palettaszínt lehet megváltoztatni. Ennek formája a következő:

esc c <n><c>

Ahol:
<n> = a 0-tól 7-ig terjedő palettaszín-szám,
<c> = új a palettaszín értéke.
Amikor új palettaszíneket választunk, akkor aktualizálódik minden olyan sorparaméter-blokk, ami erre a videolapra vonatkozik, és így a képernyőn a színek megváltoznak.

5.4. Tinta és papír szín

A felhasználó külön escape szekvenciákkal előírhatja mind a tinta (vagyis a karakter), mind a papír (vagyis a karakterháttér) színét. Minden video üzemmódban a Tinta alapértelmezés szerinti színe 1, a papír színe pedig 0.
Képpont grafikai lapoknál a megengedett tinta és papír színek a szín módtól függenek:

0 vagy
1
2 szín üzemmódban,
0 ...
3
4 szín üzemmódban,
0 ...
15
16 szín üzemmódban,
0 ...
255
256 szín üzemmódban.

A képpontok mindig az aktuális tintaszínnel rajzolódnak ki. A megjelenítés papírszíne csak az oldal törlésekor változik meg.
Attribútum grafika mód esetén a tinta és a papír színeknek a 0 ... 15 tartományban kell lenniük és ezek vezérlik azt, hogy milyen színek kerüljenek az attribútumbyte-okba. A kérdéssel összefüggésben l. még az attribútum jelzőbyte-okkal foglalkozó fejezetet is.
A négy, 16 és 256 színű szövegmódokban a tinta és papír színeknek nincs semmilyen hatásuk, miután a palettaszíneket minden egyes képponthoz közvetlenül a karakterkészletben lévő bitekből határozzuk meg. Gyakorlatilag azonban mégis bizonyos kölcsönhatásban vannak a kijelzett színekkel és legbölcsebb eljárás az, ha hagyjuk, hogy alapértelmezés szerinti értékeik legyenek beállítva. Ezek az üzemmódok csak akkor hasznosak, ha a karaktereket valamilyen tömbgrafikai forma biztosítására átdefiniáltuk.
A 2 színű hardver szövegmódban a tinta és a papír színek mindig (0,1) vagy (2,3) beállításúak. Ha megváltoztatjuk akár a tinta, akár pedig a papír színét, akkor a másik is megfelelően változni fog.
A 2 színű szoftver szövegmádban négy színpár áll rendelkezésre, nevezetesen a (0,1), (2,3), (4,5) és (6,7) párok. A karakterek mindig az aktuálisan kiválasztott állapotú színpárral kerülnek kijelzésre.

5.5. Grafikus vonaltípus

Grafikai lap esetén a vonaltípust megfelelő escape szekvencia segítségével lehet beállítani. A vonaltípus beállítása a vonal és az ellipszis rajzolásra van hatással, de a karakter megrajzolására vagy kitöltésére nem. A vonaltípust meghatározó byte értékei a következők:

1 - folytonos vonal (alapértelmezés),
2 ...14 - különböző típusú szaggatott és pontozott vonalak.

5.6. Grafikus vonalmód

Escape szekvencia határozza meg a vonal mód byte-ot, melynél az értékek jelentése a következő:

0 = PUT (felülírás) típusú rajzolás (alapértelmezés)
1 = OR (vagy) típusú rajzolás
2 = AND (és) típusú rajzolás
3 = XOR (kizáró vagy) típusú rajzolás

Képpont grafikai lapok esetén, amikor egy képpontot rajzolunk, az aktuális tintaszín a képpont régi színével kombinálódik a vonalmód által kiválasztott művelet szerint, majd ezután tárolódik.

5.7. Az attribútumjelzök byte-ja

Az attribútumjelzők byte-ját csak az attribútum grafikai lapok használják. Nyolc jelzőbitből áll, 4 a grafikai elemek (pontok, vonalak, ellipszisek és helykitöltések) rajzolására, 4 pedig karakterek rajzolására alkalmas. Az alapvető művelet képpont felvitelének művelete.
Amikor attribútum módban egy képpontot felrajzolunk, három dolgot tudunk befolyásolni. Rendelkezésünkre áll a bit a képpont adatbyte-jában, ami megfelel a szóban forgó képpontnak, valamint rendelkezésünkre áll a két szín (a tinta és a papír színe) az attribútum byte-ban, amelyik megfelel a kérdéses képpont adatbyte-nak. Az attribútum jelzők byte-ja e három tétel mindegyikéhez egy-egy jelzőt (flag) állít, ami meghatározza, hogy a hatás érvényesül vagy sem egy képpont felrajzolásakor. Ha a tinta attribútumra kell hatást gyakorolni, akkor az az aktuális tintaszínre fog beállítódni. Ha a papírattribútumra kell hatást kifejteni, akkor az az aktuális papírszínre fog beállítódni.
A képpontadat meglehetősen bonyolult. Feltételezzük, hogy a képpontadatra kívánunk hatni. Ez az attribútum byte-ban lévő bittel és az aktuális vonalmóddal közösen lehetséges. Karakterek felrajzolása esetén, ha ez a bit beállított, akkor a karakter komplementálódik, mielőtt felrajzolásra kerülne. Grafikák rajzolása esetén, ha a megfelelő bit beállított, akkor egy nulla íródik a képpont bitbe a szokásos 1 helyett. Amikor grafikákat (de nem karaktereket) rajzolunk, akkor a bit gyakorlatilag közvetlenül nem a képpont byte-jába íródik, hanem az aktuális vonal üzemmódnak megfelelően kombinálódik a bit aktuális értékével. Ez például azt jelenti, hogy a kizáró vagy típusú rajzolás továbbra is működik.
Az attribútum jelzők byte-jának legfelső négy bitje a karakterek felrajzolását, az alsó négy bitje pedig a grafikák rajzolását vezérli. Az összes bit vonatkozásában normális állapot a nulla, melynek eredményeként a befolyás hatásos minden attribútum és képpont adat esetén, a rajzolás megszokott módon történik. A bitek funkció-hozzárendelései az alábbiak:

7. bit - karaktereknél használja a papír attribútumokat.
6. bit - karaktereknél használja a tinta attribútumokat.
5. bit - karaktereknél használja a képpontadatokat.
4. bit - a karakter komplementálása rajzolás előtt.
3. bit - grafikánál használja a papír attribútumokat.
2. bit - grafikánál használja a tinta attribútumokat.
1. bit - grafikánál használja a képpont adatokat.
0. bit - grafika rajzolása 1-es helyett nullával.

Megjegyezzük, hogy kitöltéskor az attribútum byte 1. bitjét törölt állapotúnak tételezzük fel, függetlenül a tényleges állapottól. Erre azért van szükség, mert ha a képpont adatokat nem vennénk figyelembe, a kitöltési algoritmus soha nem fejeződne be.

5.8. A grafikus kitöltés - kifestés

A grafikus kitöltő parancs egy egyszerű escape szekvencia, ami az aktuális sugárpozíciótól kezdve kitöltési műveletet végez. Az aktuális tintaszínnel tölt bármely olyan határvonalig, amelynek színe eltér az aktuális sugárpozíció színétől. Kezeli a konkáv (homorú) alakzatokat is és vizsgálja, hogy a művelet eljutott-e a videolap széléhez, Ha elfogy a veremmemória, akkor esetleg nem tudja kifesteni a teljes idomot, de ennek csak rendkívül bonyolult alakzatok esetén szabad bekövetkeznie, mivel "szemétgyűjtést" végez, ha megtelik.

5.9. Grafikus ellipszis rajzolása

Az ellipszist rajzoló rutinnak két 16 bites paraméterre van szüksége (ahol elől állnak az alsó byte-ok) és amelyek az x és az y sugarakat határozzák meg. Kör rajzolásánál ezeknek egyező értékeknek kell lenniük. Az ellipszis középpontja az aktuális sugárpozícióban lesz. Az escape szekvencia formája:

esc E <xx> <yy>

6. Karakterolvasás

6.1. Egyszerű karakterbeolvasás

Amikor karaktert olvasunk a videokezelőről, akkor az eredmény az üzemmódtól függ.
Szövegmódban a kurzor pozíciójában lévő karakter ASCII kódja visszajön a kurzor mozgása nélkül. Grafikus üzemmódban az aktuális sugárpozícióban lévő képpont palettaszíne kerül vissza. Ez:

0 vagy 1
0 ... 3
1 ... 15
0 ... 255
a 2-szín módban,
a 4-szín módban,
a 16-szín módban vagy az attribútum módban,
a 256-szín módban.

6.2. A kurzor helyzetének kiolvasása

A műveletet végrehajtó escape szekvenciát a szöveg és az attribútum grafikai módok támogatják. A szekvencia arra készteti a videocsatornát, hogy a soron következő két karakternek a kérdéses csatornából való kiolvasásakor megadja az aktuális kurzorkoordinátákat. A koordinátákat ugyanúgy kapjuk vissza, mint ahogy azokat a kurzor pozíciójának meghatározásához előírtuk, azaz hozzájuk van adva egy 20h értékű eltolás.

6.3. A sugárpozíció olvasása

Ezt a műveletet csak a grafikus lapok támogatják (a képpont és attribútum grafikai módok). Az escape szekvencia: esc@ , ami arra készteti a csatornát, hogy a videolapról olvasott következő négy byte-ban megadja az aktuális grafikai sugárpozíciót. A koordinátákat ugyanabban a formátumban kapjuk vissza, mintha azokat mi írtuk volna elő egy abszolút sugárpozíció meghatározására.
A sugárpozíció koordinátáit BASIC-ből az alábbi eljárással kérdezhetjük le:

100 GRAPHICS
110 NUMERIC POSX,POSY
120 PLOT 456,234
130 CALL GRXY(101,POSX,POSY)
140 PRINT POSX,POSY
150 DEF GRXY(CH,REF X,REF Y)
160   PRINT #CH:CHR$(27);"@";
170   GET #CH:XL$:GET #CH:XH$
180   GET #CH:YL$:GET #CH:YH$
190   LET X=ORD(XL$)+256*ORD(XH$)
200   LET Y=ORD(YL$)+256*ORD(YH$)
210 END DEF

7. Vegyes információk

7.1. Az állapotsor

Mint azt már korábban említettük, létezik egy speciális sor (állapotsor), ami nem tartozik az alaplap/csatorna struktúrába. Az első sorparaméter-blokk ezen állapotsor részére fenntartott és soha nem szolgál semmilyen videolap megjelenítési célt. Az EXOS-változók területének egy rögzített címén található kétbyte-os LP_POINTER nevű változó tartalmazza az említett sorparaméter-blokk kezdetének címét. Ezt használja a kazettakezelő az állapotsor palettaszíneinek módosítására, amivel a kazettás egység szintmérési kijelzését biztosítja. Más programok is felhasználhatják az állapotsort kijelzésre.
Van egy ST_FLAG nevű EXOS-változó is, amelynek hatására az állapotsor megjelenik, ha a változó nulla és eltűnik a képernyőről, ha értéke nem nulla (ilyenkor a képernyőnek ez a része felveszi a képernyőkeret színét). Ezt a feladatot a videokezelő úgy hajtja végre, hogy minden megszakítás alkalmával megvizsgálja az ST_FLAG tartalmát és a fenntartott sorparaméter-blokkban megfelelően beállítja a margókat.
Az előzőeken kívül, az EXOS-változók területének fix címén van egy ST_POINTER nevű kétbyte-os mutató; ez annak a 40 byte-os RAM-területnek a címét tartalmazza, amelyben az állapotsor karakterei vannak. Ez a pointer a Z-80-as 2-es lapjára mutat és a RAM ezen a címen lesz a 0FFh szegmensben. A felhasználó vagy a külső periféria úgy tud hozzáférni az állapotsorhoz, hogy kiveszi a címét ebből az ST_POINTER nevű változóból. A beépített perifériák közvetlenül is elérhetik az ST_LINE nevű közös szimbólum használatával, ami az állapotsor-RAM kezdete (a Z-80-as 2-es lapon a 0FFh szegmensben).

7.2. Képernyőkeret és a FIXBIAS regiszter

A BORD_VID nevű EXOS változó definiálja az aktuális keretszint. Tartalma minden megszakításkor kiíródik a NICK chip keretregiszterébe. A keret szinte így az EXOS változó átírásával egyszerűen megváltoztatható.
A NICK chipben van egy FIXBIAS regiszter is, amelyet az EXOS minden video megszakításakor aktualizál. Ennek értéke számos különböző célt szolgál, és három EXOS változó alapján állítja össze a rendszer.
A BIAS_VID nevű EXOS változó felső 5 bitje íródik a FIXBIAS regiszter alsó 5 bitjébe. 16 színű módban ez vezérli a 8 ... 15 palettaszíneket. A FIXBIAS regiszter 5. bitje a MUTE-SND változóból ered, és a belső hangszóró engedélyezésére / tiltására szolgál. A FIXBIAS regiszter felső 2 bitjébe a SPRITE változó alsó 2 bitje kerül. Ez vezérli a bővítő sín külső színbemeneteinek prioritását, és szellem (sprite) generálásánál használható.

7.3. A karakterkészlet alapállatba állítása

Mint már korábban említettük, a videokezelő 128 karakteres jelkészletet használ minden szöveglap és grafikus lap karakterkiírására. A karakterkészlet hidegindításkor alakul ki és nem inicializálódik újra a soron következő periféria inicializálások alkalmával. Ha a jelkészlet valamely karakterét újradefiniáltuk, akkor a melegindítási műveletet, vagy az, hogy a vezérlés átkerül egy új alkalmazói programra, nem okoz változást.
A jelkészletet egy tetszőleges videocsatornára kiadott speciális funkcióhívással tudjuk alapállapotába állítani. Ez a hívás visszaállítja mind a 128 karakter eredeti alakját.
Megjegyezzük, hogy ez azonnali hatással van a hardver szövegoldalon lévő minden karakterre, viszont csak az ezután kiírt karakterekre van hatással a szoftver szöveg- vagy a grafikuslap esetén. A hívás paraméterei:

8. Video-összefoglaló

A színek összeválogatásában ez a program nyújthat segítséget.

8.1. EXOS-hívások

CSATORNA MEGNYITÁSA / LÉTREHOZÁSA.
Azonos kezelés. Támogatják a többcsatornás funkciókat. A periférianév: "VIDEO:". A file-név és az egységszám figyelmen kívül marad. Megnyitás előtt fel kell tölteni a MODE_VID, COLR_VID, X_SIZ_VID és Y_SIZ_VID EXOS-változókat.

CSATORNA LEZÁRÁSA / MEGSZÜNTETÉSE.
Azonos kezelés.

KARAKTER / BLOKK OLVASÁS.
Válaszként megadják a kurzor vagy a képpont színét. Használhatók a kurzor / sugárhelyzet leolvasására.

KARAKTER / BLOKK ÍRÁS.
Megjelenítik a nyomtatható karaktereket. Speciális lehetőségekre számos vezérlőkódot és escape szekvenciát értelmeznek.

ÁLLAPOT OLVASÁS.
Mindig C = 0-t küld eredményként.

ÁLLAPOT BEÁLLÍTÁS.
Nincs kezelve.

SPECIÁLIS FUNKCIÓ.
@@ DISP = 1 - lap megjelenítése a képernyőn.
@@ SIZE = 2 - lap üzemmódjának és méretének vissza adása.
@@ ADDR =3 - video-RAM címének visszaadása
@@ FONT = 4 - jelkészlet alapállapotba állítása.

8.2. EXOS-változók

MODE_VID = video üzemmód
COLR_VID = színüzemmód
X_SIZ_VID = karakter/sor (1 ... 42)
Y_SIZ_VID = sorok lapon
ST_FLAG = az állapotsor megjelenítéséhez az értéke nulla.
BORD_VID = a képernyő keretszíne.
BIAS_VID = színeltérés a 8 ... 15 palettaszínekhez.
SPRITE = külső szín prioritása.

IV rész: A hangkezelő specifikációja

1. Bevezetés

A hangkezelő az összes hangvonatkozású vezérlést ellátja a gépben. Olyan beavatkozási lehetőségeket nyújt, amelyekkel a felhasználó manipulálni tudja a hang chip (DAVE) jellemzőinek többségét.
A hangkezelő részére egyidőben csak egy EXOS csatorna lehet megnyitva. Négy hangforrása van - ebből három hangcsatorna, egy pedig zajcsatorna. A hangkezelő a hangcsatornák mindegyikének egy hangvárakozási sort tart fenn. A sorban álló hangok mindegyike sorban lejátszásra kerül, amikor az előtte álló már befejeződött. Ezek a hangvárakozási sorok legfeljebb 25 hang hosszúságúak lehetnek mindegyik sorban. Tárolási helyük a csatorna-RAM.
A hangsorokhoz hasonlóan a hangkezelő listát vezet az ún. burkolókról. Ezek mindegyikének van egy 0-tól 254-ig terjedő száma. A sorban álló hangok mindegyike egy ilyen specifikus burkolóra, vagy a 255-ös számú ún. nulla burkolóra hivatkozik. Amikor a hang ténylegesen lejátszásra kerül, akkor a konkrét burkoló vezérli a hang frekvenciájának (magasságának), bal és jobb oldali amplitúdójának változásait a hang teljes időtartama alatt. A burkolók tárolása, a hangkezelő csatorna-RAM-jában van, amelynek méretét a csatorna megnyitása előtt egy EXOS-változóban elő kell írni.

2. Általános periféria interface

A hangkezelő csatornája a "SOUND:" eszközével nyitható meg. File név vagy egységszám megadását figyelmen kívül hagyja. Ha a hangkezelő már rendelkezik megnyitott csatornával, akkor az újabb megnyitási kísérletet .2NDCH hibajelzéssel utasítja vissza.
A BUF_SND nevű EXOS változóval adhatjuk meg a burkológörbék tárolásához szükséges csatorna RAM igényt. Ezt minden esetben meg is kell tenni a hangkezelő csatornájának megnyitása előtt.
Az igény megadása "fázis"-okban történik. A hangkezelő ehhez megfelelő nagyságú RAM tárat szerez, amivel garantálja, hogy a felhasználó a kért számú fázisok összegével végezhet burkolóm-meghatározást. Ha pl. a felhasználó 20 fázist igényel, akkor módjában áll egy burkolót meghatározni, amiben 20 fázis van, vagy 20 burkolót definiálni, amelyek mindegyike egyetlen fázisból áll. A burkolók kezelésével összefüggő problémák miatt az előbbinél kevesebb RAM-ra van szükség, mint az utóbbinál, így ha 20 fázist kértünk, akkor valószínűleg ennél nagyobb számú fázist tudunk majd definiálni, mielőtt elfogyna a tárhely, mivel a burkolók többségének egynél több fázisa van. A kért fázisok száma 2 és 255 között lehet.
A hangkezelő csak írható, nem vesz figyelembe semmilyen olvasási kérelmet. Minden hangfunkció vezérlő kódokkal és escape szekvenciákkal érhető el. A karakter és blokk írási funkcióhívásokat a megszokott módon fogadja el.
A hangkezelő rendelkezik egy megszakítási rutinnal, amely minden képfrissítésnél meghívásra kerül (másodpercenkét 50-szer). Ez a rutin a hangsorokat vizsgálja, és feldolgozza a várakozó, vagy éppen lejátszás alatt álló hangokat. Ezt a 20 ms nagyságú időszakaszt "óraütés"-nek (TICK) nevezzük. Minden időzítési érték óraütésben van kifejezve.

3. A burkolók

3.1. A burkolók általános ismertetése

A burkolókban 1-től 40-ig terjedő számú fázis van. A fázisok a burkoló felhasználásakor egymás után végrehajtásra kerülnek. Minden fázist négy szám határoz meg:

PD - a fázis időtartama óraütésekben kifejezve (16 bit)
CP - a hangmagasság változása 1/512 félhang egységben (16 bit).
CL - a bal oldali amplitudó változása (8 bit).
CR - a jobb oldali amplitudó változása (8 bit).

A változási értékek előjeles számok, melyek mindkét irányban lehetővé teszik a változást, vagyis felfelé és lefelé a hangmagasságban, valamint hangosabb vagy halkabb értelemben az amplitúdóban (hangerősségben). A frekvenciaváltozás tetszés szerinti 16 bites szám lehet - 32768...32767 tartományban. Az amplitúdóváltozás értékeinek a -63 ... +63 tartományon belül kell lenniük. A megadott paraméterek a fázisban szükséges összes változást jelentik. A frekvencia- és amplitudóváltozás a fázisban óraütésekre leosztva arányosan történik.
A burkoló egy bizonyos fázisát, mint a lecsengési fázis kezdetét különböztethetjük meg. Ennek hatását a későbbiekben részletesen leírjuk, most csak annyit, hogy a hang lecsengését vezérli, miután a hang valójában már befejeződött.

3.2. A burkolómeghatározás formája

A burkolókat egy, a hangcsatornához küldött escape-szekvenciával határozzuk meg az alábbiak szerint:

esc E <en> <ep> <er> [<cp> <cl> <cr> <pd>]

<en> burkoló száma 0 ... 254 (8 bit)
<ep> a burkolóban lévő összes fázis száma 1 ... 40 (8 bit)
<er>
a lecsengés (RELEASE) előtti fázisok száma (8 bit). Ha nincs szükség lecsengés fázisra, akkor ez az érték 0FFh, amelynek eredményeként a hang azonnal befejeződik, amikor az időtartama lejár.
<cp> frekvenciaváltozás (16 bit) Minden egyes fázisra
a fentiek szerint
Legfeljebb 40-szer
ismételve (l. EP).
<cl> bal amplitúdó változás (8 bit)
<cr> jobb amplitúdó változás (8 bit)
<pd> fázis időtartam (16 bit)

Ha a rendszer egy új burkolódefiníciót kap, akkor a régi meghatározás törlődik az új definició pedig rákerül a listára. Ha nincs elég hely a tároláshoz, akkor hibakódot küld a rendszer. Ebben az esetben a szóban forgó burkoló régi definíciója is elvész.

4. A hang előállítása

A hang tényleges előállításához ki kell küldenünk egy escape szekvenciát, ami meghatározza a hangot. Ennek formája a következő:

esc S <env> <p> <vl> <vr> <sty> <ch> <d> <f>

Az egyes mezők jelentése:

<env>
(8 bit) a hanghoz használandó burkoló. A 255-ös számú burkoló egy csipogás típusú hangot produkál, amelynek amplitúdója és frekvenciája állandó a hang teljes időtartama alatt (beep).
<p>
(16 bit) A hang induló frekvenciája 1/512 félhangban kifejezve. Csak a pontos negyedhangok lesznek zeneileg helyesek. A többi előállítása lineáris interpoláció segítségével történik. Zajcsatornánál nem kerül figyelembevételre.
<vl> (8 bit) Általános bal oldali amplitúdó. (0 ... 255)
<vr> (8 bit) Általános bal oldali amplitúdó. (0 ... 255)
<sty>
(8 bit) Hangtípus byte. Zajcsatorna esetén ez a byte a hang időtartamára beíródik a zajvezérlő regiszterbe. Hangcsatornánál a négy legfelső bit beíródik az érintett csatorna hangfrekvencia regiszterének négy hangvezérlő bitjébe. Ezek vezérlik a szűrést, a torzítást és a gyűrűmodulációt. Nulla érték tiszta hangot vagy fehér zajt produkál (l. a DAVE chip leírását).
<ch> (8 bit) A hang forrása. Értéke 0, 1 vagy 2 a megfelelő hangcsatornáknál és 3 a zajcsatornánál.
<d> (16 bit) A hang időtartama óraütésekben.
<f> (8 bit) Jelzőbyte:
  • b0...b1 : A hang SYNC száma (l. később a szinkronozással foglalkozó fejezetben).
  • b2 ... b6 : Nem használtak, nullának kell lenniük.
  • b7 : Beállítva kikényszeríti bármely hang hatálytalanítását, ami sorban áll ennél a csatornánál. Törölve vár, hogy rákerüljön a sor.

Hang vételekor a hang a megfelelt sor végére áll (de először kiüríti a sort, ha a jelzik byte-jának 7-es bitje beállított állapotú). Ha a várakozási sor már megtelt, akkor a WAIT_SND EXOS-változó állapotától függően két eljárás áll rendelkezésre. Ha értéke nulla, akkor a hangmeghajtó vár, ameddig lesz hely a hangok várakozási sorában, közben vizsgálja a STOP billentyűt, hogy lehetővé tegye az azzal való megszakítást. Ha a szóban forgó EXOS-változó nem nulla, akkor egy .SQFULL hibakód jelenik meg.

5. A hangok feldolgozása

5.1. Frekvencia- és amplitúdószabályzás

E fejezet leírja, hogyan lesz a hang és burkológörbe definíciókból hang, ha a hangdefiníció a sor elejére jut. Szó lesz a hangmagasság és amplitúdó értelmezéséről a hang kitartásának ideje alatt, és annak meghatározásáról, hogy az adott hang mikor kerüljön megszólalásra (szinkronizáció).

5.2. A burkológörbe feldolgozásának folyamata

Ha a burkológörbéhez nem tartozik hangdefiníció, akkor a megfelelő csatornán nem fog hang megjelenni. Ugyanez áll elő, ha a burkológörbe definíciója a hang kibocsátása alatt elvész.
Ha a burkológörbe értéke 255 az adott hangdefinícióban, akkor a hangmagasság, valamint a bal és jobb amplitudó értékek bekerülnek a DAVE chip megfelelő regisztereibe (az amplitúdó értékek 4-gyel osztódnak, így érik el a 0...63 közötti tartományt) a hang kitartásának idejére. Ez "beep" típusú hangot eredményez.
Egy hang kialakítása burkológörbe vezérlés alatt az alapértékek változtatását jelenti. Az alapérték az aktuális hangmagasság, amely a hangdefinícióban inicializálódik, a bal és jobb amplitúdó értékek, amelyek a hang kibocsátásának kezdetén nullára állítódnak.

5.3. Burkológörbe fázis vezérlés

Az aktuális hangmagasság és amplitúdó értékek inicializálásával a burkológörbe feldolgozása elkezdődhet. A burkológörbe minden fázisa végrehajtódik, és állandósul hatása a burkológörbe definícióban meghatározott tick értékig. Minden tick értéknél a hangmagasság és amplitúdó értékek oly módon változnak, hogy a változás mértéke lineárisan kiterjed a fázis tartamára. Ennek eredményeképpen egy fázis végére mindhárom paraméter értéke eléri a fázis kezdőértékéhez hozzáadott előjeles változásának megfelelő új értéket.
Az aktuális amplitúdó paraméterek esetében az értéknek 0 ... 63 közé kell esnie. Ha a változtatás mértéke ezt meghaladná, akkor az érték 63-ra áll be. A hangmagasság esetében nincs ilyen ellenőrzés. Ha az érték meghaladja a 65535-öt, átfordul 0-ba és viszont.
Minden óraütésnél a frekvencia és az amplitúdó aktuális értékeit ki kell adni a DAVE hang chip-re. A regiszterértékek kiszámítása a frekvencia és az amplitúdó vonatkozásában eltérő.
Amplitúdónál az aktuális bal oldali amplitúdót (6 bit) meg kell szorozni a hangdefinícióban előírt általános bal oldali amplitúdóértékkel (8 bit). Az eredményül kapott 14 bites szám lesz a szükséges bal oldali amplitúdó. Ezen érték hat legfelső bitje beíródik a megfelelő DAVE-regiszterbe. A jobb oldali amplitúdó kezelése természetesen hasonló.
A 16 bites frekvenciaértéknek logaritmikus átalakítási folyamaton kell átesnie, míg a megfelelő DAVE-regiszterekbe kerül. A frekvencia felső byte-ja 0-tól 255-ig terjedő (9-10 oktávtartomány) negyed hangtávolság számot határoz meg. Ehhez a negyed hangtávolsághoz a számlálóértéket egy táblázatból lehet kikeresni az oktávtól függő elléptetéssel együtt. A frekvenciaérték alsó byte-jának négy legfelső bitjét a kiválasztott számlálóérték és az utána felfelé következő számlálóérték közötti lineáris interpolálás elvégzésére használjuk. Ez megközelítőleg 1/64 hangnyi felbontást biztosít, ami megfelel sima frekvenciaváltozások előállítására.

5.4. A hang hosszának vezérlése

Mialatt a fázisok feldolgozása folyik, egy másik számláló a hang a hosszúságát időzíti. Ez egy 16 bites számláló, a hang definíciójában előírt hangidőtartamra inicializálódik és értéke minden egyes óraütésnél dekrementálódik. Ha hamarabb érnénk a burkoló végéhez, mint amikorra a számlálóban lévő érték nullára csökken, akkor a hang elnémul és néma is marad mindaddig, amíg a számláló a nullához nem ér. Csak ezután indul el a következő hang előállítása.
Ha viszont a számláló az előtt éri el a nullát, mielőtt a burkoló befejeződne, akkor két dolog történik. Először, ha még nem jutottunk el a burkoló lecsengési fázisához, akkor a vezérlés átugrik a lecsengési fázis elejére. Másodszor pedig beállításra kerül egy jelző, ami lehetővé teszi, hogy a szóban forgó hangot elnyomja egy másik hang, ami sorbanállva várakozik, vagy amelyik a sorban egy későbbi időpontban jelenik meg.

5.5. Szinkronizáció

E fejezet a hangdefiníció leírásában használt SYNC érték hatását mutatja be. A SYNC értékét használjuk a vezérlés megvalósítására, ha a várakozási sor elején lévő hang megszólaltatása kezdődik, és egymással párhuzamosan több hang kibocsátására kerül sor (pl. akkord).
A SYNC (szinkronozás) szám egy kétbites érték, ami figyelmen kívül marad, amikor a hang bekerül egy várakozási sorba. A hangkezelő tartalmaz egy belső SYNC számlálót, ami normális körülmények között nulla értékű. Amikor a hang a várakozási sor elejéhez ér és így készen áll arra, hogy lejátszásra kerüljön, akkor a hanghoz tartozó SYNC byte a belső SYNC számlálóval egy vizsgálaton megy keresztül.
Ha a hanghoz tartozó SYNC számlálási érték nulla, akkor a hang a szokásos módon, szinkronizálás nélkül indul el. Ha a hanghoz tartozó SYNC számlálási érték nem nulla, akkor a rendszer a hangot feltartóztatja és megvizsgálja a belső SYNC számlálót. Ha ennek értéke nulla, a hanghoz tartozó SYNC számláló tartalma a belső SYNC számlálóba másolódik. Ha értéke nem nulla, akkor tartalma eggyel csökken. Ha most az értéke nullává vált, akkor az összes feltartóztatott hang egyidejűleg fog megszólalni.
Mindezeknek az a hatása, hogy ha egyszerre három hangot kell lejátszani, akkor azokat a saját csatornáikban egy 2 értékű (tehát a hangok számánál eggyel kisebb) SYNC beállítással kell sorba állítani. Ezt követően a hangkezelő gondoskodik róla, hogy az érintett hangok egyszerre induljanak el, még akkor, is ha közülük az egyik egy kicsit hamarabb jut el a várakozási sor elejéhez, mint a többi. Ez a lehetőség így jól használható arra, hogy a több hangból álló összetett hangzatok időzítési eltéréseit kiegyenlítsük.

6. Egyéb vezérlési funkciók

Van néhány további, a hangkezelő által rendelkezésünkre bocsátott funkció is. Ezek a következők:

CTRL Z az összes hang várakozási sor törlése
esc Z <n> egyedi hangsor törlése
n = 0, 1 vagy 2 hangcsatornák,
n = 3 zajcsatorna esetén.
CTRL X az összes burkoló tár felszabadítása.
CTRL G PING hangot eredményez a 2. hangcsatornán, ha a 2. csatorna foglalt, nem történik semmi.

6.1. Belső hangszóró vezérlés

A hang létrehozása a hangvezérlő segítségével valósul meg. Ha vezérlő kiiktatásával használjuk a DAVE chipet, a hangok a belső hangszórón keresztül vállnak hallhatóvá. A belső hangszóró a MUTE_SND EXOS változón keresztül tiltható le, ha a változóba nullától különböző értéket írunk. Ez csak a beépített hangszórót tiltja le, a géphez csatlakoztatott egyéb hangszórókra, fejhallgatókra hatástalan.

7. Más perifériákkal való együttműködés

7.1. A hangregiszterek elérése egyéb eszközökkel

Ideális esetben a hangkezelő kizárólagos joggal használja az összes hangregisztert. Sajnos azonban közülük néhányat kiviteli és időzítési célokból a magnóperiféria is használ. A hangkezelő mind a 16 regisztert minden egyes megszakítás alkalmával újonnan feltölti és így a helyes állapot gyorsan helyreáll.

7.2. A billentyűzet hangjelzése

A billentyűzet click-hangot ad, amikor egy billentyűt leütünk. Ez a billentyűzet megszakítási alprogramjából induló kezdeményezésre történik, és így EXOS-hívással nem érhető el. A billentyűzet a hangkezelőben meghív egy globális jelleggel definiált KEYCLICK nevű rutint, ami a 0-s hangcsatornát használja a hang előállítására anélkül, hogy zavarná azon hangokat, amelyek a 0-s csatornában esetleg jelen vannak, A billentyű hangja kb. 1/100 másodperc hosszúságú, és az alprogram nem tér vissza addig, amíg ez be nem fejeződött.

8. Hangösszefoglaló

EXOS-hívások

CSATORNA MEGNYITÁSA / LÉTREHOZÁSA
- Azonos kezelés. Csak egy csatorna lehetséges. Készüléknév: "SOUND:". File-név és egységszám figyelmen kívül marad. Megnyitás előtt fel kell tölteni a BUF_SND EXOS változót.

CSATORNA LEZÁRÁSA / TÖRLÉSE
- Azonos kezelés

KARAKTER / BLOKK OLVASÁS
- Nincs kezelve

KARAKTER / BLOKK ÍRÁS
- A nyomtatókarakterek figyelmen kívül maradnak. A burkolót és a hangot vezérlő kódok és escape szekvenciák adják meg.

ÁLLAPOT OLVASÁS
- Nincs kezelve

ÁLLAPOT BEÁLLÍTÁS
- Nincs kezelve

EXOS változók

BUF_SND a burkológörbék tárigénye. A csatorna megnyitása előtt be kell állítani.
MUTE_SND a beépített hangszóró tiltásához nem nulla értéke.
WAIT_SND
nem nulla esetén azonnal visszatér, ha a sor tele van .SQFUL hibát ad vissza. Nullával töltve vár, amíg a sorban hely szabadul fel.

V. rész: A magnókezelő specifikációja

1. Bevezetés

A magnókezelő lehetővé teszi adatfile-ok kazettán való tárolását. Két önálló kazettásmagnót tud kezelni. Ily módon az egyik magnóról olvashatunk és a másikra írhatunk. A tárolt file-ok tetszőleges, nem csak ASCII adatokat tartalmazhatnak.
A magnókezelő a szalagon az adatokat 4 kbyte-os szeletekben (chunk) tárolja. Az adatok írása vagy olvasása mindig teljes szeletekben történik, két szelet között a motor mindig leáll. A szeletek pufferelve vannak, így a felhasználó tetszőleges méretű egységeket írhat vagy olvashat.
Felvételkor két adatátviteli sebesség lehetséges: 1000 és 2400 baud. Olvasáskor a felvett információkból az átviteli sebesség meghatározása automatikusan történik.
A magnókezelő betöltésekor és mentéskor az állapotsorban jelzi működését. Ugyancsak itt jeleníti meg a betöltési szintet, amely a szalag olvasásához szükséges optimális szint beállítására használható.

2. Magnó file forma

Az adattárolás részleteit később ismertetjük. Most csak a szalagra írt file formájának alapelveit tanulmányozzuk, ahogy azt a felhasználó is látja. A file fejrészszeletből (header chunk) és az azt követő adatblokkból áll. Minden szelet előtt a szalagolvasó rutin szinkronizálásához és a sebesség megállapításához szükséges információ található, többek között egy hosszú bevezető hang.

2.1. Fejrészszelet

A fejrész nem tartalmaz file adatokat, csak a file nevét (amely lehet üres füzér), és egy védelmi jelzőt, amellyel az egyszerű szalag-szalag másolás megakadályozható. A fejrész a file azonosítására szolgál.

2.2. Adatszeletek

Minden adatszelet pontosan 4 kbyte adatot tartalmaz a file-ból, kivéve az utolsót, mely 0 és 4k között bármekkora lehet. Ez a rövid szelet jelzi a file végét. Az adat minden szeleten belül 256 byte-os egységekre van osztva, amelyeken CRC ellenőrzés történik. Ez biztosítja, hogy a hibás szeletet a rendszer hamar felfedezi.

3. A magnókezelő használata

A magnókezelő számára egyidejűleg legfeljebb két csatorna lehet megnyitva: egy az olvasáshoz, egy az íráshoz. Olvasásra megnyitott csatornára nem lehet írást végezni és fordítva sem. Olvasási csatornát csatornamegnyitás hívással, írási csatornát pedig csatornalétrehozás hívással lehet megnyitni. A magnókezelő az egyetlen olyan beépített eszköz, ami különbséget tesz e két EXOS-hívás között.

3.1. Csatornák megnyitása olvasásra

Csatorna megnyitásához file-ok szalagról való olvasására a "TAPE:" (magnóegység) periférianév beírásával egyszerűen kiadunk egy "csatornamegnyitás" EXOS-hívást. Ilyenkor az egységszám azonosítja a távvezérlőket (REMOTE) a file-név megadása pedig választható. A magnócsatorna 4k nagyságú (azaz egy adatszelet tárolására elegendő) csatorna-RAM puffert igényel és NORAM hibajelzést fog visszaküldeni, ha nem áll rendelkezésre megfelelő nagyságú RAM. Hibajelzést kapunk akkor is, ha a csatorna már meg van nyitva (.2NDCH), vagy ha a védelem megsértése történik (.PROT l. alább).
Feltételezve, hogy a fent leírtak rendben megtörténtek, a magnókezelő elindítja a magnóegység motorját (l. később a távvezérlésekkel foglalkozó fejezetet), és keresni kezd egy megfelelő fejrészszeletet. Az állapotsorban a SEARCHING (keresés folyamatban) üzenetet fogja kiírni.
Amikor egy fejrészszeletet talál, megvizsgálja a fejrészbál a talált file nevét. Ha ez nem ugyanaz, mint a felhasználó által megadott file-név, és ha a felhasználó file-neve nem nulla volt, akkor a talált file nem a keresett file. Ebben az esetben a FOUND <file-név> üzenetet küldi az állapotsorban és folytatja a megfelelő fejrészszelet keresését.
Ha a file-név a keresett név, vagy ha a felhasználói file-név nulla volt (ami azt jelenti, hogy "töltsd be az első talált file-t"), akkor a LOADING <file-név> (file betöltése) üzenet jelenik meg az állapotsorban és a csatornamegnyitás alprogram nulla állapotkóddal tér vissza. Ez jelzi a keresés sikerességét, miután a motort leállította. A karakterolvasás vagy blokkolvasás funkcióhívásokkal most már olvashatjuk az adatokat.
E folyamat bármelyik pontjánál lenyomhatjuk a STOP billentyűt, ami félbeszakítja a keresést és azonnal visszavisz a felhasználóhoz. Ilyenkor beállítódik egy jelző, hogy a karakterek olvasására tett bármilyen további kísérlet .EOF hibát eredményezzen. A felhasználónak le kell zárnia a csatornát.
A LOADING üzenet mindaddig az állapotsorban marad, amíg a csatornát le nem zárjuk. Az üzenetet a felhasználó természetesen felülírhatja.

3.2. Adatok olvasása

A magnó olvasási csatornájából adatokat az EXOS karakterolvasási és blokkolvasási funkcióhívásainak tetszés szerinti kombinációjával kaphatunk. A szalagról az adatok puffertárba kerülnek a 4k nagyságú csatorna-RAM területen. Amikor a csatornát először nyitjuk meg, ez a puffer üres megjelölésű.
Ha a pufferben van adat, amikor egy karakterolvasás hívást kiadunk, akkor a rendszer a címzett adatot azonnal átadja a felhasználónak és módosítja a puffercím-mutatókat.
Ha a pufferben nincs adat egy karakterolvasás hívás kiadásakor, akkor a szalagról további adatszeletet kell beolvasni. Ezért a magnóegység motorja beindul, a magnókezelő pedig egy szelet keresésébe kezd. Ha talált egy szeletet, és az fejrészszelet, akkor .CCRC hibajelzést küld a felhasználónak és beállítja a file-vége jelzőt, hogy ne lehessen több byte-ot olvasni. Ha viszont adatszeletet talált, akkor abból az adatokat CRC ellenőrzés mellett olvassa be a pufferbe.
Miután a szeletet sikeresen beolvasta, az első karaktert visszaküldi a felhasználónak. Ha a file-ban ez volt az utolsó szelet, akkor beállít egy jelzőt, ami megakadályozza, hogy másik szelet betöltődhessen. Amikor ezt a szeletet a felhasználó már teljesen elolvasta, akkor minden további karakter olvasási hívás .EOF hibajelzést eredményez.
Ha a szelet valamelyik 256 byte-os blokkjában CRC hiba fordult elő, akkor pufferelésre kerül minden megelőző blokk és azokat a felhasználó kiolvashatja. Az összes érvényes blokk elolvasása után a következő karakterolvasás hívás .CCRC hibaüzenetet fog visszaküldeni, az azt követő hívások pedig .EOF hibát. Erről a csatornáról nem lehet több adatot olvasni.
A magnóról való adatolvasás közben a STOP billentyű tesztelése folyamatos. Ha lenyomjuk, akkor ez azonnali visszatérést eredményez a felhasználóhoz és leáll a motor. Ilyenkor beáll a file-vége jelző, és minden további karakterolvasási hívás EOF hibajelzést okoz. A megszakított vagy bármilyen korábbi szeletből adatokat beolvasni nem lehet.

3.3. Csatornák létesítése íráshoz

Csatorna létrehozás EXOS-hívást a rendszer elfogad, ha az adatpuffer céljaira rendelkezésre áll 4k csatorna-RAM terület, nincs egy magnóírási csatorna megnyitva és nem történt semmilyen védelemmegsértés (l. alább). Ezek a feltételek az olvasási csatornára vonatkozóval azonosak.
Sikeres létrehozás után, a magnókezelő elindítja a magnó motorját és vár kb. egy másodpercig, hogy a szalag sebessége stabilizálódjon. Ilyenkor az állapotsorban a SAVING <file-név> (a név nevű file tárolása) üzenet jelenik meg. A késleltetés után a magnókezelő kiírja az új file fejrészszeletét, ami a file-nevet fogja tartalmazni, majd leállítja a motort. Ezután nulla hibakóddal tér vissza a hívás a felhasználóhoz ( a file létrehozása sikeres volt).
A fejrészszelet felírása alatt folyik a STOP billentyű tesztelése és ha azt leütjük, az írás azonnal leáll. A csatorna érvénytelen jelölést kap, amelynek eredményeként nem lehet adatot írni a csatornára. A csatorna azonban továbbra is nyitva marad, azaz a felhasználónak kell azt lezárnia.
A SAVING üzenet mindaddig az állapotsorban marad, ameddig a csatornát le nem zárjuk, de a felhasználó természetesen felülírhatja.

3.4. Adatok írása

A magnó írási csatornára adatokat a karakterírási és blokkírási hívások tetszés szerinti kombinációjával vihetünk ki. A blokkírás hívás végrehajtása olyan, mintha minden egyes blokkbeli karaktert egyedileg írnánk a csatornára. Az adatok a csatorna-RAM területen lévő 4k méretű pufferbe kerülnek és a szalagra csak akkor íródnak fel, amikor a puffer megtelik, vagy amikor a csatornát lezárjuk.
Ha csak egy karaktert írunk, akkor az hozzáadódik a puffer tartalmához és a puffermutatók ennek megfelelten módosulnak. Ha a pufferben további hely is van, akkor a magnókezelő azonnal visszatér a felhasználóhoz. Ha a puffer megtelt, akkor tartalma egy adatszeletként a szalagra íródik.
Az adatszelet felírásának folyamata nagyon hasonló a fejrészszelet kiírásához a file létrehozásakor. Elindul a motor, ezt egy kis késleltetés követi, hogy beállhasson az üzemi Sebességre. Ezt követően kiírásra kerül az adatszelet, a motor pedig leáll. A folyamat a STOP billentyűvel megszakítható.

3.5. A csatornák lezárása

A magnókezelő a csatornalezárás és csatornamegszüntetés EXOS-hívásokat egyformán kezeli. Amikor írási csatornát zárunk le, akkor az utolsó adatszeletet ki kell írni. Erre még akkor is sort kell keríteni, ha a pufferben egyáltalán nincsenek byte-ok, mert ez jelzi a file végét. Ha a STOP billentyűt az adatok írása során lenyomtuk, akkor a csatorna tiltott megjelölést kap, és ez esetben az utolsó blokk nem kerül kiírásra.
Lezáráskor a magnóegység összes csatornájánál törlődik az állapotsor, és eltűnik a LOADING vagy SAVING üzenet.

4. A magnó egyéb jellemzői

4.1. A STOP billentyű

A rendszer teszteli a STOP billentyűt, ha a magnókezelő működteti a szalagot. A magnókezelő szalagműködtetés közben az általános EXOS-megszakításokat tiltja, ezért nem használható a billentyűzetkezelő által végzett STOP billentyű lekérdezés. Ehelyett közvetlenül maga teszteli a STOP billentyűt és szimulálja a billentyűzet működését. Nem vizsgálja viszont a STOP_IRQ EXOS-változót és így a STOP billentyű mindig leállítja a magnóműveleteket, még akkor is, ha a STOP_IRQ értéke nem nulla.
Ha a rendszer a STOP billentyű leütését érzékeli, STOP hibát fog a felhasználónak visszajelezni, ezen kívül a ?STOP szoftver-megszakítási kóddal szoftvermegszakítást is kivált. A csatorna, amit használtunk érvénytelen jelölést kap, így a magnókezelő nem fogadja a további karakterolvasási vagy írási hívásokat.

4.2. A kiviteli sebesség és szint

Szalagolvasáskor a szintet (hangerőt) a felhasználó állítja be, a sebesség pedig a szalagról jövő bevezetőjelből automatikusan határozódik meg. Az adatok kiírási sebességét és szintjét azonban EXOS-változók vezérlik, amelyeket a csatorna megnyitása előtt be kell állítani, hacsak nem az alapértelmezés szerinti beállításokat használjuk.
Az LV_TAPE változó a magnókezelő csúcstál csúcsig mért kiviteli szintjét határozza meg az alábbiak szerint:

0 vagy 1
- 20 mV
2
- 40 mV - (alapértelmezés)
3
- 80 mV
4
- 170 mV
5
- 350 mV
6 ... 255
- 700 mV

A SP_TAPE változó két szalagkiviteli sebesség közül választ, amelyek közül az egyik gyors, a másik lassú. A bit/s értékek hozzávetőlegesek, mivel a sebesség függ az adattól is. Ennek oka, hogy az egyes és nullás bit átviteléhez eltérő időmennyiség szükséges.

SP_TAPE = 0 - nagy sebesség (kb. 2400 baud, alapértelmezés)
SP_TAPE <> 0 - kis sebesség (kb. 1000 baud)

4.3. Az olvasás szintjelzője

Az olvasás szintjelzőjét a rendszer mindig kijelzi, amikor a magnókezelő egy szeletet keres vagy beolvas a szalagról. A kijelzést közvetlenül egy hardver szintérzékelő áramkör adja. Ez az áramkör a bemeneti áramkörtől elkülönített. A szintjelző az állapotsorban jelenik meg egymás melletti piros vagy zöld színű tömbként.
Ha a bemeneti szint növekszik, akkor a tömb piros, ha pedig csökken, akkor zöld színűvé változik. Optimális az a szint, amikor a beállítás éppen e kettő határán van és a két szín villogva váltakozik olvasáskor. Egyébként a magnókezelő nem különösebben érzékeny a szintekre, és az optimális szint körüli eléggé széles sávot elfogad.
A szintjelzés eltűnik az állapotsorból, amikor egy szelet beolvasásra került jelezve, hogy a szalagművelet befejeződött.
A szintkijelző változtatása az állapotsor 2-es és 3-as palettaszíneinek váltogatásával történik. Amikor a szintmérő törlődik az állapotsorból, a színek visszaállítódnak eredeti értékeikre. Időközben azonban, ha bármi más is megjelenik az állapotsorban, akkor az változtatja a színét.

4.4. A távvezérlő relék

Az Enterprise-nak két távvezérlő reléje lehetővé teszi, hogy a gép két magnót vezérelhessen egymástól függetlenül. A motor elindul, amikor a magnókezelő egy szeletet olvasni vagy írni akar, és megáll, amikor a műveletet elvégezte vagy lenyomtuk a STOP billentyűt.
Amikor egy csatornát nyitunk meg olvasásra, vagy hozunk létre írásra, akkor az egységszám dönti el, melyik távvezérlő relét fogja a csatorna használni. 0 vagy 1 az 1-es, bármely más érték a 2-es relét jelenti. Ha a felhasználó nem ad meg egységszámot, az EXOS nullát értelmez helyette, és így az 1-es relét rendeli a csatornához.
Ha két csatorna van megnyitva, mindkettő a számára kijelölt relét használja. Általában célszerű külön reléket használni a csatornákhoz, hogy minden csatornának saját reléje legyen. A rendszer ezt nem ellenőrzi. A relé, amelyet nem használ egy csatorna sem végig nyugalomban marad.
A távvezérlő reléket a REM1 és REM2 nevű EXOS-változókkal is vezérelhetjük a magnókezelőtől függetlenül a változás értelmének megfelelten a megfelelő relé be- vagy kikapcsol. A magnókezelő a távvezérlő használatakor az említett két változót aktualizálja és így a változók mindig a relék ténylegesen érvényes állapotát őrzik. A többi kétértékű be / ki EXOS-változóhoz hasonlóan a nulla felel meg a BE állapotnak (ilyenkor a motor jár), és a 0FFh felel meg a KI állapotnak (a motor leáll).
A távvezérlés reléi mindig kikapcsolnak, ha az I/O rendszer alapállapotba állítás történik (l. az EXOS-kernel specifikációját). Ez melegindításkor és olyankor fordul elő, amikor egy új alkalmazói program veszi át a vezérlést.

4.5. A magnóegység használata távvezérlés nélkül

A kazettás magnókat távvezérlés nélkül is használhatjuk, feltéve, hogy a megfelelő időben magunk kezeljük a magnón lévő PAUSE gombot. Programok egyszerű betöltésénél és tárolásánál nincs szükség szünet tartására, feltéve, hogy a program a betöltést és a tárolást elég gyorsan hajtja végre. (Az IS-BASIC ezt teszi.)
Tároláskor a szünet a szeletek közötti hosszú blokk-közök elkerülésére szükséges, egyébként lényegtelen. Betöltésnél a szünettel biztosítjuk, hogy ne hagyjunk ki adatszeleteket, mialatt a gép az előző adatokat feldolgozza.
A probléma megoldását segíti, hogy a magnókezelő, ha befejezte az adatszelet olvasását és még további adatszelet vár beolvasásra, akkor a szintkijelzés helyett a PAUSE (szünet) üzenetet jeleníti meg az állapotsorban. Ez az üzenet mindaddig megmarad, amíg a következő szelet olvasása szükségessé nem válik, s ekkor ezt a jelzést a szintjelzés felülírja.

4.6. A magnó hangcsatolása

A TAPE_SND EXOS-változóval vezéreljük a magnóbemenet átadását a fő hangkivitelre. Ha a változó értéke 0FFh, akkor nincs magnóhang. Ha nulla, akkor a szalag bemenőjele rákerül a hi-fi hangkivitelre és a belső hangszóróra (feltéve, hogy a MUTE_SND nulla), de nem kerül a fejhallgató / magnó kimenetre, a visszacsatolási problémák elkerülése érdekében. Az alapértelmezés szerinti beállítás a BE (nulla).

4.7. Másolás elleni védelem

Mivel két magnócsatorna használatára van lehetőség, nagyon könnyű megfelelő csatornákat nyitni és bármilyen file-t átmásolni egy másik szalagra, tartalmától függetlenül. Ez meglehetősen simán elvégezhető a BASIC COPY parancsával. A magnókezelő a nagyon egyszerű file-másolási művelet ellen képes védekezni.
Egy file létrehozatalakor kiírjuk a fejrészt a szalagra, és a PROTECT (védelem) EXOS-változó aktuális értéke is kiíródik a fejrészben. Ha ez nulla (vagyis alapértelmezés szerinti), akkor a file nem védett. Ha viszont nem nulla, akkor a file védett jelzést kap.
Ha olvasásra nyitunk meg egy csatornát, akkor a fejrész beolvasódik, és a funkció megvizsgálja a PROTECT jelző értékét. Ha ez nulla, akkor a védelem szempontjából semmi sem történik. Ha nem nulla, akkor a magnókezelő nem enged megnyitni írási csatornát, amíg az olvasási csatorna nyitott állapotú. Így, ha írási csatorna már nyitott, akkor a rendszer ezt a csatornamegnyitás hívást .PROT hibával visszautasítja. Ha a csatornamegnyitás elfogadásra került, akkor a további csatornalétrehozás hívásokat utasítja vissza ugyanezzel a hibajelzéssel.

5. A hardver

A hardvert nem ismertetjük részletesen, viszont itt tárgyaljuk a különböző portokat (adatkapukat) és a bitkiosztásokat.
Az adatbemenet, a szintbemenet, a távvezérlő-kimenetek, valamint a hangcsatolás-vezérlés, mind az I/O portok bitjeiként állnak rendelkezésre a következők szerint:

adatbemenet - 0B6h port 7-os bit
szintbemenet - 0B6h port 6-os bit
1-es távvezérlő-kimenet - 0B5h port 6-os bit
2-es távvezérlő-kimenet - 0B5h port 7-os bit
csatolás átbillentése - 0B5h port 5-os bit

A kazettásegység kimenete gyakorlatilag azonos a hangkimenettel. A fejhallgató csatlakozóaljzata a magnókimenet csatlakozóaljzatával egyező. A kazettásegység kimenete a DAVE chip, D/A (digitál / analóg) átalakítójával van megvalósítva, a DAVE chip különböző regisztereinek alkalmazásával. Részletesebben l. a DAVE chip specifikációjában.

6. Adatforma

Mint korábban már említettük, egy file szeletek sorozatából áll, amelyek közül az első a fejrészszelet, a többi pedig adatszelet. Ez a fejezet bizonyos részletességgel a szelet formáját ismerteti. A fejrész tulajdonképpen az adatszelet egy speciális esete.

6.1. A kazettásegység jelei

A szalagon minden byte 8 bitből álló sorozatként tárolódik a legkisebb helyi értékű bittel kezdve, -start- és stop-bitek nélkül. Minden egyes bit külön periódusban tárolódik és a bit beállított vagy törölt állapotát egymástól eltérő frekvencia jelzi. A frekvenciák egymáshoz viszonyított aránya 2 : 3, ami eléggé nagy ahhoz, hogy a szoftver beolvasáskor különbséget tudjon tenni közöttük, de eléggé kicsi ahhoz, hogy az adatsebesség nagy lehessen.
Egy közbülső frekvenciájú bevezetőjel előzi meg az adatot, ezt a jelet használjuk olvasáskor az adatsebesség meghatározására.
Alacsonyabb frekvenciájú egyetlen ciklust használunk az adatok elejének, továbbá a jel fázisának jelzésére (mivel ez esetleg invertálódik, esetleg nem).
Amikor az adatokat később visszaolvassuk, akkor az összes időzítést teljes (és nem fél) ciklusokkal végezzük el. Ez a megoldás biztosítja, hogy az eljárás viszonylag érzéketlen a kitöltési tényező változásaira, amelyek a szintváltozások (pl. kimaradások stb.) eredményeként léphetnek fel. A ténylegesen használt ciklusidők és frekvenciák a következők:

 
Nagy sebesség
Kis sebesség
Bevezető
424 ms (2358 Hz)
1000 ms (1000 Hz)
1-s bit
344 ms (2907 Hz)
800 ms (1250 Hz)
0-s bit
504 ms (1984 Hz)
1200 ms (883 Hz)
Szinkron. bit
696 ms (1437 Hz)
1600 ms (625 Hz)

6.2. Szeletforma

Minden szelet egy szinkronizálási sorozattal kezdődik. Ez néhány másodperces bevezető adásából áll, ami lehetővé teszi a kazettásegység erősítőinek és automatikus felvételi szintszabályozó áramköreinek stabilizálódását, valamint az adatsebesség meghatározását. Ezt egyetlen kisfrekvenciájú ciklus követi a jel fázisának létrehozására, ezután pedig egy nem használt byte következik a kis frekvenciájú impulzusból történő újraéledés elősegítésére. A következő byte értéke mindig 06Ah, feladata pedig a hamis szinkronizálás előfordulásának megakadályozása.
Ezután a byte után áll a szelet adatrésze, amit egy pár ciklusnyi bevezetőjel frekvenciájú lezáró követ az adat végének egyértelmű jelölésére. Az általános forma a következő ábra szerinti:

Bevezető
Szinkron
Üres byte
06Ah
Adat
Lezáró

6.3. Belső szeletforma

Egy szeleten belül az adat maximum 16 db, 256 byte nagyságú blokkra osztott, ahol mindegyik blokk byte-számmal kezdődik és egy két byte-os CRC ellenőrzőszámmal fejeződik be. A szeletben ezeket a blokkokat egyetlen, egy byte-os blokkszám előzi meg, ami megadja, hogy hány blokk található a szeletben.
Az adat formája a szeleten belül tehát az alábbi diagrammal ábrázolható:

Az adatszelet blokkszáma 0-tól 16-ig terjed és mindegyik blokk mindig 256 byte hosszúságú, kivéve a file utolsó szeletében lévő utolsó blokkot. Az olyan blokknak, ami 256 byte-nyi adatot tartalmaz, nulla a byte-száma, amit nem lehet félreérteni, mivel a nulla nem érvényes mennyiség.

6.4. Fejrész szeletforma

A fejrészszelet blokkszáma 255, és mindig csak egy változó méretű blokkot tartalmaz. Ebből a blokkszámból ismerhető fel a fejrész szelet. A fejrész felépítése a következő:

0. byte Védelmi byte
1. byte
...
n+1. byte
File név, az első byte a hosszbyte.
A név hossza 0 ... 28 karakter lehet

6.5. CRC ellenőrzés

Minden adatblokk 16 bites CRC ellenőrzőszámmal fejeződik be. Ez úgy kerül kiszámításra, hogy az ellenőrzőrendszer az adatblokk összes byte-ját (nem értve bele a byte-szám byte-okat) egyetlen bitmintaként kezeli. A blokk elején a 16 bites CRC (ciklikus redundancia ellenőrzés) regiszter nulla értékkel indul, majd a következő eljárás kerül végrehajtásra minden egyes biten:

  1. Az új bit XOR művelet végrehajtása utána a CRC regiszter 15. bitjébe íródik.
  2. Ha az új 15. bit beállított állapotú, akkor XOR műveletre kerül sor CRC és 0810h között.
  3. A CRC egy bittel balra tolódik ás a 15. bit a 0. bit helyére kerül.

Megjegyezzük, hogy ez ugyanaz a CRC algoritmus, mint amit a hálózati kezelőt használ.

7. Magnó összefoglaló

EXOS-hívások

CSATORNA MEGNYITÁSA
Megnyit egy olvasási csatornát és betölti a fejrészszeletet. Csak egyetlen olvasási csatorna létezése megengedett. A periférianév: "TAPE.". A file-nevet a hívás összehasonlítja a szalagon lévő névvel (kivéve, ha nulla). A megnyitás előtt semmilyen EXOS-változót nem kell feltölteni.

CSATORNA LÉTREHOZÁSA
Megnyit egy írási csatornát és felírja a fejrészszeletet. Csak egyetlen írási csatorna létezése megengedett. A periférianév "TAPE.". A file-név beíródik a fejrészbe. A csatorna létrehozása előtt fel kell tölteni a LV_TAPE, SP_TAPE és PROTECT EXOS-változókat.

CSATORNA LEZÁRÁSA / TÖRLÉSE
A két művelet azonos. írási csatorna esetén a hívás kiír minden pufferben lévő adatot.

KARAKTER / BLOKK OLVASÁS
Csak olvasási csatornánál megengedett. A pufferből annak kiürüléséig olvassa a karaktereket, majd egy másik adatszeletet olvas be a szalagról.

KARAKTER / BLOKK ÍRÁS
Csak írási csatornánál megengedett. Karaktereket ír a pufferbe, majd amikor a puffer megtelt, kiírja azt a szalagra.

ÁLLAPOT OLVASÁSA
Mindig a C = 0 eredményt adja vissza.

ÁLLAPOT BEÁLLÍTÁSA
Ez a hívás nincs kezelve.

SPECIÁLIS FUNKCIÓ
Nincs.

LV_TAPE - szalagegység kimeneti szint (1 ... 6)
SP_TAPE - szalag kiviteli sebesség. 0 = gyors, 0FFh = lassú.
PROTECT - védett file kiírásához nem nulla értékű.
TAPE_SND - a magnóhang csatolásának elnyomásához nem nulla értékű.
REM1 - a kazettásegység távvezérlő reléit vezérli: 0 a BE, 0FFh a KI állapot.
REM2

VI. rész: A billentyűzetkezelő specifikációja

1. A jellemzők áttekintése

A billentyűzetkezelő saját részére egyidőben csak egyetlen csatorna megnyitását teszi lehetővé. A csatorna a KEYBOARD (billentyűzet) periférianév megadásával nyitható meg. Bármilyen file-név vagy egységszám figyelmen kívül marad. Ha a billentyűzetkezelőnek már van megnyitott csatornája, akkor .2NDCH hibajelzést kapunk. A csatorna megnyitása előtt nincs szükség semmilyen EXOS-változó feltöltésére.
A billentyűzetperifériának van egy megszakítási alprogramja, ami a billentyűzetmátrixot minden videoképnél (azaz másodpercenként 50-szer) lekérdezi. Érzékeli a billentyűleütéseket, lefordítja ASCII kódokká és a pufferba helyez egy karaktert.
Támogatja a nyolc funkcióbillentyű programozását. Ezek mindegyike külön programozható a shiftelt (betűváltó gomb) és nem shiftelt lenyomáshoz, és így ténylegesen tizenhat funkcióbillentyűt jelent. Ha a funkcióbillentyűkbe programozott füzér nulla hosszúságú, akkor a billentyűkarakterek visszaküldése helyett leütéskor egy szoftvermegszakítást eredményeznek.
A CTRL vagy ALT billentyűvel egyidejűleg leütve a nyolc funkcióbillentyű mindegyike egy-egy speciális kódot ad, ami így gyakorlatilag 16 további funkciót jelent.
A billentyűzetkezelő a joystick (botkormány) perifériát úgy kezeli, mintha az a négy kurzormozgató billentyű volna és átlós irányú mozgatást biztosít két kurzorkód váltakozó alkalmazása révén. Mindegyik billentyű automatikus ismétlését támogatja. Az automatikus ismétlés indulási késleltetését, és sebességét változtatni lehet.
A billentyűzet a hangkezeltivel hallható visszacsatolást ad, amelynek eredményeként "kopogást" (CLICK) hallunk, valahányszor leütünk egy billentyűt. Ezt a funkciót a felhasználó letilthatja.

2. Karakterbevitel

Az összes bevételt az EXOS karakterolvasási és blokkolvasási hívásaival hajtjuk végre. A blokkolvasási funkciót a rendszer más perifériákkal való kompatibilitása érdekében ugyan támogatja, de használata nem szerencsés. A billentyűzet nem kiviteli periféria, és ezért nem is fogad el karakterírási vagy blokkírási funkcióhívásokat.
A tetszés szerinti füzérekkel programozható funkcióbillentyűk kivételével mindegyik billentyű egyetlen ASCII kódot állít elő. Sok billentyű külön kódokat generál, amikor a CTRL, SHIFT vagy ALT feliratú billentyűkkel együtt használjuk.

2.1. Reteszelési üzemmódok (LOCK)

A billentyűzet mindig négy lehetséges üzemmód egyikében van. Ezek a normál, a shift-lock, a caps-lock és az alt-lock üzemmódok. Az alapértelmezés szerinti üzemmód a normál. Az üzemmód különböző billentyűleütési kombinációkkal megváltoztatható:

CTRL LOCK - billentyűzet caps-lock üzemmódba.
SHIFT LOCK - billentyűzet shift-lock üzemmódba.
ALT LOCK - billentyűzet alt-lock üzemmódba.
LOCK - billentyűzet visszaállítása normál üzemmódba.

Amikor a billentyűzet valamelyik reteszelési üzemmódban van, akkor úgy viselkedik, mintha a SHIFT, CTRL vagy ALT billentyű állandóan lenyomva lenne. Ha ekkor a megfelelő váltóbillentyűt lenyomjuk, akkor az időszakosan semlegesíti a reteszelés hatását. így például a SHIFT-LOCK módban a SHIFT billentyű fordított hatású. Ha a CTRL billentyűt működtetjük, mialatt SHIFT-LOCK üzemmód van, az úgy hat, ahogyan a NORMÁL üzemmódban hatna. Ez vonatkozik az összes többi kombinációra is.
Az aktuális reteszelési módot az állapotsor jelzi, amelynek első hat karaktere a billentyűzet céljaira van fenntartva. A tényleges állapotot jellemző SHIFT, CAPS vagy ALT szó jelenik meg, ill. normál üzemmódnál üres marad ez a rész.
A LOCK_KEY nevű EXOS-változó mindig az aktuális reteszelési állapotnak megfelelő kódok valamelyikére van állítva:

0 - reteszeletlen
1 - CAPS lock
2 - SHIFT lock
8 - ALT lock

Ha a felhasználó megváltoztatja ennek az EXOS-változónak az értékét, akkor a következő billentyűzet-megszakítás aktualizálni fogja a reteszelési üzemmódot. Ha a fent megadott négy értéktől eltérő bármely más értéket írnánk a változóba, akkor azt a rendszer a négy megengedett érték egyikére fogja változtatni.

2.2. Billentyűkódok

A következő táblázatban megadott ASCII kódokat adják az egyes billentyűk normális körülmények között, ill. a SHIFT, CTRL és ALT billentyűkkel együtt leütve. (Az összes érték hexadecimálisan van megadva.)

Billentyű
Normál
Shift
Control
Alt

1
2
3
4
5
6
7
8
9
0

-
^
@
(
;
:
)
\
,
.
/
SPACE

A
B
C
D
E
F
G
H
I
J
K
L
M
N
0
P
Q
R
S
T
U
V
W
X
Y
Z

ENTER
ESC
TAB

DEL
ERASE
INS
STOP
joy up
joy down
joy left
joy right

Funkciób. 1
Funkciób. 2
Funkciób. 3
Funkciób. 4
Funkciób. 5
Funkciób. 6
Funkciób. 7
Funkciób. 8

31
32
33
34
35
36
37
38
39
30

2D
5E
40
5B
3B
3A
5D
5C
2C
2E
2F
20

61
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
70
71
72
73
74
75
76
77
78
79
7A

0D
1B
09

A0
A4
A8
03
B0
B4
B8
BC

-
-
-
-
-
-
-
-

21
22
23
24
25
26
27
28
29
5F

3D
7E
60
7B
2B
2A
7D
7C
3C
3E
3F
20

41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53
54
55
56
57
58
59
5A

0D
1B
09

A2
A6
AA
03
B2
B6
BA
BE

-
-
-
-
-
-
-
-

31
32
33
34
35
36
37
38
39
1F

2D
1E
00
1B
3B
3A
1D
1C
2C
2E
2F
20

01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
12
13
14
15
16
17
18
19
1A

0D
1B
09

A2
A6
AA
03
B2
B6
BA
BE

F0
F1
F2
F3
F4
F5
F6
F7

31
32
33
34
35
36
37
38
39
9F

2D
9E
80
9B
3B
3A
9D
9C
2C
2E
2F
20

81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97
98
99
9A

0D
1B
09

A3
A7
AB
03
B3
B7
BB
BF

F8
F9
FA
FB
FC
FD
FE
FF

3. Speciális jellemzők

3.1. A billentyű hangvezérlése

Amikor a megszakítási alprogram egy billentyű leütését észleli, behívja a hangkezelőben található KEY_CLICK nevű rutint, ami egy hangot, zörejt generál. Ez a rutin csak abban az esetben kerül behívásra, ha a KEY_CLICK nevű EXOS-változó értéke nulla. A változóba írt nullától eltérő érték hatástalanítja a billentyűhang-előállítási funkciót.

3.2. Az automatikus ismétlés vezérlése

Az autorepeat funkciót két EXOS-változó vezérli. A DELAY_KEY az ismétlés indulásáig eltelő késleltetést, a RATE_KEY pedig az egyes ismétlések közötti késleltetést adja. A két változó értéke 1/50 másodperc egységekben van definiálva. A DELAY_KEY értékének mindig hosszabbnak kell lennie, mint a RATE_KEY értéke és ha a DELAY_KEY nulla, akkor az automatikus ismétlési funkció letiltódik.

3.3. A funkcióbillentyű programozása

Tizenhat (0-tól 15-ig számozott) programozható funkcióbillentyű áll rendelkezésünkre. A 0-tól 7-ig terjedő billentyűk az alap funkcióbillentyűk, a 8-tól 15-ig terjedőek pedig a shiftelt változatok. E billentyűk bármelyikére egy karaktersorozatot programozhatunk (ami tartalmazhat vezérlőkódokat stb. is) egy speciális funkcióhívás használatával. Az alapértelmezés szerinti jelsorozat mindegyik billentyűnél a nulla hosszúságú jelsorozat.

A jelsorozatok maximális hossza 23 karakter, ebbe nem értve bele a hosszbyte-ot. Ha a jelsorozat túlságosan hosszú, akkor (.KFSPC) hibakódot kapunk.
Ha a jelsorozat nulla hosszúságú (null-string), akkor ez a funkcióbillentyű szoftvermegszakítást okoz. A szoftvermegszakítási kód ?FKEY (lOh)-től O-s funkcióbillentyű ?FKEY+15-ig (1Fh)-ig nő (15-ös funkcióbillentyűt).

3.4. A STOP-billentyű vezérlése

A STOP_IRQ nevű EXOS-változó a STOP-billentyű hatását vezérli. Ha ennek értéke nem nulla, akkor a STOP-billentyű a CTRL-C ASCII kódot (03h) adja ugyanúgy, mint más billentyű. Ha a STOP_IRQ értéke nulla, akkor a fenti kód helyett a ?STOP (20h) szoftvermegszakítási kóddal szoftvermegszakítást okoz.

3.5. A HOLD-billentyű vezérlése

Ha lenyomjuk a HOLD-billentyűt, akkor a billentyűzetkezelő a megszakítási alprogramban marad mindaddig, amíg a billentyűt újra le nem ütjük. Ez a funkció tehát befagyaszt minden kiíratást stb., ami éppen folyamatban van. Ezen kívül a hangkezelő is hív egy rutint, ami elhallgattatja a DAVE chipet, és minden hangfunkció is letiltásra kerül.
Amikor lenyomjuk a HOLD-billentyűt, akkor az állapotsorban az aktuális reteszelési mód helyén a HOLD (felfüggesztés) üzenet jelenik meg. Ezt az üzenetet a reteszelési üzemmódot kijelző üzenet (ami normál üzemmódnál egy üres üzenet) fogja felváltani, amikor felengedjük a HOLD-billentyűt. Ha a HOLD üzemmódban leütjük a STOP-billentyűt, akkor ez kiléptet bennünket a HOLD-üzemmódból és a továbbiakban a STOP-billentyűre reagál a rendszer.
HOLD-üzemmódban a belső EXOS-óra tovább jár, és nem veszíti el az érvényes időt.

3.6. Közönséges billentyűkkel generált szoftvermegszakítások

Amikor leütünk egy normál billentyűt, akkor annak karakterkódja beíródik a pufferbe. Ha azonban a KEY_IRQ nevű EXOS-változó értéke nem nulla, akkor a karakterkód visszaadása mellett egy szoftvermegszakítás is bekövetkezik a ?KEY (21h) kóddal.

3.7. A botkormány (joystick) közvetlen leolvasása

Rendelkezésünkre áll egy speciális funkcióhívás, ami közvetlenül olvassa le a fő billentyűzeten lévő botkormányt, vagy a vezérlő portokon található két külső botkormány egyikét. A paraméterek a következők:

Megjegyezzük, hogy a belső botkormány TŰZ billentyűje a szóközbillentyű.

4. Billentyűzet összefoglaló

EXOS-hívások

CSATORNA MEGNYITÁS / LÉTREHOZÁS
A két kezelésmód azonos. Csak egy csatorna lehetséges. A periférianév: "KEYBOARD" (billentyűzet). A file-név és az egységszám nem kerül figyelembevételre. A megnyitás előtt nem kell feltölteni semmilyen EXOS-változót.

CSATORNA LEZÁRÁSA / TÖRLÉSE
A két kezelésmód azonos.

KARAKTER / BLOKK OLVASÁS
Az ASCII billentyű kódját vagy a funkcióbillentyűre programozott karaktereket adja eredményként.

KARAKTER / BLOKK ÍRÁS
Ez a hívás nincs kezelve.

OLVASÁSI ÁLLAPOT
C = 0 ha a billentyűt leütötték, C = 1 ha nem.

ÁLLAPOT BEÁLLÍTÁSA
Ez a hívás nincs kezelve.

SPECIÁLIS FUNKCIÓ
- @@ FKEY = 8, funkcióbillentyű-programozás,
- @@ JOY = 9, közvetlen botkormány-leolvasás.

EXOS-változók

DELAY_KEY - késleltetés az autorepeat funkció indulásáig.
RATE_KEY - az automatikus ismétlés sebessége.
CLICK_KEY - a billentyűhang engedélyezéséhez nulla.
LOCK_KEY - a billentyűzet aktuális reteszelési üzemmódja.
STOP_IRQ - a STOP-billentyű szoftver megszakítási engedélyezéséhez az értéke nulla.
KEY_IRQ - a közönséges billentyűvel generált megszakítások engedélyezéséhez az értéke nulla.

Szoftvermegszakítások kódjai

?FKEY
...
?FKEY+15
= 10h

= 1Fh
A nulla hosszúságú jelsorozatra programozott funkcióbillentyű leütésével indul.
?STOP = 20h A STOP billentyű leütése indítja, ha STOP_IRQ = 0. Nem küld vissza billentyűkódot.
?KEY = 21h Bármelyik billentyű leütésére indul, ha KEY_IRQ = 0. Visszaküldi a billentyűkódot is.

VII. rész: A soros / hálózati meghajtó specifikációja

1. Bevezetés

A soros illesztőegység és hálózat a felhasználó szemszögéből mint két külön perifériakezelő áll rendelkezésre, amelyeknek periférianeve "SERIAL:" (soros illesztőegység), ill. a "NET:" (hálózat). Tekintve, hogy mindkettő ugyanazt a hardvert használja, közülük egyidőben csak az egyik használható. így, ha a felhasználó meg akar nyitni egy csatornát a soros vonalra, akkor először le kell zárnia a hálózat részére megnyitott csatornákat és viszont.
Egyidőben csak egy soros csatorna létezhet, viszont tetszés szerinti számú csatorna lehet megnyitva a hálózat számára, feltéve, hogy elegendő RAM áll rendelkezésre az egyenként 512 byte-os puffert igénylő csatornákhoz. A hálózati vagy soros periféria számára megnyitott csatornák támogatják mind a bevitelt, mind pedig a kivitelt.

2. Hardver

A soros/hálózati hardver két kimenetből és két bemenetből áll. A kimeneteket a 0B7h kimeneti port alsó két bitje képviseli, a többi bit nem kerül felhasználásra:

b0 = adatkimenet (DATA OUT)
b1 = állapotkimenet (STATUS OUT)

Ezek a kimenetek egy-egy felhúzó ellenállással ellátott nyitott kollektoros inverterre kerülnek. Például ha a port 1. bitjét magas szintűre állítjuk, akkor az ÁLLAPOTKIMENET vonal alacsony szintre vált. Ha viszont töröljük ezt a bitet, akkor a vonal szintje magas lesz, hacsak más külső eszköz nem húzza alacsonyabbra.
A két bemenet, egy általános rendeltetésű bemeneti port két bitjeként áll rendelkezésre. A többi bitet a kazettás egység bementeinek, ill. más célokra használjuk. A port címe: 0B6h, a bitek pedig a következők:

b4 = adatbement (DATA IN)
b5 = állapotbemenet (STATUS IN)

Soros átvitelnél ezeket a bemeneteket és kimeneteket külön használjuk a félduplex kommunikációhoz. Ilyenkor bármelyik irányba küldhetünk adatokat, de egyszerre csak az egyik irányba. Hálózati alkalmazásnál az ÁLLAPOTBEMENET és ÁLLAPOTKIMENET vonalak, miként az ADATBEMENET és ADATKIMENET vonalak is, össze vannak kapcsolva.
Megjegyzés: A dokumentációban hivatkozott jelszintek alatt a külső vonalak szintjét értjük. Az Enterprise számítógépen mind a bemenetek, mind pedig a kimenetek invertálósra kerülnek, így a bitek tényleges értékei töröltek lesznek magas szintre állított vonalaknál, ill. beállítottak alacsony szintre állított vonalaknál.

3. Soros periféria

3.1. Alapszintű működés

A soros periféria öt vonalat használ, amelyek a következők: ADATBEMENET, ADATKIMENET, ÁLLAPOTBEMENET, ÁLLAPOTKIMENET és REF (ami a 0V feszültségű földvonal helyett, mint jelreferencia alkalmazható). Ez független kézfogásos (handshake) működésmódot tesz lehetővé a bemeneten és a kimeneten is. A periféria támogatja az olvasási, és az írási EXOS-hívásokat is. Karakterolvasás funkcióhívásnál magasra állítja az általában alacsony szintű ÁLLAPOTKIMENET vonalat. Ez jelenti a partner eszköznek, hogy küldheti a karaktert. Ezt követően az ADATBEMENET vonal szintjét figyeli, amely általában szintén alacsony szintű. A vonal magas szintűre váltása a START bitet jelenti, amely után a karakter bitjei és az esetleges paritásbit beolvashatók.
A soros eszköznek van egy kisméretű puffere a bejövő karakterek tárolására. A karakter vétele után a rendszer rövid ideig vár újabb karakter küldésére. Ha az adó további karaktert küld, akkor az is a vételi pufferba kerül. A soros eszköz 16 vett karakter tárolására képes folyamatos adás esetén. Ha a puffer megtelt, vagy ha nem észlel további startbitet az időtúllépési perióduson belül, akkor az ÁLLAPOTKIMENET vonalat alacsony szintre állítja, ezzel előkészítve a felhasználói programhoz való visszatérést. Bizonyos perifériák azonban meglehetősen lassan reagálnak a kézfogásos vonalakon zajló eseményekre, ezért rövid ellenőrzés történik az ADATBEMENET vonalon, hogy van-e még elküldött karakter. Az esetleg vett járulékos karakterek pufferelhetők, mert van egy 8 byte-os túlcsordulási terület arra az esetre, ha a főpuffer megtelne. A tárolt karakterek egyesével a felhasználóhoz kerülnek, karakterolvasás hívás történik, így ez a pufferezés átlátszó (transzparens) jellegű.
A karakterírás egyszerűbb, mint a olvasás, mivel nincsenek a kapcsolat másik végének hibás viselkedéséből adódó (pl. extra karakterek küldése miatti) problémák. Karakter küldésekor a soros periféria mindaddig figyeli az ÁLLAPOTBEMENET vonalat, ameddig annak szintje magas nem lesz. (Ez a helyzet esetleg már fennállhat, ha a vevő vételre készen áll.) Ezután az ADATKIMENET vonal a startbit kiadására nyugalmi állapotáról magas szintre vált. A következő lépésben az adatbitek kerülnek elküldésre, amit egy paritásbit követ (ha paritásopció van választva). Ezt a kívánt számú stopbit elküldése követi, az ADATKIMENET vonal alacsony szintiével.

3.2. A soros periféria használata

3.2.1. Olvasás és írás utasítások

A soros periféria a normál EXOS olvasás és írás utasításokat mind az egyes karakterekre, mind a blokkokra kezeli. Az adatoknak semmilyen értelmezése nem történik és így gépi kódokat ugyanolyan könnyen küldhetünk, mint ASCII szöveget.

3.2.2. Az adatátviteli sebesség kiválasztása

Az adatátviteli sebességet (baud rate) a BAUD SER nevű EXOS-változó vezérli mind a vételre, mind az adásra. A soros csatorna megnyitása előtt a felhasználónak be kell állítania a szükséges sebességnek megfelelő változóértéket, a következő táblázat alapján:

0 =
50 baud
 
1 =
75 baud
2 =
110 baud
 
3 =
134,5 baud
4 =
150 baud
 
5 =
200 baud
6 =
300 baud
 
7 =
600 baud
8 =
1200 baud
 
9 =
1800 baud
10 =
2400 baud
 
11 =
3600 baud
12 =
4800 baud
 
13 =
7200 baud
14 =
9600 baud
 
15 =
9600 baud

Az alapértelmezés szerinti beállítás 15 (9600 baud). 15-nél nagyobb számokat a rendszer modulo 16 művelettel 0 és 15 közötti értékre redukálja.

3.2.3. A szóforma megadása

A FORM_SET nevű EXOS-változó határozza meg a vételnél és adásnál egyaránt használt szóformát. A bitek értelmezése:

b0 - Adatbitek száma. Törölt állapot: 8 bit.
Beállított állapot: 7 bit.
b1 - Paritás engedélyezés. Törölt állapotnál nincs paritás.
b2 - Paritás kiválasztás. (Csak, ha b1=1).
Törölt állapot :páros paritás.
Beállított állapot: páratlan paritás.
b3 - Stopbitek száma. Törölt állapot: 2 stopbit.
Beállított állapot: 1 stopbit.
b4 ... b7 Nem használt bitek, nullának kell lenniük.

Az alapértelmezés szerinti beállításban a byte nulla, ami 8 adatbitet, paritás nélkül és két stopbitet határoz meg.
Megjegyzés: Az adatbitek közül először a legkisebb helyi értékű kerül elküldésre és ha 7 adatbit van választva, akkor a byte 0-tól 6-ig terjedő bitjeit küldi el a rendszer, a 7. bit pedig figyelmen kívül marad. A vételnél ilyenkor a 7. bit nullára állítódik.

4. Hálózat

4.1. Adatátviteli protokoll

A hálózat kétféle üzemmódban használható: irányított és minden egységnek szóló üzemmódokban. Irányított üzemmódban az egyik gép adatokat küld egy másiknak, az összes többi kívül marad ezen. A mindenkinek szóló, vagy ún. műsorszórásos üzemmódban az egyik gép egyszerre küld adatokat az összes többi gép részére. Minden egyes géphálózati kapcsolót egy egyedi cím azonosít, amelynek értéke 1-től 32-ig terjedhet.
Minden elküldött blokk fejrésszel kezdődik, amit adatbyte-ok blokkja követhet. A fejrész szinkronizálási mintát, forrás és rendeltetési címeket, valamint típusbyte-ot tartalmaz. Ez utóbbiban van egy jelző, ami meghatározza, hogy következnek-e adatbyte-ok. Minden fejrészben az elmondottakon kívül egy szám is van, ami megmondja a blokkban lévő adatbyte-ok számát, noha ez nem kerül figyelembevételre, ha a típusbyte szerint semmilyen adat elküldésére sem kerül sor.

4.1.1. Műsorszórási protokoll

A műsorszórási formában küldött blokk fejrészében a rendeltetési cím értéke nulla. A blokkot a figyelőállapotú gépek mindegyike veszi. Nincs mód annak eldöntésére, hogy a vétel helyesen történt-e vagy sem.
A kézfogásos működési jellegnek ez a hiánya problémákat okoz, ha a gépek közül valamelyiknek a megszakításai tiltva vannak a műsorszórás kezdetekor és így akkor érkezik a hálózati megszakításokat kezelő programhoz, amikor az adatátvitel már megkezdődött, sőt, esetleg már be is fejeződött. A blokknak csak részleges vételéből adódó lehetséges zavarok elkerülése érdekében a rendeltetési gépek ellenőrzik a blokk fejrészében küldött szinkronizálási mintát. Ez egy ismétlődő négy byte-os blokkot tartalmaz, ami elég hosszú ahhoz, hogy a vevőnek az esetek többségében elegendő ideje legyen a kész állapot elérésére, másrészt viszont ésszerűen rövid, hogy ne számítson időpocsékolásnak.

4.1.2. Irányított átviteli protokoll

Tekintve, hogy az irányított adat csak egyetlen gépnek szól, a küldő gép várni tud a nyugtázásra, amellyel meggyőződhet, hogy figyel-e a rendeltetési helyen lévő gép, valamint arról, hogy hiba nélkül történt-e az adatblokk vétele.
Amikor egy számítógép olyan fejrészt vesz, amelyben a saját száma a rendeltetési cím, továbbá készen áll blokk fogadására (l. később), akkor nyugtázójelet küld vissza a forrásgépnek. Ez a DATA vonalon küldött jel kb. 4 bitnyi hosszú a kiválasztott átviteli sebességnél. A forrásgép várja ezt a nyugtázójelet, és hibát jelez, ha nem kapja meg.
Ha vannak elküldendő adatbyte-ok, akkor ezek a fejrész nyugtázását követően elküldésre kerülnek. A teljes adatblokk vétele után a rendeltetési gépnek el kell végeznie az ellenőrzőszám számítási műveletet és egy újabb nyugtázójel elküldésével jóvá kell hagynia a vételt, vagy vissza kell utasítania azzal, hogy nem válaszol.

Hibaválaszok:
Amikor a vevő gép hibát észlel, akkor haladék nélkül visszatér a hálózati megszakítási alprogramból és nem állít be semmilyen megszakítási jelzőt (l. később). A forrásgép - ha egy fejrész vagy adatblokk elküldése után nem kap vissza nyugtázójelet - a következőket teszi:

  1. Felszabadítja a hálózatot (l. a Megjegyzést.)
  2. Várakozik egy hosszú, véletlenszerű időtartam végéig, amely kb. 1/4 másodperc.
  3. Megpróbálja átvenni a hálózat vezérlését és megismételni az adást.

Megjegyzés: Rendkívül fontos, hogy semmilyen körülmények között se fordulhasson elő olyan hiba, amelynek hatására egy gép a hálózat vezérlése közben kerül végtelen ciklusba. Ez ugyanis megbénítaná magát a hálózatot, továbbá minden további gépet is, amely kísérletet tesz a hálózat használatára. Amikor egy gép végeláthatatlanul vár egy jelre a hálózati vonalon, a STOP billentyű leütésére a vezérlés visszatér a felhasználóhoz.

4.1.3. Az adatblokk fogadása

Egy gép akkor tekinthető előkészítettnek adat fogadására egy, a hálózatra kapcsolt másik számítógéptől, ha a megfelelő csatorna megnyitott a hálózati kezelő részére.
Amikor a felhasználó megnyit egy csatornát, akkor egységszámként egy távoli címet ad meg. Ha ez nulla, akkor bármely forrásból jövő blokkot elfogad. Ha a cím nem nulla, akkor a csatornán csak a megadott hálózati címről származó blokkok kerülnek elfogadásra. Tetszés szerinti számú, nem nulla című csatorna lehet nyitott, feltéve, hogy címeik egyediek, egymástól eltérőek.
Ha egy nem specifikus jellegű csatorna nyitott, akkor az csak olyan gépektől fogad el adatokat, amelyek kiszolgálását más egyedi csatorna nem végzi el. Csak egy nem specifikus csatorna lehet egyszerre megnyitva (0 távoli címmel).

4.2. A hálózati működés részletei

4.2.1. Hardvercsatlakozások

A hálózatkezelő bonyolultabb, mint a soros illesztő, mivel az előbbinek olyan protokollokat is kell tartalmaznia, amelyekkel elkerülhetők az ütközések. A hálózat ugyanazt a hardvert használja, mint a soros meghajtó. A hálózaton található összes gépet három vezeték, a FÖD, az ADAT és az ÁLLAPOT köti össze. Minden egyes gépen az ADAT vezeték rá van kapcsolva mind az ADATKIVITEL, mind az ADATBEVITEL vonalakra, az ÁLLAPOT vezeték pedig az ÁLLAPOTKIVITEL és ÁLLAPOTBEVITEL vonalakra. Ez teszi lehetővé, hogy a gép bármelyik vonalat alacsony szintre állítsa (nyitott-korrektoros kimenetek), továbbá azt, hogy figyelhesse a szintet bármelyik vonalon.
Az ÁLLAPOTBEVITEL vonal a külső megszakítási bemenetre is rá van kötve, így az ÁLLAPOT vonal alacsony szintre vitele megszakítást tud kiváltani. Ez az, amivel a gép reagálni tud az asszinkron módon érkezett adatokra.

4.2.2. A hálózat vezérlésének megszerzése

Amikor egy gép adatot továbbít egy másik gépnek vagy minden gépnek, akkor először meg kell szereznie a hálózat vezérlését. Egy adott időben csak egyetlen gép lehet a hálózat vezérlője. A hálózatvezérlés megszerzésének protokollját úgy tervezték, hogy ütközés (azaz olyan helyzet, amikor egyidejűleg két gép vezérel) ne fordulhasson elő. Ennek ára a sebesség kismérvű csökkenése, valamint az, hogy prioritást kell megállapítani a hálózaton lévő gépekre.
Definiálva van egy C időzítési állandó, ami 1 ms nagyságrendű késleltetésnek felel meg. Ha egy gép meg akarja szerezni a hálózat vezérlését, akkor az alábbi eljárást kell követnie:

  1. Mind az ÁLLAPOTKIMENET, mind az ADATKIMENET vonalakat magas szinten kell hagyni, ha a gép nem vezérli a hálózatot.
  2. Ha az ÁLLAPOT vonal magas, akkor a 4-es lépés következik.
  3. Várni kell, amíg az ÁLLAPOT vonal szintje magas nem lesz, és magas marad egy RND*C időtartamig, ahol RND 1-től 16-ig terjedő tartományba eső véletlen szám. Ha az ÁLLAPOT vonal nem marad magas állapotú a megkívánt időtartamra, akkor a lépést egy új véletlen számmal meg kell ismételni.
  4. Az ÁLLAPOT vonal feszültségszintjét alacsonyra kell állítani.
  5. Egy C*ADDR időtartamig kell várni, ahol ADOR a hálózatra kapcsolt gép címe, és közben állandóan figyelni kell az ADAT vonalat. Ha az ADAT bármilyen kis időre is alacsony szintre kerül ezalatt, akkor fel kell szabadítani (azaz újra magasra kell állítani) az ÁLLAPOT vonalat, továbbá vissza kell térni a 3. lépéshez.
  6. Alacsony szintre kell vinni az ADAT vonalat, és a fejrész elküldésével kell folytatni (l. később).

A hálózati átvitel ideje alatt időzítési megfontolások miatt a megszakítások le vannak tiltva.

4.2.3. Figyelemfelhívás - protokoll

Ha már a gép vezérli a hálózatot, akkor hozzáláthat az adatblokk adásához.
Először is fel kell hívnia magára a célállomás figyelmét. Ezt úgy éri el, hogy ismételten elküld egy olyan fejrészt, ami szinkronozási byte-ból, a kérdéses blokk rendeltetési és forráscímeiből, valamint egy típusbyte-ból áll. A byte-ok a következő sorrendben kerülnek kiküldésre:

Szinkronozási / rendeltetési / forrás / típus/ szinkronozási byte

Ezt a sort a rendeltetési byte egyes komplemense zárja le, ami a következő szinkronozási byte pozíciójára kerül. Az említett byte-ok formája:

Címbyte-ok
A rendeltetési cím a hálózatra kapcsolt gép száma, ahová a kérdéses blokkot kell küldeni. Ha értéke nulla, akkor a blokk címzettje az összes egység, tehát azt minden gépnek vennie kell. A forráscím a blokkot küldő gép száma.

b0 ... b5 a gép címe : 1-től 32-ig terjedő érték, vagy pedig nulla, ha minden gép számára szóló blokkról van szó. (A nulla csak rendeltetési cím lehet.)
b6 forrás / rendeltetési választás:
   0 esetén cím = forrás
   1 esetén cím = rendeltetés
b7 a 6-os bit komplemense

Szinkronizációs byte
A szinkronizációs byte-ra azért van szükség, mivel nincs biztosítva a gyors megszakítási reagálás; az ÁLLAPOT vonal bármikor alacsony szintre vihető, esetleg olyankor is, amikor a megszakítások le vannak tiltva a vevő gépben. A szinkronizációt később ismertetjük.

Típusbyte
A típusbyte olyan információt tartalmaz, ami meghatározza, hogy milyen adatátvitelről van szó, beleértve azt is, hogy a fejrészt követi-e adatbyte küldése.

b0 adatjelző.
   Ha 0 : a fejrészt nem követik adatbyte-ok.
   Ha 1 : adatblokk következik.
b1 ... b4 nem definiáltak. Nullának kell lenniük.
b5
rekord vége jelző. Ha 1 : rekord vége.
Ha a blokk egy kiürítés vagy lezárás parancs eredményeként lett elküldve, ez a bit beállításra
kerül, hogy ezzel kényszerítsük a hálózat karakterolvasási alprogramját a file-vége állapotjelző visszaküldésére és így azonosítsuk egy adott üzenet vagy file végét. A következő karakterolvasás vagy állapotolvasás hívás a karakter nem áll rendelkezésre állapottal tér vissza, hacsak a file-vége jelző is beállításra nem került.
b6
a file-vége jelző. Ha 1 : file vége.
Csak a rekord vége állapottal összefüggésben kerül beállításra, és azt jelenti, hogy a küldést végző gép lezárta a csatornáját. A csatornaállapot lekérdezésére, vagy további karakterek olvasására vonatkozó hívások a file-vége állapotot kapják mindaddig, amíg egy másik adatblokk vételére sor nem kerül ezen a csatornán.
b7
típusbyte-jelző. Mindig 1-re állítottnak kell lennie, hogy a szinkronozási byte garantáltan az egyetlen nyolc nulla-bites jelsorozat legyen a fejrészben.

4.2.4. A rendeltetési gép szinkronizálása

Mint már az előbbiekben is utaltunk rá, bizonyos problémák merülnek fel a rendeltetési gép szinkronizálásával kapcsolatban, amelyek abból a bizonytalanságból adódnak, hogy olyankor kell a gépet elkapni, amikor a külső megszakítás engedélyezve van. Ezt most részletesen is végigkísérjük:
Ha a külső megszakítások le vannak tiltva, akkor egy tároló áramkör veszi át a megszakítási kérelmet. A megszakítás azonnal végrehajtásra kerül, amint engedélyezzük, és a gép haladéktalanul hozzákezd az ADAT vonal vizsgálatához.
A forrásgéptől nem kívánjuk, hogy mindaddig várjon, amíg minden gép figyelő nem lesz. Ehelyett adni kezdi a figyelemfelhívó szekvenciáját, amint kész állapotba jut, abban a reményben, hogy az összes érintett gép veszi, mielőtt az befejeződne. Emiatt a protokollnak meg kell oldania azt a problémát, hogy egy célgép ennek az időperiódusnak előre meg nem határozható pillanatában kezd hozzá az ADAT vonal olvasásához.
Az RS232-es karakter keretezése ADAT vonali feszültségszintek segítségével történik, és így bármilyen 0-ról 1-re történő átmenet startbitként értelmezhető. Ez azt jelenti, hogy egy számítógép, amelyik tetszés szerinti pillanatban kezd az ADAT vonalra figyelni, startbitnek vélhet egy szintváltozást a karakter közepén. A fejrész-szekvenciában lévő szinkronizálási byte célja ezért az, hogy általa biztosítsuk a karakter határának lehető leghamarabb megvalósítható felismerését.
A fentiek kivitelezésre választott módszer egy csupa nulla bitből állá szinkronkarakter küldése, továbbá a rendeltetési gépnek arra való felszólítása, hogy mindaddig ellenőrizzen minden startbitet, ameddig nem talál közöttük olyat, amit nyolc nullbit és egy stopbit követ. Az ezután következő startbit most már garantáltan egy karakter tényleges kezdete.
A fenti előírások megkívánják, hogy a célgépek kövessék az alábbi algoritmust, amikor belépnek a megszakítási alprogramba:

  1. Ha az ÁLLAPOT vonal szintje magas, akkor visszatérés. (Ez olyankor fordul elő, ha a reagálás annyira lassú volt, hogy az adatátvitel lezajlott, vagy az érdeklődés hiánya miatt abbamaradt.)
  2. Várakozás, amíg az ADAT vonal szintje alacsony nem lesz.
  3. Várakozás, az ADAT vonal magas szintjére (lehet, hogy startbit).
  4. Késleltetés a bitközépre történő szinkronizálás által megkívánt időtartamig.
  5. Az ADAT bitenként történő olvasása mindaddig, amíg magas bitet talál.
  6. Ha nem talált 9 magas bitet egymás után (beleértve a startbitet is), akkor ugrás vissza a 4. lépésre.
  7. A szinkronbyte, valamint az ezt követően vett három byte tárolása az átmeneti memóriában. Ez a négy érték jelenti a fejrészmintát, amit a forrásgépnek ismétlődő módon küldenie kell.
  8. A rendeltetésbyte érvényességének, valamint annak ellenőrzése, hogy az a gép számát vagy a nulla értéket tartalmazza-e. Ha nem, akkor visszatérés.
  9. A forrásbyte érvényességének, valamint annak ellenőrzése, hogy van-e olyan csatorna megnyitva, ami ki tudja szolgálni a megadott gépet, azaz van-e megnyitva egy specifikus csatorna a címhez, vagy van-e megnyitva egy nem-specifikus csatorna. Egyéb esetben visszatérés.
  10. A típusbyte érvényességének ellenőrzése.
  11. A byte-ok olvasásának folytatása. Annak ellenőrzése, hogy a vett négyes csoportok egyeznek-e a 7. lépés alatt tárolt mintával, ill. a vizsgálati hurok folytatása mindaddig, amíg értékegyezést talál.
  12. Az eltérés a szinkronbyte-ban lehet, és a rendeltetési byte egyes komplemensét kell tartalmaznia. Ha nem így van, visszatérés.
  13. A következő két byte olvasása. Ha ezek egymásnak 1-es komplemensei, akkor az utóbbi a következő adatblokk byte számát jelenti. Egyéb esetben visszatérés.
  14. Ha a rendeltetési cím nem nulla volt (azaz irányított adatátvitelről van szó), akkor az ADAT vonal alacsony szintre vitele kb. 1 ms időtartamig nyugtázási célzattal, majd a vonal elengedése.

Megjegyzés: Bármikor, ha egy byte olvasása zajlik a rendszer ellenőrzi az ÁLLAPOT vonalat, hogy azt a forrásgép még mindig alacsony értéken tartja-e. Ha állapota bármikor magasra megy, akkor a kapcsolatot azonnal megszakadtnak tekinti.

4.2.5. Az adatbyte-ok adása

Amikor a rendeltetési gép az ADAT vonal szintjét alacsony szintre állítja, és meg is hagyja ott legalább 0,5 ms ideig, akkor ez a forrásgépnek azt jelenti, hogy kezdheti mindazon adatok adását, amelyek a szóban forgó adatátvitelben részt vesznek. Amikor az ADAT vonal felszabadul, a küldést végző gép újra alacsonyra állítja, majd késlekedés nélkül hozzákezd az adatblokk adásához.
Az adatblokk formája a következő:

Adatbyte-ok
CRC alsó byte
CRC felső byte

A fejrészszekvenciában vett byte-szám a blokkban lévő adatbyte-ok számát jelenti. A nulla érték 256 byte-ot határoz meg.
A két CRC byte a ciklikus redundancia ellenőrzés eredménye, amit a blokkban lévő összes adatbyte számbavételével képzünk. A számításnál a fejrész nem kerül figyelembevételre. A CRC kiértékelése 16 biten történik, és az adatblokk vételekor újra kiszámítjuk. Ha a vételkor kiszámított CRC nem egyezik az elküldött értékkel, akkor a blokkot selejtnek tekintjük.
A CRC algoritmusa ugyanolyan, mint a magnóegység meghajtójánál használt algoritmus. Lényegét nézzük át röviden:
A CRC számítás céljaira az adatblokkot bitfolyamnak tekintjük. Valahányszor egy adatbitet (de nem start- vagy stopbitet) elküldünk, aktualizálódik a 16 bites CRC regiszter. Ez a folyamat a soros műveletet végző alprogramban játszódik le, ami a soros illesztőegység meghajtóval közösen használt rutin, és így a CRC kiszámítása a soros kezelőprogram által vett és küldött adatokon is megtörténik, noha ez nem előírt követelmény.
A CRC regiszter 16 bites érték, ami nulla kezdőértékkel indul, és minden egyes bit adásakor vagy vételekor a következő műveletek végrehajtására kerül sor:

  1. XOR művelet az új bit és a CRC-regiszter legnagyobb helyi értékű bitje között, az átvitel (carry) beállítása a kapott értékre.
  2. Ha az átvitelbit beállított állapotú, akkor XOR művelet végrehajtása a CRC-regiszter és a 0810h konstans között.
  3. A regiszterérték egy bithellyel balra való forgatása, miáltal a 15. bit a 0. bit helyére kerül.

4.2.6. Adatátviteli forma

A hálózati blokkok byte-sorozatként ugyanolyan formában kerülnek adásra, mint amilyenben a soros illesztőegység kezeltije küldi el a blokkokat: vagyis nyolc adatbit, két stopbit, paritásbit nélkül. A karakterek az aktuálisan kiválasztott adatátviteli sebességgel kerülnek adásra, amelynek alapértelmezés szerinti értéke 9600 baud.

4.3. A hálózat használata

4.3.1. Címmeghatározás

Az előzőekben tárgyalt protokollok megkívánják, hogy a hálózatra kapcsolt gépnek legyen egyedi címe, emiatt a hálózatkezelő csak abban az esetben nyit csatornákat a hálózathoz, ha a számítógépnek van címe.
A címet az ADDR_NET nevű EXOS-változó tárolja és ezt a felhasználónak kell beállítania még azelőtt, hogy bármilyen hálózati műveletet megkísérelne. A tápfeszültség bekapcsolásakor vagy hidegindításnál a változó nulla értékre állítódik be, ami hálózati címként érvénytelen.

4.3.2. Csatornák nyitása a hálózathoz

Mint már említettük, minden hálózathoz megnyitott csatornának meg kell adni annak a távoli gépnek a számát, amely részére a csatorna foglalt, noha a nulla értékű cím lehetővé teszi adatblokk vételét bármelyik gépről. Ez a szám az EXOS csatorna-megnyitási funkcióhoz intézett hívásban, mint egységszám van megadva. (Ld. az EXOS-kernel specifikációjának ismertetésében). Bármilyen megadott file-nevet a funkció figyelmen kívül hagy.
Lássuk világosan a csatornaszám és a csatorna által kiszolgált gép hálózati címe közötti különbséget. A kettő egymástól teljesen független; a felhasználó feladata annak figyelemmel kísérése, hogy melyik csatorna melyik gépet szolgálja ki, amikor adatot kíván kiadni a hálózatra. Olvasás esetén viszont mindkét értéket rendelkezésére bocsátja a megszakítást kezelő program (l. később).

4.3.3. Megszakítások

Amikor megnyitjuk az első csatornát a hálózathoz, engedélyeződnek a külső megszakítások, és így is maradnak mindaddig, amíg az utolsó csatornát le nem zárjuk. Ameddig a külső megszakítások engedélyezve vannak, minden magasról alacsonyra való átmenet az ÁLLAPOT vonalon a hálózati megszakítást kiszolgáló alprogram hívását váltja ki. Ennek egy konkrét következménye az, hogy ha egy hálózatra kapcsolt gépen soros csatornát nyitunk (amelynél a nyugalmi vonalszintek alacsonyak), akkor a hálózatot használó valamennyi gép működése megszakad, és egy adatblokkra fognak várni.

4.3.4. Pufferek

Minden megnyitott hálózati csatorna két, egyenként 256 byte hosszúságú puffert hoz létre : egy vételi és egy adási puffert.
A vételi puffer olyan adatbyte-okkal lesz feltöltve, amelyek blokkokban érkeznek a hálózatról, de egyszerre csak egyetlen blokkot tartalmazhat, függetlenül attól, hogy milyen rövid az a blokk. Még az egyetlen byte-ból álló blokk is megtölti a vételi puffert arra az időre, amíg ki nem olvassuk vagy ki nem töröljük. A felhasználó a pufferből kiürülésig olvas, amikor lehetővé válik további blokkok fogadása a hálózatról. Az egyes csatornák pufferei függetlenek, és mód van blokkok vételére bármelyik gépről, feltéve, hogy az adott puffer szabad.
Az adási puffert a felhasználó tölti fel és annak tartalmát teljes blokk formájában küldi a hálózatra. Ez a tartalom bármikor a hálózatra vihető a kiürítés speciális funkcióhívással, vagy pedig automatikusan kerül adásra, a 256. byte után. Az adási puffer ugyancsak automatikusan kiürül, amikor a csatornát lezárjuk és így lehetővé teszi, hogy tetszés szerinti (1 byte-tól felfelé terjedő) hosszúságú file-okat küldhessünk egy másik gépre, miközben a pufferezés átlátszó jellegű marad.

4.3.5. Olvasás és írás funkciók

A hálózat periféria támogatja a szokásos EXOS karakterolvasási és -írási funkcióhívásokat, valamint a blokkolvasási és -írási hívásokat.
Távoli gépekről a blokkok vételét egy megszakítás-kiszolgáló program végzi el, ami akkor kerül behívásra, amikor az ÁLLAPOT vonal alacsony szintre kerül. A gép a megszakítási rutinban marad és figyeli, hogy mikor megy az ADAT vonal alacsony szintre és ha ez megtörtént, akkor beolvassa a fejrészt. Ha a fejrész beolvasása sikeres volt és a blokk olyan, mint amilyet a gép venni kíván, akkor az adatot beolvassa azon csatorna vételi pufferébe, amelyik a kérdéses távoli gépet kiszolgálja. Mindegyik csatorna egyszerre egy blokkot tud átmenetileg tárolni vételi pufferjában.
A hálózatkezelő szoftvermegszakítást okozhat, ha sikeresen vett egy blokkot a hálózatról. A NET_IRQ nevű EXOS-változó szolgál, ezen funkció be- vagy kikapcsolására. Ha a NET_IRQ értéke nulla, akkor a szoftvermegszakítás engedélyezve van, és a sikeres hálózati megszakítás hatására a ?NET érték íródik a FLAG SOFT IRQ nevű változóba.
A CHAN_NET nevű EXOS-változóval adjuk át a felhasználónak azon csatorna számát, ahonnan a pufferelt adatokat ki lehet olvasni. A CHAN_NET csak akkor aktualizálódik, amikor kiolvasunk egy karaktert az általa meghatározott csatornából, vagy ha azt a csatornát lezárjuk. A változó értéke ezután a legkisebb számú gép csatornaszámára fog megváltozni, amelyik megszakítást okozott. így ha a 2-es és 10-es gép küld egy-egy blokkot, mialatt az 5-ös gép által küldött adat még olvasásra vár, akkora CHAN_NET a 2-es, és nem a 10-es gép csatornáját tartalmazza, bármelyik okozott is előbb megszakítást. A 10-es gép később kap kiszolgálást, amikor száma a legalacsonyabb lesz a kiszolgálásra várakozók között. Ez lehetővé teszi, hogy bizonyos gépeknek elsőbbséget biztosítsunk - így például az 1-es gépen dolgozó tanár üzenetének vétele hamarabb történik, mint az egyéb gépekről jövők. Legmagasabb prioritásuk a mindenkinek szóló (broadcast típusú) üzeneteknek van. Ha nincs elérhető adat, akkor a CHAN_NET változó tartalmaz 255.
Valahányszor a CHAN _NET változó aktualizálódik, a MACH NET nevű EXOS-változó tartalma is megváltozik, hogy benne azon gép száma legyen, amelyik a megszakítást okozta. Ez létfontosságú akkor, amikor nem specifikus csatornán veszünk blokkot, mivel egyébként nem tudnánk megállapítani, melyik gép küldte a blokkot. Más esetekben is hasznos lehet. A felhasználótól általában elvárjuk, hogy számon tartsa, melyik csatorna melyik gépet szolgálja ki.
Az alkalmazói program az RDCH vagy RDBLK nevű alprogrammal kér byte-okat és ezeket a vételi pufferből kapja meg, ha rendelkezésre állnak. Ha nem, akkor két lehetséges válasz van. Ha a szóban forgó csatorna fejrészében "rekord vége" jelzőt kaptunk, akkor "file-vége" állapotjelzést kapunk eredményül. Egyéb esetekben az olvasási alprogram leáll arra az időre, amíg ez a csatorna adatot nem vesz a hálózatról.
A rendszer támogatja a "csatornaállapot olvasása" funkcióhívást, és így egy karakter kiolvasásának megkísérlése előtt a felhasználó ellenőrizni tudja a "file-vége" vagy a "karakter nem áll rendelkezésre" állapotokat.
A hálózatra való írást WRCH és WRBLK funkcióhívások sorozataként hajtjuk végre. Ha a puffer adása során hiba keletkezik, akkor a hálózatkezelő program folyamatosan újra próbálkozik negyed és fél másodpercenként. Ez a művelet leállítható a STOP-billentyű leütésével, amelynek hatására a puffer tartalma is törlődik a kezelőprogram visszatérése előtt.

Megjegyzés: A hibaállapot csak irányított adatblokkok esetén detektálható; a mindenkinek szóló adatok nem igényelnek nyugtázást és így nem is ellenőrizhető, hogy az adatok vétele helyesen történt-e.

5. Soros / Hálózati összefoglaló

Soros illesztő EXOS-hívások

CSATORNA MEGNYITÁSA / LÉTREHOZÁSA
A két hívás kezelésmódja azonos. Csak egyetlen csatorna lehet megnyitott, hálózatcsatorna nincs. A periférianév : "SERIAL:". A file-név és az egységszám nem kerül figyelembevételre. A megnyitás előtt egyetlen EXOS-változót sem kell beállítani.

CSATORNA LEZÁRÁSA / MEGSZÜNTETÉSE
A két hívás kezelésmódja azonos.

KARAKTER/BLOKK OLVASÁSA
Karaktereket olvas a soros bemenetről. Van bizonyos mérvű pufferezés.

KARAKTER / BLOKK ÍRÁSA
Byte-okat ír, értelmezés nélkül.

ÁLLAPOT OLVASÁSA
Mindig "karakter kész" (C = 0).

ÁLLAPOT BEÁLLÍTÁSA
Ezt a hívást nem kezeli.

SPECIÁLIS FUNKCIÓ
Nincs speciális funkció.

Hálózati EXOS-hívások

CSATORNA MEGNYITÁSA / LÉTREHOZÁSA
A két hívás kezelésmódja azonos. Több csatorna megnyitása is megengedett, de ezek között nem lehet soros csatorna. Az egységszám meghatározza a rendeltetési gép számát, a file-név pedig nem kerül figyelembevételre. A periférianév "NET:". Megnyitás előtt az ADOR_NET nevű EXOS-változót be kell tölteni.

CSATORNA LEZÁRÁSA / MEGSZÜNTETESE
A két hívás kezelésmódja azonos. Megkísérli az összes pufferelt adat elküldését.

KARAKTER / BLOKK OLVASASA
Karaktereket olvas a pufferből, ha rendelkezésre állnak. Egyébként "file-vége" állapotjelzést küld vagy vár.

KARAKTER / BLOKK ÍRÁSA
Byte-okat ír a pufferbe. Ezek a hálózatra küldődnek a kiürítés speciális funkcióhívás végrehajtásakor, csatorna lezárásakor vagy ha a puffer megtelik.

ÁLLAPOT OLVASÁSA
C = 0, ha van a pufferben karakter,
C = 0FFh, rekord vége esetén,
C = 1, ha a puffer üres.

ÁLLAPOT BEÁLLÍTÁSA
Ezt a hívást nem kezeli.

SPECIÁLIS FUNKCIÓ
@@ FLSH = 16 : a rekord vége jelző beállított állapotával küld pufferelt adatot (kiürítés).
@@ CLR = 17 : az adási és vételi pufferek törlése.

EXOS-változók

FORM_SET - soros formátum. A hálózat nullára állítja.
BAUD_SER - a soros és a hálózati átvitel sebessége.
ADDR_NET - a gép hálózati címe.
CHAN_NET - csatorna, amelyen a hálózati blokk vétele történik.
MACH_NET - gép, amelytől a hálózati blokk vétele történik.
NET_IRQ - nulla értéke engedélyezi a hálózat szoftvermegszakítását.

Szoftvermegszakftási kódok

?NET = 30h. Ha a hálózati csatorna adatblokkot vett, és a NET_IRQ = 0.

VIII. rész: A nyomtatókezelő specifikációja

1. Bevezetés

A nyomtatókezelő egy nagyon egyszerű periféria. A beépített Centronics típusú párhuzamos illesztő segítségével karaktereket küld a nyomtatóra vagy egyéb perifériára.
A nyomtatókezelő számára egyszerre csak egy csatorna lehet megnyitva. Ha kísérletet teszünk második csatorna megnyitására, akkor .2NDCH hibakódot kapunk. Csatornát a "PRINTER:" periférianév megadásával nyithatunk meg, bármilyen file-név vagy egységszám figyelmen kívül marad.
Miután a csatornát megnyitottuk, karaktereket írhatunk, az egyetlen karaktert író, vagy pedig a blokkírási funkcióhívás segítségével. A karakterek mindenféle értelmezés nélkül kerülnek adásra, a rendszer egyszerre küldi el mind a nyolc bitet.

2. A hardver

A hardver a párhuzamos átvitel kiszolgálására egy 8 bites kimeneti kapuból (0B6h port), adatkapuzó kimeneti bitből (a 0B5h port 4-es bitje), valamint a készenléti jel bemeneti bitjéből (0B5h port 3-as bitje) áll.
A byte elküldéséhez a nyomtatókezelő a karaktert az adatportra teszi, majd vár, amíg a "kész" jel alacsony szintre megy. Amikor a "kész" jel alacsony, akkor az adatkapuzó jelnek néhány ezredmásodpercnyi alacsonyra állításával engedélyezi az adatot, majd a szintet újra magasra állítja. Ezzel a karakter küldésének folyamata befejeződött.
A 0B5h kimeneti port további bitjei különböző vezérlési / szabályozási műveletek, például a billentyűzet lekérdezésére és a távvezérlő relék vezérlésére szolgálnak. A fix helyen található PORTB5 nevű változó határozza meg a port aktuális állapotát, a nyomtatókezelő pedig biztosítja, hogy a port összes többi bitjének állapota ne változzon meg.

3. Nyomtató-összefoglaló

EXOS-hívások

CSATORNA MEGNYITÁSA / LÉTREHOZÁSA
A két hívás kezelésmódja azonos. Csak egyetlen csatorna lehet megnyitott. A periférianév: "PRINTER:". A file-név és az egységszám nem kerül figyelembevételre. A megnyitás előtt egyetlen EXOS-változót sem kell beállítani.

CSATORNA LEZÁRÁSA / MEGSZÜNTETÉSE
A két hívás kezelésmódja azonos.

KARAKTER / BLOKK OLVASÁSA
Ezt a hívást nem kezeli.

KARAKTER / BLOKK ÍRÁSA
Byte-okat ír, értelmezés nélkül.

ÁLLAPOT OLVASÁSA
Ezt a hívást nem kezeli.

ÁLLAPOT BEÁLLÍTÁSA
Ezt a hívást nem kezeli.

SPECIÁLIS FUNKCIÓ
Nincs.

IX. rész: A szövegszerkesztő program specifikációja

1. Bevezetés

Az összes többi beépített perifériakezelő valamilyen hardver vonatkozású egységhez, például a magnó be-/kimenetei áramkörökhöz vagy a DAVE chiphez, biztosít illesztést. A szerkesztőprogram azonban nem csatlakozik közvetlenül semmilyen hardverhez, ehelyett magasszintű felhasználói felületet (interface-t) biztosít két beépített kezelőhöz - a videokezelőhöz és a billentyűzetkezelőhöz.
A szövegszerkesztő csatorrát egy inteligens, teljesképernyős szövegszerkesztő kezelőprogramnak tekinthetjük. Alkalmazói programok használhatják a felhasználóval folytatott, általános rendeltetésű információforgalmazásuk biztosítására. Az IS-BASIC bővítőmodul például az összes képernyő és billentyűzet be-/kimeneti műveletét a szövegszerkesztő csatornán keresztül bonyolítja le. Ebben a részben gyakran használjuk a BASIC-et, példaként annak bemutatására, hogy miként alkalmazzuk a szövegszerkesztő programot.
A szövegszerkesztő megengedi, hogy részére egyidejűleg akárhány csatorna legyen nyitott. Minden egyes csatorna egy szerkesztés alatt álló külön szövegrésznek felel meg. A szövegrész szót itt tágabb értelemben értjük, mivel például a BASIC által használt editor csatorna - ami szövegrészre hivatkozik - ténylegesen BASIC parancsok, programlisták, hibaüzenetek, programkiírások stb. gyűjteménye.
Minden szövegszerkesztő csatornának van videocsatornája és egy ahhoz társított billentyűzetcsatornája. A szövegszerkesztő csatornák osztozhatnak ugyanazon a billentyűzetcsatornán. Ez lényeges, hiszen a billentyűzetkezelő részére csak egy megnyitott csatorna lehet. Videocsatornáknak viszont külön kell létezniük.
Minden szövegszerkesztő csatornának van csatorna-RAM területe is, amit szövegpufferként használ. Ez a puffer néhány száz byte nagyságútól majdnem 16k nagyságig terjedhet és tipikusan néhány kbyte kapacitású. A pufferbe szöveget az alkalmazói programból, vagy a billentyűzetről lehet bevinni. A szövegszerkesztő a karaktereket úgy írja a videolapra, hogy az ablakként szolgál a szövegpufferre. Ez valójában nem igazi ablak, mivel a videolapnak saját másolata van a megjelenítendő szövegről.

2. A csatornák megnyitása

Szövegszerkesztő csatornát az "EDITOR:" név megadásával nyithatunk meg. Minden file-név és egységszám figyelmen kívül marad. Mielőtt egy szövegszerkesztő csatornát megnyitnánk, be kell állítanunk három EXOS-változót. Ezek a következők:

VID_EDIT - a videolap csatornaszáma
KEY_EDIT - a billentyűzet csatornaszáma
BUF_EDIT - a szövegszerkesztő puffer mérete 256 byte-os egységekben kifejezve.

A VID EDIT és KEY EDIT változókban meghatározott video- és billentyűzetcsatornáknak a szövegszerkesztő csatorna megnyitása előtt már megnyitott állapotúaknak kell lenniük. A videolap szöveg (text) módban legyen és legalább 3 sor-szor 4 karakter mérettel rendelkezzen. A csatorna megnyitásakor a szövegszerkesztő ellenőrzi a videolap méretét és üzemmódját, és .EVID hibajelzést küld vissza, ha nem találta megfelelőnek.
Meqjeqyezzük, hogy a szövegszerkesztő a videolapot nem jeleníti meg a képernyőn, az alkalmazói program feladata erről gondoskodni.
A szövegszerkesztő puffer tényleges mérete:

256 * BUF EDIT + n

ahol n nulla és 255 közé esik, értéke a videolap szélességétől (a vonalzósor részére) és a szövegszerkesztő-változók pontos méretétől függ. Emiatt a BUF_ EDIT tartománya nullától 254-ig terjedhet.
A szövegszerkesztő bármekkora méretű pufferrel működni fog, de célszerű legalább egy videolap nagyságúra választani, hogy a szövegszerkesztő mindig képes legyen a teljes oldal megjelenítésére. A szövegszerkesztő a sorokat változó hosszúsággal tárolja pufferében. A rövid sorok gyakoriak, és így általában több sort tud tárolni, mint a számított minimális sorszám.

3. A szövegszerkesztő általános jellemzői

3.1. A szövegszerkesztő szövegpuffere

Mint már említettük, a szövegszerkesztőnek van egy szövegpuffere, amiben a szöveget tárolja, a videolap pedig ablakot biztosít a puffer egy részére. A szöveget a puffer sorstruktúrában tárolja. Minden sorhoz tartozik egy hárombyte-os fejrész, ami jelző és margó vonatkozású információt tartalmaz. Ezt a szöveg követi ASCII kódban. A sort egy speciális karakter zárja le, ami jelzi, hogy utolsó sor-e bekezdésben, és azt, hogy a sor a puffer utolsó sora-e.
A sorokat változó hosszúsággal tárolja és így ha egy sorban csak négy karakter van, ami után 36 szóköz áll, akkor a 36 szóközt nem tárolja. Ez jelentősen javítja a puffer kihasználását, mivel a rövid sorok általában gyakoriak. A pufferben tárolható sorok számát a puffer összkapacitásán kívül semmi sem korlátozza.
A puffer körkörös kialakítású, így a szöveg bárhol kezdődhet a pufferben. A puffer vége a szöveg bármelyik pontjánál megjelenhet, a szöveg a puffer elejénél folytatódik. Ezzel a megoldással elkerüljük, hogy a teljes szöveget állandóan fel- vagy lefelé kelljen mozgatni a pufferben.

3.2. Amikor a puffer megtelik

Ha új szöveget írunk a pufferbe, akár a végére, akár pedig a közepébe, akkor ez nyilvánvalóan fogyasztja a pufferterületet. Előbb-utóbb a puffer megtelik. Általában BASIC használatakor a puffer majdnem mindig csaknem tele van, mivel korábbi parancsokat stb. tartalmaz, amelyek már a képernyőn nem látszanak.
Amikor a pufferben már kevesebb, mint 100 byte hely van, a szövegszerkesztő az állapotsor jobb oldalán kijelezi a szabad byte-ok számát. Ahogy karaktereket gépelünk be, ez a szám egyre kisebb lesz, míg végül nullára csökken. A szám csak akkor kerül kiírásra, amikor a rendszer billentyűleütést vár a felhasználótól. Nem látható tehát például akkor, amikor a BASIC kilistáz egy programot, jóllehet a puffer esetleg tele van.
Ha a puffer megtelt, és beírunk újabb karaktert (vagy az alkalmazói program teszi ezt), akkor a szövegszerkesztőnek helyet kell teremtenie, azaz törölnie kell a meglévő szöveg egy részét. Ilyenkor mindig teljes sort töröl, rendszerint az első sort, mivel általában ez a legrégebbi, tehát feltételezhetően a legkevésbé szükséges sor. Ha a szöveg első sora a videolapon éppen meg van jelenítve, akkor ehelyett a sor helyett az utolsó sort törli, hogy elkerülje megjelenített szövegrész törlését.
Ha a szövegszerkesztő puffer nagyon kicsi, vagy van néhány nagyon hosszú sor, akkor megtörténhet, hogy egyszerre kerül kijelzésre minden sor, és így a szövegszerkesztőnek egy megjelenített sort kell törölnie. Ilyenkor a szövegszerkesztő az utolsó sort törli, kivéve ha a kurzor ott van. Ekkor az első sort törli és az oldalt felfelé görgetni.
Megjegyezzük, hogy a puffer körbenjáró jellege miatt ezen szövegsor törlése általában nem jelenti a teljes szöveg felfelé mozgatását a hely kitöltése érdekében.

3.3. A margók és a vonalzósor

A puffer minden egyes sorának van bal oldali margópozíciója. Amikor új sort készítünk, akkor az az aktuális bal oldali margóbeállításnak megfelelő bal margót kapja. Ez a videolap tetején levő vonalzósoron megjeleníthető. Van jobb margó is, ami ugyancsak jelezve van a vonalzósoron. Általában szöveg csak ezek közé a margóbeállítások közé írható, bár van lehetőség a margóbeállítások átmeneti felszabadítására is.

3.4. Bekezdés

A szövegszerkesztő pufferjében lévő sorok bekezdésekbe csoportosulnak. Amikor a felhasználó leüti az ENTER billentyűt, (vagy az alkalmazói programból egy CR kód érkezik), akkor az aktuális sor bekezdés vége jelölést kap. Hatására a kurzor a következő sor elejére megy, és egy új bekezdés kezdődik.
Ha a felhasználó egy nagyon hosszú sort gépel be, akkor a szövegszerkesztő program a sort egy ésszerű pontnál félbeszakítja, hogy két sort készítsen. Ezt szavas tördelésnek nevezzük és a következő pontban ismertetjük. Ilyenkor az első sort "puha" kocsiviasza-jel zárja le, ami jelzi, hogy nem bekezdés végéről van szó. Ezzel a módszerrel hosszú bekezdések is felépíthetőek.
A képernyőn nincs semmilyen jelzés, hogy hol kezdődnek és hol fejeződnek be a bekezdések, viszont a szerkesztési funkciók némelyike bekezdésekkel dolgozik, továbbá a bekezdés az alapvető egység akkor is, amikor egy szöveget az alkalmazói program részére küldünk.

3.5. Szavas tördelés

A szavas tördelés (más szóval : szó átvitele a következő sor elejére) az a folyamat, ami meghatározza, hogy hol kell egy túlságosan hosszú sort megbontani. Amikor egy karaktert a margón kívülre gépelünk (feltételezve, hogy a lapszegélyek nincsenek felszabadítva), akkor a szövegszerkesztő visszafelé megkeresi a karaktert tartalmazó szó elejét és azt a teljes szót átviszi az új sor elejére.
Ez a folyamat az alkalmazói programból vett teljes szöveggel, valamint a felhasználó által a billentyűzeten begépelt szöveggel is végrehajtásra kerül. A BASIC listázásokra is vonatkozik, így a kulcsszavak, változónevek stb. nem lesznek szétszakítva.

3.6. Hosszú sorok

Bár a begépelt nagyon hosszú sort a szavas tördelés felbontja, lehetőség van hosszú sor létrehozására sor közepére való karakterek beszúrásával. Ezek a sor maradék részét jobbra tolják el. Ezzel a módszerrel olyan sort is létre tudunk hozni, ami nem fér el egy videolapon. Ezt a tényt a piros színű nagyobb jel (">") jelzi a videolapon lévő sor jobb szélén. Ez a túlcsordulás jelző.
A sornak a képernyőről kifutott részéhez nem lehet hozzáférni, noha a szövegszerkesztő emlékszik rá. A sorhoz csak olyan újraformázás révén tudunk hozzáférni, ami visszahozza azt a megjelenítési oldalra. Rendelkezésünkre állnak különböző szerkesztési parancsok, amelyek ezt megcsinálják, a későbbiekben ismertetésre kerülő módon.

3.7. A kurzor villogtatása

A szövegszerkesztő által használt EXOS videokezelő csak egy statikus nem villogó kurzorkijelzést biztosít, bár ezt be és ki lehet kapcsolni. A szövegszerkesztő ezt kihasználva, amikor a felhasználótól bevitelre vár, villogó kurzort hoz létre. Mindig gondoskodik arról is, hogy a kurzor ki legyen kapcsolva, amikor valamilyen szerkesztési funkciót végez, mivel ez azzal járhat, hogy a kurzort az egész képernyőn át kell mozgatni és ezt meglehetősen kellemetlen szemmel kísérni.
A szövegszerkesztő akkor is kikapcsolja a kurzort, amikor visszatér az alkalmazói programhoz és az kikapcsolva is marad, ha az alkalmazói program karaktereket ír a szövegszerkesztőnek. Ennek eredménye egy szép, tiszta kurzorkijelzés, ahol a villogó kurzor mindig azt jelzi, hogy a szövegszerkesztő adatbevitelre vár.

4. Írás a szövegszerkeztőbe

Minden olyan karakter, amelynek kódjai a 20h-tól 9Fh-ig terjedő tartományba esik nyomtatható karakternek számít. A kurzorral kijelölt pozícióban kerül tárolásra a szövegpufferbe és a videolapon jelenít meg.
A szövegszerkesztő értelmez vezérlőkódokat is. Az összes itt nem említett vezérlőkód figyelmen kívül marad.

00h (NUL) - nullkaraktert ír a videóra, ellenőrzendő, hogy rendben van-e.
09h (TAB) - ugrik vagy szóközt szúr be, a következő tabulációs pontig.
0Ah (LF) - nem kerül figyelembevételre.
0Dh (CR) - új sor elejére ugrik, egyenértékű a CR-LF-fel.
18h (^X) - a bal oldali margót a kurzor oszlopára állítja be.
19h (^Y) - töröl a sor végéig.
1Ah (^Z) - törli az egész puffert és a képernyőt, a kurzort pedig "home" pozícióba viszi.
1Bh (ESC) - indítja az escapeszekvenciát (l. később).

Az egyetlen escapeszekvencia, amit a szövegszerkesztő értelmez, a kurzor pozícionálása tetszés szerinti koordinátákra. Ez megegyezik a videokezelőnek azonos funkciót végző escapeszekvenciájával, és az erre vonatkozó részletes ismertetést a videokezelő specifikációja tartalmazza. A szekvencia a kurzort a videolap előírt koordinátáira teszi, függetlenül attól, hogy a szövegszerkesztő pufferének melyik része van megjelenítve.
A 0A0h-tól 0FFh-ig terjedő kódok pontosan olyan értelmezést kapnak, mintha azok a billentyűzetről érkeztek volna. Ezek különböző szerkesztési funkciókat és kurzormozgatást jelentenek. Részletesen a szerkesztési funkciókat tárgyaló fejezetben ismertetjük őket.

5. Olvasás a szövegszerkesztőből

Amikor a szövegszerkesztő karakterolvasási funkcióhívást kap, megvizsgálja a FLG_EDIT nevű EXOS-változót. Ez jelzőket tartalmaz, amelyek a szövegszerkesztő karakterolvasási hívásra adott válaszát vezérlik. A szövegszerkesztő feladatvégzését először általános szempontból ismertetjük anélkül, hogy utalnánk az egyedi jelzőkre. Az egyes jelzők hatását ezt követően részletesen ismertetjük.

5.1. A szövegszerkesztő alapvető olvasási tevékenysége

Tételezzük fel a jelzők tipikus beállítását a FLG_EDIG változóban. Amikor a szövegszerkesztő karakterolvasási hívást kap, akkor ezt úgy értelmezi, hogy egy sornyi szöveget kell visszaküldenie az alkalmazói programnak. Mielőtt bármit küldene, regisztrálja a jelzők állapotát, majd belép a fő szerkesztési hurokba, ami a felhasználó számára az aktuálisan kiválasztott szövegszerkesztési lehetőséget jelenti. A kurzor csak addig fog villogni a videolapon, ameddig a szövegszerkesztő ebben a hurokban van. A villogó kurzor tehát azt jelzi, hogy a szövegszerkesztő billentyű leütésére vár.
Ez a hurok beolvas egy karaktert a billentyűzetről, válaszol rá, majd visszalép egy másik karakter beolvasásához. Ez lehetővé teszi, hogy a felhasználó olyan szöveget gépeljen be, ami beszúrásra kerül a szövegszerkesztő pufferébe és megjelenítésre kerül a videolapon, továbbá lehetővé teszi különböző szerkesztési funkciók végrehajtását is. A szerkesztési funkciókkal kapcsolatos részleteket később ismertetjük. Két olyan billentyű van, amelyeknek nagyobb jelentősége van: az ESCAPE és az ENTER billentyűk.
Ha az ESCAPE-et (01Bh ASCII) kapjuk billentyűzetről, akkor ez a karakter azonnal visszaküldésre kerül az alkalmazói programokhoz, mint válasz a karakterolvasási hívásra, függetlenül a FLG_EDIT jelzők állapotától. Ez módot ad sorbeviteli művelet megszakítására.
Ha az ENTER-billentyűt (0Dh ASCII) ütjük le, akkor ez egy, a szövegszerkesztő számára szóló parancs, hogy kezdje el a szöveg visszaküldését az alkalmazói programhoz. Azt, hogy pontosan mennyi szöveg kerüljön elküldésre, a jelzők határozzák meg (l. később). Egy beállított belső szövegszerkesztő-jelző mutatja, hogy szövegküldés van folyamatban, majd az első karakter visszakerül az alkalmazói programhoz. Amikor az alkalmazási program kiad egy újabb karakterolvasás hívást, a belső jelző még beállított állapotban van, és ahelyett, hogy belépne a szövegszerkesztési hurokba, azonnal visszaküldi a kért szöveg következő karakterét. Ez folytatódik egészen addig, amíg a teljes, kért szöveg elküldésre nem került. Ekkor törlődik a belső jelző, és a következő karakterolvasás hívás újra be fog lépni a szövegszerkesztési ciklusba.
Annak felismerése, hogy mikor olvasta be az összes karaktert, (egy felesleges új olvasási művelet indításának elkerülése érdekében) az alkalmazói program feladata. A felismerés a szerkesztési jelzők beállításától függ, és ezt később ismertetjük.
Megjegyezzük, hogy a szövegszerkesztési jelzőket csak egyszer mintavételezzük, amikor az első karakterolvasási hívás történik, majd legközelebb csak akkor, ha az egész szöveget elküldtük. Ha karakterírási hívás történik, miközben olvasás folyamatban van, akkor a belső jelző törlődik, hogy az olvasás félbeszakadjon. Ez igaz akkor is, ha speciális funkcióhívás történik.

5.2. A szövegszerkesztő olvasás jelzői

A bithozzárendelések a FLG EDIT nevű EXOS-változóban a következők:

7. bit - SEND NOW (azonnali küldés)
6. bit - SEND ALL (az egész szöveg küldése)
5. bit - NO READ (nincs olvasás)
4. bit - NO SOFT (nincs puha CR)
3. bit - NO PROMPT (nincs prompt)
2. bit - AUTO ERA (automatikus törlés)
1. bit - nem használt
0. bit - nem használt

5.2.1. A SEND NOW (azonnali küldés) jelző (7. bit)

Ha ez a jelző beállított, akkor a szövegszerkesztő haladéktalanul elkezdi a szöveg visszaküldését anélkül, hogy egyáltalán bármit olvasna a billentyűzetről. Ha a jelző törölt állapotú, akkor a funkció belép a fő szerkesztési hurokba és semmilyen szöveget nem küld vissza, amíg a felhasználó le nem üti az ENTER billentyűt. Mindkét esetben a visszaküldött szöveg mennyisége a többi jelző beállításától függ.

5.2.2. A SEND_ALL (az egész szöveg küldése) jelző (6. bit)

Ez a főjelző, ami meghatározza az elküldenő szöveg mennyiségét. Ha törölt állapotú, akkor a kurzort tartalmazó bekezdés kerül elküldésre. Ha beállított állapotú, akkor elküldi a szövegszerkesztő pufferének teljes tartalmát.
Az első esetben az alkalmazói program egyesével kapja meg a bekezdés karaktereit, amit egy CR (kocsivissza), majd egy LF (soremelés) karakter zár le. Az alkalmazói program ezt a CR-LF együttest használhatja annak meghatározására, hogy mikor kell abbahagyni az olvasást. (Legyünk óvatosak, ha a NO_SOFT törölt állapotú - l. alább.) A kurzor a következő bekezdés első karakterén marad, és egy új üres bekezdés jön létre, ha a kérdéses bekezdés volt az utolsó.
Ha a SEND_ALL jelző beállított állapotú, akkor az egész puffert elküldi. Ez CR-LF szekvenciákat tartalmaz az egyes bekezdések között. Így ez nem használható a szöveg végének észlelésére. Ehelyett, az utolsó CR-LF elküldése után, a következő karakterolvasás .EOF hibát fog eredményezni. Ez a hiba csak egy karakternél lesz vehető, ezért az alkalmazói programnak észre kell vennie, és le kell állítania az olvasást. Ha még egy karaktert olvasna, akkor ez újraindítaná az egész olvasási folyamatot a puffer elejétől kezdve.

5.2.3. A ND_READ (nincs olvasás) jelző (5. bit)

Ha ez a jelző beállított állapotú, akkor az ENTER gyakorlatilag semmilyen karaktert nem fog visszaküldeni az alkalmazói programnak. Így az alkalmazói programhoz való visszatérés egyetlen módja az ESCAPE billentyű leütése. Noha egyetlen karaktert sem küld vissza a karakterértékelő rutin mégis végrehajtásra kerül, és a kurzor ugyanúgy mozog, mintha szöveget küldenénk vissza. Ha a SEND_ALL jelző törölve van, akkor az ENTER billentyű leütésének hatására a következő bekezdés elejére megy és létrehoz egy új sort, ha a puffer végénél tartózkodott. Emiatt a szövegszerkesztő úgy viselkedik, mint egy írógép.

5.2.4. A NO_SOFT (nincs puha CR) jelző (4. bit)

Ez a jelző az ún. "puha" kocsivissza és 'puha" szóköz kódok küldését vezérli. Puha kocsivissza kódok azok, amelyek egy bekezdés egymást követő sorait egymástól elválasztják. Puha szóközök pedig azok a szóközök, amelyeket szövegigazítási célból szúrunk be, valamint a sor bal oldali margója előtt lévő szóközök.
Ha ez a jelző törölt állapotú, akkor a puha szóközök normál ASCII szóközökként (20h), a puha kocsivissza kódok pedig normális CR-LF (kocsivissza-soremelés) szekvenciákként lesznek visszaküldve. Ha viszont a jelző beállított, akkor a fenti kódokat elnyomja a funkció és nem küld róluk semmilyen karaktert.
Legyünk óvatosak, ha mind a NO_SOFT, mind a SEND_ALL jelző törölve van, mivel ilyenkor az alkalmazói programnak nincs módja annak meghatározására, hogy az általa éppen vett CR-LF a bekezdés vége, amely esetben le kellene állítani az olvasást, vagy egyszerűen csak egy elválasztó karakter a bekezdés két sora között, amely esetben viszont folytatni kell az olvasást. Ezért a jelzőknek ezt a kombinációját el kell kerülni, azaz a kettő közül legalább az egyiket be kell állítani.

5.2.5. A NO_PROMPT (nincs prompt) jelző (3. bit)

Ez a jelző általában törölt állapotú. Ha beállított, akkor a rendszer emlékszik a kurzornak az olvasási művelet indításakor elfoglalt helyére. A szöveg visszaküldésekor, ha a kurzort nem vittük ki az eredeti bekezdésből, nem mozgattuk a megjegyzett pozíció elé, és a SENO_ALL jelző törölve van, akkor az aktuális bekezdést fogja visszaküldeni, de nem a bekezdés elejétől, hanem a megjegyzett pozícióban lévő karaktertől kezdve.
Ha a kurzort kimozdítottuk az említett határok közül, akkor a szokásos módon a teljes bekezdést küldi vissza a funkció, vagy pedig a szövegszerkesztő puffer teljes tartalmát, ha a SEND_ALL jelző beállított állapotú.
Ezt a tulajdonságot alkalmazza a BASIC, amikor INPUT parancsot hajt végre. Kiírja a promptot (a választ váró jelet), és végrehajt egy szövegszerkesztő olvasási műveletet a jelző beállított állapota mellett. Amikor a bekezdés a BASIC-hez küldődik, a prompt szöveg nem megy vissza, hanem csak a rá adott válasz.

5.2.6. Az AUTO_ERA (automatikus törlés) jelző (2. bit)

Normál körülmények között ez a jelző is törölt állapotú. Ha beállított - feltéve, hogy a billentyűzeten legelőször leütött karakter egy nyomtatható karakter, nem pedig szerkesztési funkcióval vagy kurzormozgatással kapcsolatos billentyű -, akkor a billentyűleütésre való válaszadás előtt törlődni fog az aktuális sor. Ez főleg a BASIC szempontjából jelentős, hogy a program megszerkesztése után egy meglévő sorra gépelhessünk rá parancsokat (pl. RUN stb.). Nyilván ennek más alkalmazói programok is hasznát vehetik.

5.3. Tipikus jelzőkombinációk

A tárgyalt jelzők használata bonyolultnak tűnhet, ezért a jelen fejezet néhány példát ismertet e jelzőknek az IS-BASIC-ből és a beépített szövegszerkesztőből (WP) való használatára. Az ismertetés a leghasznosabb kombinációkat tárgyalja.

5.3.1. Parancssor olvasása BASIC-ből (Jelzők = 000101xx)

Amikor a BASIC parancssort olvas a szövegszerkesztő programból, akkor azonnali üzemmódú parancsot (pl. RUN) vagy sorszámmal kezdődő új sort vár. Mindkét esetben egyetlen, a felhasználó által beírt bekezdést akar olvasni. Ez lehet egy általa begépelt új sor vagy egy, a szerkesztési pufferben létező sor, amire ráállítja a kurzort és újólag belépteti.
Világosan szólva, a BASIC vár arra, hogy a felhasználó ENTER-t gépeljen és így a SEND NOW (azonnali küldés) jelző törölve van. Csak egyetlen bekezdést és nem az egész puffertartalmat akarja, ezért a SEND ALL (összes szöveg küldése) jelző is törölve van. Ezenkívül a BASIC ténylegesen a szöveg elküldését kívánja, ezért a NO READ (nincs olvasás) jelző törölve van. A BASIC-et nem érdekli, hogy a sorok a bekezdésben tördelve legyenek (mivel egy parancssor néhány képernyősornyi terjedelmű is lehet), ezért a NO SOFT jelző beállított állapotú. A NO PROMPT törölve van, az AUTO ERA viszont beállított állapotú, amint a fentiekben ezeket magyaráztuk.

5.3.2. Input parancs BASIC-ben (Jelzők = 000110xx)

Amikor a BASIC input parancsot hajt végre, akkor be akar olvasni egy bekezdést, ezért a SEND NOW, SEND ALL, NO READ és NO SOFT jelzők mind ugyanúgy vannak beállítva, mint a parancs olvasásánál. Ebben az esetben azonban a BASIC kiírt egy promptot és csak a kapott választ akarja beolvasni, a promptot pedig nem. Ennek elérésére beállítja a NO PROMPT jelzőt. Az AUTO ERA jelző törölve van.

5.3.3. A szövegszerkesztő normál szerkesztési üzemmódja (Jelzők = 001xx0xx)

A normál szerkesztési üzemmódban a szövegszerkesztő hagyja, hogy a felhasználó szerkesztési feladattal foglalkozzon anélkül, hogy adatokat küldene a szövegszerkesztőnek. A SEND NOW jelző törölve van, hogy a felhasználó a szerkesztéssel tudjon foglalkozni. A SEND ALL jelző állapota törölt, a NO READ jelzőé pedig beállított azért, hogy ne kerüljenek karakterek a szövegszerkesztő programhoz, amikor az ENTER-billentyűt leütjük, de a kurzor a következő bekezdés elejére mozogjon. A NO SOFT és NO PROMPT jelzők állapota érdektelen, amikor a NO READ jelző beállított, az AUTO ERA jelző pedig törölve van.
Ennek az a hatása, hogy a felhasználó szabadon mozoghat a szövegrészben, leütheti az ENTER billentyűt és használhatja bármelyik szerkesztési lehetőséget. A szövegszerkesztő az alkalmazói programot csak az ESCAPE billentyű leütésekor riasztja. Gyakorlatilag a nyolc funkcióbillentyűnél az ESC a beprogramozott jelsorozat első kódja, ezért a szövegszerkesztő akkor is visszatér, ha ezeket a billentyűket leütjük.

5.3.4. A szövegszerkesztő szöveget nyomtat (Jelzők = 11000xxx)

Amikor a szövegszerkesztőtől egy szöveg kinyomtatását kérjük, akkor annak a teljes szerkesztői puffertartalmat be kell olvasnia. Ilyenkor azonnal az adatokat várja anélkül, hogy az ENTER billentyű leütésére várna. Ennek elérése érdekében a SEND NOW, és a SEND ALL jelzők beállításra kerülnek. A NO READ jelző természetesen törölt állapotú, különben nem lehetne szöveget küldeni és a NO SOFT is törölve van, tehát minden szóköz és "puha kocsivissza" kód elküldésre kerül annak biztosítására, hogy a kinyomtatott szöveg formázása helyes legyen. A NO PROMPT jelző törölt állapotú. Az AUTO ERA állapota nem számít, mivel a SEND NOW jelző be van állítva és így a felhasználó hiába is ütne le billentyűt.

6. Szerkesztési funkciók

A szövegszerkesztő számos szerkesztési és szövegfeldolgozási lehetőséget nyújt. Ezek vagy a felhasználó által a billentyűzeten leütött billentyűre adott válaszként, vagy az alkalmazói programból beírt ugyanezen kódokra adott válaszként kerülnek végrehajtásra. A következő részek a szerkesztési funkciókat írják le részletesen.
Bizonyos szerkesztési funkciók, mint pl. a bekezdés-mozgatás és a bekezdés-újraformázás, meglehetősen bonyolult belső műveletek végrehajtását kívánják meg. Ennek gyakran az az eredménye, hogy a képernyőkijelzés furcsán viselkedik, olyan görgetési műveleteket is végez, amelyekre esetleg nem számítunk.
A négy botkormányiránynak, valamint az INS, DEL és ERASE billentyűknek három-három olyan eltérő funkciója van, ami részletes magyarázatot kíván. Ezek a funkciók a következő módon válthatók ki:

Gyakorlatilag a CTRL funkciót az ALT billentyűvel is megkaphatjuk.

6.1. A kurzor mozgatása (a botkormány)

A kurzor mozgatása egy teljesképernyős szövegszerkesztő legalapvetőbb művelete. Az Enterprise számítógépen ezt a botkormánnyal hajtjuk végre, amit a SHIFT és CTRL billentyűkkel együtt is használunk. A botkormányhoz rendelt autorepeat (automatikus ismétlés) funkció folytonos kurzormozgatást tesz lehetővé.
A kurzort a videolapon bárhová elmozdíthatjuk, de nem vihetjük ki az oldalról. Ha kísérletet teszünk kivitelére az oldal tetejénél vagy aljánál, akkor a képernyőt a rendszer görgeti, miközben a pufferből további szövegrészt hoz be az oldalra. Amikor azonban a szöveg elejére vagy végére érünk, ez a görgetési lehetőség megszűnik.
A kurzor túlmozgatható a sor végén, vagy a margóbeállításokon kívülre anélkül, hogy ez a szövegre hatást gyakorolna. Amikor azonban begépelünk egy karaktert, extra szóközök lépnek be a kurzorig terjedő pozíciók kitöltésére, és esetleg szóátvitel is történhet, ha a kurzor a margókon kívül tartózkodik.
Jóllehet a szövegszerkesztő a kurzornak csak négy (derékszögű) irányban való mozgatását biztosítja, mégis lehetséges az átlós irányú mozgatás is. Ha ugyanis a botkormányt átlós helyzetei egyikébe állítjuk, akkor a billentyűzetkezelő automatikus ismétlési funkciója a két megfelelő helyzetkódot váltakozva küldi vissza és így a szövegszerkesztő váltakozva fogja végrehajtani azokat. Ez csak önálló kurzormozgásoknál használható, SHIFT-tel vagy CTRL-lel való alkalmazás esetén nem.
A lehetséges kurzormozgások és kódjaik a következők:

Botkormánymozgatás
Billentyűkód
Funkció
FEL
0B0h
Kurzor egy sorral fel
Shift - FEL
0B1h
Kurzor egy oldallal fel
Ctrl -FEL
0B2h
Kurzor egy bekezdéssel fel
LE
0B4h
Kurzor egy sorral le
Shift - LE
0B5h
Kurzor egy oldallal le
Ctrl - LE
0B6h
Kurzor egy bekezdéssel le
BALRA
0B8h
Kurzor egy karakterrel balra
Shift - BALRA
0B9h
Kurzor a sor elejére
Ctrl - BALRA
0BAh
Kurzor a balra lévő szóra
JOBBRA
0BCh
Kurzor egy karakterrel jobbra
Shift - JOBBRA
0BDh
Kurzor a sor végére
Ctrl - JOBBRA
0BEh
Kurzor a jobbra lévő szóra

6.1.1. A kurzor lépése egy karakterrel balra és jobbra

Az egyszerű balra és jobbra mozgatások a kurzort egy karakterrel balra, ill. jobbra mozgatják. Nincs egyik sorból a következőbe való átlépés, tehát ha kísérletet teszünk a kurzor továbbmozgatására, amikor az a videolap bal vagy jobb szélső helyzetében van, akkor ez hatástalan marad.

6.1.2. A kurzor ugrása sor kezdetére és végére

A botkormány balra vagy jobbra mozgatásának hatására - miközben a SHIFT-billentyűt lenyomva tartjuk - a kurzor az aktuális sor elejére, ill. végére fog ugrani. A sor eleje a sorban lévő első tényleges karakter, leszámítva minden szóközt, ami abban a sorban a bal oldali margóig található. A sor vége pedig a sorban lévő utolsó tényleges karakter, leszámítva az olyan sorvégi szóközöket, amelyek a pufferben nincsenek tárolva, (bár létrehozhatók olyan szóközök is, amelyek benne vannak a pufferben).

6.1.3. A kurzor ugrása bal vagy jobb oldali szóra

A botkormány balra vagy jobbra mozgatásának hatására - miközben a CTRL-billentyűt lenyomva tartjuk - a kurzor egy szónyit balra vagy jobbra ugrik. A szó pontos meghatározása meglehetősen bonyolult, alapvetően azonban egy alfanumerikus és/vagy egy nem alfanumerikus karakterekből álló jelsorozat. Az egy szóval balra vagy jobbra történő mozgatás átvitelt eredményezhet a sorok között.

6.1.4. A kurzor ugrása egy sorral fel és le

A közvetlen botkormány fel vagy le műveletek a kurzort egy sorral felfelé vagy lefelé mozgatják. A kurzor ilyenkor mindig ugyanabban az oszloppozícióban marad. Ha a kurzor a videolap tetején vagy alján tartózkodik, akkor - feltételezve, hogy még több sor is van a pufferben - a rendszer a videolapot megfelelően görgetni fogja, hogy újabb sort hozzon a képernyőre. Ha a kurzor a szöveg első vagy utolsó során áll, akkor semmi nem történik.

6.1.5 A kurzor ugrása egy oldallal fel és le

Ha a SHIFT-billentyűt lenyomva tartva a botkormányt felfelé mozdítjuk, a kurzor egy lappal felfelé ugrik. Ha a kurzor a videolap legfelső sorában van, akkor a lap eggyel kevesebb sorral görgetődik, mint a lap magassága, tehát a legfelső sorból legalsó sor lesz, a videolap többi része pedig a pufferből vett új sorokat tartalmazza. Ha nincs elegendő sor a pufferben, akkor a görgetés befejeződik, amikor a szöveg első sora a videolap legfelső sorába kerül. Ha a kurzor nem a lap tetején volt, akkor a funkció a lap legfelső sorába visz.
Az egy lappal lefelé történő mozgatásnál a helyzet hasonló, csak a kurzor a lap legalsó sorába kerül, hacsak egyébként ott van. Ez esetben a lap felfelé fog gördülni. Bármelyik esetről legyen szó, a kurzor mindig ugyanabban az oszlopban marad, mint amiben az indulás pillanatában volt.

6.1.6. A kurzor ugrása egy bekezdéssel fel és le

A kurzor ugrása egy bekezdéssel (a CTRL-billentyű használatával) meglehetősen bonyolult, eltér a többi fel- és lefelé mozgatástól. Az egy bekezdéssel felfelé való mozgatáskor a kurzor az aktuális bekezdés első karakterére kerül, hacsak már eddig is nem ott volt. Ez utóbbi esetben az előző bekezdés első karakterére kerül. A videolap természetesen megfelelő módon görgetődik, hogy a kurzor. a képernyőn maradjon.
Az egy bekezdéssel való lefelé mozgatás a kurzort mindig a következő bekezdés elejére helyezi kivéve, ha a kurzor az utolsó bekezdésben tartózkodik. Ez utóbbi esetben a bekezdés végén marad.

6.2. A beszúrás és a beszúrási üzemmód vezérlése (INS billentyű)

Az INS (beszúrás) billentyűnek a következő három funkciója van:

Billentyű
Billentyűkód
Funkció
INS
0A8h
- szóköz beszúrása
Shift - INS
0A9h
- új sor beszúrása
Ctrl - INS
0AAh
- beszúrás / felülírás üzemmód, váltogatva.

6.2.1. Szóközök és sorok beszúrása

Amikor az INS-billentyűt önmagában használjuk, akkor egyszerűen beszúr egy szóköz karaktert a kurzor által kijelölt pozíció elé és a kurzort ezen a Szóközön hagyja. Nagyon hasznos néhány karakter beszúrására, amikor felülírási üzemmódban vagyunk (l. később). Ezt úgy hajtjuk végre, hogy egyszerűen beszúrjuk a megfelelő számú szóközt és aztán felülgépeljük azokat a szükséges karakterekkel.
Ha az INS-billentyűt a SHIFT-billentyűvel együtt használjuk, akkor az aktuális sort egy "kemény" kocsivissza karakter (azaz egy "bekezdés vége" jelzés) kettébontja a kurzor által kijelölt pozíciónál. Ha a kurzor sor elején vagy végén tartózkodik, akkor ennek olyan hatása lesz, mint egy üres sor beszúrásának.

6.2.2. A beszúrási és felülírási üzemmód váltása

Amikor az INS-billentyűt a CTRL-billentyűvel együtt használjuk, akkor az ide-oda kapcsolgatást végez a beszúrási és felülírási üzemmódok között, amelyek közül a kezdeti, alapértelmezés szerinti üzemmád a felülírás. Az aktuális üzemmódot a kurzor jelzi. Felülírási üzemmádnál ez a 14-es karakter (négyszög alakú tömb), beszúrási üzemmódnál pedig a 30-as karakter (balra mutató nyíl).
Ha felülírási üzemmódban karaktert gépelünk olyan helyre, ahol már van karakter, akkor a régi karaktert az új felülírja. Beszúrási üzemmódban az új karakter viszont a régi karakter elé kerül, a régi karakter pedig a sor után következő többi részével együtt egy karakterpozícióval jobbra tolódik.
A felülírási vagy a beszúrási üzemmód hatást gyakorol a szótördelési funkció működésére, és a soroknak a puffer közepénél való szétbontására is.

6.3. Kiejtés és törlés

A DEL és ERASE billentyűk funkciója nagyon hasonló, mert mindkettő karaktert töröl a pufferből. A DEL-billentyű alapvetően jobbra, az ERASE-billentyű pedig balra halad. Mindkét billentyűnek három funkciója van, amelyek megfelelnek a vízszintes kurzormozgatás három típusának

Billentyű
Billentyűkód
Funkció
DEL
0A0h
- a jobbra eső karakter kiejtése
Shift - DEL
0A1h
- a jobbra eső sor kiejtése
Ctrl - DEL
0A2h
- a jobbra eső szó kiejtése
ERASE
0A4h
- a balra eső karakter törlése
Shift -ERASE
0A5h
- a balra eső sor törlése
Ctrl - ERASE
0A6h
- a balra eső szó törlése

6.3.1. Karakterek kiejtése és törlése

Ha a SHIFT és CTRL billentyűk nélkül használjuk, akkor mind a DEL, mind az ERASE billentyű egy karaktert töröl, és a sor megmaradt részét úgy mozgatja, hogy a keletkezett rés betöltődjön. A DEL a kurzor által kijelölt pozícióban törli a karaktert és a kurzort ugyanabban a pozícióban hagyja, míg az ERASE a kurzor pozíciójától balra lévő karaktert törli és ezután a kurzort az előző karakterre állítja.
Mindkét funkció átvitelt végezhet a sorok között és felhasználható sorok összekapcsolására. Ha a kurzor egy sor első karakterén áll, akkor az ERASE ezt a sort hozzá fogja kapcsolni az előző sorhoz. A sorelválasztó egy karakternek számít. A DEL funkció az aktuális sort a következő sorhoz fogja csatolni, ha a sor végén került végrehajtásra.

6.3.2. Sorok kiejtése és törlése

Amikor az ERASE és DEL billentyűket a SHIFT-tel együtt használjuk, akkor azok törlést végeznek az aktuális sor elejéig, ill. végéig. Ha már eleve a sor elején vagy végén kerültek végrehajtásra, akkor semmi sem történik, mivel ezek a funkciók nem tudnak sorokat összekapcsolni.

6.3.3. Szavak kiejtése és törlése

Amikor az ERASE és DEL billentyűket a CTRL-lel együtt használjuk, akkor azok egy szót törölnek. A szó definíciója ugyanaz, mint a kurzormozgatásnál volt. A szó törlése karakterek ismétlődő törlését jelenti, amíg el nem jut a szó végére. Ezek a funkciók összekapcsolják a sorokat, és a sorelválasztó is egy szónak számít. A DEL itt is jobbra, az ERASE pedig balra végez törlést.

6.4. TAB billentyű

A TAB billentyű (09h billentyűkód) a kurzort a következő tabulálási ponthoz vagy pedig a következő sor elejére mozgatja, ha a szóban forgó sorban már nincs több tabulálási pont. Az aktuális TAB beállításokat a vonalzón láthatjuk, ha az ki van jelezve.
Felülírási üzemmádban a kurzor egyszerűen a következő tabulálási ponthoz ugrik. Beszúrási üzemmódban a funkció a következő tabulációs pont eléréséig szóközöket szúr be, a sorban lévő összes szöveget pedig jobbra tolja. Amikor beszúrás üzemmódban új sor elejére lép, szóközöket szúr be egészen a jobb oldali margóig, majd ezután egy új sort fog beszúrni, nem pedig "bekezdés vége" jelet.

6.5. A szerkesztési funkcióbillentyűk

A bonyolultabb szerkesztési funkciókat, különösen a szövegfeldolgozás típusúakat a nyolc funkcióbillentyű, valamint a CTRL vagy ALT billentyűk segítségével oldjuk meg. Ez 16 lehetséges szerkesztési funkciót biztosít, bár ezek közül csak 14 létezik, mivel a 8-as funkcióbillentyűt nem használjuk. Ezt a 14 szerkesztési funkciót a hozzájuk tartozó billentyűkóddal és megnevezéssel együtt felsoroljuk, majd részletesen is tárgyaljuk.

Billentyű
Billentyűkód
Funkció
Ctrl - F1 0F0h - bekezdés újraformázása
Ctrl - F2 0F1h - sor középre állítása
Ctrl - F3 0F2h - tabulálás ki- / bekapcsolása
Ctrl - F4 0F3h - bal margó beállítása
Ctrl - F5 0F4h - margók feloldása
Ctrl - F6 0F5h - bekezdés mozgatása felfelé
Ctrl - F7 0F6h - sorszín megváltoztatása
Alt - F1 0F8h - bekezdés kiegyenlítése
Alt - F2 0F9h - összes tabulációs pont törlése
Alt - F3 0FAh - a vonalzósor kijelzés be- / kikapcsolása
Alt - F4 0FBh - jobb margó beállítása
Alt - F5 0FCh - margók és tabulálási pontok alapállapotba állítása
Alt - F6 0FDh - bekezdés mozgatása lefelé
Alt - F7 0FEh - bekezdésszín megváltoztatása

6.5.1. Bekezdés újraformázása és kiegyenlítése (CTRL-F1 és ALT-F1)

A bekezdés újraformázása és kiegyenlítése nagyon hasonló funkciók, gyakorlatilag a kiegyenlítés újraformázást és kiegyenlítést is végez. Mindkettő műveletének tárgya a kurzort tartalmazó bekezdés és a kurzort a műveletek a következő bekezdés elején hagyják. Ez azt jelenti, hogy ha ezeket a billentyűket ismételten leütjük, akkor a szövegrészben lévő bekezdések sorra formázódnak (vagy kiegyenlítődnek) anélkül, hogy szükség lenne a botkormány használatára.
Az újraformázás a bekezdés elejétől halad a végéig. Menet közben minden egyes sor bal oldali margóját az érvényes margóra állítja, eltávolít minden (az előző kiigazításból maradt) "puha" szóközt, szótördelést végez az aktuális jobb oldali margónál, összekapcsolva a sorokat, ahol ez lehetséges.
Ennek eredménye, hogy az új bekezdés pontosan úgy fog megjelenni, mintha a bekezdés összes karakterét újonnan gépeltük volna be, és minden más szerkesztési műveletből korábbról visszamaradt rendezetlen kinézetű szövegrész újraformázásra kerül.
A kiegyenlítés ugyanezt csinálja, de ezen kívül a bekezdés minden sorába "puha" szóközöket is beszúr (kivéve az utolsót), hogy minden sor pontosan a jobb oldali margóra fusson ki.

6.5.2. Sor középre helyezése (CTRL-F2)

A központosítás elég egyszerű funkció, amelynek műveleti tárgya egyetlen sor, és nem pedig bekezdés. Megfelelő számú szóközt szúr be a sor elé ahhoz, hogy az középre kerüljön az aktuálisan érvényes margóbeállítások között. Az elől és hátul álló szóközöket előzetesen eltávolítja, hogy azok a középre helyezés műveletét ne zavarják. A kurzort a művelet a sor elején hagyja. Ha a sor túlságosan hosszú, hogy elférjen a margók között, akkor a sor a bal oldali margó pozíciójánál kezdődik.

6.5.3. A vonalzósor kijelzésének ki- / bekapcsolása (ALT-F3)

A vonalzósor egy piros színű vonal, amit a videolap legfelső sorában lehet megjeleníteni. Jelzi a bal és jobb oldali margók helyét, és a tabulációs pontok pozícióit is.
A bal oldali margót egy L, a jobb oldalit pedig egy R betű jelzi. A tabulálási helyeket egy-egy függőleges vonalka jelzi, a szegélybeállítások közötti többi karakterpozíciókat pedig szaggatott vonalkák mutatják. Ha a margóbeállításokat megszüntetjük (felszabadítjuk), akkor a vonalzósor jobb szélső pozíciójában egy csillag jelenik meg.
A funkcióbillentyű a vonalzósor kijelzést be- és kikapcsolja. Az alapértelmezési beállítás a kikapcsolt állapot. A tabulációs pontokkal és margókkal kapcsolatos lehetőségek mindegyike használható, függetlenül attól, hogy a vonalzósor-kijelzés megjelenített-e vagy sem, bár zavaró lehet, ha nincs. A beépített szövegfeldolgozó program a felhasználó részére bekapcsolja a vonalzósor-kijelzést.

6.5.4. Tabulálás be- / kikapcsolása és törlése (CTRL-F3 és ALT-F2)

A tabulálás be- / kikapcsolás elhelyez egy tabulációs pontot az aktuális kurzoroszlopban vagy eltávolítja azt, ha ott már volt egy ilyen. Tabulációs pontokat csak az aktuálisan érvényes margópozíciók között lehet beállítani. Ha a szegélybeállításokat elmozgatjuk, akkor azokra a tabulálási beállításokra, amelyek a margókon kívülre kerültek, a rendszer emlékezni fog. Ajánlatos a vonalzósort kijeleztetni, amikor ezt a funkciót használjuk.
Az összes tabulációs pontot (beleértve azokat is, amelyek kívülesnek a margókon, és ezért a vonalzósoron nem láthatók) törölhetjük egyetlen funkcióbillentyű leütésével. Ez olyankor hasznos, amikor saját tabulálási pontjaink beállítása előtt meg akarunk szabadulni a régiektől.
Amikor egy szövegszerkesztő csatornát megnyitunk, akkor a tabulációs pontok alapértelmezés szerint minden nyolcadik karakterpozíciónál jönnek létre, mivel ez felel meg a fix tabulálási ponttal rendelkező gépeken használt szabványos beállításnak.

6.5.5. Bal és jobb margó beállítása (CTRL-F4 és ALT-F4)

A bal és jobb margók határozzák meg, hogy a videolapnak mely részét használhatjuk fel szöveg beírására és megjelenítésére. Amikor egy szerkesztési csatornát megnyitunk, akkor a margóbeállítások a lehetséges legszélesebb beállítási lehetőségre történnek. A felhasználó új margópozíciókat állíthat be, ha a kurzort a kívánt oszlopra állítja, és megnyomja a megfelelő funkcióbillentyűt.
A jobb margó bármely olyan oszlopban lehet, ami kettővel kevesebb, mint a videolap szélessége. Így például egy 40 oszlopos megjelenítésnél (ami a BASIC alapértelmezésű beállítása), a jobb margó maximális értéke 38. A bal margó bármely oszlopban lehet 1-től a jobb margónál eggyel kevesebb értékig. A BASIC alapértelmezésű margóbeállításai: bal margó az 1-es oszlopban, jobb margó a 38-as oszlopban.
Ha jogosulatlan margópozíciók beállítására teszünk kísérletet, akkor ez mindkét margónál az alapértelmezés szerinti beállításuk megvalósulását fogja eredményezni. Az alkalmazói programok is használhatják ezeket a kódokat a margók beállítására, de van egy speciális funkcióhívás is, amellyel módunk van beállítani a margókat vagy leolvasni azok aktuális beállítását. Ezt később ismertetjük.

6.5.6. Margók oldása (CTRL-F5)

Ez a funkció átbillentős működésű, az első lenyomásra oldja a margókat, majd a funkcióbillentyű újabb lenyomásakor visszaállítja őket. Amikor a margókat kikapcsoljuk, akkor a margók kijelzettek maradnak a vonalzósoron, de egy csillag jelenik meg a vonalzó jobb szélső helyzeténél.
Ha a margókat kikapcsoljuk, akkor azok a műveletek, amelyek margóval dolgoznak, az alapértelmezés szerinti beállítási értékeket fogják alkalmazni. Így például a szavas tördelési művelet a jobb margó helyett a videolap jobb szélső karakterpozíciójánál kettővel kisebb pozícióra hajtódik végre, és karaktereket a szegélybeállításokon kívülre is begépelhetünk.

6.5.7. Margók és tabulálási pontok alapállapotba állítása (ALT-F5)

Ez a funkcióbillentyű a margóbeállításokat alapértelmezés szerinti értékeikre állítja, ill. az alapértelmezés szerinti helyeknél hozza létre a tabulációs pontokat (azaz minden nyolcadik oszlopnál).

6.5.8. Bekezdés mozgatása felfelé és lefelé (CTRL-F6 és ALT-F6)

Ezeket a funkciókat bekezdéseknek felfelé vagy lefelé történő mozgatására használhatjuk. Mindén billentyűleütés a bekezdést egy sorral feljebb vagy lejjebb mozgatja, kivéve, ha az már a puffer elején vagy végén van. Bekezdésnek egynél több sorral való mozgatásához többször kell ezeket a billentyűket lenyomni.
A mozgatandó bekezdés definíció szerint az aktuális kurzorsorral (a kurzor által kijelölt sorral) kezdődik és a következő "bekezdés vége" jelnél fejeződik be. Ezért ha egy teljes bekezdést kívánunk mozgatni, akkor először a kurzort a szóban forgó bekezdés első sorára kell állítani. A bekezdésnek ez a definíciója biztosítja, hogy egy bekezdést egy másikon keresztül hibátlanul mozgathassuk.

7. Speciális funkcióhívások

7.1. Margópozíciók beállítása

A margópozíciókat a felhasználó vagy az alkalmazói program állíthatja be funkcióbillentyűvel. Az alkalmazói program használhat - speciális funkcióhívás formájában - egy általánosabb módszert is. E hívás paraméterei a következők:

Az oszlopszám l-től a videolap szélességéig terjedhet az érvényes margóbeállításokra vonatkozó szokásos megszorítások mellett. Két olyan speciális érték van, amelyeket az új bal és jobb margóparamétereknek adhatunk. Ha közülük valamelyik 0FFh, akkor az aktuális kurzorpozíció lesz a margó helye. Ha közülük valamelyik nulla, akkor az a margóbeállítás változatlan marad. Az aktuális margóbeállítások beolvasásához a DE regisztert állítsuk nullára.

7.2. Szövegfile-ok betöltése és tárolása

Két speciális funkcióhívás létezik a szövegfile-ok betöltésére és tárolására. A tárolt szöveg formája megegyezik az EXOS-kernel specifikációjában ismertetett szabványos EXOS-file modullal. A szövegszerkesztő szövegfile-jainak modultípusa $$EDIT (=8) és a modulfejrész nem is tartalmaz más információt.
A két funkció közül a tárolás az egyszerűbb. A hívásnak elő kell írni egy csatornaszámot és ezt a csatornát meg kell nyitni, mielőtt a hívást kiadnánk. A szövegszerkesztő fel fog írni egy megfelelő modulfejrészt, amit a dokumentum adatai követnek. A végén nem ír ki file-vége fejrészt, mivel az alkalmazói program esetleg egy többmodulos file-t kíván létrehozni.

A betöltés ennél egy kicsit bonyolultabb. A speciális funkcióhívás kiadása előtt a file-t, amiből a betöltést el kell végezni, meg kell nyitni és be kell olvasni egy $$EDIT típusú file-fejrészt. Ezután hívható a szövegszerkesztő (editor), amelynek át kell adni a csatorna számát, ahonnan a töltést el kell végezni. A szövegszerkesztő először kitöröl minden szöveget a pufferéből, majd betölti az új szöveget a file-ból. A betöltést sorról sorra végzi, és mielőtt áttérne egy következő sorra, mindig ellenőrzi, hogy a betöltött sor érvényes-e. Ha érvénytelen sort talál vagy ha a puffer megtelik, akkor leállítja a betöltést és .EDINV vagy .EDBUF hibakódot ad. Ilyenkor a pufferben lévő összes előző sor érvényes lesz. A kurzor a szövegrész elején marad.
A betöltés funkcióhívásának paraméterei:

A tárolt szövegrész tartalmazza a szöveg karaktereit, továbbá tartalmaz információkat a bekezdésszerkezetre, az egyes sorok bal oldali margópozícióira, valamint az egyes sorok színeire vonatkozóan. Így ha egy szövegrészt kimentünk és betöltjük egy ugyanakkora méretű pufferbe és videolapra, akkor az változatlan formában kerül vissza.
A szövegszerkesztő opcióira vonatkozó információt nem tárolja a file-lal, így minden tabulálási beállítást, aktuális margóbeállítást újra be kell majd állítani, amikor a file betöltésre került.
A szövegrészt egy eltérő méretű szövegszerkesztő csatornába is betölthetjük, de esetleg az eltérő sorhosszak miatt nem lesz jó a szöveg elhelyezkedése, vagy nem fér bele az új pufferbe, ha az kisebb.

8. A hibakezelés

A szövegszerkesztő belsejében a normál működés során generálható egyetlen hiba (eltekintve a szövegrészek betöltésétől és tárolásától, a csatornák megnyitásától, a nem megengedett speciális funkcióhívásoktól és az ismeretlen escape szekvenciáktól) a .VCURS hiba, amit olyankor küld a rendszer, ha érvénytelen kurzorhelyzetet adtunk meg a kurzorpozícionáló escape szekvenciában.
Tekintve azonban, hogy a szövegszerkesztő egy videolappal és egy billentyűzetcsatornával folytat kommunikációt, kaphat hibákat ezekről a csatornákról is. Általában egy hiba, ami ezen csatornák valamelyikéből származik, azt jelenti, hogy a csatorna valamiképpen helytelenül viselkedik. Ha például valaki átcímezte a szövegszerkesztő videocsatornáját egy másik perifériára vagy esetleg lezárta a csatornát, akkor a szövegszerkesztő természetesen hibákat fog kapni a videocsatornáról.
Ha hiba érkezett ezen csatornák egyikéről, akkor a szövegszerkesztő .EKEY vagy .EVID hibajelzést küld az alkalmazói programnak. Számontartja, hogy ez a hiba előfordult, és valahányszor legközelebb bármilyen EXOS-hívással hívjuk, ellenőrzi a csatornát (egy nullát ír a videora vagy a billentyűzetről állapotot olvas), hogy kipróbálja, rendben van-e az. Ha rendben működik, akkor törli a hibajelzést és normál módon továbbhalad. Ha nem működik rendesen, akkor elküldi a megfelelő hibakódot (.EKEY vagy .EVID) a felhasználónak és nem hajtja végre a funkcióhívást.
Ez az eljárás biztosítja, hogy az alkalmazói program kommunikálni tud, amikor a szövegszerkesztőnek gondja van a másodlagos csatornáival, és kísérletet tesz annak rendbehozatalára.
Így éled újra a BASIC, ha a szövegszerkesztő videocsatornáját lezárjuk. A BASIC ezt felfedezi és újra megnyitja a csatornát.
További jellemző az, hogy ha egy NULL-karaktert (0-s ASCII kód) írunk a szövegszerkesztőre, akkor az, ahelyett, hogy figyelmen kívül maradna, közvetlenül a videolapra íródik, amely viszont nem vesz tudomást erről. Ez lehetővé teszi, hogy ellenőrizzük a szövegszerkesztő videocsatornájának létezését, miközben a szövegszerkesztő adataira semmiféle befolyást nem gyakorlunk.

9. Szövegszerkesztő összefoglaló

EXOS-hívások

CSATORNA MEGNYITÁS / LÉTREHOZÁS
A két hívás azonos kezelésmódban részesül. Támogatja a többcsatornás működésmódot. A periférianév: "EDITOR:". A file-név és az egységszám ignorálódik. A csatorna megnyitása előtt fel kell tölteni a VID_EDIT, KEY_EDIT, BUF_EDIT nevű EXOS-változókat.

CSATORNA LEZÁRÁSA / TÖRLÉSE
A két hívás azonos kezelésmódban részesül.

KARAKTER / BLOKK OLVASÁSA
Karaktereket küld vissza a pufferből, miután lehetővé tette, hogy a felhasználó szerkesztést végezzen. A működést a FLG_EDIT nevű EXOS-változó vezérli.

KARAKTER / BLOKK ÍRÁSA
Nyomtatható karaktereket tesz a pufferbe és megjelenti ezeket. Választ küld bizonyos vezérlőkódokra és az ESC= szekvenciára. Bizonyos, 0A0h feletti kódok szerkesztési funkciókat végeznek.

ÁLLAPOT OLVASÁSA
C = 0-t küld válaszként, ha a karakterolvasás hívás azonnal egy karaktert küld és nem engedi meg a felhasználónak szerkesztés végzését. Egyébként C = 1-et válaszol vagy C = 0FFh-t, ha éppen akkor fejezett be egy SEND ALL-t (teljes puffertartalom elküldését).

ÁLLAPOT BEÁLLÍTÁSA
Nem kezelt.

SPECIÁLIS FUNKCIÓ
@@ MARG = 24 margók beállítása és olvasása
@@ CHLD = 25 szöveg-file betöltése
@@ CHSV = 26 szöveg-file kimentése

EXOS-változók

VID_EDIT - videolap csatornaszám
KEY_EDIT - billentyűzetcsatorna csatornaszám
BUF_EDIT - pufferméret, 256 byte többszörösében megadva
FLG_EDIG

- jelzők a szövegszerkesztőről való olvasás vezérléséhez

  • b7 - SEND NOW (küldés azonnal)
  • b6 - SEND ALL (mindent elküldeni)
  • b5 - NO READ (nincs olvasás)
  • b4 - NO SOFT (nincs "puha" CR stb.)
  • b3 - NO PROMPT (nincs prompt)
  • b2 - AUTO ERA (automatikus törlés)
  • b0 és b1 - nem használt bitek

X.rész: A Nick chip programozása

Ellentétben a video eszközök többségével, amelyek többféle üzemmódot engednek meg az egész képernyőre, a NICK egy képen belül is többféle módot enged meg. A NICK fő jellemzői a következők:

1. Video RAM címzés

A Nick chip 64K memóriát tud megcímezni, ezt video RAM-nak hívjuk. Négy szegmensből áll: 0FCh-tól 0FFh-ig. Így a Nick az Enterprise 64-es teljes belső memóriáját képes címezni, de a bővítéseket már nem.
A Nick chip ezt a 64k-t közvetlenül címzi, anélkül, hogy a Dave chip lapregisztereit használná. Például a 04000h címnél mindig a 0FDh lapot látja még akkor is, ha az be sincs lapozva. Figyelemmel kell lenni erre a jellemzőre, hogy elkerüljük az ellentmondásokat a Z80-as címzés és a Nick címzés között.

2. Sorparaméter tábla

A Nick által generált képernyő alapja egy adatblokk, amelynek sorparaméter tábla a neve. Ez 16 byte hosszú sorparaméter blokkokból áll. A sorparaméter tábla a video RAM bármelyik 16-tal osztható címén kezdődhet és tetszőleges számú sorparaméter blokkot tartalmazhat. A felhasználó egyszerűen betölti a sorparaméter tábla kezdőcímét a Nick egy regiszterébe, és a kép automatikusan generálódik.
Mindegyik sorparaméter blokk a képernyő egy részét vezérli, ennek neve: MODSOR. A blokk tartalmazza, milyen video módban van a MODSOR, valamint azt a video RAM kezdőcímet, ahol a képernyő adatok kezdődnek. A MODSOR 1 és 256 közötti sort tartalmazhat. A Nick chip generálja az adott MODSOR-hoz tartozó sorokat, és veszik a következő MODSOR-hoz tartozó sorparaméter blokkot.
Az utolsó sorparaméter blokkban kell lenni egy speciális bitcsoportnak, ami azt jelzi, hogy a blokkok feldolgozását a kép elejéről kell kezdeni. Normális esetben a sorparaméter tábla 312 sort tartalmaz (a teljes tv-képernyő). Speciális hatások vagy interface esetén a sorparaméter tábla nagyobb is lehet.
A Nick chip minden vízszintes időzítést elvégez, így minden sor video paraméterei megfelelőek lesznek. A függőleges időzítést a programozó vezérelheti.

3. Sorparaméter bázismutató

A kép generálásához a Nick chip-be kell tölteni a sorparaméter tábla kezdőcímét. Erre a célra két 8 bites regiszter áll rendelkezésre (LPL és LPH), amelyből csak a felső 12 bitet használja a chip, miután a tábla csak 16-tal osztható címen kezdődhet.
Ha a felhasználó új képernyőt akar megjeleníteni, mindössze a sorparaméter tábla kezdőcímet kell megváltoztatnia. A Nick ilyenkor befejezi az éppen kiírás alatt levő képet, betölti az új értéket, és az új sorparaméter táblával folytatja. Előfordulhat, hogy a felhasználó akkor tölti újra a bázismutatót, amikor a Nick saját újratöltését végzi. Ebben az esetben elképzelhető, hogy a cím egyik fele az új, a másik fele pedig régi cím. A Nick így rossz helyről veszi a sorparaméter táblát. Ez a gond megoldható, ha a báziscím töltését a video megszakítással szinkronizáljuk.
A Nick chip bekapcsolása után szemetet jelenít meg, amíg be nem töltődik a bázismutató. Ha új értéket adunk menetközben ennek, akkor mindaddig a régi képet fogja a Nick megjeleníteni, amíg a sorparaméter táblában megtalálja az újratöltés (RELOAD) bitsorozatot. Így a kép később jelenik meg, mint az új cím betöltése. Ennek a problémának megoldására az LPH regiszter két eddig nem használt bitje szolgál. Elérhető ugyanis a báziscím azonnali erőszakos újratöltése. Az LPH ezen bitje normál esetben egyesek. Az erőszakos újratöltési folyamat a következő:

  1. Írjuk az alsó 8 bitet az LPL-be.
  2. Írjuk a felső 4 bitet az LPH-ba, és nullázzuk a 6-os és 7-es biteket.
  3. Írjuk újra a felső 4 bitet, a 6-osba egyest, 7-esbe nullát tegyünk.
  4. Írjuk újra a felső 4 bitet, a 6-osba és a 7-esbe egyest tegyünk.

Ez az eljárás biztosítja, hogy az új sorparaméter tábla azonnal érvénybe lép.

4. Sorparaméter blokk

Minden sorparaméter blokk 16 byte-ból áll, amelyet a vízszintes visszafutás alatt olvas a Nick. A tizenhat byte a következő:

0 SC - Az adott MODSOR sorainak száma kettes komplemens alakban. A nulla 256 sort jelent.
1

MB - Mód byte.

b7
b6
b5
b4
b3
b2
b1
b0
VINT
SZÍN
MÓD
VRES
--- VIDEO MÓD ---
RELOAD
  • VINT - Ha be van állítva, ennek a MODSOR-nak a kezdetén megszakítás generálódik (lásd később).
  • SZÍN MÓD - Azt vezérli, hogyan fordítódnak a képernyőbyte-ok színbyte-okká.
    • 00 - Két színű mód
    • 01 - Négy színű mód
    • 10 - 16 színű mód
    • 11 - 256 színű mód
  • VRES - Beállítva teljes függőleges felbontást engedélyez, törölve csak korlátozott felbontás van a grafikus módokban.
  • VIDEO MÓD - Átfogó video mód. Azt vezérli, hogyan legyenek kiolvasva a képernyőbyte-ok a video RAM-ból.
    • 000 - VSYNC mód
    • 001 - PIXEL mód
    • 010 - ATTRIBUTE mód
    • 011 - CH256 mód
    • 100 - CH128 mód
    • 101 - CH64 mód
    • 110 - nincs használva
    • 111 - LPIXEL mód
2 LM
  • b0 ... b5 - bal margó.
  • b6 - ALTIND1 - a kiegészítő színeket vezérli
  • b7 - ALTIND0 - kétszínű karakter módban
3 RM
  • b0... b5 - jobb margó
  • b6 -LS BALT - a kiegészítő színeket vezérli
  • b7 -MS BALT - kétszínű grafikus módban
4 LD1L - elsődleges video adatcím. (alacsony byte)
5 LD1H - elsődleges video adatcím. (magas byte)
6 LD2L - másodlagos video adatcím. (alacsony byte)
7 LD2H - másodlagos video adatcím. (magas byte)
8 COL 0
9 COL 1
10 COL 2
11 COL 3
12 COL 4
13 COL 5
14 COL 6
15 COL 7 - Az első nyolc paletta szín. 256 színű módban nincs használva.

5. Jobb és bal margók

Minden vízszintes sor 57 szakaszra van felosztva. A Nick mindegyik szakaszban két byte-ot képes beolvasni. Az első 8 alatt történik a sorparaméter blokk olvasása. Az utolsó három szakasz a video RAM frissítésére szolgál. így a képernyő számára 46 szakasz marad.
A jobb és bal margó byte-ok adják meg, melyik szakasznál van a bal és a jobb margó. A margókon kívül lévő terület keretszínű lesz. A gyakorlatban a tv működése miatt néhány szakasz kívül eshet a látható képernyőn. Ha 42 szakasz szélességű képet használunk, és a bal margót 10-re, a jobb margót pedig 52-re állítjuk, akkor kielégítő eredményt kapunk.
A margók közötti aktív részre a Nick a video RAM-ból olvassa a byte-okat. A video módtól függően szakaszonként egy vagy két byte olvasása történik. A byte-ok konvertálását pixelekké már a szín mód határozza meg.
Ha a jobb margót alacsonyabb értékre állítjuk, mint a bal margót, akkor az egész sor keretszínűvé válik. Megjegyezzük, hogy a margóértékeknek speciális jelentésük van VSYNC módban, ahol a függőleges szinkronjelek ennek alapján generálódnak. Ez részletesen a függőleges szinkronizáció részben van leírva.

6. Szín mód és paletta regiszterek

A szín mód határozza meg, hogy a képernyőbyte-ok hogyan alakítódjanak át színekké. A Nick chipnek 8 színkimenete van, maximum 256 színt tud generálni. 256 színű módban a video RAM minden bájtja egyszerűen szín byte-ként kerül a kimenetre. Mindegyik más szín módban a képernyő-byte felosztódik valahány részre és bitkombinációk alapján választódik a szín a 16 palettaszínből. A színbyte-ok valódi színekké alakítását később tárgyaljuk.
A paletta színek első 8 byte-ja a sorparaméter blokk utolsó 8 elemében van megadva. Itt a 256 szín bármelyike szerepelhet, és ez a nyolc byte mindegyik MODSOR-nál más és más lehet. A maradék 8 szín (8-tól 15-ig) a következőképp generálódik: a Nick veszi a paletta színszám alsó három bitjét és összemásolja a FIXBIAS regiszter felső öt bitjével. A FIXBIAS egy önálló regiszter a Nick-on belül (080h-s port), és a fentieken kívül még más célokra is használt. Így tehát a fennmaradó 8 színre bármelyik 32-es színcsoport bármelyik 8 színe használható, de ez a nyolc szín ugyanaz lesz a teljes képernyőn. Kivéve, ha a FIXBIAS regisztert megszakítások során igen sűrűn változtatgatjuk!)
A képernyőbyte-ok átalakítása képelemekké a három szín módban különösen a 16 színű mód bitsorrendjére kell figyelni.

7. Pixel grafikus módok

PIXEL és LPIXEL grafikus módokban az LD2 mutató egyáltalán nincs használva. Az LD1 a video RAM-ban az első megjelenítendő byte-ra mutat. A byte-ok kiolvasása a video RAM-ból szekvenciálisan történik a képernyősor bal margójától a jobb margóig.
Ha a VRES értéke egy, akkor a következő sor kiolvasása a video RAM következő byte-ján indul.
Ha a VRES értéke nulla, akkor az LD1 visszaáll a video RAM már megjelenített sorának elejére, és a következő képernyősor is ugyanolyan lesz, mint az előző volt. így memóriát lehet megtakarítani az ismétlődő képernyősoroknál.
A video RAM byte-jainak értelmezése a beállított szín módtól is függ, mint azt már leírtuk. A különbség a PIXEL és LPIXEL mód között csak az, hogy PIXEL módban két byte kerül kiolvasásra egyszerre, míg LPIXEL módban csak egy. Íly módon az LPIXEL csak fele akkora vízszintes felbontást enged, és csak fele akkora RAM területet igényel.
Két speciális vezérlőbit használatos kétszínű grafikus módban. Az MSBALT és LSBALT a bal margót jelző byte két legfelső bitje. PIXEL módban a nagyfelbontású szöveges kijelzést szimulálják, és különböző színű karakterek megjelenítését segítik.
Ha az MSBALT értéke 1, akkor minden kijelzésre kerülő byte 7. bitje nulla értéket kap kijelzés előtt. Ha a 7. bit a kijelzendő byte-ban 1 volt, akkor a 0 és 1 paletta színek helyett a 3 és 4 lesz használva a byte által meghatározott pontokra.
Ha az LSBALT értéke 1, akkor minden kijelzésre kerülő byte 0. bitje 0 értéket kap kijelzés előtt. Ha az adott byte 0. bitje 1 volt, akkor a paletta színek közül nem a 0..3, hanem a 4..7 választódik ki.

8. Karaktermódok -64, 128 és 256

Karaktermódban az LD2 a karakterkészletre mutat, az LD1 pedig a kijelzendő karakterre. A karaktermód beolvasásra kerül és az annak megfelelő pontminta jelenik meg karakterhelyenként a képernyőn. Így egy sorban 42 karakter jeleníthető meg. A VRES értékét mindig nullázni kell, ha karaktermódot akarunk használni. A három karaktermód csak a karakterkészlet betűinek számában különbözik egymástól, és így természetesen befolyásolja a karakterkészlet RAM igényét. A karaktermódok leírásában mintául a 128-as karakterkészletet használjuk, a másik kettő hasonlóképpen definiálható.
A karakterkészletnek 128-as mód esetében 128-al osztható memória címen kell- kezdődnie, ezt az LD2 tárolja. A címet a rendszer 128-al elosztja (a 16 bites cím felső 9 bitje marad meg). A cím hiányzó 7 bitjét a NICk chip generálja.
A karakterkészlet első 128 byte-ja a 128 karakter mindegyikének legfelső pontsorát adja. A második 128 byte a karakterek 2. pontsorát tárolja, és így tovább...
A karakterkódok folyamatosan kerülnek kiolvasásra az LD1 címről, és a byte értékének megfelelő karakter képe jelenik meg a képernyőn. A kijelzésre kerülő byte színe hasonlóképpen generálódik, mint a grafikus mód esetében, figyelembe véve a beállított színes módot. ASCII karakter kijelzése kétszínű grafikus módban normál karakterképet ad, de más színes módokban, ha grafikus módban akarunk ASCII karaktert megjeleníteni, a karakterek kevesebb pontból épülnek fel.
Két vezérlő bit használható, ha kétszínű karaktermódban különböző színű karaktereket akarunk megjeleníteni. Ezek az ALTIND0 és az ALTIND1, amelyek a jobb margót meghatározó byte felső két bitjei. 64-es és 128-as módban csak részben használjuk őket, ha a karakterkódok felső bitjei nincsenek használva.

9. Attribútum grafikus mód

Ebben a módban az LD2 mutat a kétszínű grafikus bittérképes adatokra (pontokra), és az LD1 a kijelzésre kerülő pontok színeit tároló területre. Attribútum mód használatakor mindig kétszínű módban kell lenni, mivel más módok választásakor a színek meghatározatlanok lesznek.
A pontok adatai a kétszínű LPIXEL grafikus módban, megszokott módon kerülnek kiolvasásra, de a megfelelő attribútum byte-ok mondják azt meg, hogy melyik két palettaszín választódik ki:

b7
b6
b5
b4
b3
b2
b1
b0
háttérszín
pontszín

Az attribútum byte és a pixel adatbyte megfeleltetését a VRES határozza meg.

10. Függőleges szinkronizáció (VSYNC mód)

VSYNC módban nem jelennek meg adatok a képernyőn, a video kimenet üres szintű, és a margók határozzák meg a függőleges szinkronizáció kezdetét és végét. Megjegyezzük, hogy a szín sem lehetséges VSYNC alatt.
Az aktív függőleges szinkronizációs periódus alatt a normál vízszintes szinkronizáció invertálódik, hogy ne essen ki a szinronból. Célszerű minden LPB (sorparaméter blokk) utolsó 12 byte-ját nullázni az első négy byte-ot pedig a következőre választani:

DB 256-3, VBLANK,
63, 0
DB 256-2, VBLANK,
6, 63
DB 256-1, VBLANK,
63, 32
DB 256-19, PIXEL,
6, 63

A fenti LPB-k közül az első ad három üres sort meg. Mivel a bal margó 63-ra van állítva - amelyet sohase ér el - a szinkronizáció kikapcsolt marad. A szinkronizáció csak a második LPB elején kapcsolódik be, és ezalatt bekapcsolva is marad, mivel a 63-as jobb margót sohasem éri el. A szinkronizáció a harmadik LPB sor felénél kikapcsol. A negyedik LPB 19 üres sort tartalmaz, így összesen már 25 sor szinkronizációja van meg, de kétszínű PIXEL módban a szín újra engedélyezett. Ebben az LPB-ben a bal margó értéke 6, hogy a keretszín biztosan ne essen bele, a palettát mindig feketére kell állítani.
A fenti LPB-k 25 sort határoznak meg, tehát marad 287 képernyősor. A gyakorlatban azonban csak 256 használható, mert a keretszíneket ki kell hagyni alul és felül.

11. Video megszakítások

Ha a sorparaméter blokkban a VINT bit egyes, a Nick chip a VRIQ kimenete alacsonyra állítódik, mialatt a MODSOR lefut. A jel lefutó éle a Dave chipbe jutva =80-as megszakítást okoz feltéve, hogy engedélyezett a video megszakítás. A Dave chip megszakítás-érzékelője élérzékeny, ezért két egymást követő MODSOR VINT bittel csak egy megszakítást okoz. Újabb megszakítás kiváltásához kell közéjük egy olyan MODSOR, amelyben a VINT törölve van.
Ha megszakítás történt, az tárolódik a Dave chip-ben és törölni kell mielőtt a megszakítást újra engedélyezzük. Ez az általános leírás. Ha a megszakítás kiszolgálását befejezzük, és engedélyezzük a további megszakításokat a MODSOR lefutása előtt, akkor a további megszakítások nem jutnak érvényre, mert a Dave chip bemenete élérzékeny.

12. A színek meghatározása

A Nick chip a képernyő összes pontjához generál színbyte-ot a video, szín mód és a palettaregiszterek értékétől függően. Ezen 8 bites színértékek külön piros, zöld és kék jelekre konvertálódnak, amelyek a monitor csatlakozón érhetők el. Innen a PAL kódolóban és az UHF modulátorra jutnak, hogy tv számára alkalmas jel legyen belőlük.
A 8 bitből 3-3 a piros és zöld, 2 a kék színt határozza meg, így a piros és zöld 8, a kék 4 árnyalatú lehet. (G=zöld, R=piros, B=kék)

b7
b6
b5
b4
b3
b2
b1
b0
G2
R2
B1
G1
R1
B0
G0
R0

A három bit az alábbi képlet szerint alkotja a színeket. B0, G0, R0 a legértékesebb bitje minden színnek, a kék színnek csak 4 különböző értéke lehet.

teljes piros = (R2+R1*2+R0*4)/7
teljes zöld  = (G2+G1*2+G0*4)/7
teljes kék   = (B1+B0*2)/3

13. Vezérlő regiszterek

A Z80-s portok 080h-tól 08Fh-ig fenn vannak tartva a Nick chip regiszterei számára, bár jelenleg csak az első négyet (080h-083h) használjuk. Ezen regiszterek csak írhatók, értékük nem olvasható vissza.

080h

FIXBIAS

  • b0 ... b4 - A 8-15 palettaszínek felső 5 bitje.
  • b5 ... b6 - Külső színbemenet EC0-EC3 prioritása, 16 külső szellem engedélyezett. A külső szín csak akkor választódik ki, ha a EXTC alacsony, és a képernyő aktív (nem keret).
    • = 00 - EC0-EC3 a megfelelő palettaszín kiválasztására,
    • = 01 - EC0-EC3 a megfelelő palettaszín kiválasztására, ha a belső képernyő a palettaszínt a COL8-COL15-ben generálja.
    • = 10 - EC0-EC3 a megfelelő palettaszín kiválasztására, ha a belső képernyő a palettaszínt a COL8-COL15-ben generálja vagy a külső szín a COL0-COL7-ben van (EC3 alacsony).
    • = 11 EC0-EC3 a megfelelő palettaszín kiválasztására, ha a belső képernyő a palettaszínt a COL8-COL15-ben generálja vagy a külső szín a COL0-COL3-ban vagy COL8-COL11-ben (EC2 alacsony).
  • b7 - Nick chip VC1 kimenete. Itt kapcsolható le a belső hangszóró.
081h BORDER - 8 bites színérték, a keret színét állítja be.
082h LPL - A sorparaméter bázis mutató alsó része (A4 ... A11). Az alsó 4 bitet a Nick chip generálja.
083h

LPH

  • b0 ... b3 - Felső 4 bit (A12...A15) (sorparaméter bázismutató)
  • b4 ... b5 - Nem használt.
  • b6 - 1 = normál mód. Ha 0, akkor tiltott a sorparaméter számláló órajele.
  • b7 - 1 = normál mód. Ha 0, akkor újratöltődik a sorparaméter bázismutató.

XI. rész: A DAVE-chip programozása

A DPC hang-chip a következő funkciókat látja el:

  1. Többfunkciós "3 hang + zaj" sztereó hanggenerátor.
  2. Memórialapozás.
  3. Címdekódolás a kártyára épített RAM, ROM és bővítőmodulok (cartridge) számára.
  4. Megszakítási rendszer, 1 Hz-es és programozható időzítésű megszakítások, továbbá két külső megszakítási bemenet.
  5. Reset áramkör, kompatibilitás a Z80-assal és a dinamikus RAM-mal.
  6. Be- / kimeneti kapujelek, amelyeket a külső tárolóáramkörökhöz és a háromállapotú (tri-state) meghajtókhoz használunk.
  7. 1 MHz-es rendszeróra.
  8. Z80-as várakozási állapot generátor.

A DPC hang-chipnek 22 belső regisztere van, amelyek közül 17-et csak írni lehet. A regiszterek közül 16 hanggenerálási célokra szolgál, négy írható/olvasható regiszter kezeli a memóriát és egy írható/olvasható regisztert használunk a megszakításvezérléshez. A 22. csak írható regiszterrel állítjuk be az általános rendszer-konfigurációt. Belső dekódolású további 3 regiszter is, amelyekből olvasási és írási kapujeleket kapunk, hogy azokat külső tárolókhoz és háromállapotú meghajtókhoz használjuk az adatbuszon. A reset törli mind a 22 belső regisztert.
A 3 hanggenerátor olyan négyszögjelet állít elő, amelynek frekvenciája 30 Hz-től 125 kHz-ig programozható és amelyet különféleképpen módosíthatunk:

A zajcsatorna normálisan egy 17 bites PN számláló 31 kHz-es órajellel és álfehérzajt állít elő. A számláló bemenete a 3 hangcsatorna bármelyikének kimenetére, a PN számláló hosszúsága pedig 15, 11 vagy 9 bitre csökkenthető. Ez a számláló a 7 bites PN számlálóra is kicserélhető. Az eredményként kapott zaj ezután felül-, és aluláteresztő szűrőkre, majd a a gyűrűmodulátorra jut, amelyek mindegyikét egy eltérő hangcsatorna kimenete vezérli.
A 3 hanggenerátor és a zajgenerátor kimenete rákerül 2 amplitúdóvezérlő áramkörre (bal és jobb). Mindegyik amplitúdóvezérlő négy 6 bites, csak írható regisztert tartalmaz (mindegyik hanghoz egy regiszter), amelyek multiplexelve vannak egy külső 6 bites D/A (digitál / analóg) ellenállás-hálózatra. A maga kijelölt időszeletében mindegyik csatorna kiadja a saját amplitúdó-regiszterében levő értéket, ha a hang magas, egyébként a kimenet nulla.
Egy vagy két hangkimeneti csatorna átalakítható 6 bites D/A kimenetté, amikor a 0. hangcsatorna amplitúdó-regisztereiben lévő értékeket állandó kimenetként adják ki. Ezt a csak írható hang konfigurációs regiszterben lévő 2 bit vezérli. Három további bitet használhatunk a hanggenerátorok szinkronizálására, amely addig nem engedi tovább azokat, amíg a szinkronizációs bit alacsony értékre nem vált.
A memóriát kezelő rész 4 írható / olvasható regiszterből áll. Az A14' és A15' jelekkel kiválasztott regiszter tartalma kivihető az A14-A21 csatlakozási pontokra. Ez 256*16k méretű lap használatát teszi lehetővé. A kimenetek nagy impedanciássá tehetők a BREQ segítségével.
Négy tárolt megszakítás áll rendelkezésre: az 1 Hz-es megszakítás időmérésre szolgál, a másik megszakítás forrása átkapcsolható 50 Hz, l, kHz a 0. vagy az 1. hanggenerátorok kimenetei között, továbbá két külső, negatív élvezérelt megszakítás van. Mindegyik megszakítástárolónak saját engedélyezése és törlése van, amit egy 8 bites, csak írható regiszter vezérel. E regiszter olvasásakor a rendszer megadja a négy megszakítási tároló és a két megszakítási bemenet, valamint két tároló állapotát, amelyek kikapcsolják az időzítési megszakításokat. Bármelyik megszakítási tároló beállítása alacsonyra viszi az IRQ vonalat. Az 50 Hz/1 kHz hanggenerátor megszakítás kiválasztását a hang konfigurációs regiszterben lévő két bit végzi.
Kiválasztó jelek generálódnak a ROM, a bővítő modul (cartridge), a videoRAM és a video be/kimenet céljaira. Rendelkezésre áll az 1 MHz frekvenciájú órakimenet is.
A Z80-as reset jelét az RST0 szolgáltaja, amely a CAP-on lévő külső RC-hálózattal vagy pedig az RSTI-re adott lefutójellel képződik. Ez utóbbi egy 1 ms hosszúságú impulzust generál, amely a dinamikus RAM-ban tárolt adatok elvesztésének megakadályozására az M1 lefutó éléhez van szinkronizálva. Az RST0 kimenet külső 74ALSO4 invertert igényel, ami megfelelő sebességgel hajtja meg a rendszertörlés vonalat.
A rendszernek a 16/64k beépített RAM-ra, 8/12 MHz-es bemeneti órára és a várakozási állapotokra való beállításához egy csak írható rendszerkonfiguráció regisztert használunk. A várakozási állapot generátor beprogramozható úgy, hogy nem ad várakozási állapotokat, csak az utasításelérési ciklushoz ad várakozást, vagy várakoztat minden memóriahozzáférési műveletnél.
Megjegyezzük, hogy a videoRAM-hoz való hozzáféréshez soha nem generálódik várakozás, mivel ez ütközne a Z80-as órajelével.

Regiszter Ismétlés

(W = írható, R = olvasható)

R0 W A0h b7-b0 - A 0-s hangcsatorna periódusának beállítására szolgáló, 12 bites visszafelé számlálóba betöltendő szám alsó byte-ja.
R1 W A1h
  • b3-b0 A fenti számláló felső 4 bitje
    F(out) = 125,000/(n+1) Hz
  • b5-b4
    • 00 = tiszta hang
    • 01 = a 4 bites polinom számláló torzítás engedélyezése
    • 10 = a 5 bites polinom számláló torzítás engedélyezése
    • 11 = a 7 bites polinom számláló torzítás engedélyezése
  • b6 - 1 = az 1-es hangcsatornát óraként használó, felüláteresztó szűrő engedélyezése
  • b7 - 1 = a gyűrűmodulátor engedélyezése a 2-es hangcsatornával.
R2 W A2h Mint R0, de az 1-es csatornára.
R3 W A3h Mint R1, de az 1-es csatornára, kivéve, hogy:
a felüláteresztő szűrő a 2-es hangcsatornát használja, a gyűrűmodulátor a zajcsatornát használja.
R4 W A4H Mint R0, de a 2-es csatornára.
R5 W A5h Mint R1, de a 2-es csatornára, kivéve:
a felüláteresztő szűrő a zajcsatornát használja, a gyűrűmodulátor a 0-s hangcsatornát használja.
R6 W A6h
  • B1, b0 - a zaj órafrekvenciáját választják ki
    • 00 = 31,25 kHz
    • 01 = 0-s hangcsatorna
    • 10 = 1-es hangcsatorna
    • 11 = 2-es hangcsatorna
  • b3, b2 - a polinom számláló hosszát választják ki
    • 00 = 17 bit
    • 01 = 15 bit
    • 10 = 11 bit
    • 11 = 9 bit
  • b4 - 1 = felcseréli a 17 és 7 bites polinom számlálókat
  • b5 - 1 = a 2-es hangcsatornát órának használva engedélyezi a zajon az aluláteresztő szűrőt
  • b6 - 1 = a 0-ás hangcsatornát árának használva engedélyezi a zajon a felüláteresztő szűrőt
  • b7 - 1 = engedélyezi a gyűrűmodulátort az 1-es hangcsatornával.
R7 W A7h
  • b0 - szinkronizálás a 0-s hangcsatornához:
    • 1 = előre beállított értéken tartás,
    • 0 = futás
  • b1 - szinkronizálás a 1-s hangcsatornához
  • b2 - szinkronizálás a 2-s hangcsatornához
  • b3 - 1 = a bal hangkimenetet a D/A átalakítóra kapcsolja, kiadva az R8-ban lévő értéket.
  • b4 - 1 = a jobb hangkimenetet a D/A átalakítóra kapcsolja, kiadva az R12-ben lévő értéket.
  • b6-b5 - a megszakítási sebességet választják ki:
    • 00 = 1 kHz
    • 01 = 50 Hz
    • 10 = 0-ás hanggenerátor, f = 250,000/(n+1)
    • 11 = 1-es hanggenerátor
  • b7 - definiálatlan
R8 W A8h
  • b5-b0 - 0-s hangcsatorna bal amplitúdó Ezenkívül adat a bal D/A-ra, ha az R7 3. bitje = 1
  • b7-b6 - definiálatlanok
R9 W A9h
  • b5-b0 - 1-es hangcsatorna bal amplitúdó
  • b7-b6 - definiálatlanok
R10 W AAh
  • b5-b0 - 2-es hangcsatorna bal amplitúdó
  • b7-b6 - definiálatlanok
R11 W ABh
  • b5-b0 - zajcsatorna bal amplitúdó
  • b7-b6 - definiálatlanok
R12 W ACh
  • b5-b0 - 0-s hangcsatorna jobb amplitúdó
    Ezenkívül adat a jobb D/A-ra, ha az R7 4. bitje = 1
  • b7-b6 - definiálatlanok
R13 W ADh
  • b5-b0 - 1-es hangcsatorna. jobb amplitúdó
  • b7-b6 - definiálatlanok
R14 W AEh
  • b5-b0 - 2-es hangcsatorna jobb amplitúdó
  • b7-b6 - definiálatlanok
R15 W AFh
  • b5-b0 - zajcsatorna jobb amplitúdó
  • b7-b6 - definiálatlanok
R16 R/W B0h b7-b0 - Lapregiszter kimenet az A21-A14-re, ha A15'-A14' = 00
R17 R/W B1h b7-b0 - Lapregiszter kimenet az A21-A14-re, ha A15'-A14' = 01
R18 R/W B2h b7-b0 - Lapregiszter kimenet az A21-A14-re, ha A15'-A14' = 10
R19 R/W B3h b7-b0 - Lapregiszter kimenet az A21-A14-re, ha A15'-A14' = 11
R20 W B4h
  • b0 - 1 = az 1 kHz (50Hz) hanggenerátor megszakítás engedélyezése
  • b1 - 1 = az 1 kHz (50Hz) hanggenerátor megszakítás tároló törlése
  • b2 - 1 = az 1 Hz-es megszakítás engedélyezése
  • b3 - 1 = az 1 Hz-es megszakítás tároló törlése
  • b4 - 1 = az INT1 engedélyezése
  • b5 - 1 = az INT1 tároló törlése
  • b6 - 1 = az INT2 engedélyezése
  • b7 - 1 = az INT2 tároló törlése
R20 R B4h
  • b0 - 1 = az 1 kHz (50Hz) hanggenerátor osztó (f(int)/2 négyszöghullám)
  • b1 - 1 = az 1 kHz (50Hz) hanggenerátor tároló beállítása
  • b2 - 1 Hz-es osztó (0,5 Hz-es négyszöghullám)
  • b3 - 1 = 1 Hz-es tároló beállítása
  • b4 - INT1 bemeneti pont
  • b5 - 1 = INT1 tároló beállítása
  • b6 - INT2 bemeneti pont
  • b7 - 1 = INT2 tároló beállítása
R21 W B5h Aktív alacsony szintű kapujel a WR0 vonalon
R21 R B5h Aktív alacsony szintű kapujel a RD0 vonalon
R22 W B6h Aktív alacsony szintű kapujel a WR1 vonalon
R23 W B7h Aktív alacsony szintű kapujel a WR2 vonalon
R31 W BFh
  • B0 - Beépített RAM: 0 = 64k, 1 = 16K
  • b1 - Bemeneti órafrekvencia, 0 = 8 MHz, 1 = 12 MHz
  • b3-b2
    • 00 = várakozás minden memóriahozzáférési műveletnél, kivéve a video-RAM-ot
    • 01 = várakozás csak az M1-nél, kivéve a video-RAM-ot
    • 10 = nincs várakozás
    • 11 = nincs várakozás

Kimenetek választása

VIO Alacsony szintű a 80-8Fh be/kimeneti hozzáféréseknél. Kapuzva van az IORQ-, RD-, WR-rel a video chipen
ROM Alacsony szintű a 0-3 lapokon való memória-hozzáférésnél. (0-0FFFFh). Külsőleg kapuzva RD-vel
CART Alacsony szintű a 4-7 lapokon való memória-hozzáférésnél. (10000-1FFFFh). Külsőleg kapuzva a RD, WR-rel
WRAM Alacsony szintű az FC-FFh lapokon való memória-hozzáférésnél (3F0000-3FFFFFh), ha az R31 b0 = 0
Alacsony szintű minden memória-hozzáférésnél, ami nem ROM vagy bővítő modul (cartridge). (20000-2FFFFFh), ha az R31 b0 = 1. Kapuzva van az MREQ, RD, WR-rel a video chipen.

Néhány kiegészítés a DAVE dokumentációjához

A0h-A5h port
A hanggenerátorok működése: egy 12 bites számláló a megadott frekvencia értéktől visszafelé számol 250 kHz sebességgel (ez 4 MHz-es gépre értendő, ha a BFh port 1. bitje nincs beállítva). Amikor túlcsordul (azaz 0 után -1 következne), akkor -1 helyett a regiszterekben megadott 12 bites érték kerül újra a számlálóba, és a következők egyike történik a polinom számláló torzítástól függően:

A felüláteresztő szűrő azt jelenti, hogy az órajelnek használt csatorna kimenetének (amely tartalmazza az esetleges torzítást, szűrőt, és gyűrűmodulációt is) minden lefutó élére a flip-flop kimenete 0-ra állítódik. Ezért ha az órajel csatorna frekvenciája nagyobb, mint a szűrt csatornáé, akkor egyben a frekvencia kétszereződik.
A gyűrűmoduláció a felüláteresztű szűrő (ha az engedélyezett) után történik, és XNOR műveletet végez a másik csatorna (esetleg már torzított, szűrt, gyűrűmodulált) kimenetével.
Érdekesség, hogy a hanggenerátorok nem működnek a legnagyobb (0) frekvenciával, tehát nem lehet 125 kHz-es négyszögjelet előállítani. A számláló talán fut ilyenkor is (pl. megszakítás céljára, de ilyen gyors megszakításnak nem sok értelme van), és lehet, hogy polinom számlálót választva van hang, de ezt ellenőrizni kellene valódi gépen.

A6h port
A zajcsatornához használt polinom számláló az órajel csatorna (esetleg már torzított, szűrt, gyűrűmodulált) kimenetének lefutó élére frissítődik, és nem fix 250 kHz-es sebességgel, mint a hangcsatornáknál. A 31.25 kHz-es mód megfelel egy 4-1 frekvenciájú órajel csatorna használatának.
A 4. bit (7 és 17 bites számláló felcserélése) beállítása azt jelenti, hogy a választható hosszúságú (9/11/15/17 bites) számlálót használhatják a hangcsatornák a 7 bites helyett (és ilyenkor ennek is 250 kHz-es órajele lesz), illetve a zajcsatorna polinom számlálója lesz a 7 bites (250 kHz helyett a választható órajellel).
A zajcsatornánál az effektusok sorrendje (ha engedélyezettek):

  1. aluláteresztő szűrő: csak a 2. csatorna (torzított, szűrt, stb.) kimenetének a lefutó éleire mintavételeződik a polinom számláló kimenete (de egyébként az ilyenkor is fut a beállított frekvencián), az órajel lefutó élei helyett.
  2. felüláteresztő szűrő: hasonló a hangcsatornákhoz: a 0. csatorna lefutó éleire 0-ra állítódik a tároló kimenete a polinom számláló következő mintavételezéséig.
  3. gyűrűmoduláció: a hangcsatornákhoz hasonlóan XNOR műveletet végez az 1. csatornával.

Polinom számlálók
A DAVE 4 polinom számlálót tartalmaz:

A számlálók működése, amikor a kimenetük frissítődik:

A bitek, amelyek között XOR művelet történik, azaz a bináris "polinom":

Az álvéletlenszám sorozat hossza 2^N-1 (tehát 5 bites számlálónál pl. 31), ugyanis a számláló értéke nem lehet 0, mert akkor végtelen ciklusban csak 0 lehetne a kimenet (0 XOR 0 = 0). A kezdőérték bekapcsoláskor talán minden bit = 1, de ezt nem lehet biztosan tudni, és jelentősége sem sok van.

A7h port

B4h port:

A 0., 2., 4., és 6. bit mindig olvasható, akkor is, ha az adott megszakítás le van tiltva; ezekbe a bitekbe '1'-et írva engedélyezhető, '0'-t írva tiltható a megszakítás.
Az 1., 3., 5., és 7. bit csak akkor működik, ha engedélyezett a megfelelő megszakítás, egyébként mindig 0.; ha engedélyezett a megszakítás, akkor az 1. és 3. bit a 0. és 2. bit minden (fel- és lefutó) élére beállítódik, az 5. és 7. bit pedig csak a 4. és 6. bit lefutó éleire.
Z80-hoz a megszakítás kérés az 1., 3., 5., és 7. bit között végzett OR művelet eredménye; ezeket a biteket vagy '1' bit visszaírásával, vagy az adott megszakítás letiltásával lehet törölni. Egyébként amíg nem törlődik mind a 4 bit, a Z80 folyamatosan megszakítást generál.
A 4. bit a NICK-től érkezik, és az adott sorban az aktuális LPB-ből olvasott VINT bit másolata; ezt szerintem a NICK minden sor elején újraolvassa az LPB-ből (de talán jobb lenne ellenőrizni igazi gépen)

Ebből az is látható, hogy a video megszakítás csak a megszakításkérést tartalmazó LPB utáni első, már VINT bit nélküli sor elején történik. Ugyanez az oka annak, hogy nem lehet két egymást követő sorban video megszakítás.

B5h port

A DAVE 3 külső I/O eszközhöz biztosít címdekódolást, ráadásul kombinálva az írás/olvasás jelekkel, ezzel is egyszerűsítve a külső eszköz felépítését. A 3 I/O port a B5h, B6h, B7h, mindegyikhez külön vezérlő jel van írás és olvasás esetére, ezek a DAVE WR0/RD0, WR1/RD1, WR2/RD2 kimenetei, ezekre vannak rákötve a gép különböző ki és bemenetei (billentyűzet, magnó, nyomtató, soros port, joystick). Az RD2 nincs is használva! (Ennek esetleges kihasználásával könnyen lehetett volna egy 8 bites bemenetet építeni a gépbe. Pl. egy A/D átalakító chipet rákötve a magnóbemenetre, és kiolvasva az RD2 által, már kész is lehetett volna a digitalizáló...)

B5h írása (WR0) esetén 8 bit tárolódik el az U25 jelű 74LS273 IC-vel megvalósított tárolóban. Ez a 8 bit több eszköz által kerül felhasználásra:

Olvasás:
Az U27 jelű 74LS373 IC-n keresztül beolvassa a billentyűzet mátrix kiválasztott sorát:

Sor
Bit
0
1
2
3
4
5
6
7
0
N
\
B
C
V
X
Z
SHF_L
1
H
LOCK
G
D
F
S
A
CTRL
2
U
Q
Y
R
T
E
W
TAB
3
7
1
6
4
5
3
2
ESC
4
F4
F8
F3
F6
F5
F7
F2
F1
5
8
 
9
-
0
^
ERASE
 
6
J
 
K
;
L
:
]
 
7
STOP
le
jobb
fel
PAUSE
bal
ENTER
ALT
8
M
DEL
,
/
.
SHF_R
SPACE
INS
9
I
 
0
@
P
[
   

B6h port

B6h írása (WR1) esetén 8 bit tárolódik el az U24 jelű 74LS273 IC-vel megvalósított tárolóban. Ez egy az egyben a nyomtató port 8 bites kimenete.

Olvasás:
A B6h olvasása (RD1) az U28 jelű 74LS373 IC-n keresztül történik, ennek bemenetére azonban már több helyről érkeznek a jelek.
A bit 0-2: Control csatlakozók Keyboard J, Keyboard L, Keyboard K bemenetei:

sor bit
0 0
1 J1 tűz
2 J1 fel
3 J1 le
4 J1 bal
5 J2 tűz
6 J2 fel
7 J2 le
8 J2 bal
9 J2 jobb

Hogyan is működik a joystick: "hagyományos" gépek esetén az a 4 irány+tűz az bemenetek, a joy érintkezői a GND-vel kötik össze ezeket, itt tehát a GND a Közösnek nevezhető vezeték. EP esetén a 4 irány+tűz az 5 kimenet, ebből van két adag a két Control csatlakozóhoz, ezek megfelelnek a billentyűzet mátrix sor kiválasztásnál is használt KB0-KB9 jeleknek, amelyik ki van választva az 0 szintű. A Közös pedig bemenet, ha a joystick érintkezője összeköti az éppen kiválasztott iránnyal, akkor szintén 0-ba kerül.
Viszont mindez nem csak a szokásosan használt Keyboard J bemenettel végezhető el, hanem az L és K bemenettel is! Ezzel így egy CONTROL csatlakozóban 3x5 érintkezőt lehet lekérdezni, a két csatlakozón együtt összesen 30-at! Semmi akadálya nem lett volna olyan joy átalakítót készíteni, amivel 2 vagy 3 hagyományos joystickot lehetne egy CONTROL bemenetre kötni, azaz összesen akár 6 külső botkormány is lehetne egy EP-n! Vagy lehetett volna több gombos EP joystickokat készíteni, pl. autó vagy repülőgép szimulátorokhoz. A JOY függvény is simán kezelhetné 3,4,5,6 botkormányokat is, semmiből nem állna, csak másik bitet kéne venni a B6h-ról olvasott értékben. Vélhetőleg a külön kapható Numerikus tasztatúra használhatta ki a CONTROL port plusz tudását.

B7h port

B7h írása (WR2) esetén csak 2 bit tárolódik el az U30 jelű 74LS74 IC-vel megvalósított tárolóban:

B7h olvasása (RD2) nem használt.

BFh port

Írás:

az M1 olvasásoknál történik egyébként az R regiszter frissítése is.

A várakozás normál 4 MHz-es gépen 1 Z80 ciklus, turbós (6 vagy 7.119 MHz) gépen pedig 2 Z80 ciklus. Az 1. bitnek nincs hatása a várakozás mértékére. Video RAM-nál az itt beállítható várakozásoknak nincs hatása, ott ugyanis 889846 Hz-es frekvenciához kell szinkronizálni a hozzáféréseket. Ezt 4 MHz-es gépen egyszerűen úgy lehet - nem túl pontosan - közelíteni, hogy a két video RAM vagy video I/O port (ugyanis a NICK 80h-8Fh portjainál is van ilyen várakozás) között eltelt Z80 ciklusok számához hozzá kell adni 1.5-öt, majd ha az eredmény nem osztható 4.5-el, akkor felfelé kerekíteni, hogy osztható legyen. A várakozás ennek és az eredeti (1.5 hozzáadása előtti) ciklusszámnak a különbsége 0.5 Z80 ciklus egységekben. Lényeges azonban, hogy a memóriaműveletek az utasításon belül pontosan mikor történnek:

Torzítás

A "torzítás" gyakorlatilag rövid periódussal ismétlődő "zajt" generál a négyszögjel helyett. Egészen pontosan így működik:

Egy részletes példa:

100010011010111100010011010111100010011010111100010011010111100010011010111100010011010111
*        *        *        *        *        *        *        *        *        *        
111111111000000000000000000111111111000000000111111111000000000000000000111111111000000000

Szűrők

A DAVE szűrőinek nem sok közük van az analóg szűrőkhöz, valójában ezek is csak egyszerű bináris műveleteket jelentenek:

0 XNOR 0 = 1 -1 * -1 = 1
0 XNOR 1 = 0 -1 * 1 = -1
1 XNOR 0 = 0 1 * -1 = -1
1 XNOR 1 = 1 1 * 1 = 1

A DAVE 0-2, azaz normál hangcsatornáinak a részletes működése:

Minden effektus, amely másik csatornával végez műveletet, a másik csatorna végleges, gyűrűmoduláció (ha van) utáni kimenetét használja.
A zajcsatornánál az effektusok sorrendje: aluláteresztő szűrő, felüláteresztő szűrő, gyűrűmoduláció. A zajcsatornához használt polinom számláló nem fix 250 kHz-en fut, hanem a választott zaj órajelen (31.25 kHz, vagy valamelyik hangcsatorna kimenetének a lefutó élei).
A hanggenerátor megszakítás a hanggenerátor számlálójának a lefutásakor történik, tehát erre nincs hatása a különböző effektusoknak.

ENTERPRISE csatlakozási pont információ

Az Enterprise számítógép csatlakozási pontjainak kiosztása a következő:

Az Enterprise-on lévő csatlakozó felé nézve:
B1 pont a bal felső részen
A1 pont a bal alsó részen

Az élcsatlakozók osztástávolsága 2,54 mm; bizonyos pozíciók felhasználhatatlanok, de figyelembe vannak véve.

Vezérlés 1 / Vezérlés 2

A1 - billentyűzet J (közös)
A2 - billentyűzet L
A4 - KB4 (9) (jobbra)
A5 - KB2 (7) (le)
A6 - KB0 (5) (tűz)
B1 - 0V
B4 - +5V
B5 - KB3 (8) (balra) B6 - KB1 (6) (fel)

A zárójelben lévő számok a 2-es vezérlőre vonatkoznak. Az összes jel TTL-szintű. Többeres árnyékolt kábel használandó.

Soros periféria / hálózat

A1 - referencia
A3 - RTS
A4 - CTS
B1 - 0 V
B3 - adatkimenet
B4 - adatbemenet

Hateres árnyékolt kábelt kell használni.

Jelszintek a 0V-ra vonatkoztatva:

0 = 0 V
1 = +12V

Jelszintek a referenciavonalra vonatkoztatva:

0 = -5V
1 = +7V

Hálózati használatnál a "vezérlő sín" kialakítása céljából az "RTS"-t a "CTS"-re kell kötni, az "adat-sín" kialakításához pedig az "adatbemenet"-et az "adatkimenet"-re kell kapcsolni. A "referencia" tulajdonképpen egy eltolt "föld" feszültség, amit esetleg nem engedhetünk meg bizonyos berendezés konfigurációknál.

Nyomtató

A1 - 0V
A2 - kapuzójel (/strobe)
A3 - 3-as adatvonal (Data 3)
A5 - 2-es adatvonal (Data 2)
A6 - 1-es adatvonal (Data 1)
A7 - 0-ás adatvonal (Data 0)
B1 - 0V
B2 - kész (/ready)
B5 - 4-es adatvonal (Data 4)
B6 - 5-es adatvonal (Data 5)
B5 - 6-es adatvonal (Data 6)
B6 - 7-es adatvonal (Data 7)

Tizenkét erű, hajlékony szalagkábel alkalmazandó. Minden jel TTL-szintű.

A monitor

A1 - zöld színjel
A2 - 0V
A3 - monokromatikus kompozit videojel
A4 - /HSYNC (vízszintes szinkronjel)
A5 - /VSYNC (függőleges szinkronjel)
A7 - baloldali hangjel
B2 - 0V
B3 - kék színjel
B4 - piros színjel
B5 - /CSYNC
B6 - üzemmód kapcsoló (peritel)
B7 - jobboldali hangjel

Többeres, árnyékolt kábel használandó. Az összes szinkronizálójel TTL-szintű. A zöld, kék és piros jelek 0-tól 4 voltig lineárisak (nem TTL jelek).

Vissza