Commodore sayı 45, sayfa 22

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 22

64 0100 0000 — 0000

(126) - 1000 0010

Görüldüğü gibi sonuç yanlıştır. 6. Bit'leri toplarken 7. Bit “1” olmuştur. İkinci dereceden karşılıklarla çalışırken bu negatif bir sayıyı göstereceği için işlem hatalı olacaktır. Bu gibi durumlarda imdadımıza statü registerindeki V-bayrağı (göstergesi) yetişir ve değerini alır. Kısaca şöyle diyebiliriz: Eğer yukarıdaki örnekte olduğu gibi istenmeyen bir zamanda yanlışlıkla 6.Bit'ten 7.Bit'e bir taşma meydana gelirse bu bayrak “1” olur. Bu işin aslı esasında daha karışıktır, fakat bu kadar bilgi bizim için yeterlidir. Görüldüğü gibi makine dilinde hemen hemen tüm operasyonlardan önce olabilecek hatalara karşı önlem alınmalıdır. Aslında bu bilgisayar kullanırken hiç alışık olmadığımız bir unsurdur, fakat ileride bu öğrendiklerimizin pratik uygulamasına geçtiğimizde bunların şimdiki kadar başımızı ağrıtmayacağını göreceğiz. Yukarıdaki işlemde 6. Bit'ten 7. Bit'e bir taşma meydana gelirse 16-Bit sayılar kullanırsak problem kendi kendine çözülür:

64 00000000 01000000 *66 00000000 01000010

130 00000000 10000010

Bildiğimiz gibi 16 Bit sayılarda 15. Bit işaret göstergesi olarak kullanılır. Şimdi diğer bir durumu inceleyelim.

-125 1000 0011 -4 1100 0000 (469) (1)0100 0011

Burada da yanlış bir sonuçla karşılaştık. Yine yanlışlıkla işaret göstergesi değişikliğe uğradı. Yalnız bu sefer değişiklik 6. Bit yerine Carry'den kaynaklanmakta. Carry olduğu için 7. Bit bu sefer “0” olmuştur. Bu problemi de 16-Bit sayıları kullanırsanız kolayca çözebilirsiniz. Şimdi yine öğrendiklerimizi kısaca toplayalım: Eğer 8- Bit işlemlerde ikinci dereceden karşılıklarla gösterilebilinen alanın (-127 ile + 127 arası) dışına çıkılırsa işaret Bit'i (7.Bit) değişmekte ve yanlış sonuç vermektedir. Bu durumda hemen statü registerinde V-bayrağı (göstergesi) üzerinde bir kırmızı lamba yanar ve bize 16-Bit sayılar kullanmamızı söyler. Şimdi gelelim Carry Bit'inin unutulabileceği durumlara. İkinci dereceden karşılıkları ile yapılan tüm 8-Bit aritmetik işlemlerinde bu Bit göz ardı edilebilir. Bunu iki örnekte gösterelim:

*4 0000 0100 — — 1110 *2 (1)000 000

Carry Bit'ine bakılmazsa sonuç doğrudur.

— 1111 1010 *1111 1110 — 1000

Burada da yine Carry Bit'i ihmal edilirse sonuç doğru çıkar. Artık C-64'ün tam sayıları nasıl işlediğini öğrendik. Şimdi bu sayı karmaşasını yine bir yana bırakarak pratik uygulamalara geçelim.

Bilgisayar Hesaplıyor: ADC, CLC

ADC, bizim 6510 mikroişlemciden öğreneceğimiz ilk aritmetik komutudur. Anlamı “Add with Carry”, yani “Carry ile birlikte topla”'dır. Şimdi elimizde iki tane 8- Bit sayı olsun: SAYI1 ve SAYI2. Yalnız bu sayılar fazla büyük değil ve toplamlarında herhangi bir taşma beklenmiyor. Akümülatöre yükleyelim:

LDA #$SAYII Ve bunu izleyen satır:

ADC # $SAYI2

Bu komutlarla karşılaşan mikroişlemci iki sayıyı toplar ve sonucu akümülatöre yazar. Sonucu görmek istediğinizde akümülatörün değerini STA ile herhangi bir adrese yazdırırız. Yalnız Assembler programlarında Carry'i etkileyen birçok işlem vardır. Bu nedenle hiçbir zaman Carry'nin 1 veya 0 olduğundan emin olamayız. ADC komutu hesap işlemine Carry'i de dahil ettiği için bunun silinmiş olması gerekir. 6510 makine dilinde bu işi yapan CLC komutu mevcuttur. SAYI1 = 12 ve SAYI2 = 7 alınırsa programımız şu şekilde olur:

1200 CLC 1201 LDA 1203 $07 1205 STA 1500

İlk satırımızda yer alan CLC bir baytlık komuttur ve sadece Carry'yi etkilemektedir. ADC ise burada kullanılan şekliyle iki baytlık bir komuttur ve dolaysız olarak adreslenmiştir. Daha önce de belirttiğimiz gibi ADC birkaç göstergeyi (bayrağı) etkileyebilir. Bunların başında Carry ve V-bayrağı gelir, fakat 7. Bit'in 1 değerini almasıyla ortaya negatif bir sayı çıkacağı için N-bayrağı ve $FF değeri aşıldığında da Z-bayrağı değişikliğe uğrayabilir.

$1201 numaralı satırı aşağıdaki şekilde değiştirdiğimizde programımız daha ilginç hale gelir:

1201 LDA $1400

Görüldüğü gibi burada mutlak adresleme yöntemini kullandık ve LDA 3 baytlık bir komuta dönüştü. Dolayısıyla programın kalan kısmı 1 bayt ileriye kaydırılacaktır. Bu son hali ile programımız $1400 adresinin içerdiği değere ADC komutunun ardındaki sayıyı ekleyecektir. LDA komutunda yaptığımız değişikliğin aynını ADC için de yapabiliriz. ADC'nin de mutlak adreslenmesi ile örneğin $1300 adresindeki değerin $1400'dekine eklenmesini sağlayabiliriz. Bu işlemi gerçekleştiren program şu şekildedir:

Klavyeyle gezinmek için ← ve → tuşları.