Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz

  Gelişmiş Arama
insanın içinde varsa, commodore.gen.tr açığa çıkarır bunu.. bir nevi retro olaylarının dolunayıyız.(Arda)
Sayfa: 1 [2] 3   Aşağı git
Yazdır
Gönderen Konu: C64 DMA ?  (Okunma Sayısı 28347 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #15 : 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



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,




« Son Düzenleme: Eylül 19, 2015, 22:57:55 ÖS Gönderen: delimawi » Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #16 : 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.
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #17 : 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.
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #18 : 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. Kahkaha

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

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 ...
« Son Düzenleme: Eylül 20, 2015, 01:14:41 ÖÖ Gönderen: delimawi » Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #19 : 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ı.



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.




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

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #20 : 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
« Son Düzenleme: Eylül 20, 2015, 13:33:14 ÖS Gönderen: i_r_on » Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #21 : 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:




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


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

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

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ı,
Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #22 : 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
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. Kahkaha


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
Ş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/#!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.
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #23 : 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...

Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #24 : 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.
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #25 : 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.
« Son Düzenleme: Eylül 20, 2015, 22:49:19 ÖS Gönderen: delimawi » Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #26 : 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.
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #27 : 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.
« Son Düzenleme: Eylül 23, 2015, 13:47:20 ÖS Gönderen: i_r_on » Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #28 : 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.
Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #29 : Eylül 23, 2015, 13:49:06 ÖS »

Mesajımı editledim bu arada, diğer yazdıklarıma da bakıver.
Logged

Every imagination is one's self reflection but not every self reflection is imagination. <I.R.on - 2001>

twitter | blog
Sayfa: 1 [2] 3   Yukarı git
Yazdır
Gitmek istediğiniz yer: