Commodore sayı 75, sayfa 15

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 15

Atölye'de ele alınan acayip yazılardan sıkılmayan herkese selam. “Umarım geçen sayıda yayınlanmış olan grafik paketçiğini hepiniz yazmış ve demek isterdim, ama ne yazık ki bazı teknik arızalar dolayısıyla (ne demekse) döküm ekinde yayınlanması gereken program bu aya atıldı. Link hatlarında arızalar olmazsa bu ay yayınlanmasını bekliyoruz. Aslında tek başına pek de işe yaramayan bu program, hem BASIC'den parametrelerin nasıl okunacağı konusunda, hem de ROM'ların ne şekillerde kullanılabileceği konusunda bazı fikirler vermek amacını güdüyordu. Aynı yazıda, bazı arkadaşlar tarafından “Hesaplanması neredeyse imkânsız” olarak nitelendirilen, VIC video matrisinin ve karakter datalarının yerini belirleyen adresinin değerinin nasıl hesaplanacağını da göstermiştim. VIC'in $0000-$3FFF arasını değil de $C000-$EFFF arasını, veya $4000-$7FFF arasını kullanmasını sağlayacak $DD00 adresinin kullanılışını da (en azından bu amaca hizmet edecek kadar) geçen ay anlatmıştım. Eğer C64'ünüzü grafik alanlarında kullanmaya niyetliyseniz, bu iki adresin kullanılmasını oldukça iyi şekilde öğrenmelisiniz. Çünkü, normal karakter setinin görüntüsü yüzünden kullanamadığınız $1000-$1FFF arasını, ikinci BANK'e geçerek kolayca $5000-$5FFF arası olarak kullanabilirsiniz. Aslında FLI-Graph sisteminin de yaratılabilmesini sağlayan başlıca özelliklerden biri de budur ($D011 ile uygulanan akıl durdurucu hileleri işin içine katmazsanız). Bu kadar laf kalabalığından sonra bu ayın konusunu açıklamaya geldi sıra: Bu ay FLI-GRAPH üzerine 64 sprite'lik multiplexer yapmanın yolunu anlatmayı düşünmüyorum, çünkü böyle bir şeyin yapılabilmesi imkânsız. Biz en iyisi daha basit konulara dönelim. Geçen ay söz verdiğim grafik ekranına nokta koyma, yavaşlığın sebepleri ve

Vedat Hallaç bu yavaşlıktan ne gibi yollarla kurtulabileceğimiz konusu gibi... Bu ayın konusuna girmeden önce geçen ayki bilgilerimizi kısaca bir tazeleyelim isterseniz. Rutinimiz beş ayrı komut ekliyordu BASIC'e. Bu komutlar sırasıyla şu adreslerde bulunuyordu: SYS 49152: Grafik ekranını açma. SYS 49155: Normal ekrana geri dönme. SYS 49158: Ekranı temizleme. SYS 49161,R1,R2,R3: Grafik ekranının renklerini belirleme. R1, R2, R3 sayıları ile 0-15 arası renkleri seçebilirsiniz. SYS 49161,X,Y,RN: X,Y koordinatlarına R1,R2,R3 renklerinden biri ile nokta koyma veya 0 ile buradaki noktayı silme. İlk dört rutini geçen sayıdaki yazıda detaylı olarak ele almıştık. Sadece grafik ekranıyla ilgili bilgilerinizi tazelemeye yetecek kadar yer olmadığını düşünerek nokta koyma ve silme işini bu aya ertelemiştik. Şimdi grafik ekranını multi-color modda kullanmanız için gereken tüm bilgileri ve formülleri vereceğim: Her şeyden önce grafik ekranının bellekte nasıl durduğunu göreceğiz. Bunun için de “card” veya “kart” kavramını size tekrar hatırlatmam gerekecek. 'Kart', ekrandaki 8x8'lik alanların her birine verilen addır. Bu alanlar hep 8'in tam katı olan koordinatlardan başlar. Grafik alanını bu şekilde kartlara ayırmamızın sebebi, her kartın, içindeki noktaların hepsinin rengini belli kurallar çerçevesinde kısıtlamasıdır. Yani ekrandaki her 8x8'lik alana birbirinden bağımsız renkler verebilirsiniz. Şekil 1'e bakarsanız ekranın sol üst köşesinde yer alan kartlardan birkaçını görebilirsiniz. Grafik ekranı 320 x 200 boyutunda olduğunu da göz önüne alarak tam 40*25 = 1000 adet kartımız olduğunu görebiliriz. Dikkatli arkadaşlarınız bu kartların sayısının karakter ekranına basılabilecek karakter sayısıyla aynı olduğunu fark etmişlerdir. Evet, bu bir tesadüf değil. Çok renkli grafik ekranı kullandığınızda hizmetinize sunulan üç renkten biri renk RAM'i olan $D800'daki 1000 baytta, diğer ikisi de o an aktif olan video matrisinde yer alan 1000 baytta saklanır. AMICA PAINT gibi programlar on altı rengin bu koşulları yok etmeden kullanılmasını sağlarken, PAINT MAGIC gibi bazı programlar kullanıcıyı seçilmiş üç renkle sınırlarlar. İsterseniz şimdi de bu kartların hangi baytlardan oluştuğunu ve çok renkli modda renklerin neye göre verildiğini görelim. Grafik ekranları, sadece $0000, $2000, $4000 gibi 8K'lık alanların en başında yer alabilirler. Bu alanın ilk baytı, grafik ekranın sol üst köşesine ait sekiz noktanın değerini içerir. Bir bayt sekiz bitten oluştuğuna göre bu bayta vereceğimiz değere göre bu noktaların ayrı ayrı veya hep birlikte seçilmelerini ayarlayabiliriz. Bir bayttaki değerin noktaların açık veya kapalı olmasını nasıl sağladığını şekil 2'de görebilirsiniz. Şekilde de belirtildiği gibi her noktanın bir “ağırlığı” vardır. Baytta tutulan sayı ise görünen bitlerin ağırlıklarının toplamından başka bir şey değildir. Tabii ki bu ağırlıklar kafadan atılmış değerler değildirler. En sağdaki noktaya 0. nokta, en soldaki noktaya da 7. nokta dersek, ağırlık = 2^nokta no formülünden nokta ağırlıklarını hesaplayabiliriz. Grafik ekranının başlangıcından bir sonraki adreste tutulan bayt, kartın ikinci piksel satırının değerini tutar. Böylece grafik adresinin ilk sekiz baytının değerleriyle oynayarak sol üst köşedeki kartın noktalarını açıp kapayabiliriz. Dokuzuncu bayt ise, çoğunuzun tahmin edeceğinin aksine, bu sol üstün bir altındaki kartın değil, bir sağındaki kartın en üst sekiz noktasının değerlerini ayarlamaya yarar. Sol üst kartın bir altındaki karta ait noktalarla oynamak içinse grafik adresinin başlangıcından 320 sonraki baytla oynanması gerekir. Grafik başlangıcını $2000 (8192) kabul edersek, şekil 3'e bakarak hangi baytın hangi kartı etkilediğini toplu olarak görebiliriz. Aslında şu ana kadar pek fark etmediniz ama koordinatı verilen bir noktanın adresini ve bu adrese yazılması gereken baytı bulabilecek kadar bilgi birikimimiz oldu şu anda. Haydi hep birlikte adresin bulunması için gereken formülü çıkartalım. Bunun için ilk olarak Y koordinatıyla ilgili özel birkaç durumu inceleyip genel bir Y koordinatı formülüne varmaya çalışalım: 1. Y koordinatı 0 ile 7 arasındaysa, adres başlangıçtan 0..7 bayt ileride yer alıyor. 2. Y koordinatı 8 ile 15 arasındaysa, adres başlangıçtan 320..327 bayt ileride yer alıyor. 3. Y koordinatı 16 ile 23 arasındaysa, adres başlangıçtan 640..647 bayt ileride yer alıyor. Demek ki Y koordinatının 8'de birinin tam sayı kısmı kaç kere 320 bayt ilerleyeceğimizi belirliyor: adresY = 320*INT(Y/8)

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