İŞARETLER EKRANA NASIL GELİYOR?

Her C-64 kullanıcısı cihazının nasıl işlediğini merak eder. Burada bilgisayarın içinde neler olduğunu açıklayacağız. Bir işaretin ekrana gelişi tüm bilgisayarlarda prensip olarak aynıdır. Konunun daha iyi anlaşılabilmesi için burada C-64'ü alacağız ve bu bilgisayarla ilgili örnekler vereceğiz. Klavye üzerinde bir tuşa basıldığında bu işletim sistemi tarafından değerlendirilir ve bilgisayar tarafından anlaşılabilecek bir sayıya çevrilir. Bu sayılara ASCII kodları adı verilir. Bu işlemler kısa bir programla kolaylıkla gösterilebilir. Aşağıdaki BASIC satırlarını yazdıktan sonra (RUN) ile çalıştırın:

10 GET A$: IF A$—-” “THEN 10
20 PRINT ASC(A$);:GOTO 10

Şimdi bu satırlarda neler olup bittiğine bakalım. 10. satırdaki (GET) komutu ile klavye kontrol edilir ve sonuç A$ değişkenine kaydedilir. Eğer hiçbir tuşa basılmamışsa A$ değişkeni boş kalır ve bilgisayarın tanıdığı işaretlerden biri olarak kabul edilmez. Bu satırda yer alan IF komutu programın 20. satıra atlamasını engeller ve her şeyi baştan başlatır. Fakat herhangi bir tuşa basıldığında A$'a o tuşun sahip olduğu işaret kaydedilecektir ve program 20. satıra atlayacaktır. Bu satırda ASC(A$) komutu ile işaret kendisine ait ASCII koduna çevrilecek ve PRINT ile ekranda görülecektir. GOTO 10 ile program tekrar başa dönecek ve böylelikle sonsuz bir döngü içine girilecektir (RUN/STOP tuşuna basılana kadar). ASCII kodlarının ekranda gözükmesi halinde diğer tüm adımlar C-64'ün işletim sisteminde de aynıdır. Yalnız işletim sistemi makine dili ile yazıldığı için tüm

1. Tuşa basma

2. Ekran gösterim kodlarına dönüşüm

3. Karakter matrisinin ROM'dan alınması

ASCİ!

Ekran gösterim kodu

Bir işaretin klavyeden ekrana dek izlediği yol

seti okunurken bellek dağılımı

—> Normal durumda bellek dağılımı | H H H | RAM Karakter seti RAM LA 1 > (RAM —m” kumanda İşletim sistemi | | 0 40960 49152 53248 57344 65535 işlemler kat kat hızlı gerçekleşmektedir. Fakat biz burada kullanılan makine dili rutinlerini daha yakından incelemeyeceğiz. Şu ana kadar ASCII kodlarının nasıl hesaplandığını gördük fakat asıl karakterler ekrana gelene kadar birçok adımla daha karşılaşacağız. Bu adımlardan ilki ise ASC kodlarının ekran kodlarına dönüştürülmesidir. Bu dönüşüm sadece ve sadece Commodore bilgisayarında yapılır. Bunun nedenini şöyle açıklayabiliriz: Bilgisayarda maksimum 256 ASCII kodu mevcuttur, fakat bu 256 kodun her biri için ekranda bir işaret gösterilemez. Örneğin RETURN, fonksiyon veya cursor kontrol tuşlarını düşünün. Bunların her biri ayrı ayrı işlevlere sahiptirler fakat ekranda bir karakter ile gösterilmezler. Mümkün olduğu kadar çok karakterin ekranda gözükebilmesi için (en fazla 256) işlevi olan fakat ekranda gösterilmeyen ASCII kodları elenip yeni bir tabela düzenlenmelidir. ASCII tabelasında olduğu gibi 64. sırada bulunmaz. Ekran gösterim kodlarının bulunduğu tabelada bu sefer en başta yani sıfırıncı sırada yer alır. Aslında ASCII tabelasının tekrar düzenlenmesinin başka sebepleri de vardır. Ekran gösterim kodlarının Videocontroller (VIC)'ın gösterilecek karakterleri oluşturma şekli ile yakından ilişkisi vardır. Ekranda gösterilen tüm işaretlere ait bilgiler bir ROM (Read Only Memory-Sadece okunabilir bellek)'de kayıtlıdır. Bu ROM'da karakterler bir bütün halinde yer almazlar; herhangi bir şekilde olmaları lazımdır. Ekranda gösterilen her işaret 8x8 noktadan oluştuğu için her satırda 8 nokta bulunmaktadır. (Resim 1) Her karakterin bir satırında bulunan noktaların konumu 0 ile 255 arası bir sayı ile belirlenir. Bu nedenle bir işaret için gerekli olan 8 satır ROM'un belleğinde arka arkaya bulunur. Örnek olarak ROM belleğinin 0 ile 7 arası baytları, <A> harfi ile 8 ile 15 arası baytları kaplar. Eğer bilgisayar ekranda <A> harfinin gelmesini isterse videocontroller'a “1” sayısını bildirir. Videocontroller bu durumda karakterlerin şeklinin kayıtlı olduğu ROM'dan 1 no'lu karakteri alır ve ekranda gösterir. Şimdi kontrol tuşları aradan çıkartıldıktan sonra ASCII tabelasının neden yeni baştan organize edildiğini sorabilirsiniz. Eğer eski tabela kullanılsa idi çıkarılan kodların yerleri boş kalacaktı ve lüzumsuz yere hafıza kaybına neden olacaktı. Şu anda C-64'ün tüm karakterleri hafızada sadece 4096 bayt işgal etmektedir. Daha önce belirtildiği gibi bir işaret için 8 bayt kullanılır. Toplam 256 işaret olduğundan 256 x 8 = 2048 bayt kullanılır. Küçük ve büyük harfler için ayrı ayrı karakter setleri bulunduğu için bu toplam 4096 bayt yapar. Zaten ROM'un kapasitesi de daha fazla değildir. Şu ana kadar Videocontroller'in bir işareti ekrana getirirken neler yaptığını gördük, fakat eğer ekran tamamıyla dolarsa ne olacak? Bu durumda bilgisayarın belleğinde tüm ekranın kayıtlı olduğu ve videocontroller tarafından sürekli okunan bir alan mevcuttur ve 1024 ile 2023. adresler arasında bulunur. Burada ekran yine ekran gösterim kodları ile kaydedilir. Denemek için şu satırı yazabilirsiniz:

Belleğin 1. baytı, C-64'ün karakter setini veya videocontroller'in kumanda adreslerini görmesini sağlar.

PRINT “ CLR POKE 1024,1
RETURN

Tahmin ettiğiniz gibi ekranın sol üst köşesinde A harfi görülecektir. Aynı şeyi ekranın sağ alt köşesine de uygulayabilirsiniz:

PRİNT “ CLR ”: POKE 2033,1
RETURN

Şimdi tüm yukarıda anlatılanları gösteren bir BASIC-Demo göreceğiz. Fakat programın listesini incelemeye başlamadan bazı ek bilgiler verelim. Bir işaretin biçiminin karakter ROM'unda bulunabilmesi için o işaretin ekran gösterim kodu 8 ile çarpılır. Bu cümle tamamıyla doğrudur fakat yeterli değildir. Zira karakterler bilgisayarın belleğinde 53248. adresten itibaren yer alır. Bu nedenle daha önce elde ettiğimiz çarpımı bu sayıya ilave etmeliyiz. İnceleyeceğimiz küçük demoda daha başka sorunlarla da karşılaşıyoruz. Öncelikle BASIC'ten karakter ROM'unu doğrudan doğruya okutamayız zira bu alanda Videocontroller'in kumanda adresleri ve Soundcontroller yer almaktadır. Resim 2'de bunu daha detaylı olarak görebilirsiniz. Yukarıda belirtilen sorunun giderilmesinde C-64'de bir demiryolu makası gibi çalışan 1. adres kullanılır. Bu adresin aldığı değere göre C-64 karakter setini veya videocontroller'ın kumanda adreslerini algılar. Fakat burada C-64 oldukça gereksiz bir şekilde karakter setini okurken işletim sistemini otomatik olarak devreden çıkartır. Bu durumda bilgisayar klavyeden yazılmış hiçbir şeyi algılayamaz. BASIC'den karakter ROM'unun okunması bu şekilde olanaksız hale geldiği için ufak bir makine dili program yazılmalıdır ve demoda bu alt program 32000. satırda yer almaktadır. Şimdi BASIC-Demo'muzu incelemeye başlayalım. İlk satır demonun işleyişi ile ilgili değildir. Burada DATA'lar halinde 32000. satırda bulunan makine dili programı hafızaya yerleştirilir. 20. satırda BA değişkenine üçüncü 32, dördüncü 16, beşinci 8, altıncı 4, yedinci 2 ve en sağdaki 1 olsun. Herhalde bunların üstel olduğunu fark etmişsinizdir.

karakter-ROM'un temel adresi olan 53248 yüklenir. 30. satırda daha önce görüldüğü gibi klavye sorulur ve elde edilen A$ değişkeni ASCII koduna çevrilir. 40. ve 50. satırlarda küçük bir program hilesi kullanılmıştır. ASCII kodlarının ekran gösterim kodlarına çevrilmesinde öncelikle 40. satırda ekran silinir ve A$ yazısal dizisi ekranın sol üst köşesine yazılır. Bilindiği gibi ekran belleğinde A$'ın içeriği ekran gösterim kodu şeklinde bulunur. Böylelikle uygun adres okunduğunda istenen değer kolaylıkla elde edilebilir. Bu okuma işlemi 50. satırdaki PEEK (1024) komutu ile gerçekleştirilir. Ayrıca 50. satırın başka bir görevi daha vardır: A$'daki işaretle karakter ROM'undaki başlangıç adresi hesaplanır. (Ekran gösterim kodu sekiz ile çarpılır ve karakter ROM'unun temel adresine eklenir.) Daha sonra 60 ile 170. satırlar arasında tam 8 defa tekrarlanan bir döngü bulunur. Bu döngünün görevi karakterin her bir satırını okumak ve ekrana vermektir. AD değişkeni her seferinde o anda okunan satırın değerini almaktadır. 70. satırda hesaplanan bu değeri 80. ve 90. satırlar makine dili programa bildirmek için hazırlık yaparlar. 100. satırda SYS komutu ile program işleme sokulur. 110. satırda 253 no'lu adresde bulunan karakter satır değeri BY değişkenine yüklenir. Bundan sonra 120 ve 160. satırlar arasında yeni bir döngüye girilir. 130. ve 140. satırlar BY değişkeninde bulunan sayıyı yorumlama görevine sahiptirler. İşaretin üzerinde bulunan her nokta bir yıldıza (*) karşılık gelmektedir. Buna karşılık işaretteki her boşluk için ekranda bir nokta gösterilmektedir. Her bir karakter satırda sekiz adet nokta bulunduğunu biliyoruz. Şimdi her bir noktaya bir sayı verelim. Soldan itibaren ilk nokta 128, ikinci 64,

“LÜTFEN BİR TUŞA BASIN” 128, 64, 32, 16, 8, 4, 2, 1'dir. Eğer bir satırda birden fazla nokta varsa bunlara karşı gelen değerler teker teker toplanır. Örnek olarak bir satırda en soldaki ve en sağdaki noktalar varsa bu satır 129 değerini alır (soldaki için 128 + sağdaki için 1). 130. ve 140. satırlarda yer alan (BY AND 2^J) komutu BY sayısına karşılık gelen noktaları belirler. Eğer BY değişkeninde kayıtlı olan sayı ikinin herhangi bir üssü olduğu belirlenirse ekranda bir (*) işareti belirir. Aksi taktirde 140. satırda boş yerlere bir nokta konulur. 170. satır cursoru bir sonraki satırın başlangıcına getirir ve son satır oluşana dek sekiz defa kullanılır.

Böylelikle program tamamlanmış olur. Aslında Videocontroller'de olup bitenler tamamen aynıdır. Eğer programı BASIC ile yazıp çalıştırırsanız C-64'ün her bir karakterinin nasıl yapıldığını görebilirsiniz. Yalnız BASIC-Demo'nun Videocontroller'dan defalarca yavaş çalıştığını unutmayın. Son olarak işaretlerin monitör üzerinde nasıl oluştuğuna kısaca değineceğiz. Videocontroller'ın ürettiği sinyal monitörde üçe ayrılır: Resim bilgilerini taşıyan sinyal (monokromlarda BAS, renklilerde FBAS) ve yatay ile dikey yönlerde katod ışığını etkileyen sinyaller. Bu bilgi pek fazla değildir ama konumuz için daha fazlası gereksizdir.