Bu sayfadaki yazılar
Sayfanın metni
Sayfa 64
Bu hesaplamalara göre bir register'in en fazla hangi değeri alabileceğini hesaplayalım. Bu iş için her basamağa 1 değeri verelim. Böylece: 1+2+4+8+16+32+64+128. Demek ki sekiz bit ile en fazla 255 sayısını gösterebiliriz. Bu sayıyı belki daha evvelden PEEK fonksiyonundan tanıyorsunuz. Fakat o konuya daha sonra döneceğiz. Bu sayı sistemine aynı zamanda ikili sayı sistemi de deniyor. Fakat gördüğünüz gibi kullanımı oldukça karışık. Ortalık 0 ve 1'lerden oluşmuş bir çorbaya dönüyor. Bu yüzden benzer karakteristikleri taşıyan bir sayı sistemi geliştirilmiş. Hekzadesimal (onaltılık) sistem denilen bu sayı sistemi dört bitlik grupları tek basamakta belirtmemizi sağlıyor. Bu sayı sistemi onaltı adet rakam tipi içeriyor. Buna göre diyebiliriz ki bir Byte iki onaltılık basamakta gösterilebilir:
Demek ki bu register'ın içeriği onaltılık sistemde 69'muş. Sayı sistemlerini karıştırmamak için bir şeyler yapmamız gerektiğini fark etmişsinizdir. Bu yüzden onaltılık sayıların önüne dolar işareti, ikili sistemde yazılmış sayıların önüne ise yüzde işareti "%" koyacağız. Baştan belirtelim ki biz onaltılık sistemde çalışmayı tercih edeceğiz. O yüzden bu sayı sistemi başta size garip gelse de zamanla alışacaksınız. Sayı sistemleri üzerine yaptığımız bu incelemeden sonra ana işlem ünitesinin kendisine dönelim. Bunun için öncelikle ana işlem ünitesinin bütün register'lerini göz önüne alalım.
Akümülatör
Görüldüğü gibi her byte iki adet yarım byte'a (aynı zamanda nibble da deniyor) ayrılıyor. Bu nibble'ların değeri 0 ile 15 arasında değişebiliyor. Ondalık sistemimizde yalnızca 0'dan 9'a kadar sayıları belirtebildiğimize göre 10'dan 15'e kadar olan sayıları belirtebilmek için yeni bir şeyler bulmalıyız. Bu iş için A'dan F'ye kadar olan rakamları kullanacağız. Şimdi değer tablomuza bir göz atalım:
Program sayacı
1 0987608493210
Durum register'ı
7 6 5 4 3 2 1 0
Yığın göstergeci
Yukarıdaki şemada görüldüğü gibi ana işlem ünitemizin 6 register'i var. Bunlardan 5 tanesi sekiz bit'lik register'lerden. Aralarında bir tanesi ise onaltı bit'lik tipten. Bu register'lerin hepsini tek tek daha yakından inceleyelim. En önce akümülatör veya nam-ı diğer akü'den, yani ana işlem ünitesinin en önemli register'inden söz edelim. Bu register ana işlem ünitesinin yapması gereken tüm mantıksal veya aritmetik işlemleri üstlenen kısımdır. X-Register'i ana işlem ünitesinin ikinci register'idir. Tablo tipi veri yapılarının kullanımında akü ile birlikte çalışır. Genel olarak tabloların indeks işleminde kullanıldığından indeks register'i olarak da anılır. Y-Register'ı X-Register'ine benzer fonksiyonlara sahiptir ve benzer yerlerde kullanılır. Program sayacı onaltı bit'lik bir register'dir. İçeriği ise program yürürken bir sonraki komutun başlangıç adresini saklamaktır. Bu yüzden program yürürken kendiliğinden daimi olarak artar. Birkaç (JMP) veya alt program çağırma (JSR) komutları dışında bu register'le doğrudan bir işimiz olmayacak. Yığın göstergeci ise, yığın denilen bir bilgi yığınını kullanmak için gerekli olan göstergeç değerini içeriyor. Yığın genelde alt programların geri dönüş adreslerini saklamak için veya anlık ve bölgesel olarak saklanması gereken bilgiler için kullanılır. Daha detaylı olarak alt programlar bölümünde inceleyeceğiz. Durum register'ı o anda ana işlem ünitesinin çalışma mod'unu ve en son yapılan sonucu ile ilgili genel bilgileri içerir. Bu genel bilgiler şartlı olarak yürüyen programlar yazabilmemizi sağlar (IF...THEN... gibi). Bu register'in bir bit'i dışında tüm bit'lerinin özel anlamları vardır. Bu bit'lerin her birine flag denir. Bu flag'ların durumu doğru (=1) veya yanlış (=0) olabilir ve belli bir durumun olup olmadığını gösterir. Durum register'inin yapısı şöyledir:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 65
Bu flag'ların isimleri yaptıkları işin baş harfinden oluşmuş kısaltmalardır ve anlamları şunlardır:
C- Carry (taşma): Bu flag yapılan son işlemde bir taşma olup olmadığını gösterir. Mesela iki sayıyı topladığımızda sonuç 255'ten büyükse sonuç 8 bit'le gösterilemez ve bu flag yakılır. Z- Zero (sıfır): En son yapılan işlem sonucu sıfır'sa bu flag yakılır. I- Disable: Bu flag belli bir program bölümü yürürken Interrupt denilen programın periyodik olarak kesilmesi olayına izin verilip verilmediğini gösterir. Bu flag şimdilik bizi pek ilgilendirmiyor. D- Decimal (ondalık hesaplama): Bu flag toplama ve çıkarma işlemlerinin ondalık mod'da yapılıp yapılmayacağını belirler. Bu flag da bizi şimdilik ilgilendirmiyor. B- Break: Bu flag, programın kesilme işleminin BRK emri ile yapılıp yapılmadığını gösterir. Bu flag'ı da şimdilik kullanmayacağız. V- Overflow: Sayıları pozitif ve negatif diye yorumlayıp işlem yaptığımızda işimize yarayacak bu flag, yapılan işlemdeki taşmaları gösterir. N- Negative: Bu flag en son yapılan işlem sırasında 7 numaralı bit ile aynı içeriğe sahiptir. Negatif denmesi 128 ve üstündeki sayıların negatif olarak da yorumlanıp işlem yapılabileceğindendir.
Başlangıç olarak yalnızca Carry, Zero ve Negative flag'larıyla ilgileneceğiz.
Ana işlem ünitesinin bir şeyler yapabilmesi için bir program yazılı olması lazım ve bu programın bulunacağı bir alan, ayrıca bu programın yürürken kullanacağı veriler için de bir bölge lazım bize. Aletin çalışma alanı veya RAM bellek denilen şey bizim register'lerin oldukça büyük miktarda bir araya gelmişinden başka bir şey değil. Bu kadar çok register'in hepsine ad vermekle başa çıkamayacağı için her birini sırayla numaralama yolu seçilmiş. Bu numaraya aynı zamanda adres de diyoruz. Ana işlem ünitemizin 16 adet adres hattı vardır. Böylece 2^16 adres'i ayırt edebilir. Buradan vardığımız sonuç şu ki,
64 KByte'lık hafızası olan COMMODORE 64'ümüzün bütün adres bölgesi bellek elemanlarıyla kaplanmış durumda. Dikkatli okurlarımız hemen fark etmişlerdir. Program sayacımız da onaltı bit genişliğindeydi. Bu onaltı bit'lik değer bir sonraki komutun (instruction) adresini aklında tutmakta (neden o anki değil de bir sonraki komutun, diye soranlar için söyleyelim; ana işlem ünitemiz PREFETCH denilen bir teknikle çalışıyor ve belli bir oranda hızı artıyor). Ana işlem ünitesi program sayacı yardımıyla hafızayı adresler ve komutu bellekten okur, yürütür. Bir komut, bir byte'a sığabildiği için en fazla 256 komut olabilir. Tabii bu komutları BASIC komutları ile karıştırmayın; bunlar ana işlem ünitesi tarafından doğrudan yürütülebilecek komutlardır, yani makina dilinin ta kendisidir.