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 KategoriProjeKissCart64 - Çoklu C64 Kartuşu
Sayfa: 1 2 [3] 4 5 ... 20   Aşağı git
Yazdır
Gönderen Konu: KissCart64 - Çoklu C64 Kartuşu  (Okunma Sayısı 73062 defa)
0 Üye ve 1 Ziyaretçi konuyu incelemekte.
i_r_on
Uzman
*****
Mesaj Sayısı: 2.866



Üyelik Bilgileri WWW
« Yanıtla #30 : Ağustos 02, 2015, 02:51:59 ÖÖ »

Önceki yazdıklarımı editlemeden (editleyince kodlar cortluyor) bir iki düzeltme yapayım yazdıklarımda.

Reset sinyali 1' den 0'a sonra tekrar 1'e geçiyormuş. Doğrudan MR/'ye bağlanması lazım.

FC3'ün şemasına ve wiki açıklamasına baktım. EXROM ve diğer bank switching sinyallerini latch üstünden ayarlamasının amacı muhtemelen c64'ü kartuşsuz konfigürasyona da geçirebilmek için. Sonuçta bu freezing bir kartuş, esas oyun vesaire çalışırken aktif olmayıp kullanıcı istediğinde aktif olması lazım.

Üstte bahsettiğim handikap için ne yapmışı inceliyorum. Kartuş romunu bulabilirsem $DFFF'e erişen kod diğer 8k'lık segmentlerde de aynı mı diye bakabilirim.

edit1: FC3'te adres bacaklarını 13'lü nand'dan sonra not yapılmış. Muhtemelen etrafa fazla zarar ziyan vermeyelim diye böyle yapmışlardır diye düşünüyorum. Ancak bence overkill. 7402 quad 2 input nor gate iş görür bence. Not gerekmeyeceği için 1 çipten kurtulunur, 8 pin ic yerine 7 pin ic kullanılmış olur.

Şu kod switch olayı için aklıma gelen çözüm de bir counter kullanmak. 74273 yerine kontrol edilebilen input ve output'u olan 4 bitlik 74173 kullanılabilir. İlgili bellek erişildiğinde bu buffer doldurulur ancak çıkışı 3-state tutulur (counter'ın saymak istediğimiz çıkış pin'ine bağlanarak). Counter c64'ün clock sinyali ile istediğimiz cycle sayısı kadar saydıktan buffer'ın output kontrolünü açar ve böylece bank zararsız kod bloğuna geçildiğinde açılmış olur.

FC3 niye böyle bir işe girmemiş derseniz FC3'ün içindeki utility'ler kendinin olduğu için kodla bu işi kotarmış olabilir. (Daha kodlarını incelemedim, şimdi incelemeye de üşendim )

FC3 de counter ile freeze için bir haltlar karıştırmış, yine muhtemelen kartuş romunun devreye girmesi için belli cycle bekletmek istemiş c64'ü.

Kartuş development board yapmak için iyi tahrik ettiniz beni ancak masamın üstünü görseniz girmeme konusunda bana hak verirdiniz

edit2: NMI da yapıyormuş bu meret Metallic'in bahsettiği io lokasyonuna yapılan yazmada kullanılan 6. bit ile. (ya da freeze butonuna basıldığında) NMI da üstte bahsettiğim soruna bir çözüm. Tabii öncesinde NMI vektörünün değiştirilmiş olması lazım, NMI vektöründeki kodun da RAM'de bir yere yazılmış olması lazım. NMI temiz çözüm, counter'a gerek yok Yazma yapıldıktan sonra ilk iş 6510 NMI'ı servis edecektir, NMI IRQ'dan farklı olarak kenar tetiklemeli olduğu için 1'den 0'a düştüğü anda algılanacaktır ve sonra sinyal istediği kadar 0'da kalabilir.

edit3: FC3 ile ilgili şurada ekstra bilgiler varmış : http://rr.c64.org/wiki/Final_Cartridge_III_Internals_Errata.txt

edit4: Kartuşu indirip eski alışkanlık makine kodundan şöyle bir baktım da, harbiden bir aynalama olayı da ciddi şekilde var. $1E50 ile $DE80'i karşılaştırabilirsiniz. Bununla alakalı olmayabilir tabii. $DFFF'e çok sayıda erişim var kodda. Çoğunda da NMI deaktif edilecek şekilde erişmiş. (Byte içinde $40 değeri var yani)


* 20150802_021126.jpg (71.36 KB, 800x450 - Görüntüleme: 700 kez.)
« Son Düzenleme: Ağustos 02, 2015, 03:50:30 ÖÖ 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)
Genel Yönetici
*****
Mesaj Sayısı: 6.269


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #31 : Ağustos 02, 2015, 03:40:24 ÖÖ »

@Metallic, @i_r_on: Ellerinize sağlık, şimdilik yazdıklarınız çince gibi gelse de biraz araştırmadan sonra sanırım hepsini olmasa da anlamaya başlarım. Zaten amaç da kendimi geliştirmek olduğundan şimdiden çok faydalı bir proje oldu benim gözümde.

Çok teşekkür ederim ikinize de.
Logged

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

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PSP Slim, Nintendo DS Lite
Simon (Özay Turay)
Genel Yönetici
*****
Mesaj Sayısı: 6.269


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #32 : Ağustos 02, 2015, 03:44:16 ÖÖ »

Bu arada ben de üç led ve bir buton kullanarak bank switching olayını MCU'dan yaptırma işini koda döktüm ve gayet güzel çalışıyor. İncelemek isterseniz kodu ekliyorum. Bir de button debounce için uğraşmamak adına Bounce2 kütüphanesini kullandım. Kahkaha

Kod:
#include <Bounce2.h>
#include <avr/eeprom.h>

#define ADDR_13     A0  // Address Pin 13 of the EPROM
#define ADDR_14     A1  // Address Pin 14 of the EPROM
#define ADDR_15     A2  // Address Pin 15 of the EPROM

#define BTN_BNK     10  // Bank Switcher Button Pin
#define PIN_RST     13  // Host Device Reset Pin

#define RST_DELAY  100  // Host Device Reset Delay

Bounce switchBank = Bounce();  // Create switchBank DeBouncer Class

byte currentBank;  // Initialize Current Bank Global Variable

void setup()
{
  pinMode(PIN_RST, OUTPUT);  // Configure Host Device Reset Pin as OUTPUT
  digitalWrite(PIN_RST, LOW);  // Pull Host Device Reset Pin LOW so that it doesn't startup while we are preparing

  pinMode(ADDR_13, OUTPUT);  // Configure Address Pin 13 of the EPROM as OUTPUT
  pinMode(ADDR_14, OUTPUT);  // Configure Address Pin 14 of the EPROM as OUTPUT
  pinMode(ADDR_15, OUTPUT);  // Configure Address Pin 15 of the EPROM as OUTPUT
 
  pinMode(BTN_BNK, INPUT_PULLUP);  // Configure Bank Switcher Button Pin as INPUT_PULLUP
  switchBank.attach(BTN_BNK);  // Attach Bank Switcher Button Pin to switchBank DeBouncer
  switchBank.interval(5);  // Set interval of the switchBank DeBouncer

  currentBank = eeprom_read_byte((uint8_t*)0);  // Read Current Bank value from EPROM
  if (currentBank == 0xFF) currentBank = 0;  // If there is no value make it 0
 
  digitalWrite(ADDR_13, bitRead(currentBank, 0));  // Set Address Pin 13 of the EPROM from bit 0 of the Current Bank value
  digitalWrite(ADDR_14, bitRead(currentBank, 1));  // Set Address Pin 14 of the EPROM from bit 1 of the Current Bank value
  digitalWrite(ADDR_15, bitRead(currentBank, 2));  // Set Address Pin 15 of the EPROM from bit 2 of the Current Bank value
 
  delay(RST_DELAY);  // Delay some time to finish Host Device Reset operation
  digitalWrite(PIN_RST, HIGH);  // Pull Host Device Reset Pin HIGH so that it starts up as preparing is done
}

void loop()
{
  switchBank.update();  // Check switchBank DeBouncer State

  if (switchBank.fell())  // If button is pressed
  {
    digitalWrite(PIN_RST, LOW);  // Pull Host Device Reset Pin LOW so that it resets while we switch banks
   
    currentBank++;  // Select next bank
    if (currentBank > 7) currentBank = 0;  // In case of overflow make it 0
    eeprom_write_byte((uint8_t*)0, currentBank);  // Write new Current Bank value to EPROM
   
    digitalWrite(ADDR_13, bitRead(currentBank, 0));  // Set Address Pin 13 of the EPROM from bit 0 of the new Current Bank value
    digitalWrite(ADDR_14, bitRead(currentBank, 1));  // Set Address Pin 14 of the EPROM from bit 1 of the new Current Bank value
    digitalWrite(ADDR_15, bitRead(currentBank, 2));  // Set Address Pin 15 of the EPROM from bit 2 of the new Current Bank value
  }

  if (switchBank.rose())  // If button is released
  {
    delay(RST_DELAY);  // Delay some time to finish Host Device Reset operation
    digitalWrite(PIN_RST, HIGH);  // Pull Host Device Reset Pin HIGH so that it starts up as switching banks is done
  }
}

Edit: Commodore 64'ü reset durumundan hemen çıkarmak yerine butonun bırakılmasını sağladım, böyle daha iyi oldu sanki.
« Son Düzenleme: Ağustos 02, 2015, 13:55:39 ÖS Gönderen: Simon (Özay Turay) » Logged

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

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PSP Slim, Nintendo DS Lite
i_r_on
Uzman
*****
Mesaj Sayısı: 2.866



Üyelik Bilgileri WWW
« Yanıtla #33 : Ağustos 02, 2015, 04:04:10 ÖÖ »

8 led olmayacak mı 3 led niye? User friendly olmaz öyle millet binary mi öğrenecek şimdi

Hazır mikroyu koymuşken sram koy bari de sd karttan falan yüklesin bence
Software switching'den inan daha kolay olur.

6510 bildiğim kadarıyla reset bacağı 0 iken address ve data bus'ı tristate ediyor. Sram'a shift register'lar ile erişip doldurursun 8kb'yi sd karttan, sonra verirsin coşkuyu. Ancak ola ki kartuş programı kendi üstüne ne de olsa rom'um ben bir şey olmaz deyip yazma yapıyorsa ondan koruman lazım. Read bacağını chip select'in not'ı yaparsan olur herhalde.
Logged

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

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


Commodore Forever


Üyelik Bilgileri WWW
« Yanıtla #34 : Ağustos 02, 2015, 10:08:03 ÖÖ »

Mikro dediysem ATtny13 kullanıcam yahu, sadece prototipi Pro Mini ile yaptım. Zaten reset'i saymazsan 5 tane IO pini var. Biri butona, biri reset hattına, kalan üçü de ledlere işte. Tıpkı dip switch'lerin pozisyonları gibi düşünsünler.

Ayrıca dünyada 10 türlü insan vardır. Binary bilenler ve bilmeyenler. Kahkaha
« Son Düzenleme: Ağustos 02, 2015, 10:09:37 ÖÖ Gönderen: Simon (Özay Turay) » Logged

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

Retro: Commodore 64, Amiga 500, Amiga 1200
Retromsu: Wii, XBox360, XBox, PS3 Slim, PS2 FAT, PS1, PSP Slim, Nintendo DS Lite
ibo1973
Uzman
*****
Mesaj Sayısı: 1.867


Üyelik Bilgileri WWW
« Yanıtla #35 : Ağustos 02, 2015, 11:48:58 ÖÖ »

8 led olmayacak mı 3 led niye? User friendly olmaz öyle millet binary mi öğrenecek şimdi

Hazır mikroyu koymuşken sram koy bari de sd karttan falan yüklesin bence
Software switching'den inan daha kolay olur.

6510 bildiğim kadarıyla reset bacağı 0 iken address ve data bus'ı tristate ediyor. Sram'a shift register'lar ile erişip doldurursun 8kb'yi sd karttan, sonra verirsin coşkuyu. Ancak ola ki kartuş programı kendi üstüne ne de olsa rom'um ben bir şey olmaz deyip yazma yapıyorsa ondan koruman lazım. Read bacağını chip select'in not'ı yaparsan olur herhalde.

+1 kesinlikle katılıyorum
Logged

Eşimin videolarını çektiği youtube yemek tarifleri kanalımız
http://www.youtube.com/channel/UCWeURdgKjzxe9490Pb5KTPA?view_as=subscriber
i_r_on
Uzman
*****
Mesaj Sayısı: 2.866



Üyelik Bilgileri WWW
« Yanıtla #36 : Ağustos 02, 2015, 15:18:01 ÖS »

74138 at bari bir tane ortaya yer varsa. 74138'in ilgili çıkışı 0 oluyor ama. Ledlerin + kutuplarına direnç koyup vcc ye. - kutuplarını da 74138'in çıkışlarına. 74138'in çıkışlarının akım çekme yetenegine bakmak lazım. Yetersizse sonuç cılız yanan led yahut yanan bir 74138 olur. 

Ps: Sen kaşındın, ortaya attiny atarak kiss prensipini ilk sen ciğnedin
Logged

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

twitter | blog
Metallic
Uzman
*****
Mesaj Sayısı: 936



Üyelik Bilgileri
« Yanıtla #37 : Ağustos 02, 2015, 18:35:07 ÖS »

Ooo başlık değişmiş, seksi bir kartuş projesi olmuş bu =)


@Metallic: Sağol bunu inceleyip gerekirse basit denemeler yapacağım. Ama C64 kodunu ben yazamam haberiniz olsun, birileri el atacak artık başarılı olursak. Kahkaha
Sen expansion port için breakout board'unu yapmaya başla =) c64 kodunda yardım ederiz, bank switching'in kodu kolay zaten. Tek bir STA/STX/STY ile iş bitiyor, önemli olan mantığını anlamak.

@Metallic, @i_r_on: Ellerinize sağlık, şimdilik yazdıklarınız çince gibi gelse de biraz araştırmadan sonra sanırım hepsini olmasa da anlamaya başlarım. Zaten amaç da kendimi geliştirmek olduğundan şimdiden çok faydalı bir proje oldu benim gözümde.
Simon, c64'de kartuşlar hakkında en sağlam bilgi veren döküman sanırım Alphaworks'ün yazdığı Cartridge Development Guide. Sen zaten bulmuşsundur ama yine yazayım dedim =)
Logged
Metallic
Uzman
*****
Mesaj Sayısı: 936



Üyelik Bilgileri
« Yanıtla #38 : Ağustos 02, 2015, 19:09:24 ÖS »

i_r_on, ne çok şey yazmışsın, cevap vereyim derken canım çıktı =)

@Metallic :
IO2/, R/W... bunlar logic 0 olmalı, bu durumda I/O adresi $DF00-$DFFF'a daraltılıyor. buradaki adresi seçmek için nand kullanılabilir çünkü nand tüm girişler 1 ise 0 üretir... Üretmek istediğimiz sinyal 0 ise adres olarak $DFFF yerine DF00 kullanılıp varsa 8 + 2 bacaklı nor kullanılabilir (var mı bilmiyorum) yahut diğer sinyallerin invert edilmesi gerekir ki bu da ekstra çip demek.
FC3'deki bank switching'i anlatırken, anlatması ve anlaşılması kolay olsun diye detaylara girmedim. Amacım temel olarak hangi sinyallerin kontrol edildiği ve bunun hangi ic'ler ile yapıldığını anlatmaktı. Yoksa IO2 ve RW'ı inverter'dan geçirerek 74133 NAND kapısına girmişler, NAND çıkışını 74273'ün clock'una verirken yine inverter'dan geçirmişler vs =)

Ancak daha kolayı $DF00 ile $DFFF aralığını tek bir adres gibi görmek bence. Bu I/O alanları kartuşlara ayrılmış zaten. Tek sıkıntı çıkma durumu üstüste kartuş takılması durumu olur. O da "ben de isterem" diyecektir. Ama bizim durumumuzda sorun olacağını sanmıyorum.
Bu durumda IO2/ ve RW (Buradaki 0 olan W ile ilgileniyoruz)
İyi fikir, bence de pek sorun çıkmaz. Ayrıca A0-A7'yi kontrol etmekten kurtulup, geriye kalan IO2 ve RW sinyalleri için 74139 (2x 2 to 4 decoder) kullanılabilir diye düşünüyorum, ama biraz daha bakmam lazım (linklerini verdiğim MultiCard64'de de 74273'ün yanında 1 adet 74139 kullanılmış).

Metallic, bir de şunu anlamadım wiki'de EXROM ve GAME'in de low active sinyaller olduğu yazılıyor. Yani bunlara 0 vermek lazım ki aslında zaten kartuş taktığımız için kafadan da 0 vermemiz gerekmiyor mu? Yani aslında kartuşu devre dışı çıkarmak için ihtiyaç olur ancak bunlara gibi geliyor. IO adreslerinden birinden yakalanan 3 bitlik değerden sonra düzgün bir şekilde reset çakılırsa kontrol seçilen bank'a gider gibi hali hazırda.
EXROM ve GAME, PLA'ya exp.porttan giriş sinyalleri. Aktif düşük sinyaller olduğu için bu girişlerde birer pull-up direnç vardır dahili veya harici olarak. Dediğin gibi kartuş takıldığında istenilen kartuş moduna göre sıfıra çekilmeleri gerekli. Örneğin 8k kartuş modu için EXROM sıfıra çekilmeli. Kartuşu devre dışı bırakmak için de EXROM'u normal haline getirmek, yani 1 yapmak gerekiyor. c64'e ilk power verildiğinde kartuş modu ve bank seçimi için kullanacağımız latch'in (örneğin 74273) tüm çıkışları 0 olacağı için hem EXROM sıfıra çekilmiş olur, hem de bank0 seçilmiş olur. Oyun menüsü için reset butonuna basıldığında aynı anda 74273'ün MR master reset'ini de sıfırlarsak yine aynı sonuca ulaşırız.

74LS273 yerine 4 bitlik bir latch bile yetebilir bence. databus üstünden 3 pin yakalansa yeter. Bunlar da 27C512'nin en üst adres pin'lerine beslenir.
Bu aşamada kaç KB'lık eprom kullanılacağı öncemli. Bence en yüksek kapasiteyi kullanmak iyi olur. 512K'lık 27C4001/27C040 epromlar var, bir de 29C040/29F040 flash alternatifleri var. 512K kullanılacaksa eprom/flash'in A13-A18 bacakları için 6 bit gerekli, bir de EXROM için toplam 7 bitlik latch gerekiyor. 8 bitlik 74273 bu iş için uygun olur.

Ancak menü rom'u switching'i yaptığı noktada artık kontrol switch edilen rom'a geçer bu noktada sıçarız Gülümseme Menü rom'unun kodunun 8k'lık tüm rom'larda aynalanması gerekir sıçmamak için. (Bu kısmı çözümsüz bırakıyorum şimdilik)
Oyun menüsü için gerekli kod önce istediği gibi çalışsın, ama bank switching'i yapacağı zaman eprom üzerinde değil ram üzerinde çalışsın ($0800'ün aşağısı buna uygun). Bu şekilde farklı bir bank seçildiğinde kod bundan etkilenmez.

ancak dediğim gibi sıkıntı switching'in yapıldığı nokta. Bildiğim kadarıyla sıcak reset'te reset sinyali kullanılmıyor. Dolayısıyla bu sinyalle ancak açılışta yahut kartuş üstünde reset sinyali üreten bir devre varsa bununla latch'i sıfırlamak mümkün. Ancak program latch'i kontrol etmek için $DF00-$DFFF aralığına yazdığında diğer rom'lardan birine geçiş yapılmış olacak. Bir sonraki instruction kalınan yerden geçiş yapılan rom'dan okunacak. Kernal hala ayakta oluyor sanırım. Bu durumda diğer romlarda aynı lokasyonda kodun devam etmesi durumunda bu iş olur.
Buna geniş açıdan bakarak bir cevap vereyim. Bence 8k standart modda çalışan bir kartuş yapılsın (8k modu için sadece EXROM'u sıfıra çekmek gerekiyor). Bu modda seçimi yapılan bank, c64'ün $8000-$9FFF adres aralığında görünüyor. Bence bu modu kullanarak 8k / 16k rom imajlarını ve prg'leri çalıştırabiliriz:
* 8k rom imajları için STA $DFxx ile bank seçimi yapılarak rom, c64'ün $8000-$9FFF adres aralığına map'lenir. Oyunu çalıştırmak için (kernal rom zaten erişilebilir durumda) warm reset yapılarak oyun çalıştırılır (ya da JMP ($8000) de yapılabilir). Bu aşamada 74273 latch'in bank seçim çıkışlarının aynen kalması lazım. EXROM da yine aynı şekilde kalacak, kartuş devrede olmalı.
* 16k rom imajları için STA $DFxx ile bank seçimi yapılarak önce rom'un 2. 8k'lık kısmı $8000-$9FFF adres aralığına map'lenir ve $A000-$BFFF aralığındaki ram'e transfer edilir. Sonra yine bank seçimi yapılarak rom'un 1. 8k'lık kısmı $8000-$9FFF aralığına map'lenir ve orda bırakılır. $A000-BFFF'deki BASIC rom kapatılarak alttaki ram görünür hale getirilir ve oyun, 8k rom'larda olduğu gibi çalıştırılır.
* prg oyunları kaç bank yer kaplıyorsa bu bank'ların seçimleri yapılarak $8000-$9FFF'e maplenir ve belleğe $0801'den itibaren transfer edilir. Ardından STA $DFxx yapılarak kartuş devre dışı bırakılır (EXROM = 1). Oyunu çalıştırmak için BASIC'in RUN rutinine jump yapılır.

Aslında EXROM'u 1 yaparak kartuşu tam devre dışı bırakmış olmuyoruz, sadece eprom'un $8000-$9FFF aralığına map'lenmesini iptal ediyoruz. Kartuşdaki $DFxx'e yazma istemini yakalayan kısım çalışmaya devam ettiği için $DFxx'e yazarak eprom'un map'lenmesini yine açabiliriz.

Oyun seçim menüsüne dönmek için reset butonuna basıldığında, yukarıda değindiğim gibi 74273'ün MR master reset'ini de sıfırlarsak, 74273'ün çıkışları sıfırlandığı için bank0 seçilmiş olur, EXROM'da yine sıfırlanır ve 8k standart mod seçilmiş olur. Bu şekilde bank0'daki menü kodu devreye girer ve oyun seçim menüsü ekrana gelir.

Kartuş development board yapmak için iyi tahrik ettiniz beni ancak masamın üstünü görseniz girmeme konusunda bana hak verirdiniz
Hak veriyorum, ama yapsan fena olmaz, kartuş akımı başladı çünkü =)
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.866



Üyelik Bilgileri WWW
« Yanıtla #39 : Ağustos 02, 2015, 23:11:02 ÖS »

FC3'deki bank switching'i anlatırken, anlatması ve anlaşılması kolay olsun diye detaylara girmedim. Amacım temel olarak hangi sinyallerin kontrol edildiği ve bunun hangi ic'ler ile yapıldığını anlatmaktı. Yoksa IO2 ve RW'ı inverter'dan geçirerek 74133 NAND kapısına girmişler, NAND çıkışını 74273'ün clock'una verirken yine inverter'dan geçirmişler vs =)

Çirkin pcb'ler söz konusu olduğunda Özay muhtemelen çip sayısı ile ilgilenecektir diye detaya girdim ben de. Gerçi o öpücük atıp çıktı işin içinden

İyi fikir, bence de pek sorun çıkmaz. Ayrıca A0-A7'yi kontrol etmekten kurtulup, geriye kalan IO2 ve RW sinyalleri için 74139 (2x 2 to 4 decoder) kullanılabilir diye düşünüyorum, ama biraz daha bakmam lazım (linklerini verdiğim MultiCard64'de de 74273'ün yanında 1 adet 74139 kullanılmış).

Decoder input sinyalleri değişmezken değişik sinyaller üretmek için daha faydalı bir eleman. Burada tek sinyal üreteceksek tam faydasını görmeyiz. 74139'a baktım, 74138 gibi seçili olan hattı 0 yapıyor. Bu durumda yine inverter gerekir. Bence NOR aynı işi yapar.

Bu aşamada kaç KB'lık eprom kullanılacağı öncemli. Bence en yüksek kapasiteyi kullanmak iyi olur. 512K'lık 27C4001/27C040 epromlar var, bir de 29C040/29F040 flash alternatifleri var. 512K kullanılacaksa eprom/flash'in A13-A18 bacakları için 6 bit gerekli, bir de EXROM için toplam 7 bitlik latch gerekiyor. 8 bitlik 74273 bu iş için uygun olur.

KISS prensipleri gereğince Özay'ı 27C512'den bir adım öteye götüremeyiz bence Kontrol ettim 29c serisini bizim dandik eprom programmer'lar halledebiliyor. Makul bir seçenek olabilir dediğin. Gerçi denemek için elimde 64k üstü medya yok. Yolda W27E256 EEPROM'larım var, geldiğinde belki ben de deneme yaparım. İşin içinde software olacağı için EPROM ile bu iş zor.

Oyun menüsü için gerekli kod önce istediği gibi çalışsın, ama bank switching'i yapacağı zaman eprom üzerinde değil ram üzerinde çalışsın ($0800'ün aşağısı buna uygun). Bu şekilde farklı bir bank seçildiğinde kod bundan etkilenmez.

Mantıklı hareket, bu sağlam bir çözüm olur. Ancak bu sefer de 8k'lık segmentlere koyduğun utility/oyun programlarına aynı şeyi yaptıramazsın. Yaptırmak için hepsini elden geçirmen gerekir. Bu arada benim aklımda butona basıp menü çıkarmak yoktu. Bu şekilde freeze tarzı bir şey yapılacaksa FC3'ün girdiği cycle sayma muhabbetine girmek elzem olabilir.

Buna geniş açıdan bakarak bir cevap vereyim. Bence 8k standart modda çalışan bir kartuş yapılsın (8k modu için sadece EXROM'u sıfıra çekmek gerekiyor). Bu modda seçimi yapılan bank, c64'ün $8000-$9FFF adres aralığında görünüyor. Bence bu modu kullanarak 8k / 16k rom imajlarını ve prg'leri çalıştırabiliriz:
* 8k rom imajları için STA $DFxx ile bank seçimi yapılarak rom, c64'ün $8000-$9FFF adres aralığına map'lenir. Oyunu çalıştırmak için (kernal rom zaten erişilebilir durumda) warm reset yapılarak oyun çalıştırılır (ya da JMP ($8000) de yapılabilir). Bu aşamada 74273 latch'in bank seçim çıkışlarının aynen kalması lazım. EXROM da yine aynı şekilde kalacak, kartuş devrede olmalı.
* 16k rom imajları için STA $DFxx ile bank seçimi yapılarak önce rom'un 2. 8k'lık kısmı $8000-$9FFF adres aralığına map'lenir ve $A000-$BFFF aralığındaki ram'e transfer edilir. Sonra yine bank seçimi yapılarak rom'un 1. 8k'lık kısmı $8000-$9FFF aralığına map'lenir ve orda bırakılır. $A000-BFFF'deki BASIC rom kapatılarak alttaki ram görünür hale getirilir ve oyun, 8k rom'larda olduğu gibi çalıştırılır.
* prg oyunları kaç bank yer kaplıyorsa bu bank'ların seçimleri yapılarak $8000-$9FFF'e maplenir ve belleğe $0801'den itibaren transfer edilir. Ardından STA $DFxx yapılarak kartuş devre dışı bırakılır (EXROM = 1). Oyunu çalıştırmak için BASIC'in RUN rutinine jump yapılır.

Aslında EXROM'u 1 yaparak kartuşu tam devre dışı bırakmış olmuyoruz, sadece eprom'un $8000-$9FFF aralığına map'lenmesini iptal ediyoruz. Kartuşdaki $DFxx'e yazma istemini yakalayan kısım çalışmaya devam ettiği için $DFxx'e yazarak eprom'un map'lenmesini yine açabiliriz.

Oyun seçim menüsüne dönmek için reset butonuna basıldığında, yukarıda değindiğim gibi 74273'ün MR master reset'ini de sıfırlarsak, 74273'ün çıkışları sıfırlandığı için bank0 seçilmiş olur, EXROM'da yine sıfırlanır ve 8k standart mod seçilmiş olur. Bu şekilde bank0'daki menü kodu devreye girer ve oyun seçim menüsü ekrana gelir.

Bu kısma çok fazla doğrudan yorum yapamayacağım çünkü c64'e yapılmış kartuş oyunlarının çalışma prensibi noktasında fazla bilgi sahibi değilim. Anladığım iki tane 8k'lık rom segmentimizin olduğu ve çalışan kodumuzla bu rom segmentlerinden istediğimiz ram bölgelerine transfer yaparak 16k/32k gibi daha büyük yüklemeleri de yapabildiğimiz veya rom'lardan birini yahut ikisini de açıkta bırakıp burayı da programa kullandırabilmemiz mümkün öyle değil mi? Bu durumda sanki en mantıklısı en yaygın olarak kullanılmış mekanizmalar neyse bunlardan bir kaçını desteklemek olabilir. Bu da hakkaten easyflash yapmaya doğru götürüyor projeyi Ha unutmadan şu IO1 ve IO2 diye adlandırılan bölgeler de kartuşlara ayrılmış rom bölgesi gibi kullanılabiliyormuş. 256 + 256 byte kullanılabilecek ekstra iki kısım daha var yani. Buralar bootloader tarzı kullanılabilir. (Bkz. FC3 niye 13'lü nand kullanıp tek adrese hallenmiş)

Kartuş development board yapmak için iyi tahrik ettiniz beni ancak masamın üstünü görseniz girmeme konusunda bana hak verirdiniz

Hak veriyorum, ama yapsan fena olmaz, kartuş akımı başladı çünkü =)


Ben dağınık adamım, bu işe girsem herhalde bir kaç c64 ameliyat masasında kalır, yazık olur c64'lere
Logged

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

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


Günü Kurtaran Avam Hiooargggh :)


Üyelik Bilgileri WWW
« Yanıtla #40 : Ağustos 02, 2015, 23:51:05 ÖS »

Bu işler teknik olarak beni çok aşıyor...O nedenle bir yorum, katkıda bulunmam zor... sadece C64DTV'nin çalışma sistemi ya da sonradan yazılan oyunlarıyla ilgili çalışmalardan fikir almamız mümkün olablir mi? Diye düşünüyorum...Menüyle oyunları seçmek mümkün...Acaba fikir verebilir mi?

https://events.ccc.de/congress/2007/Fahrplan/attachments/1029_C64-DTV_hacking_slides.pdf
Logged

Metallic
Uzman
*****
Mesaj Sayısı: 936



Üyelik Bilgileri
« Yanıtla #41 : Ağustos 03, 2015, 00:53:55 ÖÖ »

Çirkin pcb'ler söz konusu olduğunda Özay muhtemelen çip sayısı ile ilgilenecektir diye detaya girdim ben de. Gerçi o öpücük atıp çıktı işin içinden
Biz plus versiyonunun önünü açmış oluyoruz =)

Decoder input sinyalleri değişmezken değişik sinyaller üretmek için daha faydalı bir eleman. Burada tek sinyal üreteceksek tam faydasını görmeyiz. 74139'a baktım, 74138 gibi seçili olan hattı 0 yapıyor. Bu durumda yine inverter gerekir. Bence NOR aynı işi yapar.
Yarın NOR kapısını da dahil ederek bu konuya bakayım.

KISS prensipleri gereğince Özay'ı 27C512'den bir adım öteye götüremeyiz bence Gülümseme Kontrol ettim 29c serisini bizim dandik eprom programmer'lar halledebiliyor. Makul bir seçenek olabilir dediğin. Gerçi denemek için elimde 64k üstü medya yok. Yolda W27E256 EEPROM'larım var, geldiğinde belki ben de deneme yaparım. İşin içinde software olacağı için EPROM ile bu iş zor.
Bende 29F040 flash var ve TL866A ile sorunsuz silip yazıyorum, dediğin gibi eprom'larla uğraşmaya gerek yok. Gerçi en son fiyatları karşılaştırmak lazım.

Mantıklı hareket, bu sağlam bir çözüm olur. Ancak bu sefer de 8k'lık segmentlere koyduğun utility/oyun programlarına aynı şeyi yaptıramazsın. Yaptırmak için hepsini elden geçirmen gerekir. Bu arada benim aklımda butona basıp menü çıkarmak yoktu. Bu şekilde freeze tarzı bir şey yapılacaksa FC3'ün girdiği cycle sayma muhabbetine girmek elzem olabilir.
Ben, bank0'daki menü programı çalışıp oyun seçimi yapıldıktan sonra bank switching yaparak 8k'lık bank'leri belleğe transfer eden kodun ram'de çalışacağını (örneğin $033C-$03FF teyp tamponu, hatta $0400-$07FF ekran belleği bile olur), transfer bitip oyun belleğe açıldıktan sonra çalıştırılabileceğini kastetmiştim. Senin sorun çıkabileceğini düşündüğün yer neresi?

Anladığım iki tane 8k'lık rom segmentimizin olduğu ve çalışan kodumuzla bu rom segmentlerinden istediğimiz ram bölgelerine transfer yaparak 16k/32k gibi daha büyük yüklemeleri de yapabildiğimiz veya rom'lardan birini yahut ikisini de açıkta bırakıp burayı da programa kullandırabilmemiz mümkün öyle değil mi? Bu durumda sanki en mantıklısı en yaygın olarak kullanılmış mekanizmalar neyse bunlardan bir kaçını desteklemek olabilir.
Evet kartuşların çalışması bu şekilde. Yalnız birkaç mekanizma desteklemeye gerek yok. 8k rom'lar, 8k standart modunda çalışıyor. 16k romlar, bahsettiğim gibi 8k modunda çalıştırılabilir. Ultimax modu var, kernal üzerine mapping yapılabiliyor ama sadece 0-$0FFF aralığındaki ram kullanılabiliyor. Bu modun pek işe yarayacağını düşünmüyorum doğrusu.

Ha unutmadan şu IO1 ve IO2 diye adlandırılan bölgeler de kartuşlara ayrılmış rom bölgesi gibi kullanılabiliyormuş. 256 + 256 byte kullanılabilecek ekstra iki kısım daha var yani. Buralar bootloader tarzı kullanılabilir. (Bkz. FC3 niye 13'lü nand kullanıp tek adrese hallenmiş)
Bu konudan nerede bahsediliyor?

edit: Ultimax modu ram kısıtlamasını düzelttim.
« Son Düzenleme: Ağustos 03, 2015, 01:06:02 ÖÖ Gönderen: Metallic » Logged
Metallic
Uzman
*****
Mesaj Sayısı: 936



Üyelik Bilgileri
« Yanıtla #42 : Ağustos 03, 2015, 01:20:54 ÖÖ »

Bu işler teknik olarak beni çok aşıyor...O nedenle bir yorum, katkıda bulunmam zor... sadece C64DTV'nin çalışma sistemi ya da sonradan yazılan oyunlarıyla ilgili çalışmalardan fikir almamız mümkün olablir mi? Diye düşünüyorum...Menüyle oyunları seçmek mümkün...Acaba fikir verebilir mi?

https://events.ccc.de/congress/2007/Fahrplan/attachments/1029_C64-DTV_hacking_slides.pdf
LW3D, C64DTV bizim uğraştığımızdan baya farklı bir konu. Cimrilik yaptım, hala bir C64DTV alabilmiş değilim. İnşallah bir gün alınca hack'lemek için bu döküman faydalı olacaktır =)
Logged
i_r_on
Uzman
*****
Mesaj Sayısı: 2.866



Üyelik Bilgileri WWW
« Yanıtla #43 : Ağustos 03, 2015, 01:22:34 ÖÖ »

Bende 29F040 flash var ve TL866A ile sorunsuz silip yazıyorum, dediğin gibi eprom'larla uğraşmaya gerek yok. Gerçi en son fiyatları karşılaştırmak lazım.


Aslında ben geliştirme kısmını kastetmiştim. Eeprom'u uv ile silmeye gerek olmadığı için sadece sök tak ile uğraşılır geliştirme sırasında. Son üründe eprom yahut flash arasında tercih yapılabilir. Keşke hem paralel hem de seri interface'i olan eeprom'lar olsaydı. Bu şekilde sök tak yapmaya da gerek kalmaz, ortama bir tane mcu atıp direkt şenlendirebilirdik eeprom'u. Gerçi zif soket kullanırız biraz el oynatırız sorun olmaz.

Ben, bank0'daki menü programı çalışıp oyun seçimi yapıldıktan sonra bank switching yaparak 8k'lık bank'leri belleğe transfer eden kodun ram'de çalışacağını (örneğin $033C-$03FF teyp tamponu, hatta $0400-$07FF ekran belleği bile olur), transfer bitip oyun belleğe açıldıktan sonra çalıştırılabileceğini kastetmiştim. Senin sorun çıkabileceğini düşündüğün yer neresi?


Dediğim gibi butona basıp menü çıkarmayı öngörmemiştim ben. Senin dediğini standart freezer bir kartuş gibi yani kartuş takılı, c64 açıldığında menüsü gözükmeyen. Menü düğmesine basıldığında açılan bir şey gibi algılıyorum. Bu durumda işin dinamiği farklı olur. Şimdi biraz baktım, kartuşlar için ayrı NMI vektörü varmış $8002–$8003 adreslerinde. Kernal NMI handler buraya da dallanıyormuş kartuş varsa piyasada. (Kartuş var mı kontrolünü tekrar yapıyormuş ayrıca) Neyse bu bilgilerle yapılabilir gibi geliyor. Hala FC3 niye o counter'ı koymuşa cevap olmasa da

Evet kartuşların çalışması bu şekilde. Yalnız birkaç mekanizma desteklemeye gerek yok. 8k rom'lar, 8k standart modunda çalışıyor. 16k romlar, bahsettiğim gibi 8k modunda çalıştırılabilir. Ultimax modu var, kernal üzerine mapping yapılabiliyor ama 0-$0FFF aralığındaki ram kullanılamıyor. Bu modun pek işe yarayacağını düşünmüyorum doğrusu.


O zaman yeni yapılanların haricinde kartuşta olup şöyle 32k falan dataya sahip kartuş pek yok öyle mi? Çoğu utility için 8k bile hayvani bir hafıza ancak oyunlar konusunda pek bilgim yok.

Ha unutmadan şu IO1 ve IO2 diye adlandırılan bölgeler de kartuşlara ayrılmış rom bölgesi gibi kullanılabiliyormuş. 256 + 256 byte kullanılabilecek ekstra iki kısım daha var yani. Buralar bootloader tarzı kullanılabilir. (Bkz. FC3 niye 13'lü nand kullanıp tek adrese hallenmiş)

Bu konudan nerede bahsediliyor?


Şu alttaki linkte son paragraf.

http://rr.c64.org/wiki/Final_Cartridge_III_Internals_Errata.txt
Logged

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

twitter | blog
Metallic
Uzman
*****
Mesaj Sayısı: 936



Üyelik Bilgileri
« Yanıtla #44 : Ağustos 03, 2015, 01:51:40 ÖÖ »

Dediğim gibi butona basıp menü çıkarmayı öngörmemiştim ben. Senin dediğini standart freezer bir kartuş gibi yani kartuş takılı, c64 açıldığında menüsü gözükmeyen. Menü düğmesine basıldığında açılan bir şey gibi algılıyorum. Bu durumda işin dinamiği farklı olur. Şimdi biraz baktım, kartuşlar için ayrı NMI vektörü varmış $8002–$8003 adreslerinde. Kernal NMI handler buraya da dallanıyormuş kartuş varsa piyasada. (Kartuş var mı kontrolünü tekrar yapıyormuş ayrıca) Neyse bu bilgilerle yapılabilir gibi geliyor. Hala FC3 niye o counter'ı koymuşa cevap olmasa da Gülümseme

Yok oyun seçim menüsü c64 ilk açıldığında da ekrana gelecek (74273'e ilk güç geldiğinde çıkışları sıfır olmalı diye düşünüyorum), reset butona basıldığında da ekrana gelecek (reset anında 74273'ün master reset'ini sıfırlıyoruz). NMI'ı işe karıştırırsak freezer kartuşlara kadar gideriz artık =)
FC3'deki counter'ın mantığını pek anlamış değilim =)

O zaman yeni yapılanların haricinde kartuşta olup şöyle 32k falan dataya sahip kartuş pek yok öyle mi? Çoğu utility için 8k bile hayvani bir hafıza ancak oyunlar konusunda pek bilgim yok.

16k'nın üzerindeki crt'lere bakınca kartuş versiyonu yapılmış ara yüklemeli oyunlar ve oyun kolleksiyonları (tahminen easyflash imajları bunlar), freezer kartuşları görüyorum ben. Klasik kartuş oyunları 16k'a kadar.


Bildiğim dökümanmış, tamamını okumayınca böyle oluyor =)
Logged
Sayfa: 1 2 [3] 4 5 ... 20   Yukarı git
Yazdır
Gitmek istediğiniz yer: