Bu sayfadaki yazılar
Sayfanın metni
Sayfa 46
sorunu çözmek için C-64'ün tasarımcıları adresinin RASTER satırının 9. biti olarak ayırmışlar. Bu sayede $DO14 ve $DO12 adreslerini kullanarak (512) satırı adresleyebiliriz. Bu sayı da ekranınızda görünen raster satırların hepsini tanımlamaya yeterlidir. Bir RASTER INTERRUPT oluşmasını sağlamak için $DO12 adresine ve adresinin 8. bitine İnterrupt oluşması istenen satırın numarasını yazmak ve adresinin 1. bitinin değerini 1 yapmak yeterlidir. ($DO1A— $01) Bu işlemlerden sonra elektronün belirlenen satıra her gelişinde bir interrupt oluşturulacaktır.
Tablo 1: İşte bir ekranın raster numaraları. Görünen ekran 50. satırdan başlıyor ve 250. satırda sona eriyor. En alt satırın numarası belirli değildir ve TV ekranının dışında sona erer.
b) Light Pen (ışıklı kalem) interrupt'ı: C-64'ümüz aslında elektronun yalnızca hangi satırda olduğunu degil hangi x koordinatında olduğunu da bilmektedir ama elektronun ekranı tarama hızı çok yüksek olduğundan x koordinatını herhangi bir bellek alanına yazmaya vakti yoktur. Ama lightpen kullanmanın temeli elektronu belirli bir x,y koordinatında yakalamak olduğundan C-64'ün herhangi bir yolla bize x koordinatını da bildirebilmesi gerekir. Lightpen elektronu yakaladığı anda bilgisayara bunu bildirir ve bilgisayar da © andaki x koordinatını $DO13, y koordinatını da $DO14 adreslerine yerleştirir. Lightpen yalnızca her taramada bir kez elektronu yakalayacağı için x koordinatını yazmak fazla bir zaman kaybına yol açmayacaktır. Bu arada eğer $DO1A adresinde 4. bitin değerini 1 yaparsanız ($DO1A — $08) x ve y koordinatları yazılır yazılmaz bir interrupt oluşturulacaktır. Bu sayede lightpen üzerinde etkin bir kontrole sahip olabilirsiniz. c) Sprite-Sprite çarpışması: Eğer C-64'ün sekiz sprite'ından Ji ikisi birbirine değerse ve adresinin 3. biti 1 $04) değerindeyse bir inter- Tupt oluşturulur.
d) Sprite-karakter çarpışması: Eğer bir sprite herhan-
gi bir ekran karakterine değerse ve 2. biti 1 ise bir interrupt oluşur. Tabi ki. bu interruptların birkaçını veya hepsini birden kullanabilirsiniz. Bunu yapmak için adresine, yapmak istediğiniz interrupt'ların değerlerini OR'- layarak vermelisiniz. Mesela $DO1A— $05 verirseniz RASTER ve LISHTPEN interruptlarını aktive etmiş olursunuz. Bu durumda interrupt'un hangi sebepten dolayı oluştuğunu anlamak için interrupt rutininizin başında $DO19 registerinin değerini incelemeniz gereklidir. Bu adresin bit anlamları $DO1A'dakiyle aynıdır fakat interrupt hangi sebepten oluştuysa yalnızca o bitin degeri 1'dir. 2) (maskelenemez interruptlar): Aslında bu tür interruptlar konumuzun oldukça dışındadır çünkü NMI'lar genelde hardware (donanım) olaylarını kontrol etmek için yapılır. (Diskle iletişim vb.) Eğer bilgisayarınız bu tür bir interrupt yaratmak istiyorsa sizin programcı olarak yapabileceğiniz hiçbir şey yoktur. NMI kesinlikle gerçekleşir ve programa geri dönülür. Interrupt olayının mantığını kavradıktan sonra bir İnterrupt'un sizin rutininize atlamasını nasıl sağlayacağımızı tartışalım. C-64 ROM'unun en sonunda (yani $FFFE-SFFFF adreslerinde) IR© rutini vektörleri bulunur. Bir interrupt oluştuğu anda işlenmekte olan komut bitirilir ve programın kesildiği adres yığına (stack) yazılır. Bundan sonra Flag'lerin tutulduğu durum registeri de buraya yazılır ve İRA vektörlerinin gösterdiği adrese yapılir. Buradaki en büyük problem, bu vektörleri değiştirmek için ROM'u değiştirmek gerekmesidir. Bu işlemi program yardımıyla yapmak çok zor olduğundan bu vektörlerin gösterdiği adresi kontrol ederek bilgisayar yapımcıların bize bu olay üstünde kontrol hakkı tanımış olmalarını umMAMIZ gerekiyor. Eğer Kernal interrupt rutinini incelersek rutinin en sonunda bir
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 47
JMP (80314)
komutuyla karşılaşırız. Bu komut $0314 vektörü üzerinden bir dolaylı sçırama yapmaktadır. Yani RAM içinde bulunan $0314 ve $0315 adreslerinin değerini bizim rutinimizi gösterecek şekilde değiştirirsek ların oluşumu sırasında bizim rutinimize de uğranmasını sağlamış oluruz. Tabi ki rutinimizin sonunda, $0314 vektöründe önceden bulunan $EA31 adresine bir sıç- Tama yapmamız ve kontrolü tekrar KERNAL'a bırakmamız gereklidir. Eğer kontrolü KERNAL'a vermeden geri dönmek istiyorsanız (imlecin yanıp sönmesi, basılan tuşların kabul edilmesi gibi işlemlerin yapılması gereksizse sizin için) JMP SEA84 komutuyla interrupt'u terkedebilirsiniz. Bu adreste bulunan rutin yalnızca yeni bir İnterrupt'ın oluşmasına İzin verecek ve yığına Kernal tarafından yazılan değerleri geri okuyacaktır. NMI rutini için ayrılan vektör de adreslerinde bulunur. Bu kernal rutini de $0318-$0319 adresleriyle oynayarak NMI'ları da kontrol edebilirsiniz. Sanırım hepiniz yazımızın başında bahsettiğimiz Smooth Seroll programının nerede olduğunu merak ediyorsunuzdur. Program ve ayrıntılı açıklamalarını Program döküm eki'nde bulabilirsiniz. Hoşçakalın.