commodore.gen.tr

Commodore => Commodore Donanım => Konuyu başlatan: eins üzerinde Eylül 17, 2015, 12:02:07 ÖS



Konu Başlığı: C64 DMA ?
Gönderen: eins üzerinde Eylül 17, 2015, 12:02:07 ÖS
Merhaba,

Bir proje için aklıma takılan bir durum var.
Hiç cartridge slottan C64 için DMA kullanan oldu mu?
Yapmak istediğim DMA low'a düşürüp, A/D bus'ını ele alıp, doğrudan C64 RAM'e ulaşmak. (Yazmak veya okumak.)

Bunun için bildiğim kadarıyla DMA'yı low a düşürmek ve BA sinyalini beklemek gerekiyor.
VIC'in Bus'a ihtiyacı olup olmadığını anlamak için BA yı dinlemek şart.
Ayrıca DMA'yı da kafamıza göre çekemiyoruz, CPU'nun komut işletmiyor olması gerekiyor, yada 3 clock cyc beklemek gerekiyor, eğer yaptığı bir iş varsa bitirmesi için.

Alternatif olarak, benim projede DMA esnasında VIC'e ihtiyaç olmadığı için VIC kapatılabilir. Bu durumda BA dinleme ihtiyacı yok. Ama BA'yı dinliyor olmak ta DMA'yı aşağıya çekme anı konusunda yardımcı olabiliyor. Yani BA dinlenerek, VIC bus'ı aldığında DMA request edersek, zaten VIC CPU'yu beklemiş olacağından, VIC'in işlemi biter bitmez DMA yapabilir durumda olacağım.

Esas kafama takılan ise, diyelim ki doğru zamanlama ile DMA başlattık. R/W ile de RAM'e okuma ve yazma yapabilir olacağız. Bu esnada Phi2 ile senkronizasyon yapmak gerekir mi?

Bir yerde okuduğum kadarı ile işlem şu şekilde olmalıymış:

 Wait for PHI2==high + BA==high
  Set DMA==low

  Repeat while PHI2==high + BA==high
    Set A0-A15 + D0-D7
    Set R/W = low     

Burada neden Phi2==High beklemek lazım diyor arkadaş?

Teşekkürler,


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 17, 2015, 13:02:49 ÖS
Daha fazla yazarim sonra da. Phi2 ye senkronize olma sebebi vic'in bad linelar haricinde de surekli bus'a 6510'u engellemeyecek sekilde interleaved olarak erismesi.



Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 17, 2015, 13:22:46 ÖS
Yani BA hattı müsait olarak göründüğü halde VIC bus a erişiyor mu?


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: ilkerficicilar üzerinde Eylül 17, 2015, 21:38:58 ÖS
Dinamik RAM refresh olayı.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 17, 2015, 22:01:17 ÖS
Yok BA hattı da ona uygun olarak değişiyor. Ancak bir cycle'ı her zaman 6510 ile VIC paylaşıyorlar. VIC her zaman bus master olarak hareket ediyor. 6510'a ne zaman bus'a erişeceğini, ne zaman adres bus ve data bus'a bağlantısını tristate etmesi gerektiğini dikte ediyor.
VIC sadece okuma yapıyor, 6510 ise hem okuma hem de yazma. Her cycle'ın (phi2) low fazında vic okuma yapıyor. Yüksek olduğu anları ise 6510'a bırakıyor.

Badline'larda ve sprite gösterilen yerlerde ekstra okuma yapma ihtiyacı olduğu için 6510'u RDY üstünden kesip ihtiyaç duyduğu okumaları tamamlıyor.

Ekranı kapattığında badline'lardan ve sprite okumalarından kurtuluyorsun ancak vic phi2'nin birinci fazında bus'ı sürmeye devam ediyor.

Aslında bus müsaitliğini veren AEC pini var VIC'ten 6510'a beslenen. Bu doğrudan 6510'a bus pin'lerini tristate etmesi gerektiğini söyleyen pin. Ancak kartuş üzerinde bu sinyal yok. Hani olsa yüksek frekanslı bir micro,fpga, cpld ile bu hattı ve RDY hattını kullanıp 6510 kardeşim dur şimdi sıra bende diyebilirsin. Dediğin gibi 6510'un o anda ne yaptığına göre de zamanlama yapman onu doğru yerde RDY ile kesmen lazım.

Şurada süper bilgiler var konu ile ilgili : http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt (http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt)

Aynı konu ile ilgili daha dün epey bir okumuştum. Ben de indirect dma yapmaya çalışıyorum. Benim durumumda ekranı kapatmam yetiyor çünkü ram'i doldurmak için bus'ı kullanmayacağım. Benim sid player'da kullandığım tekniğin bir değişiğini kullanacağım.

Yapmaya çalıştığının biraz daha gelişmişi ancak skoe'nin easyflash'ta nasıl kernal rom replacement'ı tasarım dokümanı var

şurada : http://skoe.de/kernal/kernal-cartridge.pdf (http://skoe.de/kernal/kernal-cartridge.pdf)

Cpld içinde bildiğim kadarıyla küçük bir 6510 emüle ederek normalde okuma erişimi olmayan 0/1 adreslerindeki portları okuyabiliyor. Senin yapmaya çalıştığın timing'i de 25mhz cpld ile nasıl senkronize ettiğini anlatmış.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 17, 2015, 23:03:11 ÖS
Teşekkürler dökümanları inceliyorum hemen.

Esasen devam eden emekleme aşamasında FPGA tabanlı iki projem var. Ama forumdaki kartuş projelerini görünce gene heveslendim. KISS CART Vb...

Daha önce tartışılmış olan microişlemci tabanlı kartuş emulatorü işini PIC ile denedim. 64MHZ 16MIPS ile çalışan bir mikroişlemci ile kartuş emulasyonu işi için yaklaşık 16 cycle zaman varmış gibi görünüyordu. Kullandığım PIC'lerde bulunan Paralel Slave Port özelliği de tam bu işe uygun gibi. PIC'in 8 Bitlik bir portu data bus olarak tanımlanıyor ve WR RD CS hatları için tanımlı pinler mevcut. Dışarıdaki master CS pinini low a çekip RD yada WR işlemi yaptığında PIC te bir interrupt oluşuyor ve data bir register'a aktarılıyor yada okuma işlemi ise yapılan register'daki data bus'a aktarılıyor. Yani databus in out yada tristate olmasını PIC donanım tabanlı kendisi hallediyor bu işler için cycle harcamak gerekmiyor. Adres bus da doğrudan PIC'e input olarak bağlanabilir. Denediğim şey şu oldu. Adres bus değiştiği anda işaret ettiği bilgiyi register'a koyunca geri kalan işi PIC hallediyor. Ancak aslında 16cycle zaman varmış gibi görünse adres değiştikten sonra maksimum 600ns gibi bir zamanda datayı hazır etmek gerekiyor. Kısaca clock un başlarında adres değişiyor ve ikinci yarısında C64 datayı okuyor. Yani maksimum 8-10 cycle da data hazır olmalı.

Teoriyi test etmek açısından yaptığım hardcoded dataları kartuş olarak C64 e mapleyebildim. Ancak bu 8-10 cycle gerçek bir kartuş imajını emule etmeye yetmedi. :)

Ben de bunun üzerine kartuş portuna takılan ucuz (gene PIC tabanlı) bir donanım ile kartuşun yaptığı işin tam tersini yapmayı düşündüm. Yani C64 kartuştan datayı çekmeyecek, PIC seçilen imajı doğrudan RAM'e dolduracak. Imajlar da SD kart, USB-PC, seri EEPROM yada Seri Flash üzerinde tutulabilir. Yöntem değişmiyor. Donanım üzerinden imaj seçilecek ve işlem başlatılınca PIC DMA ile imajı RAM'de olması gereken yere yazacak. Bu sayede tek parça olan tüm program ve oyunları ucuz bir şekilde tek kartuşa boyut sınırı olmaksızın yerleştirebilirim diye düşünüyorum. Hatta umduğum gibi çalışır ise, gene tek tuş ile RAM okunarak snapshot alınabilir, başka işler için çeşitli donanımlar C64 ün RAM bölgelerine maplenerek veri alışverişi yapılabilir vb.

Planladığım kadarıyla donanım çok basit olacak. İki tane 573 adress latch output olacak. PIC latchlere yazmak yada okumak istediği adresi latchleyecek. Dolayısı ile tek bir 8 bit bus 16 bit adresleme için de yeterli olmuş olacak. Databus doğrudan PIC'e bağlı. Normal durumda port input yani C64'e karşı high z. Imaj seçilip upload edilmek istendiğinde, PIC DMA'yı uygun zamanlama ile low a çekecek. Sonrasında da BA dinlenerek, her bir Phi2 clockunda bir byte DMA ile transfer edilecek. Eğer herhangi bir anda PIC datayı yetiştiremez ise bile sorun olmaz, PIC datasını mediadan okuyup hazır edince RD/WR line'ı assert eder vb.

Sadece Phi2, BA, DMA hatları için uygun logic'i kurarak latchlerin OE eneble PINlerini PIC'den bağımsız sürebilir olmalıyım.

Neyse çok uzattım, şu dökümanlara bir bakacağım. Haftasonu bir kaç deneme yapmak istiyorum.





Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 17, 2015, 23:49:47 ÖS
Özay'ın Kiss Cart'ı herkesin iştahını kabarttı :)

PIC'te kullandığın 16 bit adres portunu Phi2 low iken read moduna getirmen lazım yoksa vic'in address bus'a koyduğu adresi ezersin. VIC hunharca kullanıyor phi2 low iken adres ve databus'ı. Buraya bağlı her şey tristate edilmek durumunda.

1. Badline'ları handle edebiliyor olman lazım. Senin transfer rutini ilk başladığında badline'a denk gelirse mantarlar. Bu yüzden başlangıçta senin donanım rom gibi davranıp c64'de kod çalıştırmaya başladıktan sonra dma çalıştırmalı. Ekran kapatılabilir yahut ekran kullanılacaksa kod trick'leri var dma'yı badline'lara getirmemek için. İmajı bilgisayar yerine donanım üstünden seçtirmek gereksiz yere maliyeti arttırır. Expansion port'un verebildiği max. akım'a da dikkat etmen gerekir ekran falan eklersen. Az güç tüketen oled'ler kullanılabilir belki.

2. Exrom ile elleşmemen lazım. Senin tasarımda yok anladığım kadarıyla o yüzden sorun olmaz. Elleşirsen $8000-$9FFF aralığını ram olarak kullanamıyorsun. (1'de bahsettiğim rom olayına girersen c64'de çalışan koda senkron bir şekilde exrom'u tekrar high'a çekip ram'e erişimi açman gerekebilir)

3. 6510'un iyi zamanına denk gelmek için sanırım counter da kullanman lazım. En az 3 cycle beklemek gerekiyor. Discrete logic yerine GAL kullanırsan board'dan ve kablodan tasarruf edersin. Counter kullanmak yerine PIC'i senkronize edeyim dersen sanırım o iş daha zor olur. Assembly kasıp cycle'ları sayman lazım.

Paralel slave port özelliği güzelmiş bu arada. Gelişmeleri merakla bekliyorum.



Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 18, 2015, 00:13:51 ÖÖ
Dökümanlar çok iyiymiş bu arada. Şimdi çok daha iyi anladım. Zaten her clock ta gerekmese bile hem 6510 hem de VIC erişiyor bus'a. VIC dediğin gibi Phi2 low ken kullanıyor her clock da. Ayrıca bad line sprite vb durumlarında, Phi2 high iken bile kullanıyor, 6510 bekliyor. Bu durumu da BA hattı ile anlayabiliyoruz vb. Bu arada resmen VIC master bu makinada. CPU neredeyse köle... :)

Aynen hem BA müsait hem de Phi2 high iken output address latch enable olacak. GAL PAL vb kullanılabilir ama öncelikle discreete logic yapmayı deneyeceğim. Olabildiğince basit olsun istiyorum.

Imaj seçimini yazılım olarak yapmak tabiki her yönden daha hoş. Ama bu yazılımın için ROM bulundurmam gerekecek. Bunu istemiyorum. ROM'u de emule edemedim, yetişmedi hız. Belki şu olabilir. Yeni öne sürdüğüm yöntem ile bir loader atılır önce C64 RAM e. Seçilen imaj bilgisini donanıma gene bir RAM adresi üzerinden gönderebilir yazılım.

Ben imaj seçimi için 128x64 1 inch OLED leri düşünmüştüm. Hem ucuz hem estetik hem de kullanımı kolay.

Tekrar teşekkürler...
 

 


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 18, 2015, 01:11:35 ÖÖ
C64'e senin devre ile dma yapmayı başarırsan şöyle bir problemin daha olacak. O kodu execute etmen lazım :)

Badline'ları yakalamak için BA'nın normalden daha uzun low olarak seyrettiği pattern'i yakalayabilirsin alternatif olarak. Clock input'u phi2 olan bir counter ile yapılabilir ama karışık olur.

Ama daha basiti başlangıçta dma'yı BA sinyaline bağlı olarak yavaşça startup kodunu doldurmak için kullanabilirsin. Ama VIC 6510'a geç dediğinde 6510 da sallıyorum 2 cycle iş yapıp üstüne badline'a basma ihtimalin nedir dersen, var muhtemelen. Tekrar tekrar denersen en fazla VIC'e hatalı read yaptırmış olursun herhalde ve ekranda beklenenden farklı bir display ile karşılaşırsın. Ancak cpu'nun read/write fazlarına elleşmediğin için en azından cpu crash olmaz.

Aktardığın kodu execute etmek için de şu tip yöntemler kullanabilirsin.

1. Önce uygun bir lokasyona çalışacak kodu aktarırsın. Sonra $0314/$0315'deki IRQ handler'ı bu lokasyon ile ezersin. Default CIA timer interrupt'ı 60hz ile çalışıyor.

https://www.c64-wiki.com/index.php/Interrupt (https://www.c64-wiki.com/index.php/Interrupt)

Bunun da riskli tarafı sen vektörün yarısını değiştirmişken diğer yarısını 6510 hali hazırda okumuş olabilir. Cpu crash olur. NMI vektörünü değiştirirsen kartuş üstünden kendin NMI'ı tetikleyip kodunu çalıştırabilirsin.

https://www.c64-wiki.com/index.php/Interrupt (https://www.c64-wiki.com/index.php/Interrupt)

2. İkinci yöntemde de stack'e dibinden itibaren kodunun lokasyonunu basarsın (simetrik olmalı, $0202 gibi). Hali hazırda çalışan interrupt rutini içinde RTS geçtiği anda senin koda dallanır.
Şurada okumuştum bunu : http://www.pagetable.com/?p=568 (http://www.pagetable.com/?p=568)

Gerçi bunu load işlemi için anlatmış. $EA31'deki default Interrupt handler içerisinde RTS geçiyor mu bakmak lazım.

Bu arada yazma imkanın varsa 32 byte prom'lar var böyle bir şey kullanabilirsin, yahut 6502.org'da kafa patlattığımız GAL'i rom gibi kullanma olayını kullanabilirsin.

http://forum.6502.org/viewtopic.php?f=10&t=3383 (http://forum.6502.org/viewtopic.php?f=10&t=3383)


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 18, 2015, 10:09:18 ÖÖ
Evet ben de zaten kodu nasıl çalıştıracağım diye düşünüyordum. Aklıma ilk gelen RESET vektörü değiştirip, RESET çakmaktı ama C64 ten 15 yıl uzak kalınca unutmuşum detayları. RESET vectör kernel içerisinde olduğu için salt RAM erişimi ile bunu yapmak mümkün değil.

IRQ vektörlerini değiştirmek olabilir dediğin gibi ama iki byte'ı tek seferde atomik olarak update etmek mümkün değil gibi görünse de bence denenebilir. Neden dersen, bu işlem sırasında DMA yı low da tutacağım için, 6510 hold ediyor olacak. (DMA sanırım doğrudan RDY pinine bağlı, kontrol etmem lazım) Yani ben DMA yı release etmeden zaten 6510 hiçbir işlem yapmayacak diye umuyorum.

Zaten önce bir şu DMA upload olayını test edip teoriyi onaylamak önemli. Sonra bir şekilde kod çalıştırılır. En kötü RUN yazıp RETURN bile yapılır ilk aşamada... :D




Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 18, 2015, 10:56:15 ÖÖ
Byte byte yapacağım dediğin için dedim, hani bir byte dma yapıp 6510'a yol verirsen bahsettiğim durum oluşabilir.

Evet işin büyüğü dma'yı yapmakta, kod execute etmenin yolu bulunur.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 19, 2015, 00:23:47 ÖÖ
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:

(http://i62.tinypic.com/2vke0aw.jpg)

Ş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ı?


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 19, 2015, 11:32:24 ÖÖ
BA konusunda haklısın. Ben okuduğumda Phi2 her low olduğunda da low olacak anlamı da çıkarmıştım. Şimdi bir daha okuyup başka bir yerden de baktım. Evet sadece standardın dışında ekstra okuma yapacaksa low'a çekiyor bu sinyali VIC.

Şuraya bakılabilir.
https://sh.scs-trc.net/vic/vic_article_3.6.htm

Senin kartuş kullanılmadan önce c64'ün resetlenmiş olacağını yahut senin resetlemen gerektiğini varsayıyor olman lazım bu arada. Zira her zaman 40 cycle kadar uzun low'da tutmuyor bu sinyali VIC. Sprite erişimi varsa bu daha kısa sürebiliyor. Veya sallıyorum c64'de ekran kapalı iken BA'yı low'a sonra da tekrar high'a düşmesini beklemek doğru olmaz.

1. BA'yı dinlemek için interrupt mı yoksa ön tarafta çalışan kod mu kullanacaksın?
2. Şemada DMA hattını bağlamayı unutmuşsun sanırım?


Bu iş olur bence.

Sana bir iki tavsiye :

1. Devreye koyduğun tüm elemanları dışarıdan besle. Kartuş portunun verdiği VCC'yi kullanma. Yük bindirme durumunda VIC ve/veya 6510 sakata gelmesin.

2. Başlangıçta tanıyabileceğin ufak bir pattern'i transfer etmeye çalış. Ufak bir basic programı ile kontrol edebilirsin. Bir sonraki aşamada program transfer edip kontrol edebilirsin.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: Simon (Özay Turay) üzerinde Eylül 19, 2015, 12:26:57 ÖS
Elektronik ve Commodore 64 donanım bilgim sizin kadar olmasa da, bazı yerlerini anlamasam da bu tarz başlıkları okumayı seviyorum. Aynen devam. :)


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 19, 2015, 15:11:15 ÖS
Selamlar tekrar.
Kartus su sekilde calisabilir diye dusunuyorum;
Uzerinde bir button olabilir. Butona basilinca pic once c64 e reset cakar sonra BA beklemeye baslar. Bu sayede bad line olusacagina emin olabilir. Zaten butona basilinca aktif olacagi icin kod o esnada dongude BA beklemeye baslar. Interrupta cok da gerek yok.
Ikinci seneryoda kartus takili olarak c64 resetlenirse devreye girebilir. Butonu olmaz. Yani normal kartus gibi calisir.

Ben ilk deneme olarak dma raster line yapmak istiyorum. 53280 adresine dma dan veri atacagim bakalim neler olacak. Sonra dedigin gibi pattern ve ufak tefek basic programlar denenir.

Acikcasi pic ve diger logicler cok cekmez diye dusunuyorum. Toplam da 80 100 ma besler herhalde c64? Yaniliyor muyum acaba. External besleme gerekirse bu is hic user friendly olmaz...

Sema dedigim gibi taslak. Dma hatti ve reset hatti vb yok orada. Haklisin.

Aslinda 3 adet 573 ve nand kapilari icin bir cpld koyup kirtulsam mi diye dusunmuyor da degilim. Elimde atmel atf1504 lerden var ama 44 pin. Herseye yetmez sanirim.

Simon,

Eger anlamadigin ve merak ettigin detay varsa seve seve aciklamak isterim. ;)



Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 19, 2015, 22:53:54 ÖS
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

(http://i60.tinypic.com/rt3o0z.jpg)

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

(http://i62.tinypic.com/2cn9vur.jpg)

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:

(http://i57.tinypic.com/288p73l.jpg)

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.

(http://i59.tinypic.com/ddcaxy.jpg)

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

(http://i59.tinypic.com/2a0jqxy.jpg)

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

(http://i60.tinypic.com/29fy1zs.jpg)

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ı

(http://i62.tinypic.com/28bwieu.jpg)

Data Hatları

(http://i61.tinypic.com/3023p6u.jpg)

Board Yakın Görünüm

(http://i57.tinypic.com/4ggp5k.jpg)

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

(http://i57.tinypic.com/69nm81.jpg)

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

(http://i57.tinypic.com/295cspd.jpg)

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.

(http://i57.tinypic.com/2564sis.jpg)

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ı.

(http://i61.tinypic.com/ejsl08.jpg)

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,






Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 19, 2015, 23:49:39 ÖS
Başka çipler tarafından da sürülen bacaklar için sanıyorum open collector tarzı çipler kullanmak lazım (pull up ile beraber, analog elektronik bilgim zayıf sallıyor olabilirim). Tristate de edebilirsin BUS_EN sinyalin ile.

Phi2'deki bozuk sinyal belki de kablolamanın getirdiği ekstra kapasitanstan dolayı olabilir.


İşler yoluna girene kadar sid çipini sökmek olası kaza durumunda can kurtarır :)

Bir de c64'e beslediğin sinyallere kapasitör koy mutlaka. Ondan kaynaklanıyor olabilir yamulmalar.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 20, 2015, 00:47:40 ÖÖ
Sendeki sorun DMA line'ının PHI2'nin uygun bir yerinde bırakılmaması olabilir. 6510 sen kesmeden önce read yapacaktı (yazmalarda zaten kesilmiyor) ve AEC sinyali ile bus bağlantıları tristate edilmeden bus'ı sürdü yahut sürecekti. DMA'yı bıraktığında 6510 için bus'ı kontrol edebilmesi için süre lazım.

Crash olma sebebi muhtemelen adres bus'ı düzgün sürememesinden dolayı okuduğu yanlış byte olabilir.

Yapmaya çalıştığını uzunca bir $EA dizisini çalıştırırken (sürekli NOP) databus'ı sample ederek görebilirsin.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 20, 2015, 01:09:36 ÖÖ
SID'i sökmek iyi fikir, aklıma gelmemişti. Tekrar başına geçtiğimde ilk iş SID'i sökücem. :D

Başka çipler tarafından ortak kullanılan sinyaller için open collector ve bir pull'up kullanılıyor dediğin gibi. Şemaya bakınca da aslında R/W bacağında bir pull-up var. Bu durumda 6510'un R/W çıkışı open collector olmalı. (Üşengeçliğe bak, aç işte adam gibi bak 6510 datasheet'e... :) Ama üşendim şimdi.) Bu durumda benim kartuş ta open collector kullansa iyi olur. Bir mosfet ile low'a çekecek şekilde kontrol edebilirim.

DMA'nın abuk sabuk bir yerde bırakıyor olma ihtimali konusunda haklı olabilirsin. Ona da senkronize olmaya çalışacağıma o işi de VIC'e paslayacağım ilk vakit bulduğumda. Yani bir sonraki BA'ya kadar bekleyip o şekilde release edicem DMA'yı. Bakalım sonuç ne olacak.

EDIT: Üşenmedim baktım pdf'e. 80'li yılların datasheetleri ne kadar sade. :D

Read/Write (R/W)
This signal is generated by the m icroprocessor to
control the direction of data transfers on the Data Bus. This
line is high except when the microprocessor is writing to
memory or a peripheral device.


Sadece bu yazıyor bu bacağa dair... :) This line is high demiş ama open collector mü, yoksa push pull mu belli değil. Neyse ...


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 20, 2015, 12:11:35 ÖS
Bu sabah DMA release işini test ettim. DMA'yı rasgele bir yerde değil de, bir sonraki bad line başlayınca release edip, senkronizasyon işini de VIC e bırakınca kilitlenme problemi ortadan kaltı.

(http://i57.tinypic.com/331m34y.jpg)

Bu arada dünkü denemelerde data out latchinin bazı bitlerini yakmışım. Muhtemelen daha bus'u ele almadan yazmaya çalışınca çakışan bitler gitti. Neyse o latchi de değiştirince uzun DMA'larda bile kilitlenme olmuyor artık.

DMA teorisinin çalıştığını gösteren ufak bir de video. Videoda sol üstteki DOBERMAN yazısı ve sayan byte ile, ekran bordür rengi DMA üzerinden PIC tarafından set ediliyor. Aynı zamanda C64 kilitlenmeden çalışmaya devam ediyor.

s6jXwmnU9Yo


Bir iki ufak tefek konu kaldı. Örneğin daha C64'den okumayı denemedim ama o daha basit.
Bir de PIC açılırkenki durumu handle etmek lazım.

Sanırım teori OK olduğuna göre artık bir PCB hazırlama zamanı geldi.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 20, 2015, 13:28:22 ÖS
Kısa sürede süper bir iş çıkardın tebrikler!

Okuduklarımdan bu işin basit olacağını kestirseydim muhtemelen ben de oyalanmadan dma işine dalardım. En teferruatlı örnek skoe'nin kernal replacement guide'ı olunca demek ki gözümde büyütmüşüm.

Ancak yine de temkinli olmakta fayda var. Yanan 537'lerin output'u yerine bus'a bağlı başka bir entegrenin çıkışı da olabilirdi. Gerçi konuyla ilgili lemon64'de okuduğum yorumlarda 6510'un bus'a söylediği adresin bile ezilmesinden dolayı zarar görmeyeceği gibi bir bilgi de vardı.

Read olayını da halletikten sonra sana tavsiyem bir protokol oluştur. Bu protokolü kullanacak küçük bir loader'ı kaset buffer'ına gönder ve çalıştır. Böylece pic'e ekran eklemek zorunda kalmazsın. Loader senin dma yapan devrenle haberleşip şunu yüklemek istiyorum bana bilgilerini ver der. Bilgileri aldıktan sonra yine yönlendirir şu dosyadan şu adrese şu kadar byte yükle gibi. Gerekiyorsa oradaki rom'u kaldırıp ram'ı açar vesaire.

Bir sonraki aşama için erken ancak o aşamada da easyflash için convert edilmiş ara yüklemeli oyunlar için easyflash emülasyonu yapabilirsin.
http://skoe.de/easyflash/doku.php?id=develdocs (http://skoe.de/easyflash/doku.php?id=develdocs)


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 20, 2015, 17:43:49 ÖS
Kısa sürede süper bir iş çıkardın tebrikler!

Okuduklarımdan bu işin basit olacağını kestirseydim muhtemelen ben de oyalanmadan dma işine dalardım. En teferruatlı örnek skoe'nin kernal replacement guide'ı olunca demek ki gözümde büyütmüşüm.

Teşekkürler.
Kernal Replace söylediğin gibi çok daha komplike bir konu. 6510 içindeki 0 ve 1 deki portlara yazılan bilgiler bus dan görülmüyor anladığım kadarı ile. Dolayısı ile ROM lar açık mı kapalı mı bus'u dinleyerek anlamak mümkün değil vb...

Ancak yine de temkinli olmakta fayda var. Yanan 537'lerin output'u yerine bus'a bağlı başka bir entegrenin çıkışı da olabilirdi. Gerçi konuyla ilgili lemon64'de okuduğum yorumlarda 6510'un bus'a söylediği adresin bile ezilmesinden dolayı zarar görmeyeceği gibi bir bilgi de vardı.

Ben de neden acaba C64 tarafı yanmadı da 573 gitti diye düşünüyordum.
Ama bu yanma olayı bariz benim hatam. Yani sıra ile test ederken, R/W hattını bağlamadan bus'ı bağlayınca böyle bir durum olabileceğini öngöremedim. Yani R/W'yi low'a çekince data bus input oluyor kartuş portu tarafında.

Zaten şimdi fırsat bulur da PCB çizersem bu ve PIC'in açılıştaki random durumları durumları gibi dertlerin önüne geçmek için, yazılım tabanlı değil daha donanım ağırlıklı süreceğim portları.

Yani mesela, BA, /DMA, Phi2, R/W pinleri uygun olunca anca latch OE enable olacak vb...

Dün akşam karaladağım logic taslaklar:

(http://i58.tinypic.com/30urf47.jpg)
(http://i62.tinypic.com/34s2vs7.jpg)

Data hattındaki 573'ü kullanmadan PIC'in PSP özelliğini kullanmayı deneyeceğim. Toplam 573 sayısı 2 ye düşecek. Ancak en az 2 adet logic entegre gerekiyor gibi duruyor. Bir NAND bir NOT. Daha fazla sadeleştiremedim şimdilik.

573 ler dahil tüm logic'i CPLD ye atmak istedim. Ama atmel'in WinCUPL programı Win8 de çalışmadı. XP istiyormuş, üşendim, şimdilik logic kapılı olsun dedim, bakalım...

Read olayını da halletikten sonra sana tavsiyem bir protokol oluştur. Bu protokolü kullanacak küçük bir loader'ı kaset buffer'ına gönder ve çalıştır. Böylece pic'e ekran eklemek zorunda kalmazsın. Loader senin dma yapan devrenle haberleşip şunu yüklemek istiyorum bana bilgilerini ver der. Bilgileri aldıktan sonra yine yönlendirir şu dosyadan şu adrese şu kadar byte yükle gibi. Gerekiyorsa oradaki rom'u kaldırıp ram'ı açar vesaire.

Açıkçası düşününce ben de ekran vb eklemekten vazgeçtim. C64 le haşır neşir olmayalı 15 yılı geçti sanırım, hatırlamıyorum kaset buffer falan, bakmam hatırlamam lazım. Ama bana da mantıklı gelen şu oldu.

Dediğin gibi bir protokol olacak, RAM'e mapli registerlar varmış gibi. Basit erişim komutları düşündüm. DIR, CHDIR, LOAD gibi. Komutu çalıştırmak için belli bir RAM adresine komut ve belkide komşu adrese parametre yazılacak. Devre bunu DMA'dan görünce, örneğin komut DIR ise, SD kartın directorysini belli bir formatla belli bir adrese atacak. $C000 mesela. LOAD komutu çağrılırsa da, PRG dosyasının başındaki adres pointer'ı kullanılarak RAM doldurulacak gibi düşündüm.

Loader ise başlangıçta basitçe BASIC ile yazılabilir.

Şu an için unuttuğum bazı detaylar da var. Örneğin, PRG dosyalarındaki DATA, ROM ve RAM üst üste olan yerlere gelince nasıl yazılacak. Gerçi ROM açık bile olsa o adrese yazınca, alttaki RAM'e gidiyordu bilgi diye birşey hatırlıyorum.

Bir sonraki aşama için erken ancak o aşamada da easyflash için convert edilmiş ara yüklemeli oyunlar için easyflash emülasyonu yapabilirsin.
http://skoe.de/easyflash/doku.php?id=develdocs (http://skoe.de/easyflash/doku.php?id=develdocs)

Dedim ya yıllardır uzağım, açıkçası easyflash nedir, nasıl çalışır detayını hiç bilmiyorum. Hemen bakacağım. Eğer ara yüklemeli programlar için oluşmuş bir standart varsa tabiki bunu da desteyebilmek çok güzel olur. Ama ilk bakışta anladığım kadarı ile easyflash kartuş gibi (yani EEPROM emulatorü gibi) çalışıyor. Easyflash'ı emüle etmek bu donanım ile zor. Zira hız yetişmez gibi geliyor.

Bu konuda fikrin varsa dinlemeye hazırım. :D

Benim aklımda olan bir başka konu daha var. Belki fikir verebilirsin.
Bu donanım ile Freeze/Save/Restore yapabilir miyim diye düşünüyorum.
Şimdi DMA ile 6510 tarafından görülen tüm memorynin snapshot'unu almak teknik olarak mümkün. Daha sonra bunu yerli yerine koymak ta mümkün.
Ama 6510 registerleri PC,A,X,Y vb, ile 0 ve 1 adresindeki içeriği göremeyeceğim.
Ayrıca freeze anında eğer ROM lardan biri açıksa, altındaki RAM'i okuyamayacağım. ROM açıksa zaten altındaki RAM'e gerek yok denebilir ama freeze anında yazılım ROM'u açmış, halbuki altındaki RAM'e daha sonra kullanabileceği datayı koymuş olabilir.

Sanki sadece DMA ile mümkün değilmiş gibi görünüyor. Bunu normal freeze kartuşları nasıl yapıyorlar acaba. Biraz okudum ama tam istediğim detayı bulamadım.

Bu freeze konusunu incelerken aşağıdaki bilgiyi buldum, çok güzel yazmış:

http://codebase64.org/lib/exe/fetch.php?media=base:safely_freezing_the_c64.pdf (http://codebase64.org/lib/exe/fetch.php?media=base:safely_freezing_the_c64.pdf)

Ayrıca döküman için DMA hattının nasıl kullanaılacağını da güzel anlatmış. Donanımda bu bilgiyi kullanabilirim. Release ederken bir sonraki bad line'ı beklemeye gerek yok.
Adamın önerdiği methodlardan birisi de zaten benim kullandığım bad line anında DMA'yı çekmek. Sadece Freeze sonrasında içeriği nasıl aldığına ilişkin bir detay vermemiş, sadece freeze etme kısmından bahsediyor.

İyi haftasonları,


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 20, 2015, 22:20:59 ÖS
573 ler dahil tüm logic'i CPLD ye atmak istedim. Ama atmel'in WinCUPL programı Win8 de çalışmadı. XP istiyormuş, üşendim, şimdilik logic kapılı olsun dedim, bakalım...

WinCupl'yi ben Windows 8'de kullandım, şu an da Windows 10'da kullanıyorum. Arada gıcıklık yapıyor ama genel bir sorununu görmedim. WinXP uyumluluğunu seçip bir de öyle dene.

Açıkçası düşününce ben de ekran vb eklemekten vazgeçtim. C64 le haşır neşir olmayalı 15 yılı geçti sanırım, hatırlamıyorum kaset buffer falan, bakmam hatırlamam lazım. Ama bana da mantıklı gelen şu oldu.

Dediğin gibi bir protokol olacak, RAM'e mapli registerlar varmış gibi. Basit erişim komutları düşündüm. DIR, CHDIR, LOAD gibi. Komutu çalıştırmak için belli bir RAM adresine komut ve belkide komşu adrese parametre yazılacak. Devre bunu DMA'dan görünce, örneğin komut DIR ise, SD kartın directorysini belli bir formatla belli bir adrese atacak. $C000 mesela. LOAD komutu çağrılırsa da, PRG dosyasının başındaki adres pointer'ı kullanılarak RAM doldurulacak gibi düşündüm.

Loader ise başlangıçta basitçe BASIC ile yazılabilir.

Şu an için unuttuğum bazı detaylar da var. Örneğin, PRG dosyalarındaki DATA, ROM ve RAM üst üste olan yerlere gelince nasıl yazılacak. Gerçi ROM açık bile olsa o adrese yazınca, alttaki RAM'e gidiyordu bilgi diye birşey hatırlıyorum.

http://sta.c64.org/cbm64mem.html (http://sta.c64.org/cbm64mem.html)
c64 Memory map için üstteki sayfaya bakabilirsin. Kaset buffer diye geçen yer $033C-$03FB arası 192 byte. Güzelliği şu : Senin hedefleyip yüklemeye çalışacağın programlar bu bölgeyi kullanmazlar. En azından yükleme yaparken dur burası da üstüme yazılacak diye uğraşmazsın. Basic kullanırsan ezilme potansiyeli çok yüksek olur. İlaveten $0400'den itibaren 1000 byte olan ekran hafızasını da kullanabilirsin. Burayı kullandığında kodun çalışması ekranda gözükür.

Cpu'nun 1 adresindeki port'undan rom'ları ve i/o bölgesindeki ram'i aç kapa yapabilirsin. Üstte linkini verdiğim sayfada detayları var. Evet doğru hatırlıyorsun I/O bölgesi hariç yazma yaptığında alttaki RAM'e yazma yapılır. Okuyabilmek için 1 port'undan ayar çekmen gerekir.

Dedim ya yıllardır uzağım, açıkçası easyflash nedir, nasıl çalışır detayını hiç bilmiyorum. Hemen bakacağım. Eğer ara yüklemeli programlar için oluşmuş bir standart varsa tabiki bunu da desteyebilmek çok güzel olur. Ama ilk bakışta anladığım kadarı ile easyflash kartuş gibi (yani EEPROM emulatorü gibi) çalışıyor. Easyflash'ı emüle etmek bu donanım ile zor. Zira hız yetişmez gibi geliyor.

Bu konuda fikrin varsa dinlemeye hazırım. :D

Easyflash'ın tüm özelliklerini bu setup ile sunman tabiiki imkansız. Easyflash ile c64'deki software daha önce full doldurulmuş flash içinde doğrudan bank switching falan yapabiliyor. Prince of persia oyununda eleman bu özelliğe güvenerek oyunu yazmış, bunun desteklenmesi devreye yeni bir şeyler eklenmeden zor.

Ancak diğer oyunlar disk'e gitmek yerine easyflash'ın api'sine yönlenip ara yüklemeyi easyflash sayesinde yapıyorlar. Bu kısım emüle edilebilir belki. Gerçi burada da cycle exact bus sniffing ihtiyacı var. Oyun modifiye edilmeden yapılması zor olabilir.

Benim aklımda olan bir başka konu daha var. Belki fikir verebilirsin.
Bu donanım ile Freeze/Save/Restore yapabilir miyim diye düşünüyorum.
Şimdi DMA ile 6510 tarafından görülen tüm memorynin snapshot'unu almak teknik olarak mümkün. Daha sonra bunu yerli yerine koymak ta mümkün.
Ama 6510 registerleri PC,A,X,Y vb, ile 0 ve 1 adresindeki içeriği göremeyeceğim.
Ayrıca freeze anında eğer ROM lardan biri açıksa, altındaki RAM'i okuyamayacağım. ROM açıksa zaten altındaki RAM'e gerek yok denebilir ama freeze anında yazılım ROM'u açmış, halbuki altındaki RAM'e daha sonra kullanabileceği datayı koymuş olabilir.

Sanki sadece DMA ile mümkün değilmiş gibi görünüyor. Bunu normal freeze kartuşları nasıl yapıyorlar acaba. Biraz okudum ama tam istediğim detayı bulamadım.

Benim de şimdiye kadar okuduklarımdan değişik yöntemleri var. Software yahut hardware temalı olarak başta ikiye ayrılıyor. Linkini verdiğin dokümanı daha önce okumuştum 1541-II'yi yapan eleman yazmış.

Software tabanlı olanda yöntem sanıyorum kartuş rom'unu devreye sokup oradaki nmi handler'ı devreye almak şeklinde. Ancak bunun için o sırada çalışan programın kernal rom'u disable etmemiş olması lazım.

Metallic'in kartuş projesinde donanım tabanlı olana da biraz bakmıştık
http://www.commodore.gen.tr/forum/index.php?topic=10915.0 (http://www.commodore.gen.tr/forum/index.php?topic=10915.0)
Şurada metallic'in verdiği devre şemalarına bakabilirsin.

Freeze için kartuş rom'u şart gibi çünkü hangi programın hangi bellek bölgesini kullandığını bilmen çok zor. Bunun için sanıyorum ultimax modunu kullanıyorlar. Kernal'i rom ile replace edip üstüne nmi trigger ediyor. Çalışan kod mevcutta çalışan programın durumunu analiz edip saklıyor. 00 ve 01 adresleri read olamıyor muydu emin değilim.

Şurada tartışılmış biraz :
https://groups.google.com/forum/# (https://groups.google.com/forum/#)!topic/comp.sys.cbm/dy6xAcwnz3Y

Freezer'in Ram'i olduğundan bahsetmişler ancak bildiğim kadarıyla çoğunda ram yok. Küçük bir compressor decompressor ve kullanabileceğin ufak bir ram alanı varsa orijinal programa geri dönebilirsin. Senin durumunda uygun yer bulmaya da gerek yok. DMA ile okuyup sonra geri yerine yazabilirsin.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 20, 2015, 22:23:43 ÖS
Birşey daha aklıma geldi. Sence karttuş emülasyonu aşağıdaki şekilde olabilir mi?

8K Emulasyonu için: DMA ile binary'yi $8000'e atıp, C64 RESET yapmak yeerli mi?
16K Emulasyonu için: DMA ile $8000 ve $A000'ı doldur, BASIC ROM'u kapat. C64 Reset yap.
Multimax için: Gene DMA ile $8000 ve $E000'ı doldur. KERNAL ROM'u kapat, Reset yap.

Eğer sadece bunu yapmak yeterli ise, güzel olur CRT de desteklemiş olur. BASIC ve KERNAL'ı DMA ile değil, eğer seçilen dosya carttuş ise, çalışan loader ile yapmayı düşünüyorum.

Bank switch karttuşlardan bahsetmiyorum şimdilik, aslında onlar da mümkün olabilir...



Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 20, 2015, 22:41:32 ÖS
Aktardığın oyun altımdaki ram'i değiştiriyorum bana bir şey olmaz demiyorsa olur gibi.

Ancak kartuş desteklemenin de çok fazla esprisi yok bence, kartuştaki oyunların illaki prg versiyonları da vardır.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 20, 2015, 22:46:15 ÖS
Tamamen hak veriyorum, hiç bir espirisi yok.
Ancak eğer bu yöntem teknik olarak bu kadar basit ise, bank switching kartuşları desteklemek için donanımsal bir basit çözüm üretilebilir mi ona kafa yoracaktım.

OceanType 128KB kartuşlar gibi. Sanırım bunların da PRG leri yok.
Şu liste iştahımı kabarttı da. Ucuz bir donanım ile bunların tamamını destekliyor olmak güzel olurdu.

    Here is a list of the known OCEAN cartridges:

    Batman The Movie    (128 kB)
    Battle Command      (128 kB)
    Double Dragon       (128 kB)
    Navy Seals          (128 kB)
    Pang                (128 kB)
    Robocop 3           (128 kB)
    Space Gun           (128 kB)
    Toki                (128 kB)
    Chase H.Q. II       (256 kB)
    Robocop 2           (256 kB)
    Shadow of the Beast (256 kB)
    Terminator 2        (512 kB)

EDIT:
Donanımsal çözümden kastım, örneğin ocean için $DE00'a yapılacak WR işlemini logic ile yakalarsam, DMA ile 6510'u durdurup, ilgili RAM'i çat diye gene DMA ile replace ederim.

Ha oyun esnasında donma takılma olur mu? Olur. Bu switch işlemi hangi sıklıkta yapılıyor, bilmiyorum tabiki.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 20, 2015, 22:52:49 ÖS
Valla ben c64'de bir yerden sonra oyun oynamayı bıraktığım için hiç aşina değilim. Bence bir yerden sonra devrene ram / e(e)prom / flash vesaire eklemen gerekecek.

Ben daha çok bank switching yapmayan kartuşları kastetmiştim. Bank switching yapanların da D64 versiyonları vardır. Şu an da easyflash versiyonları var.

ps: O kadar bahsediyorum easyflash diye ama sahip olduğum ya da kullanmış olduğum bir donanım değil.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 23, 2015, 13:37:52 ÖS
Bu arada daha önce yanlış bilgi vermişim. Kartuş desteklemek için özel bir şeyler yazman lazım. Normalde c64 reset esnasında kartuş takılı mı diye kontrolü EXROM / GAME hatlarını kontrol edip yapıyor. Kartuş takılıysa kartuşun cold start vektörüne dallanıyor sanırım. Senin durumunda EXROM yahut GAME düşük seviyeye çekilmemiş olduğu için bu otomatik çalıştırma prosedürü iş görmez. İlaveten kartuş belleğinin başında yine nmi vektörü var kernal buraya da bakmayacağı için oyunun default interrupt'lar ile çalışacak bir kodu varsa bu da çalışmaz.

Özetle kartuş desteği çetrefilli.

EXROM ve/veya GAME'i süreyim desen o da olmaz çünkü PLA bu durumda okuma erişimlerini ROML chip select sinyali ile kartuşa yönlendirecek.

Ama şunu yapabilirsin. Sisteme bir adet 16k sram eklersin, adres bus ve databus'a bağlarsın. PLA'dan yazma durumunda ROML ve ROMH üretilmediği için R/W ve Adres bus'ın uygun sinyalleri ile chip select üretirsin. DMA yapabildiğin için en azından arada tristate buffer tarzı elemanlar kullanmak zorunda kalmazsın. Tabii bu durumda yazmak istediğin şeyler hem senin SRAM'e hem de sistemdeki ram'e yazılıyor olacak. Chip select sinyalini istersen kendin de üretebilirsin.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Eylül 23, 2015, 13:44:08 ÖS
Evet, haklısın. Kartuş desteğini geçtim zaten...

Şu anda C64 interface kısmını CPLD ye yaptıracağım, PIC'in sadece CPLD üzerinden C64'e erişeceği hale soktum devreyi. Dolayısı ile BA, DMA vb işlerin tümünü CPLD yapacak. Birşeyler yapıyorum, bakalım nasıl olacak. :)

Belki bu aralar gene yapabildiğim şeyleri yazarım vaktim ayırabilirsem.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: i_r_on üzerinde Eylül 23, 2015, 13:49:06 ÖS
Mesajımı editledim bu arada, diğer yazdıklarıma da bakıver.


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: perpetual_007 üzerinde Mart 01, 2016, 18:02:51 ÖS
Son durum nedir ? :)


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: eins üzerinde Mart 01, 2016, 18:11:42 ÖS
DMA işini hallettik. Doberman adında bir kartuş projesi çıktı arkasından... :D
http://www.commodore.gen.tr/forum/index.php?topic=11187.0 (http://www.commodore.gen.tr/forum/index.php?topic=11187.0)


Konu Başlığı: Ynt: C64 DMA ?
Gönderen: perpetual_007 üzerinde Mart 01, 2016, 19:05:10 ÖS
Sağol :)