Bu sayfadaki yazılar
Sayfanın metni
Sayfa 12
Herkese merhaba. Bu yazıda assembler uygulamalarında çok zorluk çıkaran bir konuyu ele alacağım. O da yazılan programın farklı konfigürasyonlarda çalışmaması, kısaca UYUMSUZLUK. Uyumsuzluk, birden fazla sebepten oluşabilir. Şimdi bu sebeplere sırayla değinmeye çalışacağım.
1. Sabit Adresler Üzerinde Çalışmayın. Birçoğumuz Assembler'a başlarken grafik başlangıç adresi olarak $60000, $70000 gibi sabit adresleri alırız, sonra da bu adresten itibaren belirli bir hafıza bloğunu siler ve üstünde grafik işlemleri yaparız. İyidir, hoştur ve o anda Amiga'nızda çalışmaktadır. Fakat bu aslında iyi bir şey değildir çünkü gözümüze kestirdiğimiz bu sabit adres her zaman boş olmayabilir. Arkada çalışan başka herhangi bir programın çalışma alanını ya da daha kötüsü farklı bir konfigürasyonda, sisteme ait bellek alanını değiştiriyor olabiliriz. Sabit adresleme metoduyla yazdığımız programın iki şansı vardır: Ya çalışacak ve çıktığı zaman sistemi göçertecek ya da şansa boş adresi taban aldığı için düzgün çalışıp işi bittiğinde normal bir şekilde sisteme dönecektir. Fakat ikincisi çoğunlukla olmaz ya da Murphy kurallarına uyarak, üç-dört ay adam gibi çalıştıktan sonra ara sıra guru vermeye başlar. Hele hele programınızın başka programlarla birlikte kardeş kardeş multitask etmesini düşünüyorsanız, sabit adreslemeyi hepten unutmanız gerekecek, çünkü multitask bir ortamda sabit tek bir adresi değiştirmek bile öldürücü etki yapabilir. En iyi ihtimalle 2.0 ve üstü bir sistemde çalışıyorsunuzdur ve sistem problemli alanı diğer programlardan izole etmeyi başarabilir. En kötü ihtimalle, gene 2.0 ve üstü sistemle çalışıyorsunuzdur, ama sistemin kendi yapılarını alt üst etmişsinizdir. Dolayısıyla, doğrudan sevgili gurumuzla karşılaşırsınız. O zaman yapılması gereken şey, kullanacağınız kadar hafızayı sistemden istemektir. Bu gerçekten çok hoş bir şeydir çünkü sistem zaten istediğiniz kadar hafızaya sahipse bunu size seve seve verecek ve başka programların sizin hafızanıza bulaşmasını -tabii ki sistemle uyumlu çalışanların- önleyecektir. Peki nasıl hafıza istenir? Bu iş için ROM'da bulunan AllocMem() fonksiyonunu kullanacağız. Öncelikle istediğimiz hafızayı byte cinsinden D0 registerine yazmalıyız. Sonra da ne tür bir hafıza istediğimizi belirtmeliyiz. Bunun için bir takım değerler vermem gerekiyor. Şimdi sıralayacağım özellikler içinden hangileri istediğiniz hafıza tipine karşılık geliyorsa, o özelliğe ait rakamı bir kenara yazın ve sonra kenara yazdığınız tüm rakamları toplayıp D1 adresine yazın. Ve ardından ofseti -198 olan bu fonksiyona dallanın. (Nasıl yapacağını bilemeyenler için biraz aşağıda kısa bir uygulama örneği var.) MEMF_CHIP: İstediğiniz hafızanın Chip RAM'den seçilmesini sağlar. Custom Chip'ler sadece Chip RAM'e erişebilirler. Copperlist, görüntü alanı, sprite bilgileri, müzik sample'ları vs. Hepsi Chip RAM'de bulunmalıdır. Bu özelliğe ait değer $02'dir. MEMF_FAST: Chip RAM dışında kalan, genişletilebilir hafıza tipi. Fast RAM'e sadece CPU eriştiği için buradaki programlar Chip RAM'de yer alanlara oranla daha hızlı çalışacaktır.(Bunun için bu tip hafızaya FAST MEM adı verilir.) Bu özellikte hafızaya ait değer $04'dür. MEMF_PUBLIC: Elde ettiğiniz hafızanın başka bir yere oynatılmamasını sağlar. Şu anki sistemler zaten ayrılan hafızaları bir yerden diğerine taşımıyorlar, fakat siz yine de ileriki bir sistemde hafızanızın yerinden oynatılmasını istemiyorsanız bu bellek tipini isteyin. Değeri $01. MEMF_CLEAR: Size verilen hafıza bloğunun önce temizlenip, sonra verilmesini sağlar. Eğer hafızayı grafik alanı için kullanmak istiyorsanız bu faydalı olur, çünkü bu hafıza parçasında zırva şeyler varsa ekrana yansıyacaktır. Bu fonksiyon, sizi bir temizleme rutininden kurtarır. Değeri $10000.
ASSEMBLER PRO Programlarınız Tüm Amiga Modellerinde çalışsın.
NOT: Eğer Chip ve Fast seçeneklerini de açmışsanız, sistem öncelikle Fast memory arar. Bulamadığı zaman ise, Chip memory'yi araştırır. Aşağıda kısa bir örnek program bulabilirsiniz. Amaç, $5000 byte'lik Chip RAM alanını sistemden istemek ve sistem bu alanı bize veremezse insan gibi programı terk etmek. İyice inceleyin. Sizin, bu tür bir programı kendi rutinlerinize ekleyebilecek kadar bilginizin olduğunu varsayıyorum.
lea 4.w,a6b move.l #$5000,dü move.l jsr -198(a6) cmp.l #0,d0 beg.s END
; hafıza miktarı 7 $100004$02 ; hafızamızı istiyoruz
; eğer istediğimiz türden ; bir hafıza yoksa ; END label'lı adrese git. ok: ... rutinimiz buradan başlar.. DO'da bize ait hafızanın ; başlangıç adresi var
END: rts Artık tüm işlemlerinizi sabit bir adrese göre yapabilirsiniz, o adres de size D0'ın içinde verildi. D0 ile size verilen bu değeri bir taban değer olarak alıp, hafıza ile ilgili tüm işlemlerinizi bu adresten itibaren kullanın. Bazılarınızın aklına şu soru gelebilir. Önceden $70000, $60000 gibi adresleri copperlist'imize yazmak kolaydı. Çünkü değerlerin ne olduğunu biliyorduk ve bu adresi WORD'lere ayırıp gerekli adreslere yazıyorduk. Örnek:
copperlist: dec.w $00e0,$0006,$00e2,$0000
Ama şimdi sistemden alacağımız hafıza her seferinde farklı olacak. Her seferinde değişen bir değeri Copperlist'e nasıl yazabilirim? Aslında soru yanıtıyla birlikte geliyor. Değeri elde ettikten sonra, onu Copperlist'e yazacak bir rutin yazmalısınız. Mesela, hafızayı Allocate ettikten sonra onu BASE adında bir longword'e attınız diyelim. Aynı zamanda 2 bitplane'iniz var ve her bir bitplane $2800 bayt yer kaplıyor. Siz de grafik hafızası olarak allocate ettiğiniz hafızadan itibaren $2800*2 bayt'ı grafik hafızası olarak kullanmak istiyorsunuz. Yapmanız gereken şey, şöyle bir şey..
setbplpointers:
move.l base,di move.w di, swap di move.w di, swap di
add.l #$2800,d1i move.w swap dl move.w rts
copperlist: dc.w $00e0,$0000,$00e2, $0000 dc.w $00e4,$0000, $00e6, $0000 dc.w $0100,$2200
$fffe,$fffe Aynı şekilde, grafik işlemlerinizde kullanacağınız taban adresi de BASE adlı adresten alıp, gerekli ofseti üzerine ekleyerek kullanmalısınız. Göründüğünüz kadar da zor değil.. Umarım bunu anlamışsınızdır. Sırada ikinci uyumsuzluğumuz var..
2. Kendini Değiştiren Kod Tekniğini Kullanmayın. Aslında şimdi anlatacağımı bazılarınız yapmıyor olabilirler. Yine de yazılan kodun cache hafızalı çiplerde (68020, 68030, 68040) çalışmamasının en büyük sebeplerinden biri bu. Peki nedir bu ??
Klavyeyle gezinmek için ← ve → tuşları.