Commodore sayı 64, sayfa 22

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 22

Bilgisayarınız, belli raster satırlarına geldiğinde ($D011 register'ının değeriyle oynamadıysanız, $33, $3B, $43, $4B, ... raster satırlarında) o anda işletilmekte olan komutla işi biter bitmez kontrolü eline alır ve $0400'den bulunduğu satırın kırk katı kadar ileride bulunan kırk baytı okur (satırın 0. satır olduğunu kabul ederek tabii ki). Yani, $33 raster satırına gelindiğinde $0400-$0427 baytları okunur ve karakterleri gösteren devreye iletilir. Tabii ki bu işi yapmak için neredeyse tüm satır boyunca sizin komutlarınızın işletime girmesini engeller. Yazıda ne hakkında konuştuğumu anlatmaya çalışırken satırlar harcamaktansa, şu andan itibaren bu raster satırlarına DMA (Direct Memory Access — doğrudan bellek erişimi) satırları diyeceğim. DMA satırlarına bu adın verilmesinin sebebi, bu satırlarda bilgisayarınızın, makine dili komutlarınızı kısa bir süre için bir kenara bırakıp, doğrudan bellekten değer okumasıdır. İleride daha gelişmiş rutinleri (FLI, veya flex rutinleri gibi) açıklarken bu konunun daha detaylı kısımlarını inceleyeceğim. Bu konuyu bu sayıda daha fazla deşebilecek kadar yerimiz yok ne yazık ki. Zaten bu sayıyı ilgilendiren kısım, $D011 adresinin ilk üç bitiyle ilgili. Eğer, adresinin ilk üç bitinin değerleriyle oynarsanız, ekran normalde başladığı yerden daha aşağıda görünecektir. Fakat bu işlemi genelde tüm ekranı içerecek şekilde yaptığınızdan, çoğunuz bu satır kaydırma işleminin yalnızca DMA satırlarının yerini değiştirdiğini bilmez. Yani bu özelliği kullanarak bir satırı ortasından ayıramazsınız. Bunu yapacak (daha doğrusu yapması gereken) rutini hazırladığınızda, ilk satırın bir yerden tekrar gösterildiğini göreceksiniz (şanslıysanız... Çok daha garip şeyler olabilir). Sizin yapmaya çalıştığınız şey, 2. pikselden sonrasını 3 piksel aşağı kaydırmak olsun. $34 (ikinci piksel bu satırda bulunur) raster satırında $D011 adresine $1B-$43-$1E değerini vermeniz gerekir. Ama bu rutini çalıştırdığınızda yaptığınız tek iş, DMA satırını $33'den $36'ya almak olur. Sonuç olarak C64'ünüz normalde $33'de gösterilmeye başlanan satırı henüz göstermediğini sanır ve $36'ya geldiğinde bu satırı tekrar göstermeye girişir. Yani ekranda bir buçuk tane birinci satır elde edersiniz. Eğer aynı şeyi 5. satırın bulunduğu yerde yapmaya kalkarsanız, elde edeceğiniz şey yarım beşinci satır ve yeniden başlayan ekran değil, bir buçuk beşinci satır olacaktır. Fakat, DMA satırından bir önce, DMA satırının yerini değiştirirseniz ($D011'in değeriyle oynayarak), örneğin $42 raster satırından DMA satırını $45'e alırsanız, $43'de yeni bir satır gösterilmeye başlanmayacak, $45'e kadar olan bölge boş bırakılacaktır. Aslında tam olarak “boş bırakılacaktır” da diyemeyiz çünkü $3FFF adresinin değeri, burada siyah renkle gösterilir (ne demek istediğimi anlamaya çalışmaktansa deneyin ve görün). Yaratıcılığınızı kullanırsanız burada da çok iyi bir demo'luk malzeme görebilirsiniz. Fakat şu anda size bu konuda hiç bir şey söyleyemeyeceğim. Düşünün ve ne yapabileceğinizi bulun... Bizim ekranı kaydırmamız da tam olarak yukarıda anlattığım rutinin mantığını kullanıyor. Yani ilk DMA satırından bir önce ($32 raster satırından) başlayarak, DMA satırını normalden bir aşağı satırda gösteriyor. Daha sonraki satırda da girerek DMA satırını bir aşağı daha alıyor ve bu işlem, kaç satır kaydırmak istiyorsanız o kadar devam ettiriliyor. Sonuçta, ekranımız istediğimiz kadar piksel aşağıdan başlayabiliyor. İsterseniz bu konuyu kafanıza iyice yerleştirmek için, bu sayfada bir yerlerde bulabileceğiniz program listesine bir göz atın. Daha sonra, programın açıklamasını okuyun. Aslında program $C000 adresinden başlıyor, fakat zaten hepinizin bildiği (en azından bu yazıyı takip edenlerinizin) IRQ giriş rutinini yazmaya gerek yok. Fakat rutini incelediğinizde, bu kısımda $FE'ye 1 değerini verdiğimi görünce şaşırmayın diye söylüyorum: $FE, ekranın kaç piksel aşağı kaydırılacağını tutan adrestir ve ilk IRQ sırasında ekranın garip bir yere gitmemesi için bu değeri en başta ayarlamanız şarttır. Gelelim rutinin kendisine. İlk olarak, $FE'nin 0 olup olmadığı kontrol ediliyor ve değeri sıfır ise ekran hiç kaydırılmadan rutinin sonuna sıçranıyor. Eğer bu kontrolü yapmazsak, $FE'yi azaltarak 0'a ulaştırmaya çalışan rutinimiz, $FF bayt kaydırmayı deneyecekti ekranı. Bu kontrolü X register'ında yaparak, $FE'nin değerini doğrudan sayıcımıza almış da oluyoruz. Buradan sonra yaptıklarımız, demin anlattığım gibi bilgisayarınızı hep bir alt satırda olduğuna inandırmak için gerekli. Bir alt satırda olduğunu söyleyen değeri $D011'e yerleştirdikten sonra, bu değeri bir artırıp, ikinci satırı beklememiz gerekir. Fakat böyle bir sayıcı zaten bilgisayarınızda bulunuyor. Evet doğru tahmin ettiniz. RASTER satırını gösteren $D012'de bir sayacımız bulunuyor. Eğer bu adresin değerinin ilk üç bitini yazarsak istediğimiz işi yaptırmış oluruz. Eğer bir monitör programı yardımıyla $D011'in değerini alırsanız $1B olduğunu görürsünüz. İlk üç biti dışında $18 değeri bulunur $D011'de (25 satır-karakter ekranı olduğunu belirtmek için). Biz de $D012'den aldığımız ilk üç biti (AND üç biti izole ediyoruz) $18 ile OR'luyoruz. Fakat, $D011'i ekranın en solundan başka yerlerde değiştirmeye kalkışırsak sonucu tam bir felaket olacağı için (kontrolsüz yapıldığı zaman özellikle), yeni satır gelene kadar bekliyoruz (eski satırın değeri

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