Bu sayfadaki yazılar
Sayfanın metni
Sayfa 20
10 A$- “STRING” Monitörü gene kullanırsak:
«1 002B 01 08 13 08 TA 08 1A 08 «1 0033 00 A0 00 00 00 A0
«10800 00 11 08 CA 00 41 24 B2 «1 0808 22 53 54 52 49 4E 47 22 «1 0810 00 00 00 41 80 06 09 08 0818 00 00
Sıfırıncı sayfada string alanını gösteren baytlara baktığımızda her şeyin aynı kaldığını görürüz. Bu durumda değişkenin bulunduğu yeri incelemek oldukça işimize yarayabilir.
41 80 06 09 08 00 00
İlk iki baytın değişken adını gösterdiğinden eminiz artık. Ama string türünü göstermek için $41 $00 değişkeni $41 $80 olarak yazılmış. Yani, sadece ikinci baytın son biti 1'se değişken bir string'dir. Sonraki üç baytı yorumlarsak, ilk baytın karakter dizisinin uzunluğu, diğer ikisinin de adresi olduğunu tahmin edebiliriz. Burada yazıldığına göre, A$ değişkeninin içeriği altı karakter uzunluğunda ve $0809 adresinde yer alıyor. Ne kadar ilginç değil mi? BASIC programının içindeki yeri gösteriyor A$. Bu sayede oldukça bir yer kazancı sağlayabiliriz. İyi de karakterlerden birini değiştirmeye kalkarsak ne olacak? BASIC kullanırken edindiğimiz deneyimlere göre bir string'in içeriğini değiştirmek, BASIC programının yapısını değiştirmez. Yani bilgisayarımızın böyle bir değişiklik karşısında nasıl davranacağını test etmeliyiz. Haydi bakalım programınıza şu satırı ekleyin:
20 A$-LEFTS(A$,3)
Programı çalıştırın ve emektar monitörünüzü kullanın.
«1 002B 01 08 22 08 29 08 29 08 «1 0033 FD 9F 00 A0 00 A0
00 11 08 CA 00 41 24 B2 «1 0808 22 53 54 52 49 4E 47 22 * «1 0810 00 20 08 14 00 41 24 B2 0818 C8 28 41 24 2C 33 29 00
<1 0820 00 00 41 80 30 FD 9F 00 «1 0828 00
Değişkenler $0822'den başlıyor. 0822 41 80 30 FD 9F 00 00
Deminki söylediklerimi göz önüne aldığımızda değişkenin içeriğinin 3 karakter uzunluğunda olduğunu ve $9FFD adresinde yer aldığını rahatça görebiliriz. Demek ki değişkenin içeriğinde bir değişiklik yapmaya kalkarsak, BASIC program üzerinde işlem yapılmıyor ve $A000'dan geriye sayarak bu içerik için yer açıyor. $9FFD'ye baktığımızda A$'ın son hali olan “STR” harfleriyle karşılaşırız. Bu arada string yerinin göstericisi olan $33/$34'ün de $9FFD'ye kaydığına dikkatinizi çekerim. Demin bahsettiğim token haline getirme işinin neden yapıldığını anlamak için programın içindeki LEFT$'ı bulmaya çalışın. Bulamayanlar için yerini söyleyeyim: $0818. Ne güzel, değil mi? Beş karakterlik yer ayrılacağına tüm komut LEFT$ anlamına gelen tek bir bayta sığdırılmış ($C8). Hemen hemen tüm değişken türleri hakkında bilginiz oldu artık. Geriye sadece bu değişkenlerin gruplar halinde kullanılmasını sağlayan diziler (array) kaldı. Dizileri incelemek için, NEW komutunu verdikten sonra aşağıdaki programı girin ve RUN deyin,
10 DIM A(500)
Sıfırıncı sayfa değişkenleri şu şekilde düzenlenecektir:
«1 002B 01 08 10 08 10 08 E0 11 -:0033 00 A0 00 00 00 A0
Dizi (array) olmayan hiçbir değişken tanımlamadığımız için, değişkenlerin başlangıç ve bitiş adresleri aynı adresi, yani $0810'u gösteriyor. Bu adres aynı zamanda dizilerin de başlangıç adresi olarak kullanılıyor. Diziler için ayrılmış olan alan $11E0 adresine kadar sürdüğüne göre, A dizisi için: $11B0-$0810 = $09A0 = 2512 bayt ayrılmış. $0810 adresinden incelemeye başlarsak şu baytlarla karşılaşırız:
«10810 41 00 DO 09 01 01 F5 00 «10818 00 00 00 00 00 00 00 00 «1 0820 0000 00 00 00 00 00 00
İlk iki baytın değişken adı olduğunu tahmin etmeniz pek de güç olmamıştır artık. İki MSB'de (Most Significant Bit - En Yüksek Değerlikli Bit, yani 7. bit) 0 olduğuna göre değişkenimizin kesirli sayı tuttuğunu anlarız. Sonraki iki bayt, demin hesapladığımız dizi uzunluğunu Düşük-Yüksek değerlikli bayt formunda saklıyor. Daha sonraki baytı tahmin etmeniz hemen hemen imkansız. Ancak bir iki denemeden sonra bu sayının dizinin boyut sayısını tuttuğunu anlayabilirsiniz. Buradaki örnekte A dizisinin tek boyutlu olduğunu rahatça görebilirsiniz. Bu bayttan sonra gelen $01 $F5 = $01F5 = 501, dizi elemanlarının sayısını tutar. Dikkat ettiyseniz, bizim A'yı 500 elemanlı olarak tanımlamamıza rağmen, burada 501 eleman görünüyor. Bunun sebebi, A dizisinin (çoğu zaman unutulan) 0. elemanının da sayılmasıdır. DIM A(2) kullansaydınız, A(0), A(1) ve A(2) A dizisinin üç elemanını oluşturacaktı. Buraya kadar olan bölge, dizinin genel bilgisini içeriyordu. Bu bayttan sonraki baytlarda ise, sıfırıncı elemandan başlamak üzere, dizi elemanlarının değerleri yer alır. Eğer monitörden çıkıp, direkt modda (satır numarası vermeden) şunları yazarsanız bunu daha iyi gözlemleyebilirsiniz:
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 21
A(0)-10:A(I)- 11
Şimdi monitöre tekrar girin ve 0810 0820 arasına bir daha bakın:
41 00 DO 09 01 Ol F5 84 «1 0818 20 00 00 00 84 30 00 00 0820 00 00 00 00 00 00 00 00
Bu sayıların ondalık düzende yazılışları şunlardır:
$84 20 00 00 00 - -
Bir de çok boyutlu dizileri inceleyelim. Bunun için ilk olarak NEW komutunu verin ve direkt modda şu satırı girin:
DIM B(1,2,3)
Monitöre girin ve ilk olarak sıfırıncı sayfa değişkenlerini, daha sonra da 0800 bölgesini tarayın:
«1 002B 01 08 03 08 03 08 86 08 «1 003300 A0 00 00 00 A0
«1 0803 42 00 83 00 03 00 04 00 . «4 080B 03 00 02 00 00 00 00 00 «1 0813 00 00 00 00 00 00 00 00
İlk bakışta B değişkeni hemen dikkatimizi çekiyor zaten. İsimden sonra gelen bayt, dizinin $0083 = 131 bayt uzunluğunda olduğunu söylüyor. Bundan sonra da dizi boyutlarının büyüklükleri saklanıyordu. Bu örnekte $0004, $0003 ve $0002 sayıları rahatlıkla görülebiliyor. Nedendir bilinmez, bu sayılar sizin verdiğinizin tersine sıralanmışlar. “Buraya kadar tamam da, bu dizinin elemanları nasıl sıralanmışlar?” diyenlerinizin cevabını da hemen vereyim:
30 00 00 00
B(0,0,2)
B(0,0,0)
B(1,0,0) B(1,0,2) B(0,1,0) B(0,1,2) Bi1,1,0) B(0,2,0) B(0,2,2) Bi1,2,2) B(0,0,1) B(0,0,3) B(1,0,3) B(0,1,3) Bi1,1,1) Bi1,1,3) B(0,2,1) B(0,2,3) Bi1,2,1) B(1,2,3) Yukarıdaki listeden dizi elemanlarının na- sıl sıralandığını kolayca çıkarabilirsiniz. Aşa- ğıda DIM A(X,Y,2) ile açılan bir dizinin ele- manlarının bellekte hangi sırayla saklandı- ğını gösteren listeyi çıkaracak BASIC prog- ramını görebilirsiniz. 10 FOR K-0 TO X 20 FOR L-0TO Y 30 FOR M-0 TOZ 40 PRINT K*,”L*,”M 50 NEXT M,L,K Normal değişkenlerin aksine, dizilerde ele-
manın tam sayı veya string olmasına göre farklı sayıda kullanır. String dizilerinde de, normal stringlerde olduğu gibi, bir eleman girilene kadar bellekte yer ayrılmaz. Daha sonra $A000'dan aşağı inilir. Yukarıda anlattıklarımın ışığında bir dizinin BASIC alanınızda kaç bayt götüreceğini şu şekilde formüle edebiliriz.
Bellek 4 T*Çarpım(Eleman * 1)
Yukarıdaki formülde bulunan N, dizinin boyutunu, T'de dizinin tipini belli ediyor. Eğer diziniz tam sayı tutuyorsa 2, kesirli sayı tutuyorsa 5, string tutuyorsa 3 koymalısınız T yerine. Sonda bulunan Çarpım(Eleman + 1), tüm boyutların eleman sayılarına 1 ekleyerek, bu sayıları birbirleriyle çarpmanız gerektiğini söylüyor. En başta bulunan 5, iki baytlık isim, iki baytlık dizi uzunluğu ve bir baytlık dizi boyutu için gereken alanı hesaplanan değere ekliyor. Dizinin her boyutu için iki baytlık eleman sayısı tutulduğu için boyut sayısını 2 ile çarpıp toplam belleğe ekliyoruz. En iyisi demin verdiğimiz örnekler için gerekli bellek alanını bir de bu formülle hesaplayalım: 1. DIM A(500) N:1 T:5 - Bellek = 5 + 5 * (501) = 2510 bayt. Tam beklediğimiz gibi. 2. DIM B(1,2,3) N:3 T:5 - Bellek = 5 + 2*3 + 5 * (2*3*4) = 131 bayt. 3. DIM N:3, T:2 = 8 bayt. 4. DIM A$(100,100) N:2, T:3 = 5 + 2*2 + 3 * (101*101) = 30614 bayt. Bu kadar çok yer kapladığı için çoğu zaman bu büyüklükte bir dizi açamazsınız. Sadece dizi tablosu belleğin yaklaşık 30K'sını yiyor ve 10201 elemanın datalarının saklanması için (ve BASIC programını saklamak için) sadece 8K boş bellek kalıyor. Bu aylık bu kadar. Artık ROM'un BASIC'i nasıl yorumladığını, sayıları nasıl kullandığını oldukça iyi biliyorsunuz. Gelecek sayıya kadar anlamadığınız yerleri kapatmaya çalışın, çünkü bir iki tane örnek program yayınlamak istiyorum. Bu arada tüm çabalarınıza rağmen içinden çıkamadığınız yerler olursa bana yazmaktan çekinmeyin. Gelecek ay görüşmek üzere,