Commodore 64 ile Grafik (7)
Retro bilgisayarBugüne kadar, altı bölüm boyunca, Commodore 64'ün grafiksel yeteneklerinin başmimarı, görüntü sorumlusu VIC'in içini dışını, neler yapabildiğini gördük. Tüm yazmaçlar, bellek kontrolü, grafik, sprite derken, sıra onun en son yeteneğine geldi. Bu kez, karakter seti kullanımını, onu renklendirmeyi ve yeni karakterler tanımlamayı öğreneceğiz. Her zamanki gibi, dergimizin 10. ve 12. sayılarında yayınladığımız, grafik dizimizin 2. ve 4. bölümlerini elinizin altında bulundurun.
Bilgisayarınız, sizin her tuşa basışınızda, bastığınız tuşun kodunu, daha önce de gördüğümüz, normalde $0400-$07FF (1024-2047) adresleri arasındaki videoram'a kaydeder. VIC de, ekrandaki görüntüyü yaratırken bu hafıza bölgesindeki bilgiden yararlanır ve sizin devamlı olarak ekranda gördüğünüz görüntüyü oluşturur; hem de saniyede 20 kere. Böylece, görüntünün devamlılığı sağlanır. Videoram aynı zamanda, eğer noktasal grafik kullanıyorsak, ekrandaki noktaların rengini belirler. Bunu daha önce görmüştük. Bu ayki konumuzla pek fazla ilgisi yok. Videoram'da saklanan, karakterlerin ASCII kodları değildir. Commodore 64'ün el kitabında da bulabileceğiniz ekran POKE komutlarıdır. Örneğin ekranın sol üst köşesinde A harfi varsa, PEEK (1024) işlemi sonucunda elde edeceğiniz değer 1 olacaktır. Bu noktada, ekran POKE kodlarını biraz inceleyelim. 0-255 arası kodlamaya bakarsak, karakterlerin yanısıra, birtakım kontrol karakterleri de görürüz. Bunlar ekranda hiçbir karakter oluşturmazlar ancak, renk değiştirme, negatif yazıma başlama gibi işlemleri gerçekleştirirler. Ekran POKE kodları ise daha farklıdır. 0-255 arası kodların tamamı karakterlerle doldurulmuştur. Bunun başlıca sebebi, normal karakterlerin yanısıra negatif gösterimdeki karakterlerin de birer koda ihtiyaç duymaları. Böyle bir ayrımın yapılmadığını farzedelim. Bu durumda, VIC, ekrandaki görüntüyü oluştururken videoram'ı okuduğunda elde ettiği bir değerin normal mi, yoksa negatif bir karaktere mi ait olduğunu nasıl anlayacaktı? Bu nedenle 0-255 arası kodların ilk yarısı (0-127) normal karakterlere, ikinci yarısı da (128-255) negatif karakterlere ayrılmıştır. Bu size bir de kolaylık sağlamaktadır. Eğer ekrandaki herhangi bir bölgeyi negatif hale getirmek istersek, videoram'daki o bölgeye ait değerleri PEEK ile okuyup, 128 toplayıp, yeniden yerine POKE etmemiz yeterli olacaktır. PRINT komutunu kullanarak negatif yazmak istediğimizde, RVSON (karakter kodu 18) ve RVSOFF (karakter kodu 146) tuşlarını kullandığınızı hatırlarsınız. Sıra karakterlerin rengine geldi. Birazdan bahsedeceğimiz renk kodlarının hepsinin 0-15 arası rakamlar olduğunu ve her birinin Commodore 64'ün 16 renginden birine karşılık geldiğini gözönüne alın. Şimdi devam edelim. Renk RAM'ı olarak isimlendirdiğimiz, daha önce de noktasal grafikte çok renklilik kullandığımızda işimize yarayan bu bellek bölümü $D800-$DFFF (55296-56295) adresleri arasında bulunmaktadır. Bu bölgeyi, BANK adreslemeleriyle oynayarak değiştiremeyeceğimizi geçmiş bölümlerden biliyor olmalısınız. Bu bellek kısmında, ekrandaki her pozisyona bir byte ayrılmıştır (tıpkı videoram gibi). Örneğin 55296'nın içindeki değer ekranın sol üst köşesinin renk kodunu içerirken, 55297 onun hemen sağındaki karakterin, 56295 de ekranın sağ alt köşesinin rengini belirler. Bu noktada, belki de bugüne kadar dikkatinizi hiç çekmemiş bir konuyu açıklamak istiyoruz. CLR tuşuyla ekranı sildiğiniz zaman Commodore 64, renk RAM'ını baştan aşağı belli bir renk koduyla doldurur. Önemli olan bu renk kodunu nereden aldığıdır. Commodore 64'ün belli bir modeline kadar bu renk kodu, 53281 adresinde bulunan, yazı ekranının rengi olmaktadır. Daha sonra üretilen Commodore 64'lerde ise bu kod, o anda geçerli olan karakter kodunu saklayan 646'dan alınmaya başlandı. Bu değişikliğin ne gibi sonuçları oldu? Eski Commodore 64'te ekranı sildikten sonra 1024-2047 arasına bir değer POKE edildiği zaman bu görünmemekteydi. Çünkü o ekran pozisyonunun karakter rengi, ekran rengiyle aynı olmaktaydı. Tıpkı siyah kalemle siyah kâğıda yazı yazmak gibi. Daha sonra çıkan modellerdeki değişiklik ise şuna yolaçtı: Diyelim ki CLR yapmadan önce kırmızı renkle yazı yazıyordunuz, CLR yaptıktan sonra da ekrana bir şey POKE ettiğinizde, ekranda kırmızı renkle görünecektir. Eski modellerde bu olmayacağı için, CLR'den sonra 55296-56295 arasının da bir renk ile dolması gerekmektedir. Tabii bunun da kolay bir yolu var. Diyelim ki ekranı POKE yaptığınızda karakterlerin sarı olmasını istiyorsunuz. Bu durumda önce POKE 53281,7 ile ekran rengini sarı yapın, sonra ekranı silin.
Bu arada renk de sarı rengin koduyla dolacaktır. Sonra da ekranı tekrar eski rengine döndürün. FOR...NEXT döngüsü içinde renk RAM'ının 1000 elemanına POKE yapmaktan çok daha hızlı bir yöntem bu. Eğer elinizdeki model eski ise ve bazı programlar arkadaşınızda görüntü verirken sizde vermiyorsa, programın gerekli yerlerine bu tip bir satır ekleyin. Faydasını göreceksiniz... Bu minicik (!) ayrıntıdan sonra konumuza devam edelim. Herhalde yazı ekranının renginden VIC'in 33 numaralı yazmaçının (53281) ve çerçeve renginden de 32 numaralı yazmaçın (53280) sorumlu olduğunu belirtmeye gerek yok. Biz daha ciddi konularla ilgilenelim. Commodore 64'ün içinde iki karakter seti vardır. Birisi büyük harfleri ve grafik karakterlerini kapsar. Diğeri de küçük ve büyük harfleri kapsar ve grafik karakterlerinin bir kısmının yerini harfler alır. Bu iki karakter seti arasında, SHIFT ve COMMODORE tuşlarına aynı anda basarak gidip gelebilirsiniz. Her bir set 256 karakter içerir. Yani hafızada toplam 512 değişik karakter tanımlaması bulunmaktadır. Her bir set de kendi içinde ikiye ayrılır. İlk yarısı karakterlerin normal görünüşlerini, ikinci yarısı da negatif görünüşlerini taşır. Bu size bir şey hatırlattı mı? Yukarıda bahsettiğimiz ekran kodlarını mesela? Öyleyse, bu setleri biraz daha derinlemesine inceleyelim... Her bir karakter, 8*8 noktadan oluşur. Commodore 64'ün 320*200 noktalık bir ekran kapasitesi olduğuna göre, yazı ekranının neden 40'ar karakterlik 25 satırdan oluştuğu ortaya çıkıyor. Peki bu karakterlerin nasıl görüneceklerini VIC nereden biliyor? Tabii ki, bilgisayarımızın belleğindeki karakter tanımlamalarından. Her karakterimiz 8*8'lik bir matris oluşturduğuna göre, karakterin görüntüsüyle ilgili bilgiyi 8 byte içinde saklayabiliriz. Toplam 512 karakter olduğuna göre 512*8 = 4096 byte, yani 4K hafıza bize yeterli olacaktır. Bilgisayarımızda bu hafıza normal durumda $D000-$DFFF (53248-57343) arasıdır. Karakter tanımlamaları, ekran kodlarına göre sıralanmıştır. Örneğin ilk 8 byte karakteri, bir sonraki 8 byte ile de “A” harfi tanımlanır. Bu böylece sürer gider. İlk 256 karakter (karakter kodu 0-255) ile büyük harf ve grafik karakterlerinden oluşan set tanımlanır. Bunun da ilk yarısı normal gösterim, ikinci yarısı negatif gösterime ayrılmıştır. Sonra gelen 256 karakter ise küçük/büyük harf gösteriminin normal ve negatif tanımlamalarından oluşur. VIC ekrandaki görüntüyü yaratırken, videoram'daki ekran kodlarının yardımıyla karakter tanımlamalarındaki doğru yeri bulur ve oradaki karakter tanımını ekrana getirir. Gördüğünüz gibi ekran kodları ile karakter tanımlamalarının düzeni arasındaki benzerlik sadece tesadüf değil. Ancak, karakter tanımlamalarının bulunduğu bu bölge ROM olduğu için üstüne bir şey yazılamaz. ROM'u okuyabilmek için de normal PEEK komutu yeterli olmamaktadır. Birazdan, verdiğiniz programları incelerken bu bölgeyle ilgili zorlukları nasıl çözeceğimizi de göreceğiz. Bilgisayarı açtığınızda, karşınıza çıkan yazı ekranı normal renk modundadır. Ancak, grafik ekranı gibi, yazı ekranını da çok renkli (multicolor) hale sokabiliriz. Bunun için VIC'in 17 ve 22 numaralı yazmaçlarının bit'leri ile oynamamız gerekiyor. Şu iki POKE komutu ile önce grafik ekranını ve birazdan açıklamasına başlayacağımız extended color (geliştirilmiş renk) modunu kapatıp, multicolor'u aktif hale getiriyoruz. POKE 53265, PEEK (53265) AND 159 POKE 53270, PEEK (53270) OR 16 Yazı ekranını multicolor'a geçirmenin sağladığı en önemli olanak, özellikle oyun türü programlarda, renkli grafikleri sadece yazı ekranını kullanarak yapabilmek. Grafik ekranının 8K, yazı ekranının 1K olduğunu ve grafik ekranının gerek renk, gerekse nokta organizasyonunun ne kadar karmaşık olduğunu düşünürseniz, multicolor karakterlerin programlamada ne kadar kolaylık yaratacağını kolayca tahmin edebilirsiniz. Şimdi bu özelliğin derinliklerine inelim. Diyelim ki multicolor'a geçtiniz. Bu durumda bilgisayarınızın kullanabileceğiniz renk sayısı 16'dan 8'e inecektir. Hemen meraklanmayın. Tabii ki, bunun bize sağlayacağı bir fayda var. Eğer ekrandaki bir karakterin rengi, daha doğrusu onun rengini temsil eden renk RAM'ındaki byte'ın değeri 0-7 arasında ise, sözkonusu karakter normal modda gösterilecektir. Dolayısıyla, multicolor moda geçtiğimiz halde normal karakter biçimlerini kullanma olanağımızı sürdürebiliyoruz. Düşünün, bu olmasaydı, çok renkli yazı ekranında oynanan bir oyunun skorlarını ekrana nasıl yazardık. Sakın multicolor harflerle demeyin! Neden mi? O zaman multicolor karakterlerin açıklamasına girişelim... Eğer ekrandaki karakterimizin rengi olarak 8-15 arası bir renk belirlemişsek, artık karakterimiz multicolor'dadır. Yazı dizimizde defalarca belirttiğimiz gibi, multicolor moduna karşılık feda ettiğimiz şey, yatay noktasal çözünürlüktür. Bu durumda karakterimizin çözünürlüğü 4*8'e düşecektir ama, dört değişik renk kullanabilecektir. Her zaman olduğu gibi, yanyana duran iki noktanın aldığı değere göre, oluşturdukları renk noktasının renginin nereden geleceği belli olacaktır. Bir tablo halinde bu ilişkiyi belirleyelim: 000: VIC'in 33. yazmaçı (0 numaralı arkaplan rengi) 001: VIC'in 34. yazmaçı (1 numaralı arkaplan rengi) 010: VIC'in 35. yazmaçı (2 numaralı arkaplan rengi) 8-15 arası tanımlanan, o karaktere ait renkten 8 çıkartıldığında elde edilen 0-7 arası renk kodu (Renk RAM'ının alt 3 bit'i). Bu konuyu böylece kapatalım ve oldukça ilginç bir başka özelliğe değinelim: Extended Color. Bilindiği üzere, ekran renginiz ne ise, ekrandaki karakterlerin arkasında görünen renk de hep odur. Karakteri negatif yapsanız bile, ortaya çıkan şey sadece karakter rengi ile ekran renginin o karakterin kapladığı alan içinde birbirleriyle değiştirilmiş olmalıdır. Peki, her karakterimizin arkasında kalan rengin ayrı olmasını becerebilir miyiz? Tabii ki... Şüpheniz mi vardı?.. Şu iki POKE komutunu verin:
POKE 53265, PEEK (53265) OR
64
POKE 53270, PEEK (53270) AND
239
Eğer şansınız varsa, ekranda hemen birkaç değişiklik farkedeceksiniz. Etmediyseniz, şunları sırasıyla yapın: 1) “a” harfine basın. 2) “a” harfine SHIFT ile basın. 3) RVS ON yapın. 4) “a” harfine basın. 5) “e” harfine SHIFT ile basın. 6) RVS OFF yapın. Göreceğiniz gibi, ekrandaki “a” harflerinin her birinin arkasında farklı bir renk olacak. Birincinin arkasında o anki ekran rengi (normalde koyu mavi), ötekilerinde de muhtemelen beyaz, kırmızı ve camgöbeği olacak. Ancak dikkatinizi çekti mi acaba? SHIFT ile “a”ya basınca, büyük “A” veya bir grafik işareti çıkmadı. Ortaya çıkan sadece arka rengi değişmiş yeni bir “a” harfi oldu. Şimdi bu özelliği daha teknik açıdan inceleyelim. Onuncu sayımızda da görebileceğiniz gibi, VIC'in 33-36 arası yazmaçları, değişik arkaplan renkleri tanımlıyorlar. 33. yazmaç: 0 numaralı arkaplan rengi. 34. yazmaç: 1 numaralı arkaplan rengi. 35. yazmaç: 2 numaralı arkaplan rengi. 36. yazmaç: 3 numaralı arkaplan rengi. 0 numaralı arkaplan rengini, normalde ekran rengi olarak kullanıyoruz (53248 + 33 = 53281!). Diğerleri de ya multicolor'da, ya da extended'de işe yarıyorlar. Extended moda geçtiğinizde, sadece ekran kodu 0-63 arası olan, karakter setinin ilk 64 karakterini kullanabilirsiniz. Bu tabii ki büyük bir kısıtlama. Ancak bu setin içine, bütün harf, rakam ve noktalama işaretleri giriyor. Dolayısıyla eğer sadece yazı yazacaksanız, grafik sembolleri ile bir alâkanız yoksa ve arkaplan renklerinin farklı olması önem taşıyorsa, oldukça uygun bir özellik. Bir karakterin alabileceği arkaplan renklerini, ekran kodu'na göre şu şekilde özetleyebiliriz. 0-63: 0 numaralı arkaplan rengi. 64-127: 1 numaralı arkaplan rengi. 128-191: 2 numaralı arkaplan rengi. 192-255: 3 numaralı arkaplan rengi. Bir başka açıdan da şunu söyleyebiliriz: Eğer tuşa doğrudan basılırsa, 0 numaralı arkaplan rengi. Eğer tuşa SHIFT ile basılırsa 1 numaralı arkaplan rengi. Eğer RVS ON (CTRL ve 9) ile negatif gösterime geçilir ve tuşa doğrudan basılırsa, 2 numaralı arkaplan rengi. Yazı ekranıyla VIC arasındaki ilişkiler de bu kadar...
MEHMET ULUSEL