Merhabalar,
Bayramın son günü basit bir loader yazmak için kolları sıvadım. Ancak üzerinden geçen bunca yıldan sonra c64 assembly programlama düşündüğüm kadar hızlı sonuç vermedi. Loader'ı istediğim hale getirene kadar bir miktar daha çalışmam gerekiyor.
Bunun haricinde, CPLD kısmındaki son detaylar ve ince ayarları bitirdim. Hatta ilk fırsatta CPLD içerisindeki logic mantığı biraz detaylı anlatan bir post atacağım.
Gel gelelim, iki gündür 17KB lık bir imajı DMA ile RAM'e atıp çalıştırmak için debeleniyorum ama çalışmıyor... :/
Her seferinde farklı bazı byte'lar bozuk gidiyor. Denemediğim olasılık kalmadı. Artık C64'ün DRAM sinyalleri olan, RAS, CAS vb'yi de problayıp hatanın ne olduğunu anlamaya uğraştım durdum.
Sonra madem DMA yapıyorum, her byte'ı attıktan sonra tekrar DMA ile kontrol ederim dedim, ama gene sonuç vermedi.
Phi2'den çok şüphelendim. Dalga şekli hiç kare dalgaya benzemiyordu. C64'ün 8MHz civarında olan Dot Clok'unu alıp, bunu CPLD ile işleme tabi tutarak kendi Phi2 sinyalimi ürettim, gene olmadı.
Ne yaptıysam transfer sırasında bazı byte'lar bouluyor.
Hatta bu akşamüzeri bu DMA işi olmayacak galiba noktasına kadar geldim.
Artık o kadar inat ettim ki, mesai gününü tamamen harcayıp daha derinlere indim. Bu sefer data bus üzerindeki her bir biti de problayıp bozulan byte'ı yakalamaya çalıştım.
Gerçi bu foto'da aslında problem kabak gibi görünüyormuş ama ben artık o ruh hali ile farkedemedim bile:

Bus üzerinde gidip gelen tüm trafiği incelerken farkettim ki bozulan byte'ların bozulmasında bir mantık var. Şöyle ki bozulan bir byte'ın 6.biti bazen 1 iken 0 olarak RAM'e gidiyor, bazen de 0 iken 1 oluyor:

Zaten bir önceki foto'da 6. bitin neredeyse hep 0 seviyesinde olduğu görülüyormuş. (Alttan ikinci sinyal)
Hatayı tespit ettikten sonra nedenini bulmaya geldi sıra. CPLD'nin o biti süren bacağı yada içerisindeki MacroCell uçtu herhalde dedim hemen, yeni CPLD lehimlendi. Sonuç aynı.
C64 tarafında bir sıkıntı var dedim, 2. bir C64'te denedim. Sonuç aynı.
Emin olmak için ilgili bitin yolunu C64 kartuş slotundan kestim. Bu sefer 6. bit hiç 1 olmadı, hep sıfır da kaldı. Hemen büyüteci elime alıp Doberman-64'e yakından bakınca hatayı buldum.
Lütfen kırmızı ile işaretlediğim yere bakın. O yolun kalınlığı 12 mil. İşaretli yerde ise kılcal bile denemeyecek bir kesik var. (Tahmin ediyorum 1-2mil kalınlığında bir kesik)

Bu PCB'yi ilk bastığımda yoktu. Yada bazen temas ediyordu bilemiyorum, zira elektriksel kontrol yapmıştım, ve hata yoktu PCB de.
Neyse lafı çok uzatmadan, hemen burayı lehimledim ve sonuç kısa bir video ile aşağıda:
Uzun lafın kısası, artık PRG atıp çalıştırabiliyorum. Tabi iki gün boşa gitmiş oldu gene.
Artık iş loader'ı yazıp bitirmeye kaldı.
Son olarak aşağıda 17KB lık imajın yüklenme plot'u var. Yaklaşık 125ms sürüyor ki herhangi bir optimazasyon henüz yapmadım. Örneğin addrh değişmediği sürece sadece addrl 'yi latchlemek yeterli olacak vb... Bu şekilde kaba bir hesapla 64KB yı bile 0.5 sn de yükleyebiliyor olacağız.

@delimawi tebrikler, süper bir çıkartıyorsun. Tabii I_ron_n, Metallic ve Simon'ı da unutmamak gerek. Forumdaki proje sayılarının artması sevindirici bir durum.
Aslında Yavuzg'nin yaptığı arcade tarzı projelerin, forumdaki bu tür projelerin artmasın da çok önemli bir yeri var diyebilirim.

joker_, sana aynen katılıyorum. Bir kartuş projesi yapma enerjisini zaten i_r_on ve Simon'dan aldım.
Yaparken de resimli olarak anlatıyor olma fikri de Yavuzg'nin arcade kabinleri serisini zevkle okurken oluştu.
CPLD, FPGA vs. konulardan hiç anlamadığım için tüm tasarımı TTL olarak yapmıştım.
Doberman-64 6510'u disable ederek okuma-yazma yaptığına göre 6510 yerine başka bir CPU C64 donanımını kullanabilir diye düşünüyorum.
TTL tasarım yaptığınıza göre bence hiç vakit kaybetmeden tasarımı CPLD'ye taşıyın. Çok rahat edersiniz. Hem de CPLD öğrnemiş olursunuz ki hiç te zor değil aslında.
Ben ilk uygun zamanımda Doberman-64 için yaptığım CPLD tasarımını detaylı olarak anlatacağım. Umarım ilginizi çeker.
Evet, DMA ile 6510 devre dışı kalıyor, yada duruyor, bekliyor, tüm adres, data ve RW hatlarını siz kullanabiliyorsunuz. Ama tabiki başından beri yazılmış olan VIC ile senkronize olma kısmını atlamamak gerekiyor.
Ben ilk mesajımda 6510'u devre dışı bıraktığım anda (DMA açıldığı anda yani), hiç VIC ile falan uğraşmadan kullanacağım sistemi diye düşünüyordum. HAtta ilk sorum da o idi.
Ama o kadar basit değilmiş konu. Detayları zaten yazdım...
1a - JRS $A659 - JMP $A7AE komutlarına karşılık gelen op-code'ları hafızada uygun bir yere yazmak. Mesela tape buffer olabilir. Bahsettiğim komutlar RUN komutuna karşılık gelir.
b - opcodeların bulunduğu hafıza bölgesinin adresini yığına atmak
2 - Bir kaç byte ile Klavye buffer kullanarak RUN komutunu vermiş gibi işlem yapmak.
3 - IRQ vektörünü değiştirerek, kısa bir interrupt rutini ile PRG'yi çalıştırmak.
$0313'e $3C, $0314'e $03 yazarak IRQ vektörü Tape buffer adresini gösterecek.
Tape bufferde ise JSR $A659 - JMP $A7AE komutları olacak. 6510 tekrar çalışmaya başladığında IRQ rutini de devreye gireceğinden bizim komutlar işlenecektir.
Ben de KERNAL'daki RUN komutunu çağıracak bir kodu orya buraya bir yere koyarak, raster interrupt vectoru ile dallanmayı düşünmüştüm.
Daha doğrusu olasılıklardan biriydi.
Ama 2. çözüm çok hoşuma gitti. Dedim ya çok uun zaman oldu, klavye buffer'ı olduğunu bile hatırlamıyorum C64 de. Eğer var ise en basit çözüm bu.
Bunu deneyeceğim ilk fırsatta.
RESET'i ise, transfer başlamadan önce atmayı düşünüyorum, bu sayede transfer öncesinde hafıza temiz olacak, VIC çalışıyor olacak vb herşeyden emin olacağım yani.
DMA serbest bırakılınca ikinci bir reset olmayacak.
Başlığın ilk mesajında "Sadece istendiği durumlarda (örneğin butonuna basılınca) devreye giren, anlık olarak 6510 CPU'yu durdurarak, C64'ün tüm RAM'bölgesine erişebilen, istediği adresteki bilgiyi okuyabilen ve yazabilen bir donanım." demişsin.
Burada 6510'un 0-1 adreslerine erişim yaparak tüm hafızayı Ram yapma durumu mu var yoksa 6510 ve PLA?? devreden çıktığı için mi tüm okuma/yazma işlemleri Ram'e ait oluyor. Ayrıca Doberman-64 ile C64'ün IO bölgesine erişmek mümkün değil mi?
Malesef sadece 6510 devreden çıkıyor. Yani PLA devrede. Bu sebeple 0 ve 1 adreslerindeki konfig ne ise, o şekilde erişim oluyor.
Yani ROM'lar kapatılmış ise, RAM okunuyor ama ROM açık ise ROM okunuyor o adreste.
Kısaca 6510 nereyi nasıl görüyor idi ise, DMA anında da o oluyor. Dolayısı ile IO bölgesi konfigürasyona bağlı olarak erişilebilir.
Bu konuda benim denemek istediğim bir DMA FREEZE fonksiyonu var. O işlem esnasında bir şekilde örneğin tape buffer a bir kod atıp, 0 ve 1 aderslerinin durumunu da okuyup gerekiyor ise değiştirip DMA yapacağım.
0 ve 1 adreslerine yazılan değerler tamamen 6510 içerisinde yapıldığı için adres ve data busdan o iki adrese erişilemiyor. Sadece 6510 içerisinde çalışacak bir kod ile okunup yazılması mümkün bildiğim kadarı ile.