Commodore Amiga sayı 4, sayfa 25

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 25

O library “diskfont.library” 1 library “graphics.library” 2 3 declare function OpenDiskFont & library 4 declare function OpenfFoni&library 5 6 — 1 7 fontnodisk 4 - 0 8 9 Demo: 10 restore 11 print “Bunlar FONTS:'taki font- lar:” 12 43 for x—1 to 10 14 read 15 PrepareFont Font$, fontdisk» 16 print:print “punto” 17 next x 18 19 print “Tekrar ROM'daki fonta geri döndük:” 20 21 read 4 22 PrepareFont fontnodisk» 23 print Font$,Boy» “punto”

52 end if 53 end sub

Programın 0 ve 1 numaralı satırlarındaki library emirleri ile, hangi library'leri kullanacağımızı biliyoruz. Eğer gereken .bmap dosyaları veya (diskette duran) library'lerin kendileri bulunamazsa burada “File not found” hata mesajı gelebilir. AmigaBASIC'ten aynı anda en fazla 5 library kullanabilirsiniz. 3 ve 4 numaralı satırlar da ise fonksiyon olarak kullanacağımız, yani geriye bir değer vermesini beklediğimiz iki emiri birer birer 'declare' ediyoruz, yani sisteme bildiriyoruz. Daha sonraki 13. satırdan başlayan FOR döngüsü içinde, Font adını ve boyunu READ ile okuduktan sonra 15. satırda PrepareFont adlı Subprogramı çağırarak o fontu açıyoruz. 16. satırda yeni fontumuz ile bir şeyler yazdıktan sonra bunu 10 kez tekrarlıyoruz. Burada kullandığımız fontlar 25 ve 26, satırlarda ki DATA satırlarında veriliyor. Daha sonra 28, satırdaki DATA satırından okunan topaz 8 fontu ile 22. satırda tekrar

24 25 data Topaz,11,Ruby, 12,Opal, 15 26 dataGarnet,16,Emerald, 17, Di- amond,20,Emerald,20,0pal9 27. 28 data topaz,8 29

30 library coles 381 32 end 33 34 sub diske) static 35 FontNames 4 “font” -chrS(0) 36 FontBoy4 —- Boy» 37 EskiFont&-peekl(window(8)-- 52) 38 39 40 TextAttr&(1)— 41 TextAttr& - varptr(TextAtrr&(0)) 42 43 if — 1 then 44 YeniFont&- OpenDiskFont& Textttr&) 45 else 46 YeniFont&—openFont&(TextAttr&) 47 end if 48 49 if YeniFont& — O then 50 call CloseFont(EskiFont&) 51 call

eski fonta dönülüyor. LİBRARY CLO-SE ile library'ler kapatıldıktan sonra program bitiyor. Sıra geldi PrepareFont adlı Subprogram'ın nasıl çalıştığını açıklamaya. 35. satırda, Names adlı string değişkene font adını, arkasına “.font” sonekini ve C dilinde string sonunu gösterdiği için O sayısını karakter olarak ekliyoruz. AMIGA işletim sistemi çoğu C dilinde yazılmış olduğu için, bazı yerlerde C'nin normalde yaptığı şeyleri yapmak için BASIC'ten bazı hileler başvurmamız gerekiyor, buradaki CHRS(0)'da bunlardan biri. Şimdi hafızada 'structure' avına çıkıyoruz. Bunlar yine C dilinde kullanılan ve bileşik bilgi gruplarını sakamaya yarayan hafıza parçalarıdır. Pencereler, fontlar ve benzeri her önemli olay için gereken bilgileri AMIGA işletim sistemi bu tür structure'lar halinde tutar, 37. satırda ile penceremizin RASTPORT structure adresini buluyoruz, buna 52 ekleyip oradan da pencereye o anda bağlı olan Font'un adresini buluyoruz, eğer yeni fontumuzu açabilirsek bu eski fontu kapatacağız. Adresler 32 bitlik sayılar oldukları için bu adresi saklamak için yine değişkenimizin adına & karakterini ekliyo- TUZ. Şimdi ise, açmak İstediğimiz font'a ait istediğimizi taşıyan bir structure yaratmamız lazım. BASIC dili structure türü değişkenlerden anlamadığı için yine bir hileye başvuruyoruz. İstediğimiz, TextAttr adlı bir structure, Bunun yapısı ise şöyle: ilk önce 4 byte font adını taşıyan string'in hafızadaki adresi, 2 byte font'un yüksekliği, 2 byte da stil bilgisi ki, bunlara biz O veriyoruz. Hilemiz ise, 4 bayt'lık tamsayı elemanlardan oluşan bir dizi (array) doldurup, bunu kullanmak. TeptAttr& adını verdiğimiz dizinin ilk elemanına 39. satırda FontNames adlı isim değişkeninin adresini SADDI ) (String ADDress) ile bulup yerleştiriyoruz. Font boyunu sonraki 2 byte'a koymak için, bunu 2 üstü 16 yani 65536 ile çarpıp dizinin ikinci elemanına (1 numaralı eleman) yerleştiriyoruz. Sonra 41. satırda ) (VARiable PoinTer) ile bu dizinin (daha doğrusu dizinin ilk elemanının) adresini bulup bunu da TextAttr& adlı değişkene koyuyoruz. Artık fazla bir şey kalmadı, açılacak font'un ROM'da mı yoksa diskte mi olduğuna göre OpenFonil ) fonksiyonlarını, parametre olarak TextAttr adresimizi vererek çağırıyoruz (satır 44 ve 46.) Hatırlayacaksınız, bunları başta declare etmiştik, bunların geri verdiği değer hafızaya yüklenen Font'un adresi. Eğer font başarıyla yüklenebilmişse, bu değer sıfırdan büyük olacaktır, eğef bir sorun çıkmışsa değer sifirdır. Satır 49'da bunu kontrol ettikten sonra 50. satırda CloseFontl ) ile eski fontu kapatıyoruz, 51. satırda da SetFontl ) ile penceremizin RASTPORT'una (Bunun adresini yine windowf(8) ile elde ediyoruz) yeni fontumuzu yerleştiriyoruz. 53. satırda Subprogramımız da bitiyor. Evet, BASIC örneğimizi de verdik. Gelecek sefer Assembler örneği vermeyi düşünüyorum. Eğer Assembler örneğini daha önce İsteyip de bana geç yazdığım için kızanlar ya da Pascal'da hiç örnek vermediğim için üzülenler varsa (Var mı acaba?), bu gibi istekler için bana yazıp İsteklerinizi belirtmenizi rica ettiğimi hatırlatayım. Unutmayın, ağlamayan bebeğe mama vermezler. Son olarak yazımın başındaki ricamı tekrarlamak istiyorum: LÜT-FEN aklınıza takılanlar, yazıda anlaşılmaz bulduklarınız ya da daha çok İlginizi çeken ve şimdiye kadar benim değinmediğim konular hakkında fikirlerinizi ve isteklerinizi belirtin. Dergiye 'AMIGA İşletim sistemi' rumuzu ile yazarsanız İsteklerinize yanıt vermek için elimden geleni yapacağım. Tekrar görüşünceye kadar size mutluluklar ve (AMIGA'nıza ve buna dayanabilmeniz için) sabır dilerim.

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