Commodore sayı 56, sayfa 46

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ı.