Bundan bir süre önce, organizasyon ve dekorasyon işleri ile ilgilenen bir arkadaşım ziyaretime geldi. Sinemanın 100. yıldönümü sebebi ile bir organizasyon düzenlemekte olduğunu bir konuda yardıma ihtiyacı olduğunu belirtti. Hazırladıkları organizasyonda ziyaretçilere, sinemanın doğduğu yıllardaki anbiyansı yaşatmak için o yıllarda kullanılan film göstericilerden birinin çalışır modelini yapmak istiyordu. Aslen benim ilgi alanıma hiç girmediği halde, enteresan bir fikir olduğu için seve seve kabul ettim. Yapacağımız alet bir mutoscope'tu ve ne yüksek teknoloji, ne elektronik ne de bilgisayar ile ilgiliydi.

Çeşitli varyasyonları olan cihaza bir örnek:

Bu cihazın içerisinde bir tambur ve tambur üzerine dizilmiş yüzlerce fotograf var. İzleyici cihaza yaklaşıp manivelayı yavaş yavaş çevirerek karelerin akmasını sağlıyor. Sadece yaklaşık 1dk kadar kapasitesi var ve ses yok.
Örnek bir film tamburu, tabiri caiz ise ilkel DVD...


Amcam kim bilir ne seyrediyor.


Neyse, konuyu çok dağıtmadan giriş kısmını geçip sadede geleceğim. Bir kaç gün araştırma yaptıktan sonra, yapacağımız cihazın ölçüleri, temel çalışma mantığı gibi taslakları oluşturup çizimleri hazırladım.

Marangoz arkadaşı çağırıp, o yıllardaki örnekleri gösterip ne tarz bir kabin istediğimizi anlattım ve taslak çizimleri verdim. Bir kaç gün sonra ofiste içi boş bir mutoscope duruyordu. İş beklediğimden çok daha iyi olmuştu.

Şimdi geçmişten günümüze ışınlanan bu kabini canlandırmak gerekiyordu. Oynatacağımız film organizasyonun anlam ve önemine binayen Lumiere Kardeşler'in 1895 yapımı Trenin Gara Girişi idi. Filmi karelerine bölüp ayrı ayrı bastırıp ciltçide ciltlettirip ansiklopedi kalınlığında 4 adet blok elde ettim. Blokları tambur üzerine yapışıtırıp, manivela dişli mekanizmasını da yapıp mutoscopu kısa sürede bitirdim. Çok keyifli bir iş oldu.


Film'in youtube linki:
https://www.youtube.com/watch?v=1dgLEDdFddkŞimdi eğer buraya kadar okuduysanız diyeceksiniz ki, "Bad Apple" ne alaka? Bunun forumla ve retro ile özellikle Commodore Yazılım ile ne alakası var... Dedim ya girişi kısa tutmaya çalışıyorum ama hanüz bitiremedim...

Yıllık iznime bayram tatilinden bir hafta önce çıktığım için, tatilden döndükten sonra henüz resmi tatil devam ediyordu. Haftasonuna doğru artık canım iyice sıkıldı ve birşeyler yapmak istedim. Henüz (hala!) megaOne programlayıcı PCB'leri ve de VGA16 PCB'leri gelmediği için, ne o konularda ne de kabin projesinde ilerleyemiyordum. Bir anda aklıma i_r_on'un IRQHack ile yaptığı video oynatma projesi geldi. megaOne ile ne yapılabilir acaba dedim.
Tabiki başlarda hedefleri yüksek tutarak teorik hesaplar yapmaya giriştim. Acaba megaOne içerisine hi-res modda full screen kaç snlik bir video sığabilirdi. Kaba hesapla 130 full screen frame sığabilir görünüyordu. Hani frame rate'i düşük tutsak bile bir dk lık bir video bile bu şekilde sığamayacaktı. Hem kısa hem de anlamlı bir film ne olabilir diye düşünürken mutoscope projesi geldi aklıma. Sinema tarihinin ilk filmi olan Lumiere Kardeşler'in Trenin Gara Girişi'ni oynatabilir miydim acaba? Yaklaşık 1dk ve o yıllarda kullanılan frame rate 15fps. 900 Frame sığdırmam gerekiyordu. Ama megaOne içerisinde 130 framelik yer vardı. Hadi frame rate'i biraz düşürsek, biraz da full screen oynatmakta feragaat etsek olabilir miydi?
Yaklaşık 2 gün boyunca defalarca denedim, ölçülerle oynadım vb. 10fps nin altına inmeden 2.5MB dan daha küçük bir set elde edemedim. Sonra bunu biraz da olsa sıkıştırsak nasıl olur acaba dedim. Hem C64 tarafında hızlıca açılabilmeliydi hem de yaklaşık %60 oranında sıkıştırabilmeliydim. Aklıma RLE algoritması geldi. Hem basit hem hızlı hem de kayıpsız... Bu şekilde biraz ilerleme kat ettim ancak 1MB altına hala inmiyordu.
Sonra farkettim ki RLE, C64'ün bitmap yapısına uygun değil. Zira hafızada alt alta gelen 8 byte dizili, sonra bir yan karta geçip yukarıdan aynı şekilde devam ediyor. RLE ise bir birini tekrar eden aynı byte'lar olduğunda çok efektif. Yani eğer alt alta gelen byte'lar bir yan karta geçmeden önce yukarıdan aşağıya kadar iner ve kolon bitince bir yan kolona geçilecek olursa çok daha iyi sonuç alacağız. Ben RLE'yi bu şekilde çalıştırmaya karar verdim ve beklediğim gibi rahat rahat 1MB altına indi toplam 506 kare 320x200 video.
Sözüne ettiğim karelerden bir örnek:

Yalnız bu datayı stream ederken her 8byte geldiğinde, yeni kartın yerinin hesaplanması gerekiyordu. Uzunca bir süre C64 tarafında bunu optimize etmeye uğraştım. Ama olmadı. Data megaOne'a sığdı ama C64 bu stream'i istediğim hızda decode edip oynatamıyordu. Maksimum 2fps civarında bir hız elde ettim. Tekrar başa döndük. Ya fps düşüreceğim ya da full screen olamayacak. Ama bu sefer sığmadığı için değil C64 yetişemediği için...

Aklıma demolarda kullanılan bir teknik geldi. Eğer datayı bitmap hafızasına değil de, karakter seti datasının üzerine stream edersem, karakterleri de ekrana istediğim şekilde sıralarım ve her 8byte'da bir yaptığım hesaplara gerek kalmazdı. Ama bir ekranı doldurmak için 4 karakter seti gerekiyordu ve bunların uygun scanlinelarda bank in/out edilmesi gerekiyordu. Video oynatma sırasında ekranda screen tearing oluşmaması için de page flipping yapmalıydım yani toplamda bana 8 karakter seti gerekiyordu. VIC-II aynı anda sadece 16KB adresleyebiliyor bu arada.
Çok detaya girmeyeceğim aslında olası gibi görünse de bu fikir de yattı. :/
Tatil bitmek üzereydi ve en azından ne yapılabilir diye hızlanmaya karar verdim. Şu ana kadar yaptığım çalışmalar boşa gitmesin diye sadece iki karakter seti kullanarak sonucu görmek istedim. Bu kadar teori acaba nasıl sonuç verecekti. Tabi karakter seti sayısı azalınca ister istemez video boyutu küçüldü. Bir frame'i sığdırabileceğim maksimum boyut 144x122 yani 18x15 karakter. Bu C64'ün çözünürlüğünün yaklaşık yarısı gibi.
Şimdi bu projeye başlarken megaOne kartuşun avantajlarından yararlanmak istiyordum ama C64 sınırlamalarından dolayı istediğim hedefi tutturamadım. C64 assembly yeteneklerim de oldukça körelmiş olduğu için uzun uzadıya optimizasyon işlerine giremedim. Neyse player'ı yazdım bitirdim ama iş içime sinmedi. Bu 1dk lık film bu çözünürlükte anlam bulmadı.
Ha bu arada video iyice küçülünce megaOne içerisinde bol bol hafıza kaldı. Ben de o zaman daha uzun bir film oynatayım bare dedim ve bir anda aklıma "Bad Apple" geldi.

2200 üzerinde frame, 700KB altına sıkıştı ve real time oynatılabilir durumda. Hatta yaklaşık 2 ekran tarama süresinde 1 frame decode edebiliyorum. Biraz optimizasyonla 20-25fps bile mümkün. Ama elimdeki frameler 12.5 fps için extract edilmişti. Tekrar extract etmeye üşendim.
Aslında daha önce C64 de release edilen bir sürümü var.
http://csdb.dk/release/?id=131628Benim "Bad Apple" ım ise megaOne avantajlarını kullanıyor ve video daha küçük olsa bile kayıpsız sıkıştırıldığı için çok daha kaliteli.
Seyrederken ekranın ortasında ufacık pencerede kalınca video içime sinmedi, biraz süsledim ben de...

Sağ ve soldaki efektler ile ekran daha dolu oldu. Sanki bir demo havası oluştu hafiften. Gerçi amaç sadece megaOne ile video oynatmaktı.
Ekran yerleşimi aşağıdaki gibi. Sarı kutucular videonun oynadığı bölüm. Dikkat ederseniz karakterler yukarıdan aşağıya doğru sıralı. Bu şekilde çok efektif RLE uygulanabiliyor video üzerinde.

Aşağıdaki videoyu telefonla çektim çok iyi olmadı ama fikir verecektir.
Eğer megaOne kartuşunuz varsa ekteki imajı yükleyip denyebilirsiniz. (Tamam şaka yapıyorum, söz yakında gelecek PCB'ler isteyenler edinebilecek...) Ama emulatörde denemek isterseniz crt imajı aşağıda.
http://s000.tinyupload.com/?file_id=01186321824594778625Son olarak ilgilneneler için assembly source da burada.
http://s000.tinyupload.com/?file_id=79671385659313561110 Keyifli seyirler...