Plazma sayı 3, sayfa 117

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 117

ai = (int(y / 8) * 320 + (y mod 8)) + (int(x / 8) * 8)

bd = 2 ^ (7 - (x mod 8))

vh[ai] = vh[ai] OR bd

Son hali biraz karışık gözükebilir. Bu yüzden parçalara ayırarak açıklama ihtiyacı hissettim. "nokta(x,y)" fonksiyonunun açıklanmaya başladığı yerden buraya kadar olan bölümü anlayana kadar defalarca okumanızı tavsiye ediyorum.

Şimdi de bu formülü JavaScript diline uygun hale getirelim. Öncelikle bir sayıyı 8'e böldükten sonra tam sayı kısmını almanın en basit yolu o sayının bitlerini 3 bit sağa kaydırmaktır. 3 bit sağa kaydırmak sayıyı 2^3'e bölmek anlamına gelir ki dışarıda kalan bitler küsurattır. Küsuratı atmış oluyoruz kısacası. JavaScript C tabanlı bir dil olduğu için operatörlerinin de birçoğu C ile aynıdır. Bit kaydırma işlemleri << ve >> operatörleriyle yapılır. Yani y >> 3 diyerek y'yi 8'e bölüp tam sayı kısmını almak mümkün.

Gelelim mod işlemine. Aslında "%" operatörüyle bu işi halledebiliriz ancak söz konusu olan sayı 2'nin üslerinden biriyse AND'lemek her zaman daha iyi ve daha hızlı bir yöntemdir. mod 8 demek sayının 7 ile AND'lenmesi demektir. 7 = %00000111 ile AND'leyerek 7'yi geçen sayının tekrar 0'a dönmesini sağlıyoruz. mod 8 de aynı işi görüyor.

Bir başka nokta ise "xi" parametresinde yaptığımız 8'e bölüp tam sayı kısmını alıp 8 ile çarpma işlemi. Bu işlem yalnızca sayının alt 3 bitinin sıfır olmasını sağlıyor. Aslında alt 3 bit sıfır olacak şekilde %111111000 = 504 ($1f8) sayısıyla AND'lemek de bize aynı sonucu verecektir. Burada dikkat edilmesi gereken husus x'in 0-255 değil 0-319 aralığında değiştiğidir. Bu yüzden AND'lerken 8 değil 9 bit kullanıyoruz.

AND ve OR operatörleri JavaScript'te yine C'de olduğu gibi & ve | karakterleriyle ifade ediliyorlar. Üs alma işlemi için ise Math kütüphanesinde yer alan pow(sayı, üs) fonksiyonu kullanılıyor.

Şimdi bütün bu yazılanları toparlayacak olursak formül son şeklini şu şekilde alıyor.

ai = ((y >> 3) * 320) + (y & 7) + (x & 0x1f8);

bd = Math.pow(2,7 - (x & 7));

vh[ai] = vh[ai] | bd;

Örnekteki değişkenlere çevirecek olursak;

adres = ((y >> 3) * 320) + (y & 7) + (x & 0x1f8);

byteDegeri = Math.pow(2, 7 - (x & 7));

VICHaritasi[adres] = VICHaritasi[adres] | byteDegeri;

İşte size plot rutininin açıklaması.

Evet Commodore 64'te ekrana nokta basmak o kadar da basit bir iş değildir. 64'ler dergisinde Barış Yalçınkaya'nın köşe yazısında bir okuyucunun sorusunu hatırlıyorum. Okuyucu "Commodore 64'te ekrana üçgen, kare gibi şekilleri nasıl çizebilirim?" diye çok mantıklı ve basit bir soru sormuştu. Eminim Barış bir hayli ter dökmüştür cevaplayana kadar. En son cevap olarak bir çizim programıyla hazırlanmış bir grafiğin nasıl ekrana basılacağını anlatmıştı. Ama Barış'a kesinlikle hak veriyorum. Ekrana nokta basmak bile gördüğünüz gibi "anlatmaya geldiğinde" oldukça zor bir iş.

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