Commodore 64 ile Grafik (3)
VIC'in yazmaçlarını gördükten sonra, sıra VIC'den bağımsız olarak çalışan ama grafikle ilgili bazı olayları kontrol eden çeşitli yazmaçlarla, VIC'in genel özelliklerine ve C64'ün hafıza kontrolüne geldi.
Konu 1:
Şimdi sırayla, bahsettiğimiz yazmaçları görelim: A) Sprite tanımlama göstergeçleri: C64'ün kullanabildiği 8 sprite'ın görünüşlerini belirleyen 63 hafızadaki hangi blokta (64 byte'lık grupların her biri) bulunduğunu gösteren hafıza birimleri, videoram'ın en son sekiz byte'ında yer alır. Normalde ekran hafızası (videoram) 1024-2047 adresleri ($0400-$07FF) arasında yer alır. Burada, o anda ekranda gözüken karakterlerin kodları saklanır. Ancak ekranda, 25*40 = 1000 karakter saklandığına ve 1024-2047 arasında 1024 byte olduğuna göre, en sondaki 24 byte artacak demektir. İşte bu artan 24 byte'ın son sekizi (2040-2047, $07F8-$07FF), sprite'lar için kullanılır. Ancak, daha sonra bu yazımızda da göreceğiniz gibi, VIC'in adresleme bölgesi kaydırıldığında, bu adresler değişecek ama, hep videoram'ın son sekiz byte'ı olarak kalacaktır. Çünkü videoram da, adresle-
TUNA ERTEMALP me bölgesiyle beraber kayacaktır. Her biri 0-255 arası değerler alabilen bu byte'ların sahip olduğu içeriği 64 ile çarptığınızda, o sprite'a ait görüntü tanımlamasının başlangıcının gerçek adresini bulabilirsiniz. Kolayca hesaplayacağınız gibi, 256*64 = 16384 adet byte ile toplam 16 Kbyte'a adresleme yapılabilmektedir. Bu da, VIC'in adresleyebildiği maksimum hafıza miktarıdır. Zaten bu nedenle yukarıda bahsettiğimiz kaydırma işlemine ihtiyaç duymaktayız.
B) VIC adresleme bölgesi bit'leri:
İşte deminden beri bahsettiğimiz kaydırma işleminde en önemli rolü oynayacak olan yazmaç. VIC'in 24 numaralı yazmacında gördüğünüz ve videoram ile karakter setinin başlangıç adreslerini belirten 13. bit'e kadar geliyordu. Ancak 64 Kbyte'lık bir alette 14 ve 15 numaralı bit'lere de gerek vardır. İşte bu bit'ler 56576 ($DD00) adresinin alt iki bit'idir (0 ve 1 numaralı bit'ler). Bu adres, CIA 2 olarak isimlendirilen bir başka chip'in 0 numaralı yazmacıdır ve BİT 0 ile BİT 1'in, VIC'in adresleme bölgesinin hangi 16 Kbyte'lık bölgede yer aldığını belirtir.
Dikkat edilmesi gereken bir nokta var. Bu iki bit, elektronik olarak LOW-active adıyla anılan karakteristiğe sahip. Yani 1 oldukları zaman 0 gibi, 0 oldukları zaman 1 gibi davranırlar. Örneğin 2 değerini belirtmek için %010 değil de, %001 kullanmak gerekiyor. Bu iki bit'in yukarıdaki uyarımıza kulak vererek hesaplayacağınız değerini, 16384 ile çarparak VIC'in adresleme bölgesinin başlangıcını öğrenebilirsiniz.
Konu
VIC'in özelliklerini kullanarak kabaca üç gruba ayırabileceğimiz işlemleri yapabilirsin: 1) Yüksek çözünürlükte noktasal grafik 2) Sprite'lar 3) Yazı ekranı Bir de bunların üstüne, her üç özellikle de kullanabileceğiniz iki değişik renklendirme tipi gelmektedir: 1) Normal renklendirme 2) Çokrenklilik (multicolor) Ayrıca, sadece yazı ekranı ile birlikte kullanabileceğiniz ve multicolor ile birlikte işlemeyen bir diğer renk modu daha var: — Geliştirilmiş (extended) renk modu Şimdi ana başlıklar halinde bu özelliklere değinelim:
A) Noktasal grafik: a) Normal noktasal grafik:
VIC'in 17 numaralı yazmacının 5 ve 6 numaralı bit'lerini 1 ve 22 numaralı yazmacın da 4. bit'ini 0 yaparak seçebileceğiniz bu çalışma şeklinde, grafik hafızası ile ekran gösterimi arasında doğrudan bir ilişki vardır. Her bir bit, ekrandaki bir noktaya karşılık gelir. Böylece aşağı yukarı 8 Kbyte'lık bir alan içinde 320*200 noktalık bir grafik ekranına kavuşursunuz. Bunun için aşağıdaki POKE komutlarını kullanmalısınız:
POKE 53265,PEEK(53265) OR 32
POKE 53270,PEEK(53270) AND 239
Bu alanın rengini de, 1 Kbyte'lık videoram belirlemektedir. Buradaki her byte, grafik ekranındaki 8*8'lik bir karenin rengini belirler. Şöyle ki: Eğer grafik ekranındaki bir bit 0 ise, videoram'ın alt 4 bit'i o noktanın rengini belirler (yani arka alan rengi). Eğer grafik ekranındaki bir bit 1 ise, videoram'ın üst 4 bit'i o noktanın rengini belirler (yani çizgi rengi).
b) Çokrenkli noktasal grafik: VIC'in 17. yazmacının 5 ve 6 numaralı bitlerini ve 22. yazmacın 4. bit'ini yakarak, bu moda geçebilirsiniz:
POKE 53265,PEEK(53265) OR 32
POKE 53270,PEEK(53270) OR 16
Bu durumda ekrandaki bir noktayı, grafik hafızasında yanyana duran iki bit belirler. Dolayısıyla çözünürlük 160*200'e düşer. Buna karşılık, bu geniş noktaların her biri değişik bir renk alabilmektedir. Bu durumda, o noktayı oluşturan iki bit'in sahip olduğu değer, rengin nereden geleceğini belirler:
00: 0 numaralı arka plan rengi (VIC'in 33. yazmacı) 01: Videoram'ın alt dört bit'i 10: Videoram'ın üst dört bit'i 11: Renk RAM'ı (yazı ekranının rengini veren 55296-56295, $D800-$DBE7 arası)
B) Sprite'lar: Sprite'lar, ekranda serbestçe dolaşabilen (512*256'lık bir alan içinde), büyüyüp küçülebilen, renk bilen ve sekiz tanesi birarada görülebilen yaratıklardır. 63 byte'lık bir görüntü tanımlamasına sahiptirler ve VIC'in yazmaçlarının çoğunu onlar yerler. İki tür sprite vardır (aynı anda değişik türden sprite'lar ekranda gözükebilir):
a) Normal renk: 24*21'lik bir çözünürlüğe sahiptirler. Her bir noktasının 0 veya 1 olmasına göre renk değiştirir.
0 : Saydam nokta
1 : 39-46 arası VIC yazmaçlarından, o sprite'a ait olanındaki renk koduna göre renklenir.
b) Çokrenkli: Tıpkı çokrenkli grafik ekranı gibi, iki bit ile geni: noktanın rengi bı lirlenir. Yani nürlük 12*21'e düşer, renk sayısı dörde çıkar. Bit'lerin durumuna göre renkler şöyledir:
00: Saydam nokta Ol: VİC'in 37. yazmacı 10: VİC'in 38. yazmacı 39-46 arası VIC yazmaçlarından, o sprite'a ait olanındaki renk kodu
C) Karakter gösterimi: C64'ün karakter setinde, 2*256— 512 tane karakterin sekizer byte'lik görüntü tanımlaması vardır. Her byte sekiz bit'ten oluştuğuna göre, her bir karakter 8*8'lik bir matristen oluşuyor demektir. İşte karakter gösteriminde, bilgisayar otomatik olarak videoram'dan okuduğu byte'a göre gereken 8*8'lik grafiği (yani karakterin şeklini) ekrana yansıtır. Böylece 320* 200'lük bir ekrana 40*25 karakter sı-
Commodore 64'ün Can Simidi
Green Beret ğar. Bu da bizim normal yazı ekranımızı oluşturur. Bu karakter setinin tanımlarının ve bulunduğu bölgenin değiştirilmesini ileride göreceğiz. Bu gösterimin de üç değişik türü vardır: a) Normal renk: Videoram'daki her byte, ekrandaki bir karakteri temsil etmektedir. Bir karakter, bu karakteri oluşturan bit'- lerin değerine göre renk alır:
0 : 0 numaralı arka plan rengi (33. VIC yazmacı) |: Renk RAM'ının alt dört bit'i b) Multicolor: Bu çalışma şekli oldukça ilginçtir. Bir karakterin sahip olduğu renge göre, çözünürlüğü ve renkliliği saptanmaktadır. Böylece hem normal hem de multicolor karakterleri ekranda aynı anda kullanabilmektesiniz. Eğer renk RAM'ında bir karaktere denk gelen renk kodu 0-7 arasındaysa (yani 3. bit O ise) o karakter belirtilen renkte ve 8*8 çözünürlüğünde gösterilecektir. Ancak renk 7-15 arasında ise, karakter bu kez multicolor olacaktır.
Çünkü bu renkler, renk RAM'ında 3. bit'i | yaparlar ve bu da bilgisayar için bir sinyaldir. Eğer durum böyleyse, karakterin çözünürlüğü 4*8'e düşecek ama renk sayısı da 4'e çıkacaktır. Bir yatay geniş noktayı oluşturan, karakter setindeki iki bit'in değerine göre o noktanın rengi belirlenecektir:
00: O numaralı arka plan rengi (33. VIC yazmacı) Ol: | numaralı arka plan rengi (34. VIC yazmacı) 10: 2 numaralı arka plan rengi (35. VIC yazmacı) Renk RAM'ındaki üç bit.
Bu moda geçebilmek için aşağıdaki POKE komutları gerekmektedir. Bakalım hangi yazmaçların hangi bit'- lerine ne yaptığımızı anlayacak mısınız?
POKE 53265,PEEK(53265) AND 159
POKE 53270,PEEK(53270) OR 16
c) Extended; Normal yazı ekranında, bir karakteri RVS (yani negatif) yazdığınızda, karakterin arka zeminini değiştirebilmekte, ancak içinde kalan karakterin rengi hep ekran rengi olarak kalmaktaydı. İşte bunu değiştirecek ve arka plan ile karakter renklerini her karakter için ayrı ayrı saptamayı sağlayacak bir yöntem var: Geliştirilmiş (extended) renk modu.
Öncelikle söyleyelim, karak negatif yazmak durumunda dı V. Karakterlerin çözünürlükleri 8*8 olar rak kalacaktır. Bir karakteri oluştu- Tan görüntüyü veren karakter setindeki bir bit, eğer | ise bu nokta normal renginde, yani renk RAM'ından alınan renkle (0-15) gösterilecektir. Ancak geriye kalan karakterin etrafını saran boş alanın ne renk olacağını, o karakterin videoram'da saklanan ekran kodunun en üst iki bit'i belirler. Aşagibi:
00: O numaralı arka plan rengi (33. VIC yazmacı) Ol: | numaralı arka plan rengi (34. VIC yazmacı) 10: 2 numaralı arka plan rengi (35. VIC yazmacı) 11: 3 numaralı arka plan rengi (36. VIC yazmacı)
Kullanılacak POKE'lar ise şöyledir:
KE *1265,PEEK(53265) OR 64
33270.PEEK(53270) AND 239
Konu HI: ün içinde 64 K RAM olduğu-
Ayrıca, 8 K BASIC, |
- sistem, 4 K karakter seti ve 4 K Giriş/Çıkış bölgesi vardır. Pek? bu ka dar çok hafızayı nası! ke işlem ünit ı 62 ce: , topu topu ÜR de bir alana hükme 24 K ne olacak? İşte bu sorun, haf avnı bölgesinin aynı anda k işler için lanılması ile çözülmüştür. Bunu, bir rafa üstüste konmuş benzetebilirsiniz; amacınıza uygun olan kitabı aradarı çıkarır, ckür, tekrar yetine koyarsınız. Ancak bu, raftaki belli bir bölgeyi birkaç kitap için ortak olarak kullanmanıza olmaz. Tıpkı sizin kitap seçmeniz gibi, C64'ün içinde de bir şeyin hangi hafıza tabakasının kullanılacağını belirlemesi gerekir. İşte bu işi, | numaralı yazmaç yapar. Yani POKE 1,XXX yaptığınızda, hangi tabakayı kullanacağınızı belirlersiniz. Önce hangi adresler arasının hangi işlere yarayabildiğini görelim:
yaran
$0000-$7FFF : $8000-$9FFF :
RAM a) RAM b) Takılı duran bir kartuş a) RAM b) BASIC ROM'u RAM a) RAM b) Karakter seti ROM'u ©) Giriş/Çıkış bölgesi a) RAM b) İşletim sistemi ROM'u
SA000-$BFFF :
$C000-$CFFF : $D000-$DFFF :
$E000-$FFFF :
Gördüğünüz gibi, tüm hafıza RAM olabiliyor. Ayrıca, iki hatta üç değişik amaç için ayrı ayrı kullanılabilen bölgeler de var. Yalnız bir yanlış anlama olmasın! Diyelim ki, $D000-$DFFF arasını RAM olarak kullanıyorsunuz. Bu, hafızanın bu bölüme ayrılmış olan diğer görevleri engellemez veya önceden varolan (örneğin Giriş/Çıkış bilgileri) içeriğini silmez. Bilgisayarınızın içinde, her görev için ayrılmış ayrı ayrı chip'ler vardır. Biz, sadece bunların hangisinin o anda öncelikli olduğunu belirleyebiliyoruz. Şimdi de, demin bahsettiğimiz 1. yarayacak (0-2 numaralı bitlerini) tanıyalım: SİT A) İçerik: 11
Bu durum, bilgisayarı ilk açtığınızda normal çalışmaların yürütülmesini sağlar. Hafıza bölümleri şudur:
$0000-$7FFF : $8000-$8FFF :
RAM RAM veya bilgisayar kartuş takılı açılmışsa, kartuşun içeriği
: BASIC ROM'u
$C000-$CFFF : RAM $D000-$DFFF : Giriş/Çıkış bölgesi $E000-$FFFF : İşletim sistemi ROM'u b) İçerik: 10 Eğer BASIC kullanılmayacaksa (örneğin makina dili kullanımı için yer gerekiyorsa) veya BASIC çeviricisinde bazı düzenlemeler yapılacaksa, BASIC ROM'unun altındaki RAM kullanılabilir. Eğer BASIC'i düzeltmeyi düşünüyorsanız, önceden bütün BASIC çeviricisini altındaki RAM'a kopya etmeniz gerekir. Ancak bu konu, ayrı bir yazı dizisine konu olacak kadar geniş. Yalnız bir uyarı: BİT'leri bu hale POKE komutu ile getirmeyin, BASIC, işlemeyi durduracağı için, bilgisayar komutları anlayamayıp kilitlenecektir. * Hafızamız artık şu şekilde olacaktır:
: RAM $8000-$9FFF : RAM $A000-$BFFF : RAM $C000-$CFFF : RAM : Giriş/Çıkış bölgesi $E000-$FFFF : İşletim sistemi ROM'u
c) İçerik: 01 Bu durum, bilgisayarın Giriş/Çıkış bölgesi dışındaki tüm RAM hafızasının kullanılması demektir. Sadece makina dilinde kullanılabilir.
$0000-$7FFF : RAM $8000-$9FFF : RAM $A000-$BFFF : RAM $C000-$CFFF : RAM $D000-$DFFF : Giriş/Çıkış bölgesi $E000-$FFFF : RAM İçerik: 00
Usta programcılar için 64 Kbyte RAM var artık. Tabii ki, bu durumu kullanabilmek için, bilgisayar işletim sistemi yazabilecek kadar bilgiye ihtiyaç var.
$0000-$FFFF : RAM
D) BİT 2:
Bu bit ile de, $D000-$DFFF arasındaki karakter seti ile Giriş/Çıkış bölgesi arasında seçim yapmak sözkonusu. Bu bit, 1 olduğu zaman, Giriş/Çıkış bölgesi işbaşında demektir. Burada VIC (görüntü chip'i), SID (ses üreteci), renk RAM'ı ve diğer kontrol ve haberleşme chip'lerine ait yazmaçlar bulunur:
$D000-$D3FF : VIC yazmaçları $D400-$D7FF : SID yazmaçları $D800-$DBFF : Renk RAM'ı $DC00-$DCFF : CIA 1 yazmaçları $DD00-$DDFF : CIA 2 yazmaçları $DE00-$DEFF : G/Ç 0 numaralı bölge $DF00-$DFEF : G/Ç 1 numaralı bölge
Eğer bu bit 0 olursa, artık kullanıcı karakter setindeki 4 K'lık bilgiyi okuyabilir. Ancak bu bit'i 0 yapmadan önce, bilgisayarın saniyede 60 kere yarattığı kesintileri durdurmak gerekir. Bunun için BASIC'de bir POKE komutu, makina dilinde de SEI kullanılır. Bu bölgeyle işimiz bittiğinde ise, tekrar bu bit 1 yapılmalı sonra da kesintiler CLI komutu veya bir başka POKE ile serbest bırakılmalıdır. Eveeeet... Bu bölümün de sonuna geldik. Özellikle son konunun grafikle alakasını soranlara hemen belirtelim. Grafik bilgilerimizi saklayacağımız hafıza bölümlerini, yukarıda belirttiğimiz bit'leri kullanarak, ROM'ların altına saklanmış gizli RAM'lara depolayacağız. Böylece programlarımızın rahatça çalışabildiği serbest RAM bölgeleri bize kalacak. Şimdilik hoşçakalın...
Başparmağınız birçok oyun için yavaş mı kalıyor?.. AUTOFİRE'lı joystick'i olanlar bu soruna gülüp geçeceklerdir. Fakat sizin böyle bir imkânınız yoksa bile burada vereceğimiz uygulama, bu eksiğinizi giderecektir.