GW-BASIC'te altprogram (Subroutine) takviyeleri
Retro bilgisayarBASIC 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.
(Subroutine) Takviyeleri
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.
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.
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).