21. A Plus/4-es gépi kódú programozása haladóknak

    Ebben a fejezetben még jobban elmélyedünk a számítógép muködésének rejtelmeiben. Az a szándékunk, hogy bemutassuk a rendszer programozásának további lehetoségeit. Többek között megismerkedünk a Plus/4-es tárkezelésével is. Ez a késobbi programok megértéséhez nélkülözhetetlen. Az ehhez szükséges alapismereteket igyekszünk a leheto legegyszerubb módon elmagyarázni. Lássunk hát neki.

Tartalom:

21.1. A MEGSZAKÍTÁSOK PROGRAMOZÁSA

21.1.1. A megszakítások

2l.1.2. A megszakítások előállítása

21.1.3. A megszakitások programozása

21.1.4. A TED megszakító regiszterei

21.2. AMEMÓRIALAPOZÁS

21.3. A MEMÓRIALAPOZÓ RUTINOK

21.4. MODUL-RESET

21.5. EGY EPROM CSATLAKOZTATÁSA A BOVÍTO BEMENETHEZ

 

 

21.1. A MEGSZAKÍTÁSOK PROGRAMOZÁSA

Kétségkívül az egyik legérdekesebb programozási technika a megszakítások programozása. Ebben a fejezetben megtanuljuk azt, hogy tulajdonképpen mi is az a megszakítás, hogy hogyan jön létre, mi a hatása, milyen megszakítási lehetoségek vannak a Plus/4-esnél és végül, de nem utolsósorban, hogy miként lehet ezeket programozni. (Megjegyzés: a számítástechnikai gyakorlatban surun használatos a megszakítás eredeti, angol nyelvu megfeleloje, az interrupt).

 

21.1.1. A megszakítások

A számítógép operációs rendszere a gépben futó programot folyamatosan és rendszeres idoközönként megszakítja. Amikor bekapcsoljuk a számítógépet, a képernyon megjelenik egy szöveg, és villog a kurzor. A gép ezzel jelzi, hogy egy utasítás vagy valamilyen program beírására vár. Ez a várakozás azonban nem "semmittevés", hanem az operációs rendszer által folyamatosan végrehajtott várakozási ciklus. A gép processzora tehát a látszat ellenére állandóan dolgozik.

Errol nagyon egyszeruen meggyozodhetünk, hiszen ha lenyomunk egy billentyut, akkor a neki megfelelo karakter azonnal megjelenik a képernyon. Aki viszont azt gondolja, hogy ezt a muveletet a várakozási ciklus hajtja végre, az bizony téves nyomon jár.

A várakozási ciklus másodpercenként kb. 100-szor szakad meg. Egy megszakítás közben a processzor az operációs rendszer egy másik részén végzi a munkáját. Ezen a helyen figyeli -többek között -a billentyuzetet is. Ha azt érzékeli, hogy egy ilyen megszakítás idején valamelyik billenytu éppen le van nyomva, akkor megkeresi az ehhez tartozó kódot. Ez azonban csak egyike annak a számos feladatnak, amelyeket a processzornak a megszakítás ideje alatt el kell végeznie. Ugyanez történik akkor is, amikor a számítógép egy -akár BASIC, akár gépi kódú -programot hajt végre. A megszakítások mindig pontosan, és ami még fontosabb, folyamatosan hajtódnak végre. Számunkra ez teszi különösen érdekessé a megszakitások programozását. Ha sikerül megoldanunk, hogy a megszakítási fázisban a saját programjaink (is) fussalak, akkor sok dolgot egyszerubben is programozhatunk. A gépi kódú programok utásának gyorsasága következ te ben olyan hatá.st érhetünk el, mintha a gépen egyideüleg két program futna. A fejezet végén bemutatunk egy példaprogramot, amely egy )illentyü lenyomásakor hangjelet is kivált.

Úgy gondoljuk, hogy ezzel a magyarázattal választ adtunk az elso kérdésre, levezetesen arra, hogy mi is az a megszakítás. Jöhet hát a következo kérdés: vajon honnan tudja a processzor, hogy éppen egy másik programot kell végrehajtania?

 

2l.1.2. A megszakítások előállítása

A megszakítások a keletkezésük szempontjából alapvetoen két csoportba oszthatók: lannak a hardver által kiválasztott, vagy hardver oldali megszakítások és vannak izoftver által kiváltott, vagy szoftver oldali megszakítások. Vizsgáljuk meg eloször I hardver által kiváltott megszakításokat.

Ehhez azonban még néhány, a hardverre vonatkozó ismeretre van szükség:

A Plus/4-es -akárcsak más számítógépek is -nem csak processzorból és a RAM :s a ROM áramkörökbol állnak, hanem további integrált áramköröket, úgynevezett :hipeket is tartalmaznak. E chipek egyiké különösen fontos a számitógép kifogástalan nüködése szempontjából. Ennek a neve TED, amely az angol TExt Display kifejezés)ol adódik. A számítógépen belül a TED a felelos az olyan feladatok elvégzéséért, nint a tárkezelés, a képernyo felépitése, a billentyuzet és a botkormányok figyelése, ovábbá il hardver oldali megszakítás kiváltása. Van néhány olyan, RAM tárcíme is, amelyekhez ugyanúgy lehet fordulni, mint a "közönséges" RAM címekhez, azaz :zekre értékek írhatók, ill. a bennük levo értékek olvashatók. Ezek a címek a ;FFOo-$FF3F közötti területen vannak.

Egy olyan, sok feladatot ellátó chipnek, mint a TED, számos csatlakozója van. ezek közül a nyolcas számú csatlakozó nak a neve IRQ, ami az angol Interrupt reQuest rövidítése, és magyarul megszakítás kérést jelent. Ha a Plus/4-es muködése közben bizonyos feltételek teljesülnek, akkor ennek következtében megváltozik az . :zen a csatlakozón levo feszültség. A késobbiekben majd arra is kitérünk, hogy melyek ezek a feltételek.

A processzorunknak is van egy IRQ csatlakozója, mégpedig a hármas számú. az a két csatlakozó egymással össze van kötve, tehát a TED által kiváltott feszültségláltozást a processzor is érzékeli. Ezt a feszültségváltozást megszakítás kérésnek is levezzük. Van még egy másik olyan chip is, amely megszakitás kérést küldhet a )rocesszornak, ez pedig az Input/Output, azaz a bemeneti/kimeneti egység. Ebben a 'ejezetben csak a TED-re vonatkozó megszakításokkal foglalkozunk, ezért erre az ltóbbi chipre nem térünk ki.

Azért, hogy egy beérkezo megszakítás kérésre a processzor megfeleloképpen :udjon reagálni, egy saját, beépített programot tartalmaz. Amikor a processzorhoz egy megszakítás kérés érkezik, akkor a következo lépéseket teszi: Az éppen feldolgozás alatt álló utasítást végrehajtja, majd megvizsgálja az állapotregiszterben levo negszakítás bitet. Ha ez a bit magas, azaz az értéke 1, akkor a programmegszakításra lonatkozó kérést figyelmen kívül hagyja, és megkezdi a következo utasítás feldolgozását. A legtöbb esetben azonban a megszakítás jelzo bit nem magas, tehát engedélyezi

l megszakítást. Ekkor a processzor eloször a programszámláló (angol rövidítése PC) tartalmát a verembe helyezi. Erre azért van szükség, hogy a processzor a megszakítá si rutin végrehajtása után tudja azt, hogy az eredeti, megszakítot!: program végrehajtását melyik címen kell folytatnia. Ahhoz, hogy az eredeti programot a megszakítás elotti feltételek mellett folytathassa, az állapotregiszter tartalmát is a verembe kell mentenie. Ez is, akárcsak a megszakítás bit magasra állítása, automatikusan megy végbe. Most valami különleges történik:

A programszámlálóba betöltodik a $FFFE és a $FFFF címeken levo tartalom. Ezek a címek egyébként azok a legmagasabb címek, amelyeket a processzor még éppen meg tud címezni. Mivel a Plus/4-es különbözo memóriateruleieket tud kiválasztani, a következokben induljunk ki abból, hogy az operációs rendszer tárterülete van bekapcsolva. A fenti címek (amelyek tartalma a Plus/4-esnél $B3 és $FC) egy mutatót tartalmaznak, amely a feldolgozandó megszakítási rutinra mutat. A Plus/4esnél tehát a program végrehajtása a $FCB3 címre ágazik el, és ott kezdodik el a megszakítási program feldolgozása. Mivel ez a megszakítási kérés egy vezetéken érkezik a processzorhoz, ezt a fajta megszakítást hardver oldali megszakításnak nevezik.

Nézzük most a szoftver oldali megszakítást:

Ezt a fajta megszakítást a processzor BRK utasítása váltja ki. Amikor a proceszszörnak ezt az utasítást kell feldolgoznia, akkor majdnem minden úgy történik, mint az elozo esetben. Van azonban két sajátossága : Mivel a BRK utasítást többnyire gépi kódú programok tesztelésére használják, ahol ezt gyakran egy 2 byte-os utasítás helyett kell beírni, a verembe a programszáIilláló 2-vel megnövelt értéke kerul. A megszakítási rutinból való visszatérés után a program végrehajtása azzal az utasítással folytatódik, amely a BRK utasítás utáni, második címen áll. A program a BRK megszakítás esetén is arra a címre ágazik, amelyikre az $FFFE és az $FFFF címek mutatnak. Azért, hogy ezt a fajta megszakítást a hardver oldali megszakítástól meg lehessen különböztetni, az állapotregiszterben a megszakítás jelzobit (IRQ) mellett a BREAK bit (B bit) is magasra állítódik. .

A mi processzorunk a megszakításokat illetoen némileg különbözik a 6502-es típusúaktól. Ez utóbbiaknak ugyanis van még egy NMI vezetékük is. Az NMI az angol Non-Maskable-Interrupt rövidítése, és magyarul nem maszkolható megszakítást jelent, tehát olyan megszakítást, amelyet nem lehet letiltani. Ha a proeesszorhoz ilyen megszakítás érkezik, akkor az azt minqen körülmények között végrehajtja. Ez a lehetoség a Plus/4-es számítógép 7501-es mikroprocesszorába nincs beépítve.

Ha esetleg valaki számára az itt leírtak nem teljesen világosak, az sem nagy baj. A fejezet további részeit e nélkül is meg lehet érteni. A szándékunk csak az volt, hogy némi bepillantást adjunk a hardver muködésébe is.

 

21.1.3. A megszakitások programozása

Ebben a fejezetben kizárólag a hardver oldali megszakításokkal foglalkozunk. Ezek egyúttal a legrugalmasabb megszakítások\is. Mielott folytatnánk az olvasást, kapcsoljuk be a gépet, és indítsuk el a monitorprogramot. Írjuk be:

D FCB3 FCBB

A képernyon most látható rutin a regisztertartalmakat a verembe menti. Eloször az akkumulátort, aztán az X regisztert, majd az Y regisztert. Az ST A $FDDO utasítás most a rendszer ROM-ot kapcsolja be. A JMP $CEOO utasítással ágazunk el a .1ajdonképpeni megszakítási rutinra. Hajtsuk végre mi is ezt az elágazást:

D CEOO CEOB

Eloször az AKKU-ba kerül az állapotregiszternek a megszakítási rutinra való elágazás elotti aktuális tartalma, amely most a veremben van. A rutin most e tartalom és #$10 érték között végrehajt egy AND muveletet (B bit vizsgálata). Ha a megszakíst egy BRK utasítás váltotta ki, akkor az állapotregiszterben Íevo 4-es bitértéke 1. logikai muvelet eredménye ekkor nullától eltéro, és a program elágazik a $CE0B címre. Ha viszont az eredmény nulla, akkor a program a $CE98 címtol folytatódik. zen a címen egy indirekt ugrás van arra a címre, amely a tár $03.14 és $0315 címén 1álható.

Ezen a ponton tudunk ehhez a rutinhoz a saját rutinjainkkal csatlakozni. Nézzük meg, mi van ezeken a címeken:

M 0314 0315

Az itt található cím: $CEOE. Mivel a $0314 és a $0315 címek RAM területen vannak, ezek tartalmát könnyedén meg tudjuk változtatni úgy, hogy ezek a saját rutinunkra mutassanak. Bemutatjuk, hogy mindez hogyan történik. Írjuk be a monitorprogramal az alábbi sorokat:

 

.065E SEI
LDA #$6C
STA $0314
LDA #$06
STA $0315
CLI
RTS

 

Ezekkel az utasításokkal a megszakítás ugrásvektorát a $066C címre "térítet1uk" el. hhez eloször a megszakítás jelzobitet az SEI utasítással magasra kell állítani. Emlékezzünk csak vissza, hogy ha ez a bit magas, akkora megszakítás nincs engedélyezve. A megszakítás letiltása itt nagyon fontos, mert ha az "eltérítés" közben érkezne a processzorhoz egy megszakítás kérés, akkor a program egy teljesen Meghatározatlan címre ágazna el, és a gép egészen bizonyosan "fejre állna"..

Miután a mutatót "eltérítettük", a CLl-vel ismét engedélyezzük a megszakításoit, és egy R TS-sei befejezzük a kis programunkat. Ezzel a néhány programsorral ost lehetové vált, hogy a $066C-tol kezdodo saját rutinjainkat bekapcsoljuk egy egszakításba. Mivel azonban ezeken a címeken még semmi é!telmes program sincs, dításkor a számítógép is csak valami vad dolgot muveIne. Irjuk be ezt:

 

.066C INC $FF19
JMP $CE0E

 

Miután beírtuk ezeket a sorokat is, lépjünk ki az X-szel a monitorból. A programurik dítása: SYS 1630. A képernyo most egy kicsit nyugtalankodni kezd. A programunk ugyanis minden egyes megszakításkor megváltoztatja a képernyo keretének színét.

változást a $FF19 tárcím tartalmának a folyamatos növelése idézi elo. A TED lip-ben ezen a tárcímen a keretszín regisztere van. A JMP $CEOE utasítással újra :lépünk a tulajdonképpeni megszakító rutinba. A számítógép minden más funkciója íltozatlan marad. Legyen még tarkább? Egy RESET után módosítsuk a programot:

 

 .066F INC $FF15
JMP $CE0E

 

Egy SYS 1630 után most a háttér is villog. A TED-ben a $FFI5 regiszter tartalmazza a háttér színét. A sor beírásával szinte láthatóvá válnak a megszakítások. Azt is megfigyelhetjük, hogya képernyo alsó ötödének mindig más a színe, mint a felso négyötödének. Ennek az oka a Plus/4-es rasztermegszakítási mechanizmusában keresendo.

 

21.1.4. A TED megszakító regiszterei

Amint a bevezetoben már említettük, a TED-nek különbözo RAM regiszterei vannak, amelyek írhatók is és olvashatók is. A $FFI5 és a $FFI9 regiszterekrol éppen az elobb volt szó, amikor a példánkban ezek tartalmát tetszolegesen változtattuk. A következokben azokkal a regiszterekkel foglalkozunk, amelyeknek közvetlen közük van a mtgszakítások eloállításához.

Elsonek vizsgáljuk meg a megszakítás érzékelo regisztert (Interrupt Request Regiszter). Ebben a regiszterben nyolc bit van, amelyek közül a O. és az 5. bit kivételével mindegyiknek valamilyen különleges feladata van.

 

$FFO9 megszakítás érzékelo regiszter

Bit       7                             6                        5                4                        3                        2                           1                    0
            megszakítás          3. idozíto          ---              2. idozíto          1. idozito          fényceruza          raszter          ---

    Nézzük meg az egyes bitek jelentését és a feladatukat.
                0. bit: nincs feladata, az értéke közömbös
                1. bit: rasztermegszakítást jelez cvkjgfclkélkcnb
                2. bit: fényceruza által-kiváltott megszakítást jelezne, de mivel a Plus/4-esnek ilyen bemenete nincs, a bit értéke közömbös.
                3. bit: a megszakítást az 1. idozíto alulcsordulása váltotta ki.
                4. bit: a megszakítást a 2. idozíto alulcsordulása váltotta ki.
                5. bit: nincs szerepe.
                6. bit: a 3. idozíto alulcsordulása.
                7. bit: jelzi, hogy megszakítás történt.

Nézzük mindjárt a következo regisztert, amelyet megszakítás engedélyezo regiszternek nevezünk (Interrupt Mask Regiszter). Ez a regiszter is nyolc bitet tartalmaz.

 

$FFOA megszakítás engedélyezo regiszter

Bit       7                       6                       5                  4                        3                        2                           1                      0
            ---                     3. idozíto        ---               2. idozíto          1. ldozito          fényceruza          raszter            9. bit

                0. bit: ez araszterregiszter 9. bit je
                1. bit: engedélyezi arasztermegszakítást
                2. bit: engedélyezné a fényceruza általi megszakítást
                3. bit: ha magas, akkor az 1. idozíto az a1ulcsordu1áskor megszakítást vált ki.
                4. bit: mint a 3. bit, de a 2. idozítore vonatkoztatva
                5. bit: nincs szerepe
                6. bit: megszakítás a 3. idozíto a1ulcsordulásakor
                7. bit: jelzí, hogy megszakítás történt

A TED-ben három, egyenként 2-2 byte hosszúságú idozíto van. Az idozítokben levo értékeket a rendszer ütemjele (1 MHz) folyamatosan csökkenti. A regisztereik olvashatók, ill. ezekbe új indulási érték is töltheto. A regiszterek címeit a TED regisztereirol a függelékben adott áttekintés tartalmazza. Ha pl. az 1. idozítobe 60000-et töltünk, akkor ez az érték a másodperc egymilliomod része alatt 1-gyel csökken, és 60 milliszekundum (ms) múlva O lesz. A következo rendszerütem során az értéke 65535 lesz, ami aztjelenti, hogy egy alulcsordulás következett be. Ha ebben az idopontban a megszakítás engedélyezo regiszter hármas bit je magas, akkor a megszakítás érzékelo regiszter hármas és hetes bitjei is magasak lesznek. Ennek hatására egy megszakítás kérés érkezik a processzorhoz.

A hetes bit mindig akkor lesz magas, ha a megszakítás érzékelo regiszter többi bitjei közül egy vagy több magas. A megszakító rutinban most nagyon egyszeruen megállapítható, hogy melyik egység, és milyen körülmények között váltotta ki a megszakítást. A megszakító rutin befejezodése elott a megszakítás érzékelo regiszterben a magasra állított bitet még törölni kelL Ez pl. úgy történhet, hogya regiszter tartalmát elolvassuk, majd visszaírjuk a regiszterbe:

 

LDA $FFO9
STA $FFO9

 

Az operációs rendszer részérol a körülményektol függoen az idozítok vagy a rasztersugár válthatnak ki megszakítást. Araszterregiszter 9 bitbol áll. A kilencedik bit a mégszakítás engedélyezo regiszter O. bit je. Mivel a képernyon megjeleno képet is a TED állítja elo, ezért mindig tudja, hogy a rasztersugár a képernyonek éppen.melyik sorát rajzolja. Ha ez a sor megegyezik a $FFOB regiszter bitjei és a $FFOA regiszter nulladik bit je által meghatározott értékkel, akkor ez -feltéve, hogy a megszakítás engedélyezo regiszter 1. bit je magas -megszakítást vált ki. Ha más készülékeket nem csatlajcoztattunk a géphez, akkor ez a megszakítás mindig aktív.

Ugy gondoljuk, hogy most már eleget tudunk a megszakításokról és ezek programozásáról Ennyi száraz elmélet után jöjjön valami színesebb, aminek gyakorlati hasznát is vehetjük. Az itt következo program minden egyes billentyu lenyomásakor hangjelzést ad. Mivel ez a program csak a megszakítások alatt fut, a számítógépet minden tekintetben a megszokott módon hasznáJhatjuk. Írjuk be elobb a BASIC betölto programot. A magyarázat utána következik.

 1prg.gif (15362 bytes) 
2prg.gif (4708 bytes)

    Indítás elott tároljuk a programot kazettára vagy lemezre, Ez után indíthatjuk RUN-nal. Ha ekkor HIBA A DATA SOROKBAN üzenetet kapunk, akkor valam elírtunk. Ellenorizzük a vizsgáló összeget és a DATA sorokat. Javítás után ism, tároljuk a programot. A gépi kódú program most a tárban van, és SYS 1630 utasítá sal indítható. A READY megjelenése után most CTRL és a SHIFT kivételév minden billentyu lenyomásakor egy hangnak is meg kell szólalnia. Így akár vakc is írhatunk a gépen, nem kell folyton a képernyot nézni.
    Mivel a SOUND utasítás a programból csak korlátozottan használható, a program muködését az assembler listán magyarázzuk el. Ez lehetové teszi, hogy mindenki a saját igényei szerint alakíthassa.

3prg.gif (9818 bytes)

A programnak ebben a részében "eltéritjük" a megszakítás vektort. A vekt( ezután a $0673 címen kezdodo, saját programunkra mutat. Eloször azonban egy SI utasítással feltétlenül meg kell akadályozni a megszakítást. Ha ugyanis az eltéritc közben érkezne egy megszakítás, akkor a számítógép azonnal "lemerevedne". Azér hogy a jel kiírása és a hang megszólalása szinkronban legyen, a kurzor éppen aktuál pozícióját beírjuk a $DO és $DI címekre. Ezután a CLl-vel ismét engedélyezzük megszakítást, és az R TS-seI visszatérünk a BASIC-be. Ezzel az elokészületi lépéseke vagy más, gyakran használt szakkifejezéssél mondva, az inicializálást elvégeztiik. H most bekövetkezik egy megszakítás, akkor az eloször a mi programunkat hajtja végre.

4prg.gif (8396 bytes) 

A programunk a billentyuzetet nem figyeli. Ezt a feladatot továbbra is a operációs rendszer végzi a megszakító rutin további részében. Ezért a hangkeltésI mindig csak a megszakítást követoen kerül sor. Eloször azt vizsgáluk, hogy változott a képernyon a kurzor pozíciója. Ha igen, akkor az új értéket beírjuk a $DO, ill. $D címekre.

 5prg.gif (3036 bytes) 

Mivel a kurzor pozíciója a LIST, PRINT és más utasítások hatására is változik, és ennek megfeleloen a hang folyamatosan szólna, ebben a programrészben azt vizsgáljuk, hogy a kurzor pozíciója egy billentyu lenyomása miatt változott-e meg. A Plus/4-es a következo megszakításig az utoljára lenyomott billentyu kódját. megjegyzi a $C6 címen.

6prg.gif (5041 bytes) 

Ezekben a sorokban szólaltatjuk meg a hangot. A $FFOE címre beírjuk a frekvenciát. A $FFll-ben bekapcsoljuk a TED 1. számú hangját, és a hángerot maximumra állítjuk.

7prg.gif (3909 bytes) 

Ezekkel az utasításokkal egyszeru módon rögzítjük a hang idotartamát. A hang hossza három megszakítási ciklus lesz, tehát a harmadik megszakítás kérés után kikapcsolódik.

8prg.gif (4144 bytes)

A kíkapcsoláshoz a hangerot nullára állítjuk, és ezzel egyidejuleg a $FFll regiszter 4. bit jét, amely a hang be-, ill. kikapcsolását végzi, töröljük. Mivel a gépünknek a továbbiakban a szokott módon kell a feladatát ellátnia, visszatérünk az operációs rendszer tulajdonképpeni megszakító rutinjába.

Ezzel a megszakítások programozásával kapcsolatos mondanivalónk végére értünk. Reméljük, hogya Plus/4-esnek ezzel a sokak számára még ismeretlen világába tett kis kirándulásunkkal sikerult felkel tenünk az érdeklodést. Mindenesetre javasoljuk a további kísérletezgetést, hiszen itt csak töredékét tudjuk bemutatni azoknak a lehetoségeknek, amelyekre a számítógép képes. A következo fejezetben, amely a memórialapozásról szól, ismét találkozunk ezzel a témával.

21.2. AMEMÓRIALAPOZÁS

A mikroelektronikai alkatrészek árainak csökkenése egyre nagyobb tárkapacitású számítógépek építését tette lehetové. Ennek során a fejlesztok hamar beleütköztek a 16 bites címbuszok által felállított korlátokba, Már a 2. és a 3. fejezetekben említettük, hogy 16 biten maximum 64 kbyte tárterület címezheto meg. Nos, a Plus/4-esben má 64 kbyte RAM van. Ehhez jön még 64 kbyte ROM. Természetesen jogos kérdés, hog: hogyan lehetséges ez? A varázsige, amely ezt a problémát megoldja, az úgynevezet memórialapozás (bankswitching). Nézzük meg ehhez a 21.1. ábrát.

 tarfelepites.gif (35673 bytes)

        21.1. ábra A Plus/4-es tárának felépítése

    Természetesen 16 címvezetéken "egy darabban" csak 64 kbyte tárterület címez. heto meg. Az azonban megoldható, hogya tár (pl. a RAM) egy részét kikapcsoljul< (32768-tól 65535-ig) és a helyére ROM területet kapcsoljunk. Ezt a muveletet nevezzük memórialapozásnak. Az ábrán látszik, hogy az egyes tárak egyszeruen egymás fölött, egymással párhuzamosaIihelyezkednek el. Igy pl. a 32768-as ($8000) cím lehe1 egyszer RAM tárcím, de lehetne még a BASIC ROM-ban, akárcsak a beépítet1 felhasználói program alsó ROM-jában, és még két, külso, bovíto ROM-ban is.
    Ezek között a tárak között tetszés szerint lehet ide-oda kapcsolni. Ezt értjük a memórialapozás (bankswitching) alatt. A számítógép természetesen összesen mindig csak 64 kbyte tárat lát. Az viszont teljesen mindegy a számára, hogy ez a 64 kbyte milyen tárrészekbol áll, és hogy ezek között hogyan lapozunk. Csak az a fontos, hog) a CPU-hoz mindig logikus és végrehajtható utasítások érkezzenek.
    Ebben a fejezetben a memórialapozással és az ezzel kapcsolatos problémákkal ismerkedünk meg.
    Az egyes tárrészek közötti átkapcsolás természetesen nem valami kapcsolóval, hanem szoftver útján történik, mégpedig, úgy, hogy bizonyos tárcímekre kell valamit beírnunk. Ezeket a tárcímeket tehát "kapcsolók"-nak tekinthetjük.
    Eloször is alapvetoen a RAM és ROM között lapozhatunk: az írandó tárcímek $FF3E és $FF3F.

.STA $FF3E a ROM-ot kapcsolja be (azaz lapozza felülre).
.STA $FF3F a RAM-ot kapcsolja be (azaz lapozza felülre).

    Ha a RAM van bekapcsolva, akkor ez a $OOOQ-$FCFF, az $FF2Q-$FP3D és a $FF4Q-$FFFF közötti tárterületeket foglalja el. A többi címen a TED és az I/O egységek vannak.

Vigyázat! Ha a ROM-ot akarjuk bekapcsolni, akkor elozoleg a megszakítást feltétlenüI le kell tiltani. Ehhez a megszakítás jelzobitet magasra kell állítani. (SEI, $78).

    A $FDOQ-$FEFF közötti tárcímeket mindig csak az I/O egységek használhatják. A $FFOQ-$FFIF közötti címeket, valamint a $FF3E és a $FF3F címeket mindig a TED foglalja le. A ROM és a RAM közötti átkapcsoláskor egyébként az akkumulátor tartalma nem változik.
    Ha most az STA $FF3E utasítással átkapcsolunk ROM-ba, akkor az éppen aktuális ROM kapcsolódik be. A $FDOQ-$FEFF, a $FFOQ-$FFIF közötti, valamint a $FF3E és a $FF3F címek azonban most is le vannak foglalva az I/O egységek és a TED számára. Ezeket a területeket tehát soha sem foglalhatja el a RAM vagy a ROM.
    Az elobb az "éppen aktuális" ROM-ról beszéltünk. Amint az ábrából látszik, : négy különbözo ROM közötti átkapcsolásra van.lehetoség. Ezen túlmenoen a tár még : alsó (low) bankra és felso (high) bankra is felosztható. Az alsó bank a $800Q-$BFFF, a felso bank a $COOQ-$FFFF közötti tárcímeken van.
    A Plus/4-es tartalmaz egy három, 74LS175, 74LS27 és 74LSl39 típusjelü chipbol álló átkapcsoló logikai áramkört. Ez az elso pillantásra bonyolultnak tüno kapcsolás lehetové teszi, hogy a tár egyes elemeit 16 különbözo konfiguráció szerint kapcsoljuk össze. Így lehetséges pl. az, hogya $8000-$BFFF között bekapcsoljuk a BASIC ROM-ot, és ezzel egyidejüleg a $COOQ-$FFFF területen pedig egy, a bovíto csatlakozóba helyezett külso ROM-ot vagy RAM-ot. A 16 különbözo lehetoség között a $FDDQ-$FDDFcímek írásávál kapcsolhatunk át. Az itt következo táblázatban megadjuk, hogy melyik tárcím, melyik konfigurációt kapcsolja be (A KERNAL ROM. a számítógép operációs rendszerét jelenti).
9prg.gif (20446 bytes)

9per2prg.gif (30678 bytes)

21.1. táblázat:

 

Lássunk egy példát:

11prg.gif (9965 bytes)

Ezzel a programmal a táblázatban szereplo ötö(jik lehetoséget kapcsoltuk be. Ennf a konfigurációnál a $800o-$BFFF területen a Plus/4-esbe beépített felhasználé program alsó része, a $COOo-$FFFF területen pedig a program felso része helyezke dik el. Ezzel a példaprogrammal tehát a Plus/4-esbe beépített, ROM-ban levo felhasz nálói programot kapcsoijuk be. A program kezdocíme $8003.

A példánkban a kiválasztott konfigurációnak a számát beírtuk a $FB címre Ennek a célja a következo: mint tudjuk, a processzor másodpercenként kb. 100-szo végrehajt egy megszakítási rutint. Ebben a rutinban kérdezi Ie pl. a billentyuzetet is A megszakító rutin után azt a konfigurációt kapcsolja be, amelynek a száma a $FJ címen áll. Alapesetben a $FB értéke $00. A táblázatból láthatjuk, hogy ez a BASI( ROM-ot és a KERNAL ROM-ot jelenti. Ha tehát a példaprogramunkbaIÍ a $FJ értékét nem változtattuk volna meg, akkor a következo megszakítás ismét csak. a rég konfigurációt kapcsolná be.

Most valaki megkérdezhetné, hogy miért nem írjuk be a kívánt értéket közvetle nül a $FB-re? Az ötlet ugyan nem rossz, de a gyakorlatban mégsem valósítható meg A kívánt tárkonfiguráció ugyan ténylegesen létrejönne, csak azt nem tudjuk, hogy mikor jön a következo megszakítás. Ha ugyanis elozoleg már át is ugrottunk: ROM-ba, ez még mindig csak a BASIC ROM. Ezután jönne valamikor a következi megszakítás, amelyik a beépített program ROM-ját kapcsolja be. Az, hogy most: CPU ebben a ROM-ban éppen egy értelmezhetQ utasítást kapja-e el, tisztán szerencsl kérdése, mindenesetre a program kifogástalan indítása nem lenne biztosítható.

A_ROM-ok bekapcsolásához és indításához a Plus/4-es operációs rendszere ném segítséget ad. Így például a $FCC9 címen kezdodo rutin azt a modult kapcsolja be amelynek a száma az X regiszterben van. A rutin ezután arra a címre ugrik, amelynel az alsó byte-ja a $02FE címen, felso byte-ja pedig a $02FF címen van. Lássunk em is egy példát:

12prg.gif (13643 bytes)

Ez a rutin a $8003-as cím tol kezdve elindítja a ROM-ba beépített felhasználói programot.

Az elobb egy új kifejezést használtunk, a modult. Ez a fogalom a fejezet és a könyv további részében még többször elofordul, ezértmíndjárt itt tisztázzuk, hogy a modul alatt mindig valamelyik lehetséges tárkonfigurációt értjük. Ha tebát a táblázatunkból az 5-ös lehetoséget keressük kí, akkor ezen az 5-ös modult értjük.

A Plus/4-esen bekapcsolás után a O-ás modul az aktív (BASIC ROM és az operációs rendszer).

Ha még egy pillantást vetünk a 21.1. ábrára, ekkor egy további érdekességet fedezhetünk fel: a $FCOO--$FCFF területen vagy a RAM, vagy az operációs rendszer ROM-ja van bekapcsolva, de sohasem valamílyenmás ROM. Ennek megvan a maga oka: az operációs rendszer ROM-jának ezen a részén ugyanis olyan, fontos rutinok vannak, mint pl. a modul-reset, modul-start, és a megszakító rutin egy része. Ezekre a rminokra állandóan szükség van, ezért vannak a gyakorlatilag míndig rendelkezésre álló t4rterületen. Ez egyben azt is jelenti, hogy ez a $FCOO--$FCFF közötti terület tnás ROM-okra vagy külso kártyákra nincs hatással, és fordítva, ezek sem érhetik el ezt a területet. Lehet, hogy az elmondottak egy kicsit bonyolultak, ezért foglaljuk össze:

A RAM és a ROM között úgy kapcsolhatunk át, hogy egy értéket írunk a $FF3E és a $FF3F címekre (ford. megj.: teljesen míndegy, hogy mekkora ez az érték).

.STA $FF3E bekapcsolja a ROM-ot.
.STA $FF3F bekapcsolja a RAM-ot.

Ezenkívül még a 21.1. táblázat szerinti 16 különbözo RAM konfiguráció között lehet átkapcsolni. A konfigurációk míndegyikét modulnak nevezzük. Az egyes moduloknak számuk van, és ezt a számot a bekapcsolási címük és a $FDDO különbsége adja. A kívánt modul a $FDDO--$FDDF közötti tárcím írásával kapcsolható be. Ezt követoen a megszakító rutin számára a bekapcsolt modul számát be kell írni a $FB

tárcímre.

 

21.3. A MEMÓRIALAPOZÓ RUTINOK

A könyv H függelékében megadtuk a nulláslap és a rendszerváltozók tárkíosztását a $0800-as címig. A $0494-$04DC és a $05EC-$06EB címeknél a memóríalapozás megjegyzés szerepel. Nézzük meg ezeket a rutinokat a monitorprogram segítségével. Írjuk be a D 0494 utasítást. A képernyon ekkor ezt látjuk:

13prg.gif (6844 bytes)

(Mivel a rajz nem olvasható, itt van mégegyszer: >0494 8d 9c 04 78 8d 3f ff b1 00 8d 3e ff 58 60)

Ebben a rutinban a program saját magát változtatja, mégpedig úgy, hogy az akkumulátor tartalmát beírja a $049C címre, és ezáltal módosítja a $049B címen álló, indirekt, indexelt utasítást. Ezzel a rutinnal a RAM tetszoleges tárcíme olvasható. A rutinban a megszakítás jelzobit magasra állításával a megszakítást letilt juk. Erre feltétlenül szükség van, mert ha akkor érkezne megszakítás, amikor a RAM van bekapcsolva, a számítógép egészen bizonyosan lemerevedne.

Legyen az akkuban pl. #$00 és az Y regiszterben #$10. Ha most elindítjuk a rutint, akkor az akkuba annak a RAM címnek a tartalma töltodik, amelynek az alsó byte-ját a $0000 tartalmának és az Y regiszter tartalmának az összege adja meg. A felso byte a $0001 címen van, és az értéke mindannyiszor l-gyel növekszik, amikor a $0000 és az Y tartalmainak összeadásakor átvitel keletkezik.

Példa:

14prg.gif (8104 bytes)

    Ez a rutin a RAM-ban levo $AOIO tárcím tartalmát olvassa. Amemórialapozó rutinokat foként az operációs rendszer, a BASIC interpreter és természetesen a beépített programok használják.
    A$0494-$04e6 közötti rutinok a következo feladatot végzik:

15prg.gif (39890 bytes)

    A kezdocíme $O5F5. Ezzel a rutinnal modulok kapcsolhatók be, és ezek tet$zoleges címtol indíthatók. Ha ezt a rutint közvetlenül a gép bekapcsolása után indít juk, akkor ez a beépített felhasználói programot indítaná el. A rendszerváltozók tárkiosztási listáján látható, hogya $O5FQ-$O5F4 címek mellett a Long lump megnevezés áll. Ez a Plus/4-es esetén különbözo modulok közötti ugrást jelent.

    Nézzük meg monitorprogrammal a $O5F5 címen kezdodo rutint. Könnyen felismerheto, hogy itt mi történik. A rutin eloször betöli az X regiszterbe a modul szálát (itt a #$O5-öt, ami a beépített felhasználói programot jelenti), majd meghatározza a kezdocímet, és azt beírja a $O5FO és $O5FI címekre. Ezután elindítja a $FCFA-an kezdodo rutint, amely bekapcsolja az X regiszter szerinti modult és végrehajt egy indirekt ugrást a $O5FO címre.

    Az operációs rendszer ROM még más rutinokat is tartalmaz, amelyek a memórialapozáshoz használhatók:

$FCF7 Azt a modult kapcsolja be, amelynek a száma az X regiszterben van. A régi modul számának az akkuban kell lennie. A rutin ezután azt a rekeszt olvassa, amelynek a címe $OOBE-en (alsó byte) és $OOBF-en (felso byte) van. A címzésmód ismét indirekt, az Y regiszterrel indexelve. «$BE), V). Ezután a rutin visszakapcsolja a korábbi modult. Ily módon azokból a modulokból is kiolvashatók adatok., amelyek ki vannak kapcsolva.

$FC89 Azt a modult kapcsolja be, amelynek a száma az X regiszterben van. A régi modul számának most is akkuban kell lennie. Ezután a moduIon belül elindítja azt a programot, amelynek a kezdocíme a $OOFO és $OOFI címeken van. (Ez tulajdonképpen szubrutinhívás egy másik modulból ford. megj.). Amikor a CPU ezen a programon belül találkozik egy R TS-seI, akkor ismét a régi modul kapcsolódik be, a program végrehajtásapedig az eredeti programnak azon a részén folytatódik, ahonnan ez a $FC89-es rutint meghívta (visszatérés szubrutinból).

$FCB3 A rutin neve PULS. Ezt a rutint mindegyik megszakítás aktiválja. Ez a rutin bekapcsolja a nullásmodult (BASIC ROM, operációs rendszer ROM), és elindítja a megszakító rutint. A PULS rutin nagyon jól használható a bovítocsatlakozóba helyezett, saját szoftvermodulunkhoz. A megszakitó rutin után ismét a régi modul kapcsolódik be.

$FCC9 Azt a modult kapcsolja be, amelynek a száma a $FB címen van. Eloször bekapcsolja a modult, majd indirekt ugrást hajt végre a $O2FE címre. A kezdocím alsó byte-ja a $O2FE címen, a felso byte-ja a $O2FF címen van.

 

21.4. MODUL-RESET

A Plus/4-es bekapcsolásakor, ill. a RESET gomb benyomásakor a gép végrehajtja a 7. fejezetben, a funkcióbillentyukkel kapcsolatban már említett modul-reset rutint. Ha valakinek egyszer az az ötlete támad, hogy saját EPROM-okat égessen, és ezeket a bovíto csatlakozóba helyezve muködtesse, akkor fontos tudnia, hogy mi történik ebben a reset-rutinban.

A példánkban az EPROM a $8000-tol kezdodo címeket foglalja el. Ekkor egy 23128 vagy 27128 típusjeluEPROM a $800o-$BFFF területet veszi igénybe, Csatlakoztatható azonban egy 2764 típusú EPROM is. Ezeknél a típusoknál a 13-as címvezetékre nincs szukség, mert az EPROM csak 8 kbyte-os. Ekkor a 26-os lábat a + 5 V-ra kell kötni. A 2674-es tehát a $800O-$9FFF teruletet fo$lalja el.
Természetesen az EPROM címtartománya a $COOO címtöl is kezdodhet. Ehhez az EPROM 20-as lábát a CI High-ra (bovíto 6-os csatlakozója), a 22-es lábát pedig a CS1-re (bovíto 9-es csatlakozója) kell kötni. Egyszerubb a dolog azonban, ha az EPROM 22-es lábát a földre kötjük, a kapcsolás ekkor is/kifogástalanul muködik. Ha a $800o-$FFFF közötti, teljes címtartományt ki akarjuk használni, akkor 2 db, 27128 vagy 23128 típusú EPROM-ot kell csatlakoztatni. Az elso EPROM 20-as lábát a CI Low-ra, a második EPROM 20-as lábát pedig a CI High-ra kell kötni. A CI Low és a CI High helyett használható a C2 Low és a C2. High is. Természetesen négy EPROM is csatlakoztatható, ha mind a négy kiválasztó csatlakozást igénybe vesszük. Az EPROM-ok és a számítógép címtartományainak egymáshoz rendelésére és az EPROM-ok ban levo programok indítására vonatkozóan javasoljuk a 21.1. táblázat, és az ismertetett példák tanulmányozását.
    Ez a rutin azt is lehetove teszi; hogya modulok automatikusan induljanak. Ha pl. valaki a Plusj4-es számítógépet meghatározott feladatokra akarja használni, és az ehhez szükséges programok EPROM-ban vannak, akkor nagyon hasznos lehet, hogy ezek a programok a s~át:flító$ép bekapcsolásakor automatikusan elinduljanak.
    Ez modul-reset rutin az operációs rendszer ROM-jában, a $FCIE címen kezdo- dik. Ez a rutin a következoket végzi:
    Egymás után bekapcsolja a 15-ös, 10-es, 5-ös és nullás modulokat. Az éppen aktív modulban a $8007-$8009 címeken keresi a CBM azonosító jelet. Ha megtalálja ezt a jelet, akkor az illeto modulból elolvassa a $8006 cím tartalmát. Az így kapott érték a modul jelzoszáma. A BASIC ROM jelzoszáma O, a beépített felhasználói programé $OC.
    Ezt ajelzoszámot egy tábiázatban tárolja (a $O5EC-$05EF közötti címeken). Ha ennek ajelzoszámnak az értéke 1, akkor a modult elindítja. Ennek ismeretében tehát lehetoség van arra, hogy a rutin a saját modulunkat is automatikusan indítsa.

Nézzük meg egy automatikusan induló modul elejét (memoria dump):

> 8000 4C OA 80 00 00 00 01 43
> 8008 42 40 ...

    A $8000-es címen van az ugró utasítás a tulajdonképpeni modulprogramba, a $8006- os címen az 1 érték az automatikus indításhoz, a $8007-$8009 címeken pedig a CBM ASCI.I-kódjai. A program a $800A címen kezdodik.

21.5. EGY EPROM CSATLAKOZTATÁSA A BOVÍTO BEMENETHEZ

A 21.2. ábrán bemutatjuk, hogy hogyan csatlakoztatható egy EPROM a bovíto bemenethez.

eprom.gif (7164 bytes)

   A példánkban az EPROM a $8000-tol kezdodo címeket foglalja el. Ekkor egy 23128 vagy 27128 típusjeluEPROM a $800o-$BFFF területet veszi igénybe, Csatla- koztatható azonban egy 2764 típusú EPROM is. Ezeknél a típusoknál a 13-as címvezetékre nincs szukség, mert az EPROM csak 8 kbyte-os. Ekkor a 26-os lábat a + 5 V-ra kell kötni. A 2674-es tehát a $800O-$9FFF teruletet fo$lalja el.
    Természetesen az EPROM címtartománya a $COOO címtöl is kezdodhet. Ehhez az EPROM 20-as lábát a CI High-ra (bovíto 6-os csatlakozója), a 22-es lábát pedig a CS1-re (bovíto 9-es csatlakozója) kell kötni. Egyszerubb a dolog azonban, ha az EPROM 22-es lábát a földre kötjük, a kapcsolás ekkor is/kifogástalanul muködik. Ha a $800o-$FFFF közötti, teljes címtartományt ki akarjuk használni, akkor 2 db, 27128 vagy 23128 típusú EPROM-ot kell csatlakoztatni. Az elso EPROM 20-as lábát a CI Low-ra, a második EPROM 20-as lábát pedig a CI High-ra kell kötni. A CI Low és a CI High helyett használható a C2 Low és a C2. High is. Természetesen négy EPROM is csatlakoztatható, ha mind a négy kiválasztó csatlakozást igénybe vesszük. Az EPROM-ok és a számítógép címtartományainak egymáshoz rendelésére és az EPROM-ok ban levo programok indítására vonatkozóan javasoljuk a 21.1. táblázat, és az ismertetett példák tanulmányozását.