Uzun zamandır uğraştığım bir Z80 hardware projesi vardı. En basit ifadeyle C64'ün donanımı I/O bölgesi olarak kullanan ve kendi Romuna ve Ramina sahip bir Z80 kartı.
Böyle bir proje nereden aklıma geldi?
Tarihsel açıdan bakarsak ilk bilgisayarım 48K bir Spectrum'du. Yıl 1985. İlk sene oyunlar, basic prg. derken Elo Elektronik sayesinde Z80 makina dili öğrendim. 1987 gibi Spectrum bozulunca C64'e ve 6510 makina diline başladım. 22 senelik beraberlikten sonra 2009'da Z80'e dönüş yaptım ve ufak tefek birşeyler kodladım. Konunun software kısmı böyle.
VIC'in yeteneklerini gördüğüm için acaba Spectruma VIC takılsa ne olurdu diye merak ettim. Daha doğrusu Z80 + VIC + SID gibi bir sistem olsa nasıl olur diye düşünmeye başladım. Projenin doğuşu böyle başladı.
İlk tasarımlar Z80 + ROM + RAM + VIC + SID şeklindeydi ama çizim aşamasına geçince gittikçe karışık bir hale geliyordu. Sonra bir gün işten gelirken "Olm elinde hazır çalışan bir donanım var. Yapman gereken C64'e expansion porttan takılan bir Z80 devresi dedim kendi kendime."
Bu noktadan sonra işler basitleşti. Ama projeyi kaç kez revize ettim ben bile bilmiyorum. Önceleri Exp. porta takılacak biçimde çizime başladım. Sonradan C64'e MMC, RR gibi kartuşları tak çıkar olmasın diye devrede değişiklik yaptım.
Bir başka çözüm ise 6510'u sökerek yerine Z80 kartını takmak oldu. Fakat çizdikçe kartın boyutları büyümeye başladı ve böyle olmaz dedim.
Sonunda Z80 kartı, hem dışarıda olacak hem de exp. portu boş bırakacak şekilde yeniden çizdim. 6510 yerine bir pcb takarak tüm bağlantıları standart ide kablosuyla Z80 kartı üzerine taşıdım. Dolayısıyla kart üzerinde hem Z80 hem 6510 var.
Gelelim teknik özelliklere. Kartın ölçüleri maalesef hayvani değerlerde (25x13 cm). Kullandığım malzemelerin hepsi DIP kılıf olduğu için kart büyük oldu.
Memory map :
0000 - 1FFF : 8K eprom (4*8K bank halinde 32K'lık 27C256 eprom)
Aynı adreslerde 8K Ram 6264. Rom seçiliyken Ram'a yazma yapılabilir özellik var. Gerekirse aynı adreslerde 4*8K bank 27C256 external eprom bağlanabilen ve geliştirme aşamasında kullanacağım Pic'li bir devre için gerekli bağlantıların olduğu bir slot var. Yazılım ile ROM/RAM ve Internal / External ROM select yapılabilir.
2000 - 3FFF : 8K Ram 6264
4000 - 7FFF : 2*16K bank şeklinde 32K'lık 62256 Ram.
8000 - FFFF : 32K Ram 62256 (İstenirse bir jumper ile 16*32K bank şeklinde 512K'lık 628512 Ram takılabilir.)
I/O olarak ise 0000 - 0003 adreslerinde tüm memory config ve diğer işlemlerden sorumlu bir 82C55 var. Ancak bu adresleri kullanmak için C64'ün devrede olmasına gerek yok. 0004 - FFFF arası IO adresleri C64 tarafında.
82C55 adresleri
0000 : PORT_A
0001 : PORT_B
0002 : PORT_C
0003 : 82C55 Kontrol registeri
82C55 üzerinden erişilebilen MSM62X42B RTC çipi ve SD kart slotu var.
82C55 Port bağlantıları:
PORT_A bağlantıları:
PA0 : ROMENB --- "0" : Ram seçili, "1" : Rom seçili
PA1 : ROMA13 --- İnternal / External Romlar için A13 hattı.
PA2 : ROMA14 --- İnternal / External Romlar için A14 hattı.
ROMA13 ve ROMA14 Romlar için bank seçme amacıyla kullanılacak olup bit değerleri terstir. Mesela 3. Bank için 1-1 yerine 0-0 kullanılmalıdır.
PA3 : RAMA14 --- 4000-7FFF arasındaki Ram için bank seçici. "0" Bank 0, "1" Bank 1
PA4 : RAMA15
PA5 : RAMA16
PA6 : RAMA17
PA7 : RAMA18
Son 4 bit 32K'dan büyük Ram kullanılması durumunda bank seçimi için kullanılacaktır. Eğer 8000-FFFF arasında 62256 varsa bu bitlerin bir işlevi yoktur.
PORT_B bağlantıları:
PB0 : LORAM --- C64'teki LORAM sinyalinin görevini üstleniyor.
PB1 : HIRAM --- C64'teki HIRAM sinyalinin görevini üstleniyor.
PB2 : CHAREN --- C64'teki CHAREN sinyalinin görevini üstleniyor.
Sinyaller bir entegre üzerinden anahtarlanıyor ama bu iki sinyali doğrudan "0" mı yapsam yoksa 82C55 üzerinden mi kontrol etsem karar veremedim.
PB3 : C64_CNT --- 6510'u disable / enable ediyor. Z80 kartına enerji verilince 6510 otomatik olarak disable oluyor. "1" 6510 Disable, "0" 6510 Enable. Yazılımla 6510'u enable edince C64'ün resetlenmesi gerekebilir ki bunun için Z80 kartına C64 reset buton koydum.
Ancak bir kararsızlıkta burada var. Eğer 6510 enable olduğunda tekrar disable etmek için Z80 reset butonuna basmak gerekiyor. Z80 Reset butonu hem Z80'i hemde C64'teki çipleri resetliyor. C64 reset butonu ise sadece C64'ü resetliyor.
Acaba 6510 enable/disable işini bir anahtar ile mi yapsam kararsızım.
PB4 : A0, Din --- RTC için A0 hattı, SD Card için Din (Data İnput) hattı.
PB5 : A1, CLK --- RTC için A1 hattı, SD Card için Clock hattı
PB6 : A2 --- RTC için A2 hattı
PB7 : A3 --- RTC için A3 hattı.
PORT_C bağlantıları:
PC0 : D0, Dout --- RTC için D0 hattı, SD Card için Dout (Data Out) hattı.
PC1 : D1 --- RTC için D1 hattı
PC2 : D2 --- RTC için D2 hattı
PC3 : D3 --- RTC için D3 hattı
PC4 : RTC R/W --- RTC iiçin /RD ve /WR seçimi.
PC5 : RTC /CS --- RTC için Chip Select işareti
PC6 : SD /CS --- SD Card için Chip Select işareti
PC7 : EXROMEN --- External Rom/İnternal Rom select. "1" ise External Rom Enable, "0" ise Internal Rom Enable dir. Eğer External rom slotundaki /EXROM bağlantısı "0" yapılmış ise Z80 kartına enerji verildiğinde otomatik olarak External Rom devreye girer.
Şimdi gelelim External Rom slotuna.
Bu slotta başka işaretlerde var ve bunlar kart için yazılım geliştirme sırasında kullanmayı planladım. Bu slota üzerinde bir Pic bulunan kart takılacak. (Hem Pic kartı, hem de 6510 için kalolu taşıyıcı kart, Z80 kartna eklidir) Pic'li kart ile gerekirse Pic'e yüklenmiş max 2K'lık bir Bios 0000'dan başlayan Ram'a aktarılabilir ve aktarma sonrasında Z80 resetlenerek sistemin çalışması sağlanbilir.
Benim ilk amacım ise, Z80 gerekli olan kodları C64'te oluşturup Pic'in içindeki program yardımıyla Z80 sistem Ram'ine aktarmak.
Daha açık şekilde şöyle yazayım. Pic'in içinde aşağıdaki Z80 kodu olacak ve bunu ilk olarak 0000'daki Ram'e aktaracağız. Dolayısıyla ilk zamanlarda Rom'a gerek yok. Hatta 2000 sonrası Ram'lerede gerek yok.
di
ld hl,loader
ld de,$1000
ld bc,loaderend-loader
ldir
jp $1000
loader ld bc,$c000
ld de,$0000
ld hl,$1000
transfer in a,(c)
ld (de),a
inc bc
inc de
dec hl
ld a,h
or l
jr nz,transfer
;82c55 ayarları
ld bc,3
ld a,$80 ;Bütün portlar çıkış
out (c),a ;Kontrol Port'u
dec c
ld a,%11110000
out (c),a ;Port C
dec c
ld a,%00001100
out (c),a ;Port B
dec c
ld a,%00000111
out (c),a
rst 0
Pic'ten Ram'a kodu attıktan sonra Pic tarafından /BUSREQ serbest bırakılıp Z80'e (ve C64'e) Reset sinyali gönderilecek ve Z80 çalışmaya başlayacak. 0000'daki kod Loader rutinini $1000'e transfer edecek ve loader rutini çalışacak. Loader rutini ise daha önce C64'te C000'dan itibaren hazır olan Z80 kodlarını alarak 0000'a yüklemeye başlayacak. Max. 4K'lık bir kod yüklendikten sonra RST 0 ile deneme OS kodları çalışmaya başlayacak. C64'te Z80 kodları için C000-D000 arasını kullanacağım.
Z80 kodlarını byte-byte hafızaya girmek gerekecek. Veya deneme kodlarını pc üzerinde derleyip, C64 prg dosyası olarak SD karta kaydettikten sonra, MMC64 ile C64'te C000'a yüklenecek. Sonrasında PIC ve Z80 devreye girecek.
Bu devre ile 1541'i C64 üzerinden kullanabileceğiz. Ama SD Card varken Floopy ile kimse ilgilenmez
OS ve SD Card için kod kasacak coderler lazım olacak.
Z80 4MHz'de çalışıyor ama C64 daha doğrusu 6510 yaklaşık 1MHz. Bizim işimiz VIC ile. Çünkü C64'ün bus kontrol işareti VIC tarafından üretiliyor. Dolayısıyla Z80 I/O işlemleri için VIC tarafından üretilen AEC işaretini beklemek zorunda. Eğer kodumuzda I/O komutları varsa bu işareti kontrol ediyoruz, eğer AEC"1" ise C64'e I/O yapabiliyoruz. Değilse Z80'e /WAIT işareti gönderiyoruz. Acaba VIC'in çalışma frekansı yükseltilebilir mi araştırmak lazım.
Kağıt üzerinde herşey güzel gözüküyor.
Aklıma gelenler şimdilik bu kadar.
HA(rdware)DES(igner)