Bu sayfadaki yazılar
Sayfanın metni
Sayfa 15
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 14
Mesela bir sinüs tablonuz var ve bu sinüs tablosundan devamlı ardışık değerler alıyorsunuz, sonra tablonun başına dönüp tekrar aynı değerleri alıyorsunuz ve bu böyle gidiyor.. Benim ilk bulduğum çözüm şu olmuştu: doit: lea sine,a0 cmp.b (a0) bne.s nowrap move.l #sine,doit+2
; problemli yer burası.
; sakatlığı yaratan ; satır, no:11
bra.s doit ... add.l #1,doit42 ; sakatlığı yaratan ! ; satır, no:2 rts sine: dc.b dc.b $£Ef
Dikkat ettiyseniz, rutin kendi üzerinde değişiklikler yapıyor (move.l ve add.l #1,doit+2). Peki ama bunun ne gibi bir dezavantajı olabilir ki?? Bu teknik, 68000'de çalışır. Fakat yanıltıcıdır çünkü cache hafızalı işlemcilerde büyük bir sorun yaratır. Cache hafızanın bir tanımını yapmanın tam zamanı. Çoğunuz biliyorsunuz, işlemci işlediği komutları hafızadan teker teker alır. Fakat hafızaya erişmek işlemci için zaman alan bir olaydır, çünkü hafıza birden fazla chip tarafından paylaşılmaktadır (Chip RAM'den bahsediyorum), fakat bu paylaşımın bir sıra içerisinde olması gerekir. Bir sıra içinde olması demek de İŞLEMCİNİN BEKLEMESİ anlamına gelir. Günümüzde işlemcilerde aranan en önemli özellik hız olduğuna göre, hafızaya erişimin daha az zamanda gerçekleşmesini sağlamak gerekecektir. Bunu da nasıl sağlarız diye düşünen mühendisler, işlemciye sadece kendisinin kullanacağı küçük bir hafıza ekleyince daha hızlı işlemcilerimiz ortaya çıkmış. İşlemci, belli bir kurala göre işlettiği komutları kendi içinde yer alan belleğe alır. Daha sonra, program içinde kendi belleğine attığı komutlara erişmesi gerekirse belleğe erişmekle hiç uğraşmaz, doğrudan doğruya kendi belleğinde yer alan komutu işleme sokar. Bu sayede Fast RAM'de yer alan bir komuttan bile hızlı çalışır komutunuz. Fakat, yapısı gereği, Cache'li sistemler en çok döngülerde etkin olabiliyorlar. Örneğin, 68020'de ya bir ekran silme rutini, tamamıyla cache'e sığdığı zaman blitter'dan hızlı çalışabilir. İşte cache hafızalı chiplerin hikayesi de bu. Şimdi bizi esas ilgilendiren ufak bir ayrıntıyı açığa kavuşturalım. Komutun kendisi üzerinde bir işlem yaptığınızda, 68000 komutları bilgisayarın hafızasından aldığı için normal çalışır. Buna karşılık, 68020 gibi cache'li bir CPU, bu değişikliği bellekte yapacak fakat cache'e attığı komutu aynen koruyacaktır. Sizin değiştirdiğinizi sandığınız komuta tekrar erişilince, bellekteki değiştirilmiş komut yerine cache'in içindeki çağrılacaktır. Bunun sonucunda programınız ya hatalı çalışacak ya da hepten göçecektir. Öyleyse neymiş? Kendini değiştiren kod yazılmazmış! Tamam.. Size bir de deminki rutinin cache hafızalı işlemciler için yazılmış
bir versiyonunu vereyim. doit: lea sine,a0 move.l ofset,d0 move.b (a0,d0.1),d1i cmp.b #ŞEf,di bne.s nowrap moveg.l #0,ofset bra.s doit
nowrap: ... adda.l #1,ofset rts sine: de.b dc.b $£f even ofset: O
3. Zamanlamalarınızı İşlemci Döngüleri İle Yapmayın. Bir işleme girişmeden önce biraz beklemek için kullanılan en eski (ve en uyumsuz) yöntem, bir döngü kurup, 0'dan yüksek bir sayıya kadar saymaktır. Bu işlem, CPU hızıyla doğru orantılı şekilde bir zamanlama yaratır. Biliyorsunuz, bilmem kaç satırdır değişen işlemcilerden bahsediyorum. Meretler her seferinde daha da hızlanıyorlar. Peki ama durum böyleyken siz zavallı 68000 işlemcisi için yazdığınız bekletme döngüsünün bir 68040'da aynı hızda çalışmasını nasıl beklersiniz?? Hemen umutsuzluğa kapılmayın. Bu zamanlama işini sizin yerinize halledebilen bir zamanlayıcı zaten var. CIA çipi, birçok saate sahiptir. İstediğiniz hızda darbe üretir ve tabii ki HER AMIGA'da aynı sonucu verir. Bu iş için size yine bir sistem fonksiyonu önereceğim. DOS LIBRARY'de bulunan fonksiyonu işinizi görür. Delay(), tek bir değer ister sizden. Bu değer, beklemek istediğiniz sürenin 1/50'sidir. Aşağıda, bu komutu kullanmak için programa eklemeniz gereken rutini vereceğim. Bu rutin, Dos library'yi açar ve fonksiyonu yardımıyla üç saniye bekler. Rutinimiz bekleme süresini değerleştirdikten sonra DosBase'in 198 bayt gerisindeki Delay rutinini çağırmaktan başka bir işlem yapmıyor: 6
Bekler: move.l 4.w,a6 lea DosName,al jsr -408(a6) ; Dos Library'yi aç. emp.l #0,d0 beg.sgs END move.l d0,a6 DosBase'i a6'ya al. move.l #150,d1 ; Bekleme süresi 3 saniye jisr -198(a6) ; Delay() | buraya rütinlerinizi yerleştirin move.l a6,al move.l 4.w,a6 jsr -4A14(a6) ; Dos Library'yi kapat.
END: rts Bekletmeleri sağlıklı yapmanın bir yolu da raster taramalarını kontrol ederek bekletme döngüleri yazmaktır. Raster taraması için kısa bir tanım yapmak istiyorum. Bilgisayarınızın görüntü çipi, görüntü birimine saniyede 50 video görüntüsü yollar. Bu 50 karenin her birine biz 1 frame diyoruz. Aynı zamanda, her frame, ekrana bir sıra içerisinde gönderilir. Yani çıkacak görüntü yukarıdan aşağıya doğru satır satır taranarak Biz de o anda kaçıncı satırın tarandığını $dff006 adresinden okuruz. Bir frame içerisinde bu adres sadece bir kez $40 ve sadece bir kez $ff olacaktır. Bu ikisinin kontrolü sağlandığında 1 frame taranmış demektir (yani saniyenin 1/50'si). Böylesi bir kontrolü 50 * istenen saniye kadar yaparsanız tüm Amiga'larda eşit zamanda bekleyen bir rutin
sunuz. Olayın tam açıklık kazanabilmesi için örnek bir rutin... move.l #(50*10)-1,â6 ; 10 saniye ; beklenecek
testl: cmp.b #$40,Şd£f006 ; £rame'in yukarı ; kısımı tarandı mı? bne.s testl t test2: cmp.b #$E£E£,$d£f006 ; £rame'in a
aşağı ; kısmı tarandı bne.s test2
dbra d6,testi
rts NOT: Aslında $40 ve $ff, video taramasının uç noktalarıdır fakat bu değerler her frame içinde sadece 1 kez set edilirler. Bu iki değer arasındaki herhangi iki değer de aynı işi görür. Yalnız bu uygulamada dikkat etmeniz gereken bir nokta var: Multitask ortamlarda çalışmasını düşündüğünüz rutinlerinizde bu yöntemi yapmayın. Hatta ve hatta işlemcinin zamanını yiyecek herhangi bir döngü bile açmayın. Bu gibi durumlarda saydırma işini sistemin yapması gerekecek.
Eğer hayal gücünüzü zorlarsanız, başka uyumsuzluklar da yaratabilirsiniz. Fakat temel olan uyumsuzluk sebepleri bunlar. Lütfen artık uyumlu bir şeyler çıkaralım. Demolarınızın Amiga 1200 ve
4000'lerde çalışmasını istiyorsanız ve Assembler kullanmakta kararlıysanız bunlara dikkat edin. Yine de bu yazı yeterli olmazsa yardıma ihtiyacınız varsa hiç çekinmeden probleminizi bilginizle uzun uzun anlatın ve aşağıdaki adrese postalayın.
P.K.41 81311 Bahariye - İSTANBUL — sa ve e bir