Bu sayfadaki yazılar
Sayfanın metni
Sayfa 22
Tahmin ettiğiniz gibi bu rutinler belirli bir sırada İşletime geçmelidir. Yani önce 4, sonra sırasıyla 41, 2 ve 3 nolu ruütinler gereken aralıkta çalıştırılabilir (bizim yaptığımız sıra da budur). Aslında en doğru sıra 1, 2, 3 ve 4. rutini sırayla işleme sokmaktır ama 4, 1,2,3 veya 3,4,1,2 gibi işletim sıraları bir fark yaratmaz. Yani burada asıl önemli olan 4 numaralı bölgede çalışan rutinin işi bitince 2 numaralı bölgenin rutininin, bu rutinin işi bitince 3 numaralının devreye girmesidir. Ne yazık ki, Şu raster satır aralığında şu rutin çalışsın, bundan sonra da bu devreye girsin.” gibi bir ayarlama yapma ve sonra da bir köşede boşluk tuşuna basılmasını bekleme gibi bir şans verilmemiş bize, Bunun yerine ilk önce çalışmasını İstediğimiz rutini tanımlıyoruz (bildiğiniz interrupt adresi ayarlama teknikleriyle) ve tuşa basılmasını kontrol etmeye başlıyoruz. (Bu örnekte boşluk tuşu kontrolü yok, O, bir ay sonraya...) Bundan sonrasını interruptla çalışan rutin içinde hallediyoruz. Rutin çalışmasını bitirdikten sonra, Jmp SEA81 komutunun olacağı yere lda —#SRaster
Sta $DO12 Lda #$9B(gerekince 1B) Sta $DO11
o
> YL?) | Nİ? Hi 3 VA, )
lda # $ Yeni Rutin Sta 503814 lda #$ Yeni Rutin Sta $0315 Jmp
Farkettiğiniz gibi sıradaki rutinin başlangıç adresini $0314-$0315 adreslerine verdik ve Başlangıç raster satırını adresine koyduk. Hatırlayacağınız gibi $DO11 adresine 1B/9B verirsek raster interrupt'ınin $OO-FF veta $0100-$0430 arasında oluşmasını ayarlayabiliriz. Bu sistemi kullanarak 1. rutini ikinciye, ikinciyi üçüncüye, üçüncüyü sonuncuya ve sonuncuyu da birinciye bağladıktan sonra bu halkaya herhangi bir yerden girersek rutinler büyük bir koordinasyon içinde çalışacaklardır. İki rutini birbirine eklemenin bir başka (fakat pek de İyi olmayan) bir yolu daha bulunuyor. Bu sistemde de,
Jmp SEA81 yerine Döngü Lda Cmp #SRaster Bne Döngü (Bce Döngü) Jmp YenikRutin
Evet bu sistem daha basit gibi duruyor. Aslında önceki sistemle yeni rutine giriş hazırlığı yapmak bundan
4 yi çok daha etkili. Her şeyden önce bizim burada yaptığımız kontrolden çok daha hassas bir kontrol yapılmasını sağlar. Ama bundan daha önemlisi, işinizin bittiği rutinden yeni rutinin başlangıcına kadar olan sürede, önemli olan raster zamanınızı basit bir raster kontrolü için harcamanızı engeller ve kontrolü gene boşluk tuşu kontrolüne verir. Ama bir-iki rutini birbirine bağlarken (özellikle de birinin sonu ötekinin başlangıcına yakınsa) bu sistemi kullanmanız sizi fazla rahatsız etmez. Size bir örnek oluştursun diye intromuzda renk koyduktan sonra, yıldız rutinine geçişte bu sistemi kullandım. (Fakat raster kontrolü renk rutininin sonunda değil, yıldız rutininin başında.) Peki bu sırayı karıştırırsanız ne olur? Çok basit; ekranınızdaki tüm bölgeler yanıp sönmeye başlar. Özellikle tepedeki renkler ve kayan yıldızlarda bu yanıp sönme çok belli eder kendini. Bunun sebebi her rutinin iki ekran taramasında bir kere çağırılmasıdır. Yani önce başlayan, sonra da $0000'da başlayan rutini çağırmaya çalışırsak, SOO4A'da başlayan rutinimiz atlanacaktır. Daha sonra $0000'da başlayan rutinden çıkıp S004A'ya geçerken de $0031'deki rutin atlanır ve bu-şekilde devam eder. Elektronu geri alamadığımız için de her rutine iki ekran taranmasında bir kez uğranır. Bu hatanın en kötü yanı hangi rutinin buna sebep olduğunu bulamamanızdır. Herhangi bir rutinde bulunan bir hata tüm sisteminizi çökerteceği için tek tek tüm rutinleri kontrol etmeniz gerekir. Aynı hatanın oluşmasının bir sebebi daha vardır ve bu yüzden intronuzda yanıp sönmelerle karşılaşırsanız gerçekten de başınız belada demektir. Her neyse, ikinci hatanın oluşma sebebi de bir rufini gerekenden geç terketmenizdir. Yani, müzik rutininiz $0032'de biterse renk koyma rutininiz çalışma fırsatı bulamaz, bunun sonucu olarak da iki ekranda bir kez çalışan bir renk rutininiz olur. Rutinlerin hangi raster satırından başlayıp hangisinde bittiğini görmek için çok basit bir yöntem göstereceğim size. Rutine -girer girmez İnc $DO26 komutunu işletip, rutinin ana yapısını bozmadan, son işlem olarak da Dec $DO020 yazarsanız, rutinin nerede başlayıp nerede bittiğini kolayca görebilirsiniz.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 23
Rutinin başında ve sonunda yeriniz mi yok? Çözüm kolay. Boş bir adrese (mesela $8000) Inc $DO20 Jmp Rutin yazın, daha sonra interrupt başlangıcını burayı gösterecek şekilde ayarlayın. Rutinin sonunu nasıl değiştirirsiniz peki?
Jmp SEA81 yerine Jmp yazın ve $8006'ya Dec $DO20 Jmp SEA81
ekleyin. Bu işlemleri yaparsanız, rutininizi hiç etkilemeden başlangıç ve bitiş yerlerini görebilirsiniz. Biraz da ilk intromuzu $0900-5898B arasında tüm rutinlerin ihtiyaç duyduğu başlangıç ayarlamaları yapılır, ekranlar tanımlanır ve interrupt başlangıcı tanımlanır. Seçtiğimiz ilk rutin top sıçramaılarının hesaplandığı bölüm, Bu kısımda top koordinatları hesaplanır, daha sonra raster kontrolü yapılmadan kayan yazının x koordinatı hesaplanmaya girişilir, bundan hemen sonra ekrandaki metnin harfleri parlatılır ve en son olarak da (tabii ki raster kontrolü gene yok) bir nota çalınır. Burada raster konirollerini koymamanın herhangi bir mecburiyeti yoktur, çünkü bütün bu işlemler, ekran çizilmeye başlamadan (raster satırı $0034'e gelmeden) bitirilir. (Fakat bazı uzun zaman yiyen notalarda bu zamanlamayı biraz kaçırdığımız için kayan yazılarda bazan bir titremeye sebep oluyoruz.) Bu arada eklemem gereken bir nokta daha var. Bir rutin çalıştığı ekran bölgesini değiştirmeye kalkarsa kesinlikle o bölgede bir titreme olur. Yani yazının geçtiği bölgede bir harf değiştirdiğinizde yazınızda bir titreme görünür, Bu sebepten dolayı ya yazı bölgesinden hemen önce ayarlamaları yapın, ya da yazı satırları bittikten sonra.