Commodore 64 ile Grafik (1)

Bu sayımızdan itibaren, C-64'ün grafik özelliklerini sizlere tanıtmayı, daha da ötesi, onları size öğretmeyi amaçlayan bir yazı dizisine başlıyoruz.

Oldukça uzun bir dizi olacak bu. Önce ileride anlatacaklarımızı daha rahat kavramamız için sayı sistemleri ile mantık işlemlerini tanıtacağız. Sonra sıra, grafik işlemlerinde sırtımızı dayayacağımız grafik ünitesi VIC'e gelecek. Onun girdisini çıktısını öğrendikten sonra, sıra gelecek yazı ekranı, grafik ekranı, karakter seti, sprite'lar ve bunların normal, multicolor (çok renkli) ve extended (geliştirilmiş) gösterimlerine. İsterseniz hemen başlayalım. Bu-

Tuna ERTEMALP günkü konumuz, bilgisayar alanında kullanılan sayı sistemleri ile bit düzeyinde yaptığımız mantıksal işlemler olacak. Doğumumuzdan ölümümüze kadar biz ölümlüler, 0-9 rakamlarından oluşan onluk sistemi kullanıyoruz. Bunun en basit nedeni, ellerimizde sadece on parmak olmasıdır. Böylece işlemleri, kağıt kalem olmadan da kolaylıkla çözebileceğimiz bir düzeye indirgemiş oluyoruz. Aynı şekilde bilgisayarın da işlemleri yapabileceği kolay bir yöntem olmalıydı. İşte bu yöntem ikilik sayı sistemidir. Bilgisayarlar, adet olduğu üzere, elektrik enerjisiyle çalışan aletlerdir. İçlerindeki iletken yollardan elektrik ya geçer ya da geçmez. İşte bu iki durumu 0 ile 1 rakamları ile belirtiyoruz. Onluk sistemde on rakama sahipken, ikilik sistemde de iki rakama sahibiz. Peki bu sayıları nasıl kullanacağız da, ondalık sayılarla gösterebileceğimiz değerleri ikilik sistemde de gösterebileceğiz. Hadi bakalım, biraz matematik yapalım... Diyelim ki, ondalık 8539 sayısını ele aldık. Bu dört rakamdan oluşan sayının değerini nasıl buluruz. Şimdi diyeceksiniz ki, ne gerek var, daha okurken belli oluyor. Bu doğru, ama bunun da tek sebebi, konuştuğumuz dilin de ondalık sistemi en kolay şekilde yansıtabilecek şekilde olmasıdır. Eğer sekiz parmağımız olsaydı, sekizlik sayı sistemimiz olacaktı, dilimiz de ona göre gelişecek, ona göre kelimeler ortaya çıkacaktı ve 8539 şeklindeki rakamlar dizisi bize çok garip gelecekti. Örneğin 8 ve 9 karakterlerine söyleyecek bir kelime bulamayacaktık, çünkü sistemimiz sadece 0-7 rakamlarından oluşacaktı. Neyse, lafı uzatmayalım. İnşallah, bu hayali senaryo ile bir sayının değerinin sadece matematiksel olarak varolabileceğine ikna edebilmişizdir sizi...

Gelelim sayımıza. 8539'un değerini ancak aşağıdaki işlemle bulabiliriz:

8*104 34-5*104 2-4-3*1011-4-9*101 0

Bu işlem size karışık gelebilir (aslında gelmemesi lazım). Ama kabaca şöyle diyebiliriz. Bir sayının değeri, içindeki her basamağın tek başına sahip olduğu değerle, o basamağın sağ tarafında bulunan basamak sayısı kadar kendisiyle çarpılmış taban değerinin çarpımının tüm basamaklar için yapılması ve bunların toplanmasıyla bulunur. Aslında bu açıklama, aşağıdaki formülden daha karışık. Eğer bir sayı N tabanına göre yazılmışsa ve en sağdaki rakamına R0 adını verip sola doğru R1, R2... olarak isimlendirirsek, o zaman:

Değer — RO*N4 4 R2*N1 2.....

Şimdi gelelim ikilik sisteme. 1010 sayısını yukarıdaki formüle göre hesaplayalım: 0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 10

0*24

Şimdi de olaya biraz da bilgisayar açısından bakalım. 0 ve 1 değerlerini taşıyan her bir birime BİT adı verilir. Sekiz tane bit birarada bir BYTE oluşturur. Aşağıdaki tabloda, bir byte'ı oluşturan her bit'in temsil ettiği değeri görmektesiniz:

ets ets eta E13 eta eti ga sa 16 a 4 a 1

Örneğin yukarıda incelediğimiz sayı için bit'ler 00001010 durumunu alacaktır. Bu da 8+2 = 10 olacaktır. Eğer tüm bit'ler 1 değerini alırsa, 11111111 = 128+64+32+16+8+4+2+1 = 255 olur. Demek ki, bir byte en fazla 255 değerini alabilmekte. Daha büyük sayılar için daha fazla bit, dolayısıyla da daha fazla byte gerekir. Peki onluk sistemdeki sayıyı nasıl ikilik sisteme çevireceğiz. Örneğin 133 sayısını çevirelim:

Şimdi de kalanları aşağıdan yukarı doğru okuyalım: 10000101. İşte doğru cevap. Bilmeniz gereken bir diğer sayı sistemi de sık sık dergimizde de gördüğünüz onaltılık sistemdir. Rakam olarak 0-9 arası sayılarla A-F arası harfler kullanılır. Burada:

Csla Dz13 Esila F-15

Örneğin F09B sayısını onluk sisteme çevirelim: 15*16^3 + 0*16^2 + 9*16^1 + 11

15*161 *1610-61595

1 Tam tersini yapıp, 61595'i onaltı- BR kalan © lık sisteme çevirelim: 23 kalan 1 18 an 61595/16 — 3849 kalan 11 (B) a yaza ye an 3849 /16-240 kalan 9 mma b 240 kalan 0 4 kalan £ 15 /16-0 kalan 15 (F) 2 kalan 1 kalan 1 Yine aşağıdan yukarı okuyalım: commodore

F09B gene doğru cevap. Peki, bu onaltılık sistem de nereden çıktı şimdi? Hadi ikilik sistemi anladık, ya bu? Dikkat ederseniz, 4 tane bit ile 0-15 arası sayıları gösterebiliriz (0000-1111). Onaltılık sistemde de, aynı değerleri 0-F arası karakterlerle gösterebiliyoruz. Böylece aynı değerleri ikilik sistemde dört, onluk sistemde iki basamakla gösterirken, onaltılık sistemde sadece tek basamakla gösterebilmekteyiz. Bir byte'ın sahip olduğu değeri de (0-255) sadece iki basamakla (00-FF) gösterebiliyoruz. Üstelik bir bakışta o byte'ın sağ ve sol yarılarının değerlerini ayrı ayrı görebiliyoruz. Bu dörder bit'lik gruplara NİBBLE adı verilir ve oldukça sık kullanılır. Yazımız boyunca onluk, ikilik ve onaltılık sistemde sayılar verdiğimiz zaman, bunu belirtmek için aşağıdaki gibi vereceğiz:

255— -$FF

İkilik sistemdeki sayıları % ile, onaltılık sayıları $ ile belirtirken, onluk sayıları olduğu gibi bırakacağız. Geldik son konumuza. VIC'ın yazmaçları içindeki her bir bit ayrı bir anlam taşır. Onların 1 veya 0 olması, değişik grafik özelliklerini harekete geçirecektir. Demek ki, bir byte'daki tüm bit'ler arasındaki bir tek bit'i yakıp söndürebilecek birtakım işlemlere gereksinim duymaktayız. İşte bu işlemlere mantıksal işlemler adını vermekteyiz. İlk işlemimiz AND (ve) işlemi. Bunu, istediğimiz bir bit'i 0 yapmak için kullanacağız. Örneğin %01110101 sayısının sağdan üçüncü ve sekizinci bit'lerini 0 yapmak istiyoruz. Bu durumda sayımızı %11111011 ile AND'lememiz lazım. Önce AND işleminin doğruluk tablosunu verelim:

0 AND 0-0 0OANDI-0 1 AND 0-0 1 AND 1 = 1

Gördüğünüz gibi sağ taraftaki bit 0 olduğunda, sol taraftaki bit ne olursa olsun, sonuç sıfır olmaktadır, yani sönmektedir. Sağ taraftaki bit 1 olduğunda ise, sonuç sol taraftaki bit'in aynısı olarak kalmakta, yani değişmemektedir. Dolayısıyla yukarıdaki işlemin sonucu:

AND MOl1111011 — 7000011001

Gördüğünüz gibi, ikinci byte'da 0 olan bit'ler sonuçta söndüler. Diğer bit'ler ise değişmeden kaldılar. Peki bunun tam tersini yapmak, yani belli bazı bit'leri yakmak istersek ne yapacağız? İşte o zaman OR (veya) işlemini kullanacağız. %01001101 sayısının sağdan ikinci ve yedinci bit'lerini yakmak istersek, bu sayıyı %01000010 ile OR'lamak zorundayız. İşte gene doğruluk tablosundan başlayalım:

0 OR 0-0 1OnrRO0-1İ 1OnR1-1

Gördüğünüz gibi sağ taraftaki bit 0 olduğunda, sol taraftaki bit olduğu gibi sonuca geçmekte, yani değişmemektedir. Sağ taraftaki bit 1 olduğunda ise, sonuç sol taraftaki bit'den bağımsız olarak 1 olmakta, yani yanmaktadır. Dolayısıyla yukarıdaki işlemin sonucu:

ıı. wı

3D Mini Grafik

%1010011101 OR %001000010 = %11011111

Gördüğünüz gibi, ikinci byte'da 1 olan bit'ler sonuçta yandılar. Diğer bit'ler ise değişmeden kaldılar. Son işlemimiz de EXOR. Ancak ne yazık ki bu işlemi BASIC'ten kullanma imkanımız yok. Daha doğrusu EXOR komutu yok (makine dilinde EOR komutu var). Onun yerine AND ve OR'lardan oluşan bir formül kullanmalıyız:

xEXOR y- ((NOTx)ANDy)OR((NOTy) (ANDx)

Önce NOT işlemini görelim. Görevi çok basit, 1 olan bit'i 0, 0 olan bit'i 1 yapıyor. EXOR'dan farkı bu işlemi bir tek bit için yapması. Bir byte'ı NOT'ladığınız zaman içindeki bit'leri tek tek değil de, tüm değeri ters çevirmiş olursunuz. Ama bundan sonrası binary aritmetik alanına girer. Daha fazla ilerlemeye gerek yok. Şimdi EXOR'un doğruluk tablosunu görelim:

0 EXOR 0=0 0 EXOR 1=1 1 EXOR 0=1 1 EXOR 1=0

Gördüğünüz gibi sağ taraftaki bit 0 olduğunda, sol taraftaki bit olduğu gibi sonuca geçmekte, yani değişmemektedir. Sağ taraftaki bit 1 olduğunda ise, sonuç sol taraftaki bit'in tam tersi olmaktadır. Bunun en sık kullanımı, bir byte'ın tamamını ters hale getirmektir. Bunu grafik ekranını negatif hale getirirken kullanacağız. Bu işlem için byte'ı $FF ile EXOR'lamak gerekir. Örneğin:

-