Commodore sayı 78, sayfa 38

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 38

1. X (harf sayacı) sıfırlanır. 2. $FB-$FC bileşik değişkeninin (terimi uydurdum, korkmayın. Sadece birlikte bellekteki bir adresi gösteren değişken çifti demek istiyorum) yüksek değerlikli baytını $E2 yapıyoruz. 3. A, yani sayaç 12'ye eşitse ya da 12'den büyükse bu değeri 13 yapıyoruz. Çünkü bu 12'den sonra grafik datası bir sonraki bloğa ($E0XX'se $E1XX'e, $E2XX'se $E3XX'e) taşıyor. 4. Şimdi de düşük değerlikli baytı okuyalım. Harfin grafik datasının nereden başlayacağını belirten tablodan baytı alıyoruz (LDA $C1A0,X) ve $FB'ye yazıyoruz. Grafik baytları işte bu adresten başlayarak yazılacaklar. 5. Harfe ait grafik datası nerede? Kolayca hesaplayabiliriz bunu. Sadece harfin ekran kodunu sekizle çarpıp $D000'a eklememiz gerekli. Bir sayıyı sekizle çarpmak için üç kere ASL kullanmalıyız. Ama değer iki bayta taşabileceği için (129 x 8'e bir bakın). $FE'yi temizleyip, yüksek değerlikli baytı buraya kaydırmalıyız:

LDA $CIB8,X

Bu rutin A'yı sekizle çarpıp, $FD-$FE bileşik değişkenine yazar. Sadece önceden $FE'yi temizlemiş olmalısınız. Daha sonra $FE'ye ekleyeceğimiz karakterin grafik datasının adresini bildirecektir.

6. Y'yi sıfırladıktan sonra, ($FE), Y'yi:

(SFB), Y'ye taşırız. Yani, karakterin ilk baytını sprite'a yerleştiririz. Ama ne yazık ki Y'yi artıramayız şimdi. Çünkü sprite datasında bir alttaki bayt, şu andaki değerin üç fazlasında yer alıyor. Yani ($FE-$EC'ye bir eklemeli, ($FB-$FC)'ye üç eklemeliyiz. Buradaki rutinde bana ait bir keklikle karşılaşıyorsunuz. $C160'a bakın. Tek bir sprite'a ait grafik datasının hiçbir baytı, diğerlerinden farklı bir sayfada yer alamaz. Çünkü bu datalar $XX00, $XX40, $XX80 ve $XXCO adreslerinde yer alabilir sadece. Hiçbir zaman başlayan bir sprite'a ait data $E100'a taşamaz. Bu yüzden $C160- $C163 arasında yer alan dört bayt, gereksiz yere işletiliyor. 7. Şimdi büyük bir problemle karşı karşıyayız. Sayaç olarak kullanabileceğimiz registerimiz kalmadı çünkü. Oysa bize sekize kadar sayabilecek bir değişken lazımdı. Biz de, sekize tam bölünebilen $FD-$FE adreslerinin düşük değerlikli baytının ($ED) ilk üç bi- 'tine bakarız. Başlangıçta bu üç bit sıfır olan (sekizle çarpılan bir sayı ne olursa olsun ilk üç biti sıfır kalır). Sekiz arttıktan sonra bu baytın ilk üç biti gene sıfır olacaktır. Bu ufak noktayı yakaladığımıza göre hemen yararlanalım: $FB'yi alırız, #$07 ile AND'leriz. Eğer sonuç sıfırsa karaktere ait sekiz grafik baytını da transfer ettiğimizi anlarız ve döngüyü terk ederiz. Geçmiş olur böylece. En zor kısımlardan birini oldukça kestirme bir şekilde atlattık çünkü. 8. Rutini bitirdik. Sadece sayacı, yani X'i bir artırıp, $18'e yani 24'e gelip gelmediği-

- ne bakmamız gerekiyor şimdi “Bunu çocukken de yapardık biz!” deyip bu ayrıntıyı da aradan çıkarttıktan sonra... 9. $01'e yazdım ve ROM'lar geri geldi. CLI dediğimde de interrupt kaldığı yerden işine devam etti. RTS dediğinde de BA-SIC'e döndüm. Geriye anlatılması gereken üç kısa rutin kaldı. $C180'deki, $C128'e $E2, $C130'a $E3 yazıyor ve $C120'ye atlıyor. Yazı alanını üst spritelara taşıyor yani. $C18C'deki de $C128'e $E0, $C130'a da $Eİ yazarak bu alanı alt spritelara yazdırıyor ($C120'ye sıçrayarak tabii ki). $C200'da yer alan küçük rutin de, $0314-$0315'i düzeltiyor, VIC'e “Artık interrupt yapma!” emrini veriyor ($DO19- $DOLA- A) ve CIAI'e “Sen de zamanlayıcını çalıştır artık” diyor ($DCOE- 1). Sonra da BASIC'e dönüyor. Eski hızma kavuşmuş, ama border'ı kapalı olana tabii ki. Eh, hâlâ bu yazıyı okuyorsanız, siz gerçekten bu işin ustası olmuşsunuz demektir. En iyisi siz bizi okumaya devam edin. Su Şişesi'nde yazanlara çok güvenmeyin, çünkü Can hep kopya çekiyor cevap verirken(!).

Klavyeyle gezinmek için ← ve → tuşları.