Commodore sayı 13, sayfa 19

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ı.