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érszí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.