C64 için Püf Noktaları
Retro bilgisayarC64 için
Merhaba C64'cüler. İşte yine bir dergide makine
dili'nin püf noktalarını açıklamaya devam ediyoruz. Daha önce de belirttiğimiz gibi bu köşede amacımız makine dilini öğretmekten çok, demo veya intro türü programlarda kullanılan teknikleri ayrıntılı olarak göstermek. Şimdiye kadar interrupt'ların ne olduklarını ve nasıl kullanıldıklarını öğrenmiş ve bunlara örnek olarak bir 'Smooth Scroll' programını incelemiştik. Fakat çoğunuzun da fark ettiği gibi bu yazı kaydırma rutininin, ana mantığı açıklama dışında göz alıcı veya dikkat çekici hiçbir özelliği yoktu. Yani bir intro veya demo programcısının kullanabileceği kadar usta işi bir rutin değildi. Bu yüzden bu sayımızda, gerçekten ilgi çekici bir görüntü yaratan 'renkli şeritler' rutinini açıklayacağım. Bu rutin tek başına yeterince göz doldurmayacağından, renkli şeritlerin üzerinde 2x2 boyutunda karakterleri kaydıracak bir yazı kaydırma rutini de programa dahil edilmiş durumda. (Dergimizi sürekli takip edenler bu karakter setlerini düzenlemenizi sağlayacak bir editör programını yayımladığımızı hatırlayacaklardır. Programımız bu editörle tamamen uyumlu olarak çalışıyor.) Programı çalıştırdığınızda geçen sayılarda yayınladığımız (veya kendi hazırladığınız) bir karakter setini $3000 adresine yüklemiş olmazsanız yalnızca renkli şeritleri görebilirsiniz. Programın ayrıntılı açıklamasına geçmeden önce C64 kullanarak renkli şeritler yaratmanın neden çok zor olduğunu anlatmaya çalışayım. Bildiğiniz gibi Commodore'unuz ekranda görüntü elde edebilmek için bir elektron ışığı ile tarama sistemini kullanıyor. Eğer biz bu elektron herhangi bir satıra girerken (veya girmeden hemen önce) ekran ve arkaplan renklerini değiştirebilirsek o satırda istediğimiz rengi elde edebiliriz. Ve bu sistemi diğer satırlara uygulayarak istediğimiz sayıda renkli şerit elde edebiliriz. Fakat iki satır arasında bulunan renk değiştirme sırasında bir ufacık bir kayma bile olursa bu kayma bütün satırlarınızı etkiler. Tabii ki bu yana kayma ile kolayca başa çıkabiliriz. Bir satırdaki herhangi bir işlemden sonra
Ldx#4s08
loop Dex
Bne loop
KARAKTER seti AMA ?
rutinini kullanırsak elektron alt satırda, bu işlemi yaptığımız koordinatın hemen altında bulunacaktır. Tabii ki bu kadar kolayca bu işin içinden çıkamayız. Çünkü belli satırlarda (her karakter satırının başlangıcında) sizin programınızla olan bağlarını keser ve ekrana gidecek olan görüntüyü ayarlamak için yeni satırı almak, yüksek çözünürlük modunda iseniz bu satırdaki harfleri renklere çevirmek gibi işlemlerle uğraşır. Tabii ki bu işlem sizin ayarladığınız zamanlamayı da altüst eder. Bu olayları yapmak için program kullanılmadığı için (tamamen elektronik olarak başa çıkılır bu işlerle) çok gelişmiş sistemler kullanmak dışında bu satır yenileme olayını engellemek elimizde değildir. Bu yüzden, yazacağınız program bu satırlarla uğraşacağı zaman renk değiştirme işini elinden geldiğince çabuk halletmek zorundadır. Tabii ki bu ayarlamayı yapmak kolay olmadığından renk şeritleri yapmak çoğu programcının korkulu rüyası olmuştur. Bu programlar o kadar hassastır ki içlerinden çıkarılacak tek bir komut bile tüm zamanlamayı altüst edebilir. Daha da ilginci, $D011 adresinde bulunan Y pozisyonunu değiştirmenizin programın çalışmasını engellemesidir. Eğer $D011 kullanarak ekranı bir piksel aşağı alırsanız, bu özel satırlar da bir satır aşağı kayacak ve sizin programınızda belirlenen yerlere denk gelmeyecektir. Bunun sonucu olarak da programınız işe yaramayacaktır. Bu konuda sizi uyarmam gereken bir nokta daha var. Eğer bir satır üzerinde bir sprite bulunursa o C64'ünüz o sprite'ı gösterebilmek için o satırda sizin programınızdan biraz zaman çalmaktadır. Bu kadar uyarı ve açıklamadan sonra gelelim programın açıklamasına: $C000-$C032 arasında bildiğiniz sistemlerle interrupt'lar ayarlanır. Bu arada $C0F7 adresi sıfırlanır ve ekranın X pozisyonunu tutan adrese $C7 değeri verilir. Modu için bu değeri $D7 yapın rutininiz $31. rasterda başlar ve $C035 adresinde bulunur.
IRA Lda #$41D
Sta $L018
Komutlarıyla karakter setinin yeri değiştirilir.
adresine alınır.) Eğer 1D yerine $15 değerini kullanır-
sanız normal karakter setine geçersiniz.
Ldx #$1D
Dex
Bne Loop
Rutinini kullanarak elektron ışınının istediğimiz yere
gelmesini sağlıyoruz.
Lda $COF8
Sta $DO16
ile x piksel-koordinatını ayarlıyoruz.
Ldy #
Jmp Başla
komutuyla ilk satırın rengini ayarlanmasını sağlıyo-
ruz. (ilk satırda bazı ayarlamalar yapılır unutmayın.)
Loop
Ldx # $00
Kısaltılır Ldy #$08
Başla Lda $COE2, X
Renkver Sta $DO20
Sta $DO21
gördüğünüz gibi ilk olarak satırın rengini hiç vakit kaybetmeden veriyoruz. Inx Dey Bea Kısasatır Programın can alıcı noktası burası. Her sekiz satırda bir birazdan gireceğimiz bekleme rutinine uğramadan yeni renk verilir. Cpx #$11 Bes renkson tam $11-1 (= 16) satıra $C0E2 adresinden başlayan renkler verilecek. Eğer yeni datalar yazarsanız ve bu sayıyı bu datalara göre artırırsanız son sayının ekran rengini de ayarlayacağını unutmayın. Jsr Bekle sekiz tane NOP ve bir RTS'den oluşan zaman harcama rutinine gidiyoruz.
Lda $C0E2, X Lda $C0E2, X Bit $D021 Clc Renkver Burada iki kez renk okumamız herhangi bir hatadan dolayı değil. Yalnızca zaman harcıyoruz. Bit komutu da burada yalnızca biraz zaman harcatmaya yarıyor. JMP komutu yerine de CLC ve BCC komutları ardışık olarak kullanılıyor. Bu hem zamanlamayı ayarlıyor hem de size değişik bir sistem göstermeye yarıyor. Renkson Lda #$C8 Sta $D016 Lda #$15 Sta $D018 renk şeritleri koyduğumuz ve yazı kaydırdığımız 16 satır bittiğine göre X pozisyonunu sıfırlayıp karakter setini normale çevirmenin zamanı geldi demektir.
Lda $COF8
And # $07
Tay
Dey
$C0F8 adresinde saklanan X pozisyonunu bir sola alıyoruz. Hızlı kayan yazılar isteyenler buraya bir-iki DEY koyabilirler. Bmi Satırsonu Eğer X pozisyonu 0'dan küçükse yeni harfleri X koordinatını ayarlamak gerekiyor. Bu komutla da bu işleri yaptırıyoruz. Ora #$C0 Sta $C0F8 Jmp Bitir eğer X pozisyonu 0-7 aralığındaysa bunu $D016'ya yazılabilecek hale getirip, gerektiği zaman kullanmak üzere $C0F8 adresine yazıyoruz. Multicolor kullanıcıları, buradaki ORA $C0 komutunu ORA yapmayı unutmayın. Satırsonu Lda Sta $C0F8 eğer X pozisyonunu 0'dan küçükse öncelikle X pozisyonunu en sağa alıyoruz. Ldy lda $0401, y Sta $0400, y $0429, y Sta $0428, y Bne ve ekranın ilk iki satırını bir sağa kaydırdık. Harfal Lda $C100 Cmp #$FF Bne yaz Lda #$00 Sta Harfal+1 Lda #$C1 Sta Harfal+2
Bne Harfal burada tanıdığımız bir harf alma rutini var. Zaten yazacağınız tüm yazı kaydırma rutinlerinde bu sistemi kullanmanız kaçınılmaz. Bu yüzden bu satırlara alışmaya bakın. "| Yaz
Kaydır
TST
Ora $COF7
Sta $0428
Clc
Ade
Sta $0429
yazdığımız mesajın her harfi dört karakterden oluştuğundan harfleri yazma sistemini incelemeniz gerekiyor. Kullandığımız sistemde harfin ilk kolonu harfin kendisi ve reverse'ünden oluşuyor. Yani harf ilk kez okunmuşsa harfin kodu ve $80 fazlasını ekrana yazmalıyız. Eğer harf ikinci kez okunduysa $40 fazlasını (Shift-harf) ve bunun $80 fazlasını (yani reverse'ünü)
basıyor.
Lda $COF7
Eor #$40 Sta $C0F7 Bne Bitir her harfin okunuşundan sonra harfin kendisinin mi yoksa shift'inin mi basılacağına $C0F7 adresi karar veriyor. Buraya her gelişinde $C0F7 adresinin değeri $40 veya $80 arasında değiştiriliyor. Eğer değer $00 olduysa gelecek harfin okunması gerektiği için harfi okuyan komutun adresini bir artırıyoruz. Inc Harfal-1 Bne Bitir Inc Harfal-2 Inc $D019 Jmp $EA81 Ve kontrolü Kernal'a veriyoruz. Unutmayın, programda ekran rengini ayarlamanız gerekiyor. Bir uyarı daha: Eğer programın RASTER giriş satırını $31'den farklı bir yere alacaksanız bu satırın ($31+N*8) formülüne uymasına dikkat edin. Hepinize programcılık hayatınızda başarılar dilerim.
Bitir