Commodore sayı 12, sayfa 49

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 49

TAY ği TYA A

Bu komutlar yukarıdakilerin Y-register'ine uygulanmış halidir. Yukarıda belirtilen kurallar aynen geçerlidir. Tek fark, işlemlerin X-register'i yerine Y-register'i ile yapılmasıdır. Geriye kalan iki komut yığın göstergeci (stackpointer) ile ilgili komutlardır. Bu göstergecin ne işe yaradığını tüm detaylarıyla daha ileride göreceğiz. Yığın göstergeci yalnızca X-register'i ile bilgi transferinde bulunabilmektedir.

TSX XxX

Yığın göstergecinin içeriği X-register'ine kopya edilir. Z- ve N-flag'ları etkilenir. Yığın göstergecinin değeri hiçbir şekilde etkilenmez.

TXS SP

Anlaşılacağı üzere, burada yapılan işlem yukarıdakinin tam tersidir. X-register'inin içeriği yığın göstergecine kopya edilir. Bu komut sırasında ana işlem ünitesinin hiçbir flag'ı etkilenmez. Çünkü yığın göstergeci A-, X- ve Y-register'leri gibi işlem register'i değildir. Burada da X-register'inin içeriği korunur. Son iki komut için belirtmemiz gereken bir konu da bunların öyle her yerde değil de, kritik programlarda kullanılan komutlar olduğudur. Aşağıdaki tabloda bu komutları ve onlara ait komut kodlarını bulacaksınız. (Tabii ki burada adresleme tipi diye bir şey söz konusu değil.)

Emir TAX TXA TAY TYA

4. Aritmetik İşlem Komutları

Bu kısımda ana işlem ünitemize hesap yaptıracağız. COMMODORE 64'ümüzün biricik 6510 ana işlem ünitesi direkt olarak sadece toplama ve çıkarmadan anlıyor. Aritmetik işlemler yürütülürken bazı kuralları göz önünde tutmamız gerekiyor. Bunlar: Her hesaplama iki operand'a ihtiyaç gösterir. Sonuç, bu iki operand arasında söz konusu işlem yapıldıktan sonra elde edilir. 6510 ana işlem ünitesinde operand'lardan biri akümülatör'de olmak zorunda. İkinci operand ise hafızada olabilir. Tabii, ikinci operand için değişik adresleme tipleri kullanılabilir. Bulunan sonuç daima akümülatör'de tutulur. Aynı kural bir sonraki kısmımız olan mantıksal işlemler için de geçerli. BASIC komutları ile vereceğimiz örnekler bu anlatılanların daha iyi kavranmasına yardımcı olacaklardır.

İlk önce toplama işlemine göz atalım. Burada hafızanın içeriği akümülatör'e toplanır ve sonuç akümülatör'e yazılır.

ADC

İki adet 8-bitlik sayıyı topladığımızı düşünelim ve sonuç 8-bite sığmayacak kadar büyük olsun (8-biti geçemeyeceği de kesindir, yani yalnızca bir ekstra bite ihtiyacımız olacak). Burada, “elde verme” denilen işlem yapılacaktır. Konuyu lafla değil de örnekle incelersek daha iyi olacak galiba:

ADC #$3A; bu işlemden önce akümülatör $E4 içersin.

$9E — S3A — 9000111010

Toplama işlemi şöyle olacaktır: %10011110

%11011000 = $D8

Burada gördüğünüz ikili sistemdeki toplama işlemi onluk sistemdekinin benzeri kurallarla yürütülmektedir. Göz önünde bulundurmamız gereken durumlar 4 adettir:

Onluk sistemimizde olduğu gibi “elde” olayı, bir sonraki basamakta değerlendirilir. Bu örnekte sonucumuz $D8 veya ikili olarak %11011000 idi. Görüldüğü gibi bu sonuç 8-bite sığdı. Bu olayı bir şans gibi görmektense sığmayacağı durumları da içeren genel bir çözüm görsek daha iyi olacak: ADC #$3A burada akümülatör $E4 içersin. $E4 = %10110100 $3A = %00111010 Toplama işlemi şöyle olacaktır:

Yo 11100100 Yo 00111010

90 100011110

Evet, 8-biti aşmayı becerdik. Ne yapacağız?.. Tabii bizim pek bir şey yapacağımız yok. Ama işlem ünitesinin bu durumda ne yaptığına bakalım. Akümülatör'ümüz 8-biti tutabiliyordu. En alttaki 8 biti o alır. Dokuzuncu bit ise CARRY flag'ine gönderilir. İşte burada CARRY flag'inin esas önemini görmekteyiz. Şayet işlem sonucunda “elde” oluşursa CARRY biti “1” durumuna geçer, şayet “elde” yoksa CARRY biti “0” durumuna geçer. CARRY flag'ını aynı zamanda, toplama işlemlerinde akümülatör'ün dokuzuncu biti olarak görebiliriz. Şayet sekiz bitten daha uzun olan sayıları toplamak istersek CARRY biti imdadımıza yetişir ve sekiz bitlik grupların birbirine bağlanmasını sağlar. Mesela iki adet sekiz bit kullanırsak 0 ile 65535 arasındaki sayıları belirtebiliriz ki bu değer aralığı bile kendi başına birçok problemin çözümünde yeterli olabilir. Bu işlemi yaparken önce alt taraftaki sekiz bitlik kısımları toplarız, daha sonra üst taraftaki sekiz bitlik kısma sıra gelir. Diyelim ki birinci toplama işleminde taşma oldu ve “elde” var. Bu durumda ikinci toplama işlemi sırasında bu “elde”nin değerlendirilmesini sağlamalıyız. İşte burada 6510 ana işlem ünitesinin bir özelliği bizi bu zahmetten kurtarıyor. Çünkü yapılan tüm toplama işlemlerinde CARRY biti de beraber toplanıyor. (Tabii burada ufak bir sorun fark ediyoruz, ilk toplama işlemi sırasında CARRY biti “0” olmak zorunda, yoksa istediğimiz işlemi yanlış yaparız. Bunun için CARRY bitini sıfırlarız. Bununla ilgili komutu daha sonraki bölümlerde göreceğiz.) Şimdi bu toplama işlemini daha doğru olarak bir kere daha yazalım:

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