2. LOGIKAI ARCHITEKTÚRA ÉS PROGRAMOZAS

2.1. A CPU

A 7501-es processzor regiszterei és utasításkészlete megegyezik a 6502-es típuséval, amely a Commodore mikros~ámít6gép-családnál alkalmazott processzorok alaptípusa.
Lényeges különbség a kettő között, hogya 7501-esben találhat6 egy 7-bites beépített port, amelynek az adatirányregisztere a $OOOO-s címen találhat6, adatregisztere pedig a $OOOl-es címen (a portkimenetek kapcsán sz6ltunk már erről részletesebben az 1.2.1. pontban).
A 7501-es regisztereinek rajzát a 19. ábrán láthatjuk.

Az akkumulátor, az X regiszter és az Y regiszter a programozás során legtöbbet használt regiszterek.. A 8-bites X-et és az Y-t indexregisztereknek is szokták nevezni, az indexelt címzési m6d után (1.. később).

A PC regiszter (Program Counter - programszámlál6) az éppen végrehajtás alatt lévő utasítás címét tartalmazza, ez a 9PU egyetlen 16-bites regisztere, amely két részre oszthat6 (PCL és PCH)..

Az SP regiszter (Stack Pointer) averemtár (stack) mutat6ja, a legutoljára beérkezett adat címére mutat. A más 8-bites processzoroknál megszokott azonos funkci6jú 16-bites regiszter helyett itt csak egy 8-bitest találunk; ez a processzor sajátsága. A 7501-esnél ui. a veremtár mindenképpen az l-es mem6rialapon van ($OlOO(256)-től $OlFF(511)-ig), mivel a processzor az aktuális SP érték elé tesz egy $Ol-es értékű byte-ot, s az így ad6d6 címet tekinti veremcímnek. Az SP regiszter értéke bekapcsoláskor $FF, azaz a CPU-nak az aktuális veremcím ilyenkor $OlFF, és a veremtár ettől a címtőllefelé töltódik. Amennyiben eléri az als6 laphatárt, értéke" átfordul", és $FF -től kezd ismét lefelé töltődni.

A P regiszter az ún. státusz- vagy állapotregiszter (a MONITOR-nál SR regiszter), amelynek bitjei önáll6 funkci6val bírnak: a lezajlott ml1veletekről adnak tájékoztatást (a ml1velet ez esetben lehet a processzor belsejében végbemen5 változás is). Gyakran szokták ezeket jelz5knek (Hag) is nevezni. Ezen bitek jelentésének ismerete igen fontos a programozÓnak, mivel az igen gyakori programelágazások feltételeit ezek a bitek őrzik, és ezen felül még sok más eseményt is befolyásol állapotuk. A bitek közül az 5. bit nem használt, a többi jelentése sorrendben (a legfels5t51lefelé) a következ5:

N (Negative) .

Ha a lezajlott ml1velet eredménye negatív, ez a bit l-be áll, a processzor állítja be. A programoz 6 szempontjáb61 leginkább a BMI és BPL utasításoknál van jelent5sége. A 2-es komplemens számoknál gyakorlatilag az eredménybyte 7. bit jével egyezik meg.

V (Overflow) Ezt a jelzőbitet csak a BIT ml1velet, ill. az összead6 és a kivon6 ml1veletek állítják l-be, ha az eredmény túlcsordulást okozott (átvitel történt a 6-r61 a 7. bitre), értékét pedig a BVC és BVS ugr6 utasítások használják az ugrás feltételeként. Ezt a bitet a CLV utasítással állíthatjuk O-ba.

B (Break)

Ez a bit val6 a belső és a küls5 megsza"kítások megkülönböztetésére, mivel ez csak a BRK utasítás végrehajtásának hatására billen "l"-be, ellentétben az I bittel, amely bels5 és küls5 megszakítás esetén is bebillen. Ezt a bitet a processzor kezeli.

D (Decimal)

Ennek 1 értéke a CPU-t utasítja arra, hogy kapcsoljon át decimális aritmetikára, azaz a SED utasítás után értelmezze BCD számokként az adatokat. Törölni (O-ba állítani) CLD utasítással lehet.

1 (Interrupt Mask)

Ezt a bitet a processzor és a programoz6 egyaránt közvetlenül kezelheti, 1 értékének hatására a kívülr51 érkez5 megszakításkéréseket a CPU nem fogadja.(IRQ tiltás; ezt hívják maszkolásnak). A SEI utasítással állíthat61-be, a Cll-vel törölhet5. A CPU akkor billenti be, amikor küls5 vagy bels5 megszakítás kiszolgálása folyik.

Z (Zero)

Amennyiben egy ml1velet eredménye O lesz, a Z bit" 1 JI-be áll. Ezt a tényt a BEQ és BNE ugr6 utasítások használják fel.

C (Carry)

Aritmetikai ml1velet eredményeképpen keletkez5 átvitel esetén ez a bit 1-es lesz. Értékét a léptető (siftelő) és a forgat6 (rotáI6) utasítások is m6dosíthatják, programb61 pedig legkönnyebben a CLC és SEC utasításokkal törölhetjük, ill. állíthatjuk 1-be.

Fonto~ még tudnunk, hogy nem minden utasítás m6dosítja a jelz5biteket, az erre vonatkoz6 informáci6t az utasításkészlet táblázatáb61 olvashatjuk ki. '. Ezekután nézzük meg, milyen címzési m6djai vannak a processzornak. Ezzel kapcsolatban tisztáznunk kell néhány fogalmat: ,

Az operandus az a tárban lév5 érték, amellyel az adott utasítás által meghatározott ml1veletet végre akarjuk hajtani. Az operandus címének előállítására különféle lehetőségek vannak, ezek a címzési módok (megjegyzendő, hogy némely utasításnál, pl. aLa, ezen fogalmak nehezen értelmezhetők, 1. az adott címzési módnál). Az ún. operációs kód az adott utasítás saját kódja, amely a processzor számára azonosítja a megfelelő műveletet.

Az adatok (operandusok) eléréséhez 13 címzési mód áll rendelkezésünkre, amelyeket azonban nem mindegyik utasításnál lehet használni. Ezek a cím'lési módok és az általunk használt rövidítéseik a következők:

1. Immediate                                       #BYTE
2. Absolute                                         ABS
3. Zero Page                                       ZP
4. Accumulator                                    ACC
.
5. Implied                                            IMP
6. Indexed X Indirect                          (ZP,X)
7. Indirect Y Indexed                          (ZP),Y
8. Zero Page X Indexed                      ZP,X
9. Absolute X Indexed                        ABS,X
10. Absolute Y Indexed                      ABS, Y
11. Relative                                         REL
12. Indirect                                         (ABS)
13. Zero Page Y Indexed                    ZP, Y
 

1. Immediate -                                     #BYTE

Más néven közvetlen címzésnek is szokták nevezni, ilyenkor az operandus közvetlenül az utasítást (annak operációs kódját) követő tárcímen található byte. Assembler nyelvben ezt a byte-ot megadják az utasítás nevében és # jellel jelölik, pl.: LDA #$30 (a $ jel az eddig megszokott módon a hexadecimális számot jelöli).

2. Absolute - ABS Ebben az esetben az utasítás kódját követő két byte egy chnet alkot, amely az operandus tényleges címe. Pl.: az LDA $3000-es utasítás hatására a $3000 címen levő byte töltődik az akkumulátorba.

3. Zero Page - ZP

A nulláslapos címzés kor az operációs kódot követ6 byte a nulláslap címeként fog értelmeződni, azaz a címként megadott byte-hoz felső byte-ként a CPU $OO-t tesz. A nulláslapos címzést használó utasítás így tehát egy byte-tal rövidebb az abszolút címzésűnél, s ennélfogva gyorsabb is. Pl.: LDA $13-as utasítás esetén az operandus a $0013 címen található, ez töltődik az A-ba.

4. Accumulátor - ACC

Az ebbe a csoportba tartozó egybyte-os utasítások esetén nem történik tárcímzés, hanem a kívánt műveletet az akkumulátorban tárolt értékkel végzi el a processzor. Pl.: a $OA operációs kódú ASL utasítás hatására az akkumulátor tartalma eggyel balra tolódik (siftelődik).

5. Implied - IMP

Ez a kategória megint csak nem" igazi" címzési mód, az ide tartozó utasítások egyedi jelentéssel bírnak, amely logikusan következik elnevezésükből. Ezek egybyte-os utasítások, az utasítás operációs kódjából a processzor már értelmezni tudja az adott műveletet. Pl.: a CLC utasítás hatására törli aPállapotregiszter carry-bitjét.

6. Indexed X Indirect - (ZP,x) Az, X regiszterrel indexelt indirekt címzési mód használata esetén az operandus tényleges címe a következőképpen áll elő (indexeléshez itt csak az X használható): az utasításban megadott nullá;!lapcímhez az X regiszter tartalmát hozzáadva adódik az a nulláslapcím, amelyen az operandus tényleges címének alsó byte-ja található, a következő byte pedig a tényleges cím felső byte-ja, az így adódó címen található az operandus. Pl.: ha a $OO22-es címen $AO, a $0023-es címen pedig $BO érték találhat6, és az X regiszter tartalma $02, akkor az LDA($20,X) utasítás hatására az akkumulátorba a $BOAO-s cím tartalma kerülni. Vigyázni kell arra, hogy ha a nullásá.Slapcím + X túlmutat az $FF címen, azaz a laphatáron, az indexelt utasítás nem az 1-es lapr61 fog olvasni, hanem a nulláslap elejéről. Ugyanez vonatkozik a többi nulláslapos indexelt utasításra is.

1. Indirect Y Indexed - (ZP), Y Ennél a címzési m6dnál csak az Y regiszter használhat6 indexelés hez , működése, az előzőtől kissé eltér. Az utasításban megadott nulláslapcímen találhat6 byte-hoz hozzádva az Y regiszter tartalmát megkapjuk a tényleges cím als6 byte-ját, annak felső byte-ja pedig a következő nulláslapcímen találhat6. Pl.: ha a $0020-s címen $CO, a $0021-es pedig $DO találhat6, és az Y regiszter tartalma $02, akkor az operandus tényleges címe az LDA($20), Y utasítás esetén $DOC2-es lesz, ennek a tartalma töltődni az A-ba.

8. Zero Page X indexed - ZP,x

Ennél a címzési m6dnál az utasításban szereplő nulláslapcímhez az X regiszter tartalmát hozzáadva kapjuk meg az operandus címét. Pl.: ha X tartalma $05, az LDA($3?,X) utasítás hatásaként a $OO38-as címen találhat6 byte töltődik az akkumulátorba.

9. Absolute X Indexed - ABS,X

Ennél a cÍJnzési m6dnál az utasításban szerepl6 kétbyte-os címhez hozzá kell adni az X regiszter tartalmát (index-érték), s az így ad6d6 címen találhat6 az operandus. Pl.: ha X tartalma $07, az LDA($5000,X) utasítás hatására az A regiszterbe a $5007 címen lévő byte töltődik bé.

10. Absolute Y Indexed - ABS, Y

Ezt a címzési m6dot használ6 utasítások ugyanúgy működnek, mint azt az előzőnél leírtuk, a különbség csak annyi, hogy itt az Y regiszter tartalmazza az index-értéket.

11. Relative - REL Ezt a címzési m6dot csak a feltételes ugrások használják, és ez esetben a címzés értelemszerűen nem operandusra vonatkozik, hanem a program vezérlésátadásának (ugrás) helyére. Ekkor az utasításk6d után következő byte-ot a processzor az utasítás után következő címhez viszonyított kettes komplemensű relatíveltérési értékként értelmezi (-128...+127), s az utasítás címéhez val6 hozzáadásávallétrejöv6 címre adja a vezérlést. Pl. a $5000-es címen találhat6 BEQ $5008 utasítás esetében annak 2. byte-ja $06 lesz, ez az eltérési érték. Az utasítás ban azért lehetséges megadni a közvetlen ugrási címet, mivel a monitorprogram elvégzi helyettünk a kettes komplemens értékek kisz ámít ását.

12. Indirect - (ABS)

Ezt a címzési m6dot csak a JMP utasítás használja, ilyenkor az utasítás ban megadott címen levő byte lesz a tényleges ugrási cím als6 byte-ja, a következő pedig a felső byte, azaz ha a $0320-s címen $OC találhat6, a $0321-esen pedig $EF, akkor a JMP($0320) utasítás hatására az $EFOC cím töltődik az utasításszámlál6 regiszterbe, a program err61 a címről folytat6dik.

13. Zero Page Y Indexed - ZP, Y

Ezt a címzési m6dot csak két utasítás használja; az STX és LDX utasítás. Az utasítás ban megadott nulláslapcímhez hozzáadva az Y regiszter értékét megkapjuk azt a címet, amelyre az X-et kitesszük, vagy amelyről beolvasunk egy byte-ot az X-be.

2.1.1. lllegális kódok

A gépi k6dú programozásban gyakorlottabb olvas6k bizonyára találkoztak már ~ illegális k6dok fogalmával. Ezek azok az operáci6s k6dok, amelyek a processzor utasításkészletében általában nem szerepelnek, ezek használhat6ságáért a gyárt6 cég nem vállal felelősséget. Ebből következően általában az assembler- és a monitorprogramok sem képesek ezeknek a nem definiált k6doknak a kezelésére. így van ez a PLUS/4-es monitorprogramjával is. Ha disassembláláskor a "hagyományos" utasításkódokon kívüli kódot talál, ??? jelzést ír a mnemonik helyére.

Mindazonáltal az illegális kódoknak programfutáskor jól definiálható hatásuk van, és nem csak a 6502-es, de a 7501-es CPU-n is működnek.

Az illegális kódok elnevezése változó, pl. a processzort leállító kódot CRA-nak (Crash), vagy ABS-nak (Absturz) is nevezik, mi az előbbi "névcsaládot" alkalmazzuk.

A nem definiált kódokat lényegében három csoportra oszthatjuk:

1. csoport (a táblázatokban a kódokat hexadecimálisan adtuk meg)

CRA: leállít ja a processzor működését.

NOP: a "hagyományos" NOP utasítás, amelynek azonban több k6dja is van, nem csak az $EA.

NOP2 (vagy NO2): hatására a CPU ezen utasításk6d utáni byte-ot sem veszi figyelembe végrehajtáskor,

tehát" át lehet ugratni vele" egy egy byte-os utasítást. Ehhez hasonl6 mdveletet a PL US /4-es ROM- jában is gyakran találhatunk, ahol a BIT utasítást használják ilyen célra, amely j61 használhat6 a rutinok elején különböző paraméterekkel indul6 belépési pontok kialakítására. Pl. ha a $E319-esen kezdődő rutinba $E31B címen lépünk be, a CPU sorban CLC és LDA $FD10 utasításokat hajt végre, míg ha $E319-esre adjuk a vezérlést, akkor a SEC, BIT $18 és LDA $FD10 utasítások következnek, tehát a CLC utasítást mintegy" átugorjuk".

NOP3 (vagy NO3): hatása megegyezik a NOP2-ével, azzal a különbséggel, hogy itt két további byte-ot lehet átugrani.

Ide tartoznak azok az illegális kódok, amelyek hatásaként lényegében két "hagyományos" utasítás hajtódik végre egymás után, ezek a táblázat fejlécében találhatók.

3. csoport

Ezen k6dok végrehajtásának hatása különböző - bár vannak hasonl6ak -, így célszerűen egyenként tüntettük fel azok műveleteit.

2.2. A TED

A TED programozása a regiszterein keresztül történik, minden állapotváltozás a redszerben, amelyhez a TED-nek köze van ezen 32 db regiszter bitjein keresztüL érhető el vagy ellenőrizhető. Ezeken felül rendelkezik még két "látsz6lagos regiszterrel" , amelyek nem is igazán azok, tekintve, hogya címükre írt adat értéke közömbös, az adott műveletet az adott címre történt írás váltja ki. (Ehhez hasonl6t láthattunk a korábbi fejezetekben is, pl. a ROM-Iapozást végző áramköröknél vagy a billentyű beolvasásánál. )

A TED regisztermezőjének első címe $FFOO(65280), ezen a címen találhat6 a O. regiszter, a többi sorban követi. A TED funkci6ir61, és ehhez kapcsolód6an a gép adott programozási lehetőségeiről a megfelelő regiszter leírásánál sz6lunk. Bemutatjuk a regiszterek összefoglal6 táblázatát, amely elősegíti azok munkáját, akik már kellően belejöttek a TED programozásába, és át tudják látni azt a sok szolgáltatást, amelyet ez az intelligens chip nyújtani tud a programoz6nak.

 

Lássuk ezek után a regiszterek részletes leírását:

$FF00(65280) - 0. regiszter: 1-es számlá16 alsó byte-ja
$FF01(65281) - 1. regiszter: 1-es számlá16 felső byte-ja
$FF02(65282) - 2. regiszter: 2-es számlá16 alsó byte-ja
$FF03(65283) - 3. regiszter: 2-es számlá16 felső byte-ja
$FF04(65284) - 4. regiszter: 3-as számlá16 alsó byte-ja
$FF05(65285) - 5. regiszter: 3-as számlá16 felső byte-ja

A TED-nek 3 db belső számlálója van, amelyeket időzítési célokra használhatunk. Mindegyik számláló a beírt értéktől lefelé számol, és mindegyik generál megszakítást, amikor $OOOO-ra ér (ez azonban csak akkor jut érvényre, ha az adott engedélyező bit 1 értéke, 1. 10-es regiszter). A számlálás frekvenciája 884 kHz (NTSC rendszernél 894 kHz). A gyakorlatban ez annyit jelent, hogy a számlá16k minden beérkező 6rajelimpulzus hatására eggyel csökkentik (dekrementálják) a regisztereikben lévő aktuális 16-bites számot.

A számlálási kezdőérték módosításához először beírjuk az alacsonyabb helyi értékű byte-ot (als6 byte), ennek hatására letilt6dik a számlálás mindaddig, amíg a magasabb (felső) byte értékét is be nem töltjük. Az als6 és felső byte betöltésének idejére a megszakításokat ajánlatos letiltani (SEI). A számlál6k regisztereit kiolvasva mindig az aktuális számolási értéket kapjuk meg.

Az 1-es számlá16 különbözik a 2-estől és a 3-ast61. Ez a számlá16 ui. amint O-ra ér, a feltöltéskor beírt értéktől kezdi ismét a lefelé számlálást, míg a másik kettő szabadon fut6 számlá16, a O-ra érés után $FFFF-ról folytatják tovább a dekrementálást. .

$FF06(65286) - 6. REGISZTER

O., 1., 2. bitek

Ezen bitek a függőleges irányú scrollozás (képmozgatás) pozíci6bitjei. Normál 25 soros, nem scrollozott képernyő esetén e biteknek a 3-as értéket kell mutatniuk (binárisan: 011).

3. bit

A képernyő 24, ill. 25 soros állapotai közötti át kapcsolást teszi lehetővé. Ha értéke O, a képernyő 24 soros lesz, ha 1-es, akkor pedig 25 soros.

A függőleges scrollozás megval6sításához a 3. bitet O-ba kell állítani, a 0-2 biteket pedig 1-be. Ezekután a O-2 biteken lévő értéket egyesével csökkentve a legfölső karaktersor "kiscrollozódik" a képernyőről.

4. bit Képernyőkioltó bit; 1-be állítva normál képernyőt kapunk. Ha ez a bit '0 értéke, a képernyőről eltűnnek a karakterek és háttérszínű lesz. Hardver oldalró1 ez úgy jelentkezik, hogy a TED nem hozza el a képszerkesztéshez szükséges byte-okat a tárból, tehát a rendszerórajel kétszeres frekvenciával futhat (1. 1.2.1; ~. a processzor órajele), kivéve a rasztersoronkénti 5 frissítő ciklust (dinamikus memóriák frissítése) , amely a RAM-adatok megtartása miatt elengedhetetlen. A képernyő kioltása értelemszerűen tehát a programfutást is gyorsítja.

5. bit A nagy felbontású grafikus üzemm6d engedélyező bit je, 1-be állítva a gép átkapcsol erre az üzemm6dra (Bit Mapped Mode). Ekkor a képpontok egyenként kezelhetők, mindegyiknek a tár egy-egy bit-je fog megfelelni. A TED képfelbontása 320*200-as, ennyi képpont tárolásához 8000 byte kell. Azt, hogy ez a tárterület milyen címen kezdődjön, a 18-as regiszter 3-5. bitjei határozzák meg. A grafikus üzemmód színinformáci6it a video-mátrix tárolja, ilyenkor a $1800(6144)-

 

$lBFF(7167) területen történik a fényeró-, a $lCOO(7168)-$lFFF(8191) területen (alapeset) pedig a színinformáci6k tárolása (alapeset). Mindkét tárterület byte-jai egy-egy 8*8-as képmezóre vonatkoznak: a fényeróterületen lévő byte-ok 0-2. bitjei az aktív képpontok fényerejének értékét tárolják, a 4-6. bitek pedig a háttér fényerejének adatát.

A színterület byte-jainak jelentése: 0-3. bitek - háttér színe, 4-7. bitek - aktív képpontok színe az adott 8*8-as képmezón belül.

6. bit Ennek a bitnek 1 értéke engedélyezi a bővített színüzemm6dot (Extended Color Mode). Ennek bekapcsolásával a lehetséges karakterek száma 64-re csökken, ugyanakkor azok színezési lehetősége megnövekszik. Ebben az üzemm6dban az inverz karakterek, a karaktervillogtatás és a kurzor nem használhat6k. A karakter aktív pontjainak színe nem változik a normál üzemm6dhoz képest. A háttérpontok színe viszont négyféle lehet, ezeket a TED négy regiszterébe kell beírni, azt pedig, hogy az adott karakter háttere melyik regiszterben tárolt színk6dnak feleljen meg, az adott karak- ter kódjának felső két bit je határozza meg:

00 - 21. regiszterben tárolt szín (háttérszín O)
01
- 22. regiszterben tárolt szín (háttérszín 1)
10
- 23. regiszterben tárolt szín (háttérszín 2)
11
- 24. regiszterben tárolt szín (háttérszín 3)

7. bit

A TED a belső teszthez használja, 0-ban kell hagyni.

$FF07(65281) - 1. REGISZTER

O., 1., 2. bitek

A vízszintes irányú scrollozás pozíci6bitjei. Normál, nem scrollozott képernyő esetén ezen biteknek O-ban kell lenniük.

3. bit

A 40/38 oszlopos képernyóállapotok közti át kapcsolást végző bit. Normál 40 karakteres képernyő esetén értéke 1.

A vízszintes irányú képernyóscrollozáshoz ezt a bitet O-ba állítjuk, majd a 0-2. bitek értékét növelve a karakterpozíci6kat jobbra toljuk.

4. bit

A többszínll üzemmód (Multicolor Mode) bekapcsolását engedélyező bit (l-gyellehet engedélyezni). Ebben az üzemm6dban a karaktermezón belül 2 szín helyett 4 színt jeleníthetünk meg, ekkor azon- ban a karakterek vízszintes felbontása feleakkora lesz, ui. a TED ilyenkor két szomszédos képpontot egyként kezel. Ennek a duplaszéles pontnak a színe a bináris értékétól függ:

00 - 21. regiszter ben tárolt szín (háttérszín O)
01 - 22. regiszterben tárolt szín (háttér
szín 1)
10 - 23. regiszterben tárolt
szín (háttérszín 2)
11
- a karakter színe (a video-mátrixban)

Ebben az üzemmódban az inverz karakterek, a karaktervillogtatás és a kurzor nem használhatók.

5. bit

A TED-et leállít6 bit. Ha ezt 1-be állítjuk, a TED leállít ja képszerkesztési mllveleteit és a három belső számlál6t. Ebben az esetben a processzor csak egyszeres 6rajelet kap, a dinamikus RAM-ok pedig csak a frissítő jeleket.

 6. bit

PAL/NTSC átkapcsol6 bit. Ez a bit határozza meg a TED-nek, hogy a videojel amit el5állít, milyen televízi6s szabványhoz igazodjék. A O jelenti a PAL m6dot, az 1 az NTSC-t (alapeset PAL).

7. bit

Inverz karakterek megjelenítését tilt6 bit. Normál esetben ez a bit O értékd, ekkor 128 karakterrel rendelkezünk, az inverz karaktereket pedig a video-mátrix pointer legföls5 bit jének l-be állításával lehet megjeleníteni. Ez engedélyezi a TED-nek az adott karakterbyte invertálását.

Ha azonban ezt a 7. bitet l-be állítjuk, 256 karaktert lehet használni, ez esetben a video-mátrix egy-egy byte-jának a legfölső bit je része lesz a karakterazonosít6 k6dnak.

$FFO8(65288) - 8. REGISZTER

Ez a regisztér a billentydzet vonalak állapotát tárolja A címére történő írás hatására a billentyl1vonalak (oszlopok) pillanatnyi értéke eltárol6dik. Ezt az eltárolt adatot a regiszter kiolvasásával kapjuk meg.

$FFO9/65289 - 9. REGISZTER

A megszakításokat jelző regiszter. Ennek bitjei jelzik egyfelől a TED-en belüli lehetséges megszakítás- források állapotát, másfelől a ténylegesen létrejött - a processzor felé kiküldött - megszakításokat (7. bit). A lehetséges megszakításforrások és a hozzájuk rendelt bitek a következ5k (a O. és az 5. bit nem használt):

1. bit

Rasztermegszakítás: a TED folyamatosan vizsgálja, hogy a raszterregiszterben tárolt érték és a raszterszámlál6 pillanatnyi értéke megegyezik-e, ha igen, akkor megszakítást generál és egyidejl1leg O-ba viszi ezt a bitet.

2. bit

A fényceruza-megszakítást jelz5 bit. Ezt a bitet feltételezhetően (sajnos) csak a TED későbbi fejlesztésére tartják fent, ebben a változatában nem került sor ennek gyakorlati megval6sításá.ra (nincs fényceruza- bemenet).

3. bit

Az l-es számlál6 megszakításbitjej ez akkor megy O-sba, ha az l-es számlál6 elérte a $0000 értéket.

4. bit

A 2-es számlál6 megszakításbitjej jelzési m6dja azonos az l-esével.

6. bit

A 3. számlál6 megszakításbitjej az előzőekkel azonos ml1ködésl1.

A megszakításgenerálások a megadott feltételek teljesülésekor mindig létrejönnek, és ezek a bitek jelzik is ezen állapotokat, att61 függetlenül, hogyamegszakításengedélyező regiszterben (10. regiszter) engedélye~ve lettek-e vagy sem. A processzor felé azonban csak akkor jutnak el, ha az engedélyező regiszter megfelelő bit je l-ben van.

A CPU felé kiadott megszakításjeleket a 9. regiszter 7. bit je mutatja:

1. bit

Érvényes megszakításkérést jelző bitj amikor a TED megszakítást kér a processzort61, ez a bit l-esbe állít6dik, vagyis ennek a bitnek az értéke gyakorlatilag a TED IRQ kivezetésén lévő logikai szint negáltjával azonos.

$FFOA(65290) - 10. REGISZTER

Ez a regiszter a TED-en belül létrejött megszakítások engedélyező regisztere. Az adott bit l-be állításával lehet a hozzárendelt megszakítást engedélyezni. Ennek a regiszternek a szerepéről az előbbi leírásánál már sz61tunk; kiosztása is az előzőéhez hason16. A regiszter 5. és 7. bit je nem használt.

O. bit

Ez a bit funkci6ját tekintve a következő regiszterhez tartozik (a ll.-hez), az ott tárolt számérték 9. bit je (1. ott).

1. bit

Rasztermegszakítást engedélyező bit.

2. bit

A fényceruza megszakítás-engedélyezésére fenntartott bit, gyakorlati jelentősége nincs (1. 9. regiszter 2. bit).

3. bit

Az 1-es számlá16 megszakításengedélyezése.

4. bit

A 2-es számlál6 megszakításengedélyezése.

6. bit

A 3-as számlá16 megszakításengedélyezésére.

$FFOB(65291) - ll. REGISZTER

A ll-es regiszter a TED raszterregisztere. A PAL televízi6s rendszernél egy képernyő 312 rasztersorb61 áll (0-311), míg az NTSC rendszerben 262-ből (O-261). Bármely szabványt vesszük is, arasztersorok számának tárolásához nem elég egy byte, egy kilencedik bit is kell. Az als6 nyolc bitet e regiszter tartalmazza, míg kilencedik bitként a 10. regiszter O. bit je szerepel. Az így létrejövő kilencbites szám lesz az, amelynek értékével beállithat6 a rasztermegszakítás bekövetkezésének kívánt helye; ennek a

regiszternek az értéke ui. folyamatosan összehasonlításra kerül a sorszámlá16 regiszter aktuális értékével, '.

s ha e kettő megegyezik, megszakításkérés jön létre. Ez a megszakításkeresés az aktuális sorban a karaktermező elérése e15tt 8 6rajelciklussal generá16dik. 25 soros képernyő esetén a megjeleníthető képmező sorszámai 4-től 203-ig változnak. .

A PLUS/4-es belső rendszerében a rasztermegszakításnak fontos szerepe van: a bekapcsolás utáni alapüzemm6dban ez a megszakításkérés álland6an él, ennek révén történik meg a billentyűzet lekérdezése, amely a megszakítást kiszolgá16 megszakításkér5-rutin része.

$FFOC(65292) - 12. REGISZTER

$FFOD(65293) - 13. REGISZTER --

E két regiszter azonos célú; mindkettő a kurzorpozíci6t leír6 10-bites számot tárolja. E szám als6 8 bit jét

a 13. regiszter tárolja, a fölső bitek pedig a 12. regis3ter als6 két pozíci6ján kaptak helyet; a szám 9. bit jét kell a 12. regiszter o. bit jé be tölteni, a 10. bitet pedig annak 1. bitjébe. Amennyiben a kurzort át akarjuk helyezni, csak ezeket a regisztereket kell megfelelően betöltenünk, és a TED máris áthelyezi a számnak megfelelő pozíci6ra. A pozíci6szám értéke a bal fels6 sarokt61 számíthat6, ez a o. pozíci6. Mivel az aktív karaktermező 1000 karakter hellyel rendelkezik, az 1001-1023 pozíci6számok megadása esetén a kurzor nem láthat6j alkalmasint ezt a tényt felhasználhatjuk a kurzor eltüntetésére.

$FFOE(65294) - 14. REGISZTER

A TED-nek két hanggenerátora van, amelyek négyszögjelet képesek szolgáltatni, ill. a 2. hanggenerátor zajt is. A hanggenerátorok frekvenciája 10 biten programozhat6. Ez a regiszter tartalmazza a TED 1. hanggenerátora frekvenciájának als6 nyolc bit jét. Az ehhez tartoz6 két magasabb bit a 16. regiszter als6 két bit jén találhat6.

A hanggenerátorok frekvenciájának kiszámítására a következő képlet használhat6 (C a regiszterekbe írand6 k6d, F a kívánt frekven~ia Hz-ben):

F=110840/(1023-C), VAGYIS

C=1023-(110840/F) j,') -- :-

:, ' - ~,/)~~

A 110840-es érték a gép 6rajel-frekvenciájának l/l6-od része. Tekintve, hogy a beírand6 k6d nem lehet törtszám, a hanggenerátorok által szolgáltatott hang tényleges frekvenciája (FT):

FT=110840/(1023-INT(1023-110840/F) $FFOF (65295) - 15. REGISZTER

Ez a regiszter a TED 2. hanggenerátora frekvenciáján ak als6 nyolc bit jét tartalmazza. A további két idetartoz6 bitet a 18. regiszter als6 két bit jén találhatjuk meg.

$FF10(65296) - 16. REGISZTER

Ennek a regiszternek als6 két bit jén (O. és 1.) találhat6 az 1-es hanggenerátor frekvenciaértékének két magasabb bit je. E kettő közül az 1-es pozíci6jú bit tartalmazza a hanggenerátor tizedik bit jét. A regiszter többi bit je nem használt.

$FF11(65291) - 11. REGISZTER

Ez a regiszter vezérli a hanggenerátorok funkci6it:

O., 1., 2., 3. bit

A hangerősség értékét tárol6 bitek. Ezek mindkét hanggenerátorra vonatkoznak, a kettő csak azonos hangerővel sz6lhat. O-t61 7-ig szabályozhat6 a hangerő, a O érték ki is kapcsolja a hanggenerátort.

4. bit

Ezzel a bittellehet az 1-es hanggener.tort ki- és bekapcsolni. A bekapcsolást ezen bit 1-be állítása eredményezi. :

5. bit

A 2-es generátor négyszögjelet ad6 üzemm6dját engedélyezi ezen bit 1-es értéke.

6. bit Ezt a bitet 1-be állítva lehet a 2-es generátort zaj előállításra bírni. Ez a zaj nem fehérzaj, annak csak egyfajta modellezése, amely abb61 is észrevehető, hogy a 2-es hanggenerátor megadott frekvenciáját61 függően a zaj "hangmagassága" is változik (a zaj átlagfrekvenciája a beírt értéknek kb. fele). Végsősoron ez egy olyan négyszögjel, amelynek frekvenciája és kitöltési tényezője,  jelsorozat egy idő után ismétlődik. Mindazonáltal a zaj ezen tulajdonságai egyes játékprogramoknál jó1 kihasználhat6k.

'1. bit

Ennek a bitnek 1-be állításával a TED hanggenerátorai egyenszintet szolgáltatnak, amelynek nagysága a hangerőbitek állapotát61 függően nyolc féle értéket vehet föl. A TED ezen tulajdonságát kihasználva megfelelő gépi k6dú programmal különféle jelalakokat lehet előállítani.

$FF12(65298) - 18. REGISZTER

Ennek a regiszternek a bitjei különböző funkci6kat látnak elj az als6 kettő a hanggeneráláshoz tartozik, a többinek pedig a képelőállításban van szerepe. A 6. és 7. bit nem használt.

O., 1. bitek

A TED ezt a két bitet használja a 2. hanggenerátor frekvenciaértékének 8. és 9. bitjeként (ez ut6bbi találhat6 ezen regiszter 1. pozíci6jú bit jén).

2. bit

Ez a bit határozza meg a TED-nek, hogy a karaktergenerátort (a karakterbyte-ok tárolására szolgál6 2 kbyte-os területet) a ROM vagy RAM területen keresse-e (a címet meghatároz6 bitek a következő regiszterben találhat6k). Az 1 érték jelenti a ROM-ot, a O a RAM-ot.

3., 4., 5. bitek

Ezek a bitek jelölik ki a nagyfelbontású grafikus üzemmód esetén (1. 6. regiszter 5. bit) a képpontokat tárol6 mem6riaterület kezdetét 8 kbyte-os egységekben, azaz pl. ezen bitek összértékét eggyel növelve a grafikus terület 8 kbyte-tal följebb kerül kijelölésre. A gyakorlatban ez úgy történik, hogy a TED grafikus üzemm6dban a képpontok mem6riacímének három legfölső bit jét

ezzel a 3 bit tel azonosítja (A15 - 5. bit, A14 - 4. bit, A13 - 3. bit), s az így ad6d6 címterületről

olvassa ki aképpontokat.

$FF13(65299) - 19. REGISZTER

0. bit

Állapot jelző bit, amely azt mutatja, hogy a TED a $8000(32768) fölötti területen ROM-b61 vagy RAM-b61 dolgozik-e, vagyis azt jelzi, hogy a 62. és a 63. ún. fantomregiszterek közül melyikre történt írás (ennek hatására történik ui. az átkapcsolás). Ezen bit 1 értéke jelzi, hogy a ROM terület az érvényes. Meg kell jegyeznünk ugyanakkor, hogy ez a bit nem jelzi, hogy a TED honnan hozza el a képpont- vagy karakteradatokat.

1. bit

Egyszeres 6rajelet beállít6 bit. Amint azt korábbi fejezetekben is tárgyaltuk már, a TED szolgáltatja a processzor 6rajelét, amely a képszerkesztés idején egyszeres, ~ vízszintes sorkioltás alatt edig kétszeres frekvenciájú. Ez ut6bbi állapot letiltására val6 ez a bit; 1-be állításának eredményeképpen a processzor csak egyszeres 6rajellel fog futni (single clock).

2., 3., 4., 5., 6., 7'. bitek

Az ezeken a biteken tárolt érték azt határozza meg a TED-nek, hogy a karaktergenerátor milyen címen kezdődik. Mivel itt 6 bitről van sz6, így a karaktergenerátor kezdőcímét kbyte-ban tudjuk megadni.

$FF14(65300) - 20. REGISZTER

A video-mátrix kezdőcúuének meghatározására szolgál65 bit kapott helyet ebben a regiszterben. Az öt bit ből következően ezt a kezd6címet 2 kbyte-onként definiálhat juk. Amikor a TED a video-mátrix területéről adatot olvas ki, a kiküldend6 mem6riacím fels6 öt bit jét ennek a regiszternek felső öt bit jével azonosítja, a következőképpen: A15 - 7. bit, A14 - 6. bit, A13 - 5. bit, A12 - 4. bit, AlI - 3. bit. A' regiszter als6 három bit je nem használt.

$FF15(65301) - 21. REGISZTER: HATTÉRSziN O .'

$FF16(65302) - 22. REGISZTER: HATTÉRSZiN 1 $FF17(65303) - 23. REGISZTER: HATTÉRSZiN 2

$FF1S(65304) - 24. REGISZTER: HATTÉRSziN S

Ezek a regiszterek határozzák meg a lehetséges háttérszíneket a különböz6 üzemm6dokban. Normál karakteres üzemm6d esetén a képmez6 alapszínét a 21. regiszter ben tárolt érték határozza meg. Minden egyes regiszter als6 négy bit jén találhat6 a tényleges színk6d (O~, 1., 2., 3. bitek), a 4., 5. és 6. bittel pedig a fényerőt lehet szabályozni. llym6don tehát a 16 színnek és 8 fényerőértéknek összes variáci6ját beállíthatjuk. A regiszterek 7. bit je nincs kihasználva.

$FF19(65305) - 25. REGISZTER

Ezen regiszter kiosztása teljesen megegyezik az előz6 négy kiosztásával. A bitek értékei a külső keret színét határozzák meg.

$FF1A(65306) - 26. REGISZTER

Ennek a regiszternek a felső 6 bit je nem használt, als6 2 bit je pedig feladatuk szerint a következő (27-es) regiszterhez tartozik, az abban tárolt karakterpozíci6 értékének két legértékesebb bit je találhat6 ezen biteken (ezek közül az 1. bit tartalmazza a karakterpozíci6-szám legfelső bit jét).

$FF1B(65307) - 27. REGISZTER

Ez a .regiszter és a 26-os als6 két bit je együttesen mutatják az aktuális sor els6 karakterének pozíci6számát, amelynek als6 nyolc bit je találhat6 itt. Ez az érték rasztersoronként újratölt6dik, annak megfelelően, hogy a TED hol tart a képszerkesztéssel. Például az első karaktersor alatt ebben a két regiszterben tárolt érték O lesz, amint azonban a TED befejezte az első karaktersor nyolcadik rasztersorának kirajzolását is, ez az érték átír6dik 40-re.

$FF1C(6530S) - 28. REGISZTER

Ennek a regiszternek csak egy bit je használatos, a O. bit, amely viszont a következő regiszterben lévő aktuális rasztersoszámot kiegészítő (9.) bit.

$FFID(65309) - 29. REGISZTER

Az aktuális (éppen kijelzés alatt álló) rasztersor - vagy más néven videosor - számát tartalmazza ez a

regiszter. A sorszám kilencedik bit je a 28. regiszter o. bit jén található. PAL rendszerben ennek értéke O és 311 között változik, míg NTSC-ben O és 261 között változik.

$FFIE(65310) - 30. REGISZTER .

Ez a regiszter a vízszintes pozíció regisztere, amely a TED ugyanilyen funkciójú 9-bites belső regiszterének felső nyolc bit jét tartalmazza. A belső regiszter legalsó bit je a képszerkesztés folyamán gyorsabban változik annál, hogy azt programból használni lehessen. A belső regiszter tartalma O-tól 455-ig növekszik, ebből következően a 30. regiszter O-tól 228-ig terjedő értékeket tartalmaz.

$FFIF(65311) - 31. REGISZTER

O., 1., 2. bitek

Ezen bitek azt mutatják, hogy a TED az aktuális karaktersoron belül hányadik rasztersornál tart, ez az érték tehát O és 7 között változik.

3., 4., 5., 6. bitek

Az ezeken tárolt szám értéke képernyőnként eggyel növekszik, a TED ezt használja a kurzor és más karakterek villogtatásához. A villogtatást az adott karakter inverzbe fordításával éri el, ami akkor történik meg, amikor ez a szám eléri a 15-öt. Az invertálás kb. 3,3 Hz-es frekvenciával (0,3 s-onként) történik, tehát a kurzor kb. 1,6 Hz-cel villog.

'1. bit: nem használt

'l;~:i' $FF3E(65342) - 62. REGISZTER: - ROM-RA KAPCSOLAs. $FF3F(65343) - 63. REGISZTER: - RAM-RA KAPCSOLAs

Ezek a regiszterek tulajdonképpen nem léteznek a TED-en belül, ezért hívják őket látszólagos vagy

"fantom"-regisztereknek. Ezekre a memóriacímekre történ6 írás hatására a TED átvált ja a $8000- $FFFF tárterületet ROM-ról RAM-ra, vagy fordítva. Ez az átváltá:s nem vonatkozik a $FDOO-$F3FF területre,. amely minden esetben az I/O eszközök helye.

A TED az átkapcsolásokat fizikailag a következ6 módon éri el:

. ROM-ra kapcsolás ($FF3E címre történt írás)

A $8000-es fölötti címek megszólításakor megfelel6 Chip Select jeleket szolgáltat a ROM-oknak, a dinamikus RAM-ok CAS jelét pedig letiltja, amíg a $FF3F címre nem történik írás.

. RAM-ra kapcsolás ($FF3F címre történt írás)

Ha a processzor a $8000-s cím fölötti területhez fordul, a TED a CAS vonal megfelelő vezérléséveI lehet6vé teszi a dinamikus RAM-oknak az adatforgalmat, ugyanakkor a ROM-oknak nem ad kiválaszt6 (Chip Select) jelet.