GEOS VIII
Retro bilgisayarBir aylık bir aradan sonra GEOS programlama kursuna devam ediyoruz. Artık bu yazı dizisi sadece GEOS programlamasını değil; GEOS Desktop, geoWRITE, geoPAINT gibi GEOS programlarının kullanımlarını ve gizli yönlerinin açıklanmasını da kapsayacak. Yani bu aydan sonra tek başlık altında iki konuyla devam edeceğiz.
GEOS PROGRAMLAMA KURSU işte ilgili ipuçları
Bu ayki program konumuz GEOS grafik rutinlerinin makine dilinden çağrılması. Daha önce de belirttiğimiz gibi GEOS, menüler, ikonlar, pencereler gibi özellikleri desteklemek için yüksek çözünürlük (high resolution) grafik ekranını kullanır. Eğer yüksek çözünürlüklü grafik ekranlarıyla aranız iyi değilse, ya dergimizin eski sayılarında yayınlanmış yazılardan ya da “Programcının El Kitabı”ndan bu konu hakkında bilgi edinmeniz, yazıyı daha rahat anlamanız açısından oldukça yardımcı olacaktır. En genel anlamıyla ekrana herhangi bir şey çizmek, ekran RAM'inde bulunan bazı bitleri “1” veya “0” yapmaktır. Değeri 1 olan bitlere “önplan rengi”, 0 olanlara ise “arkaplan rengi” adı verilir. (DİKKAT!! bu “önplan-arkaplan” kavramı normalde kullanılanından farklıdır. C-64 işletim sisteminde “önplan” ekranın rengini, “arkaplan rengi” çerçevenin rengini belirtir.) GEOS'un normal ön/arkaplan rengi koyu gri/açık gri olarak belirlenmiştir (Hâlâ değiştirmediyseniz). Bu size biraz ters gelebilir çünkü genelde boş bir ekran siyah (ya da koyu bir renk) olarak düşünülür. Oysa bizde bunun tam tersi geçerli. Açık renkli bir ekran üzerine koyu renklerle yazı yazıyoruz. Bu tür kavramların kafanızı karıştırmasına asla izin vermeyin. Bu arada dikkat etmeniz gereken şey GEOS rutinlerinin grafik ekranının renk RAM'ını hiçbir şekilde etkilememesi. Yani değişik renkte bir şeyler çizmek isterseniz, programınızın renk RAM'ını da ayarlaması gerekiyor. geoPAINT programı da renkler konusunda bu yöntemi kullanmaktadır. GEOS grafik destek rutinlerinin en önemli özelliklerinden biri de bir “tampon grafik ekranı” bulundurmasıdır. Bu tampon ekranda asıl ekranın bir kopyası bulundurulup ve asıl amacı herhangi bir anda ekranın belli bir bölgesini eski haline çevirmektir. Bir bölgeyi eski haline getirmek terimi, bu bölgenin eski içeriğini tampon ekrandan asıl ekrana kopyalamak olarak açıklanabilir. Bu özellik çizim
Celal & Vedat Hallaç programlarına “UNDO” işleminin eklenmesini oldukça kolaylaştırır. Özellikle menüleri kullanırken tampon bölgeye sık sık başvurulur. Bir menü elemanını seçtiğinizde, tampon ekrandan menü boyutlarında bir bölüm olduğu gibi ana ekrana kopyalanır. Böylece menünüz kapanmış olur. GEOS'un bir özelliği de, yapılan grafik işlemlerinin ana ekrana mı, tampon ekrana mı yapılacağını $002F adresinin (“displayBufferOn” label'ıyla tanınır) değerine göre belirlemesidir. Bu işlem için $002F adresinin 6. ve 7. bitlerine bakarak karar verilir. Eğer 7. bitin değeri 1 ise ana ekrana, 6. bitin değeri 1 ise tampon ekrana çizim yapılır. İki bitin değeri de 1 ise her iki ekrana da çizim yapılır. $2F adresinin en yaygın kullanım şekli, herhangi bir grafik işlemini sadece bir ekrana yaptırmak, dolayısıyla sonradan kolayca silinmesini sağlamaktır. Bazı programlar belleğe öylesine muhtaçtır ki, tampon ekranını programı yerleştirmek için kullanır. Bu durumda menüleri nasıl kullanacaklar acaba? sorusunu duyar gibi oluyorum. Programda hiç menü kullanmamak bir çözüm tabi ki. Fakat GEOS'u tasarlayanlar bunu da düşünmüşler ve “RecoverVector” adlı bir vektör tanımlamışlar ($84B1-$84B2 adresleri). Bu vektör normalde RecoverRectangle (Bu rutin ne yazık ki gelecek sayıya kaldı!) rutinin adresini saklar ve GEOS bir menü veya herhangi bir alanı tampon ekrandan kopyalamak istediği zaman RecoverRectangle rutinini çağıracakmış gibi hazırlık yapar ve RecoverVector vektörünün sakladığı adrese bir sıçrama yapar. Eğer tampon ekranı ek RAM olarak kullanmayı düşünüyorsanız, yapmanız gereken şey, dikdörtgen alanların içeriğini saklayacak bir rutin yazmak ve RecoverVector vektörünün adresini burayı gösterecek şekilde ayarlamaktır. Tabi daha basit bir yol da var. Eğer her çağrıldığında ekranı yeniden çizecek bir rutin yazarsanız, ekranın belli bir bölgesinin saklanması ihtiyacı ortadan kalkar. Böylece hızdan kaybedersiniz ama RAM'dan oldukça tasarruf edersiniz. Bu kadar teorik bilgiden sonra pratik rutinlere geçme zamanı geldi sanırım. İşte en temel rutin olan çizgi çizme rutini ile başlayalım. Çizgiler, yatay-dikey çizgiler ve çapraz çizgiler olarak iki gruba ayrılırlar GEOS'un gözünde. Yatay ve dikey çizgileri kullanırken bir desen baytı kullanabilir ve bu sayede değişik şekillerde noktalanmış çizgiler elde edebilirsiniz. Buna karşılık çapraz çizgiler sadece tamamen dolu olarak çizilebilirler. Yatay ve dikey çizgilerde kullanılacak olan desen baytı sağa veya sola kaydırılmadan olduğu gibi çizilir ve gereken yerleri silinir. Bu sayede alt alta gelen çizgilerin boyları farklı bile olsa, desenlerin tüm baytlarının 1 ve 0'ları alt alta gelir.
GEOS Kernal'ı, desen baytının 0. biti grafik ekranındaki 0. bite denk gelecek şekilde ayarlar ve çizginin doğru noktalarda başlayıp bitmesi için baş ve sonda bulunan fazla bitleri siler. Bu konuda tam olarak bir fikre sahip olmak için yukarıdaki tabloyu inceleyin. Dikey doğrular da benzer şekilde çizilir fakat desen biti 90 derece çevrilir. Dikey doğruların tek problemi yatay doğrulardan daha yavaş çalışmasıdır. Eğer grafik ekranında bayt dizilimini incelerseniz hemen sebebini anlarsınız. Yatay doğru çiziyorsanız, 8 nokta için 1 bayta değer vermeniz gerekir. Oysa dikey doğrularda her nokta için 1 bayt harcamanız gerekir. Bunun yanında sadece bir biti değiştirmek için bit değerini o baytla “OR”lamanız gerekir. Bu yüzden dikey doğrular yataylarına oranla en az sekiz kat yavaş çalışırlar. Çapraz çizgiler ise büyük problemler yaratacağı için tamamen içi dolu olarak çizilirler. Bu problemlerden en büyüğü çözünürlüğün yeterli olmamasından dolayı çapraz görüntünün bir miktar bozulmasıdır. Zaten tam düzgün olmayan çizgiye bir de desen eklemeye kalkınca iyice dağıldığı için GEOS'u yazanlar çareyi çapraz çizgilere desen olanağı tanımamakta bulmuşlar. Şimdi de doğru çizmekle ilgili rutinleri inceleyelim:
Desen byte
ç
Yazılmayan bits
TAA
Byte sınırları
1) DrawPoint (NoktaKoy) - $C133: * Fonksiyonu: Ana veya tampon ekranda istenen bir noktaya önplan veya arkaplan renginde nokta koyar veya ana ekrana tampon ekrandan bir nokta kopyalar. * Erişim: Nokta koyuluyorsa (tampon'dan kopyalanmıyorsa)
displayBufferOn ($2F) —
- bit 7=1; ana ekrana yazar. - bit 6=1; tampon ekrana yazar.
* Gerekli hazırlık: İşaret flag'ı (sign flag) - noktanın yazılmasına veya tampon'dan kopyalanmasını ayarlar, 0 ise nokta doğrudan yazılır. Elde flag'ı (carry flag) - eğer işaret flag'ı yazılım için 0 yaparsanız, elde'nin 1 yapılması (SEC komutuyla) önplan renginde, 0 yapılması (CLC) ise arkaplan renginde nokta konulmasını sağlar. r3 - x: noktanın x koordinatı. (0-319)
- y: noktanın y koordinatı. (0-199) * Dönüş değerleri: r3, r11L - aynı değer. * Bozulan registerler: a, x, y, r5-r6 * Açıklama: İşaret flag'ının değerine göre ekranda önplan veya arkaplan renginde nokta koyar veya tampon bölgenin o koordinattaki değerini kopyalar. Eğer işaret bayrağı 1 ise tampon'dan kopyalama yapılır. 0 ise elde flag'ının değerine göre renk belirlenerek nokta koyulur. 2) TestPoint (NoktaKontrol) - $C13F: * Fonksiyon: Elde Flag'ında (carry flag) istenen noktanın değeri bulunur, r3 - noktanın x koordinatı (0-319) r11L - noktanın y koordinatı (0-199) * Dönüş değerleri: Elde Bayrağı - nokta önplan rengindeyse değeri 1, arkaplan rengindeyse 0 olur.
r3, r11L - aynı. * Bozulan registerler: a, x, y, r5-r6 3) HorizontalLine (YatayÇizgi) - $C11B: * Fonksiyon: Verilen deseni kullanarak bir yatay çizgi çizilir. * Erişim: displayBufferOn ($2F)
- bit 7—1: ana ekrana çiz. - bit 6—1: tampon ekrana çiz.
* Gerekli hazırlıklar: a - çizgide kullanılacak desen baytı - çizginin y koordinatı (0-199) r3 - çizginin sol ucunun x koordinatı r4 - çizginin sağ ucunun x koordinatı r3, r4: (0-319) * Dönüş Değerleri: r11L-aynı * Bozulan Registerleri: a, x, y, r5-r8, r11H * Açıklama: r3'den bir yatay doğru çizer. Desen değeri doğrudan ekran RAM'ına yazılır. Böylece aynı desenli tüm çizgilerde noktalar alt alta gelir. 4) VerticalLine (DikeyÇizgi) - $C1E: * Fonksiyonu: Verilen deseni kullanarak bir dikey çizgi çizer. * Erişim: displayBufferOn ($2F)
- bit 7=1: ana ekrana çiz. - bit 6=1: tampon ekrana çiz.
* Gerekli Hazırlık: a - desen baytı r3L - çizginin üst köşesinin y koordinatı r3H - çizginin alt köşesinin y koordinatı r4 - çizginin x koordinatı. r3L, r3H - (0-199); r4 - (0-319) * Dönüş değerleri: - * Bozulan registerler: a, x, y, r5L-r6L, * Açıklama: r3L'den r3H'ye bir dikey doğru çizer. Desen değeri 90 derece çevrildikten sonra ekran RAM'ına yazılır. Böylece aynı desenli tüm çizgilerde noktalar yan yana gelir. 5) InvertLine - $C11B * Fonksiyonu: x koordinatları ve-
“rilen bir yatay çizginin geçtiği noktalardaki önplan rengini arkaplan rengine, arkaplan rengini önplan rengine çevirir. * Erişim: displayBufferOn ($2F)
- bit 7—1: ana ekrana çiz. - bit 6— 1: tampon ekrana çiz.
3 Gerekli hazırlıklar: r1L - çizginin y koordinatı (0-199) r3 - çizginin sol ucunun x koordinatı - çizginin sağ ucunun x koordinatı r3, r4: (0-319) * dönüş değerleri: r1L, - aynı * Bozulan Registerler: a, x, y, r5-r8 * Açıklama: Yatay bir çizginin geçtiği noktaların değeri 1 ise 0'a, 0 ise 1'e çevirir. 6) RecoverLine (ÇizgiKopyala) - $C11E: * Fonksiyonu: Tampon ekrandan bir yatay çizgi kopyalar. * Gerekli hazırlıklar: r1L - çizginin y koordinatı (0-199) r3 - çizginin sol ucunun x koordinatı r4 - çizginin sağ ucunun x koordinatı r3, r4: (0-319) * Dönüş değerleri: r1L - aynı * Bozulan Registerler: a, x, y, r5-r8 7) DrawLine (ÇizgiÇiz) - $C130: * Fonksiyonu: Ön veya arkaplan renginde bir çizgi çizer veya bu çiz-
giyi tampon ekrandan kopyalar.
*
displayBufferOn ($2F)
- bit 7—1: ana ekrana çiz. - bit 6—1: tampon ekrana çiz.
* Gerekli Hazırlık: işaret flag'ı: 1 - tampon ekrandan kopyala 2 - seçilen ekrana çiz elde flag'ı: 1 - önplan renginde çiz 2 - arkaplan renginde çiz r3 - x1: ilk noktanın x koordinatı r4 - x2: ikinci noktanın x koordinatı r1L - y1: ilk noktanın y koordinatı r1H - y2: ikinci noktanın y koordinatı r3, r4 - (0-319), r1L, r1H - (0-199) * Dönüş Değerleri: - * Bozulan Değerler: a, x, y, r3-r13 * Açıklama: GEOS ekranında verilen herhangi iki nokta arasında BRESENHAM algoritmasını kullanarak bir doğru çizer. GEOS Kernal, işaret ve elde flag'lerinin değerlerine bakarak doğruyu ön veya arkaplan renginde çizebilir, ya da tampon ekrandan grafik kopyalayabilir.
GEOS KULLANIM KURSU
Bu ay için yeterli derecede GEOS programlama okudunuz. Biraz da nasıl kullanacağınızı görelim. Geçen ay GEOS'un çalışma sistemi, kopyalanış ve çalışma disklerinin yapılışı, desktop'un işlevleri ve bunların kullanılışı hakkında gerekli bilgiler üzerinde durmuştuk. Bu yazımızda da geoPAINT kullanımına başlıyoruz. Commodore 64 ile masaüstü yayıncılığa atılan ilk adım, yani geoPAINT, kullanımı kolay ve tam olarak A4 (21 x 29.7 cm) ebatlarında printer, plotter veya LASER printer'ınıza çıktı alabileceğiniz,
TRANSIENT
İK miş
Commodore 64 için oldukça gelişmiş bir çizim programıdır. Bu program, çizimlerinizi döküman dosyalar olarak saklar ve bu döküman dosyalara daha sonra da ekleme ya da çıkarma yapmanızı sağlar. geoPAINT programını yüklemek için desktop'ta, altında GEOPAINT yazan ve ikonunda bir renk paleti üzerinde de bir fırça bulunan ikona gelip bir kez butona (ateş tuşuna) basıp yukarıdaki .FILES menüsünden OPEN'ı seçmelisiniz. Evet artık geoPAINT programının açılışını yapmış bulunuyoruz. Karşımızda geoPAINT'ın editörü ve ekranın ortasında, içinde Please Select Option: Create new document Open existing document Quit to desktop yazıları bulunan bir diyalog kutusu (bu tip, soru yanıtlamanız gereken, pencerelere verilen ad) var. Burada yapabileceğimiz üç şey var: yeni bir döküman açmak (Create), eski dökümanlardan birine devam etmek (Open) ya da buraya yanlışlıkla geldiyseniz desktop'a geri dönmek (Quit).
YENİ DOSYA AÇMAK
Yeni dosya açmak için CREATE butonuna basın ve döküman ismini girin. Ekranda oldukça büyük bir pencere açılacak ve sağ üst köşesinde döküman ismi yeralacaktır. Edit ekranınızın yerleşimi, sol üst komut menüsü, altında çizim ikonları, sol altta patern göstergesi, bunun sağında sayfanın neresinde bulunduğunuzu gösteren kutu ve ortada çizim penceresi şeklindedir. Tüm işlemlerinizi joystick ya da mouse ile kontrol ettiğimiz mouse'umuz (ok) ile yapacağız. İlk yapacağımız iş ekranda kullanacağımız renkleri seçmek olacak. Bunun için çizim ikonlarından olan COLOR'ı seçmeliyiz. Bu işlem sonucunda sağ alttaki pencerede iki sıra renk tablosu belirecektir, bunlardan paint (boya) önplan rengini ve canvas (tual) ise arkaplan rengini gösterir. İstediklerinizi seçin ve çizime başlayın. Eğer siyah/beyaz çizim yapmak istiyorsanız bunu sağlamanın kolay bir yolu var, OPTIONS komut menüsünden COLOR OFF komutunu seçmek.
ÇİZİM ALETLERİ
Ekranın solundaki çizim aletlerini anlatmanın zamanı geldi; bu işi yukarıdan aşağıya doğru yapacağım. En üstte solda dört yöne uzanan ok, çizim pencerenizi tüm sayfanın üzerinde istediğiniz yere götürmenizi sağlar, yanındaki küçük pencere resmi ekran üzerinde pencere oluşturarak bunun içindeki çizimi silmeye, kopyalamaya, yerini değiştirmeye, 90 derece çevirmeye vb. işlemlerin yapılmasına yarar. Bir alt sırada, musluk kapalı bir şeklin içinin doldurulmasına, airbrush ise püskürtme ile çizim (paternleri de kullanabilir) yapmaya, aşağıda cetvel ölçüme, çizgi ise düz çizime yarar. Fırça, seçeneğiniz fırça ve paternle, kalem ise joystick ile direk çizim yapmanıza yarar. Silgi ile, bir karenin yardımıyla edit penceresinde istediğiniz yeri silmenizi sağlar. Büyük T (T), text yani yazı yazmanızı sağlar. Yazının font, punto ve stilini yukarıdaki fonts bölümünden ve aşağıdaki stillerden seçebilirsiniz. COLOR ile renk ayarlarını, UNDO ile son yaptığınız işlemin iptalini sağlayabilirsiniz. Sol alttaki büyük çerçeveli pencere size hangi patern ile çalıştığınızı gösterecektir, eğer paterninizi değiştirmek isterseniz bu pencerenin içinde klikleyin ve çıkan paternlerden herhangi birini seçin. Çizim işlemleriniz bitince FILE bölümünden “close” komutu ile çıkın, GEOS çiziminizi kaydedip desktop'a geri dönecektir. Eğer çiziminizin printer'dan çıktısını almak isterseniz, desktop'a sol üst köşedeki GEOS menüsünden “select printer” aracılığıyla printer tipinizi tanımlayıp kaydettiğiniz dökümanı mouse aracılığı ile sağ alt köşedeki printer ikonuna götürüp bir kez klikleyin ve nefis GEOS çıktınızı alın.
Çizim yapmayı öğrendik fakat ödevlerimizi de hazırlayabileceğimiz bir kelime işlem programımız olsa fena olmaz hani. İşte geoWRITE bunu bizim için hemen hallediyor, ayrıca kullanımı çok çok basit. Dökümanlarımızı yaptığımız biçimde açıp kapayacağız, yapmamız gereken tek şey gerekli fontu seçip stilini de belirledikten sonra yazmaya koyulmak. Öğrenilmesi gereken bir şey de mouse yardımı ile belli yerlerde gereken değişiklik olursa bunu nasıl yapacağımızdır. Mouse'unuzu değişimin yapılacağı yerin başına getirip butona basılı tutarak değişimin yapılacağı yerin sonuna kadar götürmek, seçtiğiniz yerde bir renk değişikliğine sebep olacak ve o bölgede yapacağınız değişikliği bekleyecektir. Bu durumdayken fontu değiştirirseniz bölgedeki yazının fontu, stili (style ile) değiştirirseniz yazının stili değişecektir. Ayrıca aynı durumda (değişim bölgesi seçilmiş halde) del tuşu o bölgeyi siler, boşluk (ara) çubuğu ise o arayı boşlukla doldurur. Sayfanız dolduğunda geoWRITE kendiliğinden bir sonraki sayfaya geçecektir. İstediğiniz sayfanın erişimini yukarıda, döküman isminin bulunduğu pencerenin solundaki kutudan yukarı veya aşağı oklarla sağlayabilirsiniz. Sayfa kesme işlemi ise OPTIONS menüsünden page break komutu ile yapılabilir. C-64 klavyesinde tab tuşu olmadığından bunu CONTROL-I ile (CTRL-I) yapabilirsiniz. Tab ile gideceğiniz yer(ler) yukarıda cetvel şeklindeki bölümün altındaki küçük üçgenlerle belirlenir. Kolay okumayı ve edit etmeyi sağlamak için ise cetvelin altında, soldaki M şeklindeki marjin göstergesini 5 inch sağa çekerek yapabilirsiniz. Bu sayfanın sağa kaymasını engeller ve daha kolay okuyup yazmanızı sağlar. İşiniz bitince marjin işaretini tekrar yerine alırsanız her şey yerli yerinde olacaktır. Bir önerim daha var, çalışırken arada sırada da olsa yazınızı kaydedin ki herhangi bir kazaya kurban gitmesin. Bunu yapmak için FILE menüsünden UPDATE FILE komutunu seçmelisiniz.
Bu aylık GEOS kursumuz buraya kadar, takıldığınız ya da merak ettiğiniz her şeyi lütfen bize yazın, elimizden geldiğince size yardımcı olacağız. Hepinize Commodore'lu günler dileriz.