Bu sayfadaki yazılar
Sayfanın metni
Sayfa 45
Bne RASTER'miş komutlarını koyabiliriz. Belki siz de bit kontrolü yaparken bu sistemi kullanmaya alışıksınızdır. Ama yukarıdaki komutlar hem A'nın içeriğini etkilemez, hem de aşağıdakinden daha hızlı çalışır. Yukarıdaki sistemde negative flag'ini (eksi bayrağını) kullanıyoruz. Bu bayrak, kendisini etkileyen bir komut kullanıldığında (LDA gibi) bu komutun kullandığı değerin MSB'sinin değerini alır. Daha sonra kullanılacak olan bir BMI (branch on result Minus — sonuç eksiyse dallan) MSB birse, BPL (Branch on result Plus — sonuç artıysa dallan) MSB sıfırsa işlem yapar. Bu bite neden eksi biti dendiğini öğrenmek için biraz sabredin. Örneğimize geri dönersek, $D019'un son biti birse (VIC interrupt'ıysa) $C038'e sıçranıyor. Değilse KERNAL'a izin veriliyor. Buraya kadar hep yeni şeyler öğrendik atölyemizde. Şimdi ise o kadar aydır devam eden Makine Dilinin Püf Noktaları yazısının konularından yararlanma vakti geldi. Hepimiz en zahmetsiz şekilde kaç RASTER satırlık renk koyulabileceğini biliyor sanırım. Sen! Gözlükleri olan, söyle bakalım... Duyamıyorum seni. Ne? Demek elektrikler kesikti çalışamadın, ha? Sana ödev veriyorum, makine dilinin püf noktalarını daha dikkatli oku, öyle gel. Biz arkadaşlarla devam edeceğiz. En zahmetsiz şekilde ardışık yedi RASTER satırlık renk şeridi koyulacağını hatırladık sanırım. Bunun sebebi ise, her sekiz satırda bir (doğal hayatına karışılmamış bir bilgisayarda) görüntü işlemleri için bizim zamanımızdan birazının bilgisayar tarafından çalınmasıdır. Bu yüzden bu satırlara (DMA satırları) geldiğinde kurmuş olduğumuz tüm zamanlama çöker. Saatlerce zamanlama tutturmaya uğraşmaktansa iki DMA satırı arasını kullanırız sadece, olur biter. Biraz tembellikten, biraz da görsel etkiler yüzünden bu örnekte bu yedi satırın yalnızca altısını kullanacağız. Harfler yedi piksel (nokta) yüksekliğinde olduğundan, renkleri ortalamak için bunların beşini renkle, altıncısını ise ekran rengiyle harcayacağız. Sonuç olarak renk şeritlerimiz değişik beş renkten oluşacaklar. Bu beş renk karakter setinin tam ortasına gelecek şekilde ayarlanmış olacak (RASTER satırı buna göre ayarlanmalıdır). Sonuç olarak beş rengin bir karakterin tam ortasından geçmesini sağlayacak olan rutini Tablo 2'de görebilirsiniz.
Kısacık bir rutinle BASIC ekranlarına canlılık katabiliriz.
Programda sırasıyla şu işlemler yapılıyor (hoş, çoğunuzun bunu anlamış olması gerekiyor): adresinde ilk olarak rengin değiştirilebilmesi için uygun bir yere gelinmesi bekleniyor. Eğer yerini iyi ayarlayamazsak ekrandaki renkler titrer. Sonra kaçıncı rengin gösterileceğini ayarlayan sayaç (Y registeri) sıfırlanıyor ve ilk renk $C028 adresinden alınıyor. Bu renk hemen çerçeve ve ekrana veriliyor. $C048 adresinde alt satırın başına kadar bekleniyor, sayaç veriliyor. $C048 adresinde alt satırın başına kadar
Klavyeyle gezinmek için ← ve → tuşları.
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