Commodore sayı 78, sayfa 37

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 37

geliyor. Diğer sprite'ların datalarını da sırasıyla $C7F9, $C7FA, vb.'ne yazacağım: “2) Niçin? İlk olarak grafik datalarının bank başından ne kadar ileride olduğuna bakarız: $B000-$C000 = $2000. Bunun 64'de birine bakalım ne çıkacak: $2000/$40 = $80! Ne ilginç. Bizim $80 buradan geliyormuş demek! “Hadi bakalım yola devam edelim. Şimdiye kadar neleri ayarladık? X, Y koordinatları tamam. Renkler tamam. Grafik datalarının yeri tamam. Evet, sprite'ları bitirdik. Bir de gösterdik miydi bitecek işimiz. Hadi yazalım $D015'e. Şimdi elektron ekranın üstüne çıkana kadar sabırlı sabırlı beklemeliyim. $D011'de bir yerlerde elektronun nerede olduğunu da öğrenebilirsin demişlerdi bana. Son biti miymiş, neymiş? En iyisi son bit temizlenene kadar bekleyeyim de göreyim. (BMI, son bit 1 olduğu sürece dallanır). Ne güzel, ekranın tepesine vardım. Şimdi yeni Y koordinatlarını gireyim bakalım: Y'ler 10 olsun! “Renkleri $C1E0'dan alıp yerine yazdıktan sonra bir tek işim kalıyor: Grafik datalarını $E200'dan alınacak şekilde ayarlamak. Sprite'lar gerekli yerde görünürler artık. “Son işim ekranın başından biraz önceye kadar beklemek artık. Ekrana girmeden hemen önce eski sprite verilerini de yerleştiririm, bank'i düzeltirim ve $EA31'e sıçrayarak kontrolü Commodore'a geri veririm. “Ben bu işi saniyede 20 kere yapıyorum. Ağır iş yaptığını söyleyenlere duyurulur. Bu arada normal BASIC zamanının yüzde 30-yüzde 50 arası bir miktarını çalıyorum, ama o bunu kaldırabilir. Bir tek KERNAL beni çekemiyor. Program yüklemeye kalktığında beni görürse intihar ediyor. Tabii ki beni de birlikte götürüyor. Lütfen bu fırsatı ona vermeyin. $C200'ı kullanarak beni bir süre için kapatabilirsiniz. $C000'la yükleme sonrası geri açarsanız sevinirim. Beni kullandığınız için teşekkürler. Artık sözü babama bırakıyorum.” Sağ ol, programcık. Geri kalan birkaç rutini açıklamam gerekiyordu benim de. İlk olarak $C100'da yer alan basit bellek doldurma rutinini anlatayım. $FB-$FC'yi $E000'ı gösterecek şekilde ayarlıyorum, bu adresi indeksli şekilde 255 kere temizletiyorum. Böylece $E000-$E0FF arasını sıfırlamış oluyoruz. Şimdi $FC'yi bir artırmalı ve değeri #$E4 olana kadar temizleme işlemine devam etmeliyiz. Bu sayede $E000-$E3FF arasını temizlemiş oluruz. Bu rutincik de böylece aradan çıkar. Programın can alıcı rutinlerinden birine geldi sıra. Yani bir karakter dizisinin içinde yazan yazıyı grafik datası olarak sprite'lara yerleştirme rutini. Bu rutin karakter ROM'una erişirken ortalığı karıştırdığı için başlamadan hemen önce kullanıyor. Bu yüzden border açıkken kullanılırsa bir-iki ekran taraması süresince ortalığı karıştırabiliyor. Hemen sonra $01'e yazarak $D000'da karakter ROM'unu bulabilmeyi garantiliyoruz. Bundan sonra yaptığımız işlemler biraz karışık gelebilir size (en azından bana öyle geliyor). Burada karşılaşacağımız en büyük problem, sprite'ların grafik datalarının garip dizilişi. Rutinde uzunluk ve hız dengesini kurmak için çok uğraştım. Eğer her şeyi tablolara yerleştirmeye kalksaydım, bu rutinin en az 5-7 katı hızlı bir rutin ortaya çıkabilirdi, ama rutin de $C600 sınırlarına dayanırdı herhalde. Bu yüzden sadece n'inci (n = 0..23) karakterin grafik datasının ilk baytını hangi adrese yerleştireceğimi tutan bir tablo yaptım. Bu tablo 24 bayttan oluşuyor (oldukça kısa yani). Bunun yanında, sırtımızdan da ağır bir yükü kaldırıyor. Bu rutini alta ya da üste yazı yazarken kullanmayı düşünüyoruz. Bu yüzden belli adresler ya $E000 ve $E100 (alt yazı) ya da $E200 ve $E300 (üst yazı) değeriyle başlıyor işe. Bu değerleri $C180 ve $C18C'deki rutinler ayarlıyor. Sizin şu anda bakmakta olduğunuz program üst tarafı değiştirmek için ayarlanmış olan $E2 ve $E3 değerlerini içeriyor. Şimdi rutini yavaşça ve dikkatlice inceleyelim:

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