C64 Türkiye sayı 7, sayfa 19

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 19

İki sayıdır intro efektleri bölümünde interruptları kullanarak bir şeyler yapıyoruz. Aslında “interrupt” konusunu intro efektlerine başlamadan önce anlatmam gerekiyordu. Ama yine de geç kalmış sayılmayız ☺ Öncelikle “interrupt” kelimesi ne demektir, C64’te ne işe yarar vs. soruların cevabını verelim. Kelime anlamı olarak “interrupt” “kesmek, akışını durdurmak, yarıda kesmek, düzenini bozmak” demektir. Bu durumda biz “interrupt” ile C64’te neyi kesiyoruz, neyin akışını durduruyoruz buna bir göz atalım. C64’ü açıp karşınıza gelen ilk ekrana bakın. İlk gözünüze çarpan yanıp sönen bir kursör vardır. Oysa C64’ün içinde bundan çok daha fazlası yapılmaktadır. C64’te sürekli çalışan bir program vardır ve bunun adı KERNAL dediğimiz işletim sistemidir. Bu işletim sistemi sürekli olarak tuşları okur, kursörü yakıp söndürür, sistem saatini günceller vs.. Hazır başlamışken biraz daha detaya inelim ve mikroişlemciden başlayalım. C64’e ilk enerji verdiğimizde aslında mikroişlemci kendi içerisinde bir şeyler yapmaktadır. Tamamen hardware kaynaklı olan bu işlemler başlamadan önce işlemci besleme geriliminin belli bir seviyeye çıkması için bekler. Ama bu bekleme çok kısa olduğu için biz fark etmeyiz. Daha sonra işlemcinin tasarım aşamasında belirlenen ve ilk enerji verildiğinde hangi adreslerden itibaren çalışmaya başlayacağı bilgisi vardır. Bu bilgiler yani ilk çalışma adresleri 6510 için vektör adres olarak tasarlanmıştır ve adreslenebilen bellek aralığının son 6 adresidir. Hardware vektör denilen bu adresler aşağıda verilmiştir.

VEKTÖR VEKTÖR ADI $FFFA 43 FE $FE43 NMI VECTOR $FFFC E2 FC $FCE2 RESET VECTOR $FFFE 48 FF $FF48 IRQ VECTOR Yukarıdaki tabloda işlemci ilk enerji verildiğinde NMI (Non maskable interrupt-engellenemez interrupt) işlemleri için $FFFA ve $FFFB adreslerinde tutulan sayıların ($43 ve $FE) gösterdiği adrese dolaylı sıçrama (indirect jump) yapar ve çalışmaya $FE43 adresinden itibaren devam eder. Aynı şekilde RESET için $FCE2 adresinden, IRQ (Interrupt ReQuest) için $FF48 adresinden devam eder. Bu arada belirteyim, RESET işlemi en yüksek önceliğe sahiptir yani o anda işlemci ne iş yapıyor olursa olsun hatta kilitlenmiş olsun hardware olarak –mesela bir reset butonu ile- bir RESET işareti geldiği anda her şeyi yeniden başlatır. Veya işlemcinin NMI, RESET ve IRQ girişlerine aynı anda işaret uygulayın önce RESET işlemleri yapılacaktır. Vektör adresleri yani $FFFA----$FFFF sabittir. Sadece bu adreslerdeki sayılar değişebilir. Diyelim ki C64 için yeni bir işletim sistemi tasarladınız. Yapmanız gereken sadece bu vektör adreslerdeki sayıları kendi NMI-RESET-IRQ rutinlerini gösterecek şekilde değiştirmek olacaktır. Neyse konuyu fazla dağıtmadan devam edelim. IRQ vektörünün gösterdiği adresten itibaren ($FF48) rutini incelediğimizde $FF58 adresinde JMP ($0314) komutunu görürüz. İşlemci interrupt işlemleri sırasında bu adrese geldiğinde $0314 ve $0315 adreslerinde tutulan sayıların gösterdiği adresten itibaren çalışmaya devam edeceğini anlar. Bu arada $0314 ve $0315 adresleri RAM’de olup bu adreslerde tutulan sayılar daha önce RESET rutininin ilk çalışması sırasında yerleştirilmiştir $0314 adresinde $31, $0315 adresinde ise $EA sayıları bulunmaktadır ve JMP ($0314) komutu bir yerde JMP $EA31 gibi çalışmaktadır. O halde neden direct jump yerine indirect jump komutu kullanılmaktadır. Bana göre cevap esnek bir işletim sistemi tasarlandığı içindir. Gerçekten de işletim sistemi tarafından kullanılan bu RAM vektör adresleri sayesinde C64 için çok güzel programlar yapılmıştır. Bu RAM vektörler sayesinde kullanıcı işletim sisteminin çalışmasını aksatmadan araya girip kendi rutinlerini aynı anda çalıştırabilir veya işletim sistemi rutinlerini kısmen devre dışı bırakabilir. Konumuz interruptlar olacağı için sadece interrupt (IRQ) vektörü üzerinde duracağız. IRQ vektörünü değiştirmeden önce mutlaka SEI komutu kullanılmalıdır. Çünkü işletim sistemi zaten o anda kendi interrupt rutinini çalıştırmaktadır. Siz $0314 veya $0315 adresinin içeriğini değiştirdiğiniz anda işletim sistemi bu vektöre uğruyor olabilir. İşletim sistemi artık rastgele bir adresten çalışmaya başlayacaktır ve belki de kilitlenecektir. Mesela siz $0314 adresine o an için $00 değerini yazmış olun ve işletim sistemi de JMP ($0314) komutunu uyguluyor olsun. İşletim sistemi normalde $EA31 adresine uğraması gerekirken birden $EA00 adresine gidecektir. Artık ne yapar, nasıl çalışır bilinmez.

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