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ı.
Sayfa 48
Adresleme tipi LDA LDX LDY direkt $A9 $A2 $A0 absolut $AD $AE $AC sıfırıncı sayfa $A5 $A6 X-indeksli $B5 — $BC Y-indeksli $B9 $BE — 0'cı sayfa X-indeks — — $B4 0'cı sayfa Y-indeks — — — — indirekt indeksli sı — — indeksli indirekt
2. Saklama Komutları
Saklama komutları, yükleme komutlarının tam tersi işlemi yaparlar. Bu komutlar yardımıyla bir register'in içeriğini hafızanın belli bir adresine yazabiliriz. Bu işi yapan komutlar şunlardır:
STA STX STY larınız değişmez. Saklama komutundan önce ne ise, aynı şeklini korur. Aşağıdaki listede bütün komut kodlarını ve geçerli adresleme tiplerini bulacaksınız.
Adresleme tipi STA STX STY absolut $8D $8E $8C sıfırıncı sayfa — $86 X-indeksli $9D $9E $9C Y-indeksli $99 — — 0. sayfa X-indeksli — — — $94 0. sayfa Y-indeksli — — — — indirekt indeksli sı — indeksli indirekt sı —
Yapılan işlemleri BASIC'te, POKE komutunu kullanarak yapacağız. Bu komut hafızadaki herhangi bir elemana ulaşıp onun içeriğini değiştirmemizi sağlar. Adresleme tipleri elemanın adresini elde ederken uygulanan farklı yöntemleri gösterir. Birkaç örnek verelim:
Bu komutlar görüldüğü gibi akümülatör'ün (aynı şekilde X-register'inin, ya da Y-register'inin) içeriğini hafızanın belli bir adresindeki elemanda saklamamıza yarar. Kullanabileceğimiz adresleme tipleri, tek eksik dışında, yükleme komutları ile aynıdır. Bu eksik adresleme tipi tabii ki direkt adreslemedir. Çünkü bu adresleme tipinde belli bir adres belirtilmemektedir. Saklama sırasında saklanan register'in içeriği değişmediği için (ya da ana işlem ünitesinin içinde hiçbir değişiklik olmadığı için) hiçbir flag etkilenmez. Bilhassa ilk makine dili programları yazarken çok düşülen bu hataya karşı uyaralım dedik: DİKKAT! Sakladığınız değere göre flag-
STA $8000 POKE $8000 STA $C020,Y POKE YA $C020 STY $FI - $OOF1
diğini bir kere daha hatırlatalım. Özetlersek ilk iki bölümde ana işlem ünitesinin en önemli iki komut grubunu gördük. Bu komutlar ana işlem ünitesinin, bilgisayarın hafıza birimleri ile bilgi alış verişini sağlarlar. Bütün programlarda en yoğun kullanılan komut grupları bunlardır.
3. Ana İşlem Ünitesinin İçinde Bilgi Transferi
Şimdiye kadar, ana işlem ünitesinin registerlerinden hafızaya; hafızadan ana işlem ünitesinin registerlerine bilgi transferinin nasıl yapılacağını gördük. Peki ana işlem ünitesinin bir registerinden bir diğerine bilgiyi nasıl göndereceğiz? Bunun için; herhalde, önce hafızaya yazıp sonra hafızadan okumaktan daha kolay bir yöntem olmalı. Evet var, bunlar bir iki basit ve özel komuttan oluşan bir grup. Bu komutlarla, mesela akümülatör'ün içeriğini X-register'ine kopyalayabilirsiniz veya tam tersi... Burada görüldüğü gibi iki registerin belirlenmesi gerekir. Bunlardan birincisi kaynak register'i (bilgi bu register'den çıkacak), diğeri de hedef register'i (bilgi bu register'e ulaşacak) olacaktır. Yapılan işlem ise kaynak register'inin, içeriği bozulmadan, hedef register'inde bir kopyasının oluşturulmasıdır. Bütün transfer komutları bir byte uzunluktadır ve hiçbir operand'a ihtiyaç göstermezler. Yapılacak işlem oldukça açık ve basittir. Bundan başka bu komutlarla yapılan bilgi transferi diğer komutlara göre çok daha hızlı yürür. Şimdi bu komutları tek tek görelim. Tabii bu arada daha anlaşılır olması açısından, aynı işi yapan BASIC'te yazılmış satırlarımızı unutmadık.
TAX
A
Akümülatör'ün içeriği X-register'ine kopya edilir. Z- ve N-flag'ları etkilenir. Akümülatör'ün içeriği değişmez.
Saklama komutları da yükleme komutları gibi adresleme tiplerine göre 2 veya 3 Byte uzunluğunda olabilirler. Yükleme komutları için belirttiğimiz tüm kurallar aynen geçerlidir. Tabii flag'ların yapılan işlemden etkilenme-
TXA
TAX Bu komut yukarıdakinin tam tersi işlemi yapar. Bilgi akışının yönü değişir. X-register'inin içeriği akümülatör'e kopya edilir. Bu işlem sırasında Z- ve N-flag'ları etkilenir. Burada X-register'inin içeriği etkilenmez.