adreslerden alıp kullanacak. BASIC yorumlayıcımız bize bir olanak daha sağlıyor. Bu olanak, BASIC'ten ana işlem ünitesinin registerlerine hitap etmemizi sağlıyor. Tabii, bu olay doğrudan gerçekleşemeyeceği için, ara değerleri saklayacak bir bölge ol- ması gerek değil mi? Doğru, bu iş için dört hafıza elemanı ayrılmış. SYS ko- mutu ile bir programı çağırdığımız- da, altprogram çağırılmadan önce ana işlem ünitesinin registerleri bu bölgedeki değerlerle yüklenir. Bu ha- fıza birimlerinin adresleri ve yüklen- dikleri registerler şunlardır: 780— — Akümülatör 81— — X-registeri 1782-— Y-registeri 783— — Durum registeri Makine dilindeki programımızın belli bir akü değeriyle başlaması ge- rekiyorsa, sadece SYS komutundan önce gerekli değeri 780 adresli belle- ğe yazmak gerekiyor. 781 ve 782 ad- resli hafıza birimleri, aynı tür kulla- nımı X- ve Y-registerleri için sağlıyor- lar. Durum registerini BASIC'ten kontrol ederken biraz dikkat etmek gerekiyor. En fazla dikkat gerektiren durumlar Interrupt ve Desimal flag- larının gereksiz yere yakılmamasıdır. 783 adresli hafıza birimi normal du- rumlarda sıfır değerini içerir. Bu de- Ber, hiçbir zaman karışıklık yaratma- yacak bir değerdir. Bu hafıza birim- lerini BASIC'ten makine dili prog- ramlara değer geçirmek için kullana- bileceğiniz gibi makine dili program- ların yürümesi bittiğinde ana işlem ünitesinin registerlerinin durumunu izlemek için de bu hafıza birimlerini kullanabilirsiniz. Bu yöntemle BA- SIC ve makine dili programlar ara- sında üç adet sekizer bitlik bilgi bağ- lantısı kurulmuş oluyor. Birçok kul- lanımda bu kadarlık bağlantı yetebi- liyor. Daha çok parametre geçişi ge- rekiyorsa, yukarıda bahsettiğimiz gi- bi daha fazla hafıza birimini bu iş için kullanmanız gerekiyor. Parametre geçişinde kullanılan bir başka yöntem de daha fazla konfo- ru amaçlıyor. Bu yöntemde BASIC yorumlayıcısının bazı özel altprog- ramları kullanılıyor. Diyelim ki, BA- SIC yorumlayıcısı POKE 780, 10 gi- bi bir satırla karşılaştı. Yorumlayıcı, POKE komutunu tanıdıktan sonra gerekli parametreyi BASIC progra- mından alması için genel bir altprog- ram modülünü çağırır. Bu altprog- ram, örneğimizdeki gibi sadece sabit sayıları değil, aynı zamanda değiş- kenler bulunduran karmaşık terimleri de hesaplayabilir. Yani, satırımız POKE A47.5*Z'(INT(SIN(X)*1000)), EXP(X) kadar karışık olsa da hiç bir sorun çıkmayacaktır. Bu altprogram- lar her ne kadar yorumlayıcıda bu- lunsalar da sadece yorumlayıcının kendisi tarafından çağrılması gerek- li diye bir kural yoktur. Bu altprog- ramların gereksinimlerini karşılaya- bildiğimiz sürece biz de kulİanabili- riz. Çağırılan altprogramların gerek- sinimlerine biraz daha detaylı olarak değinelim. Burada sözünü ettiğimiz aritmetik hesaplama (formula evalu- ation) altprogramı FRMEVL adı ta- şıyor ve rekursif bir yapıya sahip. (Bu yapıyı daha detaylı görmek isterseniz ARALIK &86 sayımızdaki RECURSI- rafik işlemleri makine diliyle yapmak, BASIC'le yapmaktan daha zor ama daha olanaklı ve daha hızlı. ON adlı yazıya başvurmanızı öneri- rim). Bu program her bir parantez- de veya işlem önceliğine göre sırayı düzenlemesi gerektiğinde, son duru- munu gösteren ara değerleri yığına atar ve kendi kendini çağırır. Sonuç olarak, yığını aşırı yoğun olarak kul- lanır. Bilindiği gibi 6510 ana işlem ünitesinin yığını sınırlı bir büyüklü- ğe sahiptir (256 byte). Bu yüzden böyle bir altprogram çağrılmadan ön- ce yığında yeterli büyüklükte yer olup olmadığı kontrol edilmelidir. Grafik işlemleri ile ilgili programı- mızı yazmaya başlamadan önce, ge- lin grafikle ilgili bazı temel prensip- lere gözatalım. Yüksek çözünürlük- lü grafikte, ekranın her bir noktası- na ayrı ayrı hitap etme olanağınız do- ğuyor. Normal yazı ekranında 40x25 karakter genişliğinde bir bölge üze- rinde kontrolunuz vardı. Buradaki her bir karakter de 8 x8 -64 nokta- Commodore dan oluşmuştu. Yüksek çözünürlük- lü grafikte, kontrol olanağımız hem yatay hem dikey pozisyonda sekizer kat artıyor, 320 x 200'lük bir hassa- siyetimiz var. Yazı ekranını tanımlar- ken her bir karakter için bir byte kul- lanıyoruz. Yani tüm ekran için 40 x 25 — 1000 byte kullanmamız gereki- yor. Yüksek çözünürlüklü grafikte her bir noktayı bir tek bitle göstere- biliyoruz. Böylece hafıza gereksinimi- miz, 200 x 320 x 1 — 64000 bit — 8000 byte oluyor. Yazı ekranı normalde 1024'ten 2023'e kadar uzanan bölge- de bulunuyor. VIC çipine gerekli de- ğerleri bildirerek bu bölgeyi bir KByte'lık (5400) adımlarla ilerletebi- liyorsunuz. Mesela, $800, $COO, $1000 gibi. Yüksek çözünürlüklü gra- fik için sekiz KByte'lik bir bölge ge- rekiyor. Bu bölgenin başlangıç adre- si, gene VIC çipinin kullanımı ile be- lirleniyor. Burada dikkat etmemiz ge- reken husus, VIC çipinin bir kerede sadece, 16 KByte'lık bölgeyi görebil- mesi. 16 KByte'lık bölgelerden han- gisini seçtiğimizi belirtmek için CIA çiplerinden birinin bir hafıza birimi- ni kullanmamız gerekiyor. Gelin, hep beraber kendimize uygun bir 8 KByte'lık boş bir bölge bulalım. İlk bakışta, böyle bir yer olarak ilk akla gelen yer BASIC için ayrılmış olan belleğin bir kısmı geliyor. Fakat, biz gene de tembellik etmeyelim. Çünkü, COMMODORE 64'ümüzün tüm belleği RAM ile kaplı. Kullana- cağımız en uygun yer, işletim sistem ROM'unun altında yeralan ve $E000'dan $FFFF'e kadar uzanan RAM belleği olacaktır. BASIC'ten bu bölgedeki RAM'e erişmek müm- kün olmayacaktır. Çünkü, bu bölge- lerin içeriğini okumak için işletim sis- temi ve BASIC yorumlayıcısı ROM'- unu geçici de olsa kapatmamız gere- kecektir. Aklımıza gelen bir nokta da, normal ekran hafızasının grafik modunda renk hafızası olarak kulla- nıldığıdır. Yani ekran hafızasını da aynı 16 KByte'lik bölge içine ($CO00- $FFFF) taşımamız gerekecektir. Ko- laylık olsun diye, hemen bu bölgenin baş kısmını ($CO00-$C3FF) seçelim. Bu bölge, normal şartlarda BASIC tarafından da kullanılmıyor. Renk bilgisi için ayrılan bölgenin bir KByte büyüklüğünde olduğunu gözönünde tutarsak, her bir noktanın ayrı bir renge sahip olamayacağını da farke- deriz. Gerçekte, 8 x 8'lik bir bölgenin 61