Commodore sayı 70, sayfa 46

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 46

TABLO-2

LDA —$DO19

BMI $C038 JMP $EASI .,C038 LDX # $06 »CO3A DEX BNE $Co3Ü LDY # $00 .,C0O3F LDA $C028,Y STA $DO20 STA $DO21 STA $DO21 :,C048 LDX H $08 DEX BNE $CO4A NOP

CPY # $05 BNE — $CO3F LDA — #$00 STA STA

INC JMP

bekleniyor, sayaç artırılıyor ve son renk konmamışsa renk koyma işlemine devam ediliyor. Tüm renkler koyulduktan sonra ekran rengi sıfırlanıyor. $D019 adresi daha önceleri de yaptığımız gibi artırılıyor ve interrupt'ın bittiği haber veriliyor. Son olarak da $EA31 adresine sıçranıyor. Burada da intro tekniklerinden biraz saptık gördüğünüz gibi. $EA31 değil $EA31'e sıçrıyoruz ki zavallı bilgisayar istediği gibi işlem yapabilsin. Buraya kadar tüm işlemler makine dilini ilgilendiriyor. Oysa bizim size olan sözümüz, tamamen BASIC kontrollü bir renk şeridi yapmaktı. Ama rutin ne yazık ki sabit bir koordinata renk şeridi koymaktan öteye gidemiyor. Ya da alışık olmadığınız için size öyle geliyor. Bu program, üzerine hiçbir makine dili ek yapılmadan BASIC tarafından kontrol edilebilir. İsterseniz şimdi de BASIC kullanarak bu programın nelerini kontrol edebileceğimizi bir inceleyelim: İlk olarak değiştirilebilecek şey renk şeritleri dışındaki tüm ekranın rengi. Rutinden de görebileceğiniz gibi, beş renklik şerit verildikten sonra ekran ve çerçeve rengi siyah yapılıyor. Bu işi yapan komutlar ise adresinden başlıyorlar. Eğer biz $C055 adresinde bulunan değere bazı POKE'lar verirsek, ekranın rengi artık bu değerin renginde olacaktır. Yani:

SYS 49152

komutundan sonra:

POKE 49237,1

komutunu verirsek renkli şeritlerden başka her yer beyaz olur. Bundan başka renk şeritlerinin bulunduğu tabloyla oynayarak beş rengi değiştirebiliriz. Ekranda şeritler varken 49192-49196 adreslerine şu değerleri verin mesela: 6-14-3-14- 6. Ekran rengi de siyaha ayarlayın. Bu sayede mavi tonlarından oluşmuş bir renk çubuğunuz olur. İsterseniz bu renkleri sürekli değiştirerek parıldayan bir çubuğa sahip olabilirsiniz. Tüm ekranı REVERSE (negatif) boşlukla doldurur, daha sonra da harfleri de REVERSE yazarsanız, renkli şeritler ekranda değil harflerin içinde görünür, bu sayede menü elemanlarınızın harflerinin şeritli şeritli olmasını sağlayabilirsiniz. Ama bu sefer çerçevede yer alan renkler kötü bir görüntü oluşturacağından, rutinde bulunan tüm

$D020'leri $D021 gibi bir adrese çevirin. Mesela $D027 yaparsanız, bu bölgedeki birinci sprite'ın içinden renk şeritleri geçer. Bu kadar şey anlatmama rağmen, bu rutin hâlâ menü elemanların seçmekte kullanılamaz. Çünkü ekranın tepesinde sabit bir şekilde duruyor. Ne yapmalıyız ki bu garip şerit yerinden oynasın? Bu sorunun cevabını RASTER interrupt yapan herkes biliyor aslında. RASTER interrupt'ı yaparken interrupt'ın bizim istediğimiz satıra gelindiğinde yapılmasını $D012 adresine yazarak sağlamıyor muyduk? Bu işi interrupt adreslerini ayarlarken, ya da interrupt'ın içinde ya da herhangi bir programdan yapabiliriz. Bu konuda bizi kısıtlayabilecek herhangi bir kural yok. Öyleyse serbest serbest dolaşırken:

POKE 53266,66

komutunu verirsek ne olur? Tabii ki interrupt rutini verdiğimiz RASTER satırına gelindiğinde devreye girer. Kısacası renkli şeridimiz 66 RASTER satırına kayar. Ama burada bir büyük problemle karşı karşıyayız: renk şeritleri ancak belli bir konumda başlarsa DMA satırlarını atlatabiliyor (bu rutin DMA satırında RASTER interrupt yapmalıdır mesela). Eğer bu konumdan farklı bir yerde başlarsa mutlaka renkler sağa sola oynar, sabitlik bozulur ve çok kötü görüntüler oluşur. Bu kötü görüntüleri engellemek için RASTER satırını belli bir kurala göre ayarlamalıyız. Bu kuralı rutinin başlangıç RASTER satırından çıkarabiliriz. Genel olarak, n. RASTER satırında çalışan her rutin n+8. RASTER satırda da hatasız olarak çalışır (çok harika zamanlamalarla uğraşmıyorsa ve üzerinde sprite yoksa). Bu kural en azından buradaki program için geçerli. Rutin orijinal olarak $32—50 RASTER satırından başlıyor ve 0. satırda yer alıyor. O zaman bu şeridi n. satıra koymak için:

POKE 53266,504 9*8

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