Bu sayfadaki yazılar
Sayfanın metni
Sayfa 34
BASIC programınızı disketten altprogram çağırır hale getirin. Eğer hız programcıların en baş sorunuysa, bellek hacmi de hemen ikinci baş sorundur. 3. sayımızda Ömer Erkmen, BASIC'le hız sorununun nasıl anlatmıştı. Bu yazımızda GW-BASIC'le ilgili olarak tanıttığımız yöntem hem hız hem bellek hacmi konularında büyük kolaylıklar sağlar.
Mike Carmichael'dan Çeviren:
Emin TANRIYAR Bir BASIC programı geliştirirken bellek tükenmesi gibi bir olayla karşılaştıysanız, büyük bir ihtimalle kendi kendinize şöyle demişsinizdir: “Ah keşke bütün alt programları (subroutine'leri) diskte kaydedebilseydim ve ihtiyacım oldukça birer birer çağırıp kullanabilseydim”. Şüphesiz global değişkenleri sürdürmek ve program modülleri arasında bir yol açabilmek için COMMON ve CHAIN komutlarını kullanabilirsiniz, ama Microsoft'un GW-BASIC'i programcının bir dizi alt programın ana programa bağlanmasına (linking) izin vermez. Ama yine de GW-BASIC'in bu sınırlılığını aşarak disketten yan program çağrılabilmesini mümkün kılan RAMDISK'te aslında fikir oldukça basittir; RAM'ın belli bir bölümü alt programlara ayrılır ve gerektikçe disketteki alt programlar bu özel bölüme yüklenir. Hemen bir uyarı: GW-BASIC'te ana programa bitişik bellek bölgesi içine bir yan program yüklemeye çalışırsanız programın hemen üstünde hafızada bulunan interpreter'in çalışma sahasını tahrip edersiniz ve program çöker. Bu sorunun üstesinden şöyle gelebiliriz: Ana program alt programlar için, içinde belirli bir miktar RAM ayıran yorum (REM) cümleleriyle takviye edilir (Örneğin benim örnek programımdaki REM'ler yaklaşık 1000 byte yer kaplıyor). Ama daha fazla ya da az REM cümlesi kullanarak ana programınızın daha büyük bir bellek hacmi kaplamasını sağlayabiliriz. Belirli bir alt programa gereksinim duyulduğunda ana program onu disketten alır ve REM cümleleriyle bellek yerine yükler. Bu arada orada işgalci kuvvet gibi duran REM cümleleri de silinmiş olur ve alt program ana programa dahil edilir. Daha sonra başka bir alt programa daha ihtiyaç duyulduğunda program onu da aynı bellek bölgesine yükler ama bu arada da bir önceki alt programı da siler. Ve bütün bu işler ana program yürürlükteyken olur biter. Bu sihirbazlık için kullanılan komut bir GW-BASIC komutu olan BLOAD'dır ve bir disketteki dosyayı belirtilen bellek bölgesine yükler. Yalnız dikkat edilmesi gereken bir nokta var: Diskteki dosya söz konusu durumda bir alt program ikili formatta (binary) olmalıdır. Ve şimdi de bizim artık BASIC programlamayı terk ettiğimizi düşünmeyesiniz diye bu GW-BASIC'in programları nasıl depoladığını ve sizin de BASIC kodunu nasıl ikili formata çevirebileceğinizi inceleyelim. Göreceksiniz sandığınızdan daha basit.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 35
BASIC Kodu Nasıl Çevrilir?
Microsoft'un GW-BASIC çeviricisi (interpreter) oldukça açık sözlü ve basit bir dildir. Siz komutları satır satır belleğe girerken çevirici kendi çalışma alanını hemen son program satırının üzerinde tutar. Bir satırda bulunan her BASIC komutu kendisine uygun 1- ya da 2- byte'lık kodlara çevrilir. Bellek adresleri ve satır numaraları standart 2 byte formatında saklanır. Program dökümünde görülmemekle birlikte her BASIC satırından önce bir sonraki satırı adresleyen bir işaret bulunur. Bu işaretten sonra satır numarası, ondan sonra sonuç çözümlenmiş BASIC kodu, ondan sonra da harf sayısal konumların met vs. ASCII karşılıkları gelir. Haydi şimdi de sırf eğlencelik olsun diye bir BASIC komutunu inceleyelim. İlk önce komutun bilgisayarınızın belleğinin neresinde olduğunu bulmak zorundasınız. BASIC'i yükledikten sonra NEW komutunu kullanın ki yabancı bir kodla uğraşmak zorunda kalmayasınız. Sonra herhangi bir değişkene bir değer verin ve o değişkenin bellekteki yerini tespit edin. Örneğin sadece yazın. Şimdi de PRINT VARPTR(S) yazın. Ondalık sonuç sizi BASIC'in kullandığı hafızanın en alt noktasının çok yakınına bir yere, programın başlayacağı yere götürür. COMMODORE PC'de bu değer 2830'dur. Sonra yeniden NEW girin ve inceleyebileceğimiz basit bir satır yazın: 10 X=1. Şimdi BASIC interpreter'in ne yaptığını görmek için satır numaraları kullanmadan FOR I=1 TO 20:PRINT PEEK(X+I):NEXT I girin. Burada X'in değeri demin VARPTR(S)'dan elde ettiğiniz değerden 10 eksik yani 2820 olmalı. Bilgisayarınızın bu komutun sonucu olarak şu 20 değeri kontrol etmiş olması gerekir.
0002111 10070 36 32 231 32
34 42 3400073
000 Basic) kodun birinci satırının altında) 12 11 Bellekteki bir sonraki satır adresleyen işaret 15*2564 237-4077) 100 Satır numarası) 70 36 FS) 3? Boş aralık) 231 X- (eşit işareti için GW-BASIC kodu) 32 Boş aralık) 34 42 34 he dü 0 satır sonu) 00 Bu bölgeler boştur. Demek ki programın gerisi gelmemektedir) 473 BASIC'in çalışma
alanında ilk iki byte) Bu yöntemi aynı zamanda diğer BASIC fonksiyonlarının çalışmalarını görmek için de kullanabilirsiniz. Ve isterseniz POKE fonksiyonu ile deneysel bir çalışmayla bir komut tablosu ve küçük alt programlar inşa etmeyi de başarabilirsiniz.
İki Tabanlı (Binary) Bir Dosya İnşa Etmek
Benim ana program ve alt programlarımı ayrı ayrı BASIC listeleri halinde hazırlıyorum.
Ana programın sonunda çeşitli işaret satırları vardır. Bunlar alt programın ikili versiyonunun yükleneceği bellek bölgelerini işgal etmektedirler. Dokümantasyon ve yer doldurma amacıyla kullanılan REM'ler gerektiğinden de fazla boş yer bırakırlar. Pratik olarak gerekli olandan daha fazla, daha geniş bir alan temizlenmemelidir. BASIC alt programın çifte değişkenli versiyonunu yaratmak için iki listeyi tek liste haline getirin (Anaprog. Bas. yükleyin ve MERGE “routine.sub” yazın). Programı RUN ettiğimizde yeni dosya (routine.bin) saklanmış olur. Programın iki tabanlı alt programın ilk satırında 8 byte öteye bakar. Bu yüzden alt programın BASIC versiyonu yalnızca satır numarası ve bir REM cümlesinden ibaret olan bir satırla başlamalıdır. Bundan sonra program, “adres işareti + 8”den, bulunmuş olan adresi çıkartarak artık belleğe alınmış olan alt programın iki tabanlı versiyonu boyunca ayarlanmasını sağlar. Bu ayarlamalar programın sonu gelene kadar (adres göstergesi 0 olana kadar) satır satır yapılır. Öyle ki, ikili versiyon saklanması bittiğinde alt program ana programın sonunda olmalıdır. Kodun geri kalanı ise oldukça basittir. Bir not daha: Eğer alt programda ve düzeltilmiş ikili versiyonda yapılan değişiklikler diskin üzerinde korunmak isteniyorsa, programı yürürlüğe sokmadan önce halihazırdaki versiyonu silmelisiniz, yoksa program var olan çifte değişkenli alt programı yüklemeye kalkacaktır. Alt program yüklemeleri konusunda GW-BASIC'teki basit yaklaşım her BASIC programının işine yarayabilir. Teknikten yararlanın ve uygulamalarınızda örnek program birleştirmelerinde tekniğinizi geliştirin. Yazar Mike Carmichael ve Jones kuruluşları Program Planlama Servisleri Müdürüdür. Editörün notu: Program örnekleri için BASIC kaynak kodu, Anaprog. Bas. ve Program. Yan. (routine.sub) downloading için 617 861-9764'teki listeler uygundur ve aynı zamanda disk üzerinde de kullanılabilir (Sayfa 469'daki liste).
— üreticilerinin paniğe kapılmalarına neden olan yeni bir ürün var piyasada. King Limited tarafından üretilen Freeze Frame. C-64'ün expansion portuna takılan bu kartuş hemen hemen tüm programları kırabiliyor. Aslında fikir çok basit. C-64'ün 64 Kbyte'lık RAM'ı, G/Ç çipinin, işlemci sicilinin ve renk RAM'ının değerleriyle birlikte topluca yükleniyor ve bellekte bulunan programın bir kopyası alınmış oluyor. Aslında bu iş anlatıldığı kadar kolay değil tabii ki. Bunun kanıtı da böyle bir kartuşun ancak bugün yapılabilmiş olması. Aletin kullanılması çok basit: Bilgisayar açıldığında Freeze Frame ekranda bir menü veriyor. Menüde belirtilen tuşlardan birine basılınca ekran kararıyor. Artık hiçbir program Freeze Frame'i fark edemiyor. Kopyalamak istediğiniz programı yükleyip çalıştırıyorsunuz. Program çalışırken herhangi bir anda kartuşun üstündeki küçük kırmızı düğmeye basıyorsunuz. Ekran kısa bir süre kararıyor, sonra yanıp sönmeye başlıyor. Bu aşamada Freeze Frame, bir klavye girişi bekliyor. Çünkü kullanıcı programı kasette mi yoksa diskette mi saklamak istediğini bildirmek durumunda. Seçilen gereci belirten tuşa basıldığında belleğin içeriği adım adım yükleniyor. Bugün var olan Software'in 94'ten fazlası bu kartuşla kopyalanabiliyor. Bu orana erişebilen başka kopya programı yok. Bellek sınırına kadar dolu olsa bile Freeze Frame bir miktar çalışma belleği oluşturuyor, çünkü kendi yükleme programını ekran belleğine yazıyor. Ara yükleme yapan programlarda iş daha karışık. Bu şekilde çalışan az sayıda programın kopyalanması şöyle oluyor: Ana menü Freeze Frame ile yüklendikten sonra diğer bölümler parça parça yükleniyor. Fakat bu ara yükleme yapan ve her aşamada korumayı kontrol eden programlar için geçerli olmayabiliyor. Ayrıca Speed-Dos vb. bir sistemle donatılmış disk drive'lar karşısında bu kartuş işleme olanağı bulamıyor. Çünkü Freeze Frame Floppy-RAM'ı değil yalnızca bilgisayarın RAM'ını kırabiliyor. Freeze Frame, kopyalamanın dışında bazı kullanım olanakları daha sağlıyor. Örneğin çoğu oyunda Pause ve Save fonksiyonları olmayabiliyor. Kısa bir süre bilgisayarınızın başından ayrılmanız gerekirse, kartuşun düğmesine basmanız yeterli. Geri döndüğümüzde kaldığınız yerden devam edebilirsiniz. Ayrıca kaset programlarınızda skor listesini saklamanız da mümkün. En yüksek skora eriştiğinizde düğmeye basıp bu skoru saklayabilirsiniz. Son olarak bu marifetli kartuşun bazı dezavantajlarından bahsedelim. Kartuşun başarılı kullanımı ancak herhangi bir değişikliğe uğramamış C-64'lerde ve 1541 Disk Drive'larda mümkün. Yeni sistemler, Floppy hızlandırıcıları vb. kullanıldığında, Freeze