Bu sayfadaki yazılar
Sayfanın metni
Sayfa 20
10000000 $80 -128 10000001 $81 -127 $FE -2 $FF -1 00000000 $00 0 00000001 $01 1 00000010 $02 2 $7E 126 $7F 127
Şimdi 7'nci bite baktığımızda görüyoruz ki, bu bit bir sayının negatif olup olmadığını belirliyor (Aynı zamanda N-flag'ın görevi). Şimdi bir örnekle relatif adreslemede adres farkını hesaplamayı görelim. Dallanma sırasında program sayacının içerdiği bir sonraki komutun adresi olur. Örneğimiz şu: Şartlı dallanma komutumuz
$C47A adresinde duruyor ve biz $C4BF adresine dallanmak istiyoruz.
$C47A Şartlı dallanma komutunun adresi $C47C Bir sonraki komutun adresi $C4BF Varış adresi
Şimdi basit bir çıkartma işlemi bize varış ile çıkış adresi arasındaki farkı verecektir:
$C4BF - $C47C = $43 Yani şartlı dallanma komutumuz için operand byte'ımızın değeri $43'müş. Bir örnekle de geriye doğru sıçramayı inceleyelim. Diyelim ki $C440 adresine dallanacağız. Burada farkı belirlemek için değişik yöntemler söz konusu. İlk yöntem bildiğimiz çıkartma işlemi, fakat sonuçta negatif bir sayı elde ediyoruz. $C440 - $C47C = $FFC4 (elde var) Elde ettiğimiz sonucun düşük değerli byte'ı yani $C4 işimizi görecektir, o'nu operand olarak kullanabiliriz. Diğer bir yöntem ise pozitif çıkartma işlemini yapmak ve ikili eşleniğini (komplementini) bulmak.
$C47C - $C440 = $3C Bunun ikili eşleniği:
9900111100 9011000011
1
011000100 $C4
Gördüğünüz gibi gene $C4 değerini elde ettik.
Relatif adreslemenin bize sunduğu avantajlara gelelim: Öncelikle üç byte
A yerine iki byte kullanarak belli bir ölçüde hafızadan tasarruf ediyoruz. (Bazılarınız bu tasarrufu küçümseyebilir. Fakat şöyle bir açıklama kuşkuları giderecektir. Coğu compiler'ın ürettiği kod'da bu komutlar o kadar yoğundur ki bu komutlar üç byte'lık olsaydı program 05 ila 707 uzayacaktı.) Relatif adreslemenin en önemli avantajı absolut değerler içermemesidir. Adresler çıkış yerine bağıl (izafi) uzaklıklarına göre belirtilir. Şayet bu program parçasını hiç değiştirmeden başka bir bölgeye taşırsak çıkış ve varış komutları arasındaki fark değişmeyecektir (Fakat absolut adresler değişecektir). Şayet absolut adres kullanmış olsaydık bu adreslerin de kaydırma işlemi sonunda yeni baştan elden geçirilmesi gerekirdi. Halbuki relatif adreslemede böyle bir sorun olmadığı için üretilen program “transportable'- dır, yani başka bir bölgede de çalışabilir. (Tabii bu ölçü programın içinde kullanılan diğer programlama yöntemlerine de bağlıdır.) Relatif adreslemenin dezavantajlarına bakarsak tek dezavantajın sınırlı adresleme kapasitesi olduğu görülür. Şartlı dallanma komutuna göre 128 byte öne veya 126 byte geriye sıçrayabiliyoruz. Pratikte bu durum pek sorun teşkil etmez. Nedeni ise daha uzun mesafelere sıçrama gereksiniminin pek az meydana çıkması. Eğer relatif adreslemede operand hesaplamayı çok karışık bulduysanız, size sakin olmanızı tavsiye ederiz. Çünkü hemen hemen hiçbir zaman bu operand'ı siz hesaplamayacaksınız. Kullanacağınız tüm yardımcı programlar (gerek monitör programı, gerek assembler programı) bu işi üstlenirler. Siz bu komutları kullanırken sadece varış adresini verirsiniz, o program da o adresin izin verilen bölge içinde olup olmadığını kontrol eder, şayet mümkün değilse sizi uyarır. Eğer mümkünse gerekli kodu üretir ve işleme devam eder. Şimdi bu dört flag'a göre şartlı dallanma komutlarını görelim:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 21
Zero flag'ına göre dallanma
Zero flag'ı yanık olduğu durumda dallanmak istiyorsak “branch on egual” komutunu kullanmamız gerekir, kısaltılmışı BEO. Zero flag'ı sönükken dallanmak istiyorsak “branch on not egual” komutunu kullanacağız, kısaltılmışı BNE.
Carry flag'ına göre dallanma
Carry varsa dallanmak için “branch on carry set” yani BCS komutunu, carry yokken dallanmak için ise “branch on carry clear” yani BCC komutuni kullanmamız gerekmektedir.
Negative flag'ına göre dallanma
N-flag'ı yanıkken sıçramak için on minus' yani BMI komumutunu kullanmamız gerekmektedir. “branch on plus' yani BPL komutunu kullanmamız gereklidir.
Overflow (taşma) flag'ına göre dallanma
Taşma varken dallanmak için *branch on overflow set” yani BVS komutunu taşma yokken dallanmak için BVC komutunu kullanmamız gerekir. Bu gruptaki komutlar genelde diğerlerine göre daha seyrek kullanılır. Aşağıdaki tabloda tüm şartlı dallanma komutlarını ve kod'larını bulacaksınız.
Komut Komut kodu $FO BNE $DO BCS $BO . BCC $90 BMI $30 BPL $10 BVS $70 BVC $50
8. Sıçrama Komutları
Bir önceki bölümde gördüğümüz şartlı dallanma komutlarının tersine belli bir (absolut) adrese giden komutlara sıçrama komutları denir. Bu komutlar herhangi bir şarta bağlı değildir ve her seferinde yürütülürler. Sıçrama komutları absolut adresleme ile kullanıldığı gibi daha evvelden kısmen tanıdığımız başka bir adresleme tipine de sahiptir. İndirekt adreslemeli sıçrama. Bu komutun hemen arkasından gelen adres varış adresi değildir. Bu adres, varış adresini gösteren bir göstergecin adresidir. Burada varış adresi peşpeşe gelen iki Byte'ta daha evvelden tanıdık olduğumuz göstergeç formatında (Lo-Byte, Hi-Byte) bulunur. Bir örnekle görelim:
JMP ($0302) $0302'deki göstergeç üzerinden indirekt sıçrama.
Bu emir yürütülürken varış adresi $0302 ve $0303 adreslerinin içeriğinden oluşturulur. Diyelim ki orada $40 ve $C8 bulunsun, böylece programımız $C840 adresine sıçrar ve oradan devam eder. Bu adresleme tipi yalnızca JMP komutuna aittir. Varış adresi olarak aletinizin mümkün olan tüm adreslerini belirtebilirsiniz. Aşağıdaki tabloda her iki komutun adresleme
- tiplerini ve emir kodlarını bulacaksınız: Adresleme tipi JMP absolut $4C indirekt $6C
COMMODORE 64'ün işletim sisteminde indirekt adresleme tipi oldukça yoğun şekilde kullanılmıştır. Hafızanın üçüncü sayfasında $0300 adresinden, $0330 adresine kadar sistem vektörleri yer almaktadır. Bu vektörlerin RAM'de bulunmasının oldukça fazla avantajları vardır. En basit örnek olarak bu vektörleri değiştirerek işletim sistemi ile ortak çalışan programlar yazabilme olanağı. Böylece bilgisayara yeni bir özellik kazandıracak programlar yazmak çocuk oyuncağı kadar basit bir olay haline geliyor.
9. Sayma Komutları
Döngüler ve sayaçlar içeren kuvvetli programlama tekniklerini kullanabilmek için 6510'un özel sayma komutları vardır. Bu komutlar sayesinde gerek register, gerek hafıza birimlerinin içeriğini bir artırabilir veya bir eksiltebiliriz. Artırma komutları fonksiyon bakımından BASIC'teki NEXT komutuna benzer. Eksiltme komutlarında ise komutu ile çalışıyormuş gibi düşünün.
INX
Bu komutla X-register'ının içeriği bir artırılır. Sonuca göre N- ve Z-flag'larının içeriği değişir. BASIC'te bir örnek verecek olursak:
X-—X-41
Diyelim ki artırmadan önce X-register'ının içeriği $FF olsun. Değer olarak 256'yı gösteremeyeceğimiz için gene sıfıra döneriz. Yani kısacası X-register'ine bir toplanıyor. Fakat bu toplama sırasında C-flag'ı göz önüne alınmıyor ve sonucunda 255 geçilince C-flag'ı da etkilenmiyor. Bu örnekte sonuç olarak sıfır elde ettiğimiz için Z-flag'ı yakılır.
INY
Bu komut Y-register'ini bir artırmak için kullanılır ve Y-register'inin kullanılması dışında geri kalan her şey yukarıdaki komutla aynıdır. Bu komutun BASIC'te benzeri:
Y-Y*41
COMMODORE 64'ün ana işlem ünitesi 6510, akümülatör'ün içeriğini tek komutta bir artıran bir komuta sahip değildir.
INC
Bu komut belli bir adresteki byte'ın içeriğini bir artırmaya yarar. Sonuca göre N- ve Z-flag'ları etkilenir. Bu komutun şimdiye kadar gördüğümüz diğer komut gruplarından farkı, belli bir hafızanın içeriğinin önce ana işlem ünitesinin içine okunması, orada bir artırılması ve tekrar yerine yazılmasıdır (Read-Modify-Write). Şimdiye kadar gördüğümüz komutlar ise bir hafızanın içeriğini ya okuyor, ya da yazıyordu; hiçbiri ikisini birden yapmıyordu. INC komutu yürütülürken akümülatör'ün, X-register'inin ve Y-register'inin içeriği değişmez. BASIC'te bu işi yapan satırı şöyle yazarız:
POKE M, PEEK(M) 4 1
Burada M, artırılacak hafızanın adresini göstermektedir.