IRQHack64 C64 Kartuşu


IRQHack64 C64'e program (oyun) yüklemek için tasarlanmış bir kartuştur. Temel olarak bir arduino pro mini, mikro sd kart modülü ve 27C512 eprom içerir. Pek çok fastloader'dan daha hızlıdır. IEC interface'i olmadığı için sadece program dosyalarının yüklenmesinde kullanılabilir.

Ayrıca şu özelliklere sahiptir.

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ş

Kartuşun detaylı geliştirme aşamaları

İlk deneme Başarısızlık :)

İ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 :

İlk başarılı çalışma

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 :

Hızlandırma

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,

  1. Arduino C64'ü resetliyor, EXROM hattını düşük seviyeye çekip C64'ün eprom'daki kodla boot etmesini sağlıyor.
  2. Eprom'daki kod C64'ü ilklendirip Arduino'nun NMI üretmesini bekliyor.
  3. 1 byte transfer etmek için Arduino Eprom'un yüksek adres bacaklarını (A15-A8) gönderilmek istenen byte'a switch ediyor. Bu mümkün çünkü eprom üstündeki 256 kopya içinde değişik olan kısımlar sadece transfer rutini içinde kullanılan immediate değerler.
  4. Arduino NMI üretiyor, kartuştaki nmi rutini ise o an switch edilmiş byte'ı alıp saklıyor.
  5. Bundan sonra işlem 3 no'lu maddeden itibaren tekrar ediyor. Ta ki transfer tamamlanana kadar

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 :

Diğer özellikler

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 :

  1. Ekranı kapatmıyor. VIC-II'nin DMA yapmadığı zamanlarda sadece transfer sağlıyor. Bu da bir ekran karesinin aşağı yukarı 1/3'ü sürede. Yine de her bir taramada 400 byte transfer edebiliyor. 50*400 = 20000 olduğuna göre saniyede aşağı yukarı 20K transfer edebiliyor.
  2. Eprom üstündeki transfer rutini yerine RAM'daki kendi rutinini kullanıyor, bu da Eprom üstündeki genel amaçlı rutinden biraz daha hızlı.
  3. Parçalı transfer gibi bir mantık kullandığı için Arduino üstünde farklı bir transfer rutinine sahip. NMI rutini RAM'de iken aynı zamanda Eprom'a erişebilmek için de biraz üç kağıt yapıyor. Detaylarını daha önce linkini vermiş olduğum forum başlığında inceleyebilirsiniz.

Donanım & Yazılım

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ç

Credits Bu kişiler olmasaydı herhalde proje bir prototipten öteye gitmezdi.

Orjinal donanım
Nejat Dilek (I.R.on)
Eagle schematic & pcb tasarımı
Özay Turay (CGTR forumundan Simon)
Demo scene tarzı ek menü
Gökhan Aşçıoğlu (CGTR forumundan wizofwor)
8k/16k kartuş imajları için yamalar ve motivasyon :)
İlker Fıçıcılar

Sipariş

Elimde bir miktar mevcut. İlgileniyorsanız bir email atmanız yeterli

* : C64'te 6502 yerine bunun C64 için özelleştirilmiş olan 6510 kullanılıyor. Ancak genel yazılım ve donanım perspektifinden 6502 olarak adlandırmakta da bir sorun yok.