Bu sayfadaki yazılar
Sayfanın metni
Sayfa 17
SPRITE NEDİR?
SPRITE ekrandaki yazılardan, şekillerden bağımsız donanım kaynaklı programlanabilir grafiklerdir. Kullanımı tamamen kullanıcıya kalmıştır. Yani ekranın istediğiniz yerinde gösterebilir, renklerini değiştirebilir, X ve Y eksenlerinde genişletebilir, istediğiniz şekle sokabilir, karakterlerin arkasında veya önünde gösterebilir ve animasyon yapabilirsiniz. Bütün bunları yapabilmeniz için ise bir sürü POKE komutuna ihtiyacınız olacaktır. Eğer BASIC kullanıyorsanız işiniz biraz kolay sayılır. Gerektiğinde içinde sprite komutları bulunan “basic extension” –mesela HADES BASIC– programlarını kullanabilirsiniz. Ama böyle bir programınız yoksa veya BASIC yerine assembler kullanıyorsanız bütün adresleri ezbere bilmeniz gerekecektir. C64’te fabrika çıkışı olarak 8 tane sprite olsa bile bazı demolarda onlarca hatta yüzlerce sprite’ı görebilirsiniz. Şu an için ekranda gösterilen en son sprite sayısı kaç bilmiyorum. Öylesine yazdığım bir code ile 96 tane sprite gösterdiğimi hatırlıyorum.
Bu arada not düşelim. Ekranda 8’den fazla sprite gösterme tekniğine MULTIPLEX denmektedir ve zamanı gelince “intro teknikleri” bölümünde açıklayacağım. Ayrıca sprite’ların “renkli raster şeritleri” efektiyle arası pek iyi değildir. Daha doğrusu ekranda raster şeritleri varken, şeritlerin üzerinde bir sprite göstermek isterseniz bütün zamanlamalarınız altüst olur. Bu kısa bilgilerden sonra devam edelim.
SPRITE DATALARI NEREDE BULUNUR?
Sprite’ların programlanabilir grafikler olduğunu biliyoruz. Dolayısıyla bu grafiklerin hafızada bir yerlerde bulunması gerekmektedir. Derginin 4. sayısında hatırlarsanız programlama bölümünde karakter setini anlatırken “BANK”lardan bahsetmiştik. Normalde C64 açıldığında $0000-$3FFF adresleri arasında bulunan BANK 0’ı kullanır. Bu nedenle sprite’ların grafikleri de bu adresler arasında bulunması gerekir. Sprite’lar 24 pixel genişliğinde ve 21 pixel yüksekliğindedir. Yatay eksende 8 pixel hafızada 1 byte’a karşılık gelmektedir. Dolayısıyla 24 pixel=3 byte olmaktadır. Bir sprite hafızada 21 satır*3 byte yani 63 byte’lık bir bölge kullanmaktadır. Hesaplama yaparken 64 byte olarak alınır. Fakat siz bu 64 byte’lık bölgeleri kafanıza göre belirleyemezsiniz. Bu bölgeler belli adreslerden başlamaktadır.
Bir BANK 16384 byte’tan oluşmaktadır ve bir bank içinde en fazla 16384/64=256 adet sprite bulunabilir. Bu duruma göre siz sprite’larınızın datalarını 64’ün katları şeklinde olan adreslerde tutmanız gerekecektir. Her ne kadar durum böyle olsa da BANK 0’da kullanamayacağınız adresler vardır ($0000-$03FF arası). Buralarda işletim sistemi tarafından kullanılan adresler, vektörler, yığın ve ekran belleği bulunmaktadır. Eğer çok fazla sprite kullanmayacaksanız veya sprite datalarınızın biraz dağınık olması önemli değilse bahsettiğimiz bölgelerde bazı boşluklar vardır ve buralara 4 adet sprite’a ait dataları yerleştirebilirsiniz.
Aslında $0000-$03FF arasını dilediğiniz gibi kullanabilirsiniz. $0000-$03FF arasındaki bölge 16 sprite’lık bir yer demektir (1024/64=16) ve biz bunun 13 sprite’lık bölümünü rahatça kullanabiliriz. Şimdi bu iş nasıl olacak açıklayalım. Demo veya intro yapacağımız için dolayısıyla assembler –ve interrupt– kullanacağımız için sistem değişkenlerinin çoğu işimize yaramayacaktır. Ama siz yine de bu adresleri kullanmamaya özen gösterin.
$0000-$003F : Kullanmayın, çünkü 1 numaralı adres hafızayı düzenlemek için kullanılıyor. Fakat 2 ve daha sonraki adresleri başka işlemler için rahatça kullanabilirsiniz.
$0040-$00FF : Kasete/diskete erişim yapmayacaksanız veya kursör kullanan işlemler yapmayacaksanız buraları sizindir. Üç sprite için kullanılabilir ama tavsiye etmem.
$0100-$01BF : Burası yığına ait olduğu için kullanılamaz gibi gözükse bile üç sprite için kullanabilirsiniz. Eğer programınızda arka arkaya çok fazla JSR –20 kadar– veya PHA –60 kadar– komutları kullanırsanız bu bölgeye girmeye başlarsınız. Fakat arka arkaya JSR komutu kullanmak programın anlaşılmasını zorlaştırır. Gerekirse kullanabilirsiniz.
$01C0-$01FF : Kesinlikle kullanmayın. Aksi takdirde C64’ünüz kilitlenebilir. $0200-$02BF : Kullanabilirsiniz. Üç sprite için kullanabilirsiniz. $02C0-$0300 : Burası her zaman boştur. Güle güle kullanın. Bir sprite içindir.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 16
left .byte 0 ; Sol değişken sayaç adresi right .byte 0 ; Sağ değişken sayaç adresi byte .byte 0 ; Satırdan okunacak byte için sayaç ;---------------------------------------------------------------------------------------; inv lda #$12 ; “inverse” özelliğinin kodu jsr $ffd2 ; Aktif hale getir jmp $a7e4 ; Kontrolü Basic Rom’a devret ;---------------------------------------------------------------------------------------; font jsr $73 ; Komuttan sonra bir karakter var mı beq font1 ; yoksa git jsr $b79e ; Evet var. Sayıyı veya değişkeni al cpx #$08 ; sonucu 8 ile karşılaştır bcs font_err ; 8’e eşitse veya 8’den büyükse hata komutu txa ; X registerini Akü’ye transfer et asl ; 2 ile çarp clc ; Elde bitini sıfırla adc #$10 ; #$10 (16) ile topla .byte $2c ; Bilgisayarı kandırma sayısı ☺ font1 lda #$14 ; Default Rom Karakter Set seçme değeri sta $d018 ; $D018 kontrol registerine yaz jmp $a7ae ; Kontrolü Basic Rom’a devret font_err jmp $b248 ; “illegal quantity error” mesajını yazdır. ;---------------------------------------------------------------------------------------; speed jsr $73 ; Komuttan sonra bir karakter var mı? beq norm ; yoksa git jsr $b79e ; Evet var. Sayıyı veya değişkeni al .byte $2c ; Bilgisayarı kandır norm ldx #$33 ; Normal değer. stx $dc05 ; İlgili registere yaz. jmp $a7ae ; Kontrolü Basic Rom’a devret. ;---------------------------------------------------------------------------------------; screen jsr $b79b ; Komuttan sonraki parametreyi al cpx #$02 ; 2 ile karşılaştır bcs scr_err ; büyük veya eşitse hata mesajını yazdır lda $d011 ; Ekran kontrol registerini oku cpx #$01 ; X registerinin değeri 1 beq on ; ise ekran açılacak. off and #$ef ; değilse ekranı kapat. .byte $2c ; bilgisayarı kandır on ora #$10 ; ekranı aç sta $d011 ; ekran kontrol registerine yaz jmp $a7ae ; Kontrolü Basic Rom’a devret. scr_err jmp $b248 ; “illegal quantity error” mesajını yazdır. ;---------------------------------------------------------------------------------------; delay jsr $b79b ; Komuttan sonraki parametreyi al. delay1 jsr $eeb3 ; Romdaki 1ms gecikme rutinine git dex ; X registerini 1 azalt. bne delay1 ; 0 olmadıysa tekrarla jmp $a7ae ; Kontrolü Basic Rom’a devret. ;---------------------------------------------------------------------------------------;
.end ; Programın sonu.
C64’e yeni komutlar eklediğimiz bu yazı dizisi burada sona eriyor. Program döküm ekinde listeyi bulabilirsiniz. Bir sonraki sayının program döküm ekinde ise HADES BASIC’in tamamını vereceğim. Ayrıca yeni komutlarla ilgili örnek programlar yer alacak.