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
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