Bu sayfadaki yazılar
Sayfanın metni
Sayfa 22
01001101
01001110
01001111
değerimiz olan desimal 52 $34'e (4 rakamının kodu) ulaştık. Carry Bit'i bu işlemler sonucunda silinmiştir. İkinci örnekte ise akümülatörde —15 değeri kalmıştı: 1111 0001 4 0011 0000
(1)0011 0001 Sonuçta yine başlangıç değerimize dönmüş olduk ($21— 33— Tırnak işaretinin ASCII kodu), yalnız bu sefer Carry Bit'i 1 değerini almıştır. Şimdi CHRGET rutininden elde ettiğimiz sonuçları sıralayalım: 1. SPACE dışındaki tüm işaretlerin kodu bu rutini çağıran programa akümülatör aracılığı ile gönderilir. SPACE'e basıldığında bilgisayar başka bir işaret bekler. 2. Rakamlar dışındaki diğer tüm işaretlerde Carry Bit'i 1 değerini almış olur. 3. Carry Bit'inden başka Z- ve N- Bayrakları da basılan tuş hakkında bazı bilgiler verirler. CHRGET rutiniyle birlikte C-64'ün işletim sistemindeki çok önemli bir alt programı da tanımış olduk. Örneğin İnterpreter programları devamlı olarak bu rutini kullanmaktadırlar. Ayrıca CHRGET rutini RAM'da bulunmaktadır ve amaca uygun olarak değiştirilebilir.
İndeksli adresleme:
İndekslemek, herhangi bir şeyin alt gruplarındaki elemanlara ayırt edici işaretler (sayı veya harf) tekabül ettirmek demektir. Örneğin matematikte ikinci dereceden bir denklemin sonuçları genellikle X1 ve X2 olarak adlandırılır. Buradaki rakamlar (yani 1 ve 2) indekstir ve X indekslenmiş bir büyüklüktür. Makine dili programcılığında da indeksli adresleme fonksiyonunu aynı şekilde kabul edebiliriz. Örnek olarak aşağıdaki komutu ele alalım: LDA $1500,X
Bu yönteme mutlak X-indeksli adresleme adı verilir. LDA'nın anlamını çok iyi biliyoruz: Akümülatörü yükle. Peki burada akümülatöre yüklenecek değer nereden alınacak? Hemen söyleyelim: $1500 artı X-Registerinin o anki değerinin belirttiği adresten. Eğer X-Registerinin değeri 5 ise $1500 + $05 = $1505 adresinin değeri akümülatöre yüklenecektir. X-Registeri $00-$FF arası sayıları kapsayabilmektedir. Dolayısıyla indeksli adresleme ile 256 adreslik bir alandan istenen adres seçilip işleme konulabilir. X-Registerinde de olduğu gibi Y-Registerinde de indeksli adresleme yapılabilir: LDX $1500,Y Bu yönteme mutlak Y-indeksli adresleme adı verilir. Yine mutlak adreslemede olduğu gibi 8-Bit'lik bir adres kullanarak “sıfırıncı sayfa” indeksli yapılabilir: LDY $2B,X veya STX $19,Y Yalnız sıfırıncı sayfa 255 bayt uzunluğunda olduğu için dikkat edilmezse bu sayfanın dışına taşmalar olabilir. Örneğin, LDA $FE,X komutunda X-Registerinin değeri 2 olursa sonuç $FE+$02=$0100 olur. Bu durumda C-64 $0100 adresi yerine $00 adresi yerine $00 adresinin içerdiği değeri akümülatöre yükler. Şimdi son öğrendiğimiz dört adresleme yöntemini kısaca özetleyelim: Mutlak X-İndeksli: Örneğin LDA $1500,X Mutlak Y-İndeksli: Örneğin LDA $1500,Y Sıfırıncı Sayfa X-İndeksli: Örneğin LDA $2B,X Sıfırıncı Sayfa Y-İndeksli: Örneğin LDA $2B,Y Bu adresleme yöntemlerinin hangi komutlarla kullanılıp kullanılmayacağı Resim 1'de gösterilmiştir. Şimdi ele almadığımız iki indeksleme adresleme yöntemini ileriki bölümlerde inceleyeceğiz.
Yeni Komutlar: BIT, CLV, NOP ve TAX, TAY, TXA, TYA
Kursumuzda şu ana kadar anlatılan konuların hiçbirinin içeriğine doğrudan doğruya dahil olmayan, fakat makine dilinde sık sık kullanılan bazı komutları şimdi inceleyeceğiz: BIT: Bu komut “Bit-Test” anlamına gelmektedir. Aslında geçen ay anlattığımız karşılaştırma komutları ile de bazı yönlerden benzeşmektedir. Örnek olarak şu satıra bakalım: BIT $1500 Burada şunlar gerçekleşir: $1500 adresinin içerdiği değer ile akümülatörün değeri AND (ve) mantıksal işlemi ile birleştirilir. Bu işlem sonucunda N-, V- ve Z- Bayrakları değişikliğe uğrarken akümülatör ve $1500 adresinin değeri değişmez. Bu son satırlarda anlatılanlar biraz karışık gelebilir. Onun için her şeyi adım adım inceleyeceğiz. Öncelikle AND (ve) bağlantısına bakalım. Şu kurallar geçerlidir: 0 AND 0=0 0 AND 1=0 1 AND 0=0 1 AND 1=1 Yani akümülatörde ve $1500 adresinde birbirine karşı gelen Bit'ler 1 ise AND bağıntısının sonucu da 1'dir. Resim 2'de AND'in doğruluk tablo-
AND 0 1 o o o 1 o 1
Resim 2: Doğruluk tablosu:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 23
Örnek olarak akümülatörde $0A ve $1500 adresinde de $09 değeri olsun. AND (ve) bağlantısı şu şekildedir: Akümülatör: $0A = 0000 1010 $1500: $09 = 0000 1001 AND: 0000 1000
Sonuç $08'dir. Z-Bayrağında işlemin sonucu sıfıra eşit olmadığı için 1 değeri görülür. Bu örnek sonucunda BIT komutuyla $1500 adresindeki değerin 1 ve 3 no.'lu Bit'lerinin 0 olup olmadığını kontrol ettirmiş olduk. Burada yardımcı sayı olarak akümülatöre yüklediğimiz $0A değerini kullandık. Sonuçta bize her iki Bit'in de silinmemiş olduğunu bildirmektedir. Böylelikle aynı yöntem kullanılarak istenen adresteki Bit'ler kontrol ettirilebilir. BIT komutunun bundan başka özellikleri de vardır. Kontrol ettirilen bellek adresinin 6 ve 7 no.lu Bitleri statü registerindeki iki bayrağa aktarılır: Bit 7 N-Bayrağına ve Bit 6 V-Bayrağına Bu şekilde örneğin istenen bir adreste negatif bir sayı bulunup bulunmadığını kontrol edebiliriz. Her üç bayrağın da Branch komutları ile sorulabileceği için BIT komutu çok yönlü olarak kullanılabilir. CLV: Bu komut “Clear Overflow-Flag”, yani “Taşma-Bayrağını sil” anlamına gelmektedir ve 1 bayt uzunluğundadır.
NOP: NOP komutunun karşılığı “No Operation”dır. Bilgisayar bu komut ile karşılaştığında hiçbir şey yapmaz. Sadece program sayacı bir sonraki satıra atlar ve bu arada 2 çevirimlik
(cycle) zaman geçer. Genelde çok kısa bekleme süreleri yaratmak için kullanılır. Ayrıca makine dili bir program yazarken belli bir alanı doldurmak için veya hata arama işleminde de kullanılabilir. Bitmiş programlarda pek yer almaz. TAX, TAY, TXA ve TYA Program yazarken bazen registerleri ve akümülatörü kendi aralarında değiştirmek gerekir. Birçok işlem (Toplama, Çıkartma ...) sadece akümülatörde gerçekleşir. Eğer böyle bir operasyonu X Registerinin içerdiği değer ile gerçekleştirmek istersek TXA komutunu kullanarak bu değeri akümülatöre kaydırabiliriz. TXA'nın anlamı “Transfer X into Accumulator” yani “X'i akümülatöre transfer et”tir. Aynı şekilde TYA, Y-Registerinin değerini kaydırırken TAX ve TAY komutları da tam ters işlemi yapmakta, yani akümülatörün değerini istenen registere aktarmaktadır. Bu transfer işleminde eski değerler kaybolur ve bir daha geri gelmez. Ayrıca bu işlemler sırasında N- ve Z- Bayrakları da değişikliğe uğrayabilir. Bu son dört komut da birer baytlıktır. Bu aylık hoşçakalın...