25.11.2014 Views

Amiga Dunyasi - Sayi 21 (Subat 1992).pdf - Retro Dergi

Amiga Dunyasi - Sayi 21 (Subat 1992).pdf - Retro Dergi

Amiga Dunyasi - Sayi 21 (Subat 1992).pdf - Retro Dergi

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

DİLLER<br />

AMIGA<br />

ASSEMBLER<br />

Cem GENCER<br />

Merhaba! İşte yine birlikteyiz. Bakalım<br />

bu ay postadan neler çıktı? Tolga ATUĞ<br />

arkadaşımız, tekrar yazarak birkaç ufak<br />

sorununu belirtmiş. Bunlardan ilki, Örnek<br />

17.1'de 59. satırda basımda oluşan bir hata.<br />

<strong>Dergi</strong>mizde 'dd.l #$54,a0' olarak basılan<br />

satır 'add.l #$54,a0' olmalı. Herhalde<br />

add komutunun da işlevini öğrendik? Tolga,<br />

yardımcı olarak kullanılabilecek kitapları<br />

listelememi istiyor.<br />

İşte size gerekli olabilecek kitaplar:<br />

* ROM Kernel Reference Manual:<br />

Libraries and Devices<br />

* ROM Kernel Reference Manual:<br />

Exec<br />

* ROM Kernel Reference Manual:<br />

Autodocs and Includes<br />

* Hardware Reference Manual<br />

* Mapping the <strong>Amiga</strong><br />

Bunun dışında, Abacus'un Assembler<br />

kitabı da bir hayli yararlı. Edinmenizde<br />

fayda var, ama şart değil.<br />

Diğer mektup ise Gürkan YENİÇE-<br />

Rİ'den gelmekte. Bu arkadaşımızın da<br />

karşılaştığı en önemli sorun, bazı programlarda<br />

compile esnasında 'word at odd<br />

adres' hatası vermesi. Bunun çözümü gayet<br />

basit. Hata veren satırdan öncesine bir<br />

satır ekleyerek buraya 'even' komutunu<br />

yazmak yeterli.<br />

Bu iki kısa mektuptan sonra, bu ayki<br />

konularımıza geçebiliriz. Bu ay biraz hızlı<br />

bir geçiş yapacağım. Farkettiyseniz, bu ay<br />

yazabileceğiniz bir program yok. Bunun<br />

nedeni, bu ay birkaç library fonksiyonu<br />

açıklayacak olmam. Ayrıca assembler komutları<br />

tablosu da bir hayli yer kaplıyor.<br />

Geçen aylarda pencerelerin nasıl açıldığını,<br />

buraya nasıl basım yapıldığını görmüştük.<br />

İlk inceleyeceğimiz library fonksiyonu,<br />

MoveWindow. Bu fonksiyon intuition<br />

lirary'de bulunmakta ve istediğimiz<br />

pencereyi istediğimiz yönde kaydırmaya<br />

yaramakta. Parametreleri sadece üç<br />

tane: Window, dx ve dy. Window, pozisyonu<br />

değiştirilecek pencerenin pointer'ı, dx<br />

ve dy ise dikey ve yatayda kayma değerleridir.<br />

dx negatif bir sayı olduğunda pencere<br />

sola, dy negatif olduğunda pencere yukarı<br />

doğru verilen piksel kadar kayacaktır.<br />

Aşağıdaki ufak rutinde, pencerenin pozisyonu<br />

2'şer piksel sola çekilerek kaydırılıyor.<br />

Pencere koordinatı 0 olduğunda da<br />

ana programa dönülür. Tabii ki pencere<br />

boyutları ekrandan küçük olmak zorunda.<br />

MoveWindow:<br />

move.l IntBase,a6<br />

move.l WindowPtr,a0<br />

move.l #-2,d0<br />

move.l #0,dl<br />

jsr -168(a6)<br />

move.l WindowPtr,a0<br />

move.vv 4(a0),d0<br />

tst.w d0<br />

bne.s MoveWindow<br />

rts<br />

Gayet kolay, değil mi? MoveScreen<br />

fonksiyonu da aynı şekilde çalışır. Bu<br />

fonksiyonda, sadece window structure adresi<br />

yerine screen structure adresini a0'a<br />

yazmamız gerekmekte. Fonksiyonun ofseti<br />

de -162 (=-$a2).<br />

Gelin şimdi de bir guru verdirelim bilgisayarımıza.<br />

Hemen telaşlanmayın; bu guru<br />

kontrollüdür. Sistem crash etmeyecek,<br />

fakat o ünlü kırmızı kutu yanıp sönecektir.<br />

Kutunun içine de istediğimiz yazıyı yazabiliriz.<br />

DisplayAlert fonksiyonun kullanımı<br />

gayet basit; sadece alert tipini, text<br />

string'ini ve toplam yüksekliği bilgisayara<br />

girmemiz yetiyor. String'in başlangıç adresini<br />

aO register'ına, uzunluğunu ise di 'e<br />

atıyoruz.<br />

String tipi ise d0 register'ı aracılığıyla<br />

belirlenmekte. Buraya 0 değerini yazdığınızda,<br />

RECOVERABLE ALERT tipini<br />

seçmiş oluyorsunuz. Bu, alert kutusu gösterildikten<br />

sonra mouse tuşuna basılırsa,<br />

programınıza geri dönmeyi sağlar. Şayet<br />

fonksiyonu çağırmadan önce d0'ın 15. bitini<br />

set ederseniz, (=$80000000)<br />

DEADEND_ALERT yaratmış olursunuz.<br />

Alert kutusu çıktıktan sonra mouse tuşuna<br />

bastığınızda bilgisayar resetlenecektir.<br />

String'imiz özel bir şekilde verilmek zorunda.<br />

String içinde koordinatlar ve devam<br />

etme bilgileri de bulunmakta. Koordinatları<br />

ASCII string'in kendisinden önce<br />

word ve byte olarak vermeliyiz. İlk word,<br />

basılacak string'in kutu içersindeki x<br />

koordinatı, ardından gelen byte ise y<br />

koordinatıdır. Bundan sonra gelen ASCII<br />

byte'lar string'in kendisini oluşturur.<br />

String'in sonunda bir 0 byte'ı olmalıdır.<br />

En son byte ise başka string satın olup olmadığını<br />

gösterir. Eğer bu byte 0'dan<br />

farklıysa, bu byte'ı diğer string tanımlamaları<br />

izler. Başka string tanımlaması<br />

yoksa, en son byte 0 değerini taşımalıdır.<br />

Aşağıda alert rutinini çağıran ufak bir altrutin<br />

görebilirsiniz.<br />

Alert:<br />

move.l IntBase,a6<br />

move.l #0,d0<br />

move.l #Str,a0<br />

move.l #12,d1<br />

jsr -90(a6)<br />

its<br />

Str:<br />

dew 92<br />

dc.b 2<br />

dc.b 'Bu bir alert'tir.',0<br />

dc.b 0<br />

Dilerseniz bir de birden çok satirli alert<br />

için de bir örnek rutin vereyim.<br />

Alert:<br />

move.l IntBase,a6<br />

move.l #0,d0<br />

move.l #Str,a0<br />

move.l #22,d1<br />

jsr -90(a6)<br />

rts<br />

Str:<br />

de. w 108<br />

dc.b<br />

dc.b<br />

2<br />

'AMIGA DUNYASI\0<br />

dc.b<br />

dc.w<br />

-1<br />

92<br />

dc.b<br />

dc.b<br />

12<br />

'Bu bir alert'tir.\0<br />

dc.b 0<br />

Bu ay inceleyeceğimiz başka bir fonksiyon<br />

da, yine Intuition library'de yer alan<br />

ClearPointer fonksiyonu. Bu fonksiyon<br />

ile istediğiniz window'un pointer'ını<br />

ROM'daki sabit pointer göstergeciyle değiştirebilirsiniz.<br />

Fonksiyonu çağırmak için<br />

sadece window pointer'ını aü'a atmamız<br />

ve 'jsr -60(a6)' ile de fonksiyonu çağırmamız<br />

yeterli. Artık pointer'ını sildiğiniz<br />

window'u aktif yaptığınızda, pointer değişerek<br />

ROM'dakinin kopyası olacaktır.<br />

Diğer çok kullanılan bir fonksiyon da<br />

PrintlText. Bunun yardımıyla bir pencere<br />

ya da sereen'in içine intuition text'i yazdırabilirsiniz.<br />

Intuition text'in graphics<br />

library'deki Text fonksiyonundan farkı,<br />

intuition text'in window değişimlerinden<br />

silinip bozulmaması. Graphics<br />

library'deki text fonksiyonunu kullanarak<br />

bir pencere içine yazı yazdırdığımızda ve<br />

pencereyi küçülttüğümüzde, yazının pencere<br />

boyutu dışında kalan kısmı silinir.<br />

Fakat pencereyi tekrar büyüttüğümüzde,<br />

yazımızın silinen bu kısmı tekrar yerine<br />

konmaz. Oysa intuition text'te yazımızı<br />

bozan her işlemden sonra window içeriği<br />

refresh edilerek bozulmanın tekrar düzelmesi<br />

sağlanır. Bütün bu işlemler otomatik<br />

olarak intuition sistemi tarafından gerçekleştirilir.<br />

PrintlText çağrılmadan önce 4 register<br />

belli parametrelerle yüklenmelidir. Bunlardan<br />

ilki, ekran ya da window'a ait rastport<br />

adresinin atandığı a0 register'ıdır. Yazı<br />

string'imizin başlangıç adresi ise al adres<br />

register'ına atanmalıdır. Yazı string'inin<br />

sonuna bir 0 byte'ı koymayı da unutmayın!<br />

d0 ve di register'lan ise yazının<br />

rastport'ta basılacağı x ve y koordinatla-<br />

AMIGA DÜNYASI 46

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!