Bu sayfadaki yazılar
Sayfanın metni
Sayfa 23
X koordinatları. Bunları sırası geldikçe, doğrudan doğruya sprite'ların x koordinatlarına koyarak yıldızları değişik yerlerde gibi gösteriyoruz. Fakat bu arada düzeltmemiz gereken bir şey kalıyor. Biliyorsunuz $D010 adresinde x koordinatlarının 9. bitleri yer alıyor ve ancak bu biti kullanarak ekranın tamamında sprite gösterebiliyoruz. Bu yüzden her x koordinatı için bir de $D010 değeri ayarlamamız gerekiyor. Bu değerleri de $C16A adresinden okuyoruz.
Lda — $Cİ2A,X Sta $DO27
Yıldızların üç boyutlu olarak kaydıklarını söylemiştim. Bu efekti yaratmanın en güzel ve kolay yolu arkada olması gereken yıldızların rengini öndekilerden daha koyu yapmaktır. Bunun için de her yıldızın rengi adresinde bir tablo olarak saklanır.
Lda $COAA,X Ade — $COBA,X Sta $COAA,X
$C0FA adresinde her yıldızın x koordinatının artma miktarı, daha açık bir ifadeyle hızı saklanıyor. Bu sayede üç boyut efektini, arkada olması gereken yıldızları daha yavaş kaydırarak pekiştiriyoruz.
Lda $CIGA,X Ade # $00 And
Sta
Şimdi C16A'daki değerlere 0 eklemek de nereden çıktı? Eğer Adc komutuna bakarsanız, eklediği her sayıya bir de elde flag'ini eklediğini görürsünüz. Yani yıldızlar x -255'den daha büyük bir değer alınca elde bayrağı 1 olur ve bu sayede C16A,X'in değeri 1 artırılır. Bu adreslerin değerlerini 0 ve 1 ile kısıtlarsak (and #$01) yıldızlar 0-512 arasında bir x koordinatı alabilirler.
İny İny Iny
Bir sonraki yıldız, bunun üç raster satırı aşağısında olsun istediğimiz için, Y değeri üç kere artırılıyor. (daha değişik bir sayıda satır beklemek isterseniz, sprite datalarını değiştirin ve buradaki Iny sayısıyla oynayın. Sakın üç satırdan aşağı inmeyin, bu derece basit bir rutinle daha sık yıldız sürüsü elde edemezsiniz.)
Inx Cpx Bec Bekle Inc $DO19
Gösterilen yıldız sayısını bir artırıyoruz ve bu değer 62'den küçükse, bir yıldız daha gösteriyoruz. Eğer 62. yıldız da gösterildiyse, interrupt'tan çıkmaya hazırlanıyoruz. Şimdi de rutinin size söylemediğim sürpriz kısmına geldik. Eğer hâlâ bu yazıyı okuyorsanız bu özellikten yararlanabilecek kişiler arasında yer alacaksınız.
Ldx # $7D Ldy — #$69 Lda $CO4A Beg Atla Ldy Ldx $FD Atla Six $C0O79 Siy — $C082
Evet işte sürpriz rutinimiz burada. Eğer $C04A değerini değiştirirseniz sürprizimizle karşılaşırsınız. Artık bunun ne olduğunu ve nasıl yapıldığını anlamayı size bıra- Jmp $EA31 Ve işte o sihirli komutla interrupt'ı bitiriyoruz. Eğer bu rutinde yıldız hız ve renklerini değiştirmek isterseniz, yerlerini belirten şu basit listeye başvurun.
$C0AA-$C0E9; Yıldız koordinatları. $C0BA-$C129: Yıldız hızları. $C12A-$C169: Yıldız renkleri $C16A-$C1A9: Yıldız x koordinatlarının 9. bitleri.
Eh bu aylık bu kadarı yeterli olur sanırım. Gelecek ay görüşene kadar hepiniz hoşçakalın.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 22
VEDAT HALLAÇ Merhaba, | Bu ay makine dilinin püf noktaları köşemize oldukça ilginç ve ekran doldurucu özelliğe sahip olan bir rutinin açıklanmasıyla devam ediyoruz. Şu ana kadar verdiğimiz rutinlerin birleşmesiyle rahatlıkla bir intro yapabiliriz fakat rutinlerin hepsi aynı bellek alanında ve hepsi de interrupt'ı kendi amacı için kullanıyor. Bu problemleri nasıl halledeceğimizi ve açıkladığımız bütün programcılıkları nasıl birleştireceğimizi gelecek aya bırakıyorum. Bu ay açıklanacak olan rutin ekranın 2. satırından son satırına kadar olan bölgede onlarca yıldızı değişik derinliklerde kaydırıyor. İşin en ilginç tarafı 62 adet yıldızı sadece tek bir sprite kullanarak ve ekranı hiç etkilemeden kaydırması. Tabi ki bu rutin bir mucize yaratmıyor. Sadece C-64'ün sprite'ları konusunda ufak bir bilgiyi kullanıyor. Commodore sprite'larının en büyük özelliği, herhangi bir satırda gösterilmeye başladıktan sonra yirmibir raster satırı boyunca o sprite'ın y koordinatına ne yaparsanız yapın, sprite'ın tamamı gösterilmeden yeni bir yere geçemiyor. Bu sayede bir sprite'ı 20. raster satırına gösterip, 24. (mesela) raster satırında y koordinatını 41 yaparsanız ve 10. raster satırında bu değeri tekrar 20 yaparak bu işleme devam ederseniz, aynı sprite'tan alt alta iki tane elde edersiniz. Programımız da bu özelliği kullanarak 1. sprite'ı yaklaşık olarak 9 kere ekrana çıkarıyor. Gerekli her noktada x koordinatını da ayarlayınca 62 tane yıldız ekranda rahatça gösterilebiliyor. Eh, bu kadar masaldan sonra programın nasıl çalıştığına bir göz atalım. Programın en başında, sprite dataları (sadece belli yerlere birer nokta koyuluyor.) ve bilinen yöntemlerle interrupt'lar ayarlanıyor. Interruptlar tam 42 raster satırında (2. karakter satırı) başlıyor.
Başta Lda — $DO15. Ora #501 Sta $DO15
İlk iş olarak 1. sprite'ın gösterileceğinden emin oluyoruz. (Diğer sprite'ların durumu ne olursa olsun, 1. sprite'ı açıyoruz.)
ZA te'i açıyoruz.)
Ldx — # $00
Kaç tane yıldız basılmış olduğunu x registerinde saklıyoruz. Şu anda hiç yıldız yok...
Bekle Cpy $012 Bne Bekle
Yıldızların ilk görüneceği raster satırına kadar bekliyoruz.
Sty $DOO1
İşte onca yıldızın görünmesini sağlayan hile burada gizli. Eğer her üç satırda bir (sabredin, birazdan üç satırda bir olduğunu göreceksiniz) sprite'ın y koordinatına o raster satırının değerini verirsek, sprite'ın gösterilmesi biter bitmez aynı sprite tekrar gösterilmeye başlar. Bu sayede istediğimiz kadar sprite'ı alt alta dizebiliriz.
Lda — $SCOAA,X Sta $DO0OO Lda — $DO10 And —# $FE Ora — $CIGA,X Sta $DO10
$C0AA adresinde bulunan değerler, yıldızların anlık