Gönderen Konu: "Switchless" Kernal değiştirici.  (Okunma sayısı 203 defa)

0 Üye ve 5 Ziyaretçi konuyu incelemekte.

Çevrimdışı Bora66

  • Retroman
  • ***
  • İleti: 61
"Switchless" Kernal değiştirici.
« : 27 Nisan 2022, 18:22:15 »
Maceralı yoldan gelen kartlarımın sonuncusu da bitti ve çalıştı.

Çeşitli forumlarda çeşitli alternatif Kernal'lar hakkında okudukça birden çok Kernal image'i tek bir EPROM'a yazıp duruma göre değiştirmek üzerine çalıştım. Önce klasik yaklaşım ile DIP switch kullanan bir kart çizdim, ama bu her seferinde kasayı açmayı gerektirecekti, bağlantıları bir komütatöre geçirip kasaya monte etmek bunu çözerdi ama kasayı delmek de hoş değil. Bunu "soft" olarak nasıl yaparım, klayveyi mi okurum diye anakart şemasını incelerken baktım RESTORE tuşu matriks'den bağımsız, tek başına bir push buton, tam işime yarayacak şey!

ATTiny85 vardı elimde 3-5 tane, fazla fazla yeterli bir MCU. Zaten oldukça basit bir iş, RESTORE tuşu okunacak, basma şekline göre EPROM üzerindeki 8 Kernal'dan biri seçilecek 3 tane IO pini EPROM'un A13, A14, ve A15 adres bacaklarını duruma göre konfigüre edecek ve sonra da C64'e bir RESET yollanacak. Ama bir de gösterge lazım, onun için de Power LED'i kullanmak mümkün.

ATTiny85 8 bacak, ikisi besleme, biri RESET, geriye 5 tane IO kalıyor. 3 tanesi EPROM adres bacaklarına gidecek, biri RESTORE tuşunu okuyacak, biri C64'e reset atacak derken IO'lar bitti... Hadi EPROM'u 27C512 değil de 27C256 kullanalım, 4 tane Kernal adam olana yeter, buradan bir adres bacağı, yani bir IO pini boşa çıkar, RGB LED yerine adreslenebilir LED kullanalım, tek pin üzerinden istediğimiz renk ve parlaklık komutunu gönderebiliriz. Böylece her işe bir IO bacağı olmuş oldu. Acaba 5mm standart kılıfta adreslenebilir LED var mıdır, varsa bizim piyasada bulunur mu? Sordum Google'a, evet var, ve yine evet, yurtiçinden temin ediliyor, şerit olanlarla kıyaslayınca azıcık pahalıca (Sparkfun imiş) ama ölümcül değil, verdim şiparişi, 2 günde geldiler.



RESTORE tuşu normalde pek bir işe yaramıyor, ama kullanıldığı yerde de (mesela RUN STOP-RESTORE) sadece kısa basış ile kullanılıyor, tek başına ve basılı tutulması diye bir kullanımı yok, bu da tam benim işime yarayacak şey. Kısa basıldığı sürece benim ATTiny üzerinde çalışan kod kısa basışları görmezden gelir, ve sadece 3 saniye gibi uzun basışta devreye girerse bu iş olur.

Oturup kabalama bir kod yazdım, breadboard üzerinde simulasyon şeklinde çalıştırdım. Tuşa 3 saniye basılı tutunca kod devreye giriyor, LED'i hızlıca yakıp söndürerek "seni duydum abi" diyor ve ayar moduna giriyor, onun haricinde ise uslu uslu beklemede kalıyor. Ayar modunda ise yine RESTORE tuşuna her basışta bir başka 8K'lık bank seçiliyor (sırayla loop ediyor bunlar, yani dördüncüden sonra tekrar birinciye geçiyor) ve LED o banka atanan renk ile yanıyor, istediğim rengi LED'de görünce RESTORE tuşuna basmayı bırakıyorum, kod 2-3 saniye bekleyip başka basış olmazsa EPROM adres bacakları gerekli konfigürasyona alıyor, hangi bank'ın seçildiği MCU'nun dahili EPROM'una yazıyor (ki kapatıp açınca yine o Kernal ile açılsın) ve son olarak da C64 reset ediyor, ve yeni seçilen Kernal boot ediyor.

Bir yerlerde C64'ü sadece CPU reset bacağından reset etmenin soft bir reset olduğunu, bazı ısrarcı programların bundan kurtulduğunu okumuştum, bir de hard reset olmalı bu durumda (çünkü emülatörlerde var) diye düşünüp o nasılmış diye yine Google amcaya sordum, EXROM reset diye bir şey olduğunu söyledi bana. Bu konuda araştırma yaparken bir de ne göreyim, adamın biri tam benim yaptığım şeyi çoktaaan yapmış, hem satıyor, hem de open source olarak vermiş. Baktım arkadaşın yazdığı koda. Benden daha iyi programcı olduğu kesin, bazı şeyleri çok daha elegan şekilde yapmış, ama adreslenebilir LED kullanmak yerine normal RGB led kullanmış, pin yetersizliği yüzünden de hem EPROM adres bacaklarını hem RGB LED'i beraber sürmek için bir sürü takla attırmış koda. Dedim benim bunlara ihtiyacım yok, şu EXROM reset işini yapsam benim kod zaten çalışıyor. Ancak malesef EXROM reset için 1 IO pini daha gerektiğini gördüm... Önce CPU RESET pini LOW yapılacak, sonra PLA'nın EXROM bacağı LOW yapılacak, önce RESET bırakılacak, sonra EXROM... Neyse ki son çare ama buna da çözüm var, ATTiny'in reset bacağı kod yüklendikten sonra bu işi yapabilen bir programlayıcı ile 12V pulse verilerek IO pinine çevrilebiliyor. Gayet de güzel çalışıyor ama bu durumdayken ICSP ile kod yüklenemiyor, önce yine aynı metod ile tekrar reset'e çevirmek lazım. Varsın olsun, zaten basit bir kod, bir kere istediğim gibi çalıştıktan sonra kalsın öyle diyip koda EXROM reset'i de ilave ettim. Her işe yarayan TL866II+ programlayıcı bu reset pini çevirme işini de yapabiliyor, kodu Arduino IDE'de yazıp, derleyip HEX export edip TL866 ile ATTiny'e yükleyip, reset pinini de IO yaptım, gayet güzel çalıştı.

C64'ün şemasına baka baka anakart üzerinde RESET ve EXROM ve RESTORE tuşu için bağlantı noktalarını tesbit ettim, oralara kablolar lehimleyip diğer uçlarını breadboard'daki prototipe bağladım, içine 4 tane Kernal image yazdığım 27C256 ile bütün olayı canlı şekilde denedim, gayet güzel çalıştı. Kodu hafifçe temizleyip, cilalayıp son hali budur artık dedim, bir kere daha aynı şekilde yükledim. Tabii ki bütün bunları da bir kart haline getirdim veee....   







Ortaya bu çıktı. C64'ün Kernal ROM'unu söktüm, yerine bunu taktım, karta bağlatıları yaptım, LED'i değiştirdim. Herşey gayet iyi çalıştı. Malesef içerinin son durumunu fotoğraflamak kasayı kapatıp vidaladıktan sonra aklıma geldi. Nasılsa tekrar başka bir sebep ile açacağım, o zamana sözüm olsun. Hatta C64'ü ilk aldığın gün çektiğim anakart fotoğrafları ile karşılaştırmalı yaparım.  :D

Şu anda;

1) Standart Kernal (LED Kırmızı)
2) JaffyDOS (LED Mavi)
3) Datel TurboROM-II (LED Yeşil)
4) DolphinDOS (LED Turkuaz)

Şeklinde çalışıyor. Bu arada, JaffyDOS 10 numara 5 yıldız. Bu alternatif Kernal'lar konusunda ayrı bir başlık açmam lazım, ben bu kadar kısa sürede 1 öğrendiysem, buradaki veteran Commodore'cular neler biliyordur.  :D

Bu hikayemiz de buraya kadar. Pi1541 tarafına neler yapılması gerektiği vs konuları da o alternatif Kernal başlığında konuşuruz artık, ama şu kadarını söyleyeyim, drive tarafında JiffyDOS, C64 tarafında JaffyDOS kombinasyonu muhteşem. 

Çevrimdışı Alco

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2133
  • "Kahraman olmak, dürüst olmaktan kolaydır" Luigi P
    • Sizin Amstrad
Ynt: "Switchless" Kernal değiştirici.
« Yanıtla #1 : 09 Mayıs 2022, 14:03:48 »
Eline sağlık Bora! Epey faydalı bir iş olmuş. Merak ettiğim birkaç husus var.

1-) Datel TurboRom-II seçiminin sebebini merak ettim. Adını duyarım ama detayını bilmiyorum. Çok özel bir olayı mı varmış?

2-) JaffyDos veya Datel ile demoları ve hatta çok parçalı oyun yüklemelerini denedin mi? Uyum sorunu var mı?

3-) Bu yaptığın devrenin C64'ün farklı board revizyonları arasında sorun yaşaması mümkün mü?

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 175
Ynt: "Switchless" Kernal değiştirici.
« Yanıtla #2 : 09 Mayıs 2022, 14:48:57 »
Çok güzel bir proje olmuş. Çoğu kişiden farklı bir nedenden ekstra ilgimi çekti. Çünkü benim @eins ile birlikte geliştirdiğimiz projemiz için hazırlamaya başladığım kendi Commodore 64 Kernal'ım var. Şu an için ekteki videodaki gibi Vice'ın kernal dosyasını değiştirerek kullanıyorum. Ama gerçek cihazda da test etmeyi isterim elbette ki. Hele her defasında cihazı açıp bir şeyler yapmadan böyle soft bir çözüm ile çalışmak oldukça keyifli olacaktır. Sadece kernal versiyonu değiştikçe cihazı açmam gerekir, o kadarını dert etmiyorum zaten, ancak major versiyonları gerçek cihazda test ederim.

Ellerine sağlık @Bora66.

Çevrimdışı Bora66

  • Retroman
  • ***
  • İleti: 61
Ynt: "Switchless" Kernal değiştirici.
« Yanıtla #3 : 09 Mayıs 2022, 17:43:35 »
1-) Datel TurboRom-II seçiminin sebebini merak ettim. Adını duyarım ama detayını bilmiyorum. Çok özel bir olayı mı varmış?
Epyx Fastload'un Kernal versiyonu olduğunu @Impetigo söylemişti, o yüzden dahil ettim. Drive tarafında değişiklik istemeden gayet güzel çalışıyor.
2-) JaffyDos veya Datel ile demoları ve hatta çok parçalı oyun yüklemelerini denedin mi? Uyum sorunu var mı?
Çok parçalı oyunlardan kastın ilerledikçe yeni bölümlerin diskten yüklendiği ve hatta birden çok diske bölünmüş oyunlar herhalde? Özellikle denememi istediğin bir oyıun varsa denerim. Demolara çok meraklı değilim, ama genelde şeytanın aklına gelmeyecek numaralar çektikleri için herşeyin standart olmadığı durumlarda büyük kısmı sıkıntı çıkarır diye düşünüyorum. Neyse ki kernal değiştirmek 3 saniye olunca standarta dönmek sıkıntı değil.
3-) Bu yaptığın devrenin C64'ün farklı board revizyonları arasında sorun yaşaması mümkün mü?
Sanmıyorum, sonuçta hepsinde reset işlemi aynı şekilde, ama son kasalarda kernal ve basic ROM 16K olararak birleştirilmiş galiba, onlarda bu haliyle çalışmaz, ama ona da uyarlanabilir.

Çevrimdışı Bora66

  • Retroman
  • ***
  • İleti: 61
Ynt: "Switchless" Kernal değiştirici.
« Yanıtla #4 : 09 Mayıs 2022, 17:45:11 »
Çok güzel bir proje olmuş. Çoğu kişiden farklı bir nedenden ekstra ilgimi çekti. Çünkü benim @eins ile birlikte geliştirdiğimiz projemiz için hazırlamaya başladığım kendi Commodore 64 Kernal'ım var. Şu an için ekteki videodaki gibi Vice'ın kernal dosyasını değiştirerek kullanıyorum. Ama gerçek cihazda da test etmeyi isterim elbette ki. Hele her defasında cihazı açıp bir şeyler yapmadan böyle soft bir çözüm ile çalışmak oldukça keyifli olacaktır. Sadece kernal versiyonu değiştikçe cihazı açmam gerekir, o kadarını dert etmiyorum zaten, ancak major versiyonları gerçek cihazda test ederim.

Ellerine sağlık @Bora66.

Teşekkür ederim, iş oraya gelince haber verin, bir şekilde yaparız.

Çevrimdışı nightlord

  • RAAT
  • Tedavideki Retromanik
  • *
  • İleti: 389
    • Night Network
Ynt: "Switchless" Kernal değiştirici.
« Yanıtla #5 : 09 Mayıs 2022, 20:02:21 »
Bora Bey,

RESTORE tusu ve renkli LED ile tasarladiginiz bu kullanici deneyimi bana gore dort dortluk olmus. Tasarim asamasindaki 8'den 4'e dusme ve ATTiny reset bacaginin IO'ya cevrilmesi adimlarinda, tam muhendislik trade off'larini yaziya dokmussunuz. Ayrica PCB layout ne kadar da temiz olmus. ATTiny eprom soketinin altinda yerini bulmus.

Yani bu alternatif ROM'lar konusu benim hic ilgilenmedigim ve ihtiyac duymadigim bir konu olmasina karsin, bu yaptiginiz proje o kadar "non-intrusive" ki, bi tane alip takmak lazim diye hissettim :) Ellerinize saglik.

Çevrimdışı Alco

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2133
  • "Kahraman olmak, dürüst olmaktan kolaydır" Luigi P
    • Sizin Amstrad
Ynt: "Switchless" Kernal değiştirici.
« Yanıtla #6 : 10 Mayıs 2022, 20:35:50 »
Epyx Fastload'un Kernal versiyonu olduğunu @Impetigo söylemişti, o yüzden dahil ettim. Drive tarafında değişiklik istemeden gayet güzel çalışıyor.
Tamam şimdi oldu. Epyx Fastload denilince tanıdım.

Alıntı
Çok parçalı oyunlardan kastın ilerledikçe yeni bölümlerin diskten yüklendiği ve hatta birden çok diske bölünmüş oyunlar herhalde? Özellikle denememi istediğin bir oyıun varsa denerim. Demolara çok meraklı değilim, ama genelde şeytanın aklına gelmeyecek numaralar çektikleri için herşeyin standart olmadığı durumlarda büyük kısmı sıkıntı çıkarır diye düşünüyorum. Neyse ki kernal değiştirmek 3 saniye olunca standarta dönmek sıkıntı değil.
Hem oyun hem de demo olarak; disket sürücüyü ve buna bağlı turbo kernal uyumluluğunu zorlayacak örnek meselesini @Skate 'e soralım. Bana daha önce bir demo ismi vermişti ama hatırlayamadım. @nightlord ve @Impetigo da bilirler. Görürlerse yazarlar sanırım.

Alıntı
Sanmıyorum, sonuçta hepsinde reset işlemi aynı şekilde, ama son kasalarda kernal ve basic ROM 16K olararak birleştirilmiş galiba, onlarda bu haliyle çalışmaz, ama ona da uyarlanabilir.
Neyse belki zaman içinde sana başka boardlar falan da bulur deneriz artık.

Çevrimdışı Bora66

  • Retroman
  • ***
  • İleti: 61
Ynt: "Switchless" Kernal değiştirici.
« Yanıtla #7 : 11 Mayıs 2022, 11:08:33 »
Bora Bey,

RESTORE tusu ve renkli LED ile tasarladiginiz bu kullanici deneyimi bana gore dort dortluk olmus. Tasarim asamasindaki 8'den 4'e dusme ve ATTiny reset bacaginin IO'ya cevrilmesi adimlarinda, tam muhendislik trade off'larini yaziya dokmussunuz. Ayrica PCB layout ne kadar da temiz olmus. ATTiny eprom soketinin altinda yerini bulmus.

Yani bu alternatif ROM'lar konusu benim hic ilgilenmedigim ve ihtiyac duymadigim bir konu olmasina karsin, bu yaptiginiz proje o kadar "non-intrusive" ki, bi tane alip takmak lazim diye hissettim :) Ellerinize saglik.

Teşekkür ederim!

Çevrimdışı Skate

  • RAAT
  • Retro Meraklısı
  • *
  • İleti: 175
Ynt: "Switchless" Kernal değiştirici.
« Yanıtla #8 : 11 Mayıs 2022, 16:36:21 »
Demolarda ağırlıklı olarak kernal’ı tamamen iptal ediyoruz. Sadece $fffa-$ffff arası adresleri kullanıyoruz ki o kernal’dan bağımsız, doğrudan işlemcinin sabit adreslemesi. Ancak şu var. Örneğin demonun ilk başlangıcında jsr $e544 ya da yakın adresleri kullanılarak ekran temizlendi ve tüm demodaki tek kernal kullanımı bu. Sizin kernal versiyonunuzda bu adresi özel olarak bu işe rezerve etmediyseniz büyük ihtimalle crash eder ya da en azından ekran temizlenmez. Demolarda durum bu. 256b falan dedin mi kernalın altını üstüne getiriyoruz, onlar çoğunlukla çalışmazlar. Ama büyük demolarda kernal kullanımı sıfıra yakın oluyor. Tabii irq loader falan da initialization kısmında kernal kullanıyor olabilir. Yani amaç farklı kernallarla çalışsın olduktan sonra çok ufak bir çaba ile modern demoları kernal bağımsız hale getirebiliriz, zaten öyle çoğu. Ama işte kimse “bir tane bile kernal adresi çağırılmasın, sakın!” diye dert etmiyor. O yüzden garantisi yok.

80’lerin demoları irq’ları bile $0314 / $0315 ile kullanır, $ea81 / $ea31 ile çıkar irq’dan. Onlar sıkı sıkıya orijinal kernal’a bağımlılar. Günümüzde efektlerimize daha çok cycle kalması açısından asla kullanmıyoruz bunları.

Çevrimdışı Bora66

  • Retroman
  • ***
  • İleti: 61
Ynt: "Switchless" Kernal değiştirici.
« Yanıtla #9 : 12 Mayıs 2022, 14:11:21 »
Demolarda ağırlıklı olarak kernal’ı tamamen iptal ediyoruz. Sadece $fffa-$ffff arası adresleri kullanıyoruz ki o kernal’dan bağımsız, doğrudan işlemcinin sabit adreslemesi. Ancak şu var. Örneğin demonun ilk başlangıcında jsr $e544 ya da yakın adresleri kullanılarak ekran temizlendi ve tüm demodaki tek kernal kullanımı bu. Sizin kernal versiyonunuzda bu adresi özel olarak bu işe rezerve etmediyseniz büyük ihtimalle crash eder ya da en azından ekran temizlenmez. Demolarda durum bu.

Malesef yazılım (en azından 6502/6510 makina dili) konusunda zır cahilim. Donanım bilgim ise amatör seviyede. Ancak buradan anladığım kadarıyla eğer kernal iptal ediliyorsa 3. parti bir kernal olması demonun çalışmasını etkilememeli. Bu kernal'ları yazan insanlar orijinal kernal'ı baz alıp değişiklikler yapıyorlar ve uyum sorunu olmaması için hiç bir şeyin yerini değiştirmeyip zaten olan az bir şey boş yeri kullanıyorlar ve hemen hepsindeki ortak yaklaşım olan kasetten yükleme ile ilgili kısımları çıkarıp buradan kazandıkları yerleri kullanıyorlar. Ben kullandığım kernal'larda değişiklik yapmadım, kendim de bir şey yazmadım, yani ekranı temizleme ile ilgili kısımlar neyse o şeklinde duruyor. Benim yazdığım C++ kod AtTiny85'in içinde çalışıyor, kernal koduyla (hatta hiçbir şey ile) alakası yok.

256b falan dedin mi kernalın altını üstüne getiriyoruz, onlar çoğunlukla çalışmazlar. Ama büyük demolarda kernal kullanımı sıfıra yakın oluyor. Tabii irq loader falan da initialization kısmında kernal kullanıyor olabilir. Yani amaç farklı kernallarla çalışsın olduktan sonra çok ufak bir çaba ile modern demoları kernal bağımsız hale getirebiliriz, zaten öyle çoğu. Ama işte kimse “bir tane bile kernal adresi çağırılmasın, sakın!” diye dert etmiyor. O yüzden garantisi yok.

80’lerin demoları irq’ları bile $0314 / $0315 ile kullanır, $ea81 / $ea31 ile çıkar irq’dan. Onlar sıkı sıkıya orijinal kernal’a bağımlılar. Günümüzde efektlerimize daha çok cycle kalması açısından asla kullanmıyoruz bunları.

Değişik kernal'lar ile denememi isteyeceğiniz demolar var ise keyifle test ederim.

Çevrimdışı Bora66

  • Retroman
  • ***
  • İleti: 61
Ynt: "Switchless" Kernal değiştirici.
« Yanıtla #10 : 12 Mayıs 2022, 14:38:50 »
Fotoğraf çekmeyi unuttuğum için sonradan eklerim demiştim, buyrun:

ROM adaptörleri yerine takılmış halde.


Soldaki BASIC ROM için yaptığım basit 24pin-28pin çevirici adaptör kartı, sağdaki ile malum "switchless" kernal değiştirici kart. Yarım milimetrelik bir ölçü hatası yüzünden iki kart yan yana soketli olarak sığmadı malesef, o yüzden kernal değiştirici kartı bir soket ile takmak yerine anakarta direkt lehimlemek zorunda kaldım. Bu sayede bir soket yüksekliği kadar aşağıya indiği için öbür kartın altında kaldı ve yan yana sığmama sorunu ortadan kalktı. Üzerindeki 27C256 zaten soketli olduğu için olan 4 kernal image'den birini değiştirmek istersem EPROM'u kolayca sökebileceğim için çok sıkıntı değil. Tek sıkıntı ATTiny85 arızalanır veya kodunda değişiklik yapmak istersem çıkabilir, ama çok düşük ihtimal. Switchless adaptörden çıkan 6 kablo şöyle: Soldaki 3 pin anakarta giden bağlantılar, sağdaki 3 pin ise adreslenebilir LED'e giden GND, 5V ve data hatları.

Anakartın üzerinde RESTORE tuşu ve CPU RESET hatlarına yaptığım bağlantılar


Bu da PLA'nın EXROM hattına bağlantı


Biraz içerde serbest gezen kablolar arttı ama kasayı delmeden, düğmeler takmadan çalışan bir çözüm olduğu için kasayı kapatınca herşey hala eskisi gibi.