Bu sayfadaki yazılar
Sayfanın metni
Sayfa 49
lda #$00 sta $d017 lda #$£f sta $dül17
yazabiliriz. Ancak daha pratik ve genel bir tanım ile "eor" komutunu kullanarak;
lda #$00 sta: Şdül7 eor sta $d017
Şekil 3.
dememiz daha uygun olacaktır. Elbette ki her satırda $00 değeri vermemiz demek yalnızca sprite'ın en üst satırının uzaması demektir. Dolayısıyla istediğimiz uzunluğa ulaştığı yerde $00 yerine $ff değerini vererek bir sonraki sprite satırının görüntülenmesi sağlanabilir. Nedeni ise $ff'in $ff ile eorlanmasının sonucunun $00 olmasıdır. Kısacası uzama bu noktada sona erecektir. Her satırın uzama miktarını belirlemek için en mantıklı yol bir tablo kullanmaktır. Yani;
Uzatma rutini de temelde aynı mantıkla çözülebilir. Örneğin 5 pixel yüksekliğindeki bir resmi 11 pixele uzatmak istediğimizi varsayalım. Bu durumda yukarıdaki şekil bize her bir satırın kaçar kez tekrar etmesi gerektiğini verecektir. Yani;
ldx #$00 Loop:
lida streteh,x Sta $d017 eor sta $dül17
inx epx #63 bne loop
stretch
!byte EE EE
!byte $00,$00,$££,$00,$00,$££,$00,$00
Yukarıdaki örnek sprite'ı tam 3 kat uzatacaktır.
Şimdi bir düşünelim. Bizim asıl elde etmek istediğimiz efekt ne? Sprite'ların orijinal yüksekliği 21 pixeldir. 21 pixelden başlayarak Şekil 4. Orijinal resim iç ekranın toplam yüksekliği olan 200 pixele kadar bu sprite'ları yumuşak bir şekilde uzatmak oldukça güzel görünecektir. Ancak bu iş için 21 ve 200'de dahil olmak üzere toplam 180 farklı tabloya ihtiyacımız olacak. Bu tabloları nasıl hesaplatacağız? Şimdi bu konuyu inceleyelim.
Uzama tablosu üretme
Eğer bu güne kadar çizgi (line) rutini kodlamışsanız bu problem size yabancı gelmeyecek demektir. Çizgi çekme rutininde ekrandaki A(x1,y1) ve B(x2,y2) noktaları arasında hangi adımlarla ilerlemeniz gerektiği sorusu temel problemi oluşturur. Bu konuda en çok kullanılan yöntemler Bresenham'ın çizgi algoritması ve bu algoritmanın üzerinden geliştirilmiş diğer algoritmalardır.
Klavyeyle gezinmek için ← ve → tuşları.
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;