Bu sayfadaki yazılar
Sayfanın metni
Sayfa 55
Bilgisayarın bilgisayar olmasını sağlayan en önemli faktör bilgilerin eksiksiz ve sorunsuz bir program olarak çalışmasını sağlayan yazılımıdır. İşletim sistemleri bilgisayar adı verilen elektronik kütlenin ne yapması, nasıl yapması gerektiğini, o kütlenin anlayacağı dilde anlatan programlardır. İşletim sistemlerinin gelişmesini ve yaygınlaşmasını sağlayan mikro işlemcilerin en büyük özelliği, kendilerine özgü dilin kolay anlaşılabilir ve programlanabilir olmasıdır. C-64'ün kullandığı 6502 uyumlu 6510 bu alanda en popüler olanıdır. C-64 işletim sistemi aslında yeni bir sistem değildir. Yeni C-64'ten önce tasarlanmış, denenmiş bir sistemdir. Commodore firmasının C-64'ten önce çıkardığı ve C-64'ten oldukça basit bir yapıya sahip VIC-20 tasarlanırken KERNAL adı verilen sistem kullanıldı. C-64 gelişmiş bir model olmasına karşılık bu sistemi olduğu gibi kullandı. Bu nasıl gerçekleşti? Kernal sisteminde bir işletim sisteminin en önemli rutinleri, sıçrama tablosu (JUMP TABLE) olarak adlandırılan tabloyla adreslendirildi. Bu tablo $FF81'den $FFF6 adresine kadar uzanır. Böylece yeni bir model tasarlanırken gelişme sadece bu işlevleri yerine getiren rutinde ve tablodaki adreslerde olmakta, tablonun konumu aynı kalmakta, bu da yeni bir tasarımı oldukça kolaylaştırmaktadır. Bunun örneğini C-16 ve Plus-4 Kernal sisteminde de görebiliriz. Buna ilginç bir örnek VIC-20, C-64, C-16 ve Plus-4 program-
Seyfettin ÇANKAYA — larının çoğunun, çok az bir değişiklikle türünde kullanılabilir olmasıdır.
Kernal Rutinleri Ne
İşe Yarar?
Kernal tanıtılırken bir işletim sistemin en temel işlevlerini yerine getirir demiştik. Bu işlevler tüm sistemin ilk açılışından kapanışına kadarki sürede kontrolü sağlamak; Disk Drive, Dataset, Printer, Klavye, Video devresi ve RS-232 portuna bilgi gönderme, bilgi alma gibi işlemlerdir. Bütün bu işlevler sözünü ettiğimiz Kernal rutinleri ile belirlenmiştir. Bu yazı dizisinde tüm Kernal rutinlerini inceleyeceğiz ve bu rutinler yardımıyla çalışan makine dili kullanılarak yazılan programlardan örnekler vereceğiz. Bu nedenle temel makine dili bilgisi gerekeceğinden, dergide çıkan bu konuya ilişkin yazıları incelemenizi öneririz.
C-64 Power-On
Kernal İşbaşında!..
C-64 ilk açıldığında ne olur dersiniz? Bunu Kernal içindeki bilgilerden öğrenelim. Kernal hexadecimal olarak $E000-$FFFF aralığında yer alır. Bunun nedeni C-64'ün işlemcisi olan 6510'un ilk çalışma adresini $FFFC'deki bellekten alıyor olmasıdır. Şimdi bu adreste ne var öğrenelim.
$FFFC — 65532 olduğunu hatırlayarak
PRINT PEEK 256* PEEK(65533)
Sonuç 64738 bulunur. Bu değer RESET vektörünü gösterir. Örnek olarak biz SYS 64738 yaptığımızda C-64 sanki yeni açılıyormuş gibi davranır. Bu adres eşittir. Şimdi bu adresten incelememize başlayalım.
RE FF FiZES FCEP FZEH FOEC
ZEI
“|
in > mmo TM CÜ
DT fu
Ti Ti m
SÜ
mın Ok PAZAR
TT m Pod zn Doli
CA
ulu Dn KA no KADA)
nı — 7 da
nın DD m
Lan) Zi
Yukarıdaki JSR $FDD2 ile çalışan altprogram kartuş bağlantısı olup olmadığını test etmektedir. Bu işlemi de $FD10 adresinde yer alan şifresinin kontrolü ile sağlamakta, kartuş bağlantısı varsa JMP işlemiyle kartuştaki ROM üstünden bu adrese sıçramaktadır. Bazı programların reset ile tekrar çalışması da bu adresteki kodların CBM80 olmasıdır. Bu bağlantı olmadığı durumda JSR $FDA3 ile giriş/çıkış devrelerinin çalışması, JSR $FD50 ile RAM testi ve Basic başlangıç adresi, ekran adresinin belirlenmesi, JSR $FD15 ile giriş/çıkış vektörlerinin adreslere atanması, JSR $FF5B ile video kontrol devresinin çalışması sağlanır. Bu işlemlerin sonunda JMP ($A000) ile Basic ROM devreye girerek Basic çalışmaya geçilir.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 54
T=Y2-M*X2. Her iki denklem de T'ye eşit olduğuna göre, Y1-M*X1 = Y2-M*X2 diyebiliriz. Ve bu denklemi de M'ye göre çözersek, M=(Y2-Y1) / (X2-X1) elde ederiz. Bu bize doğrumuzun eğimini verir. Sıra geldi T'yi bulmaya. T = Y2-M*X2 olduğuna göre, M'yi yerine oturtarak T = Y2 - (Y2-Y1) / (X2-X1)*X2 de diyebiliriz. Bu T ve M değerlerini Y=MX+T denklemine yerleştirir ve Y'ye göre çözersek aradığımız formülü buluruz: Y = (Y2-Y1)/(X2-X1) * X + Y2 - (Y2-Y1)/(X2-X1) * X2. Tüm çizimimiz bu formüle dayalı. Tek sorun, çizgimiz aşağı doğru olduğu zaman çıkacaktır. O zaman X1 = X2 olacağından, X2-X1'in sonucu sıfır olacaktır. Hiçbir sayı sıfıra bölünemeyeceği için, bilgisayar hata mesajı verip duracaktır. Bunu da bir iki IF ile çözümlüyoruz. Programa bir göz atalım. Önce X ve Y koordinatları en yakın tamsayılara yuvarlanıyor. Sonra da, çizginin tamamen ekran dışında olup olmadığı kontrol ediliyor. Eğer öyleyse geri dönülüyor. Değilse gerekli X ve Y farkları hesaplanıyor. Eğer X1-X2 sıfırsa normal çizgi çizme kısmına atlanıyor. Eğer sıfırsa, çizgimiz bir dik çizgi demektir. Bu durumda önce çizginin ekran içine sığıp sığmadığı kontrol ediliyor ve eğer sığmıyorsa başlangıç ve bitiş koordinatları ekran içinde kalacak şekilde yeniden hesaplanıyor. Ardından da çizgi çiziliyor. Eğer dik çizgi değilse, gene çizginin ekran içine sığıp sığmadığı kontrol ediliyor, sığmıyorsa başlangıç ve bitiş koordinatları ekran içinde kalacak şekilde yeniden hesaplanıyor ve çizgi çiziliyor. Bu arada çizgi çizmek için hep nokta koyma rutini çağrılıyor.
51100-51340 arasındaki çizgi silmenin, çizgi çizmekten hiçbir farkı yok. Sadece nokta koyma yerine nokta silme rutini çağrılıyor. Multicolor'da çizgi çizmek de aynı işlemleri gerektiriyor. Farkı, maksimum X değeri olarak 159'u kabul ediyor ve çok renkli nokta koyma rutinini çağırıyor. Bu altprogramı da, 52800-53040 arasında bulabilirsiniz. (X1, Y1) ve (X2, Y2) koordinatlarının yanısıra RR içinde de 0-3 arası bir sayı ile hangi numaralı rengi kullanacağınızı belirtmelisiniz. Son şeklimiz elips. Neden daire değil de elips? Daire, X ve Y yönündeki yarıçapları eşit olan bir elipstir. Dolayısıyla elips için bir rutin yazdığınızda, otomatik olarak daire çizmeniz de sağlanmış olur. Elips içinde üç altprogramımız var. Elips çizmek, silmek ve multicolor'da elips çizmek için. Elipsin geometrik denklemi şu şekildedir: Y = B*SQR (1-X^2/A^2). Eğer dikkat ederseniz, bir elipsin sağ üst, sağ alt, sol üst ve sol alt parçalarının birbirlerine simetrik olduğunu görürsünüz. Yani biz elipsin sadece bir çeyreğini hesaplayarak tüm elipsi çizebiliriz. Zaten yavaş olan BASIC programı için önemli bir kazanç. 50600-50670 arasında, XR ve YR ile iki doğrultudaki yarıçap uzunlukları belirlenmiş ve (XM, YM) ile merkezinin koordinatı verilmiş elipsi 320*200 ekranında çizen rutini görmektesiniz. Bu rutinde elipsin bir çeyreği hesaplanmakta ve yeni hesaplanan nokta ile eski nokta arasına çizgi çizilerek kapalı bir elips çizilmektedir. Eğer elips tamamen ekrana sığmıyorsa, sığan kısmı çizilecektir. 50700-50770 arasında aynı işlemler elips silmek için yapılıyor. Çizgi çizmek yerine çizgi silmek için kullanılan rutin çağrılmakta. 52600-52670 arası ise multicolor ekranda RR ile belirtilen renkte bir elips çizmekte. Tek farkı, çok renkli çizgi çizme rutinini çağırması. İşte bu kadar. Artık bu rutinleri kullanarak, hatta onları daha iyi bir hale getirerek kendi grafik programlarınızı yaratabilirsiniz. Gene de BASIC'in yavaş kalacağını, makina dilinin veya SIMONS' BASIC'in daha kullanışlı olacağını unutmayın. Gelecek aya kadar hoşçakalın...