Bu ayki sayımızda size bir GEOS application'ı tasarlamanız için gerekli temel bilgileri vereceğiz. Ayrıca program döküm ekinde bundan sonra sık sık kullanacağınız bir yardımcı program yer almakta.
Geçen ay basit bilgilerle başladığımız GEOS kursuna daha derinlere inerek devam ediyoruz. Bu ay program döküm ekinde bulunacağınız THE ULTIMATE GEOS CONVERTER programını yazmanız, bu kurstan yararlanmanız için şarttır. Program her ne kadar uzunsa da, bu, gözünüzü korkutmasın çünkü GEOS'un size sunduğu kolaylıklardan yararlanmak için bu programa ihtiyacınız var. Program hakkında ayrıntılı bilgi PROGRAM DÖKÜM EKİ'ndeki açıklamalarda bulunmaktadır.
Bu aydan itibaren GEOS programlarını SÜPER ASSEMBLER formatında değil, normal bir assembler formatında vereceğiz. Bunun sebebi SÜPER ASSEMBLER'ın yapısının GEOS programlarını yazmaya uygun olmaması.
Bu ayki yazımızda size bir GEOS application'ı tasarımlamanız için gerekli temel bilgileri vereceğim. Bir application tasarımını üç ana başlığa ayırabilirsiniz:
1. Event'leri (olayları) seçin:
Programınızda hangi tip menüler, ikonlar, vb. kulla-nacağınıza karar verin. (Daha sonraki yazılarımızda bah-sedilecek olan ve özel bir event türü olan zaman tabanlı işlemler de buna dahildir.)
2. Event'leri tanımlayın:
Event'i tanımlayan tabloları kurun ve vektörleri yükleyin. Örneğin menü yapıları basit tablo yapılarıyla tanımlanırlar.
3. Rutinleri yazın:
Ana döngü tarafından çağırılacak ve sizin event'leriniz tarafından çalıştırılacak olan rutinleri yazın.
Bu noktaya kadar, amacımız GEOS'la programlamanın neye benzediğini göstermekti. GEOS, application'ınızın bir prototipini kolaylıkla hazırlamanızı sağlar; çünkü programınızı başa çıkması kolay olan basit tanım tablolarına ve event hizmet rutinlerine ayırır. Eventleri programlamaya başlamadan önce kısa bir şekilde GEOS'un donanımını tartışacağız: kullandığı grafik modu, bellek düzeni ve bank-switch registerlerinin nasıl ayarlandığı.
Aslında GEOS'ta program yazıp da grafik modları veya bank-switch hakkında hiçbir şey bilmemeniz olası, yani bir C64'cüsüyseniz, şimdiki bölüm size zor gelebilir ama bu sizi üzmesin. Bu sütunlarda sizin, (TELETEKNİK bayilerinden elde edebileceğiniz) PROGRAMCININ EL KİTABI adlı kitabı okuduğunuz veya grafik hakkında yeterli bilgiye sahip olduğunuz varsayılmıştır. Sizin GEOS bellek haritasını değiştirmek isteyeceğinizi sanmıyorum ama bazen sevdiğiniz bir C64 KERNAL rutinine veya BASIC ROM'una sıçrayıp sonra GEOS'un normal işletimine dönmek isteyebilirsiniz. Birazdan GEOS'un 'fiziksel' bir tanımını yapacağım. Yani prog-ramlandığı grafik modu, bellekte nerelere yerleştirildiği, hangi GEOS KERNAL versiyonunun sizde bulunduğu, donanım kontrol register'inin değeri ve KERNAL ile BASIC ROM rutinlerini çağırmak için bunu nasıl değiştireceğiniz.
YÜKSEK ÇÖZÜNÜRLÜK ve BIT-MAP MODU:
GEOS C64'ün 320 x 200'lük en yüksek çözünürlük modunu kullanır. Bu modda 8000 bayt (200 satır çizgisi, çizgi başına 40 bayt) ekranı görüntülemek için kullanılır. Bu moda yabancıysanız PROGRAMCININ EL KİTABI'nda bulabileceğiniz Grafik modları hakkındaki bölümleri okuyun.
GEOS programlarının GEOS KERNAL altında yazımını kolaylaştırmak için bellekte normal ekranın bir kopyasını bulunduran 8000 baytlık bir tampon bölge bulunur. KERNAL'da tampon bölgeyi ekrana kopyalayacak ya da tersini yapabilecek hazır rutinler bulunmaktadır. Bu sayede, bir menü veya konuşma kutusu açıldığında ve application'ınızın ekranının üzerine yazdığında ekran kaybı engellenmiş olur. Yani menü ve konuşma kutuları tampon bölgeyi ekrana transfer ederek application'ın kendi ekranını yeniden yaratması (ki bu bazen imkânsızdır) gereğini ortadan kaldırmış olur.
Bu kopyalama rutinleri application tarafından da kullanılabilir tabii ki. Örneğin geoPAINT bu özelliği son de ğişikliği silen UNDO komutunun kullanılması için kullanılır. Bu kopyalama özelliğini destekleyen KERNAL rutinleri (adresleri gelecek sayıda vereceğim) RecoverAllMenus, RecoverLine, RecoverMenü ve RecoverRectangle'dır. Bu rutinleri de grafik ve menü bölümlerinde işleyeceğiz. Eğer tampon bölgeye ayrılan 8000 baytı da kullanmak istiyorsanız, ekranın otomatik olarak bu bölgeye kopyalanması GEOS KERNAL tarafından engellenebilir. Bu sayede kullanabileceğiniz bellek 8000 bayt artar. Bu da grafik bölümünde ayrıntılı olarak ele alınacak konulardan biridir.
BELLEK HARİTASI:
GEOS BELLEK HARİTASI tablomuzda GEOS KERNAL tarafından kullanılan ve sizin kullanımınıza açık olan bölgeleri görebilirsiniz. Bu tabloya göre application'ınız $0400-$5FFF arasında bulunan 22K'lık alanı kullanabilir. Buna tampon bölgede bulunan 8K'lık bölgeyi de eklersek sizin kullanımınıza tam 30K bırakılmış demektir. Bu miktar ilk bakışta az görünebilir ama GEOS KERNAL'ının menü, ikon ve diyalog kutularıyla ilgili tüm işlemleri yüklenmesi sizin yazmanız gereken program miktarını oldukça azaltmaktadır. Bundan ayrı olarak GEOS'un diske ulaşım hızının yüksek oluşu sayesinde yeni bir dosya türü ile bellek sorununuz tamamen ortadan kalkıyor, Adı VLIR olan bu dosya türü ile çok uzun ve gelişmiş programlan yazmanız olanaklı hale geliyor. VLIR dosyaları da daha sonraki bölümlerimizde ayrıntılarıyla anlatacağım konular arasında.
Application kodunun yeri ve RAM GEOS bellek haritası hakkında çoğu programlayıcıya yeterlidir. RAM dört ayrı bölgede bulunmaktadır. Buna application bölgesinden ayıracağınız yerleri de ekleyebilirsiniz tabii.
1. r0-r15 pseudo registerleri.
2. $00FC-$00FF arası. Bu bölge ne C64 ne de GEOS KERNAL'ı tarafından kullanılır ve application'larınız için ideal bölgelerdir. Bundan sonra bunlara a0 ve a1 pseudo registerleri diyeceğiz.
3. $0070-$007F arası. Bu bilgilere de a2-a9 pseudo registerleri adını vereceğiz.
4. $7F40-$7FFF arası. Her ne kadar zero-page'de değilse de programlarınız için uygun bir değişken saklama alanıdır.
Bellek hakkında daha ayrıntılı bilgi istiyorsanız bellek haritasını inceleyin.
Bütün giriş/çıkışlar ve interrupt kontrolü GEOS tarafından yapılmaktadır. Kernal rutinleri kullanım açısından çok daha kolaydır ve programınız onları kullansa da kullanmasa da bellekte yer kaplarlar.
GEOS KERNAL VERSİYON BYTE'LARI:
Elinizde GEOS'un hangi versiyonunu bulundurduğunuzu anlamanızı sağlayacak birçok byte bulunur GEOS KERNAL'ında. $c006 adresinde “GEOS BOOT” yazısını görürüz. Bu yazı sayesinde programınızın GEOS tarafından çağrılıp çağırılmadığını öğrenebilirsiniz. Rutinlerinde GEOS KERNAL rutinlerini kullanmayacak olanlar $C000-$C07F arası dışındaki tüm kernal'ı kullanabilirler. Fakat bu bellek alanı tekrar GEOS KERNAL'ı yüklemenizi sağlayacağı için buraya dokunmamalısınız.
"GEOS BOOT" yazısını versiyon numarasını içeren iki rakam takip eder.
GEOS V1.3'den sonra bu byte'ların arkasına ek olarak yeni bilgiler içeren byte'lar konmuştur. İlk olarak bir dil byte'ı bulunur. Bunun hemen arkasında daha ileride eklemek üzere üç byte'lık boşluk bulunur. Bunların şu anki değeri $00'dır.
GEOS versiyon byte'ları hakkında daha ayrıntılı bilgiyi ilgili tabloyu inceleyerek elde edebilirsiniz. Bu versiyon byte'larından programınızın hangi GEOS versiyonu tarafından yüklendiği öğrenebilir ve bu versiyonla uyumlu olup, olmadığına karar verebilirsiniz.
KERNAL VERSİYON BYTE'LARI:
.psect Sc000; kernal programı $c000'dan başlar
BootGEOS:
jmp o-BootGEOS; GEOS'u yeniden yükler.
İleride çıkacak yeni GEOS versiyonlarında o-BootGEOS değişse bile BootGEOS'un yeri değişmeyecektir ve c000-c02f arası korunduğu sürece jmp BootGEOS'la GEOS'u boot edebilirsiniz.
ResetHandle:
jmp vektör; GEOS Kernal'ı tarafından kullanılan bir vektördür.
BootFilename:
.byte “GEOS BOOT”; $006'da bulunur.
Bu yazı sayesinde programınızın GEOS'tan yüklendiğini anlarsınız.
VERSİYON:
.byte $13; GEOS versiyonunu gösteren byte.
Örnekte versiyon =1.3.
YABANCI DİL BYTE'ı:
.byte DİLBYTE'ı
; İNGİLİZCE = 0 ; ALMANCA = 1 ; FRANSIZCA = 2 ; HOLLANDACA = 3 ; İTALYANCA = 4 ; İSVEÇÇE = 5 ; İSPANYOLCA = 6 ; PORTEKİZCE = 7
GEOS KERNAL'ı $BF40 ve yukarısına yerleşmiştir. Bu sayede KERNAL' ların altında kalan RAM bölgesini kendi amaçları için kullanılmıştır. GEOS'un normal çalışması sırasına tüm ROM'lar ve $D000-$DFFF kaldırılmış durumdadır.
Seçilen bank $0001 adresi tarafından ve kartuş çıkışında bulunan iki pin tarafından kontrol edilir. Bu iki pin'in değerini değiştiremeyeceğinize göre bank değiştirmek için yalnızca $0001 adresini kullanacağız.
Eğer programınızda giriş/çıkış bölgesine veya BASIC ve KERNAL ROM'larına GEOS kernal rutinlerinde ayrılarak ulaşmak istiyorsanız. İki GEOS KERNAL rutinini kullanmanız gerekir: InitForIO ve DoneWithIO. GEOS'a, birinci rutinle giriş/giriş bölgesine ulaşmak istediğinizi. İkincisiyle de giriş/çıkış'la işinizin bittiğini iletirseniz. Bu rutinler ayrıca bellek haritasını değiştirme ve interruptlar ile (gerektiğinde) sprite'lerin yok edilmesi işleriyle de ilgilenirler.
Bank değiştirme ile daha ayrıntılı bilgiyi de PROGRAMCININ EL KİTABI'nda KERNAL rutinlerini anlatan bölümün hemen öncesinde bulabilirsiniz.
ASSEMBLER KOMUTLARI:
Bundan sonra kullanacağımız assembler'in SUPERASS'le uyumlu olmadığını söylemiştim. Ancak burada verilen LABEL'ların yerine değerlerini koyarsanız GEOS rutinleri için SUPERASS'i de kullanabilirsiniz. Fakat size tavsiyem daha iyi bir assembler bulmanız.
Kullanacağımız assembler'da LABEL'lar şu şekilde sınıflandırılacak:
'NEWPATTERN' gibi tüm harfler büyük harf olursa bahsedilen tek byte'lık bir GEOS sabitidir. Bunların yerine $NN kullanabilirsiniz.
'mobprior' şeklinde tüm harfler küçük olarak yazılmışsa .LABEL iki byte'lık bir c64 sistem vektörüdür ve yerine $NNNN kullanılabilir.
'windowTop' gibi ilk kelime küçük, ikinci kelime büyük harfle başlarsa bu bir GEOS sistem vektörüdür ve yerine yine $NNNN kullanılabilir.
'BootGeos' gibi bütün kelimeler büyük harfle başlarsa bahsedilen label bir GEOS KERNAL rutindir ve yerine $NNNN kullanılabilir.
Yukarıdaki NN'ler bir byte yerine geçmektedir. Assembler'ımızın özel komutları şöyle sıralanabilir:
1) * = $NNNN: Programın başlangıç adresi.
2) .byte $NN, $MM,... : $NN, $MM değerlerini sırayla belleğe yazar.
3) .word $NNMM,$KKLL,... : $MM, $NN, $LL, $KK değerlerini belleğe yazar.
4) .block $NNNN : $NNNN kadar boş byte bırakır.
5) .if koşul : Koşul doğruysa .ELSE veya .ENDIF'e kadar olan bölgeyi assemble eder.
6) .else : .if'de belirtilen koşul yanlışsa ENDIF'e kadar olan bölgeyi assemble eder.
7) .endif : .if ve .else komutlarının sonunu belirtir.
Artık bir program yazabilecek tüm temele sahipsiniz.
Bu ay Program Döküm Eki'nde yayınlanan ilgili programları yazmanız, daha sonra yayınlayacağımız örnek programlan GEOS'ta çalıştırabilmeniz için gereklidir. Bu yüzden programın uzunluğu sizi yıldırmasın. Haydi GEOS'çular, klavye başına.
Gelecek ay, programların temelini oluşturan ikon ve menülerinin kullanımını öğrenerek devam edeceğiz yazımıza. Şimdilik hoşçakalın.
kaynak: Teleteknik Commodore Dergisi, Sayı 54, Ağustos 1990, Sayfa 44-47
Teleteknik
01.08.1990
Keywords: GEOS, İşletim Sistemleri, Commodore, C64