Home  Articles  Programs 

GEOS III

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
 lda testicons
 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,$FF

JustForFunData: .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


C64 Projects Twitter Page

İlker Fıçıcılar's CBM Page