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



Üyelik Bilgileri WWW
« Yanıtla #75 : Şubat 20, 2015, 00:36:43 ÖÖ »

Bindik bir alamete sonumuz hayırlı olsun bakalım. Test etmeden önce tüm bağlantıları yapılmış (unuttuklarım hariç tabii ) devrenin son hali.




Sol üstte
- HIN232 içeren seri komünikasyon için voltaj düzenleyici devre

Hemen yanında üstte
- Sid + 64K Ram (daha önce uygunsuz pozisyonda resimlerini yayınlamıştım )

Onun altında
- Osilatör + Adres / Data bus'ı dağıtan bacaklar + 6502

Ortada solda
- Adres decoder (74LS14 + 2*74S20), Ekstra bir tane daha 74LS14 var, normalde 0 ile çıkış aldığımız chip select sinyallerini led'ler ile gösterebilmek için invert ediyor.

Onun sağında
- Bir önceki devrede eprom'u zif soketle yerleştirdiğim board. Şu an alttaki board'a Adres + Data bus sinyallerini sağlıyor. Buradaki zif soketin üstünden zif soket ve precision soket ile bağlantı almayı denedim. Zif soket bütün kabloları sıkıştıramadı, precision soket için ise kabloların uçları kalın geldi. Mecbur 24 bacağı tek tek kabloyla bağladım.

İşler yolunda gitmez sid'i test etmek istersem biraz uğraştıracak. Precision sokete lehim yapıp onu oraya yerleştirmek daha iyi bir çözüm. Ondan daha iyisi 6502'den çıkan adres + data bus'ı daha geniş bir alana almak. Bugün farkettim, elimdeki board'ların besleme kısımları sökülebiliyormuş. Bu şekilde iki board birleştirilip 6502  için güzel bir hareket alanı açılabilir. 6502 bas bas bağırıyor buranın müdürü benim, açın benim önümü diye

En altta
- Pic + 12 bit ve 4 bit counter + tristate bus

İlk testleri 8580'i söküp yapacağım. Elimde başka 6502 olduğu için o kalacak devrede. Pic'i programlama ve test zamanı!


* 20150220_002003.jpg (92.03 KB, 800x450 - Görüntüleme: 3424 kez.)
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 #76 : Şubat 20, 2015, 02:15:28 ÖÖ »

Devreyi çalıştırdım. Kısa günün karı, en azından seri haberleşme kısmı düzgün çalıştı, pic'den çıktı alabildim, pic'e komut gönderebildim.

Ancak aldığım güç kaynağı malesef tırt çıktı, belki benim devrede sorun var bilemiyorum ancak sabit 5V'u sağlayamadı devreye. Ayar düğmeleri ile oynamak gerekiyor, ayarlansa bile devrenin çalışması esnasında gerilim düşüyor. Başta pic'in BOREN flag'i (düşük gerilime karşı koruma) açıktı, sürekli restart olup durdu Pic. Bunu kapatınca haliyle seri komünikasyon ram erişimi sırasında hepten saçmaladı.

Bunun yanısıra tasarımımda ciddi bir hata tespit ettim. Address decoder'ı yanlış tasarlamışım, pic'in ram'e erişeceğini tam olarak hesaba katmamışım. Şöyle ki Ram high ve Ram low seçiminde cpu'dan gelen Phi2'yi kullanıyorum. Halbuki 6502'yi devreden çıkardığımızda Phi2'nin önemi kalmıyor. Decoding kısmı bu durumu da dikkate almalı.

Yine aynı şekilde ben ram'a erişirken /CS ve /OE'yi ayrı ayrı kontrol ediyordum önceki testlerimde. Halbuki 6502'nin dahil olduğu devrede bunlar birbirine bağlı. Pic'te yazılım olarak ve pin olarak bir tane fazla yer işgal etmişim.

Yine address decoding ile ilgili bir sıkıntı da pic'ten yapacağım ram erişiminde sid yani i/o bölgesini de, şu an için ($D000-$DFFF), ram olarak görüp okuyup yazabilmeliyim. İleride sid'i doğrudan pic ile kontrol edebilmek için buradaki logic geliştirilebilir.

Bir de soru işareti var. 6502'nin RDY bacağını ve RESET bacağını 0'a çekip etkisiz hale getirdiğimi düşünüyorum. R-/W bacağının bu durumda ne olduğu ise belirsiz. Bir adet daha tristate buffer kullanıp cpu'nun devreye yaptığı kritik bağlantıları da pic tarafından kontrol edilebilir yapmak gerekebilir.

Yatmadan önce son bir test yapacağım, cpu'yu devreden çıkarıp PHI2 yerine pic'ten çıkan Ram'ı select etmek için kullandığım /CS sinyalinin invert edilmiş halini bağlayacağım. Devreden 6502 çıktığı için belki power supply'ın da başı biraz az ağrır.
En azından ram testlerimi yaparım.


« Son Düzenleme: Şubat 20, 2015, 02:17:16 ÖÖ 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 #77 : Şubat 20, 2015, 03:25:53 ÖÖ »

Testler sırasında devre beslemesinde düşük gerilim, yüksek akım söz konusu oldu. Dedim kesin bir şeyler yandı. Çünkü farkettim ki inverter niyetiyle nand kapılarından birinin girişlerinden birine pic'in çıkışını diğer girişinden de çıkış alıp diğer logic entegreye göndermişim. Arada voltajı kontrol edeyim derken muhtemelen yüksek akım geçti.

TL866CS'nin lojik entegre test özelliğini kullandım. Address decoder'daki 4 adet lojik entegreyi test ettim. 2 nand entegresinin (74S20) kullandığım kısımları bozulmuş. Projede 6510'dan sonra ikinci kayıp da nand chipleri oldu. 6502 ve 8580'i kurtardık en azından

Demek ki neymiş, ayarlı power supply yanlış kullanıldığında entegreler açısından ölümcülmüş. Power supply'ın baştaki stabil 5v sağlayamama kusurunu gidermiyor bu.

Neyse efendim test sonucu fail bu arada. Yanlış giden adres hatlarını tespit etmek için farklı bir test rutini yazmam lazım. Yahut logic analyzer'ı işin içine sokmam lazım. Şu an en azından 6502 hariç devreye power supply düzgün gerilim sağlayabiliyor.

Bir daha bunları yaşamamak için Power supply'ın devreye girdiği noktaya bir diyot falan bağlamak lazım herhalde.
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 #78 : Şubat 21, 2015, 17:53:38 ÖS »

Dünün ve bugünün bombası kullandığım 74XX390 counter chip'inin dual 4 bit decade counter yani 9'a kadar sayan değişik bir counter olduğunu farketmem oldu. 4'er pin çıkışı olmasına rağmen 10, 11, 12, 13, 14, 15 çıkışlarını vermiyormuş bu çip. Mecbur yerine 12 bit bir counter bağladım.

Sorunlardan dolayı sorunları elimine etme adına devreyi basite indirgedim. Memory testlerini yapabilmek için Adres decoder'ı devreden çıkartıp doğrudan pic'ten sram'e bağlantı yaptım.

390'dan yediğim golden sonra bir golü de son yaptığım 8 sid içeren eprom denemesinden yedim. A15, A14 ve A13'ü adres bus'tan çıkarıp 0 ile 7 arasında bir değer üretsin diye toprağa yahut beslemeye bağlamışım bunları. Tekrar yerlerine kondu.

Sonrası 8mhz'de çalışan pic ile timing ayarları ve programdaki bug'ların fix'i şeklinde oldu.

Sayısız denemeden sonra nihayet hatasız bir sonuca ulaştım Daha yapacak bir sürü iş var.



* MemoryTest.png (28.86 KB, 784x557 - Görüntüleme: 3344 kez.)
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.756


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #79 : Şubat 24, 2015, 11:58:18 ÖÖ »

Güzel gidiyor. Elemanın biri de Raspberry Pi ile sürmüş SID çipini.

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
EMREZ
Deneyimli
*****
Mesaj Sayısı: 1.940



Üyelik Bilgileri
« Yanıtla #80 : Şubat 24, 2015, 12:43:24 ÖS »

elektronik bir şeylerleri geliştirmek insanın kendisinin bir şeyleri yapması çok keyif verici, tebrik ederim, decre pcb ile daha güzel görünür ve sorunları çözmen kolay olur, şuan bir yerde temassızlık olsa sıkıntı yaşarsın. ütü vs yöntem ile en azında protatip bir devre yapmak faydalı olurdu.
Logged

this is amiga speaking.
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #81 : Şubat 24, 2015, 16:54:04 ÖS »

Halen devrede bug'lar olduğu için pcb'ye geçemiyorum. Değişik parçalar break out board şeklinde yapılabilir aslında. Ev ortamında pcb eritmek istemiyorum o yüzden şimdiye kadar erteledim. (Sid kısmı ayrı board, 6502 kısmı ayrı board)

Bugün kısmet olursa bir adet Pickit2 yahut Pickit3 alıcam. Çünkü sorunsuz olan bellek okuma yazma kısmını adres decoder'ı devreye yerleştirdikten sonra nasıl becerdiysem bozdum. Adres decoder'ı çıkarttıktan sonra CE/ OE/ doğrudan pic'ten bağlandığında da daha önceki sıfır hatalı case'imi yaratamadım.

Devrede CS/ OE/'yi 6502'nin yaptığı gibi tek sinyal ile kullanmayı düşünüyordum ama araya bir buffer 6502 ram'i kontrol etsin, Pic ram'i kontrol etsin şeklinde switch etmek zorunda kalacağım sanırım. Tabii daha önce hatasız çalıştırmayı başardığım haline getirmem lazım.

Artık Çinden bekleyemeyeceğim için 50-60 tl zarar ile buradan alacağım Pickit'i.

@Ozay : Sid'i doğrudan Pic'ten sürmek mümkün, 5 adres bacağı, 8 data bacağı var. Geri kalanı emüle etmek gerekiyor. (6526 ve 6502/6510) Raspberry pi gayet yeterli bu iş için. Pic 32'lerle de yapılabilir ya da üst model AVR'lerle.

ps: Bu arada sorunu buldum, adres hatlarında temassızlık problemi varmış. Başarılı okuma sayısı sürekli farklı çıktığı için bu ihtimal aklıma gelmemişti. Kablo tam yerinde değilmiş, bazen temas edip bazen etmiyormuş. Dün devrenin üstüne bir şeyler koyunca şansıma bağlantısı tamamen çıkmış ki uart'tan hatalı adresleri capture ettiğimde pattern'i yakalayıp hangi hat olduğunu bulabildim. En sakatı böyle tam temas etmediği zamanlar. Pickit2'nin acil debug olayına şimdilik ihtiyacım kalmadı gibi. Mecbur bir adet daha tristate buffer daha ekleyeceğim.
« Son Düzenleme: Şubat 24, 2015, 21:55:12 Ö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
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #82 : Şubat 25, 2015, 01:20:10 ÖÖ »

Ortalık epey karışmış
Nihayet address decoder da dahil ram'i de 64k'ya çıkarıp adreslemeyi başardım

Her bir 32k ram chip'inin CS ve OE'leri birbirine bağlı (6502'nin kullanacağı gibi) ve address decoder tarafından sürülüyorlar. Ayrı bir tristate buffer kullanmaya gerek kalmadı gibi. Sadece WE bacağını (Her şeye bağlı aslında bu, sid, 6502 ve ram'ler) pic üzerinden sürüyorum. Bunu da ram'i doldurduktan sonra output değil input'a çevireceğim. Sid ve 6502 aynı anda reset konumunda duracağı için sorun olmaz diye umuyorum.

Şu aşamada aslında sid'i bağlamadan ve logic analyzer da kullanmadan bir işlemci testi yapabilirim. 6502 için ufak bir test programı yazıp sallıyorum tüm belleği (ilk iki sayfa(stack) ve son sayfa(vektörler) hariç, ) belli değerlerle doldurup daha sonra 6502'yi bekletip pic tarafında belleği okuyup değerler doğru mu diye kontrol edebilirim.

Bunu yapayım ben en iyisi.

@Özay : Bu arada raspberry ile yapan eleman siddump almış onu basıyor sid'e. 6502 emülasyonu yok yani. Siddump ciddi data üretiyor, bunu compress etmek ve hızlı bir şekilde açabiliyor olmak lazım. Benim kullandığım pic'ler böyle bir iş için yeterli değil. Bu dump'lar yüksek kapasiteli bir sd card'a koyulup oradan çalınabilir ancak pratik değil. Sağlam işlemci gücü olan bir cihaz kullanılıyorsa 6502'yi emüle etmek lazım. Bu devreyi pcb halinde sağ salim bitirebilirsem zaten 6502 ve 6526 cia çipini de emüle eden bir çözüme doğru koşmayı düşünüyorum. Bu çiplerin sid ile olan interface'leri  neredeyse tamamen dijital olduğu için sid'in otantik havasını bozmazlar.
« Son Düzenleme: Şubat 25, 2015, 01:32:33 ÖÖ 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 #83 : Şubat 27, 2015, 02:03:29 ÖÖ »

Büyük bir tasarım hatası yapmışım. Aslında başta özellikle dikkat etmiştim, ya 6510 kullanırım ya da 65c02 demiştim sonra nerede gördüysem artık UM6502'lerin de adres bus'ı tristate edebildiğini yanlış bir şekilde okumuştum. Çünkü sonradan datasheet'i inceleyince böyle olmadığını gördüm. Ancak kafamda uzak bir köşeye atmış olacağım bu bilgiyi ki iş gerçek teste gelince meseleye uyandım. Elimdeki UM6502 address bus'ı tristate edemiyor.

6502 işlemci doğuşundan beri böyle aslında, sonradan 6510 c64 için yapılırken address bus'ı tristate edebilme özelliği ve c64'te PLA'ya bağlanan özel bir i/o port'u eklenmiş. 6502'nin tasarımcılarından biri olan Bill Mencsh Western Design Center firmasının başında hala 6502'nin onunla uyumlu ve gelişmiş bir versiyonu olan 65c02'yi üretmeye devam ediyor. Daha çok IP core (Intellectual property core) olarak kullanılsa da çip olarak üretimi ve satışı da mevcut.

Bu arada bilmeyenler için Tristate'in ne demek olduğunu biraz açayım. Bilgisayar mimarilerinde belli devre elemanları arasındaki bağlantılar ortak kullanılan elemanlar söz konusu olduğunda ortak kullanılmak durumunda kalıyorlar. En çok rastlanılan örneği ise tahmin edilebileceği gibi bellek.

İşlemci belleğin adres hatlarını kontrol ediyor yani sürüyor. 6502 örneğinde TTL seviyesinde düşük yahut yüksek seviyede gerilim uyguluyor yani. Şimdi işlemci bunu yaparken devredeki başka bir elemanın, dur kardeşim belleği hep sen mi kullanacaksın, biraz da biz faydalanalım şu kaynaktan deyip o hata bağlandığında işler karışıyor.  Hatların lojik durumu belirsiz bir hale geliyor.

Tam bu noktada işte devre elemanlarının bağlantılarını Tristate edebilme özelliği işe yarıyor. Bir elemanın bağlantısını tristate etmesi demek o bağlantının ulaştığı devre elemanı ile arasındaki hattı açık hale getirmesi demek. Yani hattın ortasından bir switch ile bağlantı kesilmiş gibi oluyor.

C64'te örneğin belleğe ulaşmak isteyen iki temel eleman var. Bunlar işlemci 6510 ve görüntü işlemcisi olan VIC-II çipi. Bugün bile paylaşımlı ekran kartı dediğimiz olayda işlemci ile ekran kartı belleği paylaşıyorlar yani sıra ile erişiyorlar. 6510 ve VIC-II örneğinde bu çipler üzerinde belleğe erişimi senkronize eden pin'ler mevcut. 6510 üzerinde RDY ve AEC, VIC-II üzerinde de BA (Bus access) ve AEC pin'leri. Bu pinler vasıtası ile birbirlerine sıra vererek kardeş kardeşi belleğe erişiyorlar. Biri belleğe erişirken diğeri adres bağlantılarını koparıyor yani tristate ediyor.

Gelelim benim soruna. Benim devremde de Pic (counter'lar ile adresleyerek ) belleğe erişiyor, aynı şekilde 6502 de belleğe erişiyor. Ben her ne kadar 6502 kafasına göre takılsın diye counter'ların çıkışını tristate etsem de, Pic bellekle takılmaya çalıştığında 6502 ona posta koyuyor.

Çözüm? 6502'nin belleğe erişimini de 74s244 tristate buffer'lar ile açık/kapalı hale getirilebilecek şekilde PIC'in kontrol etmesini sağlamak.

Aslında iş bu noktaya geldiğinde ilk mesajımda verdiğim örnek projeye göre tasarım epey kötü bir noktaya geldi.

Diğer projede eleman 6502 ile sadece databus üzerinden bağlantı kurup pic bellekmişçesine 6502'yi kandırmış. Adres bus'a hiç dokunmamış.  Ama onun da handikapı şu, 6502'ye saat sinyalini her zaman kendisi vermek durumunda kalıyor. Sid'i transfer etmek için belleği doldurma aşamasında 6502'yi yavaşlatması ve kontrol etmesi gerekiyor. Harici bir clock sinyali kullansa bunu yapması mümkün değil. 6502 resetlendikten hemen sonra hot reset vektörünü data bus'a yükleyip ardından 6502'nin erişeceği her adresi bildiği için sırayla data bus üzerinden 6502'ye erişmek istediği datayı veriyor. Ta ki belleğe sid'i ve player'ını transfer edene dek.

Tristate buffer'ı o bellek işe karışmasın diye başlangıçtaki bu transfer esnasında kullanıyor. Yani bellek ile 6502 arasındaki databus'ın bağlantısını kesip pic'in data bus'ı güvenle sürmesini sağlıyor.

Bir ince nokta daha. Sizce 8Mhz pic mi harici belleğe daha hızlı erişiyor yoksa 1 Mhz 6502 mi? Cevap : 1Mhz'lik 6502 daha hızlı erişiyor. Pic'in bir komutunun çalışma süresi 4 cycle. 6502'nin belleğe erişen komutlarının çalışma süresi de 5-6 cycle. Ancak 6502 tasarımı itibariyle sürekli belleğe erişirken pic ile o tasarımın karşılığı olarak program yazmanız gerekiyor. Pic üzerinde 24 i/o pin'ini bellek erişimine ayırmış olsanız ve ekstradan da kontrol sinyalleri için i/o pin'leri ayırmış olsanız belleğe erişmek için bunların set edilmesi, data bus olarak ayırdığınız pin'lerin okunması falan derken sadece tek bir adresin okunması için rahat 8-10 komut vermeniz lazım.  6502 ise bu işi 1-2 cycle'da hallediyor.

8 komut * 4 pic cycle = 64 pic cycle = 8 6502 cycle

Neyse, ileride tasarım değişikliğine gitmem gerekiyor ancak şimdilik mecbur 6502'nin adres hatlarını tristate etme yoluna gideceğim. Tristate edilmeyi bekleyen bir hat daha var:  6502'nin R-/W çıkışı. Uyuz olduğum nokta burası. Tek bir hat için 8 tristate buffer'ı olan ekstra bir 74S244 daha kullanacağım.

Bu arada 6502'nin çok az kullanılan enteresan bir giriş hattı var. S.O. (Set Overflow) pini. Buraya logic 1 verdiğinizde işlemcinin statü register'ı üzerindeki overflow bit'i 1 oluyor. Bu özellik 1541 sürücülerinde 3 cycle'lık  bir döngü içinde dışarıdan gelecek bir haberi beklemek için kullanılmış. 6502 ile en sıkı döngü bu pin vasıtası ile yaratılabiliyor.

Şu şekilde,
Kod:
 CLV
LOOP:
 BVC LOOP

Dışarıdan S.O. pin'i set edilip 3 cycle'lık bu loop'tan çıkılabiliyor. Bu şekilde çok hızlı cevap verilmesi gereken bir dış habere hemen cevap verilebiliyor.

Amacı dışında bu pini data transferi için de kullanabileceğimi düşündüm. Belki sırf enteresanlık olsun diye daha sonra bununla da bir deneme yapabilirim.

Veri transferi şu şekilde yapılacak. Pic'ten 6502'ye sadece reset bacağı ve s.o. bacağı bağlı olacak. Veri transferi için gereken kodu içeren ufak bir eprom 6502'ye bağlanacak. Kod overflow flag'i set eden aritmetik bir işlem içermeyecek, başlangıçta pic'ten gelecek bir 1 sinyalini bekleyecek. Belirli bir süre sonunda 1 gelmemişse 0 kabul edilecek, 1 gelirse 1 olarak işlem görecek. Arada belirlenmiş bir protokole göre önce başlangıç adresi sonrasında da sid datası bu yöntemle transfer edilecek.

Oldukça yavaş kalacak bir yöntem aslında. 40 cycle ile bir bit transfer etsek.

Ortalama 4k boyutundaki bir sid'i transfer etmek için :

40 cycle * 8 bit * 4096 byte = 1310720 cycle.

Eh o kadar da yavaş değil gibi sanki, saniyede 1 milyon cycle'dan 1.31 sn. gibi bir süre yapıyor.

74S244'leri devreye yerleştirebilmek için mecbur devreyi bozuyorum çünkü klasik aldığım kablolar yine bitti. Artık ya herro ya merro. Eprom'dan sid çalan test devresine dönüş yok.
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 #84 : Mart 01, 2015, 05:34:14 ÖÖ »

Bir sürü talihsizlikten sonra nihayet 6502 devredeyken belleğe program transfer edip çalıştırmayı başardım.



Hali hazırda çip söküp takma tekniğinden elimdeki brenner8 programcıya icsp için kablo lehimleyip devredeyken programlama yöntemine geçmiştim. İşleri epey rahatlatıyor bu. Devreye tristate buffer'ları ve 6502'yi monte edip epey bir deneme yaptım ancak bir türlü belleği düzgün yazıp okuyamıyordum. Uğraş uğraş olmadı. Tek eksiğimiz debug kalmıştı, onu da yapabilmek için bugün bir adet clone Pickit 2 aldım. Baktım debug'dan da bir şey çıkmadı.

Sonra acaba dedim, databus için kullandığım d port'unun giriş/çıkış ayarını mı yanlış yapıyorum diye programa bir göz gezdirdim. Çalışan programa dokunmayacaksın boşuna dememişler. Gereksiz gördüğüm bir yeri sadeleştirirken ram'e bir byte yazan fonksiyonun sonunda TRISD = 0xff kaldığını gördüm. Yani D portunu okumaya ayarlıyor bu. O satırı silince program düzgün çalıştı. Tabii bu arada ben devreden 6502'yi ve tristate buffer'ları çıkarmıştım sorun onlardan mı acaba diye. Sonra 2 saat de onları takmaya uğraştım. Onlar takılıyken de neyseki çalıştı.

Ancak mevcut tasarımdan kesinlikle memnun değilim zira devre şu an 0.50 amper akım çekiyor. Devrede 6502, PIC, 8850, 2*RAM entegrelerinden sonra 13 adet entegre daha mevcut. Bu haliyle işi becerdikten sonra S.O. ile data transferi tekniğine kesin geçmek istiyorum. Bunu yaparsam PIC üzerinden 6502'ye sadece READY, RESET, S.O. ve IRQ (belki NMI da devreye sokulabilir) bacaklarını kullanarak belleğe transfer gerçekleştirebileceğim. Tristate buffer için kullandığım 5 adet entegre gerekmeyecek, yine aynı şekilde counter olarak kullandığım 2 adet entegre de gerekmeyecek. Belleğe pic doğrudan erişmeyeceği için adres decoder da sadeleşecek.

Sadece S.O. pin'i üzerinden pic ile 6502'yi haberleştirebilir miyim diye düşündüm ancak bu epey karışık. Bir protokol oluşturmak gerekiyor ve iki tarafta da zamanlamanın çok iyi ayarlanması lazım. Yani yazılan kodun nerde kaç cycle yediğini iyice hesaplamak lazım. Senkron tutturamama ihtimali de söz konusu. Gönderilen 1'ler için overflow flag'i set olacak ancak 0'lar için belli bir süre pic'in S.O. pin'ini low'da tutması gerekiyor. Senkronizasyon kaybolabileceği için arada sabit bir desende data gönderip senkronizasyonun sağlanması gerekiyor falan.

Bunun yerine data gönderimini interrupt ile yapmak daha makul bir çözüm gibi geldi bana. Diğer çözümdeki zamanlama için harcanacak cycle'lar düşünüldüğünde 7 cycle interrupt ile yemek çok da büyük külfet getirmez.

Mantık olarak 6502 başlangıçta interrupt'ları açıp transferin bitip bitmediğini kontrol eden bir kod çalıştırıp döngüye girecek, başlangıçta overflow flag'i temizlenecek. PIC
göndereceği dataya göre overflow flag'i set edecek yahut etmeyecek (1 yahut 0) ve IRQ hattını lojik 0'a çekip interrupt yaratacak. 6502'de çalışan interrupt handler ise overflow flag'ine bakıp 1 mi 0 mı transfer edildiğini anlayıp belleği dolduracak. IRQ'ya bakan program karışık olmasın diye başlangıç adresi ve datanın uzunluğu gönderilirken IRQ yerine NMI kullanılabilir. Bu çözümde senkronizasyon sorunu yok. Sadece Pic tarafında yapılacak ardışık interrupt'ların interrupt'ı karşılayan 6502 kodu bittikten sonra yapılacak şekilde ufak bir bekleme yapmak lazım.

Bunun testi daha zor olduğu için şu anki tasarım aslında işe yaramış olacak. Yeni tasarımı mevcutun üstüne uygularsam 6502 bağlıyken bellekten okuma özelliğini test için kullanabilirim.


* 6502TestOk.png (26.57 KB, 702x448 - Görüntüleme: 3447 kez.)
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 #85 : Mart 02, 2015, 21:27:27 ÖS »

Hatalar olsa da yeni devre ile sid çalmayı başardım Video yükleniyor.

Sırada interrupt hacking var umarım. 7dx partiye devre halinde yetiştirmeyi planlıyordum ama şu an zor görünüyor.

ps: Hali hazırda rs232 üzerinden sid dosya alımı ile ilgili kod yazmıştım. Onu birazcık düzenleyip değişik sid'leri bir deneyeceğim bu arada.
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 #86 : Mart 02, 2015, 21:40:53 ÖS »


Sırada interrupt hacking var umarım. 7dx partiye devre halinde yetiştirmeyi planlıyordum ama şu an zor görünüyor.


Devre halinde olmasa bile, son halini 7dx'e getirirsen çok seviniriz. Merakla bekliyoruz
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #87 : Mart 02, 2015, 22:06:06 ÖS »

Devre halinde olmasa bile, son halini 7dx'e getirirsen çok seviniriz. Merakla bekliyoruz


Getiririm getirmesine ama çalışacağının garantisi yok Silikon tabancası ile sabitlemem lazım her bir tarafını

Video yüklenmiş bu arada



(Sonda kesiliyor, telefonun azizliği... ikinciye de çaldı bu arada)

ps: Çok pis utandım, yazılım sahteciliği kurbanı olabilirsiniz kalmış arkada :-/
« Son Düzenleme: Mart 02, 2015, 22:08:40 Ö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
i_r_on
Uzman
*****
Mesaj Sayısı: 2.873



Üyelik Bilgileri WWW
« Yanıtla #88 : Mart 04, 2015, 21:27:26 ÖS »

Transfer için ekteki gibi bir kod yazdım. Ancak sonradan farkettim ki ön planda çalışan uygulamaya ait statü register'ı interrupt geldiğinde stack'e basılıyor. Interrupt'tan çıkıldığında da tekrar geri çekiliyor. Yani benim interrupt rutinin sonunda overflow flag'ini temizlemem yetmeyecek.

Bunun bir yöntemi, stack'teki statü register'ına ellemek. Bütün bunları düşünürken bir başka yöntem daha geldi aklıma. NMI interrupt'ı 0, IRQ interrupt'ı ise 1 biti olarak kabul edip transfer yapmam da mümkün aslında. Bu durumda Overflow flag'ine ihtiyacım kalmıyor. Rutin içinde hiç overflow flag'ini set edecek bir işlem yapmaz isem bunu da bitiş durumunu algılamak için kullanabilirim. Ekteki rutinde bitiş durumunu algılamak için başlangıç adresi iletildikten sonra çağrılan nmi interrupt'ı kullanıyorum.

Bu arada bu uygulayacağım yöntemin bir dezavantajı var o da uyumluluğu sağlamak biraz daha zor. Kodu $FF00'dan itibaren koydum ancak rom'u kaldırıp oraları da kullanan sid'ler mevcut. Transfer rutini çalışırken rom'u kapatamam.

İki alternatifim var,  şimdilik mecbur ilkini seçiyorum daha basit olmasından dolayı.

1. Şimdilik uyumluluğu salla, kodu minimize edip $FF00 yerine $FF80'den başlayacak hale getirirsek uyumluluğu arttırırız. Bu arad sid'leri tarayıp header'larından kaç tanesini kaçırıyoruz diye tespit etseydik iyi ederdik. (Hemen bir program yazılabilir ancak üşendim yazmaya)

2. Ram'a aktarılacak Player kodu yer değiştirebilir olacak. $FF00 ve sonrasını kullanan bir sid olursa sid'in yerini çalmaya başlamadan önce değiştirecek, nmi rutinini de sid'in ezmeyeceği bir yere alacak (pic kontrolü onun üstünden sağlayacağı için). Doğal olarak rom address decoding logic kullanılarak kapatılacak.


Bu arada kodu 6502 debugger & simulator uygulamasında nmi ve irq'ları manuel verip, overflow flag'i program üzerinden set ederek denedim. Bir iki sıkıntısı  var ya benim rutinden kaynaklanıyor ya da bu programdan.

* 64SOTransfer.65s.txt (3.2 KB - Yükleme: 560 kez.)
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 #89 : Mart 05, 2015, 02:12:14 ÖÖ »

Önceki mesajdaki koda hiç bakmayın. Muhtemelen ciddi bug'ları vardır
Çoktan diğer yöntemle yapılacak kodu yazdım. 6502 simulator'de de debug ettim. Pic'ten kontrol sinyallerini doğru zamanlama ile gönderdiğim sürece doğru çalışacağını umuyorum.

Yeni kodda NMI da IRQ da 1 bitlik data transferi sağlıyor, PIC 0 transfer etmek istediğinde NMI, 1 transfer etmek istediğinde IRQ hattını tetikleyecek. Donanım seviyesinde interrupt'lar ile çalışmadığım için bakalım nasıl çalışacak göreceğiz. Kodu yazmakla uğraştığım için donanım kısmı ile uğraşamadım.

Overflow flag'ini bu arada yeni kodda 6502'nin tasarımcılarının amaçladığı şekilde kullanmış oldum. Interrupt rutini artık tüm sürecin durumunu sadece kontrol ediyor. Reset rutini ise bir durumdan diğerine geçmek için overflow flag'inin set olmasını bekliyor. Böylece interrupt rutinleri hızlandı. Önceki rutinlerde bir bit için max 69 cycle harcanırken. Yeni rutinde 55 cycle harcanıyor. Esas yükü içeren sid'in transferi için bu böyle. Az sayıda verinin transfer edileceği kısımlarda pic işi biraz daha yavaş yapacak.

Kurgu şu şekilde,

1. 6502 reset edilir.
2. Reset rutini kullanılacak değişkenleri sıfırlayıp Overflow flag'inin set edilmesini bekler. Overflow set olduğunda adres transferi tamamlanmış demektir.
3. PIC toplam 4 byte transfer eder. Her bit için bir IRQ yahut NMI oluşturarak. İlk iki byte player'ın yükleneceği adres. Sonraki iki byte sid'in yükleneceği adres olmak üzere.
4. PIC S.O. (Set overflow) çıkışını 1'den 0'a çekerek 6502 üstündeki overflow flag'ini set eder.
5. 6502 reset rutini overflow flag'ini görüp durumu player transfer edilecek'e çeker. Overflow flag'ini temizler.
6. PIC player rutinini transfer eder.
7. 4 ile aynı
8. 6502 reset rutini overflow flag'ini görüp durumu sid transfer edilecek'e çeker. Overflow flag'ini temizler.
9. PIC sid'i transfer eder.
10. 4 ile aynı
11. 6502 reset rutini overflow flag'ini görüp tüm transferin bittiğini anlar ve kontrolü player'a devreder.

Sırada PIC kodunu yazmak var. Esas yükü tutacak sid transfer işlemi için 8mhz ile çalışan pic'in her bitin transferi için 440 cycle'lık süresi var. PIC tarafında iki bit transferi arasında bekleme yapmak gerekecek.

Donanım seviyesinde interrupt'lar ile uğraşmış biri varsa ve kurgumda bir hata varsa bana lütfen ben daha fazla ileri gitmeden dur desin. İşin sonu hüsran ile bitmesin.

* 64IRQTransfer.65s.txt (3.74 KB - Yükleme: 488 kez.)
Logged

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

twitter | blog
Sayfa: 1 ... 4 5 [6] 7 8 ... 14   Yukarı git
Yazdır
Gitmek istediğiniz yer: