Bu sayfadaki yazılar
Sayfanın metni
Sayfa 23
Y'de bulunuyor. Ve biz $D012'nin değeri Y'ye eşit olduğu sürece beklemede kalıyoruz.) ve ilk iş olarak demin hesapladığımız değeri $D011'e yazarak DMA satırını bir aşağı alıyoruz. Aslında bu program, benim tembelliğimden dolayı tam olarak çalışmıyor. Yani 1 satır kaydırılması gerekirken, beş-altı satır kaydırıyor. Çünkü $D012'nin değerini doğrudan doğruya ele aldığımızda, DMA sadece bir satır kaymıyor. İlk olarak $38 gibi kontrolsüz (ve şu anda hesaplamaya üşendiğim) bir raster satırından başlıyor ekran. Oysa, $D012 değerine CLC ADC $07 komutlarıyla 7 eklesek ve AND, OR işlemlerini daha sonra yapsak, ilk DMA satırı tam olarak $34 raster satırına denk gelecekti ve bir satır kaydırmak istediğinizde, ekran bir satır kayacaktı. Program çoktan baskıya gittiği için bu hatayı düzeltmeyi size bırakıyorum. Programımıza geri dönelim. Bu $D012'yi $D011'e taşıma işlemi $FE'de belirtilen kadar satır yapıldıktan sonra, ekranın 9. satırını sabit bir noktaya getirecek olan rutine giriş raster satırını belirliyoruz. Oynayan satır sayısı sekiz olduğuna göre, 88 - 64 = $40'ı $FE'nin değerine ekliyor, bu değeri de interrupt'a giriş raster satırı olan $2E'ye ekliyoruz. Bu hesapla yaptığımız iş $FE'de belirtilen miktar kadar kaymış olan ekranın sekizinci satırının son pikselinin, raster satırı olarak yerini belirlemek. Bu sayede, bu noktadan başlayarak, dokuzuncu satırı belirli bir noktaya kadar kaydırabiliriz, ama önce ikinci interrupt'un programına bir bakın...
Klavyeyle gezinmek için ← ve → tuşları.
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