Hardware çözümüne gitmeden (çoğu kullanıcı için uygulaması zor olacaktır) önce software yollu da denenebilir. DMA yapılacağı anda c64'ün durumu önemli. Yani Reset halinde yazılımsal olarak müdahale ile bir demo çalışıyorken müdahale etmek tamamen farklı şeyler. Kendisi muhtemelen daha net ifade eder ancak bir demo çalışıyorken belleğin tamamına ulaşmayı kastetmiyor olabilir.
DMA'ya giriş kısmı VIC'in durumuna göre değişiyor. 1541 ultimate sırayla üç yöntem belirlemiş. Önce badline yakalamaya çalışıyor. Ekran kapalı ise bu yemiyor. Sonra cpu'nun en fazla 3 yazma yaptığı bir interrupt'a giriş kısmını bulmaya çalışıyor. Interrupt'lar disable edilmiş ve o anda 6510 sadece okuma yapar şekilde döngüde ise bunu da başaramaz ise en son yöntem olarak belirli bir süre bekleyip dalıyor.
Reset sonrası DMA durumunda en kötü ufak bir kodu DMA yapıp 01 adresin değerini bu programa okutabilir, ya da değiştirmek istiyorsa değiştirebilir.
Evet burada bir karışıklık oldu sanırım. "Tüm RAM Bölgesi" kavramını, 6510'un adresleyebildiği bölge olarak düzeltmek yerinde olacak. Yani adreslenen bölgede ROM açıksa o bölge DMA ile dahi okunsa ROM okunacak. Kısaca tekrar etmek gerekirse, DMA açıldığı anda herhangi bir adreste 6510 ne görüyor ise DMA ile de o değer görülecek. Bir yerde DMA yapan cihaz 6510 yerine geçici olarak yerleşmiş gibi bir olay.
NOT: Eğer ROM açık olan bir adrese yazılmaya çalışılırsa o bölgenin altındaki RAM'e yazılmış oluyor ama bu konunun zaten DMA ile ilgisi yok. Normal C64 işleyişi bu şekilde.
Bir başka konuda da biraz daha detaya girmek gerekirse, bu DMA olayını cooperative ve non-cooperative olarak ikiye ayırmak sanırım doğru olacak. Yani c64'te çalışmakta olan kod, DMA yapıldığını biliyor, buna uygun yazılmış ve hatta DMA yapılmasını kendi request etmiş olabilir. Buna en güzel örnek REU çalışma mantığı. DMA requesti kod kendi yapıyor, ve DMA yapılana kadar okuma yazma işlemi yapmadan bekliyor bu sayede DMA'ya giriş hardware açısından sıkıntılı olmuyor.
Non-Cooperative DMA ise, programdan habersiz asenkron DMA yapmak. Bu durumda DMA yapacak olan donanım yukarıda aynen i_r_on un dediği yöntemi izlemek durumunda. Zira ekran kapatılmış olabilir, IRQ lar disable edilmiş olabilir vb vb... Bu durumda DMA ya uygun giriş şartları aynı olmaz.
Şimdi en basit DMA ya giriş, temiz resetlenmiş C64'te yapılabilir ki donanım kendi önce reset göndererek bundan emin olabiliyor. Bu durumda ekran açık olduğu için ilk bad line ile beraber DMA kanalı açılabiliyor. Benim Doberman da varmak istediğim yere bu şekilde varabiliyorum aslında.
Ek bir özellik olarak, şu anki fonksiyonu bitirdikten sonra bir de FREEZE işlemi yaptırmak istiyorum. Bu da Non-Cooperative DMA ya örnek olacak. Çalışan bir kodu durdurup imajını almak için.
Gene Doberman için konuşacak olursak bu şekilde bir FREEZE anında çok büyük olasılıkla ekranın açık olacağını varsayabiliriz. Zira ya bir demo yada bir oyun çalışmaktadır. Ekran açıktır. DMA giriş te problem olacağını sanmıyorum.
FREEZE için yapılması gerkenler bence aşağıdaki gibi olmalı;
- DMA ya girer girmez hiç vakit kaybetmeden Raster No yu al bir yere kaydet, lazım olacak. Nasılsa DMA dayız diye bekleme, zira VIC çalışmaya devam ediyor, Raster de birazdan değişecek.
- Tüm 64KB yı DMA ile oku bir yere yaz.
- Renk RAM bilinen 64KB haricinde bir RAM, bir şekilde burayı da almalıyız.
- Şimdi burada kritik kısım başlıyor. Bir kod atıp C64 üzerinde çalıştırmamız gerekecek ama X,Y,A,PC,Flagler gibi bilgilerin hiçbirini kaybetmek istemiyorum. Bunlar da RAM de değil 6510 içerisinde registerlar. Bunları okumak kolay ancak okumak için C64'e atılacak kodun RUN edilmesi esnasında değişmemeleri gerekiyor. Yada değişseler bile daha önceki değere erişebiliyor olmam gerekiyor. Bu kısım için ne yapılabilir henüz bilmiyorum. Araştıracağım.
- Aynı kod, 0,1 adreslerine de bakacak ki bu iki adres tahmin ettiğim kadarı ile gene 6510 içerisindeki registerlar. Bu iki değer yedekleneceği gibi aynı zamanda kontrol edilecek. Eğer örneğin KERNAL açık ise kapatılacak. vb. Bu sayede ROM ların altındaki RAM lerde programın sakladığı başka bilgi varmı kontrol edilip gerekiyorsa gene DMA ile alınarak, bir önce alınan memory dump refresh edilecek. Yani final Memory Dump sadece RAM bölgesini kapsıyor olacak, ROM ları değil.
Freeze için düşündüğüm yöntem kabaca bu. Önerilerinize açığım.
Ama dediğim gibi freeze öncelikli hedefim değil en sona bıraktığım bir özellik...
@delimawi : Arada kaynamasın, 1541 ultimate'in yaptığı ya da yaptığını tahmin ettiğim gibi c64 tarafındaki önyüzü de DMA ile yapmak sana c64 tarafında yazacağın kod için inanılmaz bir sadelik sağlayabilir.
@i_r_on: Kaynamadı, okudum aslında yazdığını. Şimdi loader için aslında basit bir menü tasarımı yaptım ama tam olarak istediğim bu değil. Gene yıllar önce uğraştığım intro ve demo programlama günlerinden kalma bazı detaylar eklemek istedim ben loadera. Kabaca bir logo, aynı zamanda seçim menüsünün yanında bir grafik imaj. Belki bir smooth scroll vb.
Diyeceksin ki ne gerek var? Aslında bir gerek yok ama yapmak hatırlamak istedim o günleri. Hatta sprite dönüşümü için program sorma sebebim de buydu. Menü ile yan yana duracak bir grafiği karakter seti yada sprite multiplexing yaparak oluşturabiliyorum. O noktada sprite multiplexingi deneyecektim ilk olarak.
Dolayısı ile DMA ile sadece ekranı refresh ederek oluşturacağım bir menu beni kesmeyecek...
