MegAmiga sayı 5, sayfa 17

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 17

#0O,bltamod ; source modulosu

Merhaba, bu aydan itibaren derginizde AMIGA MACHINE LANGUAGE (AMIGA MAKİNE DİLİ) ile ilgili basit ve güzel ipuçları anlatacağım. Elimden geldiği ve bildiğim kadarıyla sizlere bazı güzel rutinleri tanıtacağım. AGA (A1200/A4000) makineler için 256 renk grafik basma, çok renkli sprite'lar ve buna benzer güzel olayları bildiğim kadarıyla size anlatacağım. Ayrıca, sizin yazmış olduğunuz ya da geliştirmiş olduğunuz rutinlere de yer vereceğim. Böylece bu köşe sayesinde hepimiz CODE bilgimizi geliştireceğiz. İlk olarak biraz blitter'dan bahsetmek istiyorum. Hafızada taşıma yapmak için kullanılan bir işlemdir ve DMA kanalından gider. Ekrana bir şey basmak ya da büyük hafıza bloklarını bir yerden bir yere taşımak isterseniz bunu kullanın. dmaconr=$dff002 - bltcon0=$dff042 - bltafwm=$dff044 - bltaptr=$dff050 - bltdptr=$dff054 - bltbptr=$dff04e - bltsize=$dff058 - bltamod=$dff064 - bltbmod=$dff062 - bltcmod=$dff060 press logo; move.l #source,a0 move.l #destination,a1 move.l #4,d0 ; bitplane adeti loop: move.l a0,bltaptr move.l #100,d0

#O,bltdmod ; destination modulosu #$TİTETİT,bltafwm #50910,bltcon0 move.w #$000,bltcon | move.w #|256*64)-4-20,bltsize bsr blit wait add.) -#$2800,a0 ; sourcedaki | plane'nin uzunluğu ; destinationdaki | plane'nin uzunluğu

sub.l #1,d0 bne Joop TİS

blit wait: btst #6,dmaconr bne blit wait rts | | Bu rutin SOURCE adresindeki bilgiyi DESTINATION adresine taşır. Burada en en önemli kısım moduloların hesaplanmasıdır. Mesela ekranınız 320x256 olsun. (LO-RES) şimdi 320'yi 8'e bölerek ekrandaki byte adedini bulursunuz. Yani ;

Ekranın X genişliği (pixel olarak) / 8 = Byte uzunluğu

-> byte.... Bu sizin görünen ekranınız olsun, (SOURCE) Ekranın Byte uzunluğu * Ekranın Y pixel genişliği 1 bitplane'nin uzunluğu. -> 320/8=40, Şimdi, SOURCE ekranımızın boyu (x uzunluğu) 40 byte, Eğer o ekrana basacağımız brush'ın boyu da 320 pixel yani 40 byte ise modulo = 0 olur yani ; Eğer brush'ın boyu 320 pixel ve siz bunun 64 pixellik bölümünü basacaksanız ; 64/8 = 8 byte.... DESTINATION MODULO >> 40-8 = 32 byte move.w #0,bltamod ; source modulosu | Ana uzunluk = 320 pixel = 40 byte Gözüken de 320 pixel ise = 40 byte Ana uzunluk-Gözüken uzunluk = 0 #32,bltdmod ; destination modulosu Blitsize'in hesabı çok kolaydır. (brush'ın y uzunluğu (pixel) * 64) + Brush'ın byte uzunluğu/2 320x256'lık bir brush için: 320/8 = 40 byte / 2 = 20 256*64 = 16384 = $4000 + 20 = 16404 = $4014 yani #$4014. blitsize *#UYARI** Blitsize hep word olarak verilir. Blitter WORD olarak işlem yaptığı için 65536'dan büyük sayı verilemez. (0-65535) Dolayısıyla blitter ile kopya yaparken brush'ın x genişliği 16 pixelden küçük Ama 16 pixelden ufak taşıma yapılabilir onun için Mask yöntemi var onu gelecek sayılarda anlatacağım. İşte olay bu..... Haftaya matris yardımıyla ekranın istediğiniz bir yerine blok basmayı anlatacağım. e YA VİGO

DURATA Tani A b 8 İk | | Kimseye verecek tek bir | hi, NE Ye TM || hesabım yok bu dünyada , T © $ * kt Fd

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