saptama sıkıntısından kurtarmakta- dır. Hatırlayacağınız gibi, BASIC çağrı programımız print edilecek karakte- rin değerini A-siciline yüklemişti. Ay- rıca, print edilecek karakterlerin sa- yısını X ve Y sicillerine yüklediğini de görmüştük. SİCİM utilitysi önce $FFD2'yi X kere çağırmış, sonra da içiçe X-Y döngüsünü Y kere tekrar- ladı. İçiçe X-Y döngüsünün her ge- çİşinde $FFD2 256 kez çağırılarak X 225'den 0'a indi. Böylece, SİCİM uti- litysi belirlenmiş olan karakteri tam istediğimiz gibi (X 4 256 Y) kez print etmektedir. Kernal rutinlerini öğrenmek başka programları parçalamakta da size yardımcı olabilir. Bu rutinler maki- ne dilinin en yorucu işlemlerine ko- lay bir çözüm getirdikleri için yaygın olarak kullanılmaktadır. PRG'lerde Kernal rutinleri her yönüyle tanıtılmış ve örnekler verilmiştir. Sıra $131F ile $1323 arasında gör- düğümüz veri karakterlerine geldi. Bunları yorumlamak için, M 131F 1323 yazın. Ekran Dump 1'de de gör- düğünüz gibi, bunlar bu yazının alın- mış olduğu derginin ismine tekabül ediyor. (Eğer C-64 monitörünüz AS- CII display vermiyorsa, veri bitleri- nizi kendiniz çevirmek zorundasınız) Bu veri bitleri SİCİM utilitysinde kul- lanılmamıştır, ama çoğu makine dili (utiliysi bu şekilde düzenlenir. Prog- ramın başında bir veri depolama ala- ni bırakıp, bir JMP komutuyla bu ve- rileri atlamak sık rastlanan bir uygu- lamadır. YENİDEN KONUMLANDIRMA Aslında JMP komutu ve beş veri biti SİCİM programında gerekli de- ğildir. Onları yalnızca herhangi bir makine dili rutinini uyarmak veya ha- rekete geçirmek açısından çok önemli bir noktayı aydınlatmak için kullan- dık. Herhangi bir makine dili prog- ramını harekete geçirmeden önce, ye- niden konumlandırmaya elverişli olup olmadığını tespit etmek zorun- dayız. Eğer yeniden konumlandırıl- miyorsa, çalışması için onu uyarla- mamız gerekir. JMP cümlesi tek bitliktir ($4C) ve arkasından iki bitlik bir adres gel- mektedir. Eğer BEO ve BNE (sap) komutlarının hexadecimal bitlerine bakarsanız, ikisinin de iki bitlik ko- mutlar olduğunu göreceksiniz. Bir sapmanın ikinci biti adres değil, off- set?tir. Örneğin, adres $1326'daki ilk BEO komutu şu şekildedir: 01326 FO 06 BEO $132E Disassembler FO'nun BEO komu- tu olduğunu bilmektedir. $06 (komut yerine getirilmeden önce yenilenerek $1328'e çıkmış olan) mevcut hafıza adresine eklenerek $132E elde edilir. Öte yandan $131C'deki JMP ko- mutu şöyledir: 0131C 4C 24 13 JMP $1324 $4C JMP anlamındadır. $24 $13 ise gerçek adres $134'ün “düşük bit- yüksek bit” formatındaki halidir. Bu programı hafızaya $131C4'den başka bir adreste, mesela $Cü000'de yüklediğinizi varsayalım. Bilgisayara bu programı $Cüdü'de işleme geçir- mesini söylediğinizde, programın ilk komutuyla bilgisayar adres $1324'e atlayacaktır. Programınız $CO00'- dayken $1324'te ne bulunduğunu Al- lah bilir. Büyük ihtimalle, bilgisaya- rı kapatıp yeniden başlamanız gere- kecektir. Öte yandan, diyelim ki programın yerini değiştirip yukarıda tanımlanan BEO komutu gayet güzel çalışacak- tır. Neden mi? Çünkü komutun iki biti $FO $06 sabit değil göreli bir sap- ma adresi vermektedir. Bilgisayar adres $2000'e vardığın- - Commodore da $FO'yu görür ve onu izleyen biti bir sonraki komut adresine eklenecek bir nicelik olarak ele alması gerekti- ğini anlar. BEO komutu $2000 ve $2001'de yer aldığına göre, bir son- raki komut adressi $2002'dir. İşlem- ci $06'yı $2002'ye ekleyip, (eğer sıfır flagı setse) $2008'deki komuta sapar. BEO, BNE ve tüm diğer sapma ko- mutları göreli adresler taşır ve prog- ram hafızanın neresinde bulunursa bulunsun kusursuz iş görürler. Eğer bir programın yerini değişti- rip hafızanın başka bir yerinden baş- lamak istiyorsanız, mutlaka adres kullanan tüm komutları “ayarlama”- nız lazımdır. Buna örnek olarak JMP ve JSR'yi (altrutine atla) gösterebili- riz. Mutlak adres (örneğimizdeki $FFD2 gibi) programın dışındaki bir sabit konumdaysa, değiştirilmemeli- dir. Ama (örneğimizdeki JMP $1324 gibi) yeri değiştirilen programın da- hilinde bir mutlak adres sözkonusuy- sa, düzeltilmesi gerekir. C-64 sahipleri bu programı adres $CO00 (49152)'de başlayacak şekilde yeniden konumlandırmalılar. $1324 özgün programda dokuzuncu bit ol- duğuna göre, yeri değiştirilmiş prog- ramda JMP gene dokuzuncu bite, ya- ni $C0O0O8'e gidecek. bu yüzden, JMP $1324 komutu JMP C00S şeklinde değiştirilmeli. Bunun için de, Sicim Yükleyici'ndeki ikinci ve üçüncü ve- ri maddeleri 08 CO yapılmalı (adres bitlerinin tersten depolandığını unut- mayın),. BEO ve BNE ayarlanmadan yerleri değiştirilebildiği için, bunlara ““yeni- den konumlandırılabilir” komutlar denmektedir. Bir programın “yeni- den konumlandırılabilir”” olması için yalnızca göreli sapma veya sabit ad- reslere sapmalar içermesi ve verileri doğrudan adreslememesi gereklidir. Verilerin dolaylı adreslenmesini baş- ka bir tartışmada ele alacağız. SİCİM Programını yeniden ko- numlandırılabilir hale getirmek için yalnızca ilk sekiz biti atmakla yetine- biliriz. (Zaten onlar örnek niyetiney- di.) Ama başka programlar bu kadar kolay dönüştürülemeyebilir. Bütün atlama komutlarının yanısıra, yükle- me, depolama ve hafıza değerleri üze- rinde işlem yapmaya ilişkin bütün ko- mutları incelemeniz gerekir. Genel olarak, programın yeri değiştirildi- ğinde bütün bu adresleri de değiştir- mek lazımdır.