Bu sayfadaki yazılar
Sayfanın metni
Sayfa 19
$10 00010000 $43 01000011
$00 00000000
AND işlemi, sonuçta sıfır verdiğine göre Z-flag'ı yanacaktır. V-flag'ı verinin 6'ncı bitine eşit olacak demiştik, yani “1”. Verinin 7'nci biti “0” olduğu için N-flag'ı sönük olacaktır. Sonuçta şunu elde ederiz:
BIT komutu sadece iki adresleme tipine sahiptir:
Adresleme tipi BIT 0. sayfa $24 absolut $2C
6. Karşılaştırma Komutları
Bu gruba giren komutların yaptığı işlem; register'lere zarar vermeden içeriklerini hafızadaki verilerle karşılaştırmamızı sağlar. Sonuç BIT komutundaki gibi flag'ları etkiler. Flag'ların durumuna göre programın akışını değiştiren komutlar (bu komutları bir sonraki bölümde göreceğiz) yardımıyla, bir bakıma IF...THEN...ELSE yapısına sahip program akışı oluşturabiliriz. Karşılaştırma komutlarında verinin içeriği söz konusu register'in içeriğinden çıkartılır (aritmetik olarak). Bu işlem sırasında register'lerin içeriği değişmez. Fakat sonuca C-, N- ve Z-flag'ları belirlenir. Ana işlem ünitemizin üç çalışma register'i için de karşılaştırma komutları mevcuttur.
CMP komutu
Bu komut (CMP: to CoMPare) akümülatörün içeriğini hafızadaki veri ile karşılaştırmaya yarar. Operand (veri), akümülatörden çıkarılır (CARRY'ye dikkat etmeksizin). Şayet sonuçta “alma” olayı gerçekleşirse CARRY biti söner, tersi durumda da yanar. Şayet sonuç sıfır ise, yani veri akümülatöre eşitse, Z-flag'ı yanar, diğer durumlarda söner. Şayet sonuç $7F'ten büyükse (7'nci biti yanıksa), N-flag'ı yanar, yoksa söner. Gene bir örnek verelim:
CMP
İlk örneğimizde akümülatör $50 içersin. Yani $50-$30 işlemi yürütülecektir. Sonuç pozitif olduğu için (yani “alma” olmadığı için), CARRY biti yanacaktır. Sayılar birbirine eşit olmadığı için Z- (zero) flag'ı sönecektir. Sonuç olarak $20 elde ederiz, bu sayı $7F'ten büyük olmadığı için N-flag'ı sönük kalacaktır. Sonuç olarak; şu görünümü elde ederiz.
Diyelim ki akümülatörün içeriği $30. Burada CARRY biti gene yanacaktır, çünkü “alma” olayı yoktur. Fakat sonuç sıfır olduğu için, ZERO biti yanacaktır. N-flag'ı gene yanmayacaktır, çünkü sonuç $7F'ten büyük değildir. Sonuç olarak flag'lar bu durumu alacaktır:
Üçüncü örneğimizde, akümülatörün içeriği $10 olsun. Yapılan işlem $10-$30 = $E0 biçiminde gerçekleşecek ve görüldüğü gibi “alma” olayı olacaktır. C-flag'ı bu yüzden sönecektir. Tabii Z-flag'ı da. Sonucun 7'nci biti yanık olduğundan ($E0 = %11100000), N-flag'ı yanacaktır. Sonuç şudur:
Pratikte sonuçlar şöyle değerlendirilir:
C = 1; anlamı: büyük veya eşit. Z = 1; anlamı: eşit. C = 0; anlamı: küçüktür.
Şayet “büyüktür” şartını kontrol etmek istiyorsak, iki flag'a birden bağımlıyız. Bu durum:
Z — 1; anlamı büyüktür.
Bir kere daha hatırlatalım: Karşılaştırma komutları register'lerin veya operand'ların içeriğini değiştirmez. Sadece flag'lar değişir. Flag'ları değerlendiren komut grubunu bir sonraki bölümde inceleyeceğiz. Aşağıdaki tabloda CMP komutunun adresleme tiplerini ve kodlarını bulacaksınız.
Adresleme tipi CMP direkt $C9 absolut $CD
0. sayfa $C5 X-indeksli $DD Y-indeksli $D9 0. sayfa N-indeks $D5 indirekt indeksli $D1 indeksli indirekt $C1 CPX komutu
CPX komutu CMP komutundan farksız çalışır. Burada karşılaştırılan register, akümülatör değil X-register'dir. Burada da X-register'inin içeriği değişmez. Yukarıda tüm söylenenler, aynen CPX komutu için de geçerlidir. Yalnız CPX komutunun o kadar çok adresleme tipi yoktur. Aşağıdaki tabloda bu adresleme tiplerini ve karşılık gelen komut kodlarını bulacaksınız.
Adresleme tipi CPX direkt $E0 absolut $EC 0. sayfa $E4 CPY komutu
Burada, gene yukarıda söylenenler geçerliliğini koruyor. Fakat, bu sefer karşılaştırılan Y-register'i. Bu komut için de sadece üç adresleme tipi geçerli.
Adresleme tipi CPY direkt $C0 absolut $CC 0.cı sayfa $C4
7. Şartlı Programlama Komutları
Şimdi öğreneceğimiz komutlar
programlarımızın şarta bağlı olarak yürümesini sağlıyor. Şartları belirleyen şey ise daha evvelden tanıdığımız flag'lar. Flag'lardan yalnızca dört tanesi için bir karar verme olayı söz konusudur. Bunlar: Z-flag'ı (Zero), N-flag'ı (Negative), C-flag'ı (Carry) ve V-flag'ıdır (Overflow). Şartlı programlama; şarta göre programın belli bir adrese dallanması biçiminde oluşur. Her bir flag için ikişer adet şartlı dallanma komutumuz mevcut. Birinci komut grubu şayet flag yanıksa (içeriği “bir” ise) dallanıyor; ikinci gruptakiler ise flag sönükse (içeriği “sıfır” ise) dallanıyor. Şimdi bir olaya geri dönelim; şayet şart gerçekleşmezse hiçbir şey olmadan program devam edecek, fakat şart gerçekleştiğinde ise program belli bir adrese dallanacak. Peki bu belli adres neresi?.. Dikkatlice bakıldığında bu adresin söz konusu komutların hemen arkasından bir operand olarak belirtilmesi gerektiği ortaya çıkar. En basit çözüme örnek olarak, onaltı bitlik adresin hemen komutun arkasından gelmesi verilebilir. Böylece her bir şartlı dallanma komutu (branch) içeren satır üç byte sürecekti. Fakat ana işlem ünitemizin tasarımını yapan akıllı mühendisler daha pratik bir çözüm bulmuşlar. Bir programın dallanması genelde kısa bir mesafe içinde olduğu için yeni bir adresleme tipi geliştirilmiş: Relatif Adresleme. Bu adresleme tipinde yapılacak adres onaltı bit'lik absolut adresi ile değil, o adresin program sayacına olan uzaklığı ile belirtiliyor. Bu uzaklık ise yalnızca sekiz bit'lik bir değer ile temsil ediliyor. Daha evvelden de bildiğimiz gibi sekiz bit'lik bir bilgi ile 256 değişik sayıyı temsil edebiliriz. En basit düşünce ile 256 byte ileri dallanabiliriz. Fakat çoğu zaman geriye dallanmak da gerekebilir. Örneğin: Bir döngünün başına. Bu yüzden sekiz bit'lik bir bilgiden negatif değerler de elde edebilmemiz lazım. Bunun için şöyle bir yöntem kullanılıyor: 7'nci bit'in değeri 128 değil -128 olarak değerlendiriliyor. Yani bir bakıma yedinci bit sayımızın işareti ile ilgili bilgiyi de taşıyor. Aslında bu yöntem ile ilgili birçok örnek vermek mümkün. Fakat bütün bunların hiçbiri aşağıdaki gösterim kadar açıklayıcı olmayacaktır:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 18
Burada A'nın değeri A=$5D OR $37, yani A=93 OR 55 işlemiyle belirlenir. Sonuç ise 127, yani $7F'dir. Aşağıdaki tabloda ORA işleminin komut kodlarını ve adresleme tiplerini bulacaksınız.
Adresleme tipi ORA direkt $09 absolut $0D 0. sayfa $05 X-indeksli $1D Y-indeksli $19 0.sayfa X-indeks $15 indirekt indeksli $11 indeksli indirekt $01
İÇERMEYEN VEYA (exclusive or, EXOR) işlemi
EXOR işlemi sırasında da, bit bazında yürür tüm işlem. Sonuç, verilerden sadece biri “1” değeri taşıyorsa “1”dir. Değer tablomuzda bu olayı daha yakından görelim:
0 EOR O 0 EOR | 1 EOR 0 1 EOR |
0 0 ll
Görüldüğü gibi bu ilginç işlemde sonuç sadece iki değer birbirinden farklı ise olumludur (= 1). Bu işlem sırasında da N- ve Z-flag'ları etkilenir. BASIC'te bu işlemi yapan bir komutumuz olmadığı için ufak bir döngüde, bu işlem bit bit gerçekleştirilmeli. Böyle bir örnek burada sadece kalabalık yaratmaktan başka bir şey yapmayacağı için böyle bir örneği meraklı programcı arkadaşlarımızın özel
zevkine bırakıyoruz. Şimdi byte bazında olayı, bir örnekle görelim:
EOR 44$37
Burada da akümülatör $5D içersin. Bakalım neler oluyor:
$5D 01011101 $37 00110111
$6A 01101010
Sonuç olarak yani $6A (106) elde ederiz. Bu komutun en çok kullanıldığı biçimini belirtelim. Bu komut genelde akümülatör'ün belli bazı bitlerinin içeriğini tersine (0->1 veya 1->0) çevirmekte kullanılıyor. Örnek olarak AND $FF işlemi akümülatör'ün içeriği ne olursa olsun, tüm bitlerini tersine çevirir. Aşağıdaki tabloda EOR işleminin adresleme tiplerini ve komut kodlarını bulacaksınız.
000
Adresleme tipi EOR direkt $49 absolut $4D 0. sayfa $45 X-indeksli $5D Y-indeksli $59 0.sayfa X-indeks $55 indirekt indeksli $51 indeksli indirekt $41
BIT komutu
BIT komutu 65XX ailesinden olan ana işlem ünitelerinin değişik bir özelliğidir. Bu işlem hiçbir register'in içeriğini değiştirmez. Sadece flag'larını yürütülen işleme göre değiştirir. Etkilenen flag'lar Z-, N- ve V-flag'larıdır. Z-flag'ı akümülatör'le, veri arasında yürütülen hayali bir “ve” (AND) işlemine göre şekillenir. N-flag'ı verinin 7'nci bitinin kopyasıdır. V-flag'ı da 6'ncı bitle aynı içeriktedir. Bir kere daha hatırlatalım: Bu işlem sırasında ne register'lerin içeriği ne de hafızadaki verinin içeriği değişmez. Sadece bit'lere göre test yapılır ve sonuç flag'lara kaydedilir. Başka hiçbir şey değişmez. Örneğimiz bu olayı daha iyi açıklayacaktır:
BIT $1234
Diyelim ki akümülatörümüz $10
0x içeriyor. $1234 adresinin içeriği de $43 olsun. Yürütülen hayali “ve” işlemi şu sonucu verir: