Plazma sayı 4, sayfa 58

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 58

* 16 bitlik değerlerin üst 8 biti ile ilgili hatalar: Bazen 16 bitlik değerlerle uğraşırken hatalar yapabilirsiniz. İlk önce her zaman iki baytı aynı şekilde anlamlandırdığınızdan emin olun (küçük bayt önce büyük bayt sonra yani little endian). Bunun dışında 16 bitlik aritmetik işlemlerde carry bitlerini doğru kullandığınızdan emin olun

Daha ileri teknikler

Önceden de belirttiğimiz gibi en çok yapılan hatalar ve temel breakpoint koyma ve kodu adımlama ile ilgili bilgileriniz zaten debug işlemlerinizin temelini oluşturacaktır. Bunun yanında elbette bazı daha ileri teknikler de mevcut. Bunların kullanımı yer yer daha karmaşık olabilir fakat zaman zaman ihtiyaç duyabilirsiniz

- Bellek erişimlerini yakalamak.

Bunun için breakpoint'lere benzeyen başka bir aracı kullanıyoruz. Vice'da bunlara "watchpoint" deniyor. Bellekte bir adrese veya adres aralığına watchpoint koyarak, oranın okunduğu veya yazıldığı anda programın bir breakpoint'e gelmiş gibi durmasını sağlayabiliriz. Bu özellikle bellekte bir bölgeye koyduğunuz kod veya data siz istemeden üzerine yazılıyorsa ve siz bunu yapanın kim olduğunu bulmak istiyorsanız çok işinize yarayacaktır.

watch store $0314

Bu komut 0314'e bir değer yazılınca durulmasını sağlar.

watch load $1000

Bu komut 1000 adresinden okuma yapınca durulmasını sağlar.

- Trace

Bu da breakpoint ve watchpoint'lere benzer şekilde "tracepoint" adı verilen bir aracın kullanılmasıyla olur. Yine istediğiniz adreslere tracepoint'ler koyarsınız. Ardından programı çalıştırdığınızda CPU tracepoint'lere rastladıkça adresini yazar. Böylece bu yazılan adreslere bakarak programın çalışırken nerelerden geçtiğini görmüş olursunuz. Yani programın yürüdüğü yolu takip edebilirsiniz. Bu da genelde kilitlenmelerde işinize yarar. Kilitlenmeden önce programınızın hangi noktalardan geçtiğini öğrenebilirsiniz. Bunun için trace komutunu kullanmanız yeterlidir.

trace c000

Bu komut c000 adresine bir tracepoint koyar.

- Karmaşık breakpoint'ler

Bir diğer konu breakpoint'lerinizi koşullu yapabilirsiniz. Bazen büyük döngülerin içinde her defasında uğramak istemediğiniz yerlere breakpoint koymanız gerekir. Bu zamanlarda breakpoint'in sadece belli koşullarda durmasını sağlayabilirsiniz. Bunun için condition komutu kullanılır. Önce normal şekilde breakpoint konulur. Bu noktada oluşturulan breakpoint'in numarasına bakılır. Ardından aşağıdaki şekilde koşul tanımlanır:

condition 2 if .X==7

Bu örnek 2 numaralı breakpoint'in yalnızca X register'ında 7 değeri varken programı durdurmasını sağlar.

Başkalarının programlarını incelemek.

Son olarak, çok faydalı bir öğrenme yolu olan başkalarının kodunu disassemble etmekten kısaca bahsedeceğiz. Genelde C64'te hoşunuza giden ilginç bir demo efekti veya eklentiler yapmak istediğiniz tool'lar olabilir. Bunları disassembler'da inceleyip anlamak sabır ve tecrübe ister ama bir yerlerden başlamak gerekir. İşte başlangıç için birkaç ipucu:

(Hunt) komutu: Bu komut ile bir adres aralığında istediğiniz uzunlukta bir bayt dizisini arayabilirsiniz. Örneğin h 0800 d000 78 a9 komutuyla 0800-d000 adresleri arasında 78 a9 baytlarının arka arkaya geldiği yerleri ararsınız. Neden 78 a9 örneği verdik? Çünkü 78 sei komutudur, a9 ise lda komutudur. Bu komutla bellekte bir demo rutininin IRQ hazırlığını yaptığı bölümü bulabilirsiniz. Ardından çıkan adresteki kodu disassemble ederek takibe başlayabilirsiniz. Böyle başka aramak isteyebileceğiniz komutlar sta $0314, sta $d012 olabilir. Aynı şekilde ilginizi çeken bir rutin bulduktan sonra o rutinin adresine nereden jsr veya jmp yapıldığını da arayabilirsiniz.

m d000 komutu: Bu komut daha önce anlattığımız m komutu yani bellek adreslerine bakmak için. Tabi çoğu zaman d000 adresinde I/O bölgesi aktif olduğu ve VIC çipinin register'ları orada olduğu için m d000 komutu çok faydalıdır. Bize VIC çipinin o anki durumunu verir. Mesela d015 adresine bakarak sprite'ların kullanılıp kullanılmadığını, d018 adresine bakarak video matris ve karakter bankları için hangi adreslerin kullanıldığını öğrenebilirsiniz.

sta d011 aramak: Demin bahsettiğimiz h komutuyla d011 erişimlerini arayabilirsiniz. Neredeyse bütün VIC efektlerinde d011 erişimleri kullanıldığı için bu şekilde kolaylıkla IRQ rutinini bulabilir ve Crossbow'un cycle artırma tekniklerini öğrenebilirsiniz.

* Defter ve "çağırma grafiği": Son olarak eğer bir programı tamamen anlamak istiyorsanız, detaylı bir şekilde hangi adresteki hangi rutin kimi çağırıyor oturup bir deftere çizelge olarak çizmeniz gerekir. Maalesef genel olarak efektleri dışında komplike araçları, oyunları veya matematiksel demo efektlerini bu şekilde anlamak hayli zordur. Ama tecrübeniz arttıkça şansınız artacaktır.

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