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 ... 14   Aşağı git
Yazdır
Gönderen Konu: Psid player projesi  (Okunma Sayısı 99912 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« : Aralık 19, 2014, 00:31:31 ÖÖ »

Devrenin şu an çalışan versiyonu şu şekilde




---

Eski demonte ettiğim harddisklerin kontrol kartlarında işe yarar bir şey var mıdır diye bakınıyordum. Parçaların datasheet'lerine ulaşmaya çalıştım internette. OTP rom buldum, harddisklerde kullanılan logic entegreler buldum. Nispeten yeni olanında DRAM buldum falan derken 64kx8 bir SRAM çipi buldum.

Şimdi OTP rom bir işe yaramaz, adı üstünde One time programmable rom. Bunu üreticiler tek sefer yazacakları upgrade etmeyecekleri firmware'lerini yazmak için kullanıyorlar. İkinciye yazmak mümkün değil. DRAM'i kullanmak ise benim tecrübe seviyeme göre biraz ağır kaçıyor. Veriyi aklında tutamayan ram'ler bunlar, sürekli tazelemek için ek devre ile donatmanız gerekiyor. SRAM'i (Static ram) görünce bir yerlerde yatan kullanmadığım 16f877 pic mikro işlemciyi hatırladım.

Pic ile yapılmış benzer bir proje görmüştüm (http://code.lardcave.net/entries/2012/10/06/173014/), benzer bir proje yapabilir miyim acaba diye düşünmeye başladım.

Analog devreler konusunda bilgi seviyem iyi olmadığı için muhtemelen devreye gerilimi düzgün bir şekilde sağlama, ses çıkışını yükseltme konusunda falan epey tökezleyeceğim. Çözülmesi gereken bir sürü problem olduğu için aşama aşama ilerlemeyi düşünüyorum.

Üstte linkini verdiğim elemanın yaptığı projeden farklı olarak 6502 yerine 6510 yahut W65C02 kullanacağım. İki çipde de adres bus'ı tristate kullanma imkanı var. W65C02 kullanılırsa düşük güç tüketimi söz konusu ancak temin etmesi zor. (Ebay'de tanesi 5 dolara almak mümkün gerçi) 6510 söz konusu olduğunda en azından benim elimde dahi iki tane arızalı c64 board'unda bir tane de hardsid kartımda olmak üzere  üç tane mevcut. (Stok kontrolü yapmak lazım yine de 6502'ye rastlamak da söz konusu olabilir )

Düzeltme : Hardsid üzerinde 6510 yok, işlemci kullanmak yerine pc'nin sid'i sürmesini sağlayan bir kart bu. İlaveten 6510 kullanmak temin edilebilite açısından çok yanlış bir seçim olurdu.

Baktığım benzer projelerde genellikle tam uyumluluk için cpu/vic ve cia çipleri emüle edilmiş. Birincisi bu şekilde bir projeden çok tat almayacağımı düşünüyorum. İkincisi de bunların emülasyonu için yüksek hızlarda çalışan bir mikro işlemci gerekiyor ve bu şekilde çalışması da sonuçta çıkan devrenin ciddi güç tüketmesi anlamına gelecek.

Benim tercihimin dezavantajı ise sadece psid formatında olan sid'leri çalabilecek olması. Vic'i yahut cia'yı emüle etmediğim ya da direkt olarak devremde kullanmadığım için mecburen sid'in yanısıra bir de player rutini göndermek zorunda kalacağım ram'e.

Kullanacağım Pic 16f877. Üstünde 33 tane io bacağı var,

3 adedi ileride ekleyeceğim sd kart desteği için (clock / data in / data out)
16 adedi address bus için
8 adedi data bus için
6510'un reset ve interrupt hatları için iki tane (6510 clock doğrudan pic'in clockout'undan beslenecek)

Belki pic'i saniyede 50/60 kere interrupt üretmek için kullanmak yerine hariçten bir timer da kullanılabilir ama şu an bunları düşünmek için çok erken.

4 tane bacak boşa çıkıyor, bunlarla display sürmek, dışarıdan kontrol sağlamak pek mümkün olmayacak. Ancak o aşamaya getirirsem ya port'ları multiplex ederek yahut devreye spi üzerinden ikinci bir mikro işlemci koyup bununla iletişime geçerek display / kontrol vesaire kısmını halledebilirim gibi. (Edit: 4 bacak boşa çıkmıyor aslında, sram'a yazabilmek için en az iki io portuna daha ihtiyacım var, OE ve WE hatları için)

Kafamdaki ilerleme aşamaları da şu şekilde,

1 - Pic ile sram'i kullan, öncelikle program hafızasındaki belli bir pattern'deki bir datayı sram'e yazıp okuyarak doğru çalıştığından emin ol. Gerekli pic kodlarını kütüphane haline getir. Proteus üzerinde 64k ram yerine 32k / 8k gibi daha düşük kombinasyon
« Son Düzenleme: Mayıs 03, 2015, 00:05:49 ÖÖ 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
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.184


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #1 : Aralık 19, 2014, 10:58:20 ÖÖ »

Çok güzel bir proje bence. Aşamalandırman da çok güzel olmuş. Birer birer tamamlarken çok şey öğreneceğin kesin.

PIC'i bilmiyorum ama display olarak 5$ civarına bulabileceğin I2C OLED kullanırsan iki pin yeterli gelecektir, veya dediğin gibi 74HC595 gibi bir SIPO ile (gerekirse birden fazlasını cascade edebiliyorsun) üç pin kullanarak (data, clock ve latch) istediğin kadar ekstra pine sahip olabilirsin.
Logged

http://www.retrodergi.com - http://www.e-turay.com - http://www.karizmawow.com

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



Üyelik Bilgileri WWW
« Yanıtla #2 : Aralık 19, 2014, 11:09:54 ÖÖ »

Çok güzel bir proje bence. Aşamalandırman da çok güzel olmuş. Birer birer tamamlarken çok şey öğreneceğin kesin.

PIC'i bilmiyorum ama display olarak 5$ civarına bulabileceğin I2C OLED kullanırsan iki pin yeterli gelecektir, veya dediğin gibi 74HC595 gibi bir SIPO ile (gerekirse birden fazlasını cascade edebiliyorsun) üç pin kullanarak (data, clock ve latch) istediğin kadar ekstra pine sahip olabilirsin.

PIC'in hep SPI hem de I2C desteği var gördüğüm kadarıyla. Aynı bacaklar kullanılıyor, aynı bacaklara CS sinyalleri ile aynı zamanda sadece birisi bağlı olacak şekilde ayrılabilecek şekilde bağlanabilirler sanıyorum. Ancak bu durumda aynı anda sadece bir tanesi kullanılabilir.
Logged

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

twitter | blog
Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.184


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #3 : Aralık 19, 2014, 11:48:21 ÖÖ »

Aynı pinlerin kullanılması kötü olmuş, bana saçma geldi şahsen. ATmega328'de SPI ve I2C farklı pinlerde olduğundan aynı anda sorunsuz kullanılıyor.

PIC32 kullansan mesela, hem 3'er set SPI ve I2C var gördüğüm kadarıyla hem de forumda tolga abacı arkadaşımız var bu konuda hepimizden çok yardımı dokunur sana.
Logged

http://www.retrodergi.com - http://www.e-turay.com - http://www.karizmawow.com

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



Üyelik Bilgileri WWW
« Yanıtla #4 : Aralık 19, 2014, 12:37:35 ÖS »

Aynı pinlerin kullanılması kötü olmuş, bana saçma geldi şahsen. ATmega328'de SPI ve I2C farklı pinlerde olduğundan aynı anda sorunsuz kullanılıyor.

PIC32 kullansan mesela, hem 3'er set SPI ve I2C var gördüğüm kadarıyla hem de forumda tolga abacı arkadaşımız var bu konuda hepimizden çok yardımı dokunur sana.

Aslında I2C'ye şimdilik hiç girmesem daha iyi SPI'dan daha kompleks gözüktü gözüme. 8 bit mcu hali hazırda elimde varken onunla ilerlerim muhtemelen. Daha fazla örnek proje/kaynak kod bulma ihtimali var gibi. Belli de olmaz, daha yeterince araştırmadım çünkü

Display+controller işin içine girince ikinci bir pic lazım olacak gibi. Aslında o da güzel bir deneyim olur. Ancak oraya kadar daha çok zaman var
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 #5 : Aralık 21, 2014, 00:52:45 ÖÖ »

Öncelikle dedim indireyim şu SidReloc'u kullanayım, güzel sevdiğim müziklerden birini kullanayım.
Adresi şurası : http://www.linusakesson.net/software/sidreloc/

Program source formundaymış. Hani lan windows binary? Yok kendin yapıcan. Visual studio'da unix/linux vesaire c source'unu compile etmek ölümdür, ben yine de fantaziye girmeyeyim diye açtım Visual Studio'yu. Proje oluştur, ayarla, build et... 104 tane hata.. dahası da varmış, fazla olmasın diye göstermemiş sağolsun. stdint.h , err.h, getopt.h sıkıntılı.. biraz uğraşayım dedim header'larını hallettim derken kütüphane olmayan yerlerde de sıkıntı var. Eytere beah deyip baktım başka ne kullanabilirim diye. Hayır iki dakkada sanal makine altına linux kurarım ya da gider cygwin yahut mingw gibi şeylerle de compile ederim bunu da inat ettim. Eclipse'in c derleyicisi fena değil yazmış birileri bi yerde, şansımı deneyeyim dedim. Bir tek err.h için şamar attı bu, onu da bir yerlerden buldum sadece header imiş. Macro'lar falan var içinde. Derlendi meret. (İsteyen olursa windows executable var elimizde )

Başladım denemeye,

Kod:
sidreloc -p E0 Cybernoid.sid CybernoidE0.sid
Neither the source nor the destination relocation range may overlap with the zer
o-page.

Olmadı... Denediğim çoğu sid bunu dedi, derken Rob Hubbard abimize bakayım dedim o neler yapmış.
Spellbound'u denedim..

Aha,

Kod:
Spellbound, Rob Hubbard, 1986 MAD/Mastertronic, $e000-$effe, 13 subtunes
Relocating from $e000-$ffff to $e000-$ffff

Lan dedim ben relocator'ı ne demeye kullanıyorum, zaten müzik tam da kernal'ın olduğu yere yükleniyor, orada çalışıyor. Bingo dedim kendi kendime. (Ancak bkz. yazının sonları)

Şimdi psid formatına göre Sid dosyası içinde $7E'den itibaren header bitip sid içeriği başlıyor.
CCS64 emülatörü altındaki KERNAL.ROM'u yedekledim, yeni bir kopya yaptım içini 00'lar ile doldurdum. Kernal rom'u tam 8k (8192 bayt). $7E'den itibaren sid'i kopyalayıp boşalttığım kernal.rom'un başına yapıştırdım.

Dosya içinde $1C00'a yani $FC00'a init ve play'i çağıracak kod parçamızı yazacağız.

Bu arada reset vektörü haricindeki vektörleri de RTI yani return from interrupt opcode'unu çalıştıran bir adrese göndermek istiyorum. Sonuçta emülatör altında çalışıyoruz, interrupt oluşursa rastgele bir yere gitmesin. Aslında ben interrupt'ları disable edersem bir yere gidemez ama neme lazım müzik açar falan.

Sırasıyla
$FFFA - NMI seris rutini
$FFFC - Cold reset rutini
$FFFE - Irq servis rutini

Vektörlerini değiştiriyorum. $FB00 adresine gelecek şekilde RTI instruction'ı koydum, vektörleri sırasıyla şu şekilde set ediyorum.

$FFFA : 00 FB 00 FC 00 FB


Sıra geldi, init ve play'i çağıracak rutinimize. Burada parçayı doğru hızda duyabilmek için sid'in play rutinini, benim elimdeki sid için $E012 adresinde, saniyede 50 defa çağırmam lazım. Yapacağım donanım içinde raster interrupt'ları kullanamayacağım için mecburen döngülerle bunu sağlamalıyım. c64 saniyede 1 milyon cycle çalıştırıyor dersek, bunu 50'ye bölüp her iki play çağrısı arasında kaç cycle beklemem gerektiğini bulabilirim.

1.000.000 / 50 = 20.000 cycle. Harcamak için epey bir cycle. Çok fazla doğru sonuç elde etmeye çalışmayacağım çünkü 20000 rakamı da doğru bir rakam değil zaten, biraz hızlı biraz yavaş olması çok da fark etmez benim için şu aşamada. Gerçek donanım üzerinde zaten doğru hızda çalışacak. (Zamanlamayı pic ile sağlayacağız)

Bu kadar çok cycle harcayabilmek için en az iki döngü kurmak lazım, ya da tek döngü içinde masraflı bir iş yapmak lazım.
Heyecan olsun masraflı bir iş yapalım diyorum. INC Absolute, DEC Absolute işlemleri 6 cycle yiyormuş. $FB02 adresini 7 defa arttırıp 7 defa azaltarak tek döngü içinde 7 * 12 = 84 cycle yerim. Bir adet register azaltma işlemi yapmam lazım örn. DEY, iki cycle o, bir tane karşılaştırma yapmam lazım BNE o da 3 cycle. (Yaptığımız dallanma aynı sayfa içine olacağı için, başka sayfaya olaydı 2 eklemek gerekecekti) Yani toplamda 84 + 2 + 3 = 89 cycle harcayacağız tek döngüde. 20000 / 89 = 224 defa dönersek aşağı yukarı 20000 cycle'ı yiyoruz.


Kodu yazdık, Assemble to memory deyip, kodun assemble edilmiş halini sid dosyası içinde başlangıç adresimiz olan $FC00 adresine kopyalayalım. Herhangi bir relokasyona gerek yok zira bu sid dosyasını emülatörün kernal.rom'u ile değiştireceğimiz için zaten E000'dan itibaren yüklenecek. Assemble ettiğimiz kod tam da başlangıcını verdiğimiz yerden başlayacak. Gerçi kodu hangi sayfaya yerleştirirsek yerleştirelim çalışır zira içinde iki adet sabit adres (init ve play adresleri) ve iki adet relatif adres geçiyor (loop'ların relatif adresleri) Kod tek sayfaya (256 byte) sığdığı için bu sayfa dışına dallanma imkanı yok, dolayısıyla hangi sayfaya yerleştirirsek yerleştirelim çalışır. Neyse bizim durumumuzda böyle bir şey söz konusu değil zaten.

Bir şeyleri eksik yaptığıma dair bir his var içimde, gelelim denemeye. Bakalım çalışacak mı.

Aha, harbiden de çalışmadı. Bir sıkıntı var.

Anlaşılan o ki biz kernal'i rom diye verip peşine ram gibi kullanmaya kalktık... Bizim kodumuz pek ram gibi kullanmasa da Rob Hubbard'ın müziği E000'dan başlamak üzere oranın ram olduğu varsayımıyla çalışıyor. Epey bir uğraştım 6510'un 01 adresindeki processor port register'ı ile ancak Hubbard'ın sid'ini çalıştırmayı başaramadım. Alakasız yerlere erişip yazdığım kodu da eziyor olabilir ya da ben denemelerim esnasında bir şeyi gözden kaçırdım.

Neyse Kernal Kernal diyerek gittim yattım,

Ertesi gün, bir hikmeti vardır bu kernal'in diye biraz daha inceledim. Temelde yaptığı şuymuş : Interrupt'ları disable et, stack pointer'ını ilk değerine getir, falan filan. Aynı kodu ben de koydum başa, yok yine başarılı olmadı.

Sonradan aklıma geldi, lan ben niye ille de kernal altından su yürütmeye çalışıyorum dedim. Bulsana bir tane $1000 adresli sid, reset vectörünü yiyince kopyala kendini müzik sonrasındaki bir adrese oradan çalışmaya devam et. $01 adresindeki processor port'u ile de iştigal etmeye gerek yok.

Açtım hvsc arşivini, girdim MUSICIANS klasörüne kafada Z harfi var, Zyron babadan bir şeyler bakayım bari dedim. Şansa çoğu da $1000'e yüklenen sid'lerden. Baktım beğendiğim bir tanesini seçtim. Kodu açılışta kendini $1000'den itibaren kopyalayacak şekle çevirdim, bunun init adresi $1000, play adresi $1003.

Evet ilk deneme CCS65'ü modifiye kernal ile açıyorum... başarısız... Tune indeksi yanlış gönderiyor olabilir miyim acaba? #$01'i #$00 yaptım. Tekrar denedim... Voila! Çalıştı! Azıcık olması gerekenden biraz yavaş. Demekki saniyenin 50'de birinde öyle hunharca harcayacağımız 20000 küsür cycle'ımız yokmuş. Kesin VIC girmiştir araya, neyse bizim donanımımızda VIC olmayacak, SID ile başbaşa kalacağız.

Kod şu bu arada

Kod:
*=$FC00
LDX #$FF ; Default stack pointer'ı
SEI ; Interrupt'ları disable et. Açmıycaz bir daha
TXS ; X register'ını stack pointer'ına gönder
CLD ; Decimal modu kapat

LDA #$37 ; Processor port için default değer, c64 default açılışı gibi
STA $01&nbsp; ; Processor port'a yaz.

LDA #$00 ; Belleği $E000'dan $1000'a
STA $FC ; transfer etmek için hazırlık
LDA #$E0 ; $FB/$FC = Kaynak
STA $FD&nbsp; ; $E000 adresini yazıyoruz bu iki ZP belleğe

LDA #$00 ; Belleği $E000'dan $1000'a
STA $FA ; transfer etmek için hazırlık
LDA #$10 ; $FA/$FB = Hedef
STA $FB ; $1000 adresini yazıyoruz bu iki ZP belleğe

LDX #$00 ; $20 sayfa kopyalayacağız. X'i sıfırlıyoruz.
TO:
LDY #$00 ; Her bir sayfa transferi için Y'yi kullanıyoruz.
; El mecbur, indexed indirect kullanacağız çünkü
TX:
LDA ($FC), Y ; $E000 + (X * $100) + Y'den A'e oku
STA ($FA), Y ; $1000 + (X * $100) + Y'ye yaz
INY ; Aynı sayfadaki bir sonraki adrese
BNE TX; Sayfa dolmadıysa devam
INC $FD ; Bir sayfa doldu, diğer sayfaya
INC $FB ; Bir sayfa doldu, diğer sayfaya
INX ; Sayfa sayısını takip ediyorduk, arttıralım.
CPX #$20 ; $20 sayfa oldu mu?
BNE TO; Olmadıysa yeni bir sayfa daha.

JMP $2C30; Kod $FC00'a derlensin diye ayarladık ama bu ne alaka?
THIS: ; Kodu kopyaladıktan sonra kernal rom'u altında execute etmekten
; kurtulup daha güvenli bir yerde çalışmaya devam etmek lazım.
; o bakımdan. Macro falan da yazılabilirdi, uğraşmak istemedim.
; Kod bir alt satıra dallanıyor burada ama başka bir bellek bölgesinde.
PLAY:
LDA #$00; Müzik init
JSR $1000 ;
OUTERLOOP:
JSR $1003 ; Play rutinini çağır
LDY #$E0 ; 224 defa dönelim demiştik, bu o.
LOOP:
INC $FB02 ; İşlemci ziyan etme kısmı.
INC $FB02
INC $FB02
INC $FB02
INC $FB02
INC $FB02
INC $FB02
DEC $FB02
DEC $FB02
DEC $FB02
DEC $FB02
DEC $FB02
DEC $FB02
DEC $FB02
DEY
BNE LOOP
JMP $2C35 ; Kod burada PLAY'e dallanıyor. RAM'a kopyalanmış yere.

2. ve 3. maddeler tamam... Ancak kernal ile ilgili sağlam dersler aldım. Bir kere sid psid bile olsa kernal ile ya da basic rom'u ile iştigal ediyorsa sıçtık. Hele burayı hem rom gibi hem de ram gibi kullanmaya kalkıyorsa katmerli sıçtık. Neyse bunları çok sonra düşünmek zorunda kalacağım inşallah.

Resim falan da koyacaktım ama işler yolunda gitmedi, kod 3-4 defa yazıldı falan, artık bir sonraki sefere.

Mesajın ekinde oluşturduğum kernal rom mevcut, emülatörünüzde deneyebilirsiniz.

* KernalWithZyronAccessTime.zip (2.47 KB - Yükleme: 230 kez.)
* SidKernal.txt (1.95 KB - Yükleme: 561 kez.)
« Son Düzenleme: Aralık 21, 2014, 00:54:37 ÖÖ 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
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #6 : Aralık 25, 2014, 23:20:35 ÖS »

Dün ve önceki gün devre için gerekli bazı siparişler verdim.

1KOHM 1/4W * 50
820OHM 1/4W * 50
33K 1/4W * 50
74HC04 * 3 - 8'li NOT kapısı, Address decoding için
74HC11 * 4 - Triple AND gate, Address decoding için
74HC74 * 2 - 4Mhz kristal'den 2Mhz saat sinyali üretebilmek için flip flop. (Muhtemelen gerek kalmayacak buna bkz. aşağısı)
2.2NF 63V POLYSTER * 10 - Sid filtresi için
UT62256 Ram Entegre Geniş * 2 - Elimdeki sram smd olduğu için daha kolay uğraşırım diye bunlardan alıyorum.

Bunları direnc.net'ten sipariş ettim. Bunların yanı sıra en önemli eksiğim eprom ve bir eprom programlama aletiydi. Onları da aliexpress'ten sipariş ettim.

V6.0 MiniPro TL866CS : http://www.aliexpress.com/snapshot/6417199803.html
ST M27C512 Eprom : http://www.aliexpress.com/snapshot/6420314724.html

Eprom silici olarak epey eskiden aldığım diş fırçası temizleyici var onunla şansımı deneyeceğim.

Bu siparişleri yurtdışından yapmak canlı denemeleri yapma aşamasını rahat 1 ay ötelemiş oldu.

4 no'lu maddemi uygularken 6510'a saat sinyali üretmem gerekiyordu. Öncelikle daha önce linkini verdiğim şu sayfadan örnek devreleri inceledim.
http://wilsonminesco.com/6502primer/ClkGen.html

Piyasada 1Mhz kristal olmadığı için ve 6510 işlemci 2Mhz hızında çalışabildiği için c64'deki PAL için olan 0.985MHz yerine aşağıdaki iki devre ile 2Mhz kullanmaya karar vermiştim. Bulabildiğim en düşük kristal 4Mhz.

Osilatör devresi


Flip flop yardımıyla osilatör frekansını yarıya indiren devre.


Dün araştırmalarıma devam ederken hazır osilatör elemanlarının satıldığını gördüm, önce 4 bacaklı diye bunları es geçiyordum. Biraz araştırınca bütün bu devre yumaklarına girmeden işimi kolayca halledebileceğimi gördüm. Hem de 1Mhz hızında osilatör bulmak da mümkün.

http://www.ersinelektronik.com/1-Mhz-Kristal-Osilator-100000-Mhz,PR-4641.html



Address decoding kısmı zaten And ve Not kapıları ile hallolacak, bunlardan yeterince sipariş verdim. $D4XX ve kernal rom'unun $E000-$FFFF aralığını decode etmem gerekecek.

Sid çipi için adreslemede A0-A4 bacakları kullanılacak.
Geri kalan bacaklardan address decoding şu şekilde.

$D4 = 1101 0100 -> A15 A14 A13 A12   A11 A10 A9 A8

SID CS = (A15 AND A14 AND A12 AND A10) AND (NOT A13 AND NOT A11 AND NOT A9 AND NOT A8)

Kernal rom'u 8kb yani toplam address bus'ın 8'de birini kapladığı için en üst üç bacak hariç A0-A12 aralığı eprom'a bağlanacak.

$E0/FF = 1110 / 1111  yani en üst 3 adres bacağının 1 olması yeterli.

KERNAL CS = (A15 AND A14 AND A13)


Uygulayacağım referans implementasyon şu



Bu arada ilk testimi yaparken bir sid kullanmayı düşünmüştüm ama sonradan aklıma daha cin bir fikir geldi. Mevcut testim için devreye SRAM'ı da entegre etmem gerekiyor çünkü çalacağım sid illaki ram kullanıyor. Ancak hiç ram kullanmayan basit bir test müzik rutini yazıp 6510 + 6581 + EPROM kombinasyonu ile de devreyi test etmek mümkün.

6510'un register'ları ve sid'e hali hazırda erişebiliyor olması bunun için yeterli. Yapacağım ilk devrede interrupt'lar çalışmıyor olacak ve dolayısıyla 0x100 adresinden başlayan ram'deki stack kullanımına ihtiyaç olmayacak. Yazacağım rutin içinde RTS / PHA / PLA / PHP gibi stack'e dolayısıyla RAM'e erişen komutlar olmayacak, diğer komutlarda da sid'in belleğe map'lendiği bölge dışı adreslenmeyecek.

Şimdilik gelişmeler bunlar, direnç.net'ten siparişim gelirse en azından breadboard üzerine 6510 ve 6581'i monte etmeye başlayabileceğim.
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 #7 : Aralık 30, 2014, 02:45:48 ÖÖ »

Projede ufak bir tasarım değişikliğine gittim. 16 bit address bus ile pic'in io port'larını harcamak yerine pic'in erişiminin rastgele olmaması sebebiyle bir optimizasyon yapacağım. Adres bacaklarını pic'e bağlamak yerine toplamda 16 bit bir counter'a bağlayacağım. Böylece pic sadece counter'ın clk hattına sayması için sinyal gönderecek. Counter'lar kenar tetiklemeli çalışıyorlar. Böylece counter'ı arttırana kadar adres bacaklarında benim istediğim adres yer almış olacak.

Burada beni kurtaran pic'den sram'a olan erişiminin muhteviyatının data transferi şeklinde olması oldu.
Kabaca pic'in yapacağı şu,

1. Counter'ı resetle
2. 1 byte yaz (Adres bacakları 0)
3. Counter'ı clock'la (Adres bacaklarının decimal değeri 1 artacak)
4. 65535'e ulaştıysak bitir yoksa 2'den devam et.

Pek tabii öncelikle denememi 4k yahut düşük bir veri ile yapacağım. Bunun için 12 bit bir counter yeterli. Counter'lara baktığımda çıktıları three state olan bir entegre bulamadığım için ve address bus'a başka entegreler de erişeceği için araya bir de three state buffer entegresi/entegreleri yerleştirmem gerekecek.

Bu arada counter ile SRAM'a yazma testini MPLAB ve Proteus üzerinde gerçekleştirdim, çalıştı. Vakit olaydı daha detaylı görsel bir şeyler de paylaşırdım. Daha sonra inşallah,

Böylece Pic'in 16 bacağını kurtarmış olduk, ikinci bir pic vesaire karmaşasına da gerek kalmadı. Gerçi daha önce benzer projeyi yapan eleman gibi 6510'a üç kağıt çevirerek de adres bacaklarından kurtulabilinirdi ancak ben baştan 6510'u pic üzerinden değil, haricen clock'lamayı tercih ettim.

Bu arada daha önce resmini paylaştığım osilatör elemanını yazıcıoğlunda hiç bir yerde bulamadım. Satıcıların çoğu kristal ile karıştırdı, kimisi de ufo görmüş masum köylü gibi baktı Mecbur ersin elektronikten sipariş edicem sanırım.

Şimdilik durum bu merkezde, sanırım depoya inip hurda c64'lerin 6510'larını sökme vakti geldi, eprom programmer gelmeden yakında duyulabilir bir şeyler elde etmek mümkün olabilir.
Logged

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

twitter | blog
GnoStiC
Ziyaretçi
« Yanıtla #8 : Aralık 30, 2014, 17:07:08 ÖS »

tasinabilir bir urun olarak yapip satmayi dusunursen ben bir tane talibim

zamaninda SIDcog'u yanimda tasiyip dinlerdim, onun sesine bile raziydim.
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #9 : Aralık 31, 2014, 00:24:33 ÖÖ »

tasinabilir bir urun olarak yapip satmayi dusunursen ben bir tane talibim

zamaninda SIDcog'u yanimda tasiyip dinlerdim, onun sesine bile raziydim.

Üretim konusunda çok başarılı olabileceğimi sanmıyorum ama bakalım zaman neyi gösterir. Muhtemelen taşınabilir olur parçalar bread board'dan çıkıp da bir pcb üstünde bir araya gelirse.
Logged

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

twitter | blog
LW3D
Yönetici
*****
Mesaj Sayısı: 11.232


Günü Kurtaran Avam Hiooargggh :)


Üyelik Bilgileri WWW
« Yanıtla #10 : Aralık 31, 2014, 13:27:17 ÖS »

Oldukça teknik olduğu için şimdiye kadar bir yorum yazmadım. yazamadım forumda benim durumumda çok arkadaş vardır. İlgiyle takip ediyoruz...
Logged

Simon (Özay Turay)
Yönetici
*****
Mesaj Sayısı: 7.184


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #11 : Aralık 31, 2014, 13:46:33 ÖS »

İtiraf edeyim çoğunu ben de anlamadım ama gaz kesilmesin diye elimden geldiğince birşeyler yazıyorum. Gaz önemli, esirgemeyin. Kahkaha
Logged

http://www.retrodergi.com - http://www.e-turay.com - http://www.karizmawow.com

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


Üyelik Bilgileri
« Yanıtla #12 : Aralık 31, 2014, 16:10:44 ÖS »

kolay gelsin arkadaşa sanırım çok ama çok zor ve çok çok zaman gereken bir proje
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #13 : Aralık 31, 2014, 17:13:49 ÖS »

Gazı eksik etmeyin, gaz önemli

Bugün depodaki üç adet arızalı c64 board'undan birinden 6510 çıkarmaya çalıştım. board diğerlerine nazaran daha kötü durumdaydı, pek çok parçası hali hazırda çıkarılmıştı.

Neyse efendim operasyon başarısızlıkla sonuçlandı IC'nin bir kaç bacağı koptu. İçlerinden bir tanesinde kablo lehimlemeye bile yer kalmadı ki o da çok lazım olan bir bacak D5. Bugün bir adet 6510 öldürdüm, evet
Logged

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

twitter | blog
Extremist
Üye
**
Mesaj Sayısı: 16


Üyelik Bilgileri
« Yanıtla #14 : Aralık 31, 2014, 18:58:42 ÖS »

abi kolay gelsin. 6510 un öldüğü kötü olmuş. Benim de bir midibox sid projem vardı. Elektronik bilen birilerini ikna edip yapmam gerekiyor. İlgilenen bir iki arkadaş var şimdilik bir türlü başlayamadık. Psid player da süper proje takipdeyim.
Logged
Sayfa: [1] 2 3 ... 14   Yukarı git
Yazdır
Gitmek istediğiniz yer: