Bu sayfadaki yazılar
Sayfanın metni
Sayfa 19
move.l RASTPORT,a1 jsr -240(a6)
move.w 4(a0),d0 move, w 6(a0),d1 move.l RASTPORT,a1 jsr -246(a6)
add.l #8,COORDSPTR
dbf d7,LP
rts PRINTTEXT:
clr.l d0 clr.l dl
move.l GFXBASE,a6 move.l RASTPORT,al move.l #97,d0 move.l #220,d1 jsr -240(a6)
move.l RASTPORT,a1 move.l #TEXT,a0 move.l #[TEXTEND-TEXT-l],d0 jsr -60(a6)
rts
MSGPORTADRESI:
dc.l 0 INTNAME:
dc.b 'intuition.library',0 GFXNAME:
dc.b 'graphics.library',0 even INTBASE:
dc.l 0 GFXBASE:
dc.l 0 RASTPORT:
dc.l 0 NEWSCREEN:
dc.w 0,0,640,256,1 dc.b 0,1 dc.w $8000,1 dc.l 0,0,0,0 WINDOWPTR:
dc.l 0 NEWWINDOW:
dc.w 0,0,640,256 dc.b 0,1 dc.l $200,$1008,0,0 dc.l WINDOWTITLE: SCREENPTR:
dc.l 0,0 dc.w 640,256,640,256,15 WINDOWTITLE:
dc.b 'AMIGA DÜNYASI SAYI' dc.b '17 ASSEMBLER' dc.b ' KURSU ÖRNEK ' dc.b 'PROGRAMI 17.1 ',0 MAINSCREENPTR:
dc.l 0,0 dc.w 340,60,340,60,15 DEPO:
dc.l 0 TEXT:
dc.b "iste window içine kutu çizimi" dc.b " ve yazma birarada.",0 TEXTEND:
dc.l 0 COORDSPTR:
dc.l COORDS COORDS:
dc.w 200,75,400,75 dc.w 400,75,400,175 dc.w 400,175,200,175 dc.w 200,175,200,75
dc.w 100,50,200,50 dc.w 200,50,200,100 dc.w 200,100,100,100 dc.w 100,100,100,50
dc.w 400,50,500,50 dc.w 500,50,500,100 dc.w 500,100,400,100 dc.w 400,100,400,50
dc.w 100,150,200,150 dc.w 200,150,200,200 dc.w 200,200,1U0,2U0 dc.w 100,200,100,150
dc.w 400,150,500,150 dc.w 500,150,500,200 dc.w 500,200,400,200 dc.w 400,200,400,15a
LINES:
dc.l 0
Klavyeyle gezinmek için ← ve → tuşları.
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