Bu sayfadaki yazılar
Sayfanın metni
Sayfa 47
Selam !!! Bu ay dergimizde yeni bir köşeye başlıyoruz. Bu köşede Assembler komutlarını öğrenmiş ve artık somut bir şeyler görmek isteyen arkadaşlara hitap edeceğim. Tabii bu arada Assembler Kursu yazı dizisini de takip etmeniz, sizin faydanıza olur.
Assembler diliyle programcılık, Amiga'da ikiye ayrılır. Bunlar, kurallı programcılık ve daha çok oyun yazanların ve cracker'ların kullandığı sınırsız programcılıktır. Nedeni de bu şekilde programlama yapan birinin sistem rutinlerini ve structure'larını bilerek kullanması gerektiğidir.
Diğer tip programcılık, bu yazı dizisinde takip edeceğimiz şekildir. Sınırsız programcılık ismini taşımasının sebebi, programcının sistem kurallarını fazla dikkate almadan direkt hardware adresleri üzerinden çalışması yüzündendir. Bu şekilde yapılan programlama, genellikle oyun, intro ve demolarda kullanılır. Bu yüzden iş programı yazmak istediğiniz zaman, sistem rutinlerini kullanmanız ve bütün sistem kurallarına uymanız gerekir. Zira böyle bir iş programı, genellikle Intuition library'sini kullanacaktır. Fakat bir oyun programı yazmak istediğinizde, sistem sınırlamaları kısa sürede sizi üzmeye başlayacaktır. Çünkü bir oyun ya da demoda library'leri kullanmaya başladığınızda hız düşecektir. Oysa library'lerin yapabildiklerini biz kendimiz yaparsak, programın hızı maksimum düzeyde olur. Fakat bu çeşit bir programlamanın da dezavantajı devamlı geliştirilen bilgisayarlardır. Çünkü her yeni modelde, sistem rutinleri biraz daha geliştirilerek hızlandırılmakta. Bu gelişen modeller de çok kuralcı bir yapıya sahipler; kural dışı bir programla karşılaştıklarında crash etme özellikleri fazla. Fakat kim bir Amiga 3000 ya da 3500 alarak bu makinada oyun oynamak ya da demo seyretmek isteyebilir?
Gelelim bu yazı dizisinde neleri nasıl anlatacağıma, ilk olarak bu yazı dizisini takip etmek isteyenlerin hiçbir bölümü kaçırmamalarını öneririm. Yapacağınız ikinci görev ise, verilen tüm örnekleri anlayıncaya kadar oturup denemeler yapmak. Zaten ben de işi mümkün olduğunca kolaylaştırıp bir sürü örnek vereceğim. Fakat yazının teorik bilgileri de bir hayli olduğundan, bazen yazıyı 2-3 defa okumanız gerekebilir. Böyle bir durumda, hemen bilgisayarı açıp Seka'yı yükleyin ve örnekleri uygulayın. Ayrıca vereceğim örneklerle sınırlı kalmak da olmaz; bu sınır-
ASSEMBLER'da
sız programlamaya ters düşer. Burada amaç, mümkün olduğunca araştırıp denemek. Bu yüzden aleti devamlı crash ettirebilirsiniz. Sorun değil, crash eden bilgisayar bozulmaz! Bazen sırf öğrenmek için de bilgisayarı crash ettirebiliriz. Fakat bunlara daha sonra değineceğim.
Yazı planı, yaklaşık şöyle olacak: »» Copper ve hardware registerlerinin tanımı ve bunlardan grafiksel amaçlı olanların kullanımı.
»» Sesle ilgili copper ve hardware registerlerinin kullanımı.
»» Disk işletim ünitesine erişim şekilleri; hem library, hem de hardware registerlerini kullanarak bilgi okuma ve yazma.
»» Port ciplerine erişim. »» En son olarak değineceğim konu da, demo ve intro teknikleri olacak. Bundan sonra artık oyun tekniklerine kısaca inmeyi düşünüyorum.
İlk olarak size copper'ı ve hardware registerlerini tanıtmakta fayda var. Zira bundan sonra, devamlı olarak bu iki terimi kullanacağız. Copper'dan işe başlayalım. Copper (COProcessER), aslında FAT AGNUS cipinin içindeki bir birime verilen isimdir. Ayrıca Fat Agnus'un içinde bir diğer birim daha vardır: BLITTER. Copper, ekran bilgilerini kontrol eden birimin adıdır. Bu birimde renk, ekran boyutları ya da bitplane kontrol kodları gibi bilgiler bulunmakta. Library üzerinden ekran açtığımızda da, library sonuçta bu copper registerlerine bilgi yazmakta. Yani ekran ile ilgili bilgilerin en son geldikleri nokta burası. Buraya gelen bilgi, anında gerekli cipi uyararak işlemin gerçekleştirilmesini sağlar. Copper registerlerinden birine bir değer yazarsak, bu başka bir birime gitmeden direkt olarak işlenir. Oysa library kullandığımızda, bir sürü atlamalar olacaktır. İlk önce, değerler kontrol edilecek ve kullanılabilirliği araştırılacaktır. Daha sonra gerekli structure'lar hazırlanacak ve bunlar bir sonraki rutine aktarılacaktır. Son olarak da, structure'lar ayrıştırılacak ve bilgiler gerekli yerlere iletilerek işlem sonuçlandırılacak. Bu arada gerekliyse daha önceden yapılan işlemin sonuçları hafızada ayrı bir structure'da saklanacak. Library'den geri döndüğümüzde, bizim de programda hata olup olmadığını kontrol etmemiz ve hata durumunda gerekli rutinlere dallanmamız gerekli. Bütün bu işlemlerin sebebi, bilgisayarın multitasking olmasından kaynaklanıyor. Aynı anda birden fazla program çalışmaktaysa, biri diğerinin bilgilerini bozmamalıdır.
YENİ UFUKLAR
Cem GENCER Bunun için de, sistem tüm kontrolü eline alarak bize kullanabileceğimiz alanları göstermekte.
Oyunlarda bu dezavantajdır. Ne de olsa bir oyun ne kadar hızlı olursa o kadar beğenilir. Hiç kimse, ekranı titreyen bir oyuna para vermek istemez. Bu yüzden biz de tüm multi-tasking'i ve işletim sistemini devreden çıkarmalıyız. Bu, hızımızı bir hayli artıracaktır. Ayrıca hızı artırmak için değişiklikler yapmamız gerekebilir. Bu bilgi taşırken büyük sorun olabilir. Bu işlemi de BLITTER adlı birime devredebiliriz. Zira bu birimin temel görevi, çok hızlı olarak bilgi taşımaktır. Yan görevleri arasında da çizgi çizmek, hafızanın belli kısmını bir değerle doldurmak ve hafızada boş bölge aramak vardır. Bütün bu işlemleri blitter bir hayli hızlı yapmakta. Bazen blitter'ın işi daha önemli olabilir ve 68000, blitter'ın işini yavaşlatabilir. Bu gibi durumlarda blitter, 68000'i bir anlık devreden çıkarma hakkına sahiptir. Blitter işini bitirince, tekrar 68000'i devreye sokacaktır. Daha ilerde blitter ile detaylı bir açıklama yapacağım. Fakat şimdilik tekrar konumuza dönelim ve hardware registerlerini açıklamaya devam edelim. Ses kontrol registerleri dışında, geri kalan tüm hardware registerleri port entegrelerine bağlıdır. Bu cipler aracılığıyla ya port bilgileri kontrol edilir, ya da disk işletim ünitesi gibi birimlere komut ve bilgi göndererek çeşitli disk işlemleri gerçekleştirilebilir. Bu gibi konuları da yazı dizisinin ilerki bölümlerinde bulabilirsiniz.
Copper da, aslında 68000 gibi çalışan bir birimdir. Bildiğiniz gibi 68000, Amiga'nın mikro-işlemcisidir. Kendisine gelen komutları değerlendirerek gerekli işlemleri yapar. Copper'ı da aslında dört komutu olan bir mikro işlemci şeklinde kabul edebiliriz. Zira copper registerlerine bilgi aktarmak için belli komutları kullanmamız gerekli. Fakat biz bu komutları Seka'da komut olarak değil de, heksadesi-
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 46
DERLEYİCİLER
lıştırır çalıştırmaz göreceksiniz. Resim window içerisine taşınırken window çerçevesi bozulmakta. Ayrıca bu şekilde bir programlama pek kurallara uymuyor. Bu iki ufak hatayı gözardı ederseniz, aslında bir hayli kullanışlı bir rutin. Fakat önümüzdeki ay kurallara uyarak ve window çerçevesini bozmadan resmi nasıl gösterebileceğimizi araştıracağız. Hoşçakalın.
** AMIGA DÜNYASI AMIGA ASSEMBLER KURSU ** ** INTUITION LIBRARY - WINDOW EXAMPLE - 18.1 **
START: movem.l d0-d7/a0-a6,-(a7) bsr.s INITLIBS bsr.L INITSCREEN bsr.L PRINTTEXT bsr.L PUTGFX EVENTVVAIT:
move.l WINDOWPTR,a0 b s r . 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) CLOSE1: move.l 4,a6 move.l GFXBASE,al jsr -414(a6) EXTT2: move.l INTBASE,al jsr -414(a6) EXIT1: movem.l (a7)+,d0-d7/a0-a6 rts INITLIBS: move.l 4,a6 lea INTNAME,al clr.l d0 jsr -408(a6) beq.s EXIT1 move.l dOJNTBASE lea GFXNAME,al 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 CLOSE1 move.l d0,SCREENPTR move.l d0.MAINSCREENPTR move.l SCREENPTR,a0 add.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),dl
moveq #0,d0 bset dl.d0 jsr -318(a6) move.l MSGPORTADRESI,a0 jsr -372(a6) move.l d0,al move.l $14(al),d4 jsr -378(a6) rts PRINTTEXT: move.l GFXBASE,a6 move.l RASTPORT,al move.l #140,d0 move.l #220,dl jsr -240(a6) move.l RASTPORT.al move.l #TEXT,a0 move.l #[TEXTEND-TEXT-1 ] ,d0 jsr -60(a6) rts PUTGFX: move.l RASTPORT,a0 move.l 4(a0),al move.l 8(al),a2 add.l #[80*20] ,a2 move.l #PICTURE,al move.l #2000,d7 PLOOP: move.l (al)+,(a2)+ dbf d7,PLOOP rts MSGPORTADRESI: del 0 INTNAME: dc.b 'intuition.library',0 GFXNAME: dc.b 'graphics.library',0 even INTBASE: del 0 GFXBASE: del 0 RASTPORT: del 0 NEWSCREEN: de w 0,0,640,256,1 dc.b 0,1 de w $8000,1 del 0,0,0,0 WINDOWPTR: del 0 NEWWINDOW: dc.w 0,0,640,256 dc.b 0,1 del $200,$ 1008,0,0 del WINDOWTITLE SCREENPTR: del 0,0 dew 640,256,640,256,15 WINDOWTITLE: dc.b 'AMIGA DÜNYASI SAYI 18 ASSEMBLER' dc.b 'KURSU ÖRNEK PROGRAMI 18.1 ',0 MAINSCREENPTR: del 0,0 de w 340,60,340,60,15 TEXT: dc.b "Window içine tek bitplane " dc.b "resim basilisi...",0 TEXTEND: del 0 PICTURE: inebin "df0:RESIM.bm"