Not 1 : POC yani Proof of Concept özellikler henüz genel kullanıma hazır değil. Olur da talep olursa genelleştirmek için üstünde uğraşabileceğim özellikler.
Not 2 : Kartuş ile ilgili daha detaylı bilgiye Commodore.gen.tr üzerindeki şu konu üstünden ulaşabilirsiniz : IRQHack64 - EPROM Kullanan :) Prg Yükleyici Kartuş
İlk tasarım SRAM ve Tristate buffer çipleri kullanmaktaydı ve basitçe bir kartuş emülatörü yapmak istemiştim. Bu tasarım başarısızlıkla sonuçlandı zira VIC-II'nin C64 bilgisayarındaki rolünü tam anlamıyla kavramadığımı fark ettim.
Başarısızlığa uğrayan deneme :
Projenin kod adı bu aşamada NoFlash64 idi. Sonra birden Sid Player projemde kullandığım tekniği burada da kullanabileceğim aklıma geldi. Orada 6502'nin çok fazla kullanılmayan SO pin'ini senkronizasyon amaçlı, NMI ve IRQ interrupt'larını da data göndermek için kullanmıştım.
Sid player devrem şu şekilde idi :
Teknik olarak eprom üstündeki kod ile boot edilip interrupt'lar ele geçiriliyor, IRQ (0 biti için) ve NMI (1 biti için) interrupt'ları vasıtası ile data gönderimi sağlanıyor. SO input'u ise bütün süreçte 6502 ve Arduino'nun eş zamanlı hareket etmesi için sinyalleşmeyi sağlıyor.
Sonradan eprom kullanmadan programlanabilir bir logic device olan GAL yardımı ile de bu boot kodunun oluşturulabileceği ve SO pin'i olmadan ve hatta sadece tek bir interrupt hattı ile de transferin mümkün olduğu ortaya çıkmıştı.
http://forum.6502.org/viewtopic.php?f=10&t=3383
Kartuş projemize geri dönecek olursak. İlk uygulama sid player'ımdakine benzer idi. Ancak bit bazlı bir transfer yöntemi olduğu için oldukça da yavaştı.
Şurada görülebilir :
Sonra aklıma başka bir fikir geldi. 16Mhz'lik 6502*'den 16 kattan daha hızlı bir işlemci ile çalışıyordum. Her seferinde 1 ve 0'lar göndermek yerine Eprom'un yüksek adres bacaklarını switch ederek tüm bir byte'ı göndermek mümkün olamaz mıydı? Bu deneme doğrudan başarılı oldu. Eprom üzerindeki boot kodunu 256 byte'a sığacak hale getirdim ve her biri ilgili 0'dan 255'e kadar ilgili byte'ı göndermek üzere bu kodun 256 kopyasından ibaret bir eprom imajı oluşturdum.
256 byte'lık ana loader kodu C64'ü reset'lemek transfer için gerekli nmi rutinini barındırmaktan sorumlu. Bu tasarımla interrupt'lar Arduino ve C64 arasındaki senkronizasyonu sağlamaktan sorumlu. Bu aşamada tercihim NMI üretmekten yana oldu. Arduino'dan C64'e veri aktarımı için bu yeterli, peki ya C64'den Arduino'ya veri gönderme? Bunu Arduino'ya IRQ hattını dinleterek çözdüm. Gönderilen dataya göre zamanlaması modüle edilmiş raster interrupt'ları sayesinde C64 de Arduino'ya veri gönderebiliyor. Oldukça yavaş olsa da bu gönderim sadece kartuşun menüsü gibi özel yazılmış programlarla Arduino'nun basit iletişimi için kullanılıyor.
Kartuşun çalışma şekli kabaca şöyle,
Pek tabii bu basit anlatımı, gönderilecek esas datanın yanısıra verinin uzunluğu, başlangıç adresi gibi detaylar da söz konusu. En önemlisi : Interrupt'lar Arduino ve C64'ün senkron olmasını sağlasa da VIC-II'nin DMA isteklerinin de halledilmesi gerekiyor. Bu konudaki çözüm ekranı kapatmak. Transfer rutini içinde de bunu halletmek mümkün ancak kartuşun performansını etkileyeceğinden ekranı kapatmak daha pratik. Zaten en büyük program / oyun vesaire'nin yüklenmesi en fazla 2-3 saniye sürüyor.
Bu hızlandırma çalışması sonrası sonuç aşağıdaki şekilde :
Saniyede gönderilen veri miktarı 15K civarı idi. Daha sonra NMI rutini optimize edilip her seferinde 1 byte yerine 2, 4 ve 8 byte gönderimi de mümkün oldu. NMI rutinindeki interrupt'a girme ve interrupt'tan çıkmadan kaynaklanan verimsizlik büyük ölçüde giderildi böylece. Bu değişiklik sonrası hız 30-40K seviyelerine geldi.
Sonuç şu şekilde :
Kartuş bir adet arduino pro mini içerdiği için doğal olarak bir seri arabirime sahip. Bu arabirim kullanılarak Pc'den c64'e program aktarımı mümkün. Başarılı bir şekilde test etmem henüz mümkün olmadı ancak seri bağlantıyı bluetooth ve wireless üzerinden konuşturan arabirimler ile kablosuz program gönderimi de mümkün olmalı.
İlaveten kartuş dosyaları saklamak için bir flash yerine sd kart kullandığından bazı üç kağıtlar da söz konusu olabiliyor.
Örneğin : Herhangi bir uzunlukta bir wav dosyasını çalmak,
Sd karttan istenen dosyaların stream edilmesini sağlamak :
Bu örnekte C64'de çalışan program her seferinde farklı bir KOALA formatındaki resmi kartuştan istiyor ve gösterimini sağlıyor.
Ve son olarak ta herhangi bir uzunlukta video dosyasının stream edilmesi. Bu örnekte 160x80 5fps multicolor video çalınıyor. Burada kullanılmış olan video çevrimi kendi yazdığım basit bir çevrim. Project One gibi tool'lar daha iyi kalitede bir çevrim sağlıyor. Bu programın batch modu olmadığı için kullanamadım.
Video gösterimi işinde kartuş tamamen farklı bir mantıkta çalışıyor. Orjinal program yüklemede kullanılan yöntemden farkları şu şekilde :
Kartuşun blok diyagramı şu şekilde :
Tembel bir karaktere sahip olduğum için PCB tasarımında Commodore.gen.tr forumundan sevgili Özay Turay'dan yardım aldım. Eagle schematic ve board tasarım dosyalarına aşağıdaki linkten ulaşabilirsiniz.
Not: Browser uyaracaktır güvenli olmadığına dair ancak bunun tek sebebi SSL sertifikasını kendim üretmiş olmam, güvenle devam edebilirsiniz.
https://www.tepetaklak.com:8443/svn/Public/Hardware/IRQHack64/
Arduino kaynak kodları, Eprom'a yazılacak 6502 loader kodu ve menü kodlarına ise aşağıdaki linkten ulaşabilirsiniz. Buradaki versiyon ilk ön siparişlerde kartuşlarla beraber gitmiş olan yazılım. Turbo modu, wav çalma, video oynatmanın source'ları rafine olmadığı için henüz bir yere upload etmedim.
https://www.tepetaklak.com:8443/svn/Public/
İhtiyaç duyacaklarınız : Arduino IDE, 64Tass derleyicisi, eprom yazabilmek için araç/gereç
Elimde bir miktar mevcut. İlgileniyorsanız bir email atmanız yeterli