GEOS IV

Menüler de ikonlar gibi genelde tablolarla tanımlanan yapı tipleridir. Bu yüzden kullanımlarını anlamanın en iyi yolu örnekleri incelemektir. Bir menüyü GEOS'a bildirmek için şöyle bir sıçrama yapılır: jsr i-DoMenu; Bir menü yarat *word TestMenu; Menü tanım tablosunun başlangıcı Aynı ikonlar gibi menüler de bir tabloyla tanımlanırlar. Bu yüzden bir menü yaratmak için fazla komut gerekmez ama uzun tablolarla boğuşmak zorundasınız. Menüler ana olarak iki tiptedir: yatay ve dikey menüler. Yatay menüler hemen her tarafta gördüğünüz sol üst köşede bulunan menülerdir. Dikey olanlar ise bu menülerde seçeneklerden birini açtığınızda aktif hale geçen ikinci menüye verilen addır. Menü tablosunun en başındaki altı baytta menünün kaplayacağı alanın koordinatları verilir. Önce birer baytla menünün üst ve alt y koordinatları, sonra da ikişer baytla sol ve sağ x koordinatları verilir. Menünün alt y koordinatı üst koordinatına her satır için 14 (standart karakter setinin yüksekliği) ekleyerek bulunur. Sağ x koordinatını bulmak ise o kadar kolay değildir. En iyisi başta 319 verip sonra deneyerek en iyi noktayı bulmaktır. Eğer menü elemanları verilen alana sığmazsa değişik hatalar oluşabilir. GEOS bir menüyü hazırlarken önce çerçevesini çizer, sonra ilk menü elemanını yazar. Yatay menülerde dikey, dikey menülerde ise yatay bir çizgi çizer ve ayrılan yere ikinci menü elemanını yazar. Bu şekilde oluşturulan menüler sonunda her elemanı ayrı bir kutucuğa konmuş gibi görünür.

Selam GEOS kullanıcıları. Hatırlayacağınız gibi geçen ay ikonların ne olduklarını ve nasıl kullanıldıklarını teorik olarak açıklamıştık. Bu ay da GEOS kursumuza, büyük kullanım rahatlığı sağlayan MENÜ'leri anlatarak devam ediyoruz. Menülerin de teorik kullanımını öğrendikten sonra kısa bir örnek programla bu öğrendiklerimizin nasıl çalıştığını göreceğiz.

Eğer son elemandan sonra hâlâ boş yer kaldıysa bu alan son seçeneğin kutucuğuna aitmiş gibi görünür ve uygulamada bir problem yaratmaz. GEOS Menü tablosunda 7. bayt menü tipini (yatay-dikey) ve kaç elemanlı bir menü oluşturulacağını belirtir. İki işi birden yapabilmesi için menü tipi baytını (yatay — $00; dikey — $80) eleman sayısıyla OR'lar. Yani yedi elemanlı bir dikey menümüz varsa 7. baytın değeri $87 olur. Sonuçta Menü tablomuzun başı şöyle bir şey olur:

TESTMENÜ:
byte 18 ; Menünün üstü
byte 24 ; Menünün altı
0 ; Sol kenar
“word 319 ; Sağ kenar
“word $07 ; Menü tipi OR
eleman sayısı
MENÜ ELEMANLARININ
TANIMLANMASI:

Bundan sonraki baytlarda menü elemanları her seçenek için 5 bayt kullanılacak şekilde tanımlanır. Bu baytlardan ilk ikisi seçeneğe ait olan yazının saklandığı bellek alanını gösterir. Bu alanda seçeneği yazdıktan sonra $00 baytıyla GEOS'a yazı datalarının bittiğini söyleyebilirsiniz. Üçüncü baytta bu seçeneğin başka bir alt-menü'yü mü yoksa bir servis rutinini mi çağıracağı belirlenir (altmenü — $80; servis rutini $00). Son iki baytta ise seçenek tipine göre servis rutini veya alt-menü tablosunun başlangıç adresi standart “Low-High” formatta saklanır. (1. Tablo)

1. TABLO MENÜ TEST: .byte 10 .byte 24

“word 0
Aword 255
$02
“byte $80
“word altmenü 1
Word texi2
$80
“word altmenü2

SEÇENEK TEXT DATALARININ HAZIRLANMASI:

Menü elemanlarının text datalarını hazırlamak hiç de zor değildir, ama aklınızda tutmanız gereken bir şey vardır; normal ASCII karakterleri GEOS için BÜYÜK HARFLER yerine geçer. Eğer küçük harflerle yazmak isterseniz ASCII kodlarına $20 eklemeniz gerekmektedir. Yani kodlarıyla saklanır. Yazmak istediğiniz şeyi yazdıktan sonra $00 değeriyle yazılacak textin bittiğini GEOS'a bildirirsiniz. Mesela; $41, $42, $43, $44, $00 datalarına sahip bir menü elemanı ekranda ABCD olarak görünür.

2. TABLO

ALT MENÜ

byte 24

ALT-MENÜLER

Alt-menüler bir menü seçeneği tarafından çağırılan menülere verilen addır. Aynı normal menüler gibi bir tanım tablosuna sahiptirler. Bu tanım tablosunun pointeri seçenekle birlikte asıl menü tanımlanırken GEOS'a bildirilir. Bir alt-menü tablosu da normal bir menü tablosuyla aynıdır. İlk altı baytla menünün alt, üst, sol, sağ kenarlarını belirtiriz. Sonraki baytla menü tipi ve eleman sayısı bildirilir ve daha sonra da eleman tanımları tablosu gelir. Yani toplam olarak sayısı) 4 7 baytlık bir tablo gerekir. Bir alt-menü tablosu şöyle bir şey olabilir: (2. Tablo)

şalt menü, ana menünün hemen altından başlıyor

byte 244(8*14)41 ;8 seçenek kadar yer ayarlanıyor
“word 0
word 155
$88
“word alttextl
“byte $00
.Wword
“word alttext2
$80
word altmenü2.2
;menü kutusunun sol kenarı
;menü kutusunun sağ kenarı
;8 elemanlı dikey menü ($80 OR $08)
şyazı datası adresi
;bir servis rutini çağırılacak
;servis rutini başlangıç adresi
;yazı datası adresi
şalt menü açar
şalt menü tanım tablosu

altmenünün 1. seçeneği

;3 satırlık 6 seçenek daha tanımlanacak

kutusunun üstü
şmenü kutusunun altı
kutusunun sol kenarı
şmenü kutusunun sağ kenarı
;yatay menü ($00) OR 2 eleman($02)
seçeneğin yazılarının adresi
;bir alt menü açar —,
şalt menü tanım tablosu adresi
;2, seçeneğin yazılarının adresi
;bir alt-menü açar
şalt menü tanım tablosu adresi

1. seçenek

2. seçenek

Örnekteki alt-menü 8 elemanlı bir dikey menüdür. Alt kenar koordinatı hesaplanırken şu formül kullanılmıştır: Üst kenar (eleman sayısı*14) 4 1 Formülde eklenen ekstra piksel alt çizginin de hesaba katılması için gereklidir. Bu formül menülerde kullanabileceğiniz tek formüldür. Bunun dışında hemen her hesap için deneme yolunu seçmeniz gerekmektedir.

MENÜ TİPLERİ:

GEOS menüleri değişik tiplerde olabilirler. Bu tipler sadece görüntü değil, işletim açısından da farklılıklar yaratabilirler. Daha önce bahsettiğimiz yatay ve dikey menü tipleri yalnızca görüntü ve ekran düzenini ilgilendiren seçeneklerdir. Ana menünüz bir dikey menü olabilir ve bu menüyle bir yatay menüyü açabilirsiniz. Bu yatay menüden yapılacak bir seçenek ile de başka bir dikey menüyü açabilir ve bu işlemi istediğiniz kadar yapabilirsiniz. Yani işleyiş olarak yatay ve dikey menüler arasında fark yoktur. Oysa daha önce bahsetmediğimiz bir menü tipi vardır ki menülerin görüntüleri ile hiçbir ilgisi yoktur, fakat kullanıcıya büyük kolaylık sağlar. Normalde mouse'unuz (ok işareti) bir alt-menü sınırlarını aşarsa alt-menü otomatik olarak kapatılır ve kontrol ana menüye verilir. Ama eğer menü tipinizi $40 değeriyle OR'larsanız bir SINIRLANDIRILMIŞ MENÜ tipiniz olur. Bu tür menülerde mouse menü sınırları içinde hapsedilmiştir ve menüyü kapatmanın tek yolu üst taraftan dışarı çıkmaktır. (Sınırlar sol, sağ ve alt kenar için geçerlidir.) Böylece çok uzun menülerde kullanıcı menü dışına çıkma korkusu olmadan, menü içinde istediği hızda dolaşabilir. Mesela yedi elemanlı, sınırlandırılmış bir dikey menü yaratmak isterseniz menü tipi baytınız $c7 ($80 OR $40 OR $07) olmalıdır. Menü rutinleriniz oldukça becerikli olabilirler. Hatta kendi kendini değiştiren menüler bile yaratabilirsiniz. (Sakın en başta böyle bir şey denemeyin; çok zorlanırsınız.) Bu tür menüler geoWRITE programının karakter tipi menüsünde yer almaktadır. Menüden altı çizgili yazı türünü seçerseniz bu seçeneğin yanına bir yıldız (*) işareti konur. (veya tekrar seçilince silinir) Menü seçenekleri ya bir alt-menü açar ya da bir servis rutinine sıçrar demiştik. Oysa yapılabilecek bir işlem daha vardır. Bir DİNAMİK ALT-MENÜ çağırılabilir. Yani alt-menü açılmadan önce servis rutinine sıçranır ve bu rutinden çıkınca r0 tarafından gösterilen alt-menü açılır. Bir dinamik alt-menü aracılığıyla sistemin durumu kontrol edilebilir ve alt-menünün açılıp açılmayacağına ya da seçeneklerinin neler olacağına karar verilebilir. Dinamik alt-menü örneği geoPAINT programının fonts (karakter setleri) alt-menüsünde bulunur. Bu menüden bir font seçtiğinizde bu fontun erişilebilir boyutları kontrol edilir ve açılan üçüncü menüde bu karakter boyutları gösterilir. (Yandaki Tablo)

MENÜ RUTİNLERİ:

1. DoMenu Adres: $C151 Fonksiyon: r0 tarafından gösterilen menü tablosu tarafından tanımlanan menüyü çizer ve aktive eder. Gerekli Hazırlık: a: Menü çizildikten sonra mouse'un üzerine konacağı seçenek numarası. r0: Menü tablosunun adresi. Değiştirilen registerler: a, x, y, r0-r13 Açıklama: r0 register'ının gösterdiği menü tanım tablosunun tanımladığı menüyü ekrana çizer ve aktive eder. (Aynı ikonlar gibi menüler de aktive edildikten sonra tüm yük GEOS Kernal'ına ve ana döngüye bırakılır. GEOS Kernal alt alta sıralanmış herhangi sayıda menüyle başa çıkabilir.) Aktive ettikten sonra da mouse'u kaçıncı seçeneğin üzerine yerleştireceği GEOS'a a registeri tarafın- 2. ReDoMenu Adres: $C193 Fonksiyon: Menü elemanlarından biri seçildikten sonra menüyü tekrar aktive eder. Hazırlık: YOK Değiştirilen registerler: a, x, y, r0-r13 Açıklama: Ana döngüdeki menü rutinleri ekranda görünen menülerin hepsinin yapısını ve tipini bilir. Eğer bir menü elemanı bir servis rutini çağırırsa GEOS bu rutine sıçrama yapar. Bu rutinin içinde programcı GEOS'a o an kullanılan menüyü ne yapması gerektiğini belirtmelidir. ReDoMenu kullanılarak bu menü tekrar kullanılır hale getirilir. 3. DoPreviousMenu Adres: $C190 Fonksiyon: Bir alt-menüyü yok eder ve bir önceki menüyü tekrar aktive eder. Hazırlık: YOK Değiştirilen registerler: a, x, y, r0-r13

Açıklama: Çağırılan bir servis rutininde açılan menüyü tekrar kullanıma açmak istemiyorsak bu rutinle servis rutininin çağırıldığı menüyü kapatıp bir önceki menüyü aktive seçimin yapılabilmesi için mouse da aktive edilir. (Mouse, istendiği zaman, hız kazanmak amacıyla servis rutinleri tarafından kapatılabilir.) Bu rutini kullanırken dikkat etmeniz gereken şey mouse'u bir önceki menü veya alt-menünün sınırları içine yerleştirmektir. Aksi takdirde GEOS Kernal'ı mouse'u menünün dışında görecek ve bir önceki menüyü de kapatacaktır. 4. GotoFirstMenu Adres: $CIBD Fonksiyon: Tüm alt-menüleri kapatır ve ilk menüye döner. Hazırlık: YOK

Değiştirilen registerler: a, x, y, TÜ-r13 Açıklama: Bir alt-menü seris rutininde bu komut kullanılarak tüm altmenülerin yok edilmesi ve ilk menünün aktive edilmesi sağlanır. Bu aylık da bu kadar. Gelecek ay, şimdiye kadar öğrendiğimiz konuların kullanımını göreceğimiz açıklamalı bir örneğimiz olacak. Bu ayki program döküm ekinde de GEOS için yapılmış kısa fakat zevkli bir oyun var. Tabii ki bu oyunu ancak GEOS CONVERTER programını yazmış olanlar oynayabilecek. Eğer 53. sayıda yayınlanan bu programı hâlâ yazmadıysanız en kısa zamanda yazmanızı öneririm, çünkü bu program olmadan hiçbir örneğimizi GE-OS'da çalıştırmanız mümkün değil. Gelecek aya kadar hepinize iyi eğlenceler.

MENÜ TİPLERİ

YATAY z $00

DİKEY - $80

SINIRLANDIRILMIŞ> $ 40

MENÜ ELEMAN TİPLERİ

ALT MENÜ: $80

SERVİS RUTİNİ: $00

DİNAMİK ALT MENÜ: $40

MENÜ İLE İLGİLİ SABİTLER

Menü elemanlarının yatay olarak yazılmasını sağlar. seçenek 1 seçenek 2 seçenek 3

Menü elemanlarının dikey olarak yazılmasını sağlar.

Mouse'un menü sınırlarını sol, sağ ve alt kenardan terk etmesini engeller. Eğer hiçbir şey seçilmeyecekse kullanıcı üst kenardan dışarı çıkarak menüyü kapatabilir.

Bir menü elemanının, seçilince, bir alt menüyü açmasını sağlar. Arkasından alt menü tanım tablosunun adres baytları yazılmalıdır.

Bir menü elemanının, seçildiği zaman, bir servis rutinini çağırmasını sağlar. Arkasından servis rutininin adres baytları yazılmalıdır.

Bir menü elemanının, seçildiği zaman önce bir servis rutinine sıçramasını, oradan RTS komutu ile dönülünce de bir alt menü açmasını sağlar. Rutinin sonunda r0 register'ına ($02, $03) alt menü tanım tablosu adresleri verilmelidir. Arkasından servis rutininin adres baytları yazılmalıdır.

TANITM