C64 Demolarını Anlamak

"Eee... Ne ki şimdi bu. Topu topu küp dönüyor bir tane". Herhangi bir platformdaki herhangi bir demoyu değerlendirmeniz ve takdir edebilmeniz için, o platformdaki teknik yetenekler hakkında bir miktar bilgiye sahip olmanız gerekir.

Demo izleyen bir insanın o demoyu beğenip beğenmemesini basit bir şekilde modellemeye çalışalım. Bir demoyu değerlendirirken, genel olarak insanın beğenisi iki farklı kaynaktan beslenir. Bunlardan birincisi, kişinin teknik bilgisi dahilinde, gördüğü şeylerin zorluğu ve başarısı hakkında ölçülebilir (hatta nümerik) ve objektif bir beğeni türüdür. İkincisi ise daha sübjektif olarak, görülenlerin kişinin ne kadar hoşuna gitmesi ile ilgilidir. Kişi bu iki kaynaktan hissettiği beğeninin toplamı kadar demoyu beğenir diyebiliriz.

Sübjektif beğeni, zaman içinde kişinin kendi kendine geliştireceği ve pek çok başka faktöre bağlı bir olaydır ve sizlere burada yaklaşık aynı zorluktaki iki efektten hangisini daha çok sevmeniz gerektiğini söylemek bize düşmez. Fakat objektif ölçütler hakkındaki bilgileri size verebiliriz. Bu yazıdaki genel amacımız bu. Bu bilgileri size sunarken şöyle bir yaklaşım izleyeceğiz:

- Platformun donanım özellikleri.

- Donanımın sırasıyla programcılık, grafik ve müzik yönünden avantaj ve dezavantajları.

- Efekt trendlerinin kısa tarihsel özeti.

C64

C64 scene'i dünyada en uzun süredir yaşayan demoscene. Çeşitli ekollerin gelip geçtiği, bugün bile başka platformlarla çok yönlü etki alışverişi yapabilen bir üretkenlik ortamı. Bugün yaşayan demoscene platformları arasında belki de en kısıtlayıcı donanıma sahip.

Önce C64 donanımı hakkında kısa bir özet yapalım. Pek çoğunuzun bildiği üzere C64, 1 MHz, 8 bitlik bir işlemciye ve 64 K RAM belleğe sahip. Bellek adreslerine direkt olarak erişebilen (DMA ile) VIC-II adlı grafik çipine sahip. Aynı zamanda dünyanın gelmiş geçmiş en başarılı dijital kontrollü analog ses çipi SID ile de 20 yıldan fazladır kulaklarınızı şenlendiriyor.

Bu donanımın, demo yapımını nasıl etkilediğini üç bölümde inceleyelim: Programcılık, grafik ve ses yönünden...

Programcılık

C64 donanımında demo programcılığını şekillendiren bazı çok önemli özellikler var:

- 8 bit olmak. Bazen insanlar farklı CPU'ları karşılaştırırken sadece MHz'leri karşılaştırmak gibi bir hata yapar. Oysa ki, mimarinin kaç bit olduğu genelde cycle başına (yani MHz ile saydığınız, CPU'nun çalışma hızını belirleyen her bir tick) yapabildiği işi çok etkiler. Örneğin 8 bitlik bir makinede 8 bitlik bir sayı üzerinde işlem yapmak 16 bitlik bir sayı üzerinde aynı işlemleri yapmaktan 2 ila 10 defa daha yavaş olabilir.

- Komut setinde ÇARPMA ve BÖLME komutları olmaması. İşte C64'teki en önemli kısıtlardan biri budur. Bunun anlamı toplama çıkarma gibi işlemler genelde birkaç cycle'da yapılabilirken, çarpma ve bölme işlemleri kimi algoritmalarla 50 kat yavaş olabilir. Dünyada neredeyse çarpma işlemi gerektirmeyen demo efekti olmadığı düşünülürse, bu sorunun her C64 efektinde akıllıca çözülmesi gereken bir problem olduğu anlaşılır. Bir diğer problem de 8 bitlik iki sayının çarpımının 16 bit olabilmesi, yani 8 bitlik mimarinin kolay işleyebildiği sayılar aralığından taşmasıdır. Bölme ise C64'te çok çok çok yavaş bir işlemdir.

- Grafik blitter olmaması: Maalesef bellekte iki boyutlu piksel gruplarını bir yerden başka bir yere hızlı kopyalamaya yarayan herhangi bir donanım yoktur. CPU'nun da öyle aman aman hızlı olmaması yüzünden genelde iki boyutlu hareket eden çok fazla ve büyük grafik blokları yapmak zordur.

- Raster interruptlar. C64'te demo programcılığını başlatan özellik budur. VIC çipi ekrana görüntüyü gönderirken, bellekteki çeşitli bölgeleri tarayıp onlardaki grafik datasını yorumlayarak, ekrana göndereceği bilgileri satır satır hazırlar(*1) Ve herhangi bir zamanda taramakta olduğu satırı tutar. Buna raster satırı denir. Kritik nokta VIC çipinin taraması esnasında raster istenilen bir satıra geldiğinde kesinti(*2) yaratacak şekilde programlanabilmesidir. Bu sayede ekranın çizimi sırasında çok kritik zamanlarda bellekte veya VIC yazmaçlarında(*3) önemli değişiklikler yaparak çok ilginç efektler yaratabilir. Bu efektler arasında çeşitli donanım kaynaklarını ekranda tekrar tekrar değişik satırlarda yeniden kullanarak artırmaktan tutun da bellekte tek bayt kopyalamadan, tüm ekranı x y yönlerinde kaydırmak, dalgalandırmak, esnetmek ve sıkıştırmak, normal grafik modlarının desteklediğinden daha fazla renk veya çözünürlük elde etmek gibi bazı donanım hack'leri bulunur.

- Floating point işlemcisi olmaması. Bunu ihtimalen tahmin etmişsinizdir. Fakat Floating point işlemlerinin başka şekillerde (genellikle fixed point) yapılması, özellikle 3 Boyutlu efektleri yapmayı zorlaştırır.

Grafikler

- Toplam renk sayısı: C64'te normalde 16 sabit renk vardır.

- Grafik modları: C64'te çeşitli çözünürlük ve renk kullanım kısıtlamalarına sahip grafik modları vardır. Bütün grafik modlarında genellikle renk kullanımını kısıtlayan kuralları anlatabilmek için cursor karesinden kısaca bahsetmek lazım. C64 ekranı 8x8 piksellik kare bloklar halinde organize edilmiştir. Bu karelerin bir tanesini ifade etmek için Cursor karesi deyimi kullanılır. Ekran text modundayken cursor karelerine harfler oturur. Bitmap modundayken ise bir cursor karesindeki pikseller renk bilgilerini paylaşırlar. İlk başta donanımın desteklediği modlar:

- 320x200 Hires: Bir cursor karesindeki her piksel bir bit ile ifade edilir. Kare içindeki 1 olan pikseller aynı rengi alır (paylaşır). 0 olan pikseller de ikinci bir rengi paylaşır.

- 160x200 MultiColor: Bir cursor karesinde yan yana gelen iki piksel yine birer bit ile temsil edilir. Fakat bu defa 2 bitlik ifade gücü sayesinde cursor karesindeki her piksel 4 farklı renkten birini seçebilir. Yan yana gelen 2 piksel birleştiği için yatay çözünürlük yarıya düşer (pikseller kalınlaşır). Bu modda bir cursor karesinde 4x8 piksel olmuş olur. Kullanılabilen 4 renkten biri ekranın arka plan rengidir. Diğer üç renk her cursor karesinde değiştirilebilir.

- Karakter grafikleri: C64'ün text yazmak için kullandığı fontların bitmapleri bellekte bir bölgeden yüklenebilir. Bu bölgedeki bitmapler değiştirilerek çok çeşitli fontlar yaratılabildiği gibi, bu fontlara bir grafiğin parçaları yüklenip, daha sonra harfler yan yana dizilerek büyük grafik parçaları oluşturulabilir. Bu C64'te çok kullanılır. Çünkü 8x8 piksellik bloklar tek bayt ile ifade edildiği için ekranda grafik animasyonları kolaylaşır. Karakter grafikleri genelde tek renkli veya 3 renkli olacak şekilde yapılır.

- Super Hires ve Super MultiColor: Bu modlarda Bitmap grafiklerin önüne veya arkasına sprite katmanları konularak fazladan bir veya birkaç renk kullanma şansı elde edilir.

- FLI, AFLI: Bu modlar yazılım yoluyla her raster satırında VIC çipinin yazmaçlarının hassas bir zamanlama ile değiştirilmesi sonucu bir cursor karesinde kullanılan renk sayısını artıran modlardır. Örneğin FLI, Multi color modunda bu triği uygulayarak cursor karesinin her satırında kullanılan 3 rengin 2'sinin değiştirilebilmesine izin verir. AFLI aynı şeyi Hires için yapar (kullanılan arka plan ve ön plan renkleri, cursor karesi içinde her satırda değiştirilebilir.)

- Interlace Modlar: MCI, IFLI, I-AFLI: Ekrandaki bir piksel saniyede 50 kere taranır. Eğer pikselin rengi bir taramada koyu mavi, bir sonrakinde siyah olmak üzere sürekli değiştirilerek 50 taramada 25 kere siyah 25 kere koyu mavi gösterilirse, ekranda mavi ile siyah arası (lacivert) olarak görünür. Bu methodla C64'ün gösterebildiği renk sayısı olan 16, 136'ya çıkarılabilir. Fakat pratikte 136 rengin hepsi iyi gözükmez. Şimdiye kadar bahsettiğimiz modlarda iki grafik çizilir ve bu grafikler saniyede 50 defa değiştirilirse Interlace modları elde edilir. Aynı zamanda bu switchleme esnasında resimlerden biri 1 piksel sağa kaydırılarak kalın pikselli modlarda piksel kalınlığı azaltılabilir.

- UFLI, SHFLI, SHIFLI, XFLI vs: Bunlar daha da uç noktalardaki modlardır. Ama henüz kullanan insan sayısı az.

- Border: C64'te text ve Bitmap gösterilebilen alan ekranın ortasındadır. Üstten, alttan, sağdan ve soldan bir çerçeve ile çevrilidir.

- Spritelar: Bitmap veya karakter grafiklerin önünde gösterilebilen donanım destekli 8 grafik bloğu vardır. Bunlar 24x21 (Tek renkli - 12x21 3 Renkli) bloklardır. Yazılım hackleri kullanılmadan 8 tanesi aynı anda ekranın herhangi bir yerinde gösterilebilir. Spriteların bir diğer önemli özelliği de yine bazı yazılım hackleri ile borderlar açıldığı zaman o bölgede gösterilebilmeleridir.

Müzik

C64'ün SID çipi bugün bile zaman zaman ticari albümlerde kullanılan çok özgün bir sese sahiptir. Tabii onun da sahip olduğu kısıtlamalar belirleyicidir.

- 3 Kanal ses. Herhalde bunu bilmeyen yoktur. Aynı anda üç ses kullanılabilmesi genelde C64 müziklerinde sıklıkla kullanılan bazı trickleri beraberinde getirmiştir. Örneğin aynı kanaldan bas ile baterinin çaldırılması, veya tek kanaldan akor sesi verebilmek için hızlı arpej sesleri kullanılması gibi.

- 3 kanaldan bir veya birkaçının çıkışına uygulanabilen filtre. Bu filtreler seslerin şekillendirilmesinde çok etkin olabilmelerine karşın SID çipinin iki versiyonu arasındaki farklar yüzünden müzisyenler genelde filtre değerlerini belli aralıkta tutarlar.

- Sample kullanımı. Uzun yıllar sampler donanımlarının pahalı olması, fazla bellek olmaması gibi sebeplerden sample kullanımı demolarda sevilen ama kısıtlı bir seviyede kaldı. Fakat yıllar içinde sample sesler ve SID seslerini beraber kullanan müzikler ve ilerleyen tekniklerle, artan bit derinlikleri elde eden çaldırma rutinleri görüldü.

Efektler Tarihi (Özeti)

1. Dönem (1985-1992): VIC Sihirbazları

Herkesin bildiği logo + scroll dönemlerini bu yazıda atlayıp doğrudan efektlerden bahsetmek gerekiyor. C64 scene'de 91-92'lere kadar yapılan demolarda kullanılan efektler çoğunlukla VIC çipinin raster interrupt triklerini kullanan efektlerdi. Bu efektleri izlerken hatırlanması gereken şey bunların genelde çok çok hassas zamanlamalı (cycle-exact (*4)) kodlanması gerektiği. Bunlardan bir kaç tanesine değinelim.

- Raster Bars: Ekran rengi her satırda değiştirilerek renkli yatay çizgiler elde edilir. Bunlar anime edilebilir. En ilkel demo efektidir.

- Raster Splits: Ekran rengi satır içinde birden fazla kere değiştirilerek raster barlar bir satır içinde farklı renkler alır.

- Tech Tech: Ekranı sağa sola piksel piksel kaydırmaya yarayan yazmaçlar, her satırda değiştirildiğinde dalgalanma efekti oluşur.

- FLD: VIC çipi kandırılarak ekran çiziminin başlaması geciktirilir. Böylece ekran komple aşağı kayar.

- Border açma:

- Alt üst borderlar: Her taramada ekranın en altına gelindiğinde border ebadı değiştirilir. Böylece VIC çipi borderı zaten kapattığını sanır oysa kapatmadan devam eder. Alt ve üst borderlar yok olur. Bu bölgede sprite gösterilebilir.

- Yan borderlar: Her satır taranırken ekranın en sağına gelindiğinde border ebadı değiştirilir. Böylece VIC çipi borderı zaten kapattığını sanır oysa kapatmadan devam eder. O satırda yan border yok olur. Yan borderın açık olduğu her satırda bu işlem tekrarlanır. O yüzden daha zor bir efekttir.

- VSP: FLD yapılırken aynı zamanda çok hassas bir zamanlamayla satır başlangıcı da geciktirilebilir. Böylece ekran hem x hem y yönünde hiç bayt kopyalamadan kaydırılabilir.

- Sprite stretch: Spritelar normalde iki katı büyütülebilir. Bu durumda sprite her satırını iki kere tekrar eder. İşte bu tekrar etme devresinin davranışı hacklenerek, bir sprite'ın istenilen satırları istenildiği kadar tekrar ettirilebilir. Böylece spritelar y yönünde istenildiği gibi elastik esnemeler yapabilir.

- Raster efektleri önünde spritelar: Spritelar ile ilgili en önemli problemlerden biri bir sprite'ın bulunduğu satırlarda kod zamanlamasında değişiklik gerektirmesidir (*5). Bu yüzden hassas zamanlamalı bir efektin önünde uçuşan spritelar görürseniz (özellikle y değişiyorsa) bilin ki efekt bir kaç kat zorlaşmış demektir.

- Multiplex: Ekranda 8 sprite çizildikten sonra kesinti yaratıp 8 spriteın yeri değiştirilerek VIC'in onlarca sprite çizmesi sağlanabilir.

- DYSP: Multiplex ile artırılmış spritelar eğer sürekli birbirlerine göre y sıralamasını değiştirecek şekilde hareket ederse işler zorlaşır. Çünkü bu sefer her taramada spriteların yeni sırasının tespit edilip multiplex kodunun farklı sırayla çalışması gerekir. Bu efekt zamanının en prestijli efektlerindendi.

- DYCP: Bir kayan yazının her harfi y yönünde salındığı zaman o efekt DYCP oluyor. DYCP yapan birden fazla kayan yazı aynı anda kaydırılarak dünya rekorları elde ediliyor.

- FLI: Bu bir grafik modu olduğu kadar bir efekt de sayılır aynı zamanda. Ekranda çok detaylı bazı tricklerle VIC çipinin normalde 8 raster satırında bir yaptığı renk belleğine erişimi her satırda yapması sağlanıyor. Bu sayede grafiklerin renk bilgileri daha özgürce değişebiliyor.

Bütün bu efektlerin birden fazlasının da kombinasyonlar halinde kullanıldığı pek çok efekt vardır.

2. Dönem (1990-1996): Matematikçilerin doğuşu

Özellikle Amiga demolarından gelen matematik ağırlıklı, 2 ve 3 boyutlu efektler C64 scene'ini işgal etmeye başlar. Çok temel bir dürtü artık Amiga'da yapılan bir efekti çok daha düşük donanımlı C64 üzerinde de yapabilmektir.

- Sinus noktaları: Binbir türlü sinüs fonksiyonunun birbirinin içinden geçirilmesi ile elde edilen sinus eğrilerine göre zıplayan hareket eden noktacıklar. Sinüsleri C64'te gerçek zamanlı hesaplamak mümkün olmadığından tablolar kullanılır (*6)

- Plazma: Sinüsleri iki boyutta üst üste bindirdiğinizde elde ettiğiniz değerlerin herbirine karşılık güzel geçiş yapan renkleri koyduğunuz zaman plazma efektlerini elde edersiniz.

- Vector: Üç boyutlu dönen yaklaşan uzaklaşan objeler çizdiren rutinlerdir. Bol miktarda matematik işlem gerektirirler. Bu işlemlerin çoğu çarpma ve bölmedir. Sayıların çoğu noktalı sayılardır (FPU yok hatırlayın). Genel olarak objelerin köşe, kenar veya yüzey sayılarının artması işleri daha da zorlaştırır. Ayrıca ekranda çizim yapılan bölgenin büyük olması da işleri zorlaştırır. Çeşitli detay seviyeleri vardır. Artan zorluk sırasına koyarsak:

- 3D Dots: Objeler noktalardan oluşur

- Bobs: Noktalar yerine biraz daha büyük grafik parçacıkları (mesela toplar) kullanılır.

- Line: Wireframe diye de bilinen tel çerçevelerden oluşan cisimler döndürülür. Sadece kenarlar çizilir.

- Hidden line: Arkada olduğu için görünmemesi gereken kenarlar çizilmez.

- Light line: Her kenarın bir ışıklandırma değerine göre farklı renkte çizilmesidir.

- Filled vector: Yüzeyler tek renkle içi dolu çizilir. C64'teki en zor işlerden biri hızlı bir poligon rutini yazabilmektir.

- Flat shading: Yüzeyler aldıkları ışığa göre tek renkle çizilir.

- Gouraud Shading: Her bir köşe noktası aldığı ışığa göre renk alır. Yüzeyler sahip oldukları köşelerin renkleri arasında yumuşak geçişle çizilir.

- Texture Mapping: Yüzeylerin Bitmap grafiklerle kaplanması. Henüz C64'te 2-3 fps'den daha hızlısı yapılamadı.

- Düşük Çözünürlükler(4x4, 8x8): Bazı efektler genelde ilk olarak daha düşük çözünürlüklerde (büyük pikseller) yapılır. Sonraki yıllarda daha yüksek çözünürlüklere çıkılmaya çalışılır.

- Landscape: Genelde bir fonksiyona bağlı olarak geniş alanlarda yeryüzü şekilleri yaratan ve bunların üzerinde uçuş yapılan efektlerdir.

- Raycaster(Doom): Doom'un ne olduğunu bilmeyeniniz yoktur herhalde. Bu efektin duvarlar tek renk olan veya texture kaplı değişik versiyonları var.

- Çeşitli 2 boyutlu rotasyon stretch: Çoğunlukla 4x4 veya 8x8 modlarında yapılan efektler

3. dönem(1997-2000): Matematiğin Kırılışı

Bu dönemde ilginç bir kırılma yaşandı. 4x4, 8x8 modlarının çok fazla kullanılması ve matematik efektler zorlandıkça fps'lerin düşmesi scene'de negatif bir tepkiyi biriktirdi. Sonunda bu tepki yeni trend oldu. Kahrolsun büyük pikseller diye bağıran scenerlar, "oldschool" efektlerin yine popülerleşmesini sağladı. Öte yandan bu dönemde pek çok tekno müzikli büyük pikselli demo da çıktı. Bu dönemde çok fazla yeni efektten bahsetmek zor.

- Bump mapping: Işık vurunca kabartma olarak gözüken grafikler.

- X - Rotator: Bunlar genelde texture kaplı ve x ekseni etrafında dönen objeler.

4. Dönem (2000-2006): Matematikçilerle VIC Sihirbazlarının

barışı ve yeni Asiler

2000'lerde bazı newschool efektleri yapabilmek için oldschool raster tricklerin kullanılması bir bakıma iki ekolü yaklaştırırken, daha önce büyük piksel olduğu için eleştirilen efektlerin yüksek çözünürlük ve fps'lerde de yapılabildiği ortaya çıktı. Bu sırada 90 ortalarında birkaç örneği görülen demolarda kavramsal bütünlük, akış, senaryo gibi özellikleri ile farklı arayışlara giren demolar daha çok yapılmaya başlandı. Bu demolardaki odağın teknikten artistik yöne kayması kimi scenerlarca eleştirildi. Bu da onları aslında bu yazının kapsamı dışına çıkarıp başta bahsettiğimiz sübjektif beğeni kapsamına alıyor.

Bu dönemde genel olarak eski efektlerin mükemmelleştirilmesi dışında dikkat çeken bir efekt türü daha var. Aslında efekt türü olmaktan öte bir metod:

- Drive coding: C64 demolarının tamamının kullandığı disket sürücü 1541, kendi bünyesinde bir 6502 işlemcisi(1 MHz 8 bit) ve 2K RAM bellek bulundurur. Bu belleğe C64 üzerinden bir kod gönderilip oradaki CPU'nun o kodu çalıştırması sağlanabilir. Bu sayede bazı özel hızlı yükleme rutinleri zaten uzun yıllardır geliştiriliyordu. Fakat son birkaç yılda, bazı zor efektlerde hesaplamaların bir kısmı drive CPU'suna gönderilip oradan sonuçlar alınarak multiprocessor çalışma prensibi kullanılıyor. Bu demolarda aynı zamanda çok parçalı olup yükleme yapması işleri iyice zorlaştırıyor.

Sonuç:

Şimdi C64 efektlerinin en önemlilerini değerlendirebilecek kadar tanıyorsunuz. Demo yapımı, stiller, seçimler sürekli evrim geçiriyor. Bu sürekli değişimin içinde bir takım ölçülebilir teknik kriterleriniz olması C64 demolarından alacağınız zevki artıracaktır. Hele hele daha çok demo izledikçe demolarda birbirine yapılan göndermeler ve rekabeti de fark etmeye başlarsınız. Buna bir de disk dergilerindeki yorumları eklerseniz C64 scene'in o etkileyici toplam ambiyansını yakalarsınız ki bu demo yapmasanız bile her zaman içinde kalmak isteyeceğiniz bir ortamdır.

Dipnotlar:

1- Zaten video çıktısı üreten hemen hemen bütün cihazlar bu şekilde çıkış üretir. Ekrandaki piksellerin renk bilgilerini, satır satır ve her satırda soldan sağa olmak üzere video sinyaline dizerler ve ekrana gönderirler. CRT teknolojisine sahip bütün ekranlar video bilgisindeki sinyalleri kullanarak ekranı aynı sırada tarayan bir ışına sahiptir. (aslında üç: red, green, blue)

2- CPU bir programı çalıştırmaktayken, IRQ bacağına gelen bir istekle yaptığı işi durdurup yeni bir parça programı çalıştırır. O programı bitirdikten sonra kaldığı yere geri döner. VIC çipinin interrupt isteme bacağı CPU'nun IRQ pinine bağlıdır.

3- Yazmaç register'ın Türkçesi. Kullanmaktan hoşlandığım birkaç Türkçe bilgisayar teriminden biri...

4- C64'ün her raster satırında harcayacağı zaman bellidir (PAL makinelerde 63 cycle). Bazı efektlerin çalışması için mesela bir değerin bir yazmaca tam olarak satırın 58. cycle'ında yazılması gerekebilir. Bir cycle geç kalmak efektin çalışmamasına sebep olur. Bu yüzden bu işi yapan kodu yazarken yazdığınız assembly komutlarının her birinin kaç cycle süreceğini bilmeniz ve planlamanız gerekir.

5- Sprite olan satırlarda VIC, CPU'nun o satırda kullanabileceği cycle'lardan birkaç tanesini bloklar. Bu yüzden CPU kodunun çalışma zamanlaması değişir.

6- Tablo kullanımı C64 matematik demo programcılığındaki aklın yattığı yerdir. Hangi fonksiyonları tablolara dönüştürmek ve o tabloların bellekteki yerleşimi çok kritik zaman kazançları sağlayabilir.