Bu sayfadaki yazılar
Sayfanın metni
Sayfa 47
vermeniz gerekir. Bu şekilde özelleştirilmiş sinüs tablosunu hazırladıktan sonra sıra logoyu sallayacak programı incelemeye geldi. Ekranın en üstünde logo sallamaya çalıştığımız için, $D016'nın değerini $32 raster satırında değiştirmemiz gerekli. Bunun için ilk olarak raster'ın $32'ye gelmesini bekliyoruz, daha sonra tablodan $D016'nın şu anki değerini alarak doğrudan veriyoruz. Daha sonra logonun sallandığı alanın sonunu bekleyip (burada biraz fazla tuttum, azaltabilirsiniz) $D016'nın değerini düzeltiyoruz. Sonra tablo gösteri-
PROGRAM ADI 00010
00020 00030
FOR.Rz0O TO 255
BAYTI
00040 Y-(K-(K AND 7))/8:REM
RAKTER POZİSYONU 00050 00060
00070 NEXT
PROGRAM
LOGO
PÖKE PÖKE 491524512-4*R,1924X:REM
cisinin bir ileri alıp, gelecek taramada görünecek olan ekranı ayarlıyoruz. Eğer INC $C0FF'i şimdi değil de ekranı ayarladıktan sonra verirsek, karakter pozisyonuyla $D016 pozisyonu arasında bir baytlık fark doğar ve bu sebeple de logonuz titrer, karakter pozisyonuyla (sanırım şimdi neden logolarınızın titrediğini anlamışsınızdır Derya Bey). Gelecek ekranı tasarlamak için karakter pozisyonunu $C200'dan alıp, bu pozisyondan itibaren 40 karakteri ekranın en üstüne basmamız yeterlidir. Logo kaydıracak arkadaşlar ise bu transferi $0400, $0428, $0450, vb. için
SINUS YAPICI
) X-7-(K AND 7):REM
$D016'NIN İLK UC LOGONUN X KA
-$C100 z$C200
20 20 12 De
21
20 ZO
satır satır yaparsa yeterli olur. Daha sonra da ekranın alt kısmında bulunan $32. raster satırını geçip (yani $0132, - ama kullanarak yalnızca $32'sini görebiliriz) döngüye tekrar giriyoruz. Logo sallama denilen musibet şey bundan ibarettir yalnızca. Eğer gene de anlayamadığınız bir yer olursa tekrar yazmaktan çekinmeyin, anlamadığınız kısımları daha detaylı olarak anlatmaktan zevk duyarım. Hepiniz gelecek aya kadar hoşçakalın. Mektuplarınızı bekliyorum.
Program 1: .,C000 SEI LDA CMP LDY LDA STA LDA CMP
#$32 $DO12 $COFF $C200,Y $DO16
n003
BNE LDA STA INC LDY LDX LDY
$C013 #SC8 $DO16 $COFF $COFF $COFF,Y #S00 LDA $C300,x STA $0400,Y (başka satırlar için LDA $C380,X | STA $0428,X vb.) INY CPY BNE LDA BPL LDA BMI JMP
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 46
Cycle, benim tahminimce bilgisayarın saat frekansının bir periyoduna verilen ad. Fakat sadece komutların hızını ölçebilmek için kullanılan bir zaman birimi olarak düşünseniz de olur. Mesela en kısa komut olan NOP 2 cycle sürerken BIT $XX komutu 3 cycle yer. Bir cycle'lık süre içinde elektron yatay olarak sekiz piksellik (noktalık), yani bir karakterlik yol alır. Hassas ayarlar yaparken bundan yararlanmanız daha iyi olur. Mesela NOP'u zaman olarak değil de uzunluk olarak algıladığınızda hesaplarınız oldukça kolaylaşır. Bu durumda bir NOP komutu iki karakterlik, bir absolute STA komutu (STA$XXXX) dört karakterlik yol kaplar gibi düşünmeniz gerekir. Üçüncü sorunuzda ise interrupt'a giriş ayarlayan rutinde yer alan bazı adreslerin ne iş yaptıklarını sormuşsunuz. Bu konuyu yazının başlarında ele almıştım ama burada da kısaca değinmekte bir sakınca görmüyorum. Interrupt'a giriş rutininde kullanılan adresler şu işe yarar: $0314-$0315: Rutinin başlangıç adresi. Ekran modu (karakter ekranı, hi-res extended Background) ve Raster'ın 9. biti. $D012: Raster satırının ilk sekiz biti. $D01A: Yapılacak interrupt'ın türü. ($01 — Raster interrupt). Diğerleri ça-
lışma, light-pen vb. interrupt'ların yapılmasını sağlar. $DC0E-$DC0D: CIA 1 zamanlayıcısıyla yapılan interrupt'ları ve zamanlayıcının çalışma şeklini (tek atışlı, devamlı geriye sayış, vb.) kontrol eder bu adresler. Gerekli değerleri vererek Raster'dan başka interrupt'ın oluşmasını engelleyebiliriz. 4. Sorunuzun cevabı ise çok basit. Mesela ekranın en üzerinde yazıyı kaydırıyor olun. $30-$32 gibi bir raster satırında gerekli y pozisyonunu $D016'yı kullanarak ayarlayın, daha sonra kayan yazıların bulunduğu satırlardan sonraki bir raster satırında (1*1 karakterlik yazı kayıyorsa $40 fazla bile gelir) $D016'ya $C8 (multi-color için $D8) verin. Bu sayede ekranın alt kısmındaki yazıların da kayan yazıyla birlikte oynamasını engellemiş olursunuz. Bu konuları önceki sayılarda oldukça detaylı bir şekilde anlattım. Eğer bu yazıları okumadıysanız, eski sayılarımızı ele geçirin ve bir okuyun. Mektubunuz için de çok teşekkürler. Üçüncü ve son mektup da Gökhan Keser'e ait. 1. ve 2. sorusunun cevabını 69. sayıda vermeye çalışacağım, çünkü bu sayıda örnek program için yerimiz kalmadı. Ama çoğu arkadaşınızın yakındığı logo sallama rutiniyle ilgili sorunu bu sayıda cevaplayacağım. Sizlerden gelen yakınmaları görünce gerekli yazıya göz attım ve kendimden utandım. Hem programlar yanlış basılmış, hem de gerekli programlar döküm ekinde çıkmamış. Neyse, hatamı burada telafi etmeye çalışacağım. Bu sayıda anlatacağım logo-swing programı bir logoyu değil, yalnızca bir satırlık bilgiyi sallıyor, ama ekrana basılan satır sayısını arttırarak herhangi bir logoyu da sallayabilirsiniz. İlk olarak swing sinüslerinin yapılmasını anlatacağım. Programın en başında sinüs tablosunun boyutunda bir FOR döngüsü açıyoruz. (0-255 — 256 bayt). Daha sonra gerekli bayta karşılık gelecek olan değeri hesaplıyoruz, yani sinüs fonksiyonunun bu baytta alacağı değeri buluyoruz. Eğer tam bir sinüs kullanacaksanız, formülümüz: INT (GENLİK*SIN(R/ToplamBayt*2*PI) + GENLİK) olur. Eğer eski sayıları da istiyorsanız, ikinci GENLİK değerini eklemeyebilirsiniz. Bu K değerini 7 ile AND'lediğinizde, değerin bir karakter uzunluğu olan 8'in tam katından kaç fazla olduğunu buluruz (25 değeri için, 25 AND 7=1). Bu sayede gerekli karakteri bastıktan sonra ekranı yumuşak olarak ne kadar kaydırmamız gerektiğini buluruz (25 için gerekli karakter ve ekran 1 piksel yanda olacak). Ama bu kayma miktarı sağa kayma miktarı olmasına karşılık, $D016'da sola kayma miktarı tutulur. Bu yüzden bu değeri 7'den çıkararak sola kayma miktarını (0-7 arası bir değer) buluruz. Y=(K-(K AND 7))/8 işlemi sayesinde tam sayı olarak kaçıncı karakterin ekrana basılacağını hesaplarız. Bu baytları gerekli tablolara yazarak işimizi bitiririz. Bu program için gerekli tablolar: Karakter sayısı: $C100; $D016'nın değeri: $C200; $D016'nın değerini yazarken, bulduğumuz sayıya 192 ekleyerek, 38 kolonluk, multi-color olmayan bir ekranda çalışmasını sağlayabiliriz. Eğer 192'yi burada eklemezsek programda STA $D016'dan önce ORA #$C0 komutunu