GEOS V
Retro bilgisayarSelam GEOS'çular. İşte yeni bir sayıda tekrar birlikteyiz ve GEOS'un sırlarını açığa çıkarmaya devam ediyoruz. Hatırladığınız gibi geçen sayıda GEOS'un en önemli özelliklerinden biri olan menüleri anlatmıştım. Daha önceki sayımızda da ikonlar hakkında bilgi vermiştim. Bu sayımızda ise bu özelliklerin kullanımına alışmanız için ikonların ve menülerin kullanıldığı bir örnek programı açıklayacağım. Bu örnek program, sadece Amerika'lı GEOS kullanıcılarının yararlanabildiği bir hizmet olan modem servisinin GEOS programının bir benzetimi. Tabii ki örnek programın çalışmasının Quantum-Link programıyla uzaktan yakından bir alakası yok. Yalnızca ekran düzeni orijinalinden farksız. Programın açıklamalarını dikkatle okuduktan sonra programı çalıştırırsanız menüler veya ikonlar hakkında anlamadığınız bir şey kalacağını sanmıyorum. Programı çalıştırdığınızda ekran temizlenir ve sekiz tane ikon ekrana dizilir. Bu ikonların hangisini seçerseniz seçin sizi ikinci ekrana, yani menü ekranına götürür. Bu ekranın sol üst köşesine iki elemanlı bir yatay menü ve ortasına da bir ikon yerleştirilir. Menü elemanlarının her biri birer dikey alt-menü açar. Bu alt menülerin bütün seçenekleri ise sizi ana menüye döndürür. Programdan çıkmak için ise ekranın ortasında bulunan ikonu seçmeniz gerekli. Şimdi de programın ayrıntılı açıklamasına gelelim: * ; Programımız $4400 adresinden
; başlıyor.
Programda kullanılan label'ların adresleri:
NewDisk - $CIBİ
MouseUp — $CISA
SetPattern — $C139
i. Pattern . — $C19F
Dolcons - $C15
DoMenu -
GotoFirsiMenu — $CIBD
EnterDesktop — - $C22C
r0 — $02
Program belleğe yüklenir yüklenmez GEOS Kernal tarafından yapılacak ilk şey programın çalıştırılma adresi olan $4400'a (bunu header block'da belirtiyoruz bildiğiniz gibi) sıçramaktır. Burada ise ilk ekranın düzenlenmesi ile ilgilenen rutin bulunur: Jsr NewDisk Eski GEOS versiyonlarında bulunan bir hata yüzünden, her application'ın başında bu rutine sıçranarak disk motorunun durdurulması şarttır. Yeni GEOS versiyonlarında bu hata tamamen düzeltilmiştir. Fakat programınızın tüm GEOS'larla uyumlu olarak çalışması için her programınızın başında bu komutu kullanın. Jsr MouseUp Eğer herhangi bir sebeple mouse'unuzun görünmesi engellenmişse bu komutla tekrar görünür hale gelmesi sağlanır. Lda # $02 Jsr SetPattern Sistemin grafik işlemlerinde kullanacağı deseni ayarlar. Bu komutlarla GEOS'un alışılmış ekran deseni olan kareli deseni seçiyoruz. (Desenler konusunda ayrıntılı bilgiyi “GEOS'la Grafik” bölümünde vereceğim. Fakat bu desenlerin neler olduğunu görmek isteyenler geoPAINT programında sol alt köşede bulunan büyük siyah kutunun içinde ateş tuşuna basarak tüm desenleri inceleyebilirler. Jsr Rectangle .byte 0 .byte 199 0 319 Burada kullandığımız Rectangle rutini, kendisinden sonra gelen 6 byte'ta tanımlanan dikdörtgenin içini seçilmiş olan desenle doldurur. Jsr komutunu takip eden ilk byte dikdörtgenin üst kenarının, ikinci byte ise alt kenarının y koordinatıdır. Bunu takip eden iki byte'la sol kenarın, sonraki iki byte'la da sağ kenarın x koordinatını belirtiyoruz. Buradaki komutlarla tüm ekranın seçilen desenle doldurulmasını sağlıyoruz. Lda # < ikontest Sta r0 Lda # > ikontest Sta r0+1 Jsr Dolcons Artık ekrana konacak ikonların tanım tablosunun yerini GEOS Kernal'a belirtmenin zamanı geldi. “İkontest” label'ı ile gösterilen bu tanım tablosunun adresini r0'a yerleştirdikten sonra Dolcons rutinine yapılacak bir sıçrama bu işi yapmak için yeterli. Rts Artık kontrolü GEOS Kernal'ına bırakmamız gerekiyor. Böylece aktive ettiğimiz ikonlar kullanıma girebilecek.
ikontest .byte 8
word 160
- 100
Tanım tablosunun 1. byte'ında bu tabloda tanımlana-
cak ikonların sayısı verilir. Bizim örneğimizde 8 tane ikon
tanımlanacak. Dolcons rutini otomatik olarak mouse'u yeni bir koordinatta görünür hale getirdiği için yeni x ve y koordinatları da bu tablonun başında verilmelidir. 2. ve 3. byte'larda x koordinatı, 4. byte'ta ise y koordinatı veriliyor. .word ikon1 .byte 10
3 . .byte 2,16 .word ikonrutini İşte ilk ikonumuzun tanım byte'ları: 1. ve 2. byte'lar 1. ikonun grafik datasının saklandığı bellek alanını gösteriyor (programımızda ikon1 label'ı ile gösterilen adres). 3. byte ise ikonun ekranda görüleceği x koordinatı. Yalnız dikkat etmeniz gereken nokta, bu koordinatın piksel değil byte olarak belirlendiği. Yani piksel koordinatını bulmak için bu sayıyı 8'le çarpmanız gerekir. 4. byte olan 3 ise 1. ikonun y koordinatı (bu sefer piksel olarak). 6. ve 7. byte'larda ise ikonun genişliği (byte olarak) ve uzunluğu (piksel olarak) veriliyor. Yani 1. ikonun asıl boyutları 2*8 = 16'ya 16. Son iki byte'ta ise bu ikon üzerinde ateş tuşuna basıldığı zaman hangi adrese sıçranacağı belirtiliyor. İlk ekranda 8 tane ikon bulunduğu için burada 7 ikonu daha tanımlamamız gerekiyor. Fakat hepsinin tablo yapıları aynı olduğu için 7'sinin de buraya yazılmasına
gerek yok.
ikonrutinl , Jsr i Rectangle
.byte 0
.byte 199
0
.word 319
Eğer birinci ikon seçilirse GEOS Kernal'ı, 1. ikonun tanım byte'larında adresi belirtilen bu rutine sıçrama yapar. Burada ise bizim ilk yaptığımız işlem ikinci ekrana geçebilmek için ekranı temizlemek. Lda Ekran2ikonu
Sta r0
Lda
1
JsrDolcons
Daha sonra ikinci ekrandan çıkış için kullanılacak iko-
nu tanımlıyoruz.
Ekran2ikonu
Lda
Sta r0
Lda
Sta r04 1
Lda 0
Jsr DoMenu
Testmenü
Testmenü
Artık bu ekranda kullanacağımız menüleri tanımlamanın zamanı geldi. Jsr DoMenu komutundan önce A'ya verdiğimiz 0 değeri ile menüler hazırlandıktan sonra mouse'un ilk menü elemanının üzerinde belirmesini sağlıyoruz. Rts Ve kontrolü tekrar GEOS Kernal'e bırakıyoruz. $4486 ikon1 .byte $02,$FF .byte $9C $80,$01,$80,$39,$80,$6D,$80 .byte $E5,$81,$BD,$83,$19,$86,$31 .byte $8C,$61,$98,$C1,$B1,$81,$BB .byte $01,$BE,$01,$BC,$01,$80,$01 .byte $02,$FF 8 ikon grafik datası daha. Ekranda görünecek olan ikonların grafik tanımlarını yapmanın zamanı gelmişti zaten. Burada gördüğümüz tipik bir ikonun grafik dataları. Fakat bu ikon datalarının özelliği GEOS'un grafik kullanımında az bellek harcamasını sağlayan sıkıştırılmış formatta saklanması. Bu sıkıştırma işlemleri hakkında çok ayrıntılı bilgiyi “GEOS'la Grafik” konusunda anlatacağım. Fakat basitçe bu byte'ların anlamını açıklamak istiyorum: $02,$FF byte'ları: $FF byte'larının 2 kere yazılmasını sağlar. Yani 32 tane $FF byte'ı yazmak isteseydik ikonumuza (yani içi tamamen dolu bir ikon isteseydik) yalnızca $20,$FF yazmamız tüm ikonu tanımlamamıza yeterli olacaktı. $9C byte'ı: Kendisinden sonra gelen $9C-$80 = $1C (28) byte'ın yalnızca birer kez kullanılmasını sağlar. Buradan sonra gelen 28 byte ikonun grafik datalarıdır. $02,$FF byte'ları: Gene iki kez $FF byte'ı yazılır. Aşağıdaki tabloya bakarak bu byte'ların nasıl bir sonuç vereceğini görebilirsiniz.
DESENE
Ekran2ikonu .byte 1
.word 240
.byte 155
.word ikonl
.byte 30
.byte 150
.byte 2,16
.word bitir
İşte tipik bir ikon tanım tablosu daha. Bu seferki ise
programdan çıkış için kullandığımız ikonu tanımlıyor.
Bitir Jmp EnterDesktop
Görüldüğü gibi bir application'ı terkedip Desktop'a geri dönmek (64'ünüzü kilitlemeden tabii ki) tek komutla halledilebiliyor. Bu komutu verdiğiniz zaman GEOS bütün işlemlerini keser ve DESKTOP programını yüklemeye başlar. Eğer diskinizde bu programı bulamazsa bir pencere açarak sizden içinde Desktop olan bir disk koymanızı isteyecektir.
Testmenü m.byte 10
.byte 24
.word 0
.word 125
.byte 2
İkinci ekranın menülerinin tanım tablosunu da bura-
da yaratıyoruz. Bu tablonun ilk iki byte'ıyla menünün
üst ve alt kenarlarının y koordinatını 10 ve 24 olarak ayar-
lıyoruz. Sonraki dört byte'la da menünün sol ve sağ ke-
narlarını O ile 125 olarak ayarlıyoruz. Son byte'imız olan
2 ise menünün yatay bir menü olduğunu ve 2 elemanı bu-
lunduğunu belirtiyor.
Word textil
.byte $80
.word altmenül
ikinci menü elemanının tanımı
Menümüzün ilk seçeneğini bu byte'larla tanımlıyoruz. 1. ve 2. byte'larda bu elemanın içine yazılacak olan yazının saklandığı adresi belirtiyoruz. 3. byte'la bu seçeneğin bir alt-menüyü açacağını belirtiyoruz. 4. ve 5. byte'lar ise bu eleman seçilirse açılacak alt menünün adresini taşıyor.
textil .text “ana menu 1”
.byte 0
.... ikinci elemanın yazı dataları
Ana menünün seçeneklerinin içinde yazılacak olanlar yukarıdaki gibi tablolarda hazırlanır. Her seçeneğin yazısının sonuna $00 byte'ını koyarak yazının bittiğini belirtmeliyiz.
altmenül — .byte 24
.byte 24-4-(8*14) 41
.word 0
.word 80
.byte $80 4 $08
Bir alt menünün tanım tablosu da ana menülerin tanım tablosunun aynısıdır. Yani bu alt menünün üst kenarı 24., alt kenarı 137. y koordinatlarında; sol kenarı 0., sağ kenarı 80. x koordinatlarında bulunuyor ve menümüz sekiz elemanlı bir dikey menü olarak ayarlanıyor.
Gin ADAM
NX he »
AAA YAZ
altltexti
.byte 0
.word menülservisi
7 elemanın daha tanımları
Tabii ki alt menünün elemanları da tanımlanmalıdır. Burada her elemanın yazılarının adreslerini veriyoruz. Elemanların bir rutini çağıracağını belirtiyoruz ve bu rutinin adresini ekliyoruz.
altmenü2 — .byte 24
.byte 244 (7*14) 41
70
.Wword 155
.byte $80 -- $40 4 $07
eleman tanımları
Bu menü tanım tablosunu yazmamın tek sebebi dikkatinizi menü tipine çekebilmekti. Gördüğünüz gibi bu yalnızca dikey değil aynı zamanda sınırlandırılmış bir menü. Sınırlandırılmış menünün ne olduğunu görmek için örnek programın 2. ekranında “ana menü 2” seçeneğini seçmeniz yeterlidir.
altltextl — .text “seçenek 1”
.byte 0
diğer yazı dataları
Bütün menü elemanlarının yazıları bu tabloyla ayarlanıyor.
menüservisi Jsr GotoFirstMenu
Rts
Gördüğünüz gibi alt menü seçenekleri de hiçbir işlem yapmıyorlar ve doğrudan doğruya ilk menüye dönüyorlar. (Bu işlemi yapmanız için GotoFirstMenu rutinine sıçramanız ve RTS ile kontrolü tekrar Kernal'a bırakmanız gereklidir.)
.byte 0,0,0,0
Burada bırakılacak fazladan birkaç sıfır, programını-
zın GEOS formatına çevrilmesi sırasında olabilecek bir
byte kaybını kapatmak içindir. Mesela yayınlamış oldu-
ğumuz GEOS CONVERTER programı, GEOS forma-
tına çevirdiği programların son byte'ını çevirdiği prog-
rama yazmıyor. Bunu kesinlikle unutmayın.
Bu programın MDE çıktısını program döküm eki'nde
bulabilirsiniz.
Evet GEOS'çular, bu aylık da bu kadar. Gelecek ay kursumuza “GEOS'ta çizim ve grafik” konusuyla devam edeceğiz. Şimdilik hepiniz hoşça kalın.