C64 Türkiye sayı 4, sayfa 16

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 16

Herkese merhaba. Yeni bir bölümle daha karşınızdayız. Umarım işinize yarar. Bu bölümde sizi uzun uzun bazı rutinleri yazmaktan kurtaracak ROM adresleri ve bunlarla ilgili kısa kısa rutinler vereceğim.

C64 mühendisleri - assemblerci olanlar - bizler için zamanında birçok hazır rutin hazırlamış olup bize de bunları kullanmak düşer. İlk adresimiz ekran silme işini yerine getiren $E544.

ADRES: $E544 GÖREVİ: EKRANI SİLER KLAVYE KARŞILIĞI: SHIFT+CLR/HOME

Aslında bu adres C64'ün ilk açılışta bazı işlemleri yaparken uğradığı $E518 adresindeki rutinin bir parçası olup, "THE ANATOMY OF A C64" kitabında "CLEAR SCREEN" olarak tanımlanmıştır. Bu adres sizi bilmem kaç byte'lık bir ekran silme rutini yazmaktan kurtaracaktır.

Aşağıda bu adresi kullanmadan yapılan bir ekran silme rutini bulunmaktadır. C64'ün ekran belleği 1 KB olup 1024 ($0400) adresinden başlar ve 1000 byte uzunluğundadır. Fakat bilgisayar dilinde 1 KB 1024 byte demektir. Dolayısıyla elimizde fazladan bir 24 byte vardır ve bu 24 byte'ın son 8 byte'ı sprite pointer'ı olarak kullanılır. Ekranı silmek demek bu adreslere ASCII kodu 32 ($20) olan "BOŞLUK" karakterini yazmak demektir. Çok basit bir şekilde bir adet LDA, 1000 adet STA ve son olarak da RTS komutunu yazarsanız ekranınız çok çabuk temizlenecektir.

LDA #$20 STA $0400 STA $0401 ::: ::::: STA $07E6 STA $07E7 RTS

Gördüğünüz gibi arka arkaya 1002 adet komut yazarak ekranı sildik. Çok kolaymış değil mi? Evet ama maalesef çok uzun. Bu arada bir not düşelim, bu şekilde yazılan programlar daha hızlı çalışır ama hafızayı da yer bitirir. Nitekim 1K'lık bir bölgeyi temizlemek için 3003 byte uzunluğunda bir program yazdık. Bence hızı bir tarafa bırakıp birazcık hafızadan tasarruf edelim ne dersiniz?

LDX #$00 LDA #$20 TEKRAR STA $0400,X STA $0500,X STA $0600,X STA $0700,X INX BNE TEKRAR RTS

İşte birazcık tasarruf yaptık. Sadece 3003 byte'lık ekran silme rutini birdenbire 20 byte'a düştü. Şimdi bu rutin çok mu yavaş çalışacak? Hayır. Aslında aradaki hızı anlamak imkansızdır. Çünkü zaten makine dili komutlarının yerine getirilmesi için birkaç mikrosaniye yeterlidir. Yani siz C64'te 2 mikrosaniye süren bir komuttan 500.000 tanesini arka arkaya çalıştırırsanız sadece 1 saniye zaman harcamış olursunuz. Dolayısıyla yukarıdaki iki rutinin süreleri size aynı gelecektir.

İkinci örneğimizde aslında 1000 byte değil 1024 byte temizliyoruz. 24 byte fazla temizlik yapmanın duruma göre şöyle bir sakıncası vardır. Eğer programınızda sprite kullandıktan sonra yukarıdaki rutinle ekranı silerseniz sprite pointer'larınız bozulacaktır ve ekranda saçma sapan şekle sahip sprite'lar olacaktır. Bunu önlemenin yolu ise yukarıdaki rutinde INX komutundan sonra CPX #$FA komutu kullanmak ve STA komutlarındaki adresleri ayarlamaktır.

Neyse biz tasarruf etmeye devam edelim ve en iyisi yukarıdaki rutinlere hiç bulaşmadan programımızın başlangıcında bir JSR komutuyla ekran silme işini sessizce halledelim.

JSR $E544

İşte bu kadar. Sadece 3 byte ile koskoca ekranı temizledik, üstelik sprite pointer'larımız da bozulmadı. Peki bu nasıl oluyor? C64 aslında ekranı arka arkaya 1000 byte şeklinde temizlemiyor. Ekran silme işi satır satır yapılıyor. Eğer $E544'teki rutini incelerseniz $E55E'den itibaren aşağıdaki komutları görebilirsiniz.

E55E LDX #$18 E560 JSR $E9FF E563 DEX E564 BPL $E560 .... ... .....

İşte asıl ekran silme işi burada yapılıyor. O zaman niçin $E55E yerine $E544 adresini kullanıyoruz? İşin aslı şu: Eğer siz programınızda $D018 adresini kullanarak ekran belleğinin yerini değiştirdiyseniz - Ekran belleği 1K'lık adımlarla o anki VIC BANK içinde 16 farklı yerde olabilir- ve bu yeni ekran adresini 256'ya böldükten sonra bulduğunuz değeri $0288 adresine yazarak değişikliği KERNAL'in ekran editörüne bildirmeniz gerekmektedir. Eğer BANK değiştirmişseniz bank başlangıç adresini de eklemeniz gerekmektedir. $E544 adresi işte bu değişikliklere göre ekran adresini hesaplayıp silme işini yapacaktır. Alışkanlık olduğu için her zaman $E544 kullanılır. Aslında ekran silme işini $E536 adresini kullanarak da yapabilirsiniz. Fakat önce bir LDA komutu kullanarak ekran silindikten sonra ekrana yazılacak karakterlerin rengini değiştirme işlemini de yapmış olacaksınız.

Eğer özetleyecek olursak elimizde ekran silmek için 3 adres bulunmaktadır.

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