Bu sayfadaki yazılar
Sayfanın metni
Sayfa 17
Şimdi gelelim önemli bir konuya.... Eğer LORAM, HIRAM ve CHAREN’in hepsini “0” yaparsanız ne olur?. Bunu yaparsanız artık $D000 - $DFFF arasındaki RAM’ı kullanabilir hale gelirsiniz. Ayrıca BASIC ve KERNAL ROM’ları devre dışı kalacağından C64’e adını veren 64 K RAM tamamen kullanıma açılmış olur. Fakat hiçbir giriş / çıkış işlemi yapılamayacağından ne işinize yarayacağını bilemem. C64 normal bellek durumundayken BASIC ve KERNAL ROM adreslerine yapılacak bir POKE işlemiyle veri ROM’a değil RAM’e yazılacaktır. Zaten isteseniz de ROM’a bir şey yazamazsınız. Çünkü ROM’un Türkçesi YALNIZ OKUNABİLİR BELLEK’tir. Eğer PEEK komutuyla bir okuma işlemi yaparsanız elde edeceğiniz değer RAM’daki değil ROM’daki değerdir. Çünkü öncelik ROM’dadır. 1 numaralı adresi istediğiniz gibi kullanabilirsiniz ama dikkatli olmak şartıyla. Dergimizin ilk sayısında yer alan MAKİNE DİLİ EDİTÖRÜ çalışırken BASIC ROM altındaki RAM’de bulunur. Eğer MDE çalışırken bilgisayarı resetlerseniz aşağıdaki 5 komutu yazarak MDE’yi tekrar kullanabilirsiniz. POKE 40956, 169 POKE 40957, 54 POKE 40958, 133 POKE 40959, 1 SYS 40956 Eğer 1 numaralı adresin içeriğinin $37 olduğundan eminseniz, POKE 40958, 198 POKE 40959, 1 SYS 40958 komutlarını yazmanız yeterlidir. İlk dört POKE komutlarının assembler karşılığı şöyledir. LDA #$36 STA $01 Son iki POKE komutunun assembler karşılığı ise DEC $01 komutudur. Bu iki adresten sonra sıra I/O bölgesi dediğimiz adreslere geldi. Genel bir ifadeyle $D000 - $DFFF adresleri arasında bulunan bu bölgede C64’ün görüntü işlemlerinden sorumlu VIC, ses işlemlerinden sorumlu SID, ekranda gördüğünüz renkler için kullanılan COLOR RAM, her türlü klavye, joystick, zamanlayıcı, kaset ve disket işlemlerinden sorumlu CIA1 ve CIA2 ile tamamen kullanıcıya ayrılmış durumda olan ve genellikle hardware için kullanılan IO1 ve IO2 bölgeleri vardır. Bazı kartuşlar bu adresleri kullanır. Eğer elektronik bilginiz varsa bu I/O1 ve I/O2 bölgelerini kullanarak bir takım devreler yapabilirsiniz. Aşağıdaki tabloda her çipin yer aldığı adresleri göreceksiniz.
İSİM GERÇEK İSMİ ADRESİ GERÇEK ADRESİ VIC Video Interface Controller $D000 - $D3FF $D000 - $D02E SID Sound Interface Device $D400 - $D7FF $D400 - $D41C COLOR RAM COLOR RAM $D800 - $DBFF $D800 - $DBE7 CIA1 Complex Interface Adapter 1 $DC00 - $DCFF $DC00 - $DC0F CIA2 Complex Interface Adapter 2 $DD00 - $DDFF $DD00 - $DD0F I / O 1 Input / Output 1 $DE00 - $DEFF $DE00 - $DEFF I / O 2 Input / Output 2 $DF00 - $DFFF $DF00 - $DFFF Tabloda iki ayrı adres görüyorsunuz I/O çiplerinin gerçek çalışma adresleri en sondaki sütundaki değerlerdir. C64’ü tasarlayanlar öyle bir iş yapmış ki mesela ekranın dış rengi için kullanılan $D020 adresi yerine $D220 yazarsanız ekran rengi yine değişecektir. Bu durumda siz SHADOW REGISTER kullanmış oluyorsunuz. Yani yazdığınız adreste gerçekte hiçbir şey yoktur. Programlarınızda ilginçlik olsun diye kullanabilirsiniz. VIC çipinin registerleri her 64 adreste bir kendini tekrarlar. Yani $D020 yerine $D020 + 64 + 64 +...... kullanabilirsiniz. $D020 için kullanabileceğiniz en son adres $D3E0 olacaktır. Aynı tekrarlama SID çipi için 32 adrestir. CIA1 ve CIA2 çiplerinin registerleri ise her 16 adreste bir tekrarlanır. Yukarıdaki gereksiz bilgilerden sonra artık gerçek adresleri incelemeye başlayabiliriz.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 16
Bellek haritasına kaldığımız yerden devam ediyoruz. Aslında geçen sayıda $0000 - $FFFF adresleri arasını bitirmiştik. Fakat 0 ve 1 numaralı adreslerle $D000 - $DFFF arasında yer alan ve kısaca I/O bölgesi olarak tanınan bellek bölümünün ayrıntılı incelemesini bu sayıda yapıyoruz.
Commodore 64’te 64 Kbaytlık RAM, 8 Kbaytlık BASIC ROM, 8 Kbaytlık KERNAL ROM, 4 Kbaytlık KARAKTER ROM ve 4 Kbaytlık I/O (Giriş/Çıkış) bölgesi vardır ve bütün bunlar toplam 88 Kbaytlık bir yer kaplamaktadır. Bunlardan başka uygun donanım kullanılarak kartuş denilen parçaların da birer bellek olarak kullanıldığını hesaba katarsak sayı artacaktır. Mesela ülkemizde bilinen adıyla MULTI ICE 6 kartuşunda 32 K’lık bir EPROM ve 8 K’lık bir RAM vardır. Ayrıca 512 K’lık RAM genişletme kartuşları da bulunmaktadır. Kartuşlardaki bellekleri kullanabilmek için C64’ün hardware yapısını bilmek gerekmektedir. Bu bölümde sadece C64’ün içindeki bellek bölümlerine nasıl erişileceğini göreceğiz. C64’ün işlemcisi olan 6510 – genel amaçlı kullanılabilen 6502’nin özel bir versiyonudur – 16 bitlik adres hattıyla en fazla 64 K adresleyebilmektedir. Fakat yukarıdaki 88 K’lık bir alan nasıl oluyor da kullanılabiliyor? Bu işin sırrı 6510’un içindedir. 6502’nin özel bir versiyonu olması dolayısıyla 6510 aynı zamanda bir MMU (Memory Management Unit – Bellek Yönetim Birimi) olarak kullanılmaktadır. Normal şartlarda RAM’da yer alması gereken 0 ve 1 numaralı adresler işlemci tarafından kendi içindeymiş gibi kullanılır. Bu iki adresten 0 numaralı olanı veri yön portu olup 1 numaralı adresin hangi bitlerinin giriş veya çıkış olarak kullanılacağını düzenler. Şöyle bir örnek verelim. 1 numaralı adresin bitlerini kapı olarak düşünün. 0 numaralı adres bu kapıların hangilerinden çıkış, hangilerinden giriş yapılacağına karar verir. 1 numaralı adres ise bu kapıların açık veya kapalı olacağını belirler. 0 numaralı adres yani VERİ YÖN PORT’u işlemcinin içinde olup dışarıyla bağlantısı yoktur. 1 numaralı adres ise KONTROL PORT’udur ve 6 adet çıkış ile C64’ün içindeki diğer yerlere bağlıdır. VERİ YÖN PORT’unda 47 ($2F) değeri bulunmaktadır ve bu ikili sistemde %101111’dir. Burada “1”ler çıkış, “0”lar giriş olarak tanımlanmıştır. Buna göre 1 numaralı adresin 0, 1, 2, 3 ve 5 numaralı bitleri çıkış, 4 numaralı biti ise giriş olarak kullanılmaktadır. C64’te bellek düzenleme işleminde 1 numaralı adresin 0, 1 ve 2 numaralı bitleri kullanılır. Diğer bitler ise teyp ile yapılan işlemlerde kullanılır. Şimdi bunları inceleyelim.
İSİM BİT YÖN AÇIKLAMA LORAM 0 ÇIKIŞ $A000 - $BFFF (BASIC) arasındaki RAM / ROM için kontrol. HIRAM 1 ÇIKIŞ $E000 - $FFFF (KERNAL) arasındaki RAM / ROM için kontrol. CHAREN 2 ÇIKIŞ $D000 - $DFFF arasında yer alan Giriş / Çıkış yada ROM için kontrol. 3 ÇIKIŞ Kasete yazma hattı. 4 GİRİŞ Teyp anahtarı duyumu. 5 ÇIKIŞ Teyp motor kontrolü.
1 numaralı adresin normal açılış değeri $37 (55) olup bizi ilgilendiren ilk üç bit için konuşursak, C64 ilk açıldığında BASIC ROM; KERNAL ROM ve GİRİŞ / ÇIKIŞ bölgesi seçilmiş durumdadır. Yani LORAM; HIRAM ve CHAREN bitleri ilk açılışta “1”dir.
Eğer LORAM bitini “0” yaparsanız artık BASIC ROM devreden çıkar ve yerine aynı adreslerdeki RAM kullanılabilir hale gelir. BASIC programlama ile ilgilenmiyorsanız ve daha çok assembler kullanıyorsanız 8 K’lık bir bölge kazancınız olacaktır. Eğer HIRAM bitini “0” yaparsanız anında bilgisayarın kilitlendiğini göreceksiniz. Çünkü KERNAL ROM’da bulunan ve C64’ün çalışmasını sağlayan rutinler devre dışı kalacak ve işlemci o rutinlerin yer aldığı adreslerde RAM boş olduğu için ne iş yapacağını bilemeyecektir. Bu nedenle eğer HIRAM’ı “0” yapacaksanız – ki ancak makine diliyle olacağı için- değişiklikten önce SEI komutuyla interrupt’ları durdurmanız gerekmektedir. Son olarak CHAREN bitini “0” yaparsanız artık I/O çiplerine –görüntü, ses vb.– erişemez fakat KARAKTER ROM’unu okuyabilirsiniz. Böylece C64’ün orijinal karakterlerini RAM’a aktarıp üstünde değişiklik yapabilirsiniz.