Forumdaki kartuş çılgınlığını devam ettireyim dedim ve yine hobi yaklaşımı ile yeni bir kartuş projesine başlıyorum.
Kompleks pcb tasarımı olmadan, herkesin evde yapabileceği, *half ass tarzı bir şey olacak.
Atari'nin kullandığı 1.19Mhz'lik bus'ı hızlı bir microcontroller ile sürmeye çalışacağım. Kullanmayı düşündüğüm board aliexpress'ten kolayca temin edilebilen clone maple stm32 board'larından. Board'ların üstünde 8Mhz kristal var ancak stm arm işlemcinin içindeki pll ile 72mhz'de koşuyor cpu. Benim temin ettiğim board üstünde STM32F103C8T mevcut, 20K ram ve 64K flash'ı var. Maalesef 3.3v bir logic ve güç kullanan bir cihaz. Bu yüzden databus bağlantısı için hazır bidirectional level shifter'lar kullanmayı düşünüyorum.
Yazılım kısmı için yine Arduino ide'sini kullanacağım.
İlk anda elimde bidirectional level shifter'lar olmadığı için read only 4k'lık kartuşları emüle etmeyi düşünüyorum. (Ev ortamında breadboard üstünde o kadar hatta level shifting yapmak * yaklaşımına uymaz ve beni kasar
)
Atari 2600'ü biraz araştırdım ve bu iş için gerekli bazı ince detaylar ile ilgili bilgi sahibi olmaya çalıştım. Onları da burada paylaşayacağım.
Öncelikle,
Atari 2600'ün kartuş slotunun pinout'u aşağıdaki şekilde,
D3 D4 D5 D6 D7 A12 A10 A11 A9 A8 +5V SGND
--1- --2- --3- --4- --5- --6- --7- --8- --9- -10- -11- -12-
GND D2 D1 D0 A0 A1 A2 A3 A4 A5 A6 A7
Ne R/W, ne reset, ne bir IRQ, NMI ne DMA için gerekli pin neredeyse hiç bir şey yok. ROM bağla kullan tadında bir pinout.
Atari 2600 üzerindeki 6502'nin ucuz versiyonu olan 6507 çipinin maksimum adresleyebildiği bellek 8K. Atari maliyetten kısmak için chip decoding için ayrıyeten bir çip yahut genel lojik çiplerden faydalanmamış ve chip select logic'lerini RIOT, TIA çiplerinin içine gömmüş. 8K adresleyebiliyor demiştik, adres hatları A0'dan A12'ye kadar gidiyor.
İlk kafamı kurcalayan konu buydu. Eprom ile basit bir kartuş şeması aradığımda hep karşıma A12'nin kullanılmadığı ve her zaman bir NOT kapısından geçirilip eprom'a chip select yapılmış devreler ile karşılaştım.
Şuradaki şematikleri inceleyince meseleye uyandım :
http://kevtris.org/2600/2600schemo.htmlTIA'yı gösteren 7. resme dikkat, çipin üstünde CS1, CS2, CS3, CS4 diye dört tane chip select pin'i var (dedim ya adamlar ayrı entegre koymamak için kendi custom chip'lerinin içine chip select logic'i gömmüşler) ve CS1 direkt A12. 8K oldu sana 4K.
A12'nin sırrı bu şekilde çözülmüş oldu.
Bir diğer konu, R/W pin'i, özel bir chip select sinyali olmayan yerde eskiden kartuş tasarımcıları bankswitching'i nasıl yapıyordu acaba meselesi.
Onunla ilgili de şöyle güzel bir kaynak buldum.
http://kevtris.org/files/sizes.txtNeredeyse her kartuş yapan kendi bankswitching yöntemini icat etmiş. Ancak temelde iş Adres ve data hatlarını izleme beklenen pattern yakalandığında da bankswitch yapmaya dayalı. Kimisi doğrudan bellekteki belli adreslere read göndererek bankswitching niyetini belli etmiş, kimisi 650x'in stack erişimini izleyip yapmış gibi gibi envai çeşit yöntem mevcut. Bütün bunlara destek verebilmek için oynanmak istenen oyunun ya uzantısından ya da dosya üzerinde bir heuristic scan yapıp o bankswitching yöntemini uygulamak lazım.
Kafamı karıştıran bir diğer nokta da R/W pin'i olmayan bu pinout üstünde nasıl harici RAM desteği verdikleri idi kartuş üreticilerinin. O da açığa çıktı üstteki dokümanın baş kısmını dikkatle incelediğimde.
Şöyle açıklamış eleman
Some carts have extra RAM; There are three known formats for this:
Atari's 'Super Chip' is nothing more than a 128-byte RAM chip that maps
itsself in the first 256 bytes of cart memory. (1000-10FFh)
The first 128 bytes is the write port, while the second 128 bytes is the
read port. This is needed, because there is no R/W line to the cart.
CBS RAM Plus (RAM+) This maps in 256 bytes of RAM in the first 512 bytes
of the cart; 1000-11FF. The lower 256 addresses are the write port, while
the upper 256 addresses are the read port. To store a byte and retrieve it:
LDA #$69 ; byte to store
STA $1000 ; store it
.
. ; rest of program goes here
.
LDA $1100 ; read it back
. ; acc=$69, which is what we stored here earlier.
Yani aslında programcı ve kartuşu tasarlayan belirli adresleri yazmaya, belirli adresleri de okumaya rezerve ediyor. Kartuş adrese göre yazma ya da okuma yapıyor.
Başka enteresan şeyler de var henüz yanıtını tam araştırmadığım. Misal Pitfall oyununda kartuş üstünde oyuna zenginlik katan ayrı bir ses devresi bir şeyi olduğu söyleniyor. Kartuşun üstünde speaker falan mı vardı acaba merak ediyorum.
Yapacağım ilk iş stm board ve arduino ile i/o pin'lerini topluca ne kadar hızlı on/off switch edebildiğimi logic analyzer ile kontrol. Yarın veya ertesi gün yaparım herhalde bunu.
Bu sefer hakikaten eprom kullanmayacağım
* : Türkçede karşılığı yok ama benim tasarımları tam karşılayan ifade bu