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 ... 3 4 [5] 6 7 ... 15   Aşağı git
Yazdır
Gönderen Konu: Doberman (DMA Tabanlı Kartuş Projesi)  (Okunma Sayısı 151994 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #60 : Eylül 30, 2015, 13:41:12 Ö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.

Şimdi hızlıca bir test yaptım da, Color RAM'in olduğu bölgeye DMA ile yazamıyorum. Neden acaba incelemek lazım? 55296 Bu adrese gönderdiğim byte'ı C64 te göremiyorum. Eski hali duruyor.
Ama ekran ram vb ye rahatlıkla yazabiliyorum.
Acaba Color RAM'in timingi falan mı farklı? Yada doğrudan VIC'e bağlı olduğu için mi birşeyler karışıyor. İncelenecek...
Logged

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



Üyelik Bilgileri WWW
« Yanıtla #61 : Eylül 30, 2015, 14:11:23 ÖS »

Aslında tamamen VIC'e bağlı değil, A0..A9 adres hatları ve D0..D3 data hatları bus'a bağlı. Zaten 1kx4bit  bir ram, 10 bit adres hattı yeter. VIC sadece farklı adreslerle erişiyor ve buradaki 4 data bit'i ile bus'dan gelen 8 data bit'ini birleştirip 12 bitlik bir databus kullanıyormuş.

Ancak dikkatimi çeken R/W sinyali Color RAM'a VIC'ten geliyor. VIC'in iç tasarımına falan bakmak lazım.  C64 schematic'lerinde tam olarak Color Ram'in CS ve OE hatlarının nereden beslendiği belirtilmemiş.

Şunu incelemediysen bir incele : http://www.zimmers.net/anonftp/pub/cbm/schematics/computers/c64/servicemanuals/C64_Service_Manual_314001-02_(1985_Sep).pdf

Ancak senin testi doğrulayan şöyle bir tartışma da gördüm

http://csdb.dk/forums/?roomid=7&topicid=110532&showallposts=1

Beri yandan 1541 ultimate içinde color ram'a yazması için kod da gördüm
Logged

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

twitter | blog
F_P_G_A
Üye
****
Mesaj Sayısı: 299



Üyelik Bilgileri
« Yanıtla #62 : Eylül 30, 2015, 21:00:33 Ö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.


Mükemmel bir benzetme olmuş üstad.
Logged
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #63 : Ekim 02, 2015, 01:06:22 ÖÖ »

Bir kaç gündür ciddi birşey yapamadım proje adına ama Chameleon'nun dökümantasyonunu okurken şu dikkatimi çekti:

Take note that the signal has a clean high to low transition, but a slow not well defined low to
high transition. Therefore the FPGA should only use the high to low transitions of the Phi-2. As
signal is inverted the stable transition represents a rising-edge on the actual FPGA pin (phi2 n).

Aynen benim de farkettiğim durumu yazmış. Phi2 nin çıkan kenrı bozuk onun için düşen kenerı kullanmak lazım diye. Ben de CPLD içerisindeki clockları buna göre değiştireceğim ilk fırsatta.

Bu arada FREEZE mantığında Color RAM altında düşündüğüm gibi kullanılabilir bir RAM varmış. Eğer IO bölgesi kapalı ise o normal RAM'e erişiliyor, IO bölgesi açık ise aynı adreste Color RAM beliriyor. Benzer durumunu VICE'in teknik dökümantasyonunda da gördüm. Emülatörde FREEZE yapıldığında, RAM, ColorRAM ve Registerlar ayrı ayrı kaydediliyor.

Sorun şu ki ben Color RAM e yazmaya çalıştığımda IO bölgesi açıktı, yani DMA ile yazabilmem gerekiyordu. Büyük ihtimal ile CPLD de bir timing problemi oldu.

Son olarak enteresan bir bilgi, logic analyser ile C64 üzerinde inceleme yaparken şunu farkettim. Dinamik RAM ler için üretilen CAS ve RAS sinyalleri var. Bunlardan biri PLA üzerinden geçerek RAM'e ulaşıyor ve şemada CASRAM olarak belirtilmiş. Şimdi RAM'e ister okuma, ister yazma yapılması durumunda bu sinyalin RAM'e uygulanması gerekiyor. DMA ile RAM'e yazmak için R/W sinyalini LOW a çekiyoruz. PLA da RAM e yazılmasını gerektiğini buradan anlayarak RAM'e CASRAM sinyalini gönderiyor. Enteresan olan durum ise, okumak için R/W sinyali high olarak bırakılıyor (Normal Durum) sadece Adres Hatları sürülerek, Data hattı dinleniyor. Ama bu durumda bile PLA RAM'den okuma yapılmak istendiğini anlayarak CASRAM sinyali üretiyor. Bunu nereden anlıyor çözemedim. Adres Hattını sürmez isem, yani okuma yada yazma yapmak istemediğim durumlarda CASRAM sinyalini RAM'e göndermiyor.
Logged

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


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #64 : Ekim 02, 2015, 01:15:57 ÖÖ »

Gene Chameleon'un dökümantasyonu okuyorum, burada belirtmiş. DMA ile C64'e bilgi atarken, içerideki her bir chip'in farklı timingleri olduğundan bahis ediyor.

For sending data to the C64 the datalines should be stable as early as possible and should stay
driven slightly into the next half-cycle. When reading from the C64 the data should be taken over
as late as possible, but definitely before the end of the cycle. The CIAs take over data at the very
begin of the cycle. The main memory chips (DRAM) are very slow and can have access times
upto around 300 ns. The color-ram is SRAM (static RAM) and wants to see stable data from the
beginning until late in the cycle. The Kernal and BASIC ROMs can be fast (EPROM) to very
very slow (400ns+ or almost a full cycle in case of the original SX-64 Kernal ROM chip).
The VIC-II has multiple sample points and can best be treated the same as the SRAM (give data
fast and keep it stable). This can be a challenge as often video data will be coming from SDRAM
which takes time. The main Chameleon core has three points in the cycle where data is transfered.
At the very beginning of the cycle for (emulated) CPU writes to CIA, SID and VIC-II registers.
Somewhere half-way the cycle after SDRAM reads are complete to feed the VIC-II chip character
or sprite data. The actual spot in the schedule is a comprimise between SDRAM speed and VIC-II
setup time. And finally at the very end just before the cycle ends for reads from ROMs and I/O
space.

Bu sebeple ColorRAM'e yazamamış olma ihtimalim yüksek. Sanırım timing problemi.
Logged

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


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #65 : Ekim 02, 2015, 18:18:05 ÖS »

Merhaba,

Bu gün bir kaç saat vaktim oldu, Doberman64'ün flash çipini de taktım. Daha önce söylediğim gibi bu versiyon flash'lı olacak. Belki sonrakini SD kart yapabilirim. Flash çipi 4MByte. Bir file sistem yapmadım. Kabaca 64KB lık 64 adet slot tanımladım. Zaten iyi oyunlar 40-50KB. 64 İyi oyun da bu tarz bir kartuş için yeterli. Bu arada arkadaşların bahsettiği gibi yollar oksitlenmeye başladı malesef. En azından C64 kontaklarının olduğu kısmı ince zımpara yaparak kapladım. Bir süre idare eder.



Flash'a prg atabilmek için PC de şimdilik basit bir arayüz hazırladım. Aşağıdaki imajları flash'a yükledim. Herhangi bir sorun yok hepsi çalışıyor. Ancak halen bir loader yok. Haftasonu belki birşeyler çıkartabilirim loader anlamında.

// 0:Zorro
// 1:Commando
// 2:Duotris
// 3:Ghostbusters
// 4:Giana Sisters
// 5:Boulder Dash
// 6:Rambo
// 7:Galaxian
// 8:Arkanoid
// 9:Aztec Chalange
// 10:1942
// 11:Barbarian I
// 12:Barbarian II
// 13:Green Berret
// 14:Ghost'n Goblins
// 15:Cyberdyne Warior
// 16:Ikari Wariors
// 17:Impossible Mission
// 18:Delta

İki tane sıkıntı var. Birincisi bu imajların başında cracker introları var. Ve yükleme zamanlarını kısaltmak için sıkıştırılmışlar. (imajı küçültmek için bazı grafik vb yerlerde de oynama yapılmış olması da bence çok olası.) Dolayısı ile DMA çok hızlı olarak imajı yüklesem bile ortalama 10sn abuk sabuk introlar ve decrunching için beklemek gerekiyor. Buna bir çözüm bulunmalı.

FREEZE işini bitirmiş olsam aslında intro sonrasında, oyunun başlama anında bir snaphot almak çok daha mantıklı. Ama şu an için bunu da yapamıyorum. Bu oyunların orjinal hallerini nereden bulurum acaba? Ve acaba orjinal hallerinde de decrunching var mı merak ediyorum.

İkinci bir sıkıntı ise, RESET pini ile C64'ü resetlesem bile bazen sonraki oyun çalışmayabiliyor. En tipik örnek Commando da oldu. Oyun açık iken RESET yapıyorum, reset süresince oyunun müziği bile çalmaya devam ediyor. Demekki 6510 çalışmaya devam ediyor. Acaba RESET e karşı önlem almanın bir yolu mu var?

Aklıma basit bir çözüm olarak DMA ile bir RESET kodu atıp, bunu da NMI ile çalıştırmak geldi. Belki denenebilir.
« Son Düzenleme: Ekim 02, 2015, 18:23:51 ÖS Gönderen: delimawi » Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
AmigaMan
Deneyimli
*****
Mesaj Sayısı: 635



Üyelik Bilgileri
« Yanıtla #66 : Ekim 02, 2015, 18:29:38 ÖS »

Seri üretim nezaman hocam bende iki tane sipariş vereyim
Logged

Amiga ölmedi, efsane uyuyor
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.757


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #67 : Ekim 02, 2015, 18:56:35 ÖS »

Harika gidiyor.

Flash'taki oyunları değiştirmek için bir arabirim mevcut mu?

Bu arada tasarımında bir eksiklik buldum, kartuş kutusuna montaj için Commodore ve ICOMP standardında delikleri unutmuşsun. Kahkaha
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 #68 : Ekim 02, 2015, 19:03:29 ÖS »

@amigaman,
Şimdilik seri üretim düşünmüyorum. FREEZE işlerini de yapabilirsem ondan sonra belki bir miktar PCB basarız, buradan isteyenlere ulaştırırız ama üretim takibi ıvır zıvır yetişebileceğimi sanmıyorum şu an için. Zaten daha erken...

@simon,
Evet şimdilik basit bir PC arayüzü yaptım. Ama kartuş üzerinde direk USB çıkış yok. 115200 TTL Seri port var. Dolayısı ile USB>TTL dönüştürü lazım kullanmak için. Zaten kendim için yapmıştım o portu.

Sözüne ettiğin deliklerin de bir standardı olduğunu sonradan farkettim. Ama zaten kutuluma derdim olmayacağı için hiç önemsemedim. Zaten PCB nin tam ortası o kadar dolu ki iyi ki de eklememişim bu aşamada. Ama hani proje biter, hedeflerime ulaşırım o zaman elde basma derdim olmayacağı için rahat rahat revize edebilirim PCB yi gerekirse daha sıkışık olarak ve o delikleri yerleştiririz... Kahkaha
Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
hades
Üye
****
Mesaj Sayısı: 392



Üyelik Bilgileri
« Yanıtla #69 : Ekim 02, 2015, 19:32:57 ÖS »

Gene yıllar önce uğraştığım intro ve demo programlama günlerinden ...

Daha önceki mesajlarda dikkatimi çeken bir kısım.
Yıllar önce intro ve demo kodladığına göre acaba tanıdık biri olabilir misin? Biraz bilgi vermen mümkün mü? Hangi gruptaydın, nickin vs. ?

Bu arada oksitlenmeye karşı en basit çözüm exp. slota giren yerleri tamamen lehim kaplamak, geri kalan kısmı -komponentler dahil- çift yüz olarak vernikle kaplamak.
« Son Düzenleme: Ekim 02, 2015, 19:35:54 ÖS Gönderen: hades » Logged
Metallic
Uzman
*****
Mesaj Sayısı: 1.081



Üyelik Bilgileri
« Yanıtla #70 : Ekim 03, 2015, 00:55:33 ÖÖ »

İki tane sıkıntı var. Birincisi bu imajların başında cracker introları var. Ve yükleme zamanlarını kısaltmak için sıkıştırılmışlar. (imajı küçültmek için bazı grafik vb yerlerde de oynama yapılmış olması da bence çok olası.) Dolayısı ile DMA çok hızlı olarak imajı yüklesem bile ortalama 10sn abuk sabuk introlar ve decrunching için beklemek gerekiyor. Buna bir çözüm bulunmalı.
delimawi selam. İntro ve depack beklemelerinden kurtulmak için oyunun kodunu takip edip, tam oyun başlayacağı anda kodu durdurarak oyunun açıldığı bellek aralığını kaydetmek gerekli. Ben şu an bunlarla uğraşıyorum, biraz zaman alıyor. Decruncher, depacker ve introlar üst üste binmiş durumda, bunların çalışmalarını/açılmalarını takip edip oyunun başlayacağı ana kadar gittikten sonra oyunun hangi aralığa açıldığını ve start adresini, depacker rutinine bakarak tespit edip oyunu kaydetmek gerekiyor.

Açılmış durumdaki örnek bir oyun olarak International Karate Plus'ı vereyim:
https://dl.dropboxusercontent.com/s/x0nvyqduoagfwct/ik%2B%200800-fd86.prg

ik+, $0800-$fd86 aralığına yükleniyor. $01 adresinde $37 değeri varken (normal bellek konfigürasyonu), oyunu bu aralığa yükleyemezsin. Önce $01 adresine $30/$34/$38 değerlerinden birini yazarak $d000-$dfff aralığındaki ram'i açmak gerekli.
Oyunun çalıştırma adresi $fd20. $01 adresinde $37 değeri varken, $fd20'e jump yaparsan oyun çalışmaz, önce sei yaparak irq'yu engelleyip ardından $01 adresine $35 yazarak kernal romu kapatmak gerekli.

ik+'ı, Doberman64 ile nasıl yükleyip çalıştırabilirsin diye düşünüp örnek bir asm kod yazdım:
https://dl.dropboxusercontent.com/s/2kzuhiq4lgy6mfw/cbm80.asm
https://dl.dropboxusercontent.com/s/tt8y45dg71jbd9n/cbm80.prg
cbm80.asm'yi Acme assember ile derleyebilirsin. Derlenmiş hali cbm80.prg.

Çalışma mantığı şu şekilde:
c64 reset'lendiği an (ya da ilk açılıyorken), dma yaparak 6510'u durdurup cbm80.prg'yi $8000 adresine yüklüyorsun. 6510'u serbest bırakıyorsun. 6510 çalışmaya devam ettikten sonra $fd02 rutini ile CBM80 metoduyla çalışacak bir kod var mı diye kontrol ediyor ve ardından $8000'deki vektöre göre $8009'a dallanarak yoluna devam ediyor. CBM80 metodu için Alphaworks'ün şu dökümanına bakabilirsin.
$8009'dan itibaren reset/init rutini başlıyor. Burada custom $fd50 rutini kullandım (kernal'daki $fd50 rutini, ram testi yaptığı için çok vakit harcıyor).
init rutininden sonra wait rutini $0334'e transfer ediliyor.
$01 adresine $38 değeri yazılarak tüm 64KB ram açılıyor.
$ff adresine 1 değeri yazılıyor ve $0334 adresine jump yapılıyor.
$0334'de 6510, $ff adresinin sıfırlanmasını beklemeye başlıyor.

Bunun ardından dma ile oyunu belleğe yüklüyorsun (cbm80.prg'yi yükleyip 6510'u serbest  bıraktıktan 1sn sonra yapman yeterli).
Oyunu yükledikten sonra yine dma ile şu adreslere yazıyorsun:
$fb : $01 adresine yazılacak değer (ik+ için $35)
$fc : irq durumu (0=cli , 1=sei) (ik+ için 1)
$fd : oyunun jump adresinin low byte'ı (ik+ için $20)
$fe : oyunun jump adresinin high byte'ı (ik+ için $fd)
$ff : 0

6510'u serbest bıraktıktan sonra, $ff adresi sıfırlanmış durumda olduğu için 6510 yoluna devam ediyor ve yukarıdaki değerlere göre ik+'yı çalıştırıyor. Ben WinVice'da Action Replay v6 freezer ile deneme yaptım, verdiğim kod çalışıyor.


FREEZE işini bitirmiş olsam aslında intro sonrasında, oyunun başlama anında bir snaphot almak çok daha mantıklı. Ama şu an için bunu da yapamıyorum. Bu oyunların orjinal hallerini nereden bulurum acaba? Ve acaba orjinal hallerinde de decrunching var mı merak ediyorum.
Oyunların orjinallerinde decrunching olmaz, ama orjinallerin disket/kaset versiyonlarını (d64 ve tap dosyaları) Doberman64 ile c64'e nasıl yükleyeceksin? Disk drive / tape emulasyonu yaptırman gerekir, ayrıca orjinallerin yüklenmesi çoğunlukla crack'lere göre daha uzun sürer. En güzeli freeze fonksiyonunu bitirirsen, prg'leri çalıştırıp oyun çalışmadan önceki adı freeze'lersin. Sonra hızlı yüklemeler için bu freeze imajını kullanırsın.


İkinci bir sıkıntı ise, RESET pini ile C64'ü resetlesem bile bazen sonraki oyun çalışmayabiliyor. En tipik örnek Commando da oldu. Oyun açık iken RESET yapıyorum, reset süresince oyunun müziği bile çalmaya devam ediyor. Demekki 6510 çalışmaya devam ediyor. Acaba RESET e karşı önlem almanın bir yolu mu var?

Aklıma basit bir çözüm olarak DMA ile bir RESET kodu atıp, bunu da NMI ile çalıştırmak geldi. Belki denenebilir.
Bazı oyunlar reset'e karşı CBM80 metodunu kullanarak tekrar çalışırlar, Commando'nun reset'lenince tekrar çalışması bu şekilde. Yukarıda anlattığım gibi reset'ten hemen sonra 6510'u durdurup dma ile kendi CBM80 kodunu $8000 adresine yazarsan bu sorundan kurtulmuş olursun =)
Logged
eins
Uzman
*****
Mesaj Sayısı: 1.816


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #71 : Ekim 03, 2015, 17:55:51 ÖS »

@hades,
Malesef hiç bir grupta değildim. Evde oturup assemly yazardım sadece. Commodore Dergisinde master/Clique'un yazılarını okurken öğrendim 6510 programlamayı. Tabi o zamanlar master olduğunu bilmiyordum. Ama tanıdığım kişiler var sceener olan.

Bu arada yazmayı unuttum. 0 ve 1 adreslerine DMA ile baktığımda random değerler alıyorum. Bazen 0, 85 ve 170 görmüşlüğüm var. Sanırım bu iki adres hiç bir şekilde bus'a bağlı değil, internal çalışıyor.

Edit: master yerine remix yazmisim.

@Metallic
Teşekkür ederim, çok değerli bilgiler. Bu gün CPLD ile uğraştım vaktim olmadı. İlk fırsatta yazdıklarını tekrar detaylıca okuyarak deneyeceğim. Gerçi her bir oyunla ayrı ayrı uğraşmak niyetinde değilim. Şu FREEZE işine sanırım girişmenin zamanı geldi.
 
« Son Düzenleme: Ekim 03, 2015, 21:29:17 ÖS 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 #72 : Ekim 03, 2015, 17:57:10 ÖS »

Merhaba,

CPLD Logic kısmını artık tam olarak bitirdim sanırım. Color RAM'e de yazabiliyorum, bir sıkıntı kalmadı.
CPLD kısmı ile ilgili teknik bilgi vereceğimi belirtmiştim, şimdi biraz fırsat buldum.

CPLD kodunu WinCUPL ile yazıyorum, VHDL den biraz farklı ama kolay bir mantığı var.
CPLD vb programlarken bilinmesi gereken şey, yazılan kodun sıralı bir şekilde çalışmadığı. Yani örneğin A=!B dediğinizde, A bacağı her zaman B bacağının tersi olacak şekilde mantık programlanmış olur.
A=!B önermesinin gerçekleşmesi için yazılan kodun ilgili satırına gelmesine gerek yoktur, bu önerme her zaman için geçerlidir.
Bu kısa ön bilgiden sonra, Doberman64'ün logic kodunu aşağıda açıklayarak paylaşıyorum;

/* C64 INTERFACE */
PIN[11,10,8,6,5,3,2,44]=[C64_DATA0..7];
PIN[43]=C64_DMA;
PIN[42]=C64_RW;
PIN[40]=C64_BA;
PIN[37]=C64_PHI2;
PIN[35]=C64_RESET;
PIN[33]=C64_DOTCLK;   

Burada, C64 tarafında kullandığımız hatları CPLD pinlerine tanımladık.

/* ADDRESS OUTPUT ENABLE */
PIN[12]=ADDR_OE;

/* PIC INTERFACE */
PIN[27]=REQ_DMA;
PIN[30]=IN_DMA;
PIN[23]=P_RW;
PIN[25]=P_START;
PIN[34]=P_DONE;
PIN[28]=REQ_RESET;
PIN[13,14,15,18,19,20,21,22]=[BUS0..7];

Burada da PIC tarafındaki pinleri tanımladık.
ADDR_OE pini ise, 2 adet 573 latch'ine bağlı durumda.


/* ********************************************************** */
/* RESET HANDLER                     */   
/* ********************************************************** */
C64_RESET.oe=REQ_RESET;
C64_RESET.le='b'1;
C64_RESET.l='b'0;

Burada, PIC tarafından reset request gelir ise, C64 tarafındaki C64_RESET pini tetikleniyor.
Mantık şu, C64 tarafına bağı olan RESET Cell, her zaman 0 durumunda. (Son iki satır bunu sağlıyor.)
PIC tarafından RESET req. gelir ise, bu cell'in outputları enable ediliyor ve hat low'a çekilmiş oluyor.
Bu sayede pini open collector gibi kullanmış oluyorum. Normalde bu çıkış high-z, yani boşta kalıyor.


/* ********************************************************** */
/* C64 PHI2 SHAPER                                            */
/* ********************************************************** */
/* Usage: PHI2 & C64_PHI2                                     */
/* ********************************************************** */
/* C64_PHI H-L Delay:10ns                                     */
/* C64_PHI L-H Delay:40ns                                     */
/* ********************************************************** */
 
PINNODE = PHI2;

PHI2.ck=!C64_DOTCLK;
PHI2.d=C64_PHI2;

Burada enteresan bir mantık kullandım. Bildiğiniz gibi Phi2 clock'un çıkan kenarının şekilsiz olduğunu farketmiştim.
Aynı zamanda okuduğum bazı bilgilere göre, Phi2 nin bu çıkan kenarını referans olarak kullanmak doğru değilmiş.
Normalde yapılması gereken, düşen kenara senkronize olan bir Phi2 clock yaratmak ve onu kullanmak. Ama bu CPLD içinde dışarıdan eleman kullanmadan kolay olmayacağı için başka birşey yaptım.
Phi2 çıkan kenardan sonra gelen ilk DOT_CLOCK'un düşen kenarını referans aldım.
DOT_CLOCK bilindiği üzere, 8MHZ civarı yani Phi2 den 8 kat hızlı çalışan bir clock.
Kodun geri kalanında bu yeni ürettiğim PHI2 sinyalini kullandım ve daha önce yaşadığım problemler ortadan kalktı.

Buna ait plot aşağıda:




/* ********************************************************** */
/* DMA_SAFE = BA + 3 PHI2 CYCLE COUNTER            */   
/* ********************************************************** */
/* Usage: DMA_SAFE3                                           */
/* ********************************************************** */

PINNODE = [DMA_SAFE0..3];

[DMA_SAFE0..3].ck=PHI2;
[DMA_SAFE0..3].ar=C64_BA;

DMA_SAFE0.d='b'1;
DMA_SAFE1.d=DMA_SAFE0;
DMA_SAFE2.d=DMA_SAFE1;
DMA_SAFE3.d=DMA_SAFE2;

Burada da, DMA'ya giriş için daha önce konuştuğumuz BA Low olduktan sonraki 3 clockluk gecikmenin nasıl yapıldığı görülüyor.
4 Adet Flip Flop arka arkaya bağlı. Hepsinin clock'u PHI2. Yani her PHI2 cycle da bir sonraki FF High oluyor.
Son FF da high olduktan sonra DMA ya girebiliriz.

Buna ait plot aşağıda:





/* ********************************************************** */
/* DMA REQUEST HANDLER                  */   
/* ********************************************************** */
/* Sadece DMA_SAFE iken DMA'a gir...                          */
/* PHI2 Low iken yani VIC-II cycleda iken cikabiliriz...      */
/* ********************************************************** */

IN_DMA.le=DMA_SAFE3;
IN_DMA.l=REQ_DMA;
IN_DMA.ar=(!C64_RESET) # (!PHI2 & !C64_PHI2 & !REQ_DMA);

C64_DMA.le='b'1;
C64_DMA.l=!IN_DMA;

Burada, PIC'ten gelen DMA Requesti, sadece biraz önce bahsettiğimiz DMA_SAFE durumunda işlenecek şekilde bir mantık var.
DMA'dan çıkış için bir optimizasyon yaptım. Artık bir sonraki Bad Line'ı beklemek yerine, PHI2 Low iken yani VIC-II devrede iken çıkabiliyorum.
Burada dikkat edilmesi gereken, PHI2 High iken DMA'dan çıkılmaması.

Giriş ve çıkış plotları:






/* ********************************************************** */
/* PIC <-> C64 PROCESS HANDLER               */   
/* ********************************************************** */
/* Three Step State Machine                                   */
/* P_START oldugunda sira ile tetiklenirler                   */
/* WAIT: Isleme baslamadan once ilk VIC-II cycle'i bekler     */
/* PROG: VIC-II Cycle biter bitmez tetiklenir (Gercek islem)  */
/* DONE: Tekrar VIC-II Cycle basladiginda islemimiz bitmistir */
/* ********************************************************** */

PINNODE=WAIT;
PINNODE=PROG;
PINNODE=DONE;

WAIT.l  = 'b'0;
WAIT.ck = 'b'0;
WAIT.ap = P_START & (!PHI2) & (!C64_PHI2);
WAIT.ar = !P_START;

PROG.l  = 'b'0;
PROG.ck = 'b'0;
PROG.ap = WAIT & PHI2 & IN_DMA & C64_BA;
PROG.ar = !P_START;

DONE.l  = 'b'0;
DONE.ck = 'b'0;
DONE.ap = PROG & (!PHI2);
DONE.ar = !P_START;

Burada transfer işlemini gerçekleştiren state machine arka rkaya bağlı üç FF ile kuruldu.

İlk Flip Flop VIC-II sırasının gelmesini bekliyor. Bu sayede sıra bizdeyken, yani clock'un yarısında transfere başlamamış olduğumuzdan emin oluyoruz.
Zaten request geldiğinde, eğer sıra VIC-II deyse bu state hemen geçiliyor.

İkinci FF, gerçek transfer işleminin yapıldığı zaman yani Phi2 iken set oluyor.

Phi2 tekrar low a düşünce yani sıra tekrar VIC-II ye gelince işlem tamamlanmış oluyor.



/* ********************************************************** */
/* DONE Signal To PIC                  */   
/* ********************************************************** */

P_DONE.l=DONE;
P_DONE.le='b'1;

İşlem bitince bunu tekrar PIC'e bildirdiğim bölüm.



/* ********************************************************** */
/* ADDRESS Ouput Logic (Both Read & Write)         */   
/* ********************************************************** */

ADDR_OE.l=!(PROG & (!DONE));
ADDR_OE.le='b'1;

İşlem read veya write, farketmiyor, adres bilgisini PIC latchlere zaten yazdı.
Bizim sadece doğru zamanda, yani PROG anında bunu output etmemiz gerekiyor.



/* ********************************************************** */
/* C64 R/W Pin (Only in Write Operation)             */   
/* ********************************************************** */

C64_RW.l='b'0;
C64_RW.le='b'1;
C64_RW.oe=PROG & (!DONE) & P_RW;

/* ********************************************************** */
/* C64 DATA Bus Output Enable (Only in Write Operation)   */   
/* ********************************************************** */

[C64_DATA0..7].l=[BUS0..7].io;
[C64_DATA0..7].le=P_RW;
[C64_DATA0..7].oe=PROG & (!DONE) & P_RW;


Bu iki işlem sadece PIC Write yapmak istemiş ise yapılacak. Yani C64 tarafındaki R/W Pini low'a çekilecek, ve BUS'taki data C64 Adres Bus'ına basılacak.


/* ********************************************************** */
/* C64 DATA > PIC Internal Bus Latch (Read Operation)      */   
/* ********************************************************** */

[BUS0..7].l=[C64_DATA0..7].io;
[BUS0..7].le=PROG & (!DONE) & (!P_RW);
[BUS0..7].oe=(!P_RW) & (DONE);

Son olarak eğer PIC read yapıyor ise, doğru zamanda, C64 Data Bus'ı, internal BUS'a latchliyoruz.
PIC, Requesti sonlandırana kadar data orada kalıyor ve PIC okuyabiliyor.

Tüm CPLD kodu bu kadar.
Bu kod kullandığım CPLD'nin yaklaşık yarısını kaplamış durumda.

Total I/O pins used      31/32    (96%)
Total Logic cells used       31/64    (48%)
Total Flip-Flop used       30/64    (46%)
Total Foldback logic used    0/64    (0%)
Total Nodes+FB/MCells       31/64    (48%)

Eğer merak ettiğiniz bir yer varsa seve seve açıklarım.
Logged

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


A.K.A. deliMawi


Üyelik Bilgileri
« Yanıtla #73 : Ekim 03, 2015, 18:05:58 ÖS »

Bu arada, gün içerisinde PC'deki tool'u da ilerlettim. Bu tool ile Doberman64 USB üzerinden PC ile haberleşiyor. PC tarafından DMA başlatılıp, durdurulabiliyor. Flash'e PRG atılabiliyor. Program çalışırken Poke ve Peek yapılabiliyor vb.

Malesef C64 Tarafındaki Loader'a elim gitmiyor. Bakalım kısmet. Kahkaha
 
Küçük bir de video çektim birazdan ekleyeceğim.



Logged

Doberman ♦ megaOne ♦ HDMI-64 ♦ HDMI-520 ♦ NewSchool
LW3D
Yönetici
*****
Mesaj Sayısı: 11.418


Günü Kurtaran Avam Hiooargggh :)


Üyelik Bilgileri WWW
« Yanıtla #74 : Ekim 03, 2015, 19:37:53 ÖS »

Bu proje bugüne kadar C64 için yapılmış en ciddi, güzel kartuşlardan birisi.. Bizi bu kartuştan mahrum etmeyeceğini umuyoruz Üretim konusunda deneyimli arkadaşlar var, muhakkak yardımcı olacaklardır...

Videoyu ve sonuç ürünü büyük bir heycan ve ilgiyle bekliyoruz...
Logged

Sayfa: 1 ... 3 4 [5] 6 7 ... 15   Yukarı git
Yazdır
Gitmek istediğiniz yer: