Bugün biraz vakit ayırabildim, öncelikle şu VIC-6510 paylaşımını detaylı olarak inceledim.
Sondurumda toparldıklarımı özetlemek gerekirse;
6510 tarafında:
- AEC (Address Enable Control) bacağı low'a çekildiğinde adres, data ve RW pinini boşa bırakıyor. (High-Z) Bus'ı diğer chipler kullanabiliyor.
- RDY bacağı low'a düşürüldüğünde, işlemci yapmakta olduğu işlemi bitirip beklemeye başlıyor. Eğer RDY bacağı low'a çekildiğince bir yazma işlemi yapıyorsa bu maksimum 3 cycle sürebiliyor.
VIC-II tarafında:
- Her cycle da Phi2 low iken bus'a VIC erişiyor. Bunu senkronize etmek için VIC, AEC bacağını low'a düşürüyor ve 6510'un her cycle'in ilk yarısında High-Z olmasını sağlıyor.
- VIC'in AEC hattı ile, kartuş portundaki /DMA hattı bir and kapısı ile 6510'un AEC bacağına bağlı. Normalde /DMA pull-up ile high durumda olduğundan, 6510:AEC = VIC:AEC
- Bad Line vb sebepler ile, clock'un ikinci yarısına da ihtiyaç duyarsa bunu BA (Bus Available) hattını low'a düşürerek 6510'a bildiriyor.
- VIC'in BA hattı ve /DMA hattı bir and kapısı ile 6510'un RDY bacağına bağlı. Normalde /DMA pull-up ile high durumda olduğundan, 6510:RDY = VIC:BA
Kartuş Portu ve /DMA:
- Kartuş portundaki /DMA hattı normalde pull-up edilmiş durumda yani high.
- /DMA hattı 6510'un hem AEC hemde RDY hatlarına birer and kapısı üzerinden bağlı. Yani /DMA low'a çekildiğinde, VIC'in durumu ne olursa olsun, hem 6510:RDY low, hem de 6510:AEC low olacak.
- Bu durumda 6510 yaptığı işlemi bitirecek ve bekleme durumuna düşecek. Bu da maksimum 3 cycle sürecek.
- Ancak yanlış zamanda /DMA low edilirse, 6510'un AEC bacağı da low'a düşeceğinden, yapmakta olduğu işlem var ise bitirememiş olacak. (İstenmeyen durum)
- /DMA hattını Phi2 ile senkronize bir şekilde high-low yapmaya gerek yok. İşlem süresince low da tutulabilir. Zaten Phi2 nin ilk yarısında da VIC biz low a çekmesek bile kendisi çekecekti.
- İşlem sırasında BA hattı devamlı olarak kontrol edilmeli, eğer VIC BA hattını low'a düşürürse, clock'un ikinci yarısına ihtiyacı var demektir. En kısa sürede adress, data ve RW bacağı High-Z hale getirilmeli. (Burada sanırım aynı şekilde 3 cycle zamanımız olabilir

)
- Ancak işlem sırasında BA low'a düşse bile /DMA hattını release etmeye gerek yok. BA tekrar high olduğunda 6510'a nefes aldırılmadan işleme devam edilebilir.
Seneryo:
- Doğru zamanda /DMA'yı low a çekmek: Bunun için aklıma gelen kolay yöntem, BA hattını dinlemek;
- VIC BA'yı low a çekerek bus'ı ele aldığında bir süre bekleyerek /DMA'yı low yapmak. (En az 3 cycle ama zaten VIC 40 cycle a yakın BA'yı low da tutyor zaten, zamanlama kritik değil.)
- Örneğin BA low olduktan 5us sonra /DMA yı low'a çekersek 6510'un bekleme halinde olduğundan emin oluruz. Yani özellikle Bad Line beklemiş oluyoruz.
- /DMA'yı low da tutarak BA'nın tekrar high olmasını, yani VIC'in bus ı bırakmasını bekle.
- BA tekrar low olana kadar bus artık bizim. Sadece Phi2 nin high olduğu durumlarda adres, data ve RW yi sür. Pih2 low iken bus BA high olsa bile Bus VIC'in.
- İşlem sonunda /DMA yı release et.
Taslak Şema:

Şimdilik taslak şema bu şekilde. Yazma anında Phi2 ile tam senkronize olabilmek için data output hattına da bir 573 ekledim.
Çalışma mantığı şu şekilde olacak:
- PIC asenkron olarak, okumak yada yazmak istediği adresi ADDR_HI ve ADDR_LO latchlerine latchleyecek.
- Bu esnada henüz, ADDR_EN, DATA_EN ve WR_EN bacakları low olacağı için, C64 tarafına giden gelen bir veri yok.
- Yazmak isteniyorsa, aynı zamanda yazılacak byte DATA ya latchlenecek.
- 16bit adres ve 8bit data hazır olunca, özellikle Phi2'nin low olması beklenecek (NOT: Eğer zaten low değil ise...) (Zamanlama kritik değil.)
- Phi2 low iken yani bus'a VIC erişiyor iken, ADDR_EN, eğer yazmak istiyorsak, ek olarak WR_EN ve DATA_EN high edilecek.
- Bu durumda da Phi2 low olduğundan, halen C64 tarafına giden gelen birşey olmayacak.
- Phi2 high olur olmaz, Latchlerin /OE'leri low a düşeceğinden senkronize olarak veri C64'e gidecek.
- Phi2 tekrar low olduğunda, WR_EN, DATA_EN ve ADDR_EN low edilip bir sonraki byte hazırlanacak ...
PIC'in RA portunu da C64 ten data okumak için boş bıraktım ama sanırım proje 28 pin'e sığmayacak.
44 pin bir PIC'e geçmek gerekebilir.
Yarın bir deneme yapmak istiyorum, bakalım teori çalışacak mı?