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.
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.
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.
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.
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.
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.
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.
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.
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).
21.1. táblázat:
Lássunk egy példát:
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:
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:
(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:
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:
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 BEMENETHEZA 21.2. ábrán bemutatjuk, hogy hogyan csatlakoztatható egy EPROM a bovíto bemenethez.
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.