SMOOTH SCROLL

Program dökümü: SMOOTH SCROLL

Merhaba makina dili kullanıcıları. Makina dilinin püf noktaları yazımıza, Smooth Scroll programımızı açıklayarak bu satırlardan devam ediyoruz. Bu yazının arkasında listesini gördüğünüz program RASTER interruptlarını kullanarak ekranının en üst satırında herhangi uzunlukta bir metini piksel piksel kaydırır. Programın çalışma prensibini daha iyi anlamanız için burada satır satır açıklayacağım.

Programın en başında bulunan SEI komutuyla bütün interruptlar kapatılır. Bunun amacı, biz interrupt vektörünü değiştirirken olabilecek bir interrupt'ın henüz tam değiştirilmemiş olan vektörler üzerinden belleğte saçma bir adrese sıçrama yaparak bilgisayarımızın kitlenmesini engellemektir.

Lda IRQst Sta IRQvec Lda IRQst Sta IRQvec+1

Bu satırlarla interrupt vektörünü, IRQvec label'ı tarafından gösterilen rutini gösterecek şekilde ayarlarız.

Lda 1 Sta IMR

Yazımızda da anlattığım gibi IMR ($D01A) adresiyle değişik interrupt türlerinin oluşmasını sağlayabiliriz. Burada IMR'ye 1 değerini vererek RASTER INTERRUPT'ların oluşmasını sağlıyoruz.

Lda 50 Sta raster

Interrupt'ın tam ekran başında oluşması için raster'e bu satırın değeri olan 50'yi veriyoruz.

Lda vcr And $7F Sta vcr

Vcr ($D011) adresinin 8. bitini yani 9. raster bitini temizliyoruz. Böylece interrupt'ımız $0132. satırda değil $0032. raster satırında gerçekleşiyor.

Lda 0 Sta cra

Cra ($DC0E) adresinde sistem zamanlayıcısı A'yı ilgilendiren birçok olayın kontrolü yapılır. Bunlar arasında zamanlayıcının açılıp kapatılması, frekansının 50 veya 60 Hz olarak ayarlanması, zamanlayıcı sıfırlanınca durması veya başlangıç değerini alarak tekrar çalışması gibi kontroller de vardır. Bu adrese verilen bir sıfır değeri A Zamanlayıcısını durdurur.

Lda $7F Sta icr

ICR ($DC0D) adresinin son bitini sıfırlayarak, değeri 1 olan bitlerin kontrol ettiği interruptların oluşmasını engellenebilir. Burada kullandığımız örnekte Raster dışında, zamanlayıcı A ve B'yi içeren tüm interruptlar kapatılıyor.

Lda $7 Sta Xpos

Bu komutlar sistemle ilgili değildir. Programımız bu adresteki değeri satırın x pozisyonunun kaç olduğunu hatırlamak için kullanıyor. Satırın x pozisyonu 0 ile 7 arasında herhangi bir sayı olabilir. bu değeri sXpos ($D016) adresine vererek Multi-color modunu kapatır. Ekran sütun sayısını 38'e indirir ve istenilen miktarda sağa kaydırırız.

Daha sonra CLI komutuyla interruptları serbest bırakır, RTS komutuyla BASIC'e geri döneriz.

Sıra interrupt rutinimizin nasıl çalıştığını anlatmaya geldi.

Programın en başında bulunan INC IRR komutuyla Raster interrupt'ının bitini temizleyerek yeni bir raster interrupt'ının oluşmasına izin veriyoruz.

Lda Xpos Sta sXpos

Bu komutlarla satırın gereken miktarda sağa kayması sağlanır. Bu arada ekranın kolon sayısı 38'e düşürülerek yeni çıkan harflerin aniden belirmesi engellenir. Meraklıları bu rutini

Lda Xpos Ora $08 Sta sXpos

olarak değiştirerek, 'ekran 40 kolonda kalsaydı ne olurdu?' sorusuna cevap alabilirler.

Lda raster Cmp 59 Bcc bekle

Programın bu noktasında elektronun 59. raster satırına yani ikinci karakter satırının başına ulaşmasını bekliyoruz. Tabi ki burada ikinci bir

raster interrupt'ı devreye sokulabilirdi ama bu kadar basit bir iş için gereksiz yere uğraşmaktan başka hiç bir işe yaramazdı bu.

Lda 8 sta sXpos

Artık kayan yazılar kısmı bittiğine göre ekranın sağa sola oynamasını durdurmalıyız. Bunun yanında tabii ki ekranı 40 kolona çıkarmamız da gerekir. Eğer merak ediyorsanız bu iki satırı yazmayın ve görüntü açısından ne kadar önemli olduklarına kendiniz karar verin.

Dec Xpos

(Bu komutu iki veya üç kez yazarak yazının daha hızlı kaymasını sağlayabilirsiniz.)

Yazıları bir piksel sağa al.

Bpl çık

Bu komut, son işlemin 0 veya daha büyük sayıları içerdiği durumlarda belirtilen adrese sıçramasını sağlar. Yani x koordinatımız hala 0-7 arası bir yerlerdeyse, herhangi bir değişikliğe ihtiyaç olmadığından, Kernal interrupt rutinine geri dönülür.

Eğer X kordinatımız 0'ın altına düştüyse (yani 255 ve 128 arasındaysa) şu rutinler devreye girer:

Lda 7 Sta Xpos

İlk olarak X pozisyonu tekrar 7 yapılır ve yazılar bir sola alınır ki hepsi bir piksel daha kaymış gibi görünsün.

Ldy 0 Kaydır Lda $0401,y Sta $0480,y Iny Cpy 39 Bcc Kaydır

Evet. İşte ilk satırı bir sola kaydırma rutinimiz. Görüldüğü gibi ilk olarak $0401, $0400 adresine taşınıyor, ve y'nin değeri bir artırılarak 39'a varana kadar aynı işlem tekrarlanıyor. Burada Bne yerine kullanılan Bcc komutu Bne ile aynı işlemi yapar fakat daha kapsamlıdır. Yani Y'nin değeri 39'dan küçükse Kaydır adresine sıçrama yapılır. (Bcs komutu ise ancak sayı büyük veya eşitse sıçrama yapar.)

Burada en büyük hata şöyle bir rutin yazılarak yapılır:

Ldy 39 Kaydır Lda $ 0401, y

Sta $0400, y Dey Bne Kaydır

Evet belki de çoğunuzun ilk bakışta faredemediği bir hata yapılmıştır bu rutinde. Eğer rutini dikkatlice incelersek ilk olarak satırın en sağındaki harfi bir sola kaydırdığımızı farketmişsinizdir ($0427'yi $0426'ya taşıyorsunuz.) E ne var ki bunda? demeyin hemen ve işlemi incelemeye devam edin. İkinci kaydırma işlemi ise $0427'de bulunan harften başkası değildir. Yani bu rutini kullanırsak yalnızca tüm satırın aynı harfle dolmasını sağlarız.

Lda YAZI Cmp 255 BNE YAZ2

Artık sıra listemizde bulunan yeni harfi okumaya geldi. Fakat burada bir kontrol yaparak yazının bitip bitmediğini anlamamız gerekiyor. Yani yazımızın sonuna geldiğimizi söyleyen 255 kodlu karakteri alıp almadığımıza bakmalıyız burada. Eğer elimizdeki karakterin kodu 255 değilse doğrudan doğruya harfi ekran sonuna yazdırma rutinine atlayabiliriz.

Lda YAZI Sta yaz+1 Lda YAZI Sta yaz+2 Jmp YAZ

Eğer yazının sonuna geldiysek yapmamız gereken bazı işler vardır. Bu rutinle, ilk olarak yazı göstergecini yazımızın datalarının en başına alıyoruz. Daha sonra JMP YAZ ile ilk harfi almak için yazı alma bölümüne sıçrıyoruz. Eğer bu son komutu eklemeseydik bitirme kodu olan 255'in karakter karşılığını ekranda görürdük.

YAZ2 sta $0427

Yazı sonu olmayan karakterleri ekranın son kolonuna -ki bu kolon, ekranımız 38 kolona indirildiği için görülemez -yazdırıyoruz.

Inc Yaz+1 Bne Çık Inc Yaz+2

Tabii ki yazı datamızdada bir sonraki harfi göstermemiz gerekiyor. Bu komutlarla yazı harflerini okuyan Lda YAZI komutunun gösterdiği adres bir artırılıyor ve bir daha harf okunduğu zaman ikinci harfin okunması sağlanıyor. Gördüğünüz gibi burada programın kendi kendisini değiştirme metodunu kullanıyoruz. bu metodu kullanmak istemeseydik iki seçeneğimiz vardı:

1. Lda Yazı, y komutuyla indeksli bir okuma sistemi kullanmak: Bu durumda Y registerinin içeriğini her okumada bir artırmamız ve belirlediğimiz boş bir adreste saklamamız gerekmektedir. Böyle bir metodla da yeterli bir sonuç alabilirdik ama erişebileceğimiz harf sayısı 255'le sınırlı kalırdı. (Bildiğiniz gibi indeks registerleri 0-255 arası değer alabilir.) Bu kısıtlamayı aşabilmek için yapabileceğimiz tek şey, Y registerinin değeri 255'i aştığı zamanlarda, programın kendisini değiştirmek metodunu kullanarak, YAZI adresinin yüksek (high) baytının saklandığı YAZ+2 adresinin değerinin bir artırmamız olabilirdi. Ama bu durumda bizim rutinimizdeki metod daha hızlı ve etkili bir sonuç verdiği için indeksleme sisteminden vazgeçmemiz gerekmektedir.

2. Ldy 0 Lda (zp), y

Zp, 0-ff arasında kullanılmayan bir adrestir ve yazı datalarımızın adresi YAZI'nın alçak baytı Zp'de yüksek baytı da zp+1'de saklanmaktadır. Bu okumadan sonra

Inc zp Bne atla Inc zp+1 atla...

Komutlarıyla bir sonraki harfin gösterilmesi sağlanmalıdır. Bizim kullandığımız kadar etkin bir metottur, bu yüzden kendi rutinlerinizde bunu kullanabilirsiniz.

Ve programın en sonunda JMP IRQÇIK komutuyla Kernal interrupt rutinine geri dönülür.

Yazımızın datları YAZI label'ı tarafından gösterilen adreste, ekran kodları olarak saklanmalıdır. yani A'nın ASCII değeri olan $41 değil bunun $40 eksiği olan $01 değerini kullanmalıyız. Sayılar ve '?' ',' '.' gibi özel işaretlerin ekran kodları ve ASCII değerleri aynıdır.

Evet, bu aylık da bu kadar. Gelecek ay yeni bir yazıda görüşene kadar hoşçakalın.

Bu yazıdaki programlar

Dergideki dökümlerden çıkarıldı; satırlar derginin kontrol toplamlarıyla doğrulandı ve programlar VICE emülatöründe denendi. Tarayıcıdaki C64'te çalıştırabilir, indirip bir emülatöre sürükleyip bırakabilir ya da gerçek bir C64'te LOAD "AD",8,1 ile yükleyebilirsiniz. "Sorun bulundu" yazanlarda bazı satırlar okunamadı ya da tutmadı; düzeltilmiş bir sürümünüz varsa contact@coze.org adresine gönderin.