Bu sayfadaki yazılar
Sayfanın metni
Sayfa 21
Karakter Pozisyonunu hesapla nucu okun o anda bulunduğu yerin karakter pozisyonunu yazabiliriz. 7) Sprite pozisyonuna ayarla:
TABLO 8
Sprite Pozisyonunuayarla
TABLO 9
Demin de söylediğim gibi, X ve Y koordinatları ekrana göre relatif. Bir sprite için ekranın en tepesinin Y koordinatı 50'dir. Oysa biz bu değeri 0 olarak saklıyorduk. Öyleyse ilk olarak Y koordinatı değerimize 50 eklemeliyiz. Sonucu da sprite 1'in Y pozisyonuna yazabiliriz. Tabii ki X koordinatı işleri gene karıştıracak. Çünkü iki bayt. Ekranın en solunun koordinatı 24 olduğuna göre X koordinatı işleri gene karıştıracak. Çünkü iki bayt. Ekranın en solunun koordinatı 24 olduğuna göre X'e de 24 eklemeliyiz. Ama orijinal değerleri bozmamak için geçici bir değişken üzerinden toplamayı yapıyoruz. İlk olarak geçici değişkenin yüksek baytına X'in yüksek baytının değerini yazıyoruz. Daha sonra X'in alçak baytına 24 ekliyoruz. Bu değeri geçici değişkenin alçak baytına yazdıktan sonra CARRY'nin durumundan yüksek bayta ne yapacağımıza karar veriyoruz. Eğer Carry 1'se, yüksek baytın da bir olmasını sağlıyoruz. Daha sonra alçak baytı X koordinatına yazıyoruz ve yüksek baytın durumuna göre MSB'nin ilk bitinin değerini ayarlıyoruz.
Her şeyi ayarladığımıza göre artık BASIC'e de çalışmak için bir şans tanıyabiliriz. Yani $EA31'e sıçrama zamanı geldi. Tabii ki önce $D019'a kendisinden haberdar olduğumuzu söylemeliyiz. Artık yapacak tek şey kaldı: Joystick'i okumak. En başta iki portu da okumak istiyorduk, fakat bunu yaptığımızda 1 ve 2 tuşlarına her basıldığında okun hareket ettiğini gördük ve hareketi yalnızca Port 2'nin kontrol etmesini sağladık. Aslında uzun uzun kontrollerle gelen sinyalin klavyeden mi yoksa Joystick'ten mi geldiğini anlayabiliriz, ama amacımız olabildiğince kısa programlar yapmak olduğu için bunu yapmayacağız. Port 2'nin değerini kontrol etmek düşündüğümüzden de kolay oldu: İlk olarak yukarı, aşağı, sol, sağ ve ateş değişkenlerini sıfırlamalıyız. Böylece hiçbir değişiklik yapmadan geri dönmemiz joystick'de hareket olmadığı anlamına gelir. Joystick'in pozisyonunu okumak için PORT 2'nin durumunu gösteren $DC00'ı okumalıyız. Bu baytın ilk dört bitinde Joystick'in o anda bulunduğu konum gösteriliyor. Ama ters olarak. Yani yukarı itildiyse sıfırıncı bitin değeri 0 oluyor. 5. bit de ters olarak ateşin durumunu gösteriyor. Joystick'de hareket olup olmadığını anlamak amacıyla ilk olarak $DC00'ı okuyoruz ve & $1F ile AND'liyoruz. Eğer sonuç #$1F'se joystick kıpırdatılmamıştır ve geri dönebiliriz. Ama bitlerden biri bile sıfırsa hangi bitin sıfır olduğunu bulmamız gerekir. Bit tarama kısmında bol bol AND kullanacağımızdan ve bu komut A'nın diğer bitlerini yok edeceğinden, en iyisi PHA'yı kullanıp baytı yığına atmak olacaktır. Daha sonra sırasıyla gerekli biti AND'leyerek, o yöne bir hareket olup olmadığını anlayabi-
Bütün bitler için bu işlem aynen uygulandığı için sadece biri için nasıl yapıldığını anlamamız yeterli olacaktır sanırım. Mesela ateş tuşunu kontrol edelim: Her işlemden önce bir kez PLA ve hemen arkasından PHA kullanışımız dikkatinizi çekmiş olabilir. Biliyorsunuz yığından değeri aldığımızdan bu değeri kaybederiz. Oysa, bir sonraki kontrol için aynı değere ihtiyacımız vardır. Bu yüzden kullandığımız PHA komutuyla değeri yığına geri atarız. Daha sonra baytı $10 (ateş tuşunun 5. bit olduğunu unutmayın) ile AND'leriz. Eğer sonuçta akümülatörde yani A'da 00 olursa ateşe basılmış demektir. Değer sıfırdan farklıysa ateşe basılmamıştır, öyleyse yolumuza devam edebiliriz. Bu kontrol için CMP kullanmaya gerek yoktur. BNE'yi doğrudan kullanırsanız, değer sıfırdan farklı olduğunda sıçrama yapılacaktır. Tüm yönler için gerekli kontrol yapıldığında ana rutine dönerek döngüyü tamamlarız. Programın makine dili çıktısını PROGRAM 1 tablosunda görebilirsiniz. Eğer makine diliyle ilgileniyorsanız programı incelemenizi öneririm. Hatta programı incelerken ara sıra yazıya da göz atarsanız oldukça yararlı olacağına inanıyorum. Tüm BASIC kullanıcılarından özür dilerim, bu ay makine dilini biraz fazla kaçırdım. Bu yüzden gelecek sayının ATÖLYE'sinde sadece bu okun BASIC'ten kullanımı konusundan bahsedeceğim. Şimdilik incelemeniz için basit bir BASIC programını PROGRAM 2 tablosunda yayınlıyorum. Hatırlarsanız geçen ayın atölyesinde, ekranda duran renkli şeritleri açıp kapatmak için ne yapmamız gerektiğini sormuştum. Sorunun doğru cevabını yollayan iki arka-
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 20
- tektiğini anlarız. Değilse zaten diğer kısımlara geçebiliriz. 4) Oku bir sağa almak:
Oku bir sağa al
TABLO 6
Burada yapılacak işler de neredeyse demin ki basamakla aynı. İlk olarak yüksek değerli bayta bakarız. Eğer bu baytın değeri sıfırsa hemen X koordinatını artırmaya girişiriz. Eğer baytın değeri 1'se o zaman alçak değerli baytın 63'ten küçük olup olmadığını kontrol ederiz ($0140 olduğu için, 255 üstündeki değerlerde alçak bayt ancak 64'e yani $40'a kadar çıkabilmeli). Eğer şartlar uygunsa X'i bir artırabiliriz. X'i artırabilmek için, gene ilk olarak alçak baytı artırmalıyız. Eğer alçak bayt sıfır değerini almışsa, yüksek baytı da artırırız ($00FF'den $0100'a gelindiği için). 5) Koordinatı gerekli yere kaydet:
Koordinatı gerekli yere kaydet
TABLO 7
Buradaki işimiz oldukça kolay. İlk olarak X koordinatını olduğu gibi Ateş X koordinatına taşımalıyız (iki baytın da). Daha sonra da X koordinatının karakter pozisyonunu hesaplamalıyız (Bunu yapmak göründüğü kadar da zor değil). İlk olarak alçak baytı üç adet LSR kullanarak sekize böleriz ve bu değeri Ateş X karakter pozisyonu değişkenine yazarız. Daha sonra yüksek baytın değerine bakarız. Eğer 0 ise işimiz kolaydır: Hiçbir şey yapmayız! Ama bu adreste 1 varsa o zaman 256/8'in değerine bakarız. 32 sayısı tam bir bit olduğu için bu değeri doğrudan doğruya Ateş X karakter değeriyle ORA'layarak toplama işlemini gerçekleştirebiliriz. Böyle bir CLC'den kâr ederiz. Daha sonra Y koordinatını Ateş Y koordinatına taşırız. Üç LSR'de burada kullanarak Y'nin karakter pozisyonunu hesaplarız ve Ateş Y karakter pozisyonuna bu değeri yazarız. Böylece ateşe basıldığında yapılacak işleri de bitirmiş oluruz. 6) Karakter pozisyonunu hesapla:
Demin yaptığımız işlemler yalnızca ateşe basıldığında yapılacağı için, şimdi bir kez daha bu işlemleri yapmalıyız. Daha sonra $0-