Bugün projeye biraz daha vakit ayırabildim.
Özetle henüz istediğim DMA transferini tam olarak başaramasam da, C64'ü kilitlenmeden bir kaç byte'lık DMA transferleri yapabildim.
Ekran rengini değiştirip (53280,53281), ekrana yazı yazabildim. (1024 adresine)
Ama bu DMA işi göründüğü kadar kolay değilmiş. Genellikle bir kaç byte'dan uzun transferlerde C64 kilitleniyor.
Sanırım DMA'yı başlatmak kadar çıkmakta da sıkıntılar var. Görebildiğim kadarı ile DMA'dan çıkarken çoğunlukla C64 kilitlendi.
Merak edenler için bir kaç foto ile bugün yaptıklarım ve notlarım:
Elimdeki neredeyse tüm komponentler SMD olduğundan board üzerinde arge yapmak biraz sıkıntılı oluyor.
Henüz test edilmemiş bir fikir için de kart çizmeye üşendim açıkçası. Bu sebeple PIC, 573 vb komponentleri DIP hale getirdim. Biraz komik duruyorlar ama çalışıyorlar, sıkıntı yok.

Setup

Bu C64 arge için ayrılmış olduğundan bazı yerlerden sinyal almak için korkmadan lehim yaptım açıkçası.
Board üzerindeki üç entegre 573'ler. 2 Adet adres latch ve bir adet 8 bit data latch.
Altaki tek entegre ise PIC 18F26K22.
Phi2 Sync

Burada Phi2'nin high olduğu, yani VIC'in bus'ı kullanmadığı faza nasıl synch olunduğu görülüyor.
Beyaz wavefom C64'in Phi2 sinyali.
PIC bir adrese yazmak istediğinde, öncelikle adresh, adresl ve data latchlerine adres ve yazacağı datayı yerleştiriyor.
Ancak latchlerin çıkışları enabled değil. Data ve adres hazır olunca turuncu renkli PUSH hattını kaldırıyor.
Bu noktadan sonra, NAND kapısı, Phi2'nin ilk HIGH olduğu anda latchleri enable ediyor.
PIC bekliyor, Phi2 tekrar low'a düşünce işlem bitmiş oluyor. PUSH bacağını bırakıyor.
Şu anda daha çıkışlar C64'e bağlı değil sadece test yapıyorum.
Bu işelm için PIC tarafındaki poke rutini çok basit:

Yukarıdaki kodda BA (Bus Available) ın da nasıl handle edildiği görülüyor.
Bu işleme ait waveform aşağıda. Herhangi bir anda BA low olursa, VIC'in bus a tam zamanlı ihtiyacı var demek oluyor.
Görüleceği üzere bu durumda PIC, BA'nın tekrar high olmasını bekliyor.

Ayrıca waveformlarda görülebileceği gibi, şimdilik her 4 C64 cycle'ında bir byte DMA yapmaya hızı yetiyor PIC'in.
C yerine daha optimize assembler da yazılabilir ama çok da gerekli değil bence. Şu hali ile 1 sn de yaklaşık 256KByte transfer etmek mümkün.
Toplam C64 hazfızasını 0.25 sn gibi bir sürede doldurabiliriz. Tabi gerçekte data bir mediadan okunacğından bu hız çok daha düşük olacak.
Ama tahmin ediyorum ki en uzun oyun yada program bile bir kaç saniyede hazır olacaktır.
Phi2 Sync ve BA bekleme işlerinden sonra sırada DMA'ya giriş var

Bu photo da dün bahsettiğim, DMA'ya girmek için ilk bad line'nın beklenmesi görülüyor.
BA'low olduktan bir kaç cycle sonra DMA low'a çekilerek, Bad line sonrasında 6510'un beklemede kalması sağlanıyor.
VIC'in işi bitince de DMA yapılmaya başlanıyor. Burada 16 byte transfer ediliyor.
İşlem sonrası DMA release ediliyor, C64 çalışmaya kaldığı yerden devam ediyor. (Her zaman olmasada teorik olarka

)
Tek byte DMA transferi

Artık testler tamam olduğuna göre adres ve data hatlarını bağlamaya sıra geldi. Ancak elimde uygun bir soket yok.
Bir Final3'ü harcamak zorunda kaldım.

Adres Hatları

Data Hatları

Board Yakın Görünüm

Bu ucube kartı, adres ve data hatları bir yerlere değmeyecek şekilde ayarlayıp C64'e takıp test etmeye cesaret ediyorum


Kaza bela yok, herşey normal çalışıyor şimdilik.
Adres ve data hatlarını latch lere bağlıyorum. İkinci dönüm noktası


Hala herşey normal çalışıyor. Tabiki şu aşamada henüz latch outputlar enabled değil.
Bu noktadan sonra, DMA, RW ve latch outputlarını da aktif ederek C64'ü tekrar açıyorum ve ilk gol geliyor.
Siyah ekran

İlk sıkıntı şu ki, karttuş portundaki R/W bacağı sdece input değilmiş. Yani normal çalışma esnasında C64 tarafından high/low olabiliyor.
Bu bacağı doğrudan NAND kapısının çıkışına bağlayınca C64'ten gelen R/W sinyali ile çakışıyor. Kısacası bu pini de adres ve data hatları gibi tristate yapabiliyor olmak lazım.
Şimdilik acele ile ters diyot koyarak denemeye devam ettim ancak bu uygun bir çözüm değil.
(Mosfet ile LOW'a çekilebilir.)
(Yada galiba tüm logic bir CPLD'ye atılacak sonunda

)
İkinci gol PIC'den geldi. PIC ve C64 aynı anda enerji alınca, PIC'in bacakları reset bitene kadar bir süre tanımsız kalıyor. Bu esnada random olaylar oluyor.
Latchler tetikleniyor, açılışta C64 e uygun olmayan zamanda DMA sinyali gidiyor vb.
Buna da bir çözüm bulunacak. Şimdilik PIC enerji aldıktan sonra C64'ü reset hattından manuel resetleyerek geçtim bu kısmı da.
Bir başka sıkıntı Phi2 hattındaki sinyalin şeklinin özellikle LOW/HIGH geçişi esnasında çok kötü olması.
Bu her zaman problem yaratmasa da bazı anlarda aşağıdaki jitter'ların olduğunu farkettim:
Bu jitter, Phi2 NAND kapısından geçirerek, C64'e gönderdiğim R/W ve Latch /OE hatlarını da etkiliyor.

Nedenini incelemek için osiloskop ile bakınca aşağıdaki sinyali gördüm.
Acaba Phi2 deki bu kare dalgadan çok uzak sinyal benim cihaza mı has?
Bu şekilde bir dijital sinyali görünce şaşırdım açıkçası.

Phi2 girişine bir schmitt trigger atmak lazım dicem ama şemaya göre bu sinyal C64'deki bir çok chipe bu hali ile gidiyor ve sıkıntı çıkmıyor?
Başta dediğim gibi bugünlük bir kaç byte DMA transferi yapmayı başardım.
Ama uzun transferlerde C64 kilitlenebiliyor. Ayrıca DMA'dan çıkarken de büyük olasılık ile C64 kilitleniyor.
DMA'dan çıkmak için aslında aklıma şimdi bir yöntem geldi. Aynı DMA'ya giriş yaparken yaptığım gibi, bir BAd Line bekleyerek, BA low iken DMA'yı release edebilirim.
En azından bugün bir ışık gördüm. Vaktim olduğunda devam edeceğim.
Bu arada projeye Doberman64 ismini verdim. DMA nedense Doberman kelimesini çağrıştırdı...

İyi akşamlar,