Bu sayfadaki yazılar
Sayfanın metni
Sayfa 28
2. Playfield'in biçimi, boyu ve ekrandaki pozisyonu belirlenir.
1'den 6'ya kadar bitplane kullanarak, her pixelin rengini belirleyebiliriz. Pixel'e ait değer, daha sonra 4096 renklik palet içinden bir değere dönüştürülür. Amiga, renkleri üç ana rengin kombinasyonundan oluşturur. Bunlar RGB, yani Kırmızı, Yeşil ve Mavi renklerdir. Her renge ait 4 bitlik bir değer vardır. Bu da, 16x16x16=4096 renklik bir palet oluşmasını sağlar. Biz, bu 4096 renklik renk paleti içinden, 32 adet birbirinden bağımsız renk seçme hakkına sahibiz. Bu 32 renk, renk tablosu denilen bir register topluluğu içinde saklanır. Bu register'ların herbiri 12 bitliktir. Yani her renk için 4 bitlik bir bilgi taşırlar. 0'dan 32'ye kadar olan renk register'ları (COLOR00'dan COLOR31'e) sadece yazılabilir cinstendir.
Register Adresi Renk Paleti Registeri
$180 COLOR00 $182 COLOR01 vs.. $1BE COLOR31
Tablo elemanının içeriği ise şu şekildedir:
Bit:15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 COLORxx x x x x R3 R2 R1 R0 G3 G2 G1 G0 B3 B2 B1 B0
R0-R3 Kırmızı bileşen için 4 bit değer G0-G3 Yeşil bileşen için 4 bit değer B0-B3 Mavi bileşen için 4 bit değer
Low-res modunda, beş bitplane'e kadar çıkılabilir. Bu da 32 renklik bir renk paleti oluşturmamızı sağlar. High resolution'da ise çıkılabilecek maximum bitplane sayısı 4'tür. Bu ise 16 renklik bir renk paleti oluşmasına sebep olur.
Extra Half Bright Modunda ise, 6 adet bitplane kullanılır. Bu normalde 64 renklik bir renk paletine eşdeğerdir. Ancak Amiga'da sadece 32 adet renk register'ı olduğundan, buna başka bir alternatif getirilmiştir. Eğer 6 nolu bitplane'deki pixele ait bitin değeri 0 ise, pixel ekranda normal rengini alıyor. Eğer bu bit 1 ise o zaman pixele ait renk değer olarak ikiye bölünüyor ve yeni değer oluşturuluyor. Bu register içindeki renk bitlerinin bir defa sağa kaydırılması sayesinde oluyor.
Dual Playfield modunda ise, her playfield maximum üç adet bitplane'e sahip oluyor. Bu sayede her bitplane'de 8 renklik bir görüntü oluşturulabiliyor.
Dual Playfield, oyunlarda ilginç bir şekilde karşımıza geliyor, örneğin uçak simülasyonlarında, uçağın paneli sabittir, yeryüzü hareket eder. Burada birinci playfield sabit, ikincisi ise hareket halindedir. Bunlar Dual Playfield'in en güzel örneklerindendir.
Gelecek sayıda playfield'lerin konstrüksiyonuna geçeceğiz.
En güzel günlerin sizin olması dileğiyle. Saygılar.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 29
Selam!!! Bir ay aradan sonra sizin kafanızı tekrar Assembler ile uğraştıracağım. Bu ayki menümüzde bol miktarda library fonksiyonları var. Fakat bu sefer değişiklik olsun diye DOS ve EXEC library'lerini dolaşacağız sizlerle. Bu library'ler ilerde kullanacağımız bir sürü fonksiyonu içerdiklerinden, bir an önce öğrenmemizde fayda var. DOS library'sindeki fonksiyonlar yardımıyla diskete rahatlıkla erişebilir ve istediğimiz işlemleri yapabiliriz. EXEC library'sinden göreceğimiz komutlar ise hafıza ayırma, kopyalama gibi komutlar. Dilerseniz hemen ilk fonksiyonlarımıza geçelim.
DOS library'sinde ilk ele alacağımız komut, CreateDir. İsminden de anlayabileceğiniz gibi, diskette adını vereceğiniz directory yaratır. Tabii bunun için disketin write protect'inin uygun konumda olması gerekmekte. İsmini verdiğiniz directory o an içinde bulunduğunuz directory'nin içine açılır. Şayet alt directory'lerden herhangi birine girmemişseniz, direkt olarak ana directory'de bir alt directory açılacaktır. Fonksiyonu kullanabilmek için DOS library'nin açılmış, base adresinin de a6'ya atılmış olması lazım. Açılacak directory isminin adresini de d1 register'ine yazar ve fonksiyonu çağırırsak hemen bir alt directory yaratılacaktır. Unutmayın; isim datalarının sonunda en az bir 0 byte'ı bulunmalı. Aşağıdaki kısa örnek ile DOS library'i açıyor ve CreateDir fonksiyonunu çağırıyoruz. Hemen ardından da program bitiriliyor.
Q: movem.l d0-d7/a0-a6,-(sp) move.l 4,a6 lea DOSNAME,a1 jsr -408(a6)
move.l d0,a6
move.l #DIRNAME,d1 jsr -120(a6)
tst.l d0 beq ERROR move.l d0,DIRLOCK ERROR: movem.l (sp)+,d0-d7/a0-a6 rts DOSNAME: even dc.b 'dos.library',0 DIRNAME: even dc.b .'YENİ DIRECTORY',0
DIRLOCK: even del 0
CreateDir fonksiyonu doğru olarak çağrıldıktan sonra d0 register'inin içeriği 0 ise, directory yaratılamadı anlamına gelmekte. Her şeyi kontrol ettikten sonra fonksiyonu çağırmanızda fayda var. D0 register'inin içeriği 0'dan farklıysa, directory yaratılmıştır. Bu durumda d0'da directory'e ait BCPL göstergeci (BCPL pointer) bulunmaktadır. Bu sayı yardımıyla, daha sonra çeşitli işlemler yapabilirsiniz. Herhangi bir disk işlemi sırasında disket işletim sistemi (DOS-Disc Operating System) file ya da directory'i daha kolay bulabilmek için bir pointer yaratır. Bu pointer hafızada bazı structure'lara direkt işlem yapabilme olanağını sağlar. İşte bu pointer'a biz BCPL göstergeci diyoruz. Tüm önemli DOS fonksiyonları böyle bir pointer istemekteler.
İnceleyeceğimiz bir sonraki fonksiyon, yine DOS library'sinden olan CurrentDir. Hepinizin bildiği gibi CLI directory'sinde bulunan CD komutu ile istediğimiz bir directory'den bir üst ya da bir alt directory'e geçebiliyoruz. Aynı şekilde CurrentDir fonksiyonu da istediğimiz disketin istediğimiz directory'sine girmemizi sağlamakta. Kullanımı hayli basit. DOS library'sini kullanıma hazır hale getirdikten sonra, d1 register'ine girmek istediğimiz directory'nin BCPL pointer'ını yazmamız ve fonksiyonu çağırmamız yeterli. Fonksiyonu çağırdıktan sonra, d0'da ya en son directory'nin BCPL göstergeci kayıtlıdır, ya da 0 bulunmaktadır. Fakat, 0 burada diğer library fonksiyonlarında olduğu gibi hata anlamına gelmez. d0'ın içeriği 0 değerini aldığında, en son bulunduğumuz directory boot disketimizin (açılışı yaptığımız disket!) ana directory'si olduğunu belirtilmekte. CurrentDir fonksiyonunu çağırmak için kullanacağımız library ofset değeri -126'dır.
CurrentDir yardımıyla directory değiştirdikten sonra tekrar bir üst directory'ye dönmek istiyorsak, bunun için ParentDir fonksiyonunu kullanmalıyız. Bunun için BCPL pointer'ını d1 register'ine atmamız gerekmekte. Fonksiyonun çağrılma ofseti ise -210.
DeleteFile fonksiyonu ile istediğimiz herhangi bir file'ı disketten silebiliriz. Bunun için gerekli olan tek şey, file isminin başlangıç adresinin d1 register'inde kayıtlı olması. Fonksiyonumuzun library ofseti -72. Tabii yine her zaman olduğu gibi DOS library'sinin base adresini de a6 register'ine yazmayı unutmuyoruz. Bu hatırlatmaları her seferinde hata yapmamanız için tekrarlıyorum. Satır ya da byte tasarruf etmek için, kullandığınız fonksiyonun library'sinin base adresini a6 register'ine yazmamazlık etmeyin. Benim başıma gelen hataların %40-%50'si sadece bu tür cimriliklerden kaynaklanmakta. Base adresini unutarak farklı bir library fonksiyonu çağırdığınızda, istemediğiniz her şey olabilir. Bu yüzden her library fonksiyonu çağırdığınızda (!) library base adresini KESİN-LİKLE a6 register'ine yazın.
DeleteFile fonksiyonu doğru kullanıldığında hata vermez. Fakat bir hata olduğunda bunu d0 register'i yardımıyla görebilirsiniz. Bu arada bir directory'yi silerken, ilk önce o directory'deki tüm file'ların teker teker silinmesi gerektiğini de hatırlatmalıyım. Aksi halde kolaylıkla hata ile karşılaşabilirsiniz.
Bazen, yazdığımız programlardan CLI'a geçip bir komutu (DIR, COPY gibi) çalıştırmak isteyebilirsiniz. Bunu yapmak için de DOS library'si hizmetimize bir fonksiyon sunmuş durumda. Bu fonksiyonun adı, Execute. Bu fonksiyon yardımıyla disketten istediğimiz programı çalıştırabilir ve sonuçlarını aksi belirtilmedikçe CLI penceresi üzerinden görebiliriz. Fakat bu fonksiyonun tek bir dezavantajı var; o da dezavantaj sayılamayacak kadar basit bir engel. Fonksiyonun doğru çalışabilmesi için, disketin 'c' directory'sinde RUN komutunun bulunması gerekmekte. Bu komutu nereden mi bulacaksınız? Bu soruyu duymamış farz ediyorum! Bu komut olmadan fonksiyonu çağırdığınızda, fonksiyon boş işlev yapar. Verdiğiniz programı çalıştırır gibi gözükse de çalıştıramaz. Normalde Execute fonksiyonunu kullanırken sadece d1 register'ine çalıştırılacak komutun isminin bulunduğu karakter datalarının başlangıç adresi yazılmalıdır. d2 ve d3 register'leri 0 olmalıdır. Fonksiyonun library ofseti, -222'dir. Şayet çağırdığımız programın çıkışını (DIR'de olduğu gibi directory çıkışı) bir file'a kaydetmek istiyorsak, d3 register'ine o file'ın handler'ını yazmamız gerekmekte. Bunun için de daha önceden dosyayı yaratmamız (Open ile) gerekmekte.
Şayet bazı komutlarda olduğu gibi bilgi girişine de ihtiyaç varsa, d2 register'i bilgi girişinin yapılacağı device'in file handler'ını bulundurmalı. d2'ye 0 değeri verdiğinizde, giriş birimi olarak console device (klavye) kabul edilir.
File handler'ı nasıl elde edebileceğimizi soranlar için işte cevabımız: DOS library'sinden Open fonksiyonu doğru olarak çağrıldıktan sonra, d0 register'inde bize istediğimiz file handler'ı verilmekte. File handler'ı BCPL pointer'ı ile kesinlikle karıştırmayın.
Execute fonksiyonunu, yeni bir CLI açmak için de kullanabilirsiniz. Bunun için yapmanız gereken, d1 register'ına boş bir string dizisini göstermek ve d2'ye de daha önceden açmış olduğunuz bir pencerenin file handler'ını yazmak olacak.