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ı.
Sayfa 44
BNE komutunu ilk defa kullandığımızda örneğin BNE 1200'ün tahmin edildiği gibi 3 Bayt'lık bir komut olmadığını belirtmiş ve hafızada sadece iki bayt işgal ettiğini söylemiştik. Şimdi yeni bir adresleme yöntemi olan relatif adreslemeyi öğrenirken aynı zamanda Branch komutlarının neden 3 yerine 2 bayt kapladıklarını göreceğiz. Örneğin BNE 1200 yazdığımızda kullanmakta olduğumuz monitör programı $1200 mutlak adresine karşılık gelen relatif adresi hesaplamaktadır. Son adresleme yönteminde bilgisayar dallanmanın kaç bayt ileri veya geriye yapılacağına bakmaktadır. Karşımıza iki soru çıkmaktadır: 1. Bilgisayar hangi adrese göre relatif olarak dallanmaktadır? 2. $1200 gibi mutlak bir adres girdiğimizde bilgisayar kaç bayt ileri veya geri dallanacağını nasıl saptamaktadır? Bu soruların cevaplarını aşağıdaki kısa programda bulacağız.
2000 AD0030 LDA $3000 2003 FO 05 BEO $200A 2005 A9 00 LDA # $00 2007 — 8D 00 30 STA $3000 2004 60 RTS Programımız $3000 baytının içer-
diği değeri akümülatöre yüklemekte, eğer sonuç sıfır ise Basic'e geri dönmektedir (RTS). Eğer $3000 sıfıra eşit değilse bu adres sıfır yapılmaktadır. Bu program ilk bakışta pek anlamlı gözükmese de $3000 bir Flag (bayrak) olarak kullanılırsa oldukça yararlı olur. 6510 makina dilinde bilgisayar hangi satırı işleyeceğini program sayacından (Program Counter) öğrenmektedir. Yukarıdaki programımızda sıra BEQ'ya gelince sayaç otomatik olarak bir adım fazla atarak bir sonraki satırı yani $2005'i göstermektedir. Bu şekilde birinci sorumuzun da cevabını almış oluyoruz. Branch komutlarında dallanmanın gerçekleşeceği uzaklık (genellikle Offset olarak adlandırılır) program sayacına eklenir. İkinci sorunun cevabı için ise yukarıdaki programı bu sefer bayt bayt inceleyelim:
Değer:
AD
838388
ANIL GÜL
Anlamı:
LDA $3000'ın Alçak Baytı $3000'in Yüksek Baytı BEQ Offset LDA $
STA
$3000'in Alçak Baytı $3000'in Yüksek Baytı