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)
commodore.gen.trGenel KategoriProjeDoberman (DMA Tabanlı Kartuş Projesi)
Sayfa: 1 2 3 [4] 5 6 ... 15   Aşağı git
Yazdır
Gönderen Konu: Doberman (DMA Tabanlı Kartuş Projesi)  (Okunma Sayısı 152018 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.757


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #45 : Eylül 29, 2015, 20:07:14 ÖS »

Valla ellerinize, zihninize sağlık. Son dönemde forumda oluşan hareketlilik ve kaliteli bilgi artışı çok heyecan verici. Benim gibi yoğunluktan pasif üyeleri ve hatta gördüğüm kadarıyla bazı "ihtiyar" abileri bile heyecanlandırıyor Kahkaha

Hızınıs kesilmesin, Allah havyalarınıza zeval vermesin Kahkaha

Forumda beğen tuşu olsa direk basardım valla.
Logged

https://retrodergi.com - https://e-turay.com - https://karizmawow.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PS Vita, Nintendo 3DS, Nintendo 2DS
hades
Üye
****
Mesaj Sayısı: 392



Üyelik Bilgileri
« Yanıtla #46 : Eylül 29, 2015, 20:15:58 ÖS »

"ihtiyar" sanırım ben oluyorum
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #47 : Eylül 29, 2015, 20:17:33 ÖS »

Tabii denemekten zarar gelmez ancak elemanlar bu işi yapabilmek için fpga içine ufak bir 6510 bile yerleştirmişler. Kolay yolu olsa o yola giderlerdi.

Olay şöyle gelişiyor,

LDA $01

dendiğinde Cpu LDA komutunu fetch ediyor, sonra da operand'ı fetch ediyor. Sonra internal olarak A register'ına 01 portunun değerini set ediyor.

Data bus'ta 01 portunun içeriğini göremiyoruz bu yüzden.

Bu arada niye $01'in değerini bilmeye ihtiyaç var?
Logged

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

twitter | blog
hades
Üye
****
Mesaj Sayısı: 392



Üyelik Bilgileri
« Yanıtla #48 : Eylül 29, 2015, 20:48:29 ÖS »

Bu arada niye $01'in değerini bilmeye ihtiyaç var?

Sanırım konu delimawi'nin "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." mesajına bağlı olarak $01 adresine kadar geldi.
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #49 : Eylül 29, 2015, 21:10:36 ÖS »

Sanırım konu delimawi'nin "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." mesajına bağlı olarak $01 adresine kadar geldi.


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.

Arkada demo çalışırken dma yapıyorsa zaten iş program freeze etmeye dönüşüyor. Bunun için de değişik yöntemler uygulanabilir. 1541 ultimate mesela çalışan programın hangi raster'da kaldığını da saklayıp freeze ediyor çalışan program yamulmasın diye.
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 #50 : Eylül 29, 2015, 21:25:03 ÖS »

@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.
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 #51 : Eylül 29, 2015, 23:53:17 ÖS »

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

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



Üyelik Bilgileri WWW
« Yanıtla #52 : Eylül 30, 2015, 00:30:41 ÖÖ »

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


Tercih meselesi tabii zengin bir arayüz de yapılabilir bunda sorun yok. Ancak pic ile ekran çizmenin, sprite'lara elleşmenin vesaire seni sınırlayacağını sanmıyorum, bilakis daha yüksek hızda bir işlemci ile bu işi yaptığın için 6510'a göre avantajlı konumdasın. Ekrana müdahale ettiğin gibi tüm VIC IO'suna müdahale edebilirsin.

Color ram ile ilgili kısıtlama gözüme çarpmadı. $D000 - $DFFF aralığı I/O ise ki default hali bu erişebilmen lazım bence.

ps1: Her ekran taramasında bir miktar süreyi c64'e klavyeyi falan tarasın diye vermen lazım tabii.

ps2: Raster zamanlamasını nasıl yaparsın bilemiyorum. Split falan yapmaya kalkarsan Satırların başını sonunu kolayca tutturursun da ortasından zor olabilir.
« Son Düzenleme: Eylül 30, 2015, 00:39:20 ÖÖ 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
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #53 : Eylül 30, 2015, 07:32:33 ÖÖ »

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

(Sadece sesli düşünüyorum, kesin olur diyemem) Bu bilgileri stack'e atıp daha sonra geri alabilirsin.

pha
txa
pha
tya
pha
....
....

daha sonra da;
pla
tax
pla
tay

gibi.
Logged
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #54 : Eylül 30, 2015, 13:00:05 ÖS »

Evet ama sorun şu.
Örneğin C64 te çalışan bir kod var.
Dolayısı ile PC o an işlenmekte olan komutu işaret ediyor.
Ben freeze edecek ufak kod parçasını C64 hazfızasında uygun bir yere DMA ile atıp, attığım kodun çalışmasını sağlayacağım. Yani aslında attığım kod çalışmaya başladığı andan itibaren PC değişmiş olacak.

En mantıklısı sanırım ilgili koda NMI ile gidilmesini sağlamak. Bu sayede return değerini stack ten geri okuyabilirim. Açıkçası düşünülmesi gerekiyor bu kısmın.

C64 için bir kırıcı kartuş vardı. ISEPIC di galiba adı. Bu kartuş tam da bu iş için yapılmış. Sadece oyun freeze etmek için. Ayrıca ROM bulundurmuyor, sadece RAM vardı kartuşta. Kartuşun kodunu sanırım önce distekle yüklemek gerekiyordu vb. Bu sistemin nasıl çalıştığını biraz incelemek sanırım yol gösterir.

Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
joker_
Deneyimli
*****
Mesaj Sayısı: 2.120



Üyelik Bilgileri
« Yanıtla #55 : Eylül 30, 2015, 13:03:55 ÖS »

Ufak kod parçasını atacağın hafıza bloğunu, önceden bir yere geçici olarak kopyalayıp, işin bitince de tekrar geri taşısan olmaz mı?
Logged
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #56 : Eylül 30, 2015, 13:08:59 ÖS »

Olur tabi, zaten önceden tüm RAM i bir yere kopyalacağım.
Ama 6510 içerisinde PC denen 16 bitlik bir register var.
O an hangi adresteki kodun çalışmakta olduğunu gösteriyor.
Ben bu registeri DMA ile okuyamıyorum çünkü RAM de değil.
Bu registeri okumak için kod çalıştırmam lazım. Ama o kod da çalışınca PC nın değerini değiştirmiş olacak. Yani PC yi okduğunda FREEZE öncesi çalışan adresi değil, attığım kodun bulunduğu adresi gösteriyor olacak...
Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.757


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #57 : Eylül 30, 2015, 13:17:25 ÖS »

Bu registeri okumak için kod çalıştırmam lazım. Ama o kod da çalışınca PC nın değerini değiştirmiş olacak. Yani PC yi okduğunda FREEZE öncesi çalışan adresi değil, attığım kodun bulunduğu adresi gösteriyor olacak...


Quantum Fiziğine döndü bu olay. Gözlemci mevcut duruma bakmak istediğinde mevcut durumu değiştiriyor falan.

https://tr.wikipedia.org/wiki/Qubit

Kendimi Geleceğe Dönüş filminde veya Quantum Leap dizisinde gibi hissettim.
« Son Düzenleme: Eylül 30, 2015, 13:21:47 ÖS Gönderen: Simon (Özay Turay) » Logged

https://retrodergi.com - https://e-turay.com - https://karizmawow.e-turay.com

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PS Vita, Nintendo 3DS, Nintendo 2DS
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #58 : Eylül 30, 2015, 13:21:37 ÖS »

@simon : Aynen ...
@i_r_on: C64 te Color RAM için ayrı fiziksel chip var. O zaman Color RAM altında kalan bölgede de gerçek RAM olmalı. Orayı da bir şekilde okumak lazım bence ama oraya ulaşmak mümkün mü bilmiyorum. Yani normal 6510 kodu ulaşabiliyor mu o bölgeye. ROM kapatma gibi bir yöntem var mı Color RAM i kapatmak için?
Logged

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



Üyelik Bilgileri WWW
« Yanıtla #59 : Eylül 30, 2015, 13:24:43 ÖS »

@delimawi: 01'in default değeri olan konfigürasyonda okuyup yazabiliyorsun diye biliyorum. Memory konfigürasyonlarında color ram için bir ayrım yok, io bölgesi içinde geçiyor.
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 [4] 5 6 ... 15   Yukarı git
Yazdır
Gitmek istediğiniz yer: