Bu sayfadaki yazılar
Sayfanın metni
Sayfa 44
Normal olarak, elektron ekranın alt kısmına, çerçevenin olduğu yere geldiği zaman bilgisayar hemen ekranın kapatılması için gerekli işlemleri yerine getirir. Bu işlemler, tüm görüntü birimlerinin gösteriminin kesilmesi ve satırların tamamının $D020, yani 53280 adresinde bulunan renkte gösterilmesini sağlar. Bizim yapmamız gereken şey, bilgisayarın kafasını elektron bu satıra gelmeden önce karıştırmaktan ibarettir. Eğer ekran 24 satırsa, 24. satırın sonunda bilgisayar ekranın kapatılması ve çerçeve işlemlerinin başlaması için emir gönderir ve bir daha elektronun yerini kontrol etmez. Ve ekran 25 satır gösterim modundayken 24. satırı geçtikten sonra 24 satır gösterilmesi söylenirse, ancak gelecek taramada ekran 24 satıra indirilir. Bu iki kuralı dikkatle okursanız, şu anda çerçeveyi ortadan kaldırabilecek kadar bilgiye sahip olduğunuzu fark edersiniz. Yapmamız gereken tek şey, 25 satırlık bir ekranda 25. satırın başlangıcını biraz geçtikten sonra ekranı 24 satıra indirmekten ibarettir. Bu işi yaptığınız zaman bilgisayarınız 25. satırın başında ekranı kapattığını sanacak ve elektronun 25. satırın sonuna gelip gelmediğini kontrol etmeyecektir. 25. satırın başını da geçmiş olduğunuz için ekran kapatılmayacak ve borderlarda da normal ekran gösterilmeye devam edilecektir (yalnızca spritelar görünse de). Gelecek taramanın sonunda da aynı hileyi yapabilmek için (Şu ana kadar yaptıklarımızla yalnızca bir tarama için alt ve üst border'ı açabiliriz. Bir sonraki taramada 24 satırlık bir ekran normal sistemle gösterilir işi burada bitirirsek) 25. satırın sonuna geçtikten sonra herhangi bir yerde ekranı 25 satıra bu işlemi gelecek taramalarda da tekrarlayabiliriz. Bütün bu işler yalnızca beş-altı raster satırı yiyecektir. İyi de çerçeveyi ortadan kaldırmanın ne gibi bir yararı var? Bu sorunun cevabını eski 64'çüler bilirler. PAPERBOY adlı oyunda bu özellik kullanılmıştı. Bu sayede tüm ekran oyuna ayrılırken, hak sayısı, skor gibi bazı gerekli bilgiler alt ve üst çerçevenin olması gereken yerlere yerleştirilebilmişti. AMICA PAINT adlı çizim programı da tüm ekranı sizin çizimleriniz için ayırırken, nokta koordinatı, çizim modu gibi gerekli bilgileri alt ve üst çerçeveye yerleştirir. Kısacası bu işlem genelde daha fazla görüntü alanı sağlamak amacıyla kullanılır. Eğer şimdiye kadar neden alt ve üst kısımların yok olduğunu anlamadıysanız önce Tablo 1'deki şekilleri inceleyin. Eğer gene de anlamadıysanız bundan önceki üç paragrafı daha dikkatli okuyun. Çerçeveyi ortadan kaldırdığınızda ilk olarak alt ve üst kısımların $D021 yani 53281'de tutulan renkle aynı olduğunu fakat içinde siyah renkli şeritlerin bulunduğunu görürsünüz. Aslında bu bölgede sade-
ANA |
ce sprite gösterilebileceğini söylemek pek de doğru olmaz. Bu şeritler karakter ve grafik ekranlarının çerçevede bulunan karşılığıdır. Ama yalnızca $3FFF (bulunduğunuz VIC BANK'inin son adresi) adresinde bulunan baytın bitlerini gösterebilirsiniz burada. Yani genel olarak bu çizgiler kötü görüntü oluşturmaktan başka bir işe yaramaz. Çizgilerin siyah olan renklerini değiştirmenin de bir yolu olmadığı için en iyisi bulunduğunuz VIC son adresinin değerini devamlı olarak 0 tutmaktır. Açtığınız bu kısımlara sprite koymak da büyük bir problem sayılabilir aslında. Çünkü Y koordinatlarının en büyük değeri 255'tir. Oysa ekranın en altı yaklaşık 255'te başlar. Yani asıl kısımda gösterilecek sprite'ların Y koordinatını tam olarak belirtmenin bir yolu yoktur. Bu yüzden 0-$30 (48) arası bir değer vererek altta gösterdiğiniz sprite'lar ekranın üstünde de görülecek ve hoş olmayan görüntüler yaratacaklardır. Bu kötü görüntüden kurtulmak için raster satırı $0000 olduğu zaman (bu kontrol size kalmıştır) ya sprite'ları kapatırsınız ya da tanımlarını ve x-y koordinatlarını değiştirerek ekran içinde de sekiz sprite kullanabilirsiniz. Ama bu işi yaptığınızda, ekranı 24 satıra indirdiğiniz yerde sekiz sprite'ın (ya da kaç sprite kullanacaksanız) border tanım ve koordinatlarını vermeniz gereklidir. Yani yapmanız gereken işler sırasıyla şöyledir: 1. $00FA raster satırına gelmeyi bekleyin (25. satırın oralarında bir
| yer)
2. Ekranı 24 satıra indirin ($D011'in 3. bitini sıfırlayın. #$13 değerini D011'e vermeniz 24 satırlık bir karakter ekranı elde etmeniz için yeterlidir). 3. Alt Border'da bulunacak sprite'ların x-y koordinatlarını ve görüntü adreslerini bilgisayara bildirin. 4. $D011'in 8. bitinin 1 olmasını veya $D012'nin 0 değerini almasını bekleyin (ikisi de raster satırı $0000'a kadar bekler). 5. Ekranı tekrar 25 satıra çıkarın (#$1B verebilirsiniz.) 6. $D011'in 8. bitinin 0 olmasını veya $D012'nin 0 değerini almasını bekleyin (ikisi de raster satırı $0000'a kadar bekler). 7. Ekran içinde ve üst borderda kullanılacak sprite'ların x-y koordinatlarını ve görüntü adreslerini bilgisayara bildirin. 8. Birinci basamağa girin. Bu işlerin hepsini yapan bir program vermeyeceğim. Yalnızca border'ı açan bir programın üzerine tepede anlattığım olayları ekleyebileceğinize inanıyorum. Aslında sizin merak ettiğiniz şeyin, yan çerçevenin nasıl yok edileceği olduğunu biliyorum. Buraya kadar anlattıklarımı yeterince iyi takip edebildiyseniz aynı sistemin çok daha iyi bir zamanlamayla kullanılması halinde yan tarafların da açılabileceğini fark etmiş olmanız gerekir. Yalnızca 24-25 satır hilesi değil de 38-40 kolon hilesi yapmamız gerekir bu iş için. Ama burada çok güçlü bir düşmanla karşı karşıyasınız: Bilgisayarınız dikey olarak elektronu istediğiniz satırda yakalayabiliyor, ama yatay olarak ve tam 39. kolonda yakalattırmak her babayiğidin harcı değil. Yani belli sayıda NOP ve BIT $EFA kullanarak gerekli yere getirebileceğinizi düşünüyorsanız haklı sayılabilirsiniz, ama tam değil. Çünkü yatay olarak elektron yakalamaya çalıştığınız zaman bir kararsızlık ortaya çıkar ve elektronu yatay olarak yakaladığınız yer 1 veya iki karakterlik bir bölge içinde sağa-sola oynar. İlk olarak bu kararsızlığı yok edebilmelisiniz ki her satırın tam 39. kolonunda ekranı 38 kolona indirip hemen sonra kırk kolona çıkartabilesiniz. Bundan başka ekran içinde $32, $3A, $42, $AA gibi satırda CPU'nun zamanının bir kısmının verildiğini biliyoruz. Bu da tüm zamanlamamızı çökertecek ve yan tarafların yalnızca 7 piksel açılmasını sağlayacaktır. Hoş, bu problemi border açtığınız bölgedeki ekranı aşağı kaydırarak halledebilirsiniz, ama gene de yatay kararsızlığı yenmeniz çok çok zordur. Bu
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 45
Basamakları Sıfırla
Sayı >>10000 iken
SayızSayı-10000
Onbinler-Onbinler--1
—
Sayı >>1000 iken
Sayı—Sayı-1000 Binler-Binler41
Sayı >—>100 iken
Yüzler-Yüzler4İ
Sayı >>10 iken
Onlar-Onlar4 1
Birler-$304Sayı
Rakamları Yaz
Konuda verebileceğim son püf noktası da şu: Yatay border açmaya kalkarsanız önce sprite'ları hep duracakları Y koordinatlarına koyun ve açın, sonra border'ı açmaya çalışın. Aksini yaparsanız, ilk sprite'ı koyduğunuz anda zamanlamanız çöker.
Şimdi de gelelim mektuplarda sorulanları cevaplamaya: Levent Ünal'ın problemi sayıları hexadecimal'den decimal'e çevirmekle ilgili. Bu işi yapabilecek bir rutin yazmış, fakat rutin oldukça yavaş işliyor ve 50000 gibi bir sayıyı çevirirken oldukça bekliyor. Bu rutinin ana problemi algoritmasında, programda ondalığa çevrilecek sayı bir azaltılırken, basamak sayısı da bir artırılıyor ve bu artan sayının ondalık değerlerle karşılaştırılması sonucunda sonuç bulunuyor. Yani 50000'in ondalık değerini bulmak için en az 50000'den geriye saymak gerekiyor. Öyleyse ilk olarak programa yeni bir algoritma bulmak gerekiyor. Program sadece iki baytlık yani 0-65535 arası sayıları çevirebilsin diyerek işe başlıyoruz. Bu durumda en fazla on binler basamağı olacaktır. O zaman ilk olarak sayının on binden büyük olup olmadığını kontrol etmeliyiz. Eğer on binden büyükse sayıdan on bin çıkartıp on binler basamağını bir artırıyoruz. Bu basamakların doğrudan doğruya sayıların ASCII değerlerini vermesi için hepsini en başta $30 - "0" yapıyoruz. Bu değeri dokuz kere artırdığımızda $39 - "9" değerini elde edebiliriz ki, bunları doğrudan doğruya ekrana basmak mümkündür. Her neyse, konuyu dağıtmayalım. On binler basamağını bir artırdık-