Bu sayfadaki yazılar
Sayfanın metni
Sayfa 22
Vedat Hallaç
Selam programcılar. Yepyeni bir sayıda, yepyeni tekniklerle karşınızdayız gene. Konuya geçmeden önce, geçen sayıda yaptığım uyarıyı tekrarlamak istiyorum. Her ay yeni konu bulmak benim için zorlaşıyor. İşin daha kötüsü, bulduğum konuların sizin işinize yarayacak şeyler olduğundan emin değilim. Bu sebeple, nasıl yapıldığını merak ettiğiniz intro ya da demo parçalarının detaylı bir açıklamasını, mümkünse programın kendisini veya ekranın bir fotoğrafını yollarsanız, size yardımcı olmaya çalışacağım. Hatta sadece yapılmış olan programları değil, yapmayı düşündüğünüz intro veya demonun başa çıkamadığınız kısımları hakkında da bilgi isteyebilirsiniz. Bu konuda mektuplarınızı Derginin 1. sayfasında yer alan Commodore Dergisi adresine, Vedat Hallaç adına yollayabilirsiniz. Katılımlarınızı bekliyorum. Bu ay, gene bir logo üzerine uygulanabilecek yeni bir efekt anlatacağım. Yapacağımız efekt, her raster satırında $D016 adresinin ilk üç bitinin değeriyle oynayarak, logoyu dalgalandırmaktan ibaret. Aslında bu efekti yaratmak için, yazı dizimin en başlarında açıkladığım renk şeritleri rutinini kullanabilirsiniz. Fakat bir taşla iki kuş vurmak amacıyla, rutinde (Exodus'un kullandığı ismiyle) saydırma tekniğini kullanarak zamanlama ayarlayacağız.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 23
Geçen ayın yazısını okuduysanız, ekranda bulunan her karakter satırının ilk pikselinde belleğe doğrudan erişim yapıldığını ve programınızın işletilmesinin kesildiğini hatırlıyorsunuzdur. Bu sebeple, her raster satırında çerçeve rengini değiştirmek için bile sabit bir zamanlama kullanamazsınız. Demin bahsettiğim DMA (Direct Memory Access — Doğrudan Bellek Erişimi) satırlarında, bekleme miktarını azaltmanız gerekir.
Daha önce anlattığım renk rutininde, her komutun ne kadar zaman sürdüğünü dikkate alarak, sekiz satırda bir belli işlemleri atlıyorduk. Tabi ki bu işi yapabilmek için her komutun kaç birim zaman harcadığını bilmeniz gerekir. Komutların işletim süresini belirtmek için CYCLE birimi kullanılır. Çok ince zamanlama ayarlarında sık sık komut CYCLE'larını hesaplamanız gerekir. Mesela border'ı (çerçeveyi) yanlara doğru açmaya çalıştığınızda bir cycle'lık bir hata yaparsanız (ki bu süre, ekranı tarayan elektronun sekiz piksel (nokta) yol alması için geçen zamana denktir), yalnızca ekranı 38 kolona indirebilirsiniz. Bu arada en kısa sürede işletilen NOP komutunun iki cycle yediğini belirtmem gerek. Anladığınız gibi oturup komut cycle'larını hesaplamaya çalışmak oldukça kafa yedirici bir iş. Bu yüzden on-onbeş cycle'dan büyük zamanlama hesaplarında komut zamanlamaları yerine şimdi anlatacağım saydırma zamanlamasını kullanmamız daha yerinde (daha doğrusu: daha kolay) olacaktır. Eh gelelim şu tekniğin ne olduğuna. Aslında oldukça basit bir tekniktir bu. Temelinde, her raster satırının değişik miktarda zamanda aşılacağı düşüncesi yatar. Her raster satırının “uzunluğu” farklı olduğu için, bu satırların her birinde değişik miktarda beklersek, yani değişik bir sayıdan geri sayarsak, kısa ve genel bir program kullanarak DMA satırlarıyla, sprite bulunan satırlarla veya herhangi bir sebeple zamanlamamıza uymayan satırlarla başa çıkabiliriz. Bu genel program, yapması gereken işi yaptıktan sonra, bir zamanlama tablosundan, bulunduğu raster satırında ne kadar bekleyeceğini okur, gerekli miktar bekler ve bir sonraki satırın işini yapmaya geçer. Tabi ki bu işi hızlı bir şekilde yapmak için bazı kurallara uymanız gereklidir. Mesela, X ve Y register'ını raster satırı sayıcı olarak kullanmak zorundasınız. Bu sayede diğer Index Register'ına (X ve Y, index register'larıdır) beklenmesi gereken süreyi yükleyebilir ve bu register sıfır olana kadar sayabilirsiniz. Bunu yapmak için her satırda yapacağınız işler için iki register ayırmalı (A ve X veya A ve Y) geri kalanı sayaç olarak kullanmalısınız. Bunun yanında sayaç olarak kullanılmayan index register'ına sadece tek raster satırı içinde gerekli değerler vermelisiniz, çünkü raster satırında yap gereken iş biter bitmez bu register'a LDY Adres,X veya LDX Adres,Y komutuyla bekleme süresi (zamanlama baytı) yüklenecek ve register'ın değeri sıfır olana kadar geri sayılacaktır. Yani birden fazla raster satırında kullanmanız gereken değerleri bu zamanlama rutininden önce herhangi bir adrese saklamanız, geri saydırma işi bittikten sonra da buradan okumanız gereklidir. Eh saydırma tekniği oldukça basitmiş değil mi? Şimdi de saydırma tekniğini kullanarak ekran renginin her raster satırında değişmesini sağlayalım. Aslında bu işi düzgün bir şekilde yaptığınız anda $D016 dalgalanmasını da yapmışsınız demektir. İlk olarak bir interrupt başlangıç rutini yazın (Mesela $C000 adresine). Yaklaşık olarak $0030 raster satırında interrupt programınız başlasın. İlk iş olarak X'i 1'den 0'a kadar saydırın (size garip gelebilir ama dediğimi yapın). Bu döngünün sonucunda X'in değeri 0 olacağı için tekrar X'i sıfırlamaya gerek kalmaz. Daha sonra herhangi bir renk tablosundan X indeksiyle (Lda Renk,X) ekran rengini alın (Renk için $C100'ı seçebilirsiniz) ve bunu doğrudan doğruya $D021 adresine yazın. Sonra Y registerine zamanlama baytını alın (Ldy Zaman,Y) ve bunu sıfıra kadar geri saydırın (Zaman için $C200'ı seçebilirsiniz). X'i bir artırın ve değeri (mesela) 40 olana kadar bu işlemi tekrarlatın. D019'un değerini değiştirin ve sıçrayın. Eh bu kadar. Şimdi asıl zor kısma geldik işte. Tüm zamanlama baytlarını ayarlamanın zamanıdır. İlk iş olarak Renk tablosunu 0,1,0,1 ile doldurun. Bu sayede ardışık iki satırın farklı renkte olup olmadığını kolayca anlayabilirsiniz. Daha sonra da zamanlama tablosunu 8 ile doldurun. Programınızı çalıştırın ve doğru çalışmadığını görün. Şimdi