Bu sayfadaki yazılar
Sayfanın metni
Sayfa 20
ASSEMBLER - /
Geçen ay sıfırıncı sayfadaki CHRGET rutinini incelemeye başlamıştık. Şimdi kaldığımız yerden devam ediyoruz. CHRGET rutini üç bölümden oluşmaktadır: 1. 0073-0079 satırları CHRGET göstergesini ilerletmektedir ve gösterdiği adresteki değeri akümülatöre yüklemektedir. 2. 007C-0084 satırları kontrol satırlarıdır. 3. 0084-008A satırları Flag (bayrak) rutinleridir. İlk bölümde karşımıza yine yeni bir şey çıkmaktadır: Kendi kendini değiştiren bir program. Akümülatörün değer aldığı adres INC $7A komutu ile 1 arttırılmaktadır. Burada arttırılan adresin alçak baytıdır. Bir sonraki satırda ise arttırma sonucunda taşma olup olmadığı (255+1) kontrol edilmektedir:
BNE $0079
Bu tekniği daha önceki sayılarımızda görmüştük. Herhangi bir taşma anında statü registerindeki Z-Bayrağı 1 ve bu durumda BNE dallanma işlemini gerçekleştirmez. BNE komutunun Offset'inin 02 olduğunu kolayca hesaplayabiliriz. Program sayacı $0077'de durmaktadır. Dallanmanın olacağı adres ise $0079'dur ve aradaki fark $02'dir. Yukarıda eğer 255 değeri aşılırsa bu adrese ait yüksek baytta bir arttırılacaktır. Bu işlem “INC $7B” satırı ile gerçekleştirilir. Bu kısacık program bölümünden
ANIL GÜL iki çok önemli şey öğrendik: 1. 16-Bit sayıların nasıl ileri veya geri saydırılacağını. 2. Bir göstergenin nasıl değiştirileceğini. CHRGET rutinin ikinci bölümünde kontrol satırları yer almaktadır. Burada kullanılan karşılaştırma komutu akümülatöre yönelik olan CMP'dir. CMP #$3A satırı akümülatördeki değerin $3A yani desimal 58 ile olan bağlantısını incelemektedir. Şimdi C-64'ün kullanım kitabının arka sayfalarından birindeki ASCII kodlarını içeren tabloyu elimize alalım. 1. Akümülatördeki ASCII kodu 58'den büyükse yani işaret sonra geliyorsa (harfler, grafik işaretleri ve bazı özel semboller) Carry = 1, N- ve Z- Bayrakları = 0 olur. 2. Akümülatörde tam 58 değeri varsa, yani işaret “:” ise Carry ve Z- Bayrağı 1 değerini alırken, N-Bayrağı 0 olur. 3. Klavyeden girilen işaretin ASCII kodu 58'den küçük ise (rakamlar, bazı özel semboller ve kontrol işaretleri) bu durumda N-Bayrağı = 1 olur ve diğer ikisi sıfır olarak kalır. Daha sonraki satırda yer alan BCS $008A ise Carry Bit'ini kontrol etmektedir: Eğer değeri 1 ise, yani eğer akümülatördeki değer 58'den büyük veya eşit ise program sayacı RTS'ye atlamaktadır. Burada akümülatör değeri ve bayrakların konumları olduğu gibi bu rutini çağıran programa aktarılmaktadır. Eğer basılan tuşun ASCII kodu 58'den küçük ise bilgisayar rutinin kalan kısmını okuyacaktır. Bir sonraki satırdaki CMP #$20 akümülatördeki değerimizi $20 = 32 (boşluk tuşu) ile karşılaştırmaktadır. Bu durumda statü registerindeki bayrakların konumları akümülatördeki değere göre aynen yukarıdaki karşılaştırmada olduğu gibi belirlenir. BEQ $0073 komutu ile program CHRGET rutininin başına dönmektedir. (Eğer SPACE tuşuna basılırsa CMP #$20 komutu Z-Bayrağını 1 yapar). Bu durumda boşluk tuşu bilgisayar tarafından atlanır ve başka bir işaret beklenir. Diğer işaretler ise CHRGET rutinin son bölümünde Flag rutinleri diye adlandırılan bir prosedüre girerler. Birbirini izleyen iki çıkartma işleminde akümülatörün değeri değişmez, sadece Carry Bit'i etkilenir. Şimdi bu aşamada neler olup bittiğini gözleyelim. SEC satırı çıkartma işlemi için gerekli hazırlığı gerçekleştirmektedir. SBC #$30 akümülatörün değerinden $30 = desimal 48'i çıkartmaktadır. Hesap işlemlerinde sayıların ikinci dereceden karşılıklarının kullanıldığını daha önce görmüştük. $30'un karşılığı 1101 0000'dır. Şimdi akümülatörde 4 rakamının ASCII kodunun (desimal 52 veya $34) olduğunu farzedelim. İşlem şu durumun (desimal 33 = $21 = 0010 0001) bulunduğunu kabul edelim. İşlem şu şekildedir:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 21
33 0010 0001 + 1101 0000 = 0001 Sonuç = 15'dir.
Sonuç olarak şunu söyleyebiliriz: Sayılara ait olanların dışındaki tüm kodlar akümülatörde negatif bir sonuç verirler ve dolayısıyla Carry Bit'i temizlenir.
Burada da $D0 = desimal 208 çıkartılmaktadır. Yalnız bu sayının ikinci dereceden karşılığı artık 8-Bit'lik sayılarla gösterilemez, zira 7. Bit'te 1 değeri bulunmaktadır (208 = 1101 0000). Fakat işimizi kolaylaştırmak için sayımızın ikinci dereceden karşılığını 0011 0000 olarak kabul edebiliriz. Burada Carry Bit'i silinecektir. Şimdi tekrar yukarıdaki ilk örneğe dönelim. Çıkartma sonucunda akümülatörde 4 değeri kalmıştı.
Şimdi $0087 satırından itibaren in-
celemeye devam edelim. SEC 0011 0100 SBC #$D0 Görüldüğü gibi tekrar ilk baştaki Komut İndeksli Adresleme Mutlak
Y
ASSN RSS SSU RİA A SRS
TİR ARA SEN SES şekildedir: 52 0011 0100 4 1101 0100 0100 Sonuç 4'dür ve artan ihmal edilir. aşmaz Diğer bir örnek olarak akümülatö- hiçbiri kullanılmaz
Tümüzde tırnak işaretinin ASCII kodu