Bu sayfadaki yazılar
Sayfanın metni
Sayfa 19
I0A-I
satırını girdiğiniz zaman bilgisayarınızda aşağıdaki işlemler yapılır: -$0801 bölgesi sırasıyla şu değerleri alır: -bir sonraki satırın adresi -satır numarası (Düşük değerlikli, Yüksek değerlikli) -tokenler haline getirilmiş program satırı -satır sonunu belirten $00 baytı Bir monitör programıyla bu adresi incelediğimizde şunu görürüz:
«1 0800 00 09 08 0A 00 41 B2 31 «1 0808 00 00 00
Ve program bilgilerini saklayan adreslerde şu bilgilerle karşılaşırız:
«1 002B 01 08 OB 08 OB 08 OB 08 «1 0033 00 A0 00 00 00 A0
Bu değerleri yorumlamaya çalışalım. $2B/$2C adresleri $0801 adresini gösteriyor. Burası BASIC programının başlangiç adresi. $0801 adresine bir göz atarsak burada gelecek satırın adresini, yani $0809'u bulabiliriz (tabii ki $09 $08, yani düşükyüksek değerlikli bayt formatında). Daha sonraki baytta ($0803,$0804) satır numarasını düşük-yüksek değerlikli bayt formatında bulabiliriz. Yani $OA $00 — $000A — 10. Daha sonra da programın tokenler haline getirilmiş kodunu bulabiliriz. $41 ““A” harfinin ASCII karşılığıdır. $B2 BASIC yorumcusu için *—” anlamındadır. $31'de karşılığıdır. Bunlardan sonra gelen $00 baytı da satırın bittiğini gösterir. Bir sonraki program satırı da aynı sistematikle saklanır. Ama sadece bir satır girmiş olduğumuz için bir sonraki satırın adresi yerine $0000 buluruz. BASIC yorumcusunun kabulüne göre bu değer BASIC programın bittiğini gösterir. Bunu takip eden adres, yani $080B — $2D/$2E *'de saklanır ve hem programın sorunu, hem de normal değişkenlerin başlangıcını belirtir. Herhangi bir değişkenimiz olmadığı için, Array'lerin (dizilerin) başlangıcı da bu adrestedir. Eğer programı RUN ile çalıştırırsak A değişkeni için yer ayrılır: 0800 00 09 08 0A 00 41 B2 31 0808 00 00 00 41 00 81 00 00 «1 0810 00 00
002B 01 08 OB 08 12 08 12 08 «1 0033 00 A0 00 00 00 A0
Bakın. Şimdi değişkenlerin başı olan $2D/$2E $080B'yi gösterirken, dizilerin başı olan $2F/$30 $0812'yi gösteriyor. Kısaca, $080B-$0812 arasındaki 7 bayt bizim A değişkenine ayrıldı. Bu bölgeyi incelersek:
080B 41 00 81 00 00 00 00
Değişkenlerin saklandığı alan genelde 7
bayt uzunluğundadır. Bildiğiniz gibi değişken adları maksimum iki karakter olabilir. O zaman değişken girişinin ilk iki baytı değişkenin adına ayrılmış olmalıdır. $080B'de bulunan $41 - “A” bu varsayımımızı doğruluyor. Daha sonra gelen beş bayt, kolay kullanım açısından ondalık sayı formatında A değişkeninin değerini içerir. 82 00 00 00 00 sayısı ondalık düzende 1'e eşittir zaten. Bir de tam sayı değişkenleri kullanıldığı zaman ne olacağına bakalım isterseniz. Programın ilk satırını
I0A
şeklinde değiştirdiğimiz zaman bunu yapmış oluruz. Programı çalıştıralım ve BASIC ve sıfırıncı sayfanın durumuna bakalım:
«: 002B 01 08 0C 08 13 08 13 08 «1 0033 00 A0 00 00 00 A0
«1 0800 00 0A 08 0A 00 41 25 B2 «1 0808 31 00 00 00 Ci 80 00 01
0810 00 00 00
Sıfırıncı sayfa elemanlarının ne demek istediğini kolayca anlıyor olmanız lazım artık. Ama ben kopya çekmek isteyenler için tekrarlayayım: “BASIC programı $0801'de başlıyor ve $080C'de bitiyor. Bu adreste değişkenler başlıyor ve $080C-$0813 arasını istila etmişler. $0813'te başlaması gereken diziler ise henüz ortalıkta yoklar.”. Ne kadar kolay, değil mi? Dikkat ettiyseniz BASIC programı artık bir bayt daha uzun. Çünkü “We” karakterini araya ekledik. Şimdi A% değişkenin yerini bulmaya çalışın. Ben sizi bekliyorum... Buldunuz mu? Hayır mı? O zaman birlikte inceleyelim: Demin de söylediğim gibi değişkenler $080C'de başlıyor. O adreste ne var? $C1? Sakın bu baytın $41'le bir benzerliği olmasın? Aaa, sadece $41'in son biti 1 yapılmış o kadar ($80+$41). Bir sonraki bayt da bunu doğruluyor zaten. Demek ki son bit buradaki değişken bir tam sayı olacakmış. Bir de değişkenin değerini okumayı öğrendik mi tam sayılarla işimiz bitmiş demektir.
$C1 $80'den sonraki beş bayta 00 01 00 00 00 değerleri yerleşmiş. A'nın değeri 1 olduğuna göre ya ilk iki bayt $00 $01 —$0001 — 1 anlamına geliyor, ya da çok garip bir format kullanılmış. Bir iki sayıyla değerlikli olarak A%'nın değerini sakladığını görürüz. Demek ki tam sayılar 16 bitten fazla değer alamazlarmış. Sondaki üç bayta bir iş yakıştıramadığımıza göre herhangi bir işleri yoktur. Madem üç bayt boşa kullanılıyor, tam sayı değişkenleri kullanmak programın az bellek harcamasını sağlamaz. Hızda da herhangi bir artış yoktur. Hatta kesirli sayılara çevrileceği için daha da yavaşlatır. Öyleyse tam sayı formatını kullanmamak hayrımıza olacaktır. Bir değişken türü daha var kontrol etmemiz gereken: string değişkenleri. Şu satırı girin ve çalıştırın:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 18
0061 83 E0 00 00 00 00 0069 84 DO 00 00 00 00
., 1000. ASGILDA $61 ., 1002 202BBF JSR ., 1005 00 BRK
.G 1000
«1 0061 87 B6 00 00 00 00 00
Sonucu ondalık sayıya çevirirsek:
> 1011011 — 64416484241-97-7*13
Bir de 37'yi hesaplayalım: CO 00 00 00 00 7-83 E0 00 00 00 00
Bunları gene FAC ve ARG'a yerleştirmeliyiz. Yalnız işlemin ARG . FAC olarak yapılacağını unutmayın. Yani 3'ü $69'dan, 7'yi de itibaren yazmalıyız:
83 E0 00 00 00 00 «1 0069 84 CO 00 00 00 00
., 1000 ASGILDA $61 1002 207BBF JSR $BETB ., 1005 00 BRK .G 1000
0061 0061 8C 88 BO 00 02 00 00
Türkçesi: 1.000 1000 1011 0000 0000 0000 0000 0010 1000 1000 1011. 0000 0000 0000 0000 0010 —20484128484241-41.9*10.-6 Ne garip değil mi? 2187 kısmı doğru, ama sonuna garip garip sayılar gelmiş. Normalde sadece 9 rakam basılacağı için PRINT 3.7 yazınca ekranda 2187 görünür. Ama
PRINT 3.7-2187
yazdığınızda sıfır yerine 1.90734863E-06 görürsünüz. İyi de bu garip artık kısım nereden geliyor? Bu sorunu cevabını öğrenmek için üs alma rutinini incelediğimizde üs alma işleminin şu şekilde yapıldığını görürüz:
EXP(B*LOG(A)) EXP ve LOG işlemleri yalnızca belli bir dereceye kadar kesinlik gösterebildiği için -- sebebini daha sonra göreceğiz- işlemin sonucunun sonunda garip rakamlar kalması pek de sürpriz sayılmaz. Üs alma işleminin gerçekleştirilmesi için iki ayrı işlem yapılması gerektiği için bu işlem diğerleri arasında en yavaş işleyenidir. Ortalama olarak 50 milisaniyeden (saniyenin binde biri) biraz daha fazla zaman harcar. Bu yüzden basit üs alma işlemlerini elinizden geldiği kadar çarpma işlemleriyle yaparsanız hem daha hızlı, hem de daha kesin sonuçlar elde edersiniz. Mesela 3.2 işlemini 3*3 olarak yaptığınız zaman en az yirmi kaz hızlı çalışacaktır. İşlemlerin hızlarını daha sonra bir tablo halinde yayınlayacağız. Şu ana kadar öğrendiklerimizin pratikte kullanılabilmesi için BASIC yorumlayıcısının değişkenleri nasıl kullandığını öğrenmemiz gerekecek. Zero-page'da (sıfırıncı sayfa:$00-$FF arası belleğe verilen ad) birkaç adres değişkenler hakkında bilgi tutar. Bu adreslerde BASIC programın yeri, normal değişkenler, indeksli değişkenler ve string'- lerin (A$ gibi değişkenler) bellekteki yeri gibi değerli bilgiler saklanır. Değişkenlerin yerini gösteren adresler aşağıdaki tabloda göskarakterlerinin sonu $37/S38 BASICRAM'in sonu
Tablo-l: Sıfırıncı sayfa değişkenleri ve gösterdikleri adreslerin yerleşimi.
Bilgisayarınızı ilk açtığınız zaman BASIC programının yerleştiği adres $0801 2049 olarak belirlenmiştir. Bu alanın sonu $A000 adresidir.