Commodore sayı 47, sayfa 45

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 45

Görüldüğü gibi yukarıda bayt sayılarının yanında ayrıca $2005'e olan uzaklıkları yer almaktadır. BEQ komutunda program sayacına toplanacak değerin 05 olduğu belirtilmiştir. Dolayısıyla BEQ komutuna uzaklığı 05 olan satır burada işleme konulacaktır. Kısaca şunu söyleyebiliriz: Eğer ileri yönde bir dallanma yapılacaksa Branch komutundan sonraki satırdan itibaren uygulanması istenilen komuta kadar olan baytlar sayılır ve bu sayı Offset'tir. Yukarıdaki yöntemle ters yönde de dallanma gerçekleşebilir. Daha önceki programlarımızda bunu birçok defa kullandık. Şimdi bu gibi durumlarda Offset'in nasıl hesaplanacağını görelim. Aşağıda makine dili bir programın sadece bir bölümünün Assembler dökümü yer almaktadır.

1000 A2 00 LDX # $00 1002 E8 INX 1003 DO FD BNE $ 002 00 BRK

1005

Bu program daha önce sıfır yapılan X-register'inin değerini 255'i geçene (255'den sonra tekrar 0 gelmektedir) kadar bir arttırmaktan başka iş yapmamaktadır. X-Register'in değeri 0 olmadığı sürece 1002 satırındaki INX komutuna bir dallanma gerçekleşmektedir. Bu register ancak 0 olduğunda BRK ile program durmaktadır. Daha önce belirttiğimiz gibi program sayacı yukarıdaki BNE komutuna sıra geldiğinde $1005'i göstermektedir. Yukarıdaki programı bu sefer bayt bayt inceleyelim:

Bayt: Değer: — Anlamı: 1000 A2 LDX#$ 1001 00 1002 3 E8 INX 1003 2 DO BNE 1004 1 FD Offset 1005 00 BRK Yukarıda yine bayt numaralarının

yanında o an program sayacında belirtilen adrese olan uzaklıklar yazılmıştır. INX komutuna ulaşabilmemiz için sayaçtan 3 çıkartmalıyız. Daha önceki sayılarda belirttiğimiz gibi bilgisayar bir sayıyı çıkartırken o sayının ikinci dereceden karşılığını toplamaktadır. Bu nedenle 03'ün ikinci dereceden karşılığını hesaplamalıyız:

Birinci dereceden karşılık: $1

İkinci dereceden karşılık:

Bu son sayı $FD'ye eşittir ve yukarıdaki örnekteki Offset'e karşı gelmektedir. Ters yöndeki dallanmalar için şu kural geçerlidir: Program sayacının gösterdiği adresten itibaren uygulanması istenen komuta dek olan bayt sayısı belirlenir. Bu sayının ikinci dereceden karşılığı ise Offset'in değeridir. Aşağıdaki şema yukarıda anlatılanları özetlemektedir:

Bayt: — İçeriği: Offset: 1995 F9 1996 FA 1997 FB 1998 FC 1999 FD 000 BNE FE 2001 — Offset FF 2002 — Sayaç Durumu 2003 01 2004 02 2005 03

Bu anlatılanlardan sonra Branch komutlarında var olan sınırlamayı herhalde fark etmişsinizdir. Özellikle ters yönde olan dallanmaların negatif sayılarla oldukça fazla benzerliği vardır: Her ikisinde de ikinci dereceden karşılıklar ile işlem yapılmaktadır. Nitekim bir bayt ile gösterilebilinen en büyük pozitif sayı

4127-$7F ve en küçük negatif sayı 1000 0000 = -128 olduğu için ancak bu sınırlar içinde bir dallanma gerçekleşebilir. Bu nedenle örneğin aşağıdaki gibi bir satır 6510 makine dilinde mümkün değildir: 3000 BNE 1000

Birçok monitör programı böyle bir satır yazıldığında hata mesajı verir. Ex-Mon ise bu durumda 1000 yerine başlangıç adresini yazmaktadır.

Zero Page:

Relatif adresleme yöntemini de gördükten sonra şimdi başka bir adreslemeye geçiyoruz: Zero Page ad- Zero Page ne demektir? Bu terimin

0000 0011 1111 1100 1

1111 1101

(İkilik sistemde)

dilimizdeki karşılığı “Sıfırıncı sayfa”dır. Bilgisayar dilindeki karşılığını iyi anlayabilmek için ise adreslerin C-64 tarafından algılanış şeklini anımsamak gerekir. 16 Bit'lik bir sayı alçak ve yüksek olmak üzere iki bayt haline gelmekteydi. Örneğin $1F04 sayısının alçak baytı $04 ve yüksek baytı $1F'dir. Bu şekilde C-64'ün tüm belleği yani 65535 bayt adreslenebilir. $0000 - $00FF arası ilk 256 adresin yüksek baytları sıfırdır. Böyle 256 baytlık bölgeler sayfa (page) olarak adlandırılır. Yüksek baytları “0” olan bu sayfaya “Sıfırıncı Sayfa” denir. Eğer örneğin akümülatöre bir sıfırıncı sayfa adresi olan $00FA'nın değerini yüklemek istersek şu satırı yazmalıyız:

3000 LDA $00FA

Fakat C-64'ümüzün mikroişlemcisi aşağıdaki satırı da anlayacaktır:

3000 LDA $FA

İşte buna sıfırıncı sayfa adresleme yöntemi adı verilir. LDA komutumuz bu şekilde hafızada 3 yerine sadece 2 bayt kaplar. Şu ana kadar öğrendiğimiz birçok komutta bu adreslemeyi kullanabiliriz:

LDA,LDX,LDY,STA,STX,STY, INC,DEC,ADC ve SBC

Mutlak adreslenen tüm komutlar yukarıda gördüğünüz gibi sıfırıncı sayfayla da adreslenebilir. Resim 1'de komutlar ayrı ayrı ele alınmıştır. Şimdi gelelim hız farklarına: Mutlak ve Sıfırıncı sayfa adresleme yöntemlerini gösteren tabelaları yanyana koyduğumuzda ikisi arasında her komut için bir cycle (çevrim) fark olduğunu görebiliriz. İlk bakışta bu oldukça önemsiz gibi gözükebilir, ancak birkaç yüz defa tekrarlanan döngülerde bu fark büyük önem kazanır. Bu nedenle hız unsurunun ön planda olduğu programlarda muhakkak sıfırıncı sayfada adresleme yapılmalıdır. Yukarıda anlatılan durum C-64'ün işletim sistemini ve Basic yorumlayıcısını geliştiren kimselerce de çok iyi biliniyordu. Bu nedenle hemen hemen tüm kernal (işletim sistemi) ve Basic rutinleri sıfırıncı sayfaya bir

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