Evet, bugün facebook'ta biri C64'den VGA monitöre çıkış almak mümkün olabilir mi tarzında bir soru sormuştu. Bunu biraz teknik olarak inceleyelim diye düşünüyorum.
Daha önce aslında PAL sinyali bir şekilde HDMI'a çevirmeyi başardık hatta içerisine ses de ekledik. Hatta hatta PCB çizimi bitince üretime girmeyi bekleyen bir proje kıvamına bile geldi.
Daha sonra Mini Bartop Kabin projesinde, bu devrenin bir varyasyonunu kullanarak VGA çıkış ürettik. Ama bu bazı konuların denk gelmesi ile mümkün oldu, şöyle ki; NEO GEO çıkışı aslında NTSC yani 640x480@60Hz. Bu da neredeyse VGA 640x480@60 Hz Industry standard (pixel clock 25.175 MHz) zamanlamasına denk geliyor. Bu sayede formatı çok az da olsa çekip bükerek VGA formatına sokabildik.
Gel gelelim C64 çıkışı PAL. PAL olunca işler biraz karışıyor. İnce ince VGA detayına girmeye bile gerek kalmadan, 50Hz bir VGA standardı olmadığını görebiliyoruz. VGA Refresh rateleri 60,72,75,85,100 vb.. şeklinde.
İşte bu noktada frame buffer kullanmadan PAL sinyalden VGA sinyal üretilebilir mi diye bir challenge ortaya konulabilir mi diye düşündüm. Belki de güzel bir proje çıkabilir.
Framebuffer konusunu biraz açıcak olursak, gelen sinyal hangi formatta olursa olsun, eğer bir framebuffer hafızamız varsa, gelen görüntüyü bu hafızaya depoluyoruz. Çıkış tarafında ise hangi formatta sinyal istiyorsak encoder bu framebuffer hafızasından görüntüyü okuyup istediği şekilde görüntüyü üretiyor. Dolayısı ile decoder ve encoder birbirlerinden izole ve senkron olmadan çalışabiliyor. Bu da giriş ve çıkış formatları seçiminde büyük esneklik sağlıyor. Piyasadaki neredeyse tüm çeviriciler bu mantık ile çalışır.
Dezavantajları ise, ram maliyeti, screen tearing ve işleme gecikmesi olarak karşımıza çıkıyor.
Framebuffer kullanmayan sistemlerde ise (ki benim zaafım olan sistemler

) giriş ve çıkış tam senkronizasyon içerisinde çalışmalı. Yani gelen sinyal tam bir satır taradığında çıkış sinyali de aynı satırı aynı zamanda tarıyor olmalı. (NOT: Eğer line doubling yapılıyorsa örneğin, bir satır geldiğinde çıkış tam iki satır üretebiliyor olmalı vb.)
Burada framebuffer kullanmadan VGA sinyali üretme hedefine ulaşmak için şu an için gördüğüm en yakın çözüm PAL 720x576@50Hz sinyale karşılık, SVGA 800x600@56Hz formatını kullanmak. Evet ilk bakışta tam uyuşmadıklarını görüyoruz. Ama PAL'e en yakın VGA formatı bu.
Hatta şöyle bir hesap yaptım. SVGA sinyalin pixel frekansı normalde 36MHz. Bunu eğer 32MHz'e çekebilirsek neredeyse PAL sinyal ile zamanlamayı tam olarak tutturabiliyoruz.

EDIT: Tekrar okurken farkettim, yukarıdaki hesabı biraz açıklamak lazım. Normalde SVGA sinyalinde bir satır tam 28.44444444 uS de taranır ve pixel frekansı da 36MHz dir. PAL sinyalde ise (C64 assembly yazanlar iyi bilir) bir satır tam 64uS dir. Şimdi amacım C64 tam bir satır taradığında, yani 64uS de ben SVGA'de iki satır tarıyor olacağım. Yani line doubling yapacağız. Bu durumda SVGA satır zamanı 32uS olmak durumunda. Normalde 28.4444 olan zamanlamayı yaklaşık %10 yavaşlatarak 32uS ye çekersek bu iş olur. Bu hesap o hesap.
http://tinyvga.com/vga-timing/800x600@56HzTabi bu sinyale monitörler itiraz edecekler mi bilemiyorum. İleriki günlerde vaktim olduğunca FPGA ile yukarıda 32MHz'e modifiye ettiğim SVGA sinyali oluşturmaya çalışıp monitörlerin bu sinyale olan tepkilerini test edeceğim.
Eğer başarılı olursa belki bir de ucuz yollu FPGA tabanlı C64>VGA adaptör projesi çıkartabiliriz.
İyi akşamlar.