Bu sayfadaki yazılar
Sayfanın metni
Sayfa 16
Sıra Pratiğinde Buraya kadar sağ salim gelebildiyseniz, artık gerekli tüm temel bilgilere sahipsiniz demektir. Yazının kalanını gönül rahatlığıyla okuyabilirsiniz. Programa girişmeden önce programımızdan neler istediğimizi bir düşünelim: 1. Grafik ekranını açma: Ekranı grafik moduna geçirip, $E000-$FFFF arasının görünmesini (seçtiğimiz renk bölgeleriyle) sağlar
2. Grafik ekranını kapatma: Ekranı son bulduğu haline çevirir. Buna son kullanılan BANK'e dönmek de dahil edilmeli. 3. Grafik ekranını temizleme: $E000-$FFFF arasını temizleyip renkleri ayarlar. 4. Renk ayarlama: Üç multi color renginin 16 renk içinde hangileri olduğunu belirler. 5. Nokta basma: Üç multi color renginden biriyle nokta basar veya noktayı siler. Bu temel işlemleri yerine getirebilen bir program yazmak bile bu ayki yerimizi dolduracağından, programı geliştirmeye açık olarak tasarlamalıyız. Bunu yapmanın en kolay yolu başlangıç adresine bir “Jump Table” yani sıçrama tablosu koymaktır. Bu tablo tamamen JMP $C100, JMP $C149 vb. komutlardan oluşur. Bu sayede hem 256/3 komutluk bir program için yerimiz olur, hem de komutlar SYS49152, SYS 49155,... gibi sıralı adreslerle çağrılırlar. Biz şimdilik beş tane JMP $C100 koyalım en ba-
şa. İlk iki komut hepsi içinde en kolay olanları. İlk komutta yalnızca gerekli VIC registerlerini değiştirmemiz gerekiyor. Ama daha sonra bıraktığımız yere dönebilmek için bu registerlerin ilk değerlerini bir yerlerde saklamakta yarar var. Şimdilik bu değerleri $C0F0'dan itibaren saklayalım, daha sonra programın bitiş yerine alırız (tüm bu gariplikleri, programı adam gibi bir ASSEMBLER kullanmadan, doğrudan monitörle yazdığımızı farz ettiğim için yapıyoruz). VIC adreslerinden gerekli olanları değiştirirken, esnek bir yapı oluştarmak için baytların içinde yalnızca bize gereken bitlerle oynamalıyız. Bunu yapmak oldukça kolaydır. Önce değiştirmek istediğiniz biti bayttan çıkarırsınız (yani baytı 255-2^(bit no) ile AND'lersiniz). Mesela 7. biti değiştirmek istersek LDA bayt AND ORA programını kullanmalıyız. Bu sistemi kullanarak grafik ekranını açarız ($D011), çok renk moduna gireriz ($D016) ve video matrisinin yerini ayarlarız ($D018). Video matrisi, çok renk modundayken üç renkten ikisini belirlemek için kullanılır. Matrise ait her baytın ilk dört biti bir renk, ikinci dört biti diğer renk için kullanılır. $D800'daki renk RAM'inde de üçüncü ve son renk bulunur. Bu renk RAM'i de VIC'e ait bir bellek olduğundan, altında normal bir RAM bulunur (renk RAM'i adresleri sadece dört bit tutabilir). Ben kafanızı karıştırabilmek için $D800'ın altına matrisi yerleştirmeyi uygun buldum. Bu sayede $D800 adresinde her üç renk de tutulmuş oluyor (ilk iki renge ulaşmak için ROM'ları kaldırırsanız). İsterseniz $D018'e bu iş için yazmamız gereken biti birlikte hesaplayalım: $D800-$C000 = $1800 6144
6*16 = 96 Bir de grafik ekranı $E000'a almayı eklersek (3. bit): sonucunu buluruz. Kısacası $D018'i sakladıktan sonra LDA #568 STA $D018 komutlarıyla renklerin yerini ayarlayabiliriz. Ekranı eski haline çevirmek deminkinden daha kolay. Sadece sakladığımız baytları alıp gerekli adreslere yazarsak, grafik ekranını açmadan önce grafik durumu neyse aynen geri alınır (renkler dışında). Geldik üçüncü kısma, yani ekranı temizlemeye. Ekranı temizlemeye girişmeden önce bir şey daha öğrenmelisiniz: Eğer ROM'lar yerindeyken ROM'da olması gereken bir adrese bilgi yazmaya kalkarsanız ROM'un altında yer alan RAM'e yazarsınız bilgiyi. Bu yüzden ekranı temizlemek için ROM'ları yerinden kaldırmaya gerek yok. Kendini değiştiren bir kod sayesinde $E000-$FFFF arasını $00'la doldurmak ekranı temizlemek için yeterli olacaktır. Daha sonra $D800'a
(ROM'lar yerinde durduğuna göre renk RAM'ine) son seçilen renk doldurulur, ROM'lar kaldırılır ve $D800'a matris renkleri doldurulur. İlk ekran temizlendiğinde olarak belirlenmiş olan bu renkler ilk renk değiştirdiğinizde verdiğiniz değerleri alırlar. Bundan sonra her ekran temizlendiğinde son olarak kullandığınız renklerle temizlenir ekran. Dördüncü kısımda, yani renk değiştirme kısmında kullanıcıdan bilgi alınması gerekiyor. Bunu yapmak için virgül kontrolü ve sayı alma rutinlerini kullanabiliriz. Art arda verilen üç JSR ile $14-$15 adreslerine klavyeden girilmiş olan sayıyı düşük-yüksek değerlikli bayt formatında alabiliriz. Bu adresler sırasıyla şu isimleri alırlar: CHKCOM - $AEFD: virgül kontrol eder, yoksa SYNTAX ERROR verir. FRMNUM - $AD8A: Sayıyı alır. INTEGER - Integer'e çevirir ve $14-$15'de saklar. Bir de sayı istediğimizden büyükse ILLEGAL QUANTITY ERROR'u yaptırmak için $B248'e sıçrayabiliriz. Renk için üç rengi de klavyeden aldıktan sonra ekran temizleme rutininin renk adreslerine yazarız, yani LDA STA $D800,y İlk rengi dört bit kaydırıp ikinci rengi bununla ORA'larsak matrise yazılacak rengi buluruz. D800'da saklanan renk zaten dört bittir ve doğrudan yazılabilir. Renkleri yazma işlemi de bitince ekran temizlemenin sonundaki renk yazma rutinine sıçrayarak bu renkleri aktif hale getiririz. Bir nokta koymak için kullanılan sistemler oldukça karışık olduğu için, isterseniz bu rutini de gelecek sayımıza bırakalım. Yani gelecek sayıda detaylı olarak nokta koyma işleminin nasıl yapılacağını, formüllerin nasıl makine diline uygulanacağını, yavaşlığın sebeplerini ve bu yavaşlıktan ne gibi sistemlerle kurtulabileceğimizi anlatacağım. Bu ayın programını ve bu programı kullanan BASIC örnek programlarını döküm ekinde bulabilirsiniz. Bu programlar şu komutları kullanıyor: SYS 49152: Grafik ekranı. SYS 49155: Normal ekrana dönüş. SYS 49158: Ekranı temizleme. SYS 49161,R1,R2,R3: Renk ayarlama. R1, R2 ve R3 0-15 arası renkleri belirtir. SYS 49164,X,Y,RN: X,Y koordinatlı noktayı R rengine geçirir. Eğer R = 0 ise noktayı siler. Gelecek ay görüşmek üzere hoşçakalın.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 17
epinize merhaba. Hatırlayacağınız gibi, ilk sayımızda bilinmesi mutlaka gerekli olan birkaç ROM adresini verdikten sonra, ROM aritmetiğinin teorisini vermeye başlamış ve geçen sayıya kadar bu konu üzerine eğilmiştik. Geçen sayıda tam sayıları ondalık sayılara çeviren rutinleri de anlattığımıza göre, ROM'da bulunan işlemlerin nasıl kullanıldığını anlatmaya sıra geldi. İlk olarak toplama, çarpma gibi basit işlemlerin adreslerini anlatmayı düşünüyorum. Daha sonra, yerimiz kalırsa, değişkenlere nasıl erişeceğimizi ve karmaşık işlemleri nasıl gerçekleştireceğimizi anlatacağım. Daha sonra değişkenlerin makine dili yardımıyla nasıl kullanılabileceğine bir göz atacağız. Eğer bu hızla devam edebilirsek, iki aya kalmadan tüm fonksiyonları makine dilinden kullanmayı öğrenebilirsiniz. Tüm bu teknik bilgilerin yanı sıra bazı örnek programlar yardımıyla bilgilerinizi pekiştirmeyi de unutmayacağız tabii ki. Artık asıl konuya girebiliriz: Temel Aritmetik İşlemler
BASIC yorumlayıcısının beş adet temel işlemi vardır: Toplama, çıkarma, çarpma, bölme ve üs alma. Bu işlemlerin her birinin iki adet argümana (elemana) ihtiyacı vardır. Temel fonksiyonlardan birini kullanacağınız zaman ilK argümanı FAC'a, ikincisi de ARG'a yerleştireniz gerekir. Fonksiyonu çağırdıktan sonra sonucu FAC'da bulabilirsiniz. Bu temel işlemlerin adresleri şöyledir:
TOPLAMA FAC:-ARG4*FAC $B86A ÇIKARMA FAC:-ARG-FAC $B853 ÇARPMA FAC:-ARG'FAC $BA2B BÖLME — FAC:-ARG/FAC ÜSALMA FAC:-ARG.FAC $BF7R
Vedat Hallaç
Bu rutinlerden herhangi birini çağırmadan önce FAC'ın üssünü ($01) A registerine (akümülatöre) yerleştirmeniz gereklidir. Eğer bu üs sıfırsa, ROM FAC'da bulunan sayının da sıfır olduğunu kabul ederek işlem yapacaktır. Bu yüzden tüm işlemlerden önce A'da ne bulunduğunu ayarlamayı unutmamalısısa, veya bölme işlemlerinizde DIVISION BY ZERO ERROR mesajı veriyorsa, A'ya doğru değeri yerleştirmediğinizi anlayabilirsiniz.
İsterseniz monitör programımızı kullanarak iki sayıyı birbiriyle çaryalım:
74132? 7583 E0 00 00 00 00 1384 DO 00 00 00 00
Yukarıdaki değerleri FAC #1 ve FAC 12'ye yerleştirin ve çapma rutinini çalıştırın: