COMMODORE 64'ün BELLEK HARİTASI-7

Yazı dizimizde bu ay, C-64'ü diğer 8-bitlik bilgisayarlardan üstün kılan en büyük özelliklerden birini; grafikleri incelemeye başlıyoruz. 64'ün ROM'undaki grafiklerle ilgili bölgeleri daha önce olduğu gibi adresler halinde ele alıp örnek programlar vermeyi sürdürürken, kullanım kılavuzundan pek fazla bahsedilmeyen kısımlara da değineceğim. Buna örnek olarak bu ayki yazıda, sprite'ları (ekranda gösterebileceğiniz hareketli şekiller) yaratma konusunda pratik bilgiler bulacaksınız. Grafiklere geçmeden önce yazı dizimizin başında verdiğimiz bayt'lar ve bit'lerle ilgili bilgilere göz atmamız yararlı olacaktır. 64'te ses ve grafik kullanımı, makinenin gücünü tam olarak kontrol edebilmek için bayt'lar hakkında biraz bilgi gerektirmekte,

- DOOF

53248 Sprite 0 X konumu
53249 Sprite 0 Y konumu
53250 Sprite 1 X konumu
53251 Sprite | Y konumu
53252 Sprite 2 X konumu
$3253 Sprite 2 Y konumu
53254 Sprite 3 X konumu
53255 Sprite 3 Y konumu
53256 Sprite 4 X konumu
53257 Sprite 4 Y konumu
53258 Sprite 5 X konumu
53259 Sprite 5 Y konumu
53260 Sprite 6 X konumu
53261 Sprite 6 Y konumu
53262 Sprite 7 X konumu
53263 Sprite 7 Y konumu
Bunlar sprite kullanımında çok
önemli adresler. Bu adreslerin değer-
lerini değiştirerek bir FOR-NEXT
döngüsüyle ekranda sekiz adet spri-

te gösterebilirsiniz. Sprite'ların X konumu ekranda soldan sağa, Y konumu ise yukarıdan aşağıya hareketi ifade ediyor. Sprite tanımlarken, 0'ıncı sprite'ın adresini bir değişken olarak saklamak ve diğer adreslere bu değişkene belli sayılar ekleyerek ulaşmak çok sık kullanılan bir yoldur. Örneğin ilk adresi V değişkeni olarak saklarsanız (V = 53248) 7. sprite'ı hareket ettirmek için 53262 ve 53263 yerine V+14 ve V+15 yazabilirsiniz. Aşağıdaki program düz bir sprite yaratıyor. Yukarıda söylediğim gibi 53248'i 140. satırda olduğu gibi V'ye eşitlediğimizde sprite'ın diğer özelliklerine ulaşmak daha kolay oluyor. Adreslerin kendisi yerine değişken adları kullanmanın programınızı hızlandıracağını da unutmayın. (Program -1)

Bir sprite'ın ekrandaki konumu, genişletilmemiş bir sprite oluşturan 24x21 noktalık bölgenin sol üst köşesine göre hesaplanır. Eğer sadece bir noktayı sprite olarak kullanacak olsanız bile bu noktayı ekranın ortasında göstermek için konumu sol üst noktada başlıyormuş gibi hesaplamak zorundasınız.

DO10
53264 (V 416)

0'dan 7'ye sprite'ların 256'yı geçen X pozisyonu.

Sprite'ı yatay olarak konumlandırmak biraz karmaşıktır. Her ne kadar sprite'ınızı hareket ettirmek için yatay olarak 320 pixellik bir çözünürlüğe sahip olsanız da eğer soldan 256'ıncı pixeli geçerse (ekranın soldan sağa genişliğinin 4/5'i kadar) sprite'ın konumunu belirtmek için dokuzuncu bir bite ihtiyaç duyarsınız, çünkü bir bayt sadece 255'e kadar olan sayıları açıklayabilir. Sprite'lardan biri 256 nokta sınırını geçtiğinde, bu adresteki uygun bit açılmalı, geri dönüşte de kapatılmalıdır. Örneğin sprite 0 sağa doğru bu sınırı geçiyorsa:

POKE V+16, PEEK (V+16) OR 1 Eğer sprite 4 geçiyorsa, o zaman: POKE V+16, PEEK (V+16) OR 16 Sprite 0'ı geriye döndürürken:

POKE V* 16, PEEK (V 4 16)
OR 254

Sprite'ları konumlarken dikkat edilmesi gereken başka bir nokta da ekrandan kaybolmalarını isteseniz bile sadece belli sınırlar içinde görülebilir olmalarıdır. Bu sınırlar yani sınır parametreleri gösterim boyutlarına ve sprite'ın genişletilmiş olup olmadığına göre değişir.

SPRITE HAZIRLAMA TEKNİĞİ

Sprite'lar başka bir deyişle kendi dizayn ettiğiniz özel hareket edebilir objelerdir. Dizayn işleminden sonra bilgisayar sprite'ı hareket ettirmenize, diğer sprite'lar veya grafiklerle çarpışmaları izlemenize hatta önceliklerini yani hangi sprite'ın diğerinin önünde hareket edeceğine kadar belirlemenize yardım eder.

SPRITE DİZAYNI

Herhangi bir sprite 63 bayt bellek kullanır. Bunu her sırası yanyana üç bayt'tan oluşan 21 adet sıra olarak ifade edebiliriz. Bir bayt'ta sekiz pozisyon olduğunu bildiğimizden her sırada 24 (3 bayt x 8) boşluğumuz olduğu ortaya çıkar. Yani sonuçta bir sprite 24 x 21 noktadan oluşan bir şekildir. Kareli defterlerinizden 24 x 21'lik bir kısmı işaretleyin. Bu sprite'ınızı ifade edecek bir grid olacaktır. (Şekil - 1) Şimdi grid'i her birinde 8 kare olacak şekilde 3 eşit sütuna bölen çizgilerle ayırın. (Şekil - 2) Bu çizgiler daha sonra DATA ifadeleri için gereken bayt değerlerini hesaplamakta kullanılacak. İlk sıra ve ilk sütun şimdi şu şekilde görülecektir: (Şekil - 3) Tabii diğer 62 adet grafik (bayt) de aynı bu şekilde gözükecektir. Sprite'ın istediğiniz kısımlarını işaretlemek v.b.

Sıra 1

Sıra 2

Sıra 3

Sıra 4

(Şekil - 1)

Sıra 1 İ

Sıra 2

Sıra 3

Sıra 4

(Şekil - 2)

Sıra 1

Sıra 2

Sıra 3

Sıra 4

Sıra 1

(Şekil - 3)

Sıra 2

Sıra 3 veya açmak için, 63 bayt'ın her biri için bir DATA ifadesi yazarsınız. Eğer ilk sıranın şu şekilde görünmesini istiyorsanız: (Şekil - 4) Aşağıdaki gibi bir DATA ifadesi yazmalısınız:

Sıra 4

DATA 63,255,192

Bu şekilde kareli kâğıt üzerinde sprite'ınızı dizayn edip her sprite için bilgisayarın istediği 63 bayt'ın değerlerini hesaplayın.

SPRITE'I BELLEKTE SAKLAMA

Sprite'ı çizip DATA ifadelerini hesapladıktan sonra bu data'yı belleğe POKE etmelisiniz. Sprite'ları aşağıdaki tabloda gösterilen bellek alanlarına rahatça yerleştirebilirsiniz. Bu iş için başka alanlar da kullanılabilir, ancak bu iş için bellekte yer ayırmalısınız. Bunu yapan bir rutin için 55 ve 56 adreslerine bakın. (Şekil - 5) Eğer programlarınızı saklamak için teyp kullanıyorsanız # 13, # 14 ve 15 nolu pointer'ların gösterdiği adreslerin program yüklenirken veya saklanırken kullanıldığını hatırlayın. Bu iki işlem arada saklanan sprite data'sının değişmesine neden olur. Bu işlemlerden sonra sprite'lar datalardan tekrar okunup belleğe POKE edilmelidir. Sprite datasını belleğe POKE etmek için FOR/NEXT döngüsünü kullanın; örneğin: (Program - 2)

(Şekil - 4)

SPRITE POINTER'LARINI AYARLAMA

Her sprite'ın bilgisayara sprite'ı ekrana koymak için gereken datayı nereden alacağını anlatan bir adresi vardır. Sprite pointer'ları 2040-2047

(Şekil - 5) ADRES DATA (A) 832 13 896 14 960 15 12288 192 12352 193 12416 194 12480 195 12544 196 12608 197 12672 198 arasındaki adreslerdir ve 0'dan 7'ye kadar olan sprite'lara işaret ederler. Eğer 960 nolu adresteki sprite 0 için POKE ediyorsanız o zaman:

POKE 2040, 15

Doğru data pointer'larını bulmak için yukarıdaki tabloya bakın. Tabloyu kullanmak istemiyorsanız, data'nın bulunduğu adresi 64'e bölün.

960/64-15

Eğer 4 sprite'ın birbirinin aynısı olarak gözükmesini istiyorsanız, datayı bir kere POKE edin ve 4 sprite'ın pointer'larını aynı yeri gösterecek şekilde ayarlayın. Aşağıdaki rutin, 0, 1, 2 ve 3 nolu sprite'ları birbirlerinin aynısı olarak gösterir.

100 FOR 1—2040 TO 2043
110 POKE I, 15
120 NEXT I

RENK SEÇİMİ

Sprite'ınızı belleğe yerleştirdikten sonra sıra sprite'ın ne renk olacağına karar vermelisiniz. Her sprite'ın başta bilgisayar tarafından belirlenen kendi rengi vardır. Eğer bunu değiştirmek isterseniz aşağıdaki tablodan bir renk seçin ve sprite rengi adreslerine (55287-55294) POKE edin.

(Şekil - 6)

Sprite Orijinal Renkler

White Red Cyan Purple Green Blue Yellow Grey 2

RUN—O

ÇOK-RENKLİ SPRITE'LAR

Çok-renkli sprite'lar daha ileri bir teknikle meydana geliyor. Bu modda sprite data'sı daha farklı bir şekilde okunmakta. Çift bit'ler olarak okunan bayt'larda her bit çiftinin bir anlamı vardır. (Şekil - 7)

(00

.. 10

76) 5 4| (3 2

A B C D

A: Bit çifti bilgisayara, gereken rengi sprite renk sicilinden (55287'den 55294'e kadar, üzerinde çalıştığınız sprite'a bağlı) almasını söyler. B: Ekran rengi. C: Çok-renklilik sicili # 0 olan 53285'e POKE edilecek renk değeri. D: Çok-renklilik sicili # 1 olan 53286'nın rengi. Aşağıdaki program sprite'ı standart moddan multicolor moduna çeviriyor. (Program - 3) Sprite programlamanın öncelikler, çarpışma kontrolü gibi diğer özellikleri de oldukça basit. Kullanımları konusunda daha fazla detayı ilgili adreslere geldiğimizde vereceğim. Şimdilik öncelikler konusunda 0'ın otomatik olarak en öncelikli sprite olarak ayarlandığını ve 1'den 7'ye kadar olan sprite'ların önünden geçeceğini, diğerlerinin ise benzer bir hiyerarşi ile (1'in 2'den önünden 2'nin de 3'ün önünden geçmesi vb.) geçtiğini bilin. Ayrıca bütün sprite'lar arka plandaki grafiğe göre önceliklidirler. Eğer herhangi bir sprite'ın önceliğini değiştirmek isterseniz buna uygun sprite öncelik sicilini (adres 53275) ayarlamalısınız. Çarpışma kontrolü de bundan zor değil. Sprite çarpışma sicilleri (53278-

53279) herhangi bir çarpışma durumunda bit'leri 1 değerini alan salt okunabilir sicillerdir. Çarpışmayı kontrol etmek kolay bir olaydır, ancak bu kontrolü kodunuzda stratejik olarak, yani asıl önemli hareket döngüsü içinde yapmalısınız. Çarpışmalar bir satırla belirlenebilir. Sprite - Sprite çarpışması için:

IF PEEK (53278) AND X THEN (NE YAPMAK İSTİYORSANIZ)

Sprite - Arkaplan çarpışması için: IF PEEK (53279) AND X THEN ...

Burada X çarpışma sicilindeki bit'in ondalık değeridir. (Şekil - 8)

SPRITE* BIT DEĞER 0 0 1 1 1 2 3 2 4 3 3. 8 4 4 16 Bİ 5 32 6 6 64 7 7 128

Çok özlü biçimde bir sprite'ı nasıl yaratabileceğinizi bir algoritma olarak veriyorum. 1. bölümün A kısmı yazdığınız bütün programlar için geçerliyken kalan kısım sprite'larla ilgilidir. * ile işaretli olanlar kullanım bilginize ve sprite'larınızın nasıl görünmesini istediğinize bağlıdır. Onlar olmadan da sprite yaratıp hareket ettirebilirsiniz.

SPRITE ALGORİTMA ŞEMASI

1. PROGRAMIN DÜZENLENMESİ A) Programın Parametrelerini Bildir 1. Ölçüm dizileri a. tam sayı b. yazı c. gerçek 2. Değişmez ve değişkenleri ayarlama. B) Sprite Parametrelerini Bildir 1. Değişmezleri ve değişkenleri sprite'lara uygun olarak ayarla a. VIC+53248'in başlangıç adresi. *2. Ekranı kapat (POKE VIC+17,11) 3. Sprite datasını sakla a. data pointerlerini ayarla (adr. 2040 - 2047) b. data'yı okumak için

25

4. Sprite'ları etkinleştir (VIC+21) 5. Sprite renk sicillerini ayarla a. tek renk sprite'lar (POKE adr. VIC+39+VIC+46) b. Çok-renk sprite'lar (POKE adr. VIC+37+VIC+38) *6. Sprite renk modunu etkinleştir a. çok-renk sicilindeki (VIC+22) 4. biti aç *7. Genişletilmiş sprite'ları seç (VIC+23 ve VIC+29) *8. Ekranı yeniden aç (POKE VIC+17,27) 2. ANA PROGRAM DÖNGÜSÜ A) FOR/NEXT döngüsü için sprite hareketini ayarla 1. Sprite konumlarını PEEK et (VIC+VIC+16) a. onları X ve Y olarak çağır 2. Ne kadar uzağa hareket ettireceğini belirle a. hareket miktarını DX ve DY olarak çağır. 3. Hareketin yönünü belirle *4. Sprite çarpışma sicillerini izle (DX=-DX, DY=-DY) a. sprite-sprite çarpışması b. sprite-data çarpışması 5. Sprite'ların X pozisyonlarını, VIC+16'nın EÖB'ını POKE etmek için kontrol et. a. Yatay sınır için kontrol et. 6. Orijinal pozisyona mesafeler ekle: 7. Pozisyon yenileme döngüsünden çık. ç B) Çok sprite'lı görüntüleri değerlendir. 1. X pozisyonu 256'dan büyük olan sprite'lar tarafından belirlenen değerle VIC+16'yı POKE et. *2. Özel interrupt durumları için raster sicilini kontrol et.

Programı Düzenle

1

Düzenle hareket ediyor.

Evet mu?

Sprite'lar

Evet

Çarpışıyor mu?

Hayır

Diğer

Sprite'lar

Sprite'ların X-Konumu >256 mı?

| Hayır

İçin Raster sicilini kontrol et.

Evet Hayır

Son veya Programın ilgili başka bir bölümüne gir. Bir şey a. karışık kodlu görüntüler (bitmap modunda değişik karakterler) b. sekizden daha fazla sprite hareket ettirme c. light-pen 3. Yenilenmiş pozisyonu (X,Y) pozisyon sicillerine yeniden POKE et. 4. 2A'ya geri dön. (Şekil - 9) Bu son program sprite'ları ekranda hareket ettirebilmek için bir makine dili rutini kullanıyor. Hız seçimi 1'den 5'e kadardır. Programı durdurmak için RUN/STOP tuşuna basın. OD (Program - 4) (Program Dökümü, Döküm Eki'ndedir)

Olimpus dağında oturup aşağıdaki fanileri yönetmek herhalde eğlenceli olurdu. Electronic Arts firması da bu fikirde olmalı ki Populous oyununu üretti. Eğer strateji oyunlarından hoşlanıyorsanız ve satrançla aranız iyiyse işte uzun zamandır beklediğiniz oyun karşınızda. Birbirinden farklı beşyüz dünya yönetilmek için bizi bekliyor. Bu dünyada yaşayan insanlarımızı çoğaltırken doğal olarak rakibin insanlarını yok etmek hedefimiz olacak. Bunu yaparken, volkan-