Commodore sayı 12, sayfa 46

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 46

LDA y£ SOA 10 olarak)

Bu adresleme tipinin karakteristik belirleyicisi, yüklenecek değerin hemen önünden gelen # işaretidir. Direkt adresleme akümülatör'ün doğrudan $0A (onaltılık olarak $0A) değeriyle yükleneceğini gösterir. Bu işe karşılık gelen BASIC komutu ise:

0

Bu adresleme tipi herhangi bir register'e sabit bir değeri yüklemek için kullanılır. Bu adresleme tipi X- ve Y- Register'leri için de vardır. Bunlara örnek olarak:

LDX LDY $AB

verebiliriz. Burada X-Register'i $7F (ondalık olarak 127) değeriyle, Y-Register'i $AB (ondalık olarak 171) değeriyle yüklenir. Bu adresleme tipinde aynı zamanda yüklenmesi gereken değer de makine dili programın bir parçası haline gelir. Hafızada komut ve yüklenmesi gereken değer peşpeşe Byte'lar olarak durur. Makine dili programı bu adreste yürürken bu Byte'ı alır ve bunu bir komut olarak yorumlar. Diyelim ki komut olarak $A9'a (ondalık olarak 169) rastladı; ana işlem ünitesinin içindeki karmaşık devreleri hemen bunun bir LDA #$.. komutu olduğunu algılar. Aynı karmaşık devreler bu sefer de bir sonraki Byte'ın komut değil de veri olacağına karar verirler. Bir sonraki Byte okunur ve değeri akümülatör'e yüklenir. Burada gördüğünüz gibi bu işlem toplam olarak iki Byte sürüyor (komutun kendisi bir Byte; yüklenecek veri diğer Byte olmak üzere). Ana işlem ünitesi bir komutun başlangıcından, bu komutun bitimine, bir sonraki komutun başına kadar program sayacının değerini otomatik olarak iki artırır. İkinci olarak absolut adresleme tipini inceleyelim. Bu adresleme tipi register'e sabit bir değer değil de, bir hafıza biriminin (adreslenebilir bir Byte'ın) içeriğini yüklemek için kullanılır. Örnek verecek olursak:

LDA $COAF

Burada akümülatör'e $C0AF adresinin içeriği yüklenir. Şimdi ufak bir sorun çıkıyor. Bu işlem hafızada nasıl yerleşmekte?.. $C0AF adresi 16-bitlik bir sayıdır ve bu özelliğinden dolayı bir Byte'a sığmaz. Hemen herkesin aklına gelen çözüm pratikte de gerçekleşiyor ve 16-bitlik bu sayı 8-bitlik iki sayıya bölünüp hafızaya öyle yerleştiriliyor. Bu arada 65XX serisi ana işlem ünitelerinde geçerli olan bir kuralı hatırlatalım: Önce düşük basamaklı Byte, peşinden yüksek basamaklı Byte geliyor. Yani 16-bitlik bir sayının önce sağ tarafı, sonra sol tarafı yazılıyor. Şimdi bu işlem hafızada nasıl görünür, bir inceleyelim. Önce LDA komutunun bu adresleme tipine karşılık gelen kod'u $AD (173), daha sonra $AF (175) ve son olarak $C0 (192) gelir. Aynı işlemi yapan satırı yazmak istersek:

Az $COAF

Tabii ki aynı komutun X- ve Y-Register'leri için karşılıkları var. Bunlar için ayrı bir örnek vermeyeceğiz. Çünkü akümülatör'le yapılan işlemden farklı bir şey yok. Diyelim ki ana işlem ünitesi bu işlemi hafızada yürütüyor. Önce komutu tanır, arkasından adresin düşük değerli kısmını (Lo-Byte da denir) okur, onun arkasından adresin yüksek değerli kısmı (Hi-Byte da denir) gelir. Şimdi ana işlem ünitesi tüm bir satırı okudu. Ne yapacağını biliyor, fakat henüz hiçbir şey yapmamış durumda. Burada ana işlem ünitesi kısa bir süre programın kendisinden ayrılır ve adreslemesi gereken bölgeyi adresleyip oranın içeriğini alır ve akümülatör'e yükler. Görüldüğü gibi bu işlem tipi üç Byte sürmekte. Yani bu işlem bittiğinde program sayacının değeri üç artacaktır. Şu ana kadar iki ve üç Byte süren komutları gördük. Bunlardan başka bir de bir Byte uzunluğundaki komutlar var ki bunlar genelde ana işlem ünitesinin içini ilgilendiren veya başka bir deyimle herhangi bir operand'a gereksinim duymayan komutlardır. Burada, birinci bölümde andığımız durum register'inden söz edelim. Yükleme komutları sırasında N (negative) ve Z (zero) flag'ları etkilenir. Diyelim ki örneğimizdeki gibi akümülatör'e $0A yükledik. Bu sayı sıfır olmadığı için Z flag'ı sönük (=0) olacak; bu sayının yedinci biti sönük olduğu için N flag'ı sönük olacaktır. Başka bir adresleme tipi de sıfırıncı sayfa adreslemesidir. Bu adresleme tipi yapı bakımından absolut adreslemeyle eşdeğerdir. Fakat geçerli olduğu adres bölgesi hafızanın ilk 256 byte'ıdır. Bu adres bölgesi $0000'dan $00FF'a kadar gider. Dikkat ettiyseniz, adresin yüksek değerli Byte'ı sıfır değerindedir. Sıfırıncı sayfa ismi de buradan gelmektedir. Açıkça görülmektedir ki bu adresleme tipinde aynı işlem için absolut adreslemeye göre bir Byte tasarruf ediyoruz. Böylece bu işlem hafızada daha az yer tutacağı gibi, aynı zamanda ana işlem ünitesi tarafından belli bir miktar daha hızlı yürütülür. Dezavantaj olarak sınırlı adres bölgesi görünmekle birlikte, avantajlar daha ağırlıktadır. Çünkü bilgisayarımızın önemli sistem değişkenleri (işletim sisteminin bilgisayarı hayatta tutmak için kullandığı hafıza bölgesi) bu bölgede saklanmaktadır. Bir örnek verecek olursak:

LDA $73

Bu işlem hafızaya iki Byte olarak yerleşecektir. Bunlar komutun kendisi olan $A5 (165) ve adresi gösteren $73 (115)'tir. Bu işlemi BASIC'te yazmak istersek:

$73

Tabii BASIC'te vereceğimiz karşılaştırmalı örnekler açısından absolut adresleme ile sıfırıncı sayfa adresleme arasında bir fark görünmeyecektir. Bu arada aklımıza gelmişken bir şeyi hatırlatalım: Sıfırıncı sayfa ile ilgili adreslemeleri, isterseniz absolut adreslemeler ile de yapabilirsiniz. Hiçbir engel yok, fakat size sağlanan avantajı kullanmamakla programınız uzar ve biraz yavaşlar. Önemli bir adresleme tipi de indeksli adreslemedir. Burada X- ve Y- indeks registerlerinin asıl önemini daha iyi kavrayacağız. Bilhassa makine dilindeki özel döngülerde çok kullanılan bu adresleme tipine örnek verecek olursak:

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