Amiga Dünyası sayı 17, sayfa 18

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 18

adresleme denmekte. a0 adresine ofset değeri kadar sayı eklenilir ve bulunan adresteki değer bir registere ya da hafızaya aktarılır. Bu komut da birkaç komuta bedel. Bunları açacak olursak :

move.w n(a0),d0'ın karşılığı aşağıdaki gibi olur:

add.l #n,a0 move.w a0,d0 sub.l #n,a0 Gördüğünüz gibi, bu çok kullanışlı bir adresleme tipi; bu kullanışlılığı da hızdan tasarruf etmemizi sağlamakta. Bu adresleme şeklini burada bu kadar detaylı açıkladım; çünkü bundan sonra bu şekilde adreslemeleri daha çok kullanacağız.

Son olarak RASTPORT değişkenini a0 registerine atarak, jsr satırı sayesinde de gerekli library fonksiyonunu çağırıyoruz. (jsr -240(a6)). Ha, bu arada a0 registerinin içeriğini saklamamızda fayda var; çünkü büyük bir olasılıkla çağırdığımız library, bu register içeriğini silecektir. Çağırdığımız library rutinine gelince; bu grafik kursorunu d0 ve d1 registerlerinde belirtilen koordinata götürecek olan library fonksiyonudur. Grafik kursoru normalde gözükmez; fakat işlevi büyüktür. Bunun sayesinde ekranın istediğimiz yerine yazı yazar, nokta koyar ya da çizgi çizebiliriz. Bu, aynı kalemle çizim yaparken kalemi çizimin başlangıç noktasına götürme işlemi gibidir.

move.w 4(a0),d0 move.w 6(a0),d1 move.l RASTPORT,a1 jsr -246(a6) Bu satırlar, deminkilere çok benzemekte. Fakat burada ikinci koordinat çiftini registerlere atıyoruz ve başka bir library fonksiyonu çağırıyoruz. Bu sefer kullandığımız fonksiyonun adı DrawLine ve çizgi çizmeye yarıyor. Demin incelediğimiz Move ile grafik kursorunu yerleştirdikten sonra DrawLine'ı çağırırsak ekranda bir çizgi çizilir. Bu çizginin başlangıç koordinatı, Move fonksiyonunda kullandığımız noktadır. Bitiş noktasını ise DrawLine fonksiyonunda kullanılan değerler ikilisi belirlemekte.

Hemen sonraki satıra bakıyoruz; burada COORDSPTR değişkenine 8 değeri eklenmekte. Bunun sebebi, bir sonraki koordinat çiftini kullanmak isteyişimiz. Eğer LP label'ından sonra kullandığımız dolaylı adreslemeyi kullanmasaydık ve aşağıdaki gibi satırlar yazsaydık (COORDSPTR değişkeni de kullanılmıyor!) bakalım neler olurdu?

move.l #n,d7 LP:

lea COORDS,a0 . . . add.l #8,COORDS dbf d7,LP Böyle bir programlama sayesinde data tablosundaki bilgilere zarar gelecekti. Di- ğer bir aksayan noktayı da programdaki

döngüye bakınca görebiliriz. Bu şekilde bir rutin yazsaydık, data tablosundaki diğer değerlere ulaşmamız, bir hayalden öteye gidemezdi. Ne de olsa her seferinde döngü tekrarlandığında, data tablosunun başlangıç adresi a0 registerine yazılacaktı. Bu da döngünün en önemli fonksiyonunu iptal ederdi. Her neyse açıklamamıza devam edelim; incelediğimiz altrutinin en son satırında d7 kontrol edilerek gerekli yere dallanılmakta. Döngü bitmişse (d7'nin içeriği negatif bir değere ulaşmışsa), ana programa geri dönülmekte.

Ana programda kaldığımız yerden devam edelim; bir sonraki satırımız sayesinde yazı yazma rutinine dallanıyoruz. Burayı da açıklamadan geçiyorum; ne de olsa bildiğimiz bir şey.

Ana programda bundan sonraki kısım ise, hepinizin geçen aydan tanıdığı EVENT rutinine dallanış ve duruma göre dallanma. Burada yine WINDOWCLOSE gadget'ını kontrol ediyoruz ve bunu klikleyip çıkış rutinine geçiyoruz.

Eh, bu ay da buraya kadar gelebildim. Artık gelecek ay daha zevkli bir konu olan window içinde grafik göstermeye geçeceğim.

Gelecek sayıda görüşmek üzere hoşça kalın ...

*********************************** ** AMIGA DÜNYASI ** ** ASSEMBLER KURSU ** ** INTUITION LIBRARY ** ** WINDOW EXAMPLE ** ** ÖRNEK 17.1 ** ************************************** START:

movem.l d0-d7/a0-a6,-(sp)

bsr.s INITLIBS bsr.L INITSCREEN bsr.L DRAWBOXES bsr.L PRINTTEXT

EVENTWAIT:

move.l WINDOWPTR,a0 bsr.L EVENT

cmpi.l #$200,d4 beq.s ENDALL bra.s EVENTWAIT

ENDALL:

move.l INTBASE,a6 move.l WINDOWPTR,a0 jsr -72(a6) CLOSE2:

move.l INTBASE,a6 move.l SCREENPTR,a0 jsr -66(a6) CLOSE 1:

move.l 4,a6 move.l GFXBASE,a1 jsr -414(a6) EXIT2:

move.l INTBASE,a1 jsr -414(a6)

EXIT1:

movem.l (a7)+,d0-d7/a0-a6 rts

INITLIBS:

move.l 4,a6 lea INTNAME,a1 clr.l d0 jsr -408(a6) beq.s EXIT1 move.l d0,INTBASE

lea GFXNAME,a1 clr.l d0 ' jsr -408(a6) beq.s EXIT2 move.l d0,GFXBASE

rts

INITSCREEN:

move.l INTBASE,a6 lea NEWSCREEN,a0 jsr -198(a6) beq.s CLOSE 1 move.l d0,SCREENPTR move.l SCREENPTR,a0 dd.l #$54,a0 move.l a0,RASTPORT

move.l INTBASE,a6 lea NEWWINDOW,a0 jsr -204(a6) beq.L CLOSE2 move.l d0,WINDOWPTR

rts

EVENT:

move.l 4,a6 move.l 86(a0),a0 move.l a0,MSGPORTADRESI move.b 15(a0),d1 moveq #0,d0 bset d1,d0 jsr -318(a6) move.l MSGPORTADRESI,a0 jsr -372(a6) move.l d0,a1 move.l $14(a1),d4 jsr -378(a6) rts

DRAWBOXES:

clr.l d0 clr.l d1

move.l GFXBASE,a6 move.l #LINES,d7 sub.l #COORDS,d7 divu #4,d7 sub.l #1,d7

LP:

lea COORDSPTR,a0 move.l (a0),a0

move.w 0(a0),d0 move.w 2(a0),d1 move.l a0,DEPO

Klavyeyle gezinmek için ← ve → tuşları.