close

Enter

Log in using OpenID

7-Komut Yapısı - Güncel Web İndir

embedDownload
KOMUT YAPISI Yazılan program kodları belli bir düzende belleğe küçük adresten büyük adrese doğru yerleşirler. Daha sonra bellekte bulunan bu kodlar işletildiğinde, yerlerinin otomatik olarak tespiti için daha program yazım aşamasında iken komutun hemen yanına işlenecek verinin adresinin otomatik olarak bulunmasını sağlayan bazı özel işaretler konulur. Bu işaretlerle birlikte, bellekte bulunan verinin CPU tarafından alınarak işlenmesi için adresleme modları (türü) geliştirilmiştir. Makina dilinde yazılan programlar ikili sayı sistemine göre ele alındığından, programcının işlemin ne yaptığını anlaması çok zordur. Bu sebepten komutlar bir araya getirilmiş bir dizi kelime kısaltması olan hatırlatıcı harflerden meydana gelir. Bu sembolik dil kullanılarak yazılan kaynak ifadeler daha sonra makina diline çevrilir. Bu çevirme işlemi alfabelik sembolik komut kümesi kullanılarak elle yapılabilmektedir. Çeviri işlemi aynı zamanda assembler denilen bir özel bilgisayar programı vasıtasıyla gerçekleştirilir. Çeviri işlemi sırasında her bir kaynak ifade veya işlem komutu, kullanılan adresleme moduna bağlı olarak bir ile üç bayt arasında işlem koduna (işkodu) çevrilir. 1 . Kaynak Program Alanları Kaynak programdaki her bir ifade, kullanıcı tarafından hazırlanan alanlarda yer alır. Bunlar; etiket alanı, işlem kodu alanı, işlenen alanı ve açıklama alanlarıdır. Her kaynak ifade en az bir işlem kodu alanına sahip olmalıdır, işlenen komut tipine bağlı olarak kullanılabilirken, açıklama programcının isteğine bağlıdır. Bir komutun komut cümlesindeki kelimelerin kısaltılmasından meydana geldiği belirtilmişti. Buna güre LDA komutu ele alınacak olursa: Load Accumulator with operand cümlesindeki, Load kelimesinden türemiştir. Buna göre Load'tan LD, Akümülatorden de A harfleri alınarak LDA komutu oluşturulur. Diğer bir komut olan BCS, Brach on Carry Set cümlesindeki kelimelerin baş harfleri alınarak oluşturulmuştur. Bütün bu komut kısaltmaları mikroislemci firmaları tarafından meydana getirilerek mikroişlemci tanıtım kitapları vasılasıyla dünyaya yayılmakta olup, kullanıcı bu kaynak kitaplardaki komut kümesinden faydalanarak, assembly dilinde programlar yazabilir. 1 . 1 . Etiket Alanı Daima seçimlik olan bu alan, bir sayısal değere veya bellek alanına karşılık gelebilir. Belleğe karşılık gelen bu sembolik referans, belleğin kendi sayısal adres karşılığının kullanımını gerektirmez. Meselâ, TARA işlenen etiketi, bellekte herhangi bir yerde olabilir. Etiketler herhangi bir BRANCH, JUMP veya CALL komutunun (altyordama) dalış adresi olabilir. Yani bir satırın adlandırılmasında kullanılabilir. Etiketler asla bir rakamla başlamazlar. Başına mutlaka A'dan Z'ye bir harfin gelmesi gereklidir. Bu harften sonra istenen sayısal değerler altı karakteri geçmemek şartı ile kullanılabilir. A, X ve Y gibi harfler, akümülatör ve indisçi kaydedicilere ad olarak verildiğinden kullanımları kısıtlanmıştır. Dalma, çağrı ve sapma komutlarına bağlı olarak kullanılan etiketler, program sayıcısına yeni bir değerin atanmasını ve programın akışının değişmesini sağlarlar. Tablodaki küçük program parçasına bakıldığında, ARA ve TARA isimli etiketler kullanılmıştır. Burada ARA etiketi, programın ya bir altprogramın dalış adresi ya da bir ara dalış adresi olduğunu, TARA ise, aranan bir şartın gerçekleşmesi halinde dalınacak sembolik adresi gösterir. Etiketin kullanım sebepleri : 1 .Etiket, program alanının kolaylıkla bulunmasını ve hatırlanmasını sağlar, 2 .Etiket eğer programda bir değişiklik veya bir düzenleme varsa, kolayca hareket ettirilebilir, 3 . Etiket kullanımıyla assembler veya yükleyici, programa yeniden yerleştirme sabiti eklenerek, her bir adrese yeniden yüklenebilir. 1 . 2 . İşlem Kodu Alanı İşkodu veya komut alanı denilen bu yerde, kısaca yapılacak olan işin komutları bulunur. Komut kelimelerinin kısaltılmış şekline mnemonic (hatırlatıcı) denilir. 56 farklı komutu temsil eden kısaltılmış olan bu harfler, üçlü veya dörtlü gruplardan oluşur. Bu alan etiket alanından bir tab aralıklı olmalıdır. 1 . 3 . İşlenen Alanı Operand alanı da denilen bu alana işlenene gerek duyan komutların veri veya adres tanımladıkları yerdir. İşlenen işlem kodu alanından en az bir boşlukla veya iki boş karakter sekmesiyle ayrılır. Semboller, işlenen alanında bulunan, işlenecek olan bilginin önüne konulan ve bilgiye özel anlam kazandıran işaretlerdir. Yukarıdaki tabloda görüldüğü gibi, işlenenin ne tip bir bilgi olduğu önüne veya sonuna konulan özel işaretlerden belli olur. Eğer işlenenin önünde takı kullanılmış ise son‐takı kullanılmaz. Eğer işlenenin sonunda takı kullanılmışsa ön‐takı kullanılmaz. Burada dikkat edilmesi gereken, eğer işlenen doğrudan bir veri ise, verinin önüne bir # (diyez) konulduktan sonra hangi veri grubuna giriyorsa onunla ilgili özel işaret verinin sonuna yerleşlirilir. Eğer işlenen alanında adres tanımlaması yapılıyorsa, buradaki tanımın önüne ön‐takı olarak $ işareti gelir. Elle yapılan makina kodu çevrimlerinde genellikle heksadesimal kodlar kullanılmakladır. 1 . 4 . Açıklama Alanı Bu alan daima seçimlik olup. istenildiği veya gerekli olduğu yerlerde kullanılır. Açıklama alanındaki notlar, komutlar veya işaretler assembler tarafından değerlendirilmez. Buradaki bilgiler programcı tarafından daha sonra programın akışının izlenmesi veya bir başkası tarafından programın yürütülebilmesi maksadıyla kullanılır. Açıklanan dört alanla ilgili bilgilerin birbirine karışmaması için alanların arasına konulan karakterlere ayırıcılar denilir, bunlar assembly dilindeki programın daha kolay anlaşılması ve okunabilmesinde programcıya yardımcı olurlar. Ayırıcılardan en çok kullanılanları şunlardır : " boşluk " :Etiket ile işkodu ve işkodu ile işlenen arasında kullanılır. "," : İşlenen alanında adres ile ek parametre arasında kutlanılır. ";","!" : Açıklama alanında, açıklamadan hemen önce kullanılır. ":" : Etiket alanında etiket sonunda kullanılır (TOPLA: gibi). 6502'de kullanılmayan bu ayıraç. Inlel'in 8085 ve + işlemcilerinde dalınacak adresin aynı sayfada veya bölümde olduğunda kullanılır. 2 . Adresleme Modları Bellekteki verilerin adreslenmesinde kullanılan farklı yollara adresleme modları denir. 6502 mikroişlemcisi zamandaş işlemcilerden daha fazla sayıda (13 çeşit) adresleme moduna sahiptir. Aşağıda 13 farklı adresleme modundan en çok kullanılan 8 tanesi verilmektedir. 2 . 1 . Akümülatör ve İmalı Adresleme Bu adresleme türü doğrudan Akümülatör kaydedicisini kullandığından bu adı almıştır. Daha çok sağa veya sola kaydırma ve döndürme komutlarını içerir. Bunlar; ASL, LSR, ROL ve ROR gibi komutlardır. Kaydırma komutları kastedilen kaydediciyi veya bir bellek alanını 1 bit ASL ile sola, LSR ile sağa kaydırır. İmalı adreslemede harici bir işlenen bulunmamakla birlikle, adres komut içerisinde ima edilmekledir. (saklanmaktadır). Meselâ, DEX komutunda X kaydedicisinin içeriği bir azaltılacak demektir. Burada ima edilen kaydedici X'dır. Verinin tanımlanmasında ilave bir adreslemeye gerek yoktur, imalı adreslemeye CLC, SED, DEY, INX, NOP, PHA, RTI, TAX gibi komutlar örnek olarak verilebilir. 2 . 2 . Veri Tanımlı Adresleme Veri tanımlı adresleme modu, akümülatör veya indis kaydediciler üzerinde çalışacak 2‐baytlık komutların kullanılmasına izin verir. Komutun birinci baytı komut kodu, ikinci baytı işlenen içindir. İkinci bayt, bellekten bir defada getirilen veridir ve bellekten daha fazla veri getirmeye gerek yoktur. Veri tanımlı adresleme moduna örnek olarak Şekildeki örnek gösterilebilir. ADC #$25 komulundaki 25 sayısı bir onaltılık işlenendir. Bellekteki program alanında hemen komut kodundan sonra gelir. ADC komutunun kodu 69'dur.Bu komutun üzerinde çalışacağı veri ise 25 sayısıdır. Bu veri, belleğin veri alanı yerine doğrudan program alanında tanımlandığı için, bu adresleme moduna veri tanımlı adresleme modu denilmekledir. ADC komutu ile komut kodundan sonra gelen veri, akümülatör içerisindeki veri ve C (elde) bayrak biti birlikte toplanarak sonuç tekrar akümülatöre atılır. Eğer C=0 kabul edilirse bu komut satırı sonunda A kaydedicisinde A=25+15+0=3AH görülecektir. 2 . 3 . Mutlak Adresleme Bu adresleme moduyla 64KB'lık bellek alanındaki herhangi bir bellek alanı adreslenebilir. Mutlak adresleme, işlenen alanında hedef adresin tam olarak tanımlanmasıdır. Bu adresleme modu bellekle 3 baytlık yer tutar. Bellek 16‐bitlik adres yoluyla en çok 64KB'lık bir bellek uzayını işaret edebildiğinden, 16‐bitlik bir mutlak adres kaydedicilerde veya bellekte ikiye bölünerek saklanabilir. 4 haneli onaltılık sayı 64KB'lık bir belleği adresleyebilmek için toplam 16‐bitlik adres yoluna gerek duyar. 16‐bitlik adres bellekte düşük değerlikli tarafı önce yüksek değerlikli tarafı daha sonra saklanır. Yani adresin 8‐bitlik LSB tarafı düşük adreste, diğer 8‐bitlik MSB tarafı bir sonraki adreste saklanır. Mutlak adresleme modu şekile göre açıklanırsa, ADC $20E4 komutu belleğin program alanında küçük adresten başlamak üzere 6D EA 20 olarak saklanır. Bu satır işlendiğinde, PC'nin gösterdiği 0200H adresinden ADC komutunun kodu (6D) alınıp getirerek kodu çözülür. Bu çözüm, kodtan sonra gelen ardışık iki verinin üzerinde işlem yapılacak esas verinin adresi olduğunu ifade eder. Böylece işlemci 20E4H adresine giderek oradaki A5H verisini alarak akümülatördeki veri ve C'yi de katarak işlem yapar. A=A+[20E4]+C olarak ifade edilir. 2. 5 . Göreceli Adresleme Göreceli adresleme modu BNE ve BEQ gibi şartlı dallanma komutları ile birlikte kullanılmaktadır. Göreceli adreslemede, program sayıcının içeriği pozitif veya negatif olabilen yayılım faktörü ile değiştirilir. Bellekte icra edilecek olan komutun etkin adresi göreceli bir adrestir, bu tip adreslemede koşulan şart doğruysa, CPU'daki Program sayıcısı dalınacak adresi alarak programı buraya yönlendirir. Etkin adresin hesaplanması, o anki program sayıcısının değerine pozitif veya negatif ofset değerinin eklenmesiyle yapılır. Pozitif ofset değeri adresin ileriye doğru artması, negatif ofset değeri adresin geriye doğru azalması demektir. Dallanma komutları, eğer şart sağlanmışsa denetimin ileri ya da geriye yapılmasına, eğer şart sağlanmamışsa dallanma komutundan sonraki sıradaki komuta aktarılmasına sebep olurlar. İleri veya geriye sapmalar ‐128 ile +127 arasında oynamakladır. Göreceli adresleme modu İleri ofsetle
açıklanırsa:
0204 BCC
0205 04
0206 (PC burada,eğer C=1 ise)
0207
0208
0209
020A (PC burada,eğer C=0 ise)
020B
Göreceli adresleme modu geri ofsetle
açıklanırsa:
0204 (PC burayı gösterir,eğer C=1 ise)
0205
0206
0207
0208 BCS
0209 FA
020A (PC burada,eğer C=0 ise)
020B
Örnekte; C bayrağına bakılarak ileri sapma işlemi ele alınmaktadır. Komut, 0204 adresinde iş‐kodu, 0205 adresinde ofset değeri yer almaktadır. BCC dallanma komutu çalışırken PC 0206 no'lu adresi işaret eder. Eğer şart gerçekleşmezse çalışmaya bu adresten itibaren devam edilir. Eğer şart gerçekleşirse, PC'nin o anki değerine (0206) ofset değeri (04) eklenerek dalacağı adres hesaplanır (PC=0206+04=020A). BCS komutu çalıştırılırken PC 020A adresini gösterir. Göreceli dallanma işleminde hedef adres hesaplaması, PC'nin gösterdiği adrese ofset değeri eklenerek yapılır. PC=020A, ofset FA ise. 020A+FA=0204 bulunur. Burada adresin LSB tarafı gözönüne alırken herhangi bir elde hesaba katılmaz. Dallanma sahası +127 ‐128 arasında değişen bu adreslemeye göreceli adresleme denir. 2 . 6 . İndisli Adresleme Etkin adres, taban adrese X veya Y kaydedicisinde bulunun veri eklenerek bulunur. Bu adresleme türünde komut bir bayt alırken işlenende iki baytlık yer alır. Aynı sayfayı kullanımda 4 saat saykılı çeken bu tip komuta eğer, başka sayfadaki bir adres tarif ediliyorsa 1 saykıl daha eklenmelidir. Eğer komutun işlenen kısmında taban adresi mutlaksa, bu adresleme moduna mutlak İndisli adresleme denir. Adres mutlak değilse $20 gibi, bu adresleme Sıfırıncı sayfa adresleme türüdür. ADC komutu, X indis kaydedicisinin kapsamını (05H) taban adresi olarak belirtilen 20H sayısıyla toplayarak yeni bir etkin adres bulur (0040+05) ve bu adresteki E7H veriyle akümülatörün (A) içerisindeki veriyi (15H) C'yi de göz önüne alarak toplar. A=A+[0040+05]+C. Bu adresleme modu bellekte 2 baytlık yer tutarken, 4 saat çevrimi çeker. Çünkü etkin adres adından da anlaşılacağı gibi sıfırıncı sayfadadır. Bu adreslemede Y indis kaydedicisi kullanılmaz. Eğer mutlak indisli adresleme moduna bir örnek verilirse; ADC $4055,Y Bu komutla, Y indis kaydedicisinin içeriği (05H) taban adres [4055]'e eklenerek etkinadres bulunur. Bu yeni adresteki veri akümülatörde bulunan veriyle karşılaştırılır ve hemen bir şartlı komutla sonuç sorgulanarak PC yönlendirilir. 2 . 7 . Dolaylı Adresleme Bu adresleme modu mutlak adreslemenin bir altkümesidir, fakat sadece JMP (Jump) şartsız dalma komutuna uygulanır. JMP komutu aynı zamanda mutlak adreslemeyi de kullanır. Bu modda komutun ikinci ve üçüncü baytları etkin adresin yerleştirildiği adresi kapsar. 6502 mikroişlemcisinin JMP komutu, mutlak adresleme ve dolaylı mutlak adresleme türünün ikisini de kullanabilir. Burada JMP komutu, bir sonraki işlenecek komutun adresini program sayıcısına yükler. Mutlak dolaylı adreslemede, JMP komutunun işleneni, 16‐bitlik hedef adresi içeren iki bellek alanından ilkinin adresidir. Mutlak dolaylı adreslemeye Şekilde gösterilen JMP ($1234) ifadesini örnek gösterilebilir. JMP komutunun mutlak dolaylı adreslemedeki kodu olan 6C bellekte ilk yeri alırken, dalınacak gerçek adresin bulunduğu yerin ilk adresini gösteren adres de hemen ondan sonra gelir. Sapılacak adres doğrudan tanımlanmıyor, fakat bunun yerine adres içerisinde adres tarif edildiğinden bu adreslemeye dolaylı denmektedir. Mutlak dolaylı adresleme bize, değişken hedef adresle çalışma imkânı sağlar. Meselâ, birkaç çevre cihazımı servis verecek bir sistemin içeririnde 6502 işlemcisi varsa, bu çevre birimlerine hizmet edecek olan komut dizilerinin bulunduğu bloklara JMP komutunun mutlak dolaylı adreslemesiyle erişilebilir. Bu durumda mutlak dolaylı JMP komutu, daima aynı bellek alanı çiftinden 16‐bitlik adresi alıp getirebilir. Fakat, herhangi bir çevre cihazının servis istediğine bağlı olarak işlemci bu alanların içeriğini değiştirebilir. Veri işleme işlemlerinde, tek bir 6502 mikroişlemcisi birden fazla operatörün kullandığı klavyeden veri kabul edebilir. Bu durumda, 6502' nin dalacağı hedef adres, herhangi bir anda işlemcinin vericini kabul etliği klavyeye bağlıdır. Birinci klavyeden girilen veriler bellekte bir yere, ikinci klavyeden girilen veriler bellekle başka bir yere ve diğerleri de aynı şekilde yerleştirilir. Aynı zamanda bu adresleme türü, ROM'daki program bloğunun okunması sırasında da kullanılabilir. 2 . 8 . İndisili Dolaylı Adresleme Bu adresleme modunda işlenen alanında önce indisleme sonra dolaylama yapılır. İlk olarak ön‐indis dolaylı adresleme de denilen, indisili‐dolaylı adrestemeye örnek verilirse; ADC ($20,X) İndisli adreslemede, taban adrese indis kaydedicisinin içeriği eklenerek ikinci adrese ‐verinin etkin adresine‐ varılıyordu. Dolaylı adreslemede, komutun işlenen kısmındaki etkin adresle bu adrese komşu bir sonraki adres birleştirilerek gerçek adres bulunur. Şekile göre, ADC ($20,X) komutunun, ön‐indis dolaylı adresleme modunu kullanmasından dolayı, sıfırıncı sayfayı işaret eden 20H taban adresine, 8‐bitlik ve en fazla FFH (255) değeri alabilecek X indisinde bulunan veri eklenerek tanımlanan gerçek adres bulunur. Eğer X indisinde 05H verisi varsa, bunun taban adresiyle toplanması halinde 20H+05=25H olur. Bellekteki bu adres (0025H) ve bundan bir sonraki [0025H] adresin içerikleri, önce düşük adresteki (1AH), sonra yüksek adresteki veri (00H) alınarak DAR'a konulur (001AH) ve işlemci bu yeni etkin adresteki veriyi (AAH) akürmülatördeki veri ile C'yi de dikkate alarak toplar. Burada taban adresine X'in değerinin eklenmesi işlemine indisleme ve bulunan bu adres ve bir sonraki adresteki verilerin alınarak yeni bir adres oluşturma işlemine de dolaylama denilir. 2 . 9 . Dolaylı İndisli Adresleme Diğerinden farklı olarak sadece taban adresin parantez içerisine alınması ve Y indisinin bunun dışında tutulmasıdır. Bu adreslemeye örnek olarak aşağıdaki komut satırı verilebilir: ADC ($20),Y Bu adresleme türünde komutun ikinci baytı yani işlenen kısmı diğerinde olduğu gibi belleğin ilk 0‐
255' lik kısmında bir adresi tarif eder, fakat etkin adres daha değişik bir yerde olabilir. 3.Komut Tipleri 6502 mikroişlemci komut kümesinde bulunan komutlar aşağıdadır: ADC
AND
ASL
Eldeyle birlikte belleği A'ile topla
Belleği A ile mantıksalolarak çarp
Aritmetik 1 bit sola kaydır
BCC
BCS
BEQ
BIT
MBI
BNE
BPL
BRK
BVC
BVS
CLC
CLD
CLI
CLV
CMP
CPX
CPY
DEC
DEX
DEY
EOR
INC
INX
INY
JMP
JSR
Eldeki 0 ise dallan
Eldeki 1 ise dallan
Sonuç 0 ise dallan
Bellekteki bitleri A'dakilerle test et
Sonuç negatifse dallan
Sonuç sıfır değilse dallan
Sonuç pozitifse dallan
Programı durdur
Taşma sıfırsa dallan
Taşma birse dallan
Eldeyi sil
Ondalık modu sil
Kesme yetkisizlik bitini sil
Taşma bayrağını sil
A ile belleği karşılaştır
X ile belleği karşılaştır
Y ile belleği karşılaştır
Belleğin değerini bir azalt
X'in değerini bir azalt
Y'nin değerini bir azalt
A'yı bellekle mantıksal EXOR'la
Belleğin değerini bir artır
X'in değerini bir artır
Y'nin değerini bir artır
Yeni bir alana dallan
Dönüş adresini saklayarak yeni
adrese dal
LDA
LDX
LDY
LSR
Belleği A'ya yükle
Belleği X'e yükle
Belleği Y'ye yükle
1 bit sağa kaydır
NOP
İşlem yok
ORA
PHA
PHP
PLA
PLP
ROL
ROR
RTI
RTS
SBC
SEC
SED
SEI
STA
STX
STY
TAX
TAY
TSX
TXA
TXS
TYA
Belleği A ile OR'la
A'yı yığına at
Bayrakları(P) yığına at
A'yı yığından geri çek
Bayrakları yığından al
Bir bit sola döndür
Bir bit sağa döndür
Kesmeden dön
Altprogramdan dön
Borç ile A'dan çıkar
Elde bayrağını birle
Ondalık bayrağını birle
Kesme bayrağını birle
A'yı belleğe at
X'i belleğe at
Y'yi belleğe at
A'yı X'e aktar
A'yı Y'ye aktar
SP'yi X'e aktar
X'i A'ya aktar
X'i SP'ye aktar
Y'yi A'ya aktar
Bu bölümde işlenecek olan komutlarda kullanılacak tanımlama ve kısaltmaların anlamları şöyledir: A
X
Y
PC
SP
P
Akümülatör
X indis kaydedicisi
Y indis kaydedisici
Program Sayıcısı
Yığın İşaratçisi
Bayrak Kaydedicisi
Komutlar yaptığı işlemlere göre gruplara ayrılır. Bu gruplar şunlardır: 1 . Veri Manevra (Aktarım) Komutları 2 . Aritmetik Ve Mantık Komutları 3 . Giriş/Çıkış Komutları 4 . Veri Test ve İşleme Komutları 5 . Program Kontrol Komutları 4 . 1 . Veri Aktarım Komutları Bu kategoriye giren komutlar, 8‐bitlik verilerin bir mahalden bir başka mahale, mikroişlemci ile bellek arasında veya mikroişlemci ile G/Ç elemanları arasında transferini gerçekleştirirler. Bellekten belleğe doğrudan veri aktarım komutu yoktur. Bu durumda CPU gibi aracı eleman gereklidir. Veri önce bellekten akümülatöre alınır, daha sonra da diğer bellek alanlarına aktarılır. Veri aktarım işlemleri kendi arasında üç alt gruba ayrılırlar: Aktarım bellekle kaydedici arasında, kaydediciden kaydediciye ve yığına veri atıp geri alma şeklinde yapılabilir. 4 . 1 . 1 . Bellek ‐ Kaydedici Aktarımı Bellekten kaydediciye veri alışında LDA, LDX ve LDY gibi yükleme komutlarından faydalanılır. Komutların sonundaki harfler, A kaydedicisini, X indis kaydedicisini ve Y indis kaydedicisini hedefler. Verinin alındığı bellek mahalleri, komutun işlenen kısmında ifade edilir. Bu adresler, mutlak, indisli ve veri tanımlı olabilirken, bayraklardan Z ve N bayrağını etkilerler. Kaydedicilerden belleğe depolama veya saklama komutları, STA, STX ve STY'dir. Bu kaydedicilerdeki bilgi işlenende hedeflenen belleğe aktarılır. Bu aktarım, işlemelerinde bayraklara bir etki olmaz. Veri aktarım işlemlerinde, kaynağın içeriği değişmezken, hedefin içeriği değişir. Meselâ belleğin bir yerindeki veri alınarak başka bir yere atılma işlemi için basit program yapılırsa: LDA
STA
$0200
$2025
; A «— [0200]
; [2025] «— A
Burada [0200] adresindeki veri (verinin değeri önemli değil) akümülatöre alınarak tekrar başka bir yere, [2025] adresine transfer edilmekledir. [2025] adresinde bulunan daha önceki veri aktarılan yeni değerin altında silinirken, [0200] adresindeki veri aynen kalır. Örnek Program 1 : Bir grup verinin bellekte başka bir yere kopyalanması [0020] no.lu bellek alanından itibaren 5 baytlık veri grubunu, [0040] no.lu adresten başlamak üzere başka bir bellek alanına kopyalanması. Bellekte hangi verilerin olduğu önemli değildir. Programda X indisçi olarak Y de sayaç olarak kullanılmaktadır. Bundan dolayı X'e 0, Y' ye kaç adet veri kopyalanacaksa onun değeri (5) yüklenir. LDA $20,X ile bloktan ilk veri A kaydedicisine alınır. A kaydedicisindeki veri taşınacak ilk bloğa STA $40, X komutuyla yüklenir. Beş adet veriden birisi kopyalandığından X indisçisi INX komutuyla bir artırılır. Bununla birlikte Y sayacı DEY kumutu ile bir azaltılır. Bu işlemler Y=0 olana dek sürdürülür. Y'nin 0 olup olmadığına, BNE komutuyla bakılır. Her seferinde DEY bir azaltıldığından beş işlem sonucu Y=0 olur. Bu durumda Z bayrağı 1 olur. BNE komutu her defasında Z bayrağına 0 olup olmadığına baktığına göre, Z=1 olduğunda TASIN etiketine gitmeyeceğinden bir sonraki BRK komutuna geçer. Z=0 olduğunda daha kopyalama bitmedi demektir. Eğer 5 veriden daha fazla veri taşınacak veya kopyalanacaksa, Y indis kaydedicisine o kadar veri yüklenir. Program otomatik olarak Y=0 oluncaya dek işleme devam eder. 0 olduğunda işlemi sonlandırır. 4 . 1 . 2 . Kaydediciden Kaydediciye Aktarım 6502 komut kümesinde bununla ilgi altı komut bulunmaktadır. Bu komutlar imâlı adresleme türünü kullanırken bellekte tek baytlık yer kaplarlar. Komut yanında işlenene gerek yoktur. Kaydediciden kaydediciye aktarım komutları; TAX, TAY, TXA, TYA, TSX ve TXS'dir. Burada komutun ortasındaki kaydedici daima kaynak, sondaki kaydedici ise hedef olarak anılır. TXS'nin dışında diğer komutlar N ve Z bayraklarına etki ederler. TXS komutu, programcılar tarafından program başlangıcında yığın işaretçisini(SP) hazırlamada kullanılır. SP daima yığındaki bir sonra kullanılabilecek bellek alanını işaret eder. LDX
TXS
#$FF
;Yığının dibini gösterecek veriyi hazırla
;ve yığın işaretçisine aktar.
4 . 1 . 3 . Yığın Aktarımları Veri, akümülatörden yığına, yığından akümülatöre ve durum (P) bilgileri yığına, yığından tekrar duruma aktarılır. 6502 mikroişlemcisinde yığın olarak kullanılacak bellek bloğu 1. sayfadır. SP'nin MSB'lik dört biti 1. sayfayı işaret eder. Diğer LSB'lik dört bit ise, yığının 256 bellek alanından birisini göstermede kullanılır. Yığına atılan bir veri, SP'nin değerinin bir azalmasına sebep olurken yığından geri çekilen bir veriyle de SP tekrar bir artar. Yığın kullanımı iki maksatla gerçekleştirilir: • Kesmelere cevap verme ve altyordamlara dalmalarda dönüş adresinin saklanması, • Kaydedici içeriklerinin geçici olarak saklanması PHA komutu, SP'nin gösterdiği ilk yığın alanına akümülatörün kapsamını atarken, SP bir sonraki boş alanını göstermek için değerini bir azaltır. Bu işlem bir programla işlenirse: 0200
0202
0203
0205
LDA
PHA
LDA
PHA
#$A5
#$67
; A=A5H
; A'yı yığına at
; A=67H
; A'yı yığına at
Program bu şekilde devam ederken yığında geçici olarak tutulan bu veriler (A5H ve 67H), tekrar yığından PLA komutuyla çekilerek kullanılır. Yığına atılan veriler, LIFO sistemine göre son giren ilk çıkar mantığı ile son atılan 67H verisi ilk önce çekilir. PLA komutu önce SP'nin değerini bir azaltarak 01FE'ye düşürür ve buradaki 67H verisini Akümülatöre aktarır. Daha sonra ikinci bir PLA komutuyla A5H verisi yığından çekilir. PHP komutu, bayrak kaydedicisinin (P) kapsamını yığına almada kullanılır. Bir işlem yapılırken o anda başka bir ara işlem yapılması gerektiğinde, tekrar eski işlemin şartlarını bulmak için durum (bayrak) bilgileri geçici olarak yığında saklanır ve PLP komutuyla yığından çekilerek programa kalınan yerden devam edilir. 4 . 2 . Aritmetik ve Mantık Komutları Adından da anlaşılacağı gibi bu kategoriye giren komutlar, aritmetik komutlar, mantık komutları, kaydırma, komutları, artırma/azaltma komutları ve karşılaştırma komutlarıdır. Karşılaştırma komutları dalma ve sapma komultarıyla birlikte daha çok kullanıldıklarından bu bölümde yer alacaktır. 6502 mikroişlemci komut kümesinde, toplama ve çıkarma işlemlerinde kullanılan kumutlardan sadece ADC ve SBC komuttan bulunurken, diğer bazı mikroişlemcilerde (6800, 8085) ek olarak ADD ve SUB komutları vardır. Çarpma ve bölme işlemlerini yapan doğrudan bir komut olmayıp, verinin sağa veya sola kaydırılması esasına göre çalışan, ASL ve LSR komutları vardır. Mantık komutları, AND, OR, ve EXOR kapılarının işlevlerini yerine getiriler. 4 . 2 . 1 . Toplama İşlemi Sekiz adresleme modunu kullanabilen ADC komutu, işlenenin değerini, elde ile C birlikle Akümülatördeki sayıyla toplayarak yine sonucu Akumülatöre atar. Bu işlemin sembolik gösterimi şöyledir: [A] «— [A] + [M] + C Buradaki [M], ADC komutunun işlenen kısmında bulunan veriyi veya bellekle bulunan bir veriyi temsil etmektedir. Toplama işlemi, durum bayrağındaki D'nin durumuna göre, ya ikili sayı kodunda ya da BCD kodunda yapılır. Toplama ve çıkarma işlemlerinde veriler işaretli veya işaretsiz birlikte kullanılabilir. Programcı ne tip bir veri kullandığını bilmek zorundadır. ADC komutu işlenirken bir önceki işlemden bir elde varsa bu C bayrağında tutulur. Daha sonra elde komutla birlikle hesaba katılır. İki tabanlı sayılar sağdan sola doğru numaralandırılırken, en ağırlıklı bit en soldaki (MSB) ve en az ağırlıklı bit (LSB) en sağdadır. Bir baytlık bir veri işaretsiz olarak 0'dan , 255'e kadardır. İşaretli sayılarda düşük ağırlıklı bitten başlamak üzere 6 bit sayının işaretsiz sayıda olduğu gibi gerçek değerini gösterirken 7. bit, yani en soldaki MSB biti işaret biti olarak kullanılır. Eğer 7. bit 0 ise sayı pozitif, 1 ise sayı negatif demektir. İşaretli sayıların ikili ifadesi sayının gerçek değerini göstermez bunun yerine işaretli sayının gerçek değerinin ikili tamamlayanı alınır. Bu durumda anlamsız ikili sayısal değerler çıkabilir. İşaretli sayılarda 8 haneli ikili tamamlamalı formda gösterilen +127 en büyük sayı iken, ikili tamamlamalı formda en büyük negatif sayı ‐128'dir. Bu sebeple, bu sayı sistemiyle +127 ile ‐128 arasındaki gerçek tam sayılar ve isaretli sayılar 8‐bitlik bir alanda gösterilebilir. BCD kodlu aritmetik işlemlerde, her bayt 4‐bit olarak düşünülür ve her bayt, 0 ile 99 arasındaki sayıları gösterir. Mikroişlemci içindeki Aritmetik ve Mantık Birimi, toplama ve çıkarma işlemleri sırasında ikili ekleyici veya ondalık ekleyici gibi çalışır. İkili ekleyici olarak çalışma sırasında ALU, 8‐bitlik 00000000B ile 11111111B arasındaki değerlerle işlerken, ondalık eklemede iki 4‐bitlik BCD modunda paketlenmiş hanelerle işler. Toplama işlemine bir örnek verilirse: CLC
LDA
ADC
#$25
$40
; C=0
; [A]=25H
; [A] «— [A] + [0040] + C
Program satır satır ele alınacak olursa, ilk satırda CLC ile bir önceki programdan kalan ve şu anki programa etki edebilecek artıklardan kurtulmak için C bayrağı silinir. Sonra A'ya 25H verisi yüklenir. Sonraki adımda A'daki veri. [0040] no' lu adresteki veri ve C (elde‐0) hesaba katılarak (bu üç veri toplanarak) sonuç yine A'ya atılıyor. Örnek Program 2: Bellekteki bir dizi sayının toplanması Bellekte sıralı beş adet sayısal değerin toplanması ve sonucun başka bir bellek alanına atılması işleminin gerçekleştirilmesi. Bellekteki tanımlı ilk alanda [0020] dizinin uzunluk değeri olduğu ve eldenin (C) göz önüne alınmayacağı varsayılmıştır. Akümülatör (A) ve indis kaydedicilerinden birisi (X) başlangıçta sıfırlanır. LDA #00 ile A=0'lanır ve sonra TAX ile A'daki değer X'e kopyalanır. Bu durumda A=X=0 olur. [0203] adresindeki CLC komutuyla daha önceki işlemlerden C arındırılır (C=0). ADC $20,X komutu, A=A+[0021]+C işlemini yerine getirdiğinden, başlangıçta A=C=0 olduğundan sadece [0021] no.lu adresteki veri A'ya toplanır. Daha sonra INX ile indisçi bir artırılır ve [0020] no.lu adresteki sayaç bilgisi ile karşılaştırılır(CMP $20). Eğer X' in değeri sayaç bilgisine eşit değilse toplama işlemine devam etmek için TOPLA etiketine sapılır. Eşitse bir sonraki satıra geçilerek A'da biriktirilen değer STA $40 komutuyla [0040] no.lu adrese saklanır. 4 . 2 . 2 . Çıkarma İşlemi Çıkarma komutu SBC ile, A'daki değerden bellek alanı ve eldeki değer çıkarılır. Sonuç yine Akümülatörde kalır. Borç, elde bayrağının terslenmiş hali olarak düşünülür. Bu işlemin sembolik gösterimi şöyledir; A = A ‐ M ‐ C Çıkarma işlemi, toplamada olduğu gibi, hem ikili sayılarla hem de BCD modunda yapılabilir. Burada c = (1 ‐ C), çok baytlı çıkarma işlemlerinde kullanılır. C'nin 0 olması sonuca etki etmez. Çünkü C= 1 ise, tersi 0 olacaktır. Çıkarma işleminden önce SEC komutuyla C'nın 1'lenmesi sağlanır. İkili çıkarma işleminde ikili tamamlama işlemi kullanılır. Bu işlem bir örnekle açıklanırsa: SBC $40 ; A 'dan [0040] bellek alanı + C 'yi çıkar. A=23H, [0040]=B1H ve C=0 ise, A=A‐[0040]‐(1‐C) olarak daha sonra da, [A]=[A]‐(M+C) olarak düzenlenebilir. Burudan veriler yerine konularak sonuç kolayca bulunabilir ve A=23H‐B1H‐(1‐0)=23H‐
(B2H+1)=23H‐B2H olarak yazılabilir. A'daki gerçek sonuç, B2H'nin ikili tamamlaması alınıp ve [A]'daki değerle toplanarak bulunur.Ondalık modda çıkarma programı yazılacak olursa: SED
SEC
LDA #$57
SBC $40
STA $41
;Ondalık mod bayrağını
1'leyerek BCD'ye ayarlar
;C bayrağını etki etmeyecek
şekilde ayarla
;A <---- 57H
;A= A - [0040] - C
;[A] ----> [0041]
Programın başlangıç kısmında ondalık mod bayrağı D, BCD moduna ve Elde bayrağı C = 1 ayarlandı. Daha sonra A'ya yüklenen 57 sayısı ile [0040] adresindeki değerin ikili tamamlaması alınarak toplandı. Sonuç [0041] adresine atıldı. Burada dikkat edilmesi gereken önemli bir hususta (V) taşma bayrağıdır. Bu bayrak genelde işaretli sayılarla yapılan işlemler sonucunda etkilenir. V bayrağı sadece işlem sonunda akümülatördeki sonuç geçersizse aktif olur yani 1'lenir. Aynı şekilde V bayrağı, eğer sonuç +127'den fazlaysa veya ‐128'den daha negatifse 1 olur. Aksi takdirde V taşma bayrağı etki görmez. Taşma bayrağı tek baytlık CLV komutu ile temizlenebilir. Ayrıca bu bayraklar ADC ve SBC komutlarından önce otomatik olarak resetlenmiş olmalıdır. 4 . 2 . 3 . Mantık Komutları Bu gruba giren komutlar, akumülatördeki değerle bellekteki değer bit‐bit mantık işlemine tabii tutulduktan sonra sonuç akumülatörde kalır. Mantık işlemleriyle ilgili 6502 mikroişlemci komut kümesinde üç komut vardır. Bunlar: AND, ORA ve EOR'dur. Bit‐bit yapılan bu işlemlere bir örnek verilecek olursa: b7
1
0
0
1
1
b6
0
1
0
1
1
b5
0
0
0
0
0
b4
1
1
1
1
0
b3
0
1
0
1
1
b2
0
0
0
0
0
b1
1
1
1
1
0
b0
1
0
0
1
1
; A'daki değer
; İşlenen değer
; AND sonucu
; ORA sonucu
; EOR sonucu
Tablo - Mantık komut örnekleri
Bütün bu işlemler N (Negatif) ve Z (Sıfır) bayrağına etki ederken, sonuç Akümülatörde kalır. AND komutu, diğer bitlere etki etmeden istenen bitin maskelenmesinde kullanılır. Programcı bellekteki bir değerin hangisini temizleyecekse ona göre A'ya değer atmalıdır. Bu maskeleme tekniği, sık olarak veri sözcüğünün istenen bitlerinin izolâsyonunda kullanılır. ORA komutu AND'in tersine istenen belirli bitlen setlemede (1) kullanılırken EOR komutu, diğer bitlere etki etmeden belirli bitleri terslemede kullanılır. Şimdi bütün bu komutlar bir program parçası dahilinde incelenirse: LDA
AND
ORA
EOR
STA
BRK
#%00111011
#%11101111
#%10101010
#%11111111
$41
; orijinal veriyi A'ya yükle
; sonuç: 00101011 olur.
; sonuç: 10101011 olur.
; sonuç: 01010100 olur.
; A----> [0041]=01010100
Programda A'ya 00111011B verisi yüklenerek, 11101111B verisiyle bit‐bit mantıksal olarak çarpılır. Bu işlemdeki maksat, 4. biti maskelemektir. Burada 0 yutucu bir eleman olarak 4. biti sıfırlar. Daha sonra A'daki bu değer ORA vasıtasıyla, 10101010B ile bit‐bit mantıksal olarak toplanır. Daha sonra ORA komutunun sonucu A'ya alındıktan sonra A'daki veri 11111111B verisi ile EXOR işlemine tabii tutulur. A'daki değerle işlenen değerdeki karşılıklı haneler birbirinden farklıysa, sonuç olarak o hanedeki değer 1 olur, aynıysa o hane sonucu 0 olur. Daha sonra gerçek sonuç [0041] no'lu adrese atılır. Örnek Program 3 : Bir baytlık bir verinin iki parçaya ayrılması [0030] adresindeki bir verinin iki parçaya bölünerek LSB kısmının [0031] adresine ve MSB kısmının [0032] adresine atılması işleminin gerçekleştirilmesi. Bir baytlık verinin küçük değerlikli tarafı (LSB) [0031] adresine, büyük değerlikli tarafı (MSB) [0032] adresine yerleştirilmek istenmektedir. Bu durumda parçalanacak veri akümülatöre alınarak AND komutuyla MSB tarafı sıfırlanır ve aynen kalan LSB tarafıyla birlikle [0031] adresine atılır. Daha sonra MSB tarafındaki 4‐bit LSB tarafına çekilmesi için 4 defa sağa kaydırılır. Böylece orijinal verinin MSB tarafı LSB'ye kaydırılırken MSB tarafı (4‐bit) sıfırlanır, Akümülatördeki bu değer [0032] adresine atılır. Bu durumda, eğer [0030] adresindeki orijinal verinin AB olduğu düşünülürse, işlem sonunda [0031] adresinde 0B, [0032] adresinde 0A değeri olacaktır. 4 . 3 . Kaydırma ve Döndürme Komutları 6502' de direkt çarpma ve bölme komutları yoktur. Bunların yerine kaydırma kamutları kullanılır. ASL, LSR kumutlarından ASL ile veri sola kaydırılır. Her bir sola kaydırma verinin ikiyle çarpılması demektir. Tekrar bir bit sola daha kaydırılmasıyla değer dörtle çarpılmış olur. LSR komutu kullanılarak değer sağa kaydırılır. Her bir kaydırma ile veri ikiye bölünür. Üst üste kaydırma devamlı ikiye bölünmeyi sağlar. ASL komutuyla işlenen bir defa sola kaydırılırken D7, C bayrağına düşer. D0'ın yerine otomatik olarak 0 gelir. Eğer C'de daha önce bir bit varsa o da kaybolur. LSR komutuyla akümülatördeki değer bir bit sağa kaydırılırken değer, ikiye bölünmüş olur. D0 biti C bayrağına düşerken, boşalan D7 bitinin yerine otomatik olarak 0 yerleşir. ASL ve LSR komutlarıyla veriler sağa veya sola doğru kaydırılırsa, sekiz kaydırma sonunda Akumülatörün içi tamamen sıfırlarla dolarak, verinin gerçek değeri kaybolur. Eğer gerçek değeri kaybolmadan verinin üzerinde işlem yapılmak isleniyorsa, ROL ve ROR gibi döndürme komutları kullanılır. ROL komutuyla işlenen veri sola bir hane kaydırılırken, D7'deki 7. hanedeki bit C'ye düşer. C'deki daha önceki bit DO hanesine yönlenir. İşlem böylece C üzerinden hiçbir veri kaybı olmadan devam eder.Dokuz kaydırma sonunda işlenen veri tekrar aynı değeri alır.
Şekil ‐ Sola ve sağa döndürme komutlarının işlevleri ROR komutuyla işlenenin 0. hanesi C'ye kayarken, boşalan 7. haneye C'deki bit gelir. ROL veya ROR komutu işlenen verideki bitlerin kontrolünde kullanılır. Kaydırma ve döndürme komutları elde, negatif ve sıfır bayraklarına etki eder. C bayrağı bütün bu komutlarla etkilenirken, kaydırma işleminden sonra 7. hanenin durumuna göre N bayrağı etkilenir. LSR komutuyla N bayrağı daima 0 olur. Kaydırma komutlarından sonra kaydedicinin içi tamamen 00000000 olduğunda Z bayrağı 1, aksi halde 0 olur. Kaydırma işlemlerinde işlenen kaydedici veya bellek olabilir. Eğer işlenen bellek ise, kaydırma işlemi adresleme moduna bağlı olarak yedi saat saykılı çeker. Örnek Program 4: Bellekteki bir verinin kaydediciler kullanılmadan başka bir bellek bölgesi ile değiş‐
tokuş yapılması. [0020] adresindeki A5 verisinin [0040] adresindeki 00 verisi ile yer değiştirilmesinin gerçekleşirilmesi. İşlem sonunda [0020] adresindeki veri 00, [0040] adresindeki veri A5 olacaktır. Bu program için kaydırma veya döndürme komutlarından faydalanılır. Bu işlemler için ROL komutları ve C bayrağından faydalanılır. Bir baytlık bir bellek alanındaki verinin yer değiştirmesi döndürme komutlarıyla yapılır. Kaydırma komutlarıyla veri sadece C yardımıyla başka bir yere kopyalanabilir. Bundan dolayı şekildeki programda esas rolü ROL veya ROR komutları almaktadır. Bellekteki yerinde veri ROL $20 komutuyla bir sola gönderilir. Verinin MSB biti C'ye geçer ve C'deki değer [0020] no.lu adresinin LSB biti olarak yerleşir. Bu adresteki MSB biti, tekrar bir ROL $40 komutuyla [0040] no.lu adresin LSB bitine yerleşir. Aynı anda bu adresteki verinin MSB biti de C' ye geçer. Yani [0020] adresindeki verinin (A5) MSB biti (1) C vasıtasıyla [0040] adresinin LSB'sine yerleşir. Aynı anda [0040] adresindeki MSB biti C'ye geçtiğinden bir sonraki ROL $20 komutuyla [0020] adresinin LSB biti olarak yerleşir. Bu işlem ardışık olarak 8 defa tekrarlandığında [0020] adresindeki verinin tamamı bit bit [0040] adresine geçirilmiş olur. 4 . 4 . Artırma ve Azaltma Komutları Bu komut grupları, X ve Y kaydedicilerinin içeriğini veya bir bellek alanının içeriğini bir artırır veya azaltır. Genel amaçlı X ve Y kaydedicileri, program içerisinde sayaç veya indis olarak kullanıldıklarından, programa göre değerleri zamanla artmak veya azalmak zorundadır. Bu komutlar şunlardır: INX
INY
DEX
DEY
;X=X+1
;Y=Y+1
;X=X-1
;Y=Y-1
İmalı adresleme modunu kullanan bu komutlar bellekte bir baytlık yer kaplar ve iki saykıllık zaman harcarlar. Artırma veya azaltma yapıldıktan sonra 7. bitin değeri negatif ise N bayrağı 1, aksi halde 0 olur. Komutlar işlendiğinde kaydedici içi tamamen sıfırsa Z bayrağı 1. aksi halde 0 olur. Bu komutlara programla bir örnek verilirse: Bellekte [0020] adresinden başlayan 5 adet veri, [0080]'den başlayan başka bir bellek alanına atılmak istenmektedir. Buna göre program yazılırsa: TASI
LDX
LDY
LDA
STA
INX
DEY
BNE
BRK
#00
#05
$20,X
$80,X
TASI
; X <— 0, indis=0
; Y <— 5, sayaç=5
; ilk bloktan veriyi al
; ikinci bloğa at
; [X] = [X] + 1
; sayaç = sayaç - 1
;sayaç eşitdeğil 0 ise TASI'ya git
Programın başında X'e yüklenen 0 bir indis olarak, Y'ye yüklenen veri ise kopyalanacak verinin kaç adet olduğunu tutan bir sayaç olarak hazırlandı. LDA $20,X komutuyla kaynak bölgeden ilk veri alınarak, STA $80,X komutuyla hedef bölgeye aktarılmaktadır. İlk verinin taşınmasından sonra geriye dört veri kaldığından INX ile indis bir artırılırken, DEY ile sayaç bir azaltılmaktadır. Böylece X=1, Y=4 olur. Taşımanın tamamlanıp tamamlanmadığına RNE komutuyla bakılarak, eğer Y eşitdeğil 0 ise TASI etiketinin bulunduğu adrese geri dönülüp işleme devam edilir. Şayet Y =0 ise işlem tamamlanmış demektir. X ve Y kaydedicilerinin haricinde üçüncü bir artırma ve azaltmayla ilgili eleman gerekliğinde başka bir kaydedici bulunmadığından bellek kullanılır. Bu işlemlerle ilgili komutlar, JNC ve DEC komutlardır. 4. 5 . Giriş ve Çıkış Komutları Daha öncede belirtildiği gibi, 6502 mikroişlemcisinde ayrıca giriş/çıkış işlemlerini gerçekleştiren komut veya komutlar yoktur. Bunun yerine işkodu olarak LDA ve STA komutu, işlenen yerinede G/Ç elemanlarının kullandığı adresler yazılarak programlama yapılır. Eğer paralel giriş/çıkış elemanı olan PLA'nın giriş veri kaydedicisinin kullandığı adres [4000], çıkış veri kaydedicisinin adresi de [4001] ise, LDA $4000 İşlem komutları STA $4001 olarak veriler girişten alınarak işlendikten sonra tekrar çıkışa verilebilir. 4 . 6 . Kontrol Komutları Bu konuda herhangi bir yerde seyreden programın bir şart dahilinde başka bir program parçasına saptırılarak, başka bir işlem gerçekleştirmesi söz konusudur. Programın gidişatını başka bir yere saptıran komutlar, 6502 mikroişlemcisinde iki tanedir. Bunlardan birisi şartsız dalma komutu JMP, diğeri ise birkaç çeşidi olan sartlı dalma komutlarıdır. 4 . 6 . 1 . Şartsız Dalma Komutu Kayıtsız şartsız herhangi bir adrese dalma işlemini JMP komutu gerçekleştirir. Eğer bu komutunun devamındaki komut veya komutlar işlenmeyecekse bu komut kullanılır. JMP komutu, mutlak adresleme veya dolaylı adresleme modunu kullanır. İşlenen olarak ya bir etiket ya da adres kullanır. JMP komutuna bir örnek verilecek olursa: 0200
0202
0205
0206
0207
ARA
YENI
LDA
JMP
INX
DEY
BNE
$20,X
YENI
ARA
Program sırasında INX komutunu aşacak bir atlatma gerekir. Bunu da JMP komutu gerçekleştirir ve program lNX'i görmeden DEY komutuna dalarak işleme devam eder. Programda JMP komutu etiketi olan YENI'nin yerine karşılık düşen [0206] adresi yazılabilirdi. JMP komutu işleneniyle birlikte bellekle üç baytlık yer tutarken, mutlak adres kullandığında üç saykıl, dolaylı adresleme kullandığında beş saykıl çeker. 4 . 6 . 2 . Şartlı Dalma Komutları Şartlı dalmada mikroişlemci, gerekli sart sağlandığında programın belirlenen hedefe sapmasını sağlar. Şartlı dalma komutlarını, dalma komutundan ayırt edebilmek için sapma denildi. Eğer şart sağlanmamışsa, program bir sonraki komuttan işlemeye devam eder. Şartlı dalma komutları aşağıdaki sıra ile çalışırlar; • CPU İşlem kodunu alıp getirerek durumun ne olduğunu kontrol eder. • CPU koşulan şarta bakar. Bu şartlar şunlardır: a) sonuç negatif mi? (BMI) b) sonuç sıfıra eşit mi? (BEQ) c) C bayrağı 1 mi? (BCS) • Eğer koşulan şart gerçekleşmişse, program sayıcının kapsamı yeni adresle yüklenir. • Eğer koşulan şartla karşılaşılmazsa, CPU sıradaki komutu işlemeye koyulur. JMP komutu kontrolü bellekte mutlak bir adrese aktarırken, sapma komutları kontrolü, komut işlendikten sonra bir sonraki komutun bulunduğu yerden ileri veya gerideki belirli bir bellek alanına aktarır. Dalma komutu ile sapma komutu arasındaki diğer bir fark , sapma komutu karar verme komutlarıdır. Sapma şartları mikroişlemci durum bayraklarından C (elde), Z (sıfır), N (negatif veya işaret) ve V (aritmetik taşma) bayraklarına göregerçekleşir. . Şartlı dalma komutlarında adresleme modlarından sadece göreceli adresleme türü kullanılmaktadır. Bu komutlarda işkodunu takiben işlenende ofset baytları gelir. İşaretli sayılara sahip bu ofset baytları, sapma komutunun ortaya çıkmasıyla yeni adresin bulunması için PC'ye eklenir. 0200
0201
0202
0203
0204
0205
0206
0207
A5
80
F0
14
85
80
A5
40
LDA
$80
BEQ
$0218
STA
$80
LDA
$40
Yukarıdaki programda A'ya [0080] no'lu adresten bir veri yükleniyor. Bir sonraki komutla (REQ) bu verinin sıfır olup olmadığına bakılıyor. Eğer sıfırsa (Z=1), program hir sonraki komut adresinden itibaren 14 bayt ileri gidiyor. Bu 14 bayt Program Sayıcıya eklenerek yeni adres bulunuyor. Eğer yüklenen veri sıfır değilse (Z=0), şart yerine getirilmediği için program bir sonraki komutla işine devam ediyor. O andaki [PC] adresi
[0204]
Ofset
0014
+__________________
[0218]
Yeni [PC] adresi
O andaki PC'nın adresi demek, BEQ komutundan sonra gelen STA komut kodununn adresidir. Çünkü, program alanındaki bir komut işlenirken Program Sayıcı sonraki komut kodunun adresini gösterir. Ofset Alanının Hesabı Ofset, sapılacak adresin bulunmasında program sayıcısına eklenen bayt sayısı olarak ikilik sayılardan meydana gelmektedir. Bu ikilik sayıların MSB biti 0 olduğunda ofset pozitif, 1 olduğunda ofset negatif olmaktadır. 8‐bitlik pozitif sayılar 00000000B ile 011111111B arasında olup, 00 ile 7FH=127D arasındadır. Pozitif ofset değeri PC'ye eklendiğinde sapılacak yeni adres, 00 ile 127D arasında ileride herhangi bir yerde, yani büyüyen adres tarafında olabilirken, negatif ofset değeri ‐128D geride, yani küçülen adres tarafında herhangi bir yerde olabilir. Bu alanın dışındaki adreslere sapma ve JMP komut birleşimleri ile ulaşılabilir. İleri Ofset Hesaplaması : Program sayıcının dalacağı adres değeri, o anda bulunduğu adres değerinden büyükse ileri ofset adresi, program sayıcısının dalacağı adres değerinden o anda bulunduğu adres değeri çıkarılarak bulunur. Bu değer 0 ile +127D (7FH)arasında ise işlenen sonuç bulunmuş olur. Eğer ofset değer bu alan içerisinde değilse, işlemcinin erişemediği bir yer olduğundan alan dışı mesajı görülecektir. Geri Ofset Hesaplaması : Program sayıcısı bulunduğu yerden geriye dalacaksa önce, o anda PC'de bulunan adresten sapılacak olan adres çıkarılır. Yeni oluşan adresin MSB hanelerinde oluşan FF'ler göz önüne alınmaz. Sonra LSB hanelerindeki değerin 2'li tamamlaması alınır. Eğer çıkan sonuç, ‐
128D'den daha az, veya eşit ise, sapma yeni adrese yapılır. Değilse, yeni adres alan dışındadır. 0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
020A
A2
00
b5
22
95
40
E8
E4
20
D0
??
LDX $00
TUR LDA $22,X
STA $40,X
INX
CPX $20
BNE TUR
; ofset (F7)
Program, bellekteki bir dizi veriyi sırasıyla alarak başka bir alana atmaktadır.Her defasında yeni bir verinin kopyalanması için programın geri dönmesi gereklidir. Bu geri dönüş açıklanırsa: Mikroişlemci BNE şartlı dalma komutunu işlerken, Program Sayıcısı [020B] adresini gösterir. Burada TUR etiketi, BNE'ce ileri sürülen şart gerçekleştiği takdirde sapıtacak adresin adıdır. Eğer. Z=0 değilse DON'e sap şartıyla [0202] adresi tarif edilmektedir. Bu iki adresin arasındaki fark ofset olarak değerlendirilmektedir. PC'nin o anki adresi olan [020B]'den geri sapılacak adres çıkarılır. Sonuçtaki yüksek değerlikli iki hane (MSB) ihmal edilir. Geriye kalan 09 verisinin 2'li tamamlaması alınır. Geri ofset sapma değerini gösteren F7H verisi, BNE komut kodundan sonra gelen alana yerleştirilerek program tamamlanır. Yukarıda adı geçen bütün sartlı dalma yani sapma komutları bellekle iki baytlık yer kaplarlar. ilk bayt komut kodunu (iş‐kodu) tutarken ikinci bayt göreceli ofset baytıdır. Eğer bu komutlar işlendiğinde koşulan şart sağlanmazsa, iki saat saykılı çeker şart sağlanırsa üç saykıl çeker. Sapılacak adresler sayfa sınırlarını taşarsa bir saykıl daha eklenmelidir. Örnek Program 5: Bellekle bulunan bir grup veri içerisinden negatif ve pozitif sayıların adetinin bulunması. [0020] adresinden başlamak ürere bellekte bir dizi veri içerisinden negatif ve pozitif sayıların ayrıştırılarak, negatiflerin [0040], pozitiflerin [0041] no.lu adrese atılmasının gerçekleştirilmesi. Verilerin sayısı başlangıç adresindedir. Programın ilk üç satırında negatif ve pozitif sayıların adet değerlerinin koyulacağı adresler temizlenmektedir. Veri bloğunun ilk adresindeki sayaç değeri X'e alındıktan sonra LDA $20,X üç ilk veri akümülatöre yüklenir. LDA komutu, N ve Z bayrağına etki eder. BPI, ile N bayrağı test edilir ve eğer A'daki değerin MSB biti 0 ise POZI etiketine dalınır. Eğer 1 ise, bit sonraki satıra geçilir. İlk değerin negatif olduğu farzedilirse, N=1 olacaktır. Bu durumda BPL POZI kumut satırı dallanmayacaktır. Bir sonraki satırdaki INC $40 komutu negatif değer için elde var bir diyerek [0040] adresinin içeriğini 1 artıracaktır. Daha sonra JMP YENİ komutuyla pozitif işlem komutları atlatılarak yeni veri akümülatöre alınır. Bu defa verinin pozitif olduğu düşünülürse, bu durumda BPL POZI komut satırı dallanacaktır.Çünkü N=0'dır. Program POZI etiketine daldığından bu defa INC $41 komutu pozitif değer için elde var bir diyerek [0041] adresinin içeriğini 1 artıracaktır. Her bir işlemde X sayacı bir azaltılarak veriler tek tek elden geçirilir. Sonuçta [0040| ve [0041] adresinde tüm veriler negatif ve pozitif olarak ayrışmış olacaktır. 4 . 7 . Karşılaştırma Komutları Karşılaştırma komutları, hemen hemen bir çok şartlı dalma komutları öncesi kullanılan önemli komutlardandır. Bu komut aslında bir çıkarma komutudur. Sonuç ne akümulatöre ne de belleğe etki etmez. Sadece komutun işlenmesi halinde bayraklarda değişiklik meydana gelir ve işlem bu değişimlere göre yapılır. 6502 mikroişlemcisinde üç adet karşılaştırma komutu vardır: CMP [M]
CPX [M]
CPY [M]
; A'nın içindeki değerden bellek içi [M] değerini çıkar
; X'in içindeki değerden bellek içi [M] değerini çıkar
; Y'in içindeki değerden bellek içi [M] değerini çıkar
Bu komutların tümü de durum bayraklarından N, Z ve C bayraklarına etki ederken, adresleme modlarından sekiz tanesini kullanabilir. Bu komutların etkilediği üç bayrak kombinasyonu, kaydedici kapsamının bellek veya veri tanımlı işlenenden daha büyük, birbirine eşit ve daha küçük olma ihtimalini doğurur. Karşılaştırma komutlarına ömek olarak üç yönlü karar programı verilebilir. BU-ES5 BNE
BUY5
TAMAM BRK
LDA
CMP
BCS
STA
JMP
BUY5
STA
JMP
STA
#$XX
#$05
BU-ES5
$40
TAMAM
$50
TAMAM
$60
; A, 5'den daha küçük
; A , 5'e eşit
; A, 5'den büyük
Bu program akümülatörün kapsamını (XX), tuttuğu değere göre [40], [50] ve [60] no'lu adreslere atar. Üç‐yön, akümülatörün kapsamı beşten küçük, beşe eşit veya beşten büyük olabilir. 4 . 8 . BİT Test Komutu BİT komutu, bellekteki veri bitlerinin testinin veya bir giriş cihazından verinin işlemcideki kaydedicilere yüklenmeden teetini sağlar. BİT komutunun işlenmesi halinde üç işlem gerçekleşir: • Veri kelimesi akümülatörün kapsamıyla mantıksal olarak AND'lenirken sonuç akümülatöre konmaz. • Sonuç N ve V bayraklarına doğrudan etki etmez. • Eğer AND işleminden sıfır sonuç elde edilirse Z bayrağı 1 olur, aksi halde sıfırda kalır. BIT kumutu sadece mutlak adresleme ve sıfırıncı sayfa adreslemesini kullanır. Mutlak adreslemede komut üç bayt alırken, dört saat saykılı çeker. Sıfırıncı sayfa adreslemesinde iki bayt alırken üç saykıl çeker. BIT komutu aslında AND komutuyla yapılan işlemle aynı işlevi yerine getirmekte, fakat işlem sonucu akümülatörde kalmamaktadır. AND komutu durum bayraklarından N ve Z bayraklarına etki ederken bunlardan her ikisi de AND işlemi sonucuna yansır. BİT komutu N, V ve Z bayraklarına etki ederken bunlardan sadece Z bayrağı BIT işlemi sonucuna yansımaktadır. Bu komutla akümülatöre yüklenen veri test edilir. Test işleminde bitlerden birisinin 0 olup olmadığına bakılır. Diğer bitler gözönüne alınmaz. BİT komutu bir örnekle açıklanırsa: BAK
ISLE
LDA
BIT
BNE
-
#%00000100
$4004
BAK
-
; 2. bitin dışındakiler maskelenecek
; 2. bit sıfır mı?
; Hayır, öyleyse ara
; Evet, devam et
Program [4004] adresinden alınan verinin 2. bitinin 0 olup olmadığına bakmaktadır. Eğer sonuç 0 ise program ISLE yordamına gider, sonuç 0 değilse 2 bit sıfır olana dek 4004 adresine alınan veri test edilir. 2. bitin 1 olup olmadığı ise, BNE ARA yerine BEQ ARA komutu kullanılarak mantıksal olarak kolayca test edilebilir. BAK
ISLE
LDA
BIT
BEQ
BVC
BMI
-
#%00000010
$4004
ISLE
ISLE
BAK
; 2. maskeleme biti
; 2. bit sıfır mı?
; Evet 2. Bit 0
; 6. bit 0
; 7. bit 1 öyleyse 0 ara
Eğer akümülatördeki maskeleme bitleri ile test edilecek bellek bitleri mantıksal 0 iseler Z bayrağı 1 olur. Aksi halde bellekteki bitlerden biri veya ikisi 1 ise, Z bayrağı 0 olacaktır. Çoklu bit testinde 0. bit ile 5. bitlerden biri BIT komutuyla test edilirken diğer 6. ve 7. bitler AND komutundan bağımsız olarak test edilebilir. BIT testi komutuyla bellekte işlenen bitlerin yanı sıra 6. ve 7. bitlerin kontrolü çok önemlidir. 6502 mikroişlemcisinde kesme talebi genellikle PIA vasıtasıyla 6. ve 7. bitle gelmektedir. Böylece kesme talebi devamlı yoklanarak bir talebin olup olmadığı test edilir. 4 . 9 . İşlem Yok Komutu NOP (No OPeration‐işlem yok) komutu, program geliştirilmesi sırasında ileride araya sıkıştırılacak komutların yerine boşluk oluşturmak amacıyla kullanılan tek baytlık bir komuttur. Bu komut, hiçbir bayrağa etki etmez. Diğer bir görevide zaman gecikmelerinde iki saykıllık zaman geciktirici komut olarak çalışır. Örnek Program 6 : Sırasız bir dizi veri içerisinden en küçük değerlikli olanının bulunmasıdır. Veri dizisi bellekte [0040] no.lu adresten itibaren yerleşmiş olup, dizinin uzunluk bilgisi ilk adrestedir. En küçük değerlikli sayı dizinin sonuna depolanacaktır. Dizideki verilerin tamamı işaretsiz sayılardan oluşmakladır. Programda minimum değer, ya dizideki ilk veriyle diğerleri karşılaştırılarak bulunur, ya da bir kaydediciye 0 değeri orijin olarak alınarak bununla diğer sayılar karşılaştırılarak bulunur. Şekildeki programın başlangıcında X'e dizi uzunluğu, A'ya sözü edilen FF orijin değer atılmaktadır. Daha sonra bu orijin değeri ile diğer sayılar karşılaştırılarak (CMP $40,X) ve ardından BCC ile sorgulanarak devam edilir. BCC KAL satırı, C bayrağına bakarak, eğer C=0 ise A<[M] eğer C=1 ise A>=[M] yönünü belirler. Eğer bellekteki değer A'dakinden küçük ise (C=1) program LDA $40,X değerini işletecektir. Aksi halde program KAL etiketine saparak sıradaki veriyi test edecektir. Örnek Program 7 : Bir grup veri içerisinde mantıksal 0'ların toplam sayısının bulunması. Bellekte bulunan bir dizi veri içerisinde ne kadar mantıksal 0 olduğuna bakılarak toplam sayısının bulunması ve sonucun [0080] adresine atılmasının gerçekleştirilmesi. Programda veri dizisi içerisindeki mantıksal 0'ların sayısal toplamının bulunması için önce bir indis kaydedicisini sayaç olarak diğerini indisçi olarak kurulması gereklidir. Burada X sayaç olarak, Y indisçi olarak kurulmuşlur. Y'nin içersindeki değer, ele alınan verinin 8. bitini tek tek saymak için, X'in içerindeki değer kaç tane veri alınacağını göstermekledir. LDA $04,X ile bellekten ilk veri alınarak sola kaydırılır ve tek tek N bayrağına BMI BIR ile bakılarak negatifliği sorgulanır. Eğer N=1 ise bir sonraki bite bakmak için yatay indisçi azaltılır. Eğer N=0 ise (pozitif) BIR etiketine sapma olmadan sıradaki INC $80 komutu çalıştırılarak mantıksal 0 bulunduğuna dair artırma yapılır. DEY komutu ile yatay indisçi azaltılır ve eldeki verinin bitleri tek tek denetlenir. Her bir verinin işi bitince, yani yatay tarama bitince dikey taramaya geçilir(YENİ). Böylece [003F] adresindeki sayaç bilgisine göre, ana işlem 8* 10=80 defa tekrarlanacak demektir. Örnek Program 8: Bellekteki bir grup verinin MSB ve LSB bitlerinin mantıksal 1 olanlarının toplam sayısının bulunması. [0020] adresinden başlamak üzere bir grup veri içerisinden MSB ve LSB bitlerinin her ikisi de mantıksal 1 olanlarının kaydırma veya döndürme komutlarının kullanılarak bulunmasını gerçekleştirmek. Program, [0020]no.lu adresten başlamak üzere bellekle 5 adet verinin MSB ve LSB bitlerinin her ikisinin mantıksal 1 olup olmadığına bakar. Bunun ne güzel yolu, kaydırma veya döndürme komutları kullanarak bellekteri alınan verinin bir sola ve birde sağa kaydırılarak ve de N veya C bayraklarına bakılarak kolayca bulunabilir. Programlarda sayaçların yüklenmesinde iki yöntem uygulanabilmektedir. Birincisi, indisçi sayaçlara 00 yüklendiğinde taban adres veri bloğunun başından başlar. Meselâ, eğer veri bloğunun başlangıç adresi [0020] ise, kullanılacak komut grubu; LDX #00 ve LDA $20,X olacaktır. Bu tip işleme bellekte önden arkaya doğru veya soldan sağa doğru işlem denir. İşlem sonrası her defasında X bir azaltılır. İkincisinde, indisçi sayaçlara bir değer yüklendiğinde, taban adres bir geriye çekilir. Eğer çekilmezce hedef adres bir aşılacaktır. Meselâ, Y indisçisi 05 verisi ile yüklensin, bu durumda komut grubu; LDY $05 ve LDA $1F,X olacaktır.[0020] adresinden başlamak üzere veri grubu [0024] adresine kadardır. Bu durumda [0020] taban adresine 05 sayaç verisi eklenirse etkin adres [0025] olacaktır ve son adresimiz olan [0024] asılmış olacaktır ve bundan dolayı [0020| adresindeki veri devre dışı kalacaktır. Bu işleme, bellekte arkadan öne veya sağdan sola işlem denir. Örnek Program 9: Bellekteki sırasız bir listeden en büyük ve en küçük elemanların bulunması. Bellekte bulunan sırasız bir dizi sayı içerisinden maksimum ve minimum sayıların bulunarak, küçüğün [0042], büyüğün [0043] adreslerine depolanmasının gerçekleştirilmesi. Listenin başlangıç adresi [0020] ve [0021] adresinde saklanmış olup listenin uzunluğu dizinin ilk adresindedir. Programda sırasız listenin başlangıç adresi, [0020] düşük adres baytını, [0021] yüksek adres baytını göstermektedir. Akış diyagramındaki ilk altı işlem kutucuğu programın kurulum kısmını ifade etmektedir. Buradaki X liste uzunluğunu ve Y adres indis kaydedicileri olarak tanımlanmaktadır. Daha sonra ilk veri alınarak hem büyük ve hem de küçük olarak hedef adreslere yerleştirilir. Son safhada sıradaki veri listeden alınarak hedef adresteki her iki veri ile karşılaştırılır. Eğer alınan değer [0042] adresindeki elemandan küçükse bu yeni değer bu adrese konulur. Eğer büyük ise, [0043] adresindeki ile karşılaştırılır ve büyükse, bu eleman hedef adrese atılır, işlem sayaç bilgisi bilene dek sürer. Sonunda minimum eleman değeri [0042] adresinde, maksimum eleman değeri [0043] adresinde depolanmış olur. Eleman karşılaştırılmasında, eğer A'daki değer bellekteki değerden büyükse C=1, küçükse C=0 olur ve buna göre sapma yapılır. 5 . Zaman Geciktirme Altyordamları Zaman geciktirme 6502 mikroişlemcisinin bazı önemli senkronize işlemleri gerçekleştirmesinde çok önemlidir. Yine zaman geciktirme işlemi, çok hızlı bir cihazla yavaş bir cihazın hız uyuşmazlığını gidermek için de kullanılmakladır. 6502 mikroişlemcisinde zaman gecikmesi sağlayan bir tek komut vardır, NOP (No OPeration‐Çalışma yok). Bu komut bellekte bir baytlık yer tutarken 2 saykıllık bir gecikme sağlar. Fakat, bir komutun belli bir sayıdan fazla kullanılması halinde yapısal program bozuklukları ortaya çıkmaktadır. Bunun yerine bir döngü veya başka bir yaklaşımla zaman gecikmesi halledilir. Çok fazla Zaman gecikmesinin gerekli olduğu yerlerde belli oranlarda zaman gecikmesi sağlayan altyordamlar kullanılır ve gerektiğinde gerekli altyordama dalınır ve programa devam edilir. 1 MHz frekansta çalışan bir 6502 mikroişlemcisinde 2 saykıl demek 2 mikrosaniye demektir. Mikroişlemcideki her bir komutun kaç saykıl tuttuğu komut listesinde N harfi ile yazılıdır. Zaman gecikmesi için komut satırındaki bu N'ler toplanarak altyordamın toplam kaç saykıl çektiği bulunur. Komut listesindeki en fazla zaman alan komut 7 saykıl ile ASL, BRK, DEC, INC, LSR, ROL ve benzeri komutlardır, En az zaman alan komutlarsa 2'şer saykılla, BCC, CLC ve TAX gibi komutlardır. Program arasında doğrudan bir gecikme sağlamak maksadıyla yazılan en temel algoritmanın akış diyagramı yanda görülmektedir. Bu zaman gecikmede tek bir indis kaydedicisi kullanılmıştır. Basit bir zaman gecikme algoritması şöyledir: 1 . indis kaydedicilerinden birisini başlangıç değeriyle (sayaç) yükle 2 . Gecikme için komut kümesini (satırlarını) islet 3 . Sayacı bir azalt 4 . Eğer sayaç = 0 değilse 2. ve 3. adımları tekrarla 5 . Eğer sayaç sıfırsa ana programa devam et. Algoritmanın da gösterdiği gibi, sayaç bilgisinin yerleştirilmesi ile gecikmenin sonlandırılması işlemi döngüde hesaba bir defa katılırken komut satırları ve sayaç azaltımı hesaba döngü sayısı kadar katılır. Akış diyagramına göre bir gecikme programı yazılacak olursa; DON
LDX
NOP
DEX
BNE
#$40
; Sayaç bilgisi yüklendi
; 2 mikrosaniye için işlem yok
; Sayacı bir azalt
DON
; X sıfır değilse işleme devam
Program kurulumunda sayaç bilgisi olarak #$40 (64) sayısı yüklendi. Daha sonra komut satırı olarak bir 2 saykıllık NOP komutu kullanılmıştır. Sayaç bir azaltılarak her defasında sıfır olup olmadığı kontrol edilmiştir. Sıfır olmadığı durumlarda NOP, DEX ve BNE komutları tekrar işlendi. Sıfır olduğunda ana programa dönülmüştür. Gecikme zamanı aşağıdaki basit bir formülle hesaplanır. Toplam Gecikme = Td + (Sayaç * Ti)
Burada Td=döngü içerisine girmeyen kurulum ve sonlandırma komutlarının toplam çektiği zaman, Ti=döngü içerisindeki komutların çektiği toplam zamandır. Yukarıdaki en temel gecikme programının çektiği toplam zamanda 4016 sayısının ondalık karşılığı 64'dür. Döngüye LDX komutu girmediğine göre hesaba bir defa katılacaktır. Böylece, Toplam gecikme = 2 + (64 *((2 + 2 + 3)‐1)) = 2 + (64 x 6) = 2 + 384 = 386 µs'dir. 5 . 1 . İki Döngülü Zaman Geciktirme Altyordamı Altyordamın amacı, 5µs aralıklarla 26µs ile 329ms. arasında gecikme sağlamaktır. [0020] ile [0021] adreslerinde gecikme süreleri vardır. Bu adreslerdeki bir değer 26µs'lik minimum gecikme sağlar. GEC1
BEK
LDX
LDY
DEX
BNE
DEY
BNE
RTS
$20
$21
; X'i 5µs'lik sayaçla yükle
; Y'yi 1284µs'lik sayaçla
; X=X-1,sıfır mı?
BEK
BEK
; Değil, BEK'leye dön
; Evet, Y=Y-1,Sıfır mı?
; Değil, BEK'leye dön
;Evet ana programa dön
Programda X kaydedicisi 5µs'lik sayaç bilgisine sahip [0020] adresinden, Y kaydedicisi 1284µs'lik sayaç bilgisine sahip [0021] adresinden yüklenir. DEX komutunu BEK etiket noktasında işlettiğinde X sayacının değeri bir azalır. X sıfıra eriştiğinde bu defa Y sayacı bir azaltılır. Eğer 0 değilse işlemci tekrar DEX komutunun bulunduğu adresi gösteren BEK etiketine döner. Daha önce 0 olan X sayacı tekrar 255'e kurulur (FFH). Ve tekrar X sayacı 0 olana dek işlenir. BNE BEK komutu sapma görüldüğünde 3 saykıl çekerken sapma olmadığında sadece 2 saykıllık zaman alır. Altyordam döngüsüz olarak ve [0020] ve [0021] adreslerindeki değerler 1 olduğu zaman, gecikme 6 + 3 + 3 + 2 + 2 + 2 + 2 + 6 = 26 saykıldır. Programda ilk komutla [0020] adresindeki değer X kaydedicisine sayaç olarak atılır. Eğer DEX komutuyla X sıfıra ulaşmamışsa, bu komut 2µs'lik ve sonraki komut BNE'de 3µs'lik zaman alacaktır. Böylece [0020] adresindeki her sayaç artışı ilave olarak 5µs'lik bir zaman gecikmesi sağlayacaktır. [0021] adresindeki değer LDY komutuyla Y kaydedicisine ikinci sayaç bilgisi olarak yüklenir. Eğer DEY komutuyla Y sıfırlanmamışsa, BNE komutuyla bir bekleme oluşacaktır ve bu komut ikilisi 256 defa icra edilecektir. İkinci DEY ve BNE döngüsü, [0021] adresindeki sayaç bilgisinin artışıyla 5µs'lik bir zaman gecikmesi üretecektir. Y sayacının bitimiyle X sayacı tekrar FFH'e kurularak toplam olarak (5*255)=1275µs'lik zaman gecikmesi saglanacaktır. 8‐bitlik bir alan maksimum ondalık 255 değerini saklayabilir. Buna göre [0020] ve [0021] adreslerinin sayaç bilgisi olarak 255 tuttukları farzedilirse: Tgmax = 20+(5*255)+(255 x 1284) mikrosaniye Tgmax = 328721 mikrosaniye Tgmax = 328.721 milisaniyedir. Bu altyordamın maksimum gecikme zamanı 329 ms'dir. Bu işlemde BNE komutunun son çalışmasında 3 saykıl yerine 2 saykıl çekişi gözönüne alınmamıştır(1274). Alternatif gecikme programı: GEC2
BEKX
BEKY
LDX
LDY
DEY
BNE
DEX
BNE
RTS
#$XX
#$C6
; İlk sayaç bilgisini yükle
; İkinci sayaç bilgisini yükle
; Y=Y-1
BEKY
BEKX
; Sıfır değilse devam
; X=X-1
; Sıfır değilse devam
Programda Y sayaç değeri #$C6(19810) olarak sabit girilmektedir. X sayaç bilgisi en fazla 255 olarak girilebilir. Program için şöyle bir hesaplama yapılabilir : Tg= l ms. x [X]
Eğer [X] = 05 ise, Tg = 1 x 05 = 5ms
Eğer [X] = 08 ise, Tg = l x 08 = 8 ms. olarak bulunur.
1 µs = 0,000001ms
1 ms = 0,001 s
1 ms = 1000 µs
1 s = 1000 ms' dir 5 . 2 . 30 Saniyelik Zaman Geciktirme Altyordamı Altyordam önceki GECI zaman gecikme altyordamını 100 defa kullanarak 0,5 dakikalık bir gecikme sağlar: G30S LDA #$A5 ; [0020] VE [0021]
STA $20 ; Sayaç bilgilerinin
LDA #$EA ; oluşturulması
STA $21 ;
LDA #100 ; A = 100;
DAL JSR GEC1 ; GEC1'i çağır
SEC
;
SBC #01 ; Zamanlama baytını
BNE DAL azalt
RTS
; Sıfır değilse tekrar
çağır
G30S LDA
DON LDX
LDY
BEK DEX
BNE
DEY
BNE
SEC
SBC
BNE
RTS
#100
#$A5
#$EA
BEK
BEK
#01
DON
; A = 100
; ilk sayaç bilgisi
; ikinci sayaç bilgisi
; X=X-1
; X eşitdeğil 0 ise
BEK'e git
; Y=Y-1
; Y eşitdeğil 0 ise
BEK'e git
; Zamanlama baytını
azalt
; A=0 olana dek
DON'e dön
Yarım dakikalık altyordamın başlangıç yüklenme değeri olan 100 yerine 200 değeri konulduğunda 1 dakikalık gecikme süresine erişilir. Programda DON etiketi genel gecikmeyi sağlar. Eğer Akümülatör 0 değilse bu rutine sapılır. Eğer A = 01 iken DON çağrısı yapıldıysa, altyordam mikroişlemci ana programa dönmeden önce 300ms'lik gecikme üretecektir. Eğer Akümulatör 100 veya 200 iken BAS çağrısı yapıldıysa, altyordam 30 saniye ile 1 dakikalık gecikme yapacaktır. Eğer Akümülatör 0 iken DON çağrısı yapılırsa, DON'un üreteceği maksimum zaman gecikmesi 76.8 saniyedir. Akümülatöre 60 yüklenerek ve 1 dakikalık altyordam çağırılarak yapılan birr gecikmeyle 1 saatlik bir gecikme sağlanabilir. 
Author
Document
Category
Uncategorized
Views
0
File Size
1 909 KB
Tags
1/--pages
Report inappropriate content