Plazma sayı 4, sayfa 57

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 57

Gecikme değeri olarak sadece $0a koymuştu oysaki. Ama artık içi rahattı. Bu raster çizgisinin çıkmamasına göre çok daha küçük bir hataydı. Elbet bulunurdu.

Hemen gecikme döngüsünü tekrar inceledi. Çok geçmeden hatayı gördü. Yine # karakterini unutmuş ve yanlış adresleme modunu kullanmıştı.

lda #$0a

ve tekrar derlediğinde artık programı çalışıyordu.

Vice komutlarının özeti

«break c000 : $c000 adresine breakpoint koy : $c000 adresinden kodu çalıştırmaya başla * Z: (breakpointe gelip durduğunda) Step-In . Step-Over * Tet: Fonksiyondan geri dön

* exit : debuggerdan çıkıp sonraki breakpointe rastlayana kadar normal çalışmaya devam et

* registers: registerların o anki değerini göster

. m c000 göster

1: c000 adresinden başlayarak bellekteki baytları

.« d c000 : c000 adresinden başlayarak kodunu listele

Şekil 3. Disassembly Penceresi

Sık Yapılan Hatalar

Bazı basit hataları nedense en tecrübeli programcılar bile sıklıkla tekrar tekrar yaparlar. Bunlardan bazıları aşağıda. Eğer programınız çalışmıyorsa ilk arayacağınız hatalar bunlar olmalı. Yaptığınız hataların en az %50'si bunlar olacaktır.

* Unutulan #: Bunu örneğimizde de gördük

* Stack hataları: Dengesiz push ve pop komutları. Eğer bir IRQ rutininde veya alt rutinde pha ve pla komutlarının sayısı eşit değil ise, yani başka bir deyişle stack'e PHA ile koyduğunuz her değeri geri almıyor veya fazladan değerler alıyorsanız. Programınız RTS veya RTI komutuna rastladığında yanlış yere atlayacaktır. Bunun sebebi de daha önce de belirttiğimiz gibi dönüş adresinin stack'te tutulması.

* İndex hataları: İndexli adresleme kullanırken (lda $c800,x gibi) iki şeyi kontrol ettiğinizden emin olun. Bu komutlar taban adresinin yanlış olduğu durumlarda veya X registerinin beklenmedik bir değer aldığı durumlarda yanlış çalışırlar. Genelde okunan tablo ebadı gözden kaçabilir. Örneğin c800 adresinden başlayan 32 baytlık bir tablonuz varsa X registeri de 0 ile 31 arasında olmalıdır. Eğer X registerindeki değer başka bir matematiksel işlemle hesaplanıyorsa bu işlemin sonucunun 0-31 arasında kalıp kalmadığını kontrol etmelisiniz

* Karşılaştırma hataları: Özellikle C64 ile ilk programlamaya başladığınız zamanlarda koşullu dallanma komutlarını birbiriyle karıştırabilirsiniz. BNE, en çok kullandıklarınız olduğu için fazla karışmaz fakat, BPL ile BCC'yi karıştırabilirsiniz bu komutların anlamlarını tam olarak anladığınızdan emin olun

Unutulan inc $d019: VIC IRQ'larını kullanırken, IRQ rutini içinde inc $d019 ile VIC'e IRQ isteminin işlendiğini bildirmezseniz IRQ rutininiz sadece bir kere çalışır

* Kendini değiştiren programlar yazarken yanlış baytı değiştirme: Genelde C64'te hız optimizasyonu olarak kendini değiştiren kodlar yazmak sık kullanılan bir tekniktir. Bunların debug edilmesi genelde daha zordur. Eğer programınız beklemediğiniz şekillerde kilitleniyorsa kodun kendi kendini değiştirdiği noktaların yakınlarına breakpointler koyarak oraları adımlamalısınız. Örneğin aşağıdaki koda bakın

ldx value lda jmpTable lo, x sta jumper lda jmpTable hi, x sta jumper 1

jumper: jmp $0000

Bu kod val değerine bakarak bir adrese atlamaya karar veriyor. Yani değişik val değerlerine göre değişik yerlere atlayacak. Fakat bunu denerseniz çalışmayacak ve debug ederseniz, jmp komutunun bozulduğunu göreceksiniz. Bunun sebebi jumper adresindeki ilk baytın JMP komutunun kendisi olması. Değişmesi gereken baytlar aslında jumper ve jumper+1 adreslerinde değil, ve adreslerinde yer alıyor.

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