Merhaba, GEOS yazımız bu ay da tüm hızıyla devam ediyor. Ama geçen ay can sıkıcı temelleri bitirmiş olduğumuz için bu ay GEOS rutinlerine ve kullanılış şekillerine geçeceğiz. Her şeyden önce ilk bölümde adı geçen pseudo register kelimesinin manasını açıklamak istiyorum. Pseudo-register'ler hem GEOS Kernal'i hem de sizin programlarınız (uygulamalar ve benzerleri) tarafından kullanılan register'lara verilen addır. Yazıda bahsedilen kısımlardan anlayamadığınız bir şeyler olursa dergiye yazmaktan çekinmeyin. Bu sayede daha sağlıklı bir şekilde GEOS kullanımını öğrenebilirsiniz.
Evet, gelelim bu ayın konusu olan ikonlar ve menülere. İkonlar GEOS işletim sisteminin temelini oluşturan aktif grafik elemanlarıdır ve genelde sprite boyutlarındadır. Ekranda bulunan ikonlar Kernal ana döngüsüne her girişte kontrol edilirler ve eğer üzerinde ateş tuşuna iki kere basılırsa sizin önceden belirttiğiniz belli bir rutine sıçrama yapılır. Bu rutinden geri dönmek için ise her zamanki gibi RTS komutunu kullanırsınız. Peki bu ikon denen grafik türünü kullanmanın ne yararı var? Bu ikonları bir kez sprite gibi tanımladıktan sonra aktive ederseniz daha sonra gereken her şeyi GEOS'unuza bırakabilirsiniz. Yani bundan sonra o ikonun koyduğunuz yerde aktif durumda kalacağından emin olabilirsiniz. Bu sayede programınız daha gerekli işlemlerle uğraşabilir. İkonları her tür GEOS programında görmeniz mümkündür. En basitinden DESKTOP programını da diskteki programları gösteren grafik blokları ve sağ üst köşedeki disk resmi birer ikondur. DİKKAT!!! GEOS her türlü uygulamanın en az bir ikonu olduğunu farzeder. Bu yüzden programınız ikon kullanmasa bile bir boş grafik bloğunu ekranın gereksiz bir yerine koyarsanız hem programınızın çalışmasını sağlarsınız, hem de yanlışlıkla ikonun çağrılması tehlikesinden kurtulursunuz.
İkonlar genelde uygulamanızın hazırlık ve düzenlenme rutinleri safhasında düzenlenir ve aktive edilir. Daha sonra kontrol tekrar GEOS kernal'a bırakılır. Hazırlık ve düzenlenme rutinlerinin adresi Header block'taki BAŞLANGIÇ ADRESİ byte'larında saklanır. Bizim burada göstereceğimiz örnek program önce ekranı temizlemek için JSR i_Rectangle komutunu kullanır (örneği ilk bölümde verilmişti), daha sonra da ikonları aktive eden DoIcons rutinine sıçrar ve kontrolü tekrar GEOS Kernal'ına bırakır.
Yani programınız;
lda #$02 ; sistem motifini % 50 kareli olarak düzenle jsr SetPattern jsr i_Rectangle ; ekranı temizle .byte 0 .byte 199 .word 0 .word 319 ldatesticons sta r0H jsr DoIcons ; ikonları aktive et rts ; Kernal'a dön
Evet, ana programınız bu uzunlukta. Fakat asıl zor olanı ikonların işlemlerini ayarlayan rutinleri yazmak.
Deminki örnek programdaki testicons, ikonların datalarının saklandığı bellek alanının label'ıdır. Sizin ikonları aktive etmeniz için yapmanız gereken şey şimdi açıklayacağım özellikte bir ikon tablosu hazırlayarak bu tablonun başlangıç adresini GEOS Kernal'a bildirmektir.
Bu yolla birden fazla ikonu tek komutla ekrana çıkartabilir ve aktive edebilirsiniz. Bu işi de Dolcons rutinine tablonun adresini r0 registerine koyduktan sonra sıçrayarak yapabilirsiniz.
İkon Tablosunun Düzenlenmesi
İkon tablosunun en başındaki dört byte'ta kaç tane ikon tanımlanacağı ve ikonlar gösterildikten sonra imleç'in (GEOS'ta seçimlerinizi yapmanızı sağlayan, joystikle hareket ettirebildiğiniz ok işareti) hangi (x,y) koordinatlarında gösterileceği hakkında bilgi bulunur. Bundan sonra her ikon için sekiz byte olmak üzere ikonlar tanımlanır. Bu byte'lar sırasıyla şu bilgileri verir;
1. ve 2. byte: İkonun grafik datasının saklandığı alanın adresi. Burada adresin saklanması; C-64'ün standardı olan önce alçak (low) sonra yüksek (high) değerlikli byte'ların sıralanması şeklinde yapılır. Bu sayede aynı grafik datasını birden fazla ikon için de kullanabilirsiniz.
3. byte: İkonun byte değeri olarak X pozisyonu. İkonunuzun X koordinatı 0-319 arasında sadece belli X koordinatlarında bulunabilir. Yani ancak 0,8,16,... koordinatlı X pozisyonlarında ikon bulundurabilirsiniz. Bu byte pozisyonunu bulmak için koordinatı sekize bölmeniz yeterlidir. Bu tür bir sistemin kullanılmasının sebebi; her X koordinatını vermek için iki byte kullanmayı ve dolayısıyla bellek israfını önlemek. Buna karşılık Y koordinatı 0-199 arasında her değeri alabilir.
4. byte: Y koordinatı. Bu koordinat değeri 0-199 arasında olabilir.
5. byte: İkonun X genişliği. Bu değer de X koordinatı gibi byte olarak verilmesi gerekir. X boyutunun kaç piksel olduğunu bulmak için bu değeri sekizle çarpmak gerekiyor.
6. byte: İkonun Y uzunluğu. Bu değer de Y koordinatı gibi kaç piksel uzunluğunda bir ikonunuz olacağını kontrol eder.
7. ve 8. byte'lar: İkon ateş tuşu ile aktive edildikten sonra sıçranacak rutinin adresi. Bu da C-64 standart sistemi ile saklanır (Alçak byte önce, yüksek byte sonra) (Tablo 1).
7. ve 8. byte'larda gösterilen rutinde istediğiniz her türlü işlemi yapabilirsiniz. İsterseniz tüm sistemi yeniden başlatabilirsiniz. (Desktop'u yeniden yükleyerek programınızın sona ermesini sağlamak ve benzeri amaçlarla.)
Bu rutinlerde ikonunuzun üzerinde ateş tuşuna bir kez mi yoksa iki kez mi basıldığını kolaylıkla anlayabilir ve buna göre işlem yapabilirsiniz. Bu tür kontrolleri desteklemek otherPressVector (kontrol rutininin yerini gösteren vektör) rutinleriyle kolaylaştırılmıştır. GEOS Kernal r0H adresinde $00 değeriyle bir $ff değeriyle de iki kez ateş tuşuna basıldığını belirtir. r0L adresindeyse de kaç numaralı ikonun aktive edildiğini öğrenebilirsiniz. (Birinci ikonun değeri 0'dır.) Bu özelliği tüm ikonlar için aynı rutini kullanan fakat değişik ikon seçimlerinde hafif farklı tepkiler gösteren programlarda kullanabilirsiniz. Rutininiz r0L adresindeki ikon numarasını kontrol ederek buna göre davranabilir.
Bunlardan sonra da ikon grafik tabloları hazırlanır (Tablo 2).
İkon grafikleri bitmap grafiklerdir. Bizim verdiğimiz örnektekiler 2 byte eninde (16 piksel) ve 16 piksel boyundadır. Grafik datasının hazırlanması ise şöyle yapılır:
İlk byte'ınız ikonunuzun kaç byte eninde olduğunu belirtir. Grafik tanımını ise Tablo-3'te gösterildiği şekilde yapmanız gerekiyor.
Burada bahsedilmeye değecek bir metod DESKTOP ve GeoPAINT tarafından kullanılmaktadır. Eğer DESKTOP'ta bir ikonun üzerine gelip bir kez ateş tuşuna basarsanız, ikonun negatifi görünür. Daha sonra bir menüden seçtiğiniz bir işlemle (mesela dosya hakkında bilgi alma -get info-) seçilen ikon üzerinde işlem yapabilirsiniz. GeoPAINT'de de herhangi bir işlemi seçtiğinizde o işlemin ikonu negatif olarak kalır. Yeni bir ikon seçildiğinde ise ilki normale döner ve İkincisinin negatifi gösterilir. Peki ikon-menü ve ikon-ikon arasın-daki bu ilişkiler nasıl düzenleniyor?
GEOS Kernal'ında iconSetFlag ($84B5 adresinde) adı verilen bir değişken bulunur. Bu değişkenin 6. ve 7. bitleri ikon seçiminde neler yapılacağını kontrol eder. Eğer bit 7 set edildiyse, aktive edildiği zaman ikon önce negatif, sonra normal olarak görünerek seçildiğini belli eder. Bu modu seçmek için $8b45 adresine vereceğiniz değeri $80 değeriyle OR'lamanız gerekmektedir. İkonlar aktive edildiği zaman ne kadar uzun süre negatif olarak kalacakları selectionFlash ($84B3) adresiyle ayarlanmaktadır. Bu adresin orijinal değeri 10'dur.
Eğer bit 7 reset ve bit 6 set durumunda ise ikon seçildikten sonra devamlı olarak negatif olarak kalacaktır (GeoPAINT'teki gibi). Bunun için de $8B45 adresini $40 ile OR'lamanız gerekmektedir. Bu durumda ikon koordinatları, numarası veya gerekli herhangi bir bilgiyi saklamak rutininizin görevidir. Bu amaçla GEOS Kernal tarafından hiçbir işlem yapılmaz!
Eğer $8B45 adresinde bit 7 ve bit 6 reset ise ikon aktive edildiğinde ikon üzerinde hiçbir değişiklik gözlenemez.
GEOS Kernal'ında bizi ilgilendiren bir tek ikon rutini vardır. O da ikonları ekrana çıkararak hazır duruma getiren DoIcons'dır.
DoIcons:
Adres: $C15a
Fonksiyon: İkonları çizer ve aktive edilmeye hazır duruma getirir.
Gerekli hazırlık: r0 - ikon tablosunun adresi.
Değiştirilen registerler: a,x,y,r0-r11
Açıklama: DoIcons ile ikon tablosunda düzenlenen ikonlar ekrana çıkartılır ve aktive edilir. Bu aşamadan sonra üzerinde ateş tuşuna basarak, herhangi bir ikon seçilebilir. Bu durumda ikon tablosunda gösterilen servis rutinine sıçrama yapılır.
Bir ikonu yok etmek için grafik data pointer'ını $00,00 yapmak gereklidir. Eğer ikon önceden aktive edilmişse ikonu ekrandan silmeniz de gerekmektedir. Eğer grafik pointer'leri baştan sıfırlanırsa, hiçbir zaman ekranda görünmezler.
Fakat bir ikonu güvenilir olarak yok etmek istiyorsanız en iyi yol ekranı silip gerekli ikonları yeniden göstermektir. (Gereksiz ikonların grafik adreslerini 0000 yapmayı unutmayın.)
GEOS Kernal, rutininize, r0H adresiyle ikonun üzerinde kaç kez ateş tuşuna basıldığını ve r0L adresiyle de kaç numaralı ikonun seçildiğini gönderir. Rutininizin başında bu adreslerin değerlerini kontrol ederek ikonla ilgili tüm bilgileri elde edebilirsiniz.
Bu aylık da bu kadar. Gelecek ay GEOS'un en önemli iletişim araçlarından olan MENÜ'leri öğreneceğiz, hoşçakalın.
TABLO 1:
TEST İKONLARI: .byte 8 ; İkon sayısı .word 160 ; İkonların gösteriminden sonra imlecinizin x pozisyonu .byte 100 ; İkonların gösteriminden sonra imlecinizin y pozisyonu ; İKON DATA 1 .word showCaseData ; Grafik data adresi .byte 10 ; İkonun sol üst kölesi x byte pozisyonu .byte 3 ; İkonun sol üst köşesi y piksel pozisyonu .byte 2,16 ; Byte halinde genişlik ve piksel halinde yükseklik .word DoShow ; showCase için servis rutini ; İKON DATA2 .word JustForFunData ; Grafik data adresi .byte 10 ; İkonun sol üst köşesi x byte pozisyonu .byte 3 ; İkonun sol üst köşesi y piksel pozisyonu .word DoFun ; Servis rutini ... ; 6 adet ikon data girişi daha
Tablo 2:
showCaseData: .byte $02,$FF,$9C,$80,$01,$80,$39,$80,$6D,$80,$E5,$81,$BD,$83,$19 .byte $86,$31,$8C,$61,$98,$C1 ,$B1,$81,$BB,$01,$BE,$01,$BC,$01,$80 .byte $01,$02,$FFJustForFunData: .byte $02,$FF,$9C,$87,$01,$8D,$81,$9E,$C1,$BB,$61,$AD,$B1,$B6,$99 .byte $9B,$09.$9D,$0D,$96,$07,$9A,$03.$8C,$01,$87,$E1,$80,$31,$80 .byte $19,$02,$FF
... ; geri kalan 6 ikonun grafik dataları
Tablo 3:
İkon grafik datalarının sıralanışı:1. byte= ikonun byte olarak x genişliği (1.byte=3 olarak kabul edersek).
x-l x-2 x-3 2.byre 3.byte 4.byte 5.byte 6-byte 7.byte
Bizim örneğimizde (tablo-2): 1.byte= 2
x-l x-2 2.byte 3. byte 4.byte 5. byte .. .. .. .. 16.byte 17.byle
DİKKAT!
Bir önceki GEOS yazısında yeralan GEOS BELLEK HARİTASI elimizde olmayan sebeplerden dolayı yayınlanamamıştır, bu sayımızda yayınlıyoruz. (üst köşede) Özür diliyoruz.
GEOS BELLEK HARİTASI
BAYT # ADRES $ TANIMLAMA 1 0000 6510 Data yön registeri 2 0001 6510 I/O (giriş/çıkış) registeri 110 0002-006F GEOS ve application tarafından kullanılan zero-page 16 0070-007F Application için zero-page. a2-a9 registerleri 123 0080-00FA C64 Kernal ve BASIC için zero-page 4 00FC-00FE Application için zero-page. a0-a1 registerleri 1 00FF Kernal ROM ve BASIC rutinleri tarafından kullanılır 256 0100-01FF 6510 stack (yığın) 512 0200-03FF C64 Kernal ROM rutinleri tarafından kullanılan RAM 23552 0400-5FFF Application program ve dataları 8000 6000-7F3F Arka plan ekran RAM'ı 192 7F40-7FFF Application RAM'ı 2560 8000-89FF GEOS buffer ve değişken RAM'ı 512 8A00-8BFF Sprite resim dataları 1000 8C00-8FD7 Video renk matrisi 16 8F08-8FF7 GEOS RAM'ı 8 8FF8-8FFF Sprite göstergeleri 4096 9000-9FFF GEOS programı 8000 A000-BF3F Ön plan ekran RAM'ı veya BASIC ROM'u 192 BF40-BFFF GEOS tabloları 4288 C000-CFFF 4K GEOS Kernal programı, sürekli bulunur 4096 D000-DFFF 4K GEOS Kernal'i veya 4K C64 I/O alanı 7808 E000-FE74 8K GEOS Kernal'i veya 8k C64 Kernal ROM'u 378 FE80-FFF9 Input driver'ı 6 FFFA-FFFF 6510 NMI, IRQ ve RESET vektörleri
kaynak: Teleteknik Commodore Dergisi, Sayı 55, Eylül 1990, Sayfa 44-47
Vedat Hallaç
01.09.1990
Keywords: C64, Commodore, GEOS, Programlama, Yazılım, İşletim Sistemleri