Bu sayfadaki yazılar
Sayfanın metni
Sayfa 57
POKE 44,12:CLR Yükle komutunun bazı ilginç özellikleri vardır. Direkt modda uygulandığı zaman, bir disk yüklemesi tüm pointer'ları resetler, belleğe bir program dosyası okur ve pointer'ları programın başı ve sonuna ayarlar. Eğer bir yeniden yerleştirmeyen LOAD “filename”,8,1 uygulanırsa sonraki Load komutlarında Out-of-Memory hatası görülebilir. Çünkü 45-50 arasındaki üç pointer load aracılığıyla Dizinin-Tabanı pointer'ı yukarısına ayarlanmışlardır. Bu 49512'deki RAM bloğuna bir makine dili programı yükleseniz de olabilirdi. Bu çıkmazdan kurtulmanın en basit yolu yeniden yerleştirmeyen (nonrelocating) bir yüklemeden sonra bir NEW uygulamaktır. Program kontrolü altında, load pointer'ların hiçbirini resetlemez. Bununla birlikte bellekteki herhangi bir Basic programının uygulanması
Basic başlangıcı pointer'ının değdiği herhangi bir noktadan başlayabilir. Bu da demektir ki program kontrolü altında bir makine dili subrutini gibi şeyler yüklemek için aşağıdaki gibi bir kod yazmalısınız. 10 IF FL=1 THEN GOTO 30 20 FL=1:LOAD “routine”,8,1 30 RESTORE:REM program Bu program ilk çalıştırıldığında, FL değişkeni 0'a eşittir. Satır 20'de, FL 1'e ayarlanır ve nonrelocating load gerçekleşir. Bu yapıldığında uygulama satır 30'da başlar, ama bu sefer FL 1'e eşittir ve satır 20 pas geçilir. Load komutu program kontrolünde uygulandığı zaman hiçbir pointer'ı değiştirmemesi, Basic programcılığına ayrılabilecek ilave bir 4K sağlar. Aşağıdaki kod bunun nasıl yapılacağını göstermektedir. 10 POKE 44,192:POKE 49152,0 20 LOAD “Short program”, 8
Bu örnekte, satır 10 Basic başlangıcını 49152'ye yerleştirir ve o adrese 0 POKE eder. Satır 20'deki kısa program (short program) 4K'dan daha kısa olan her program olabilir. O satır kısa programı yükler ve çalıştırmaya başlar, böylece 2048'de başlayan esas program bellekte değişmeden kalır. Kontrolü şöyle bir satırla yeniden esas programa devredebilirsiniz: 100 POKE 44,8:GOTO esas programdaki satır numarası Kısa programa da şöyle bir şekilde geri dönebilirsiniz: 200 POKE 44,192:GOTO kısa programdaki satır numarası Böyle bir şey eğlenceli olabilir.
C-128 BELLEK İDARESİ
C-128'de işler biraz daha değişir. Her şeyden önce, bu makinede Basic program RAM bank 0'da tutulur. Oysa ilişkili dizi ve değişkenler RAM bank 1'de depolanmaktadır, bu yüzden bellek pointer'ları arasında daha az ilişki vardır. Ayrıca C-64'ün zıttına, program ve data depolanması için mevcut olan alanlar birbirinden bağımsızdır ve bu nedenle data depolanması program uzunluğunca kısıtlanmaz. Son olarak, C-128 bellek içeriklerinin kullanılmasını hızlandırmak için BSave ve BLoad komutlarına sahiptir. Dikkat etmeniz gereken bir konu da Grafik emri (statement), GRAPHIC N (1 ile 4 arasındaki herhangi bir değerdir N) uygulandığında, Basic başlangıcı pointer'ı 9K'ya gider. Adres 46'nın içeriği 28'den 64'e değişir. GRAPHIC CLR uygulanacak olursa, tam tersi olur. Buna ilave olarak, o sırada bellekte olan her Basic programı yeni yere taşınır. C-128'de belleği, RAM bank 0'daki program deposunun üstünde bellek depolamak kolaydır. Sadece 4626 ile 4627'nin içeriklerini değiştirin. Örneğin 4K rezerve etmek için şunu girin: POKE 4627,240 FRE(0) fonksiyonu RAM bank 0'daki mevcut belleği Basic tavanı ve Program sonu değerleri arasındaki fark olarak verir. C-128'de elde edilen 16 bitlik, işaretlenmemiş tam sayı sizin daha fazla bir çaba harcamanıza gerek olmadan halledilir. Tüm bunlar C-64 ve C-128'in bellek haritalarına sadece bir girişti. Ayrıntılı bilgiler için programcı referans kitaplarına başvurmalısınız.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 56
Fonksiyon C-64 Basic-Başlangıcı 43,44 Değişken-Başlangıcı 45,46 Program-Sonu Basic-Tavanı Sıra-Başlangıcı 47,48 Sıra-Sonu 49,50 Dizi-Tabanı Bellek-Sonu 55,56
Adres İçerik C-128 C-64 C-128 45,46 1,8 1,28 47,48 3,8 0,4 4624,4625 3,28 4626,4627 0,255 49,50 3,8 0,44 51,52 3,8 0,4 57,54 0,160 0,255 57,58 0,160 0,255 işlemci tarafından direkt olarak ulaşılabilen 65536 baytlık bellekten çok daha fazlasına sahiptirler. C-64 Basic yorumcu ve kernal'ın depolandığı ROM biçiminde ilave belleğe sahiptir. C-128'e gelince, iki 65536 baytlık RAM deposuna ve C-64'den daha fazla ROM'a sahiptir. İki bilgisayarda da mikroişlemcinin ekstra belleğe ulaşmasına yardımcı olan bellek-idare çipleri biçiminde ilave donanım vardır. C-64'te, bir Basic programının yorumu, mikroişlemcinin direktiflerini bir bank'te ROM'dan alırken, diğer bank'in RAM'indeki Basiği manipüle ettiği karmaşık bir süreçtir. C-128 sonsuz bir üçgen içerir: Bir köşeyi Basic ROM, RAM'da depolanan Basic programı ikinci bir köşe ve RAM'da depolanmış, Basic tarafından kullanılan sayısal ve dizi dataları da üçüncü köşeyi oluştururlar. Bu donanım ve yazılım manipülasyonudur ki C-64 ve C-128'i tüm zamanların en gelişmiş 8-bitlik bilgisayarları arasına sokmuştur. İncelediğimiz adresler, bir bellekteki Basic program depolama bölgesinin başlangıcını temsil eder, Basic programının sonunda da, bilgisayarın bildiği bir adreste olduğunu tahmin edebilirsiniz. Böylece programınız için ne kadar alan kalmış olduğunu anlayabilirsiniz. Bu doğru ama bir Basic programı direktiflerin çok ötesinde bir şeydir. Çalışan bir program sayısal ve özel dataları işlediğinden, bunlar da kendileri için depo alanı gerektirir. Bu nedenle Basic yorumcusu bunun için de alan ayırmalıdır. Tablo 1'de Basic'in her şeyi izlemek için kullandığı pointer'ların bir listesi vardır. Bu pointer'ların sıralanmış içerikleri bilgisayarın açılışından ya da resetlemeden sonraki değerleridir. Aynı zamanda herhangi bir program girilmeden ya da yüklenmeden ya da değişkenler belirlenmeden önceki değerlerdir. C-128 için bu pointer'larda depolanmış adresler özel yorum gerektirir. Basiğin Başlangıcı, Programın Sonu ve Basic tavanı pointer'ları Bank 0 RAM'inde adresler içerirler. Kalan pointer'lar bank 1 RAM'de yerleştirilmiş adreslere sahiptir. Bazı Basic komutları bu pointer'ların içeriklerini direkt olarak etkileyebilir. Bunu tam tersine de içerikleri amaçlarınıza uygun olarak manipüle edebilirsiniz. Örneğin RAM'in bazı kısımlarını sprite, bit-mapped grafik ve makine dili programları için ayırmak isteyebilirsiniz.
Tablo 1. Commodore Basic'te Kullanılan Pointer'lar.
BELLEK İDARESİ
Şimdi Basiğin bellek kaynaklarını nasıl manipüle ettiğini inceleyeceğiz. C-128 ve C-64 ayrı ayrı ele alınacak, çünkü bellek kullanımları oldukça farklıdır. Tablo ikide C-64'den başlayarak Basic'te adres yerlerinin dağılımını gösteriyor. Basic program depolama alanının dört kısmı olduğuna dikkat edin. Her bölümün başı ve sonu yukarıda sözünü ettiğim pointer'larda depolanmıştır. FRE fonksiyonuyla başlayalım. Basic programı ya da data depolanması için kalanı temsil eden bi-
0-1023 Sistem RAM 1024-2047 — Ekran RAM 2048-40959 Basic program deposu: Dizi Data Sıra Data
Değişken Data Program Kodu 40960-49151 Basic ROM 49152-53247 Serbest RAM 53248-57343 Girdi/Çıktı donanım Renk Belleği Karakter Oluşturucu 57344-65535 Kernal Rom
Tablo 2. C-64 Belleğinin Basic Yerleşimi
ter değer verir. Onu şöyle deneyin: FRE(0) Bu sıfır yerine her şeyin konulabileceği temsili bir değişken. Elinizde negatif bir sayı bulunması büyük olasılıktır, bu da basitçe 32767 bayttan daha fazla serbest bayta sahipsiniz demektir. FRE tarafından verilen değer iki baytlık bir tam sayıdır ve Basic yalnızca signed (işaretlenmiş) iki baytlık tam sayıları tanıdığı için sonucu negatif olarak yorumlar. Bunu düzeltmek için şunu girin: PRINT FRE(0) + 65536 Ya da PRINT FRE(0) + 2116 Burada FRE'nin yaptığı Sıra Sonu 49,50'deki pointer'ın değerini Dizi tabanı pointer'ının değerinden çıkarmaktır. FRE'nin verdiği değeri bu iki pointer'in içerikleriyle oynayarak değiştirebilirsiniz. RAM'in bir kısmını başka bir amaç, örneğin bir makine dili subrutini ya da bit-map grafik ekranı için ayırmak daha da yararlı olabilirdi. Örneğin Bellek-Sonu pointer'ını şununla değiştirin: POKE 56,128 Bu POKE işlemine alternatif olarak bir CLR komutu kullanabilirsiniz. Dizi-Tabanı pointer'ını Bellek-Tavanı ile eşitlemenin yanı sıra, CLR Sıra-Sonu 49,50 pointer'ını ve Sıra-Başlangıcı pointer'ını Değişkenlerin-Başlangıcı pointer'ıyla da eşitler. Sonuçta tüm program değişkenleri kaybolur ama program bellekte kalır. Eğer CLR çalışan bir programdan uygulanırsa, tüm değişkenler resetlenir. For-Next ve Go-Sub referansları kaybolur ve girdi/çıktı etkinliği engellenir, dosyalar engellenir (ama kapatılmaz) ve klavye ve ekran etkin girdi/çıktı araçları haline gelirler. Bir Basic programının sonunda yer ayırmak da mümkündür. Program yüklendikten sonra, Değişkenleri-Başlangıcı'nın içeriğini kontrol edin, onu ihtiyaç duyduğunuz alan kadar arttırın ve CLR komutunu kullanarak diğer pointer'ları da buna uygun bir şekilde ayarlayın. Ayrılan alanı istediğiniz data ile doldurabilirsiniz. Sonraki SAVE komutu yalnızca programı save etmekle kalmayacak program sonunda rezerve ettiğiniz bellek içeriklerini de save edecektir. Son olarak Basic-Başlangıcı bir miktar yukarı çıkarılarak program başlamadan önce bir miktar yer ayrılabilir. Örneğin 1K'yi yerleştirebilmek için, şunu girin: