Plazma sayı 4, sayfa 48

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 48

Bu yukarıdaki son paragrafları anlamanızın tek yolu pratik yapmaktır. Ancak bu pratiği yapabilmek için border açmayı da öğrenmeniz gerekmektedir.

Not: Vice emülatörü borderları soldan 16 pixel, sağdan 6 pixel eksik gösterir. TV ekranları da hemen hemen Vice ile aynı sonucu verecektir. Bu örnek Vice ve TV ekranlarında da düzgün görünecek şekilde ayarlanmıştır.

Yan border açma

Aslında yan border açma yapılması gereken açısından incelenecek olursa oldukça basit bir şeydir. Tek yapmanız gereken tarama 39. karakterin bulunduğu bölgeye geldiğinde $d016 adresini değiştirerek borderi daraltmak ve yeniden genişletmektir. Bu sayede border kapanması gereken yerde kapanamayacaktır ve sağ borderda o raster satırı ve sol borderda bir alttaki raster satırı açılacaktır. İşin zor olan kısmı, yan borderları açmak istediğimiz bölge boyunca bu işlemi her satırda yapmamız gerekmesidir. Ayrıca zamanlamalar bu bölgede çok kritik olduğundan normal şartlarda titremeyen (stable) raster rutini kullanmamız gerekir. Ancak birazdan göreceğimiz örnekte bu rutin kullanılmadan yan borderların açılabileceğine tanık olacağız.

Yan border açmakla ilgili bir diğer temel problem ise 8 satırda bir DMA satırlarına denk gelindiği bölgede zamanlamanın yetersiz kalmasıdır. Ancak örneğimizde FLD tekniğiyle bu DMA satırlarından karakter ekranını kullanmamak koşuluyla kurtulabiliyoruz. Zaten amacımız şu an için yalnızca sprite'ları kullanmak.

FLD (Flexible Line Distance)

FLD 80'lerden kalma çok eski bir teknik olmasının yanı sıra FLI, AFLI, Line Crunching ve benzeri birçok grafik modu ve efektin atasıdır. Efekt $d011 adresi üzerine kuruludur. Normalde her sekiz raster satırında bir "bad line" adı verilen raster satırlarına gelinir ve burada ekstra 40 cycle harcanarak iç ekrandaki karakter alanları çizdirilir. Ancak $d011'in alt 3 biti ekranı Y ekseninde kaydırdıkça DMA satırları da ekranla birlikte kayarlar.

Şekil 2.

FLD tekniği de bu özellikten yararlanarak $d011'i her satırda kaydırıp tam DMA oluşacağı yerde yeniden ilk pozisyona getirerek hiç "bad line" oluşmamasını sağlayan tekniktir. Bu sayede ekran FLD'nin uygulandığı bölge kadarlık bir alanda aşağıya kayacaktır. Ancak FLD bölgesinde raster satırları zamanlamalar açısından homojen olacağı için işimiz çok daha fazla kolaylaşacaktır.

Burada dikkat edilmesi gereken nokta satırın hangi bölgesinde $d011'in değiştirileceğidir. Farklı bölgelerde değiştirmek farklı efektler ortaya çıkarabilir. FLD elde etmek için ekranın sol bölgelerinde $d011'i değiştirmek gerekir.

$d017 stretch

Commodore 64'de sprite'ların çözünürlükleri tek renkli 24x21 ve 3 renkli 12x24'dür. Bu çözünürlük değiştirilemez ancak sprite'lar X ve Y eksenlerinde iki kat genişletilebilirler. X ekseni için $d01d adresinde genişletilmek istenilen sprite'ın bitini set etmek ve Y ekseni için ise aynı işlemi $d017 adresinde yapmak gerekir. Eğer 0. Sprite'ı X ve Y'de genişletmek istersek;

lda #$01 sta $d0ld ; X ekseninde genislet sta $d017 ; Y ekseninde genislet

dememiz gerekir. X ekseni için farklı olarak yapabileceğimiz çok bir şey yok, yani ya sprite orijinal boyutunda olacaktır ya da iki kat genişletilmiş halde bulunacaktır.

Y eksenine gelince işler değişiyor. Çünkü her raster satırında $d017 adresine farklı değerler verme imkanımız var. Ve yine her zamanki gibi bir VIC hatasından yararlanarak sprite'ları 2 katdan daha az ya da daha fazla genişletme imkanı elde ediyoruz. Ya da diğer bir deyişle sprite'ların her satırını birbirinden bağımsız olarak istediğimiz kadar genişletebiliyoruz. Bunun için yapmamız gereken öncelikle $d017'de ilgili sprite'ın bitini temizleyip hemen ardından o biti yeniden set etmektir. Örnek olarak tüm sprite'ları birden Y ekseninde genişletmek istiyorsak $d017'e öncelikle $00 değeri verip, ardından $ff değeri vermemiz gerekiyor. Bunun için;

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