6 Kasım 2016 Pazar

Commodore 64

Bilgisayarlar ile ilk olarak 1984 yılında bir "Atari Salonu"nda tanıştım. İçine Atari 2600 ve televizyon ekranı gizlenmiş büyük oyun makinesine parayla alınan jetonu (coin) atmak suretiyle oyun oynanabiliyordu. Oynadığım ilk oyunu net hatırlıyorum: At süren bir kovboyu joystik ile kontrol ediyordunuz, etrafta serseri mayın gibi dolaşan muhtelif büyük ve küçükbaş hayvanların peşinden koşturup düğmeye basınca kement fırlatmak suretiyle yakalayarak puan kazanıyordunuz. Eğer bu hayvanlara çarparsanız canınız yanıyordu. 3 can kaybedince oyun bitiyor, yeni jeton atmak gerekiyordu (Game Over - Insert Coin). O zamanki şartlarda bir televizyondaki görüntüyü kontrol edebilmek inanılmaz gelmişti. Bu duyguyu hala hissediyorum!

Babamdan dondurma alacağımı iddia ederek üttüğüm paraları (günde 5 külah dondurma mı yenir?) atari salonlarında yemeye başlamıştım. Sonra bazı atari salonlarındaki oyunların daha güzel olduğunu farkettim. Bu makinelerin içine Commodore 64 saklanmıştı. Onlardan oynamaya devam ettik. O dönemde Wizard of Wor aklımda kalmış. "Atari" markası ve firması çoktan tarih oldu ama hala benzer oyun oynatan mekanlara Atari salonu denir. Bu da ilginçtir.


C64: Klavye ile kasa aynı yerde. Bir nevi taşınabilir olmayan ve ekransız laptop
Bu arada bir arkadaşıma babası C64 (bundan sonra bu kısaltma kullanılacak) almıştı. Kendisiyle samimiyetim birden arttı, ancak evine gittiğimde 10-15 dakika oynadıktan adaptörünün ısındığını bahane ederek o güzelim cihazı kapatıyordu eşşeğin sıpası. Atari'ye kartuşu takınca oyunu doğrudan çalıştırırken, C64'de ise komut satırından giriş yapılarak oyun kasetten yükleniyordu. Yani, daha sofistike bir alet idi. Bilgisayar idi.

Gel zaman git zaman, ancak bir çocuğun yapabileceği insafsızlıktaki duygu sömürülerinden sonra babam 312 bin eski TL'ye ve bilmemkaç takside bana bir C64 aldı. Sene 1986 idi. Yanında bedava oyunlar da verilmişti. Hemen oyunlara daldım tabii. Babamla beraber Falcon Patrol II oynardık.

Oyunlar kasette duruyorlardı. Bilgisayara bağlanan bir teyp ile oyun yüklenebiliyordu. Her kasetin kapağının içinde hangi oyunun kaçıncı "sayı"da olduğu yazardı. Mesela Falcon Patrol oyunu 55'de diyelim, başa alınmış ve sayacı sıfırlanmış kaset hızlı ilerleme (F.FWD, Fast Forward) tuşuna basılarak 55'e getirilirdi. Tabii 55'de duruş otomatik olmuyordu, sizin çevik davranıp o anda stop tuşuna basmanız gerekiyordu. Eğer tutturamazsanız ufak ileri geri hareketlerle tutturuyordunuz. Sonra klavyeden LOAD yazıp RETURN tuşuna basıyorsunuz. Bilgisayar size PRESS PLAY ON TAPE diye cevap verince de teybin play tuşuna basıyordunuz ve oyun yüklenmeye başlıyordu.
Datasette 1530, numaratör sağda

Oyun satan dükkanlar vardı. Teybinizi ve boş kasedinizi alıp gidiyordunuz. Teybinizi alma sebebi, her teybin "kafa ayarının" farklı olmasıydı (alt paragrafta ayrıntılı anlatacağım). Dükkanlarda daktiloyla yazılmış ve yer yer tükenmez kalemle "editlenmiş" kataloglar vardı. Alacağınız oyun aklınızda değilse o katalogdan kuru İngilizce isimlere (örn. POPEYE II) bakarak bir oyun seçersiniz. Katalogda oyunun yer aldığı disketin numarası vardır. Bilgisayarcı abiye almak istediğiniz oyunu söylediğinizde o disketi bulur, ve 1541 adlı sihirli cihaza, yani disket sürücüye takar. Bu 1541 denen cihaz bizzat C64 kadar büyük ve pahalı bir cihaz idi. Hiçbir zaman sahibi olamadım. Oyunu kasete göre çok daha kısa zamanda yüklerdi. İleri geri alma derdi yoktu, çünkü disketler rasgele erişimli belleklerdir. Kaset ise sıralı erişimli bellektir.

Teyplerin kafa ayarı denen bir mefhum vardı. Her teybin kafa ayarı farklı olurdu, ve bir teypte kasede kaydedilmiş oyun başka teypten yüklenemezdi. Oyun satıcısına teybi de taşımanın sebebi buydu. Yine de kafa ayarı yapılabilir birşeydi. Kafa ayarı programı denen bir program vardı, o yüklenirdi. Nedense o "kafa ayarı programı" her türlü teypte yüklenebiliyordu (uzun yıllar sonra o programın kasete analog olarak seyrek yazıldığı için kafa ayarına hassas olmadığını öğrendim) Kafa ayarı programı başlatılınca yüklenmek istenen kaset teybe takılır ve play'e basılırdı. Ekran dağınık şekiller çıkardı. Saatçi tornavidası teybin üstündeki kafa ayarı için konulmuş minik delikten sokularak vida çevrilirdi. Ekrandaki şekiller derli toplu hale gelince kafa ayarı tamamlanmış olurdu.

Saatçi tornavida takımı (hala bulundururum)

C64 kutusunun içinde iki tane kitapçık gelmişti. Biri Türkçe ve biraz basit, diğeri ise İngilizce ve kalındı. Elbette ilk günlerde oyuna dalınca bu kitaplar kenara atılmıştı. Fakat TV'deki görüntüyü kontrol edebilmeye hayret ettiğim kadar, bu muhteşem oyunların nasıl yapıldığını da merak ediyordum (hala da merak ediyorum, nasıl yapılıyor lan bu oyunlar???)

C64 içinde bir Basic yorumlayıcısı ile geliyordu. Basic bir programlama dilidir ve bu dili sağlayan yazılım firması anlı şanlı Microsoft'dan başkası değildi! Yani bilgisayarın işletim sistemi Basic idi. Bir satır yazıp başına numara koyduğunuzda o satır hafızada saklanıyordu.

10 PRINT "HELLO WORLD" (burada Return tuşuna basınca hafızada 10 numaralı satır olarak saklanır)
LIST (bu komutu girince hafızadaki tüm program listelenir)
10 PRINT "HELLO WORLD"
READY.
RUN (bu komut hafızadaki programı çalıştırır)
HELLO WORLD
READY.

Bu görseli bulunca tüylerim diken diken oldu

Ben de kitaplara daldım. Hazırlık sınıfında İngilizce öğrenmiştim biraz; tembel bir öğrenci olduğumdan C64 sınıf geçme demeyelim, sınıfta kalmama hediyesi olarak alınmıştı. O yüzden İngilizce okuduğumu anlayabiliyordum. Misafirlere şöyle bir program yazmıştım:

10 INPUT "ADIN NEDIR", A$
20 IF A$="MEHMET" THEN PRINT "NABER LAN MEHMET" ELSE PRINT "MERHABA ", A$

Bu program gelen kişiye adını soruyor, default olarak kibarca "Merhaba Ahmet" diye ismiyle selam verirken, Mehmet amcaya "Naber lan?" diye laubali cevap veriyordu ve bu program yüzünden herkes benim bilgisayar dahisi olduğumu sanıyordu.

Tırmaladım ve en sonunda kitabın en sofistike programı olan balon sprite programını da yazdım.


Bu programı yazıp bitirince ekranın sol altından şekildeki netlikte bir balon peydah olup yavaş yavaş sağ üste doğru giderek gözden kayboluyordu. Programdaki DATA kısımlarında 21x24 piksel boyutundaki balonun her pikseli bit değerleri üzerinden byte olarak hesaplanarak yazılıyordu. Ayrıntıya girmeyeyim, ufak dimağım şekil yapacam diye çaktırmadan bit aritmetiğinin temellerini öğrenmişti.


Biraz C64'ün donanım özelliklerinden bahsedeyim. Sadece 64 kilobyte RAM belleği vardı. Bugün en uyduruk akıllı cep telefonunun 1GB RAM belleği vardır. 1GB=1024x1024=kabaca 1 milyon küsür KB eder.

Yazılımları saklamak için en dandik telefonun 16GB dışsal hafızası vardır. C64'ün ise dışsal hafızası olarak kaset ve disket imkanları vardı. En özendiğim pahalı 1541 disk sürücü ile 170KB'lık diskette veri tutabilirdiniz. Elbette disketleri yükleme sırasında elle takıp çıkararak 170KB'ın üstüne çıkılabilirdi, ama o kadar. Bazı sofistike oyunlar birden fazla diskette bulunurdu, oynamaya başlarken ilk disket takılır, seviye (level) atladıkça diğer disketler takılarak oyuna devam edilirdi. Böyle oyunlar sadece teybi olan fakirlerde ya hiç çalışmazdı, veyahut çok sıkıcı uzun sürelerde yüklenerek çalışırdı.

C64'ün en iyi özelliği grafik ve ses için özel çiplere sahip olmasıydı. Böylece işlemcisinin görece güçsüzlüğüne kıyasla iyi bir grafik ve ses performansı verirdi. Örneğin ekranda hareketli şekiller olan sprite'lar bizzat VIC-II çipi tarafından desteklenirdi. Bu da oyunların o günün teknolojisine göre daha iyi ve hızlı olmasını sağlıyordu.

C64 grafiğinin zirve noktası: Samantha Fox

Ama esas C64'ün ses özelliği efsane idi. SID çipi sayesinde 3 bağımsız kanaldan ses çıkışı verebiliyordu. Böylece oyunlar çok sesli müzik ile bezenerek inanılmaz bir atmosfer sağlanabiliyordu. Enstrüman yoktu, ama kare, üçgen, sinüsoydal ve testere dişi dalga üretebiliyordu, buna biraz yaratıcılık da katınca nefis müzikler ortaya çıkıyordu.


Görüntü ve ses çıkışı için eski tarz anten kablosu ile normal TV bağlantısı kuruluyordu. Yani C64'ümüz sanki antenden alınan karasal TV yayınları gibi analog sinyaller üretiyordu. Eskiden TV pahalı bir cihazdı, süpermarketlerde satılan 100 TL'lik dandik TV'ler yoktu. O yüzden C64'ü bağlayacağımız evin baş köşesinde konumlandırılmış olan üstü dantelli TV'yi kullanabilmek için ev halkı ile mücadele etmek gerekiyordu. Bir de C64'ün bağlı olduğu televizyonun tüpünün ömrünü çabuk tükettiği üzerine rivayetler olduğundan kullanımının ebeveynler tarafından sınırlandırılması için bahane oluşturuyordu.

Bir de bu lanet olası güç adaptörü çok ısınıyordu. Sık sık kontrol etmek, neredeyse alev alacak hale geldiğinde bilgisayarı kapatıp soğumasını beklemek gerekiyordu.

Güç adaptörü. Plastik kokusuyla harmanlanmış sıcaklığı yüzüme vurdu bi anda...

Klavye, işlemci ve çiplerin hepsinin tek ünite biçiminde olduğu bir bilgisayardı C64. Oyun oynamak için joystik takılıyordu. Bunun için sağ tarafında iki adet giriş vardı. İki giriş önemli, çünkü iki ayrı joystik ile tek bilgisayarda iki arkadaş "multiplayer" oyun oynayabiliyordunuz.

Şimdi programcılığa geri dönebiliriz. C64'ün sofistike işlevlerine erişmek için PEEK ve POKE komutları kullanılırdı. Örneğin ekranın rengini değiştirmek için POKE 53281,0 komutu girilirdi. Çünkü ekran rengi 65536 byte'lık hafızanın 53281. byte'ından okunurdu. Virgül sıfır ise siyah renk anlamına gelirdi. Yeri gelmişken söyleyelim, C64 16 rengi destekliyordu.

Yukarıdaki sprite örneğinin programını incelerseniz, sprite tanımlarının READ komutu ile okunarak sprite'lara ayrılmış özel hafıza bölümüne POKE ile yazıldığını görebilirsiniz.

Tabii işim gücüm oyunların nasıl yazıldığını araştırmak idi. BASIC ile yazılan sprite hareketleri, grafikler falan oldukça yavaş oluyordu. Ayrıca BASIC programları zaten az olan hafızada fazlasıyla yer kaplıyorlardı. E peki bu sofistike oyunları nasıl yapıyorlardı?

Elbette makine dili ile. Piyasada aylık ve de Türkçe Commodore Dergisi bulunuyordu. Hemen bu derginin tüm sayılarını eski kitapçıdan toplamaya başlamıştım. Öğrenmiştim ki, BASIC sadece bir yorumlayıcıdır (Interpreter), gerçek program makine dilindedir. Başka şekilde söylersek, BASIC yorumlayıcısının bizzat kendisi makine dilinde bir programdır ve bizim yazdığımız programı yorumlayarak çalıştırır. Elbette bu yorumlama anı zaman kaybettirdiği için yazılan program asla hızlı çalışmaz. O halde ne yapmak lazım? Programı doğrudan makine dilinde yazmak lazım.

Her ne kadar C64 ile başlasa da zamanla Amiga daha çok yer alır oldu.

Commodore dergisinin kod eki vardı. Orada hexadecimal sayılar denizi halinde makine dilinde program kodları olurdu. Bu kodları bilgisayara girebilmek için Makine Dili Editörü, veya kısaca MDE diye bir program vardı. Bu programı -sanırım- oyun satıcılarından almış olmalıyım. Kodlarda her satırda 9 adet hexadecimal, yani 16'lı sistemde sayı olurdu. Bunlardan 8 tanesi C64'ün hafızasına POKE ile kazınacak byte'ları ifade ederken, 9ncusu ise parity byte'ı olurdu. Şöyle ki, bu parity byte değeri 8 byte'ın toplanması ve 255'e modüle edilmesi ile hesaplanırdı (dergide parity denmiş olsa da, teknik olarak doğru adı checksum olmalı). Böylece ilk 8 byte'ın girişinde herhangi bir hata yapılırsa -ki işin sıkıcılığı sebebiyle gayet mümkün- son "parity byte" değeri tutmazdı. Program tatsız bir bip sesiyle diğer satıra geçmeyi engeller ve durup hangi byte'da hata yaptığını bulup düzeltmene izin verirdi.
Aynısını bulamasam da kod eki yaklaşık böyle sayfalardan oluşurdu
Tabii bu sayı denizinde her sayının bir anlamı vardı. İşte buna makine dili denir ve kullandığımız PC, cep telefonu gibi tüm bilgisayarlarda kullanılan C, Java, C#, Python, Pascal, PHP vb. dillerin hepsi en dipte bir yerlerde makine diline çevirilerek çalıştırılır. Örneğin C dilinde yazılan program derlenerek makine diline çevirilir ve öyle çalıştırılır. Tabii bu derleme (compile) zorlu bir iştir, o zamanki C64'ün bunu hele de teyp kullanarak yapabilmesi mümkün değildi. Ben de doğrusunu söylemek gerekirse derleme gibi bir imkanla hem yüksek düzey bir dil kullanıp hem de makine dili performansı elde edileceğini o zamanlar hiç bilmiyordum. Ancak yine de üniversitede "derleme" lafını duyunca "doğru ya? çok mantıklı" diyebilmeme yardımcı oldu.

Velhasılıkelam, kendim de makine dilinde program yazmaya başladım (Bilgisayar satın alabilme eşiği geçildikten sonra, bilgisayar programcılığı fırsat eşitliği sunan bir meslektir) Yanlış hatırlamıyorsam eski kitapçının birinden makine dilini öğreten bir kitap bulmuştum (aşağıdaki görseli bulunca hatırladım)


Önce program makine dilinin bir tık üstü olan Assembly dilinde yazılıyordu. Sonra bu program elle byte'a çeviriliyordu (derleniyordu demek daha doğru aslında). Basit bir BASIC programcığı ile bu kodlar hafızaya yüklenip çalıştırılıyordu.

LDA #$07
STA $D021
BRK



Burada LDA komutu A register'ına 07 değerini yüklüyor, STA komutu da A register'indeki değeri $D021 adresine, yani normal sayıyla 53281 değerine yüklüyor. BRK komutu da programı sonlandırıyor. Yukarıda 53281 numaralı (adresli) hafıza hücresine yazılan sayının otomatikman ekranın arkaplan rengini belirlediğini POKE örneğinde görmüştük. LDA, STA, ve BRK gibi komutlarının her birinin sayısal değerleri var, bunların yanına $07, $D0, $21 gibi değerler de gelince sayı denizinin değerleri ortaya çıkar. Tabii tüm jargon hexadecimal olmasına rağmen C64 Basic nedense bunu doğrudan anlayamadığından sayılar ondalık karşılıklarına çevrilir. Sonuçta yazdığınız programı denemek için aşağıdaki türden bir BASIC programını yazmak gerekir:

10 FOR A=49152 TO 49160
20 READ B
30 POKE A,B
40 NEXT
50 DATA 169,1,141,32,208,141,33,208,96
60 SYS 49152


49152 numaralı adreste 4KB'lık boş yer vardı ve böyle minik denemeleri oradan yapmak iyi oluyordu hafızanın başka yerlerini karıştırmamak açısından. Bu programda da bir döngü içinde READ komutu ile DATA kısmında verilen hardcoded byte değerleri POKE ile hafızaya yazılır. Bu işlem bittikten sonra SYS komutu verilen adresteki makine dili programını çalıştırır.

Eğer bir yanlış yapılırsa program ve bilgisayar aynen çakılır, yazılanlar havaya uçar. O yüzden yazılanı çalıştırmadan önce kasete kaydetmek elzemdir.

Sonuç olarak makine dili ile oyun yazamadım ama BASIC ile Breakout benzeri oyun, ganyanlı bahisli at yarışı gibi oyunlar yazdım. Sonra babam C64'ü sattı, yerine de başka bilgisayar almadık. Yine de virüs kanıma girmişti: Meslek lisesi elektronik bölümüne gittim. Elektronikçi olamayacağımı anlayınca meslek liselerine verilen ek puanla 2 senelik bilgisayar programcılığını kazandım. C64'de temelini öğrendiğim şeylerin faydasını görerek güle oynaya (ama elbette bir sürü şey de öğrenerek ve zaten bildiklerimi daha sağlam temellere oturtarak) mezun oldum ve çalışmaya başladım. Halen de ekmeğimi yazılımcılıktan, veya seksi olmayan deyişle bilgisayar programcılığından kazanmaktayım. Sonuna kadar okuduğunuz için teşekkür ederim.