Commodore sayı 70, sayfa 44

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 44

TABLO 1 .,C000 SEI LDA $30 STA $0314 LDA # $CO STA $0315 LDA $IB STA LDA H $32 STA $DO12 LDA # $01 STA $DOLA LDA & $00 STA $DCOE CLI RTS

BASIC'e de izin veren interrupt başlangıç rutini.

Gördüğünüz gibi bu programda

$DC0D'ye dokunmuyoruz. Çünkü bu adrese $7F verirsek, BASIC'in kendisi için kullandığı bazı interrupt'ları kapatmış oluyoruz. Introlarda neden bu adresi değiştirdiğimizi birazdan, interrupt rutinin girişini anlatırken söyleyeceğim. Bunun dışında bu rutinde size yabancılık çektirecek bir şey yok. $0314-$0315 adresleriyle interrupt rutininin başlangıç adresini, $D011-$D012 adres çiftiyle RASTER interrupt giriş satırının yerini ayarlıyoruz. $D01A'ya $01 vererek ayarlanan RASTER satırına gelindiğin-

de bir interrupt oluşmasını sağlıyoruz ve interrupt'lara izin vererek BASIC'e dönüyoruz (Zararlı yerlere elimizi bile sürmeden). Yalnız interrupt'ları bu şekilde ayarladığımızda bir problemle karşı karşıya kalırız: Interrupt rutinimize yalnızca RASTER değil, CIA 1 zamanlayıcıları da sıçrama yapar. Hatırlarsanız, bu interruptları intro'larda yaptığımız gibi kapatmamış, BASIC'in hizmetine sunmuştuk. Bu durumda, interrupt rutinimizi sadece RASTER satırına gelinmesi değil, diğer zamanlayıcıların sıfırlanması da sağlar. Yani rutinin en başında buraya gelinmesinin asıl sebebinin RASTER olup olmadığını kontrol etmeliyiz. Eğer RASTER interrupt yüzünden gelmediysek, interrupt'ın oluşma sebebi bizi ilgi- 44 lendirmiyor demektir. Bu durumda yapılabilecek en iyi şey bilgisayarın kendi pisliğini temizlemesine izin vermektir. Yani $EA31 adresine sıçrayacak bilgisayarın tuş takımını okuma ve analiz etme gibi hamallıklarını yerine getirmesini sağlamalıyız. Eğer interrupt'ın oluşmasının asıl sebebi RASTER ise, o zaman gerekli işlem neyse onu yapmalıyız. Örneğimizdeki rutinde gerekli sayıda renk şeridi koymamız ancak bu durumda gerçekleşiyor. “Teori olarak tamam da, interrupt'ın hangi sebeple oluştuğunu nasıl anlayacağız?” diye bağırmanıza hiç gerek yok. Onu da hemen açıklayacağım: Eğer interrupt rutininize girildiğinde $D019'un 7. biti (M.S.B. — Most Significant Bit - En yüksek değerli bit) 1 değerine sahipse, o zaman interrupt'ın VIC tarafından oluşturulduğunu anlarız. Yalnızca bir tek interrupt yaptırdığımız için interrupt VIC'e aitse bu interrupt'ın sebebi RASTER'dır. Bazı durumlarda VIC'e birden fazla olayın interrupt yaratmasını bildirebiliriz. Mesela RASTER'ın bir satıra varması, iki sprite'ın çarpışması veya lightpen'in sinyal göndermesi interrupt'a sebep olabiliyorsa interrupt rutininin en başında ilk olarak interrupt'ın VIC'e ait olup olmadığına bakın. Eğer VIC'inse, interrupt'ı kimin yarattığını araştırarak gerekli işlemi yapın. Daha ilerki sayılarda bu türden örnekleri de ele alacağız. Kim bilir, belki atölyenin bir yerinde bol interrupt'lı bir oyun yer almıştır. Gene konumuza dönelim. Demin BASIC ve makine dili ortak kullanılacaksa, hele bir de interrupt yapılmalıysa interrupt rutinin en başında yapılması gereken ilk işin interrupt sahibi araştırmak olduğunu söylemiştim. Örnek programın başında bunu:

Lda Bmı

RASTER'miş komutlarıyla yapıyoruz. Bmi komutu yerine:

And E $80

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