Bu sayfadaki yazılar
Sayfanın metni
Sayfa 12
Commodore BASIC işlemcisinin kesirli sayıları ilgilendiren oldukça fazla rutini vardır. Biz en basitinden, yani ondalık düzende bulunan bir sayıyı ikilik düzene çeviren rutine göz atacağız. İlk olarak. Ama bundan önce, Commodore'un sizle iletişim kurmasını sağlayan en önemli rutinine bir göz atmamız yerinde olur. Çünkü bu rutini sık sık kullanacağız. Bu rutin sıfırıncı sayfada yer alır ve CHRGET sembolik ismiyle tanınır. CHRGET'in yaptığı tek iş, kendisine her sıçranıldığında sırada duran klavyeden ilkini alıp size iletmektir. Ama bu işi yaparken bazı karakterler göz ardı edilir, bazıları da değişik anlamlar taşırlar. Rutine sıçranılabilecek bir adres daha vardır. CHRGOT adıyla tanınan bu adres, CHRGET ile son alınan baytı size tekrar iletir.
Bu rutinin en esnek yanı (ve RAM'de yer almasının sebebi) kendisini değiştiren bir rutin olmasıdır. Yani her baytı aldığınızda, kendi içinde bulunan bir vektörün (TXTPTR) gösterdiği adres bir artırılır. TXTPTR, okunacak bir sonraki harfin bellekteki adresini tutar. Eğer rutinin bellekteki halini incelerseniz olayı daha iyi kavrarsınız:
Cmp Bes Cmp Beg Sec Sbe Sec Bitir
CHRGET rutinine her sıçrayışınızda, CHRGOT'da ($0079) bulunan adres bir artırılır, bu adresteki değer alınır ve gerekli karşılaştırmalar yapılır. Eğer alınan geçerli bir harfse (kodu $3A'dan büyükse), harf A registerinde (akümülatörde) tutularak geri dönülür. Kodu $3A'dan küçükse, ilk olarak harfin boşluk olup olmadığı kontrol edilir. Eğer boşluksa, bir sonraki harf alınır. Yani BASIC, komutlar arasındaki boşlukları hiçbir zaman görmez. Eğer harf bir boşluk değilse yapılan çıkartma işlemlerinin akümülatör üzerinde hiçbir etkisi olmaz. Yalnızca elde bayrağı (carry flag) alınan harfe göre değer alır: Harf “0” ile “9” arasında bir rakamsa (kodu $30-$39 arasındaysa) elde bayrağı sıfır olur. Eğer son alınan harf iki nokta üstüste (“:”) ise geri dönüşte sıfır bayrağı da kaldırılır. Kısaca özetlersek: CHRGET rutini ilk olarak alınacak harfin yerini gösteren TXTPTR'nin değerini bir artırır ve alınan karakteri akümülatöre koyarak geri döner. Eğer bu karakter iki nokta üstüste ($3A) ise, ya da $00 ise sıfır bayrağı kaldırılır. $3A komut sonunu, $00 da satır sonunu belirtir. Eğer bir rakam okunduysa elde bayrağı temizlenir. Artık ondalık düzendeki kesirli sayıları ikilik sisteme çevirecek rutini inceleyebiliriz. $BCF3 adresinde bulunan bu rutin, ASC-FLOAT adıyla tanınır. Bu rutini çağırdığınızda A'dan ilk rakam (veya işareti) bulunmalı ve bayraklar CHRGET'in ayarladığı şekilde durmalıdır. Doğal olarak TXTPTR'de sayının ASCII kodları bulunmalıdır.
-CHRGET rutininin bellekteki durumu.
—
88388888
bir sayıyı okuyarak ikilik kesirli sayılara çevirebilirsiniz: Programı kullanmak için SUPER ASSEMBLER'ı yükleyin ve çalıştırın. Daha sonra bir de monitör programı ($8000'de veya $C000'da çalışması iyi olur) yükleyin. Şimdi programı yazın, kasede veya diske kaydedin, RUN ile belleğe assemble edin. Daha sonra monitör programını çalıştırın.
D 033C
komutunu kullanarak programı görebilirsiniz. Sayınızın ASCII kodları $034B adresinde bulunur ve sonunda bulunan $00, sayının nerede bittiğini gösterir. Şimdi programı “G 033C” komutunu kullanarak çağırın. 1.2345 sayısının mantisa ve üs değerlerini tabloda bulunan adreslere bakarak rahatça görebilirsiniz:
M 0061 0066 30061 81 YE 04 18 93 00
İsterseniz bir de bildiğimiz 0.4'ü deneyelim. Değişik sayılar vermek için $034B adresinde bulunan rakamları değiştirmeniz gerekir.
M 034B 32 2E 32 33 34 35
sayıyı 30 2E 34 00 00 00 00 00 yapın. Programınızı şimdi çağırırsanız $0061'de 0.4'ün ikilik düzendeki karşılığını görebilirsiniz. Bu sonuç:
30061 7F CC CC CC CC 00
olacaktır. Sayının işareti ayrıca bir baytta tutulacaktır (altıncı bayt). Bu rutine yolladığınız sayıların başına +, - koyabilirsiniz. Ayrıca sayının içinde “on üzeri” anlamına gelen e karakterini kullanabilirsiniz. Yani -1000 yerine “-1e3”, ya da -0.001 yerine “-1e-3” kullanabilirsiniz. ROM'unuz bu gösterimi rahatlıkla anlayacaktır. İsterseniz şimdi bir de “-1E8” sayısını çevirelim. Sonuç olarak: 30061 9B BE BC 20 00 FF
Sanırım buraya kadar yaptıklarımızın kullanımını iyice öğrenmişsinizdir artık. İsterseniz birkaç örnek sayı bulup bunları elle hesaplayın, daha sonra yukarıdaki rutini kullanarak sonuçlarınızı test edin. Bunun oldukça yararı olacaktır. Şimdi tekrar 0.4 örneğimize dönelim. Sanırım çoğunuz 0.4'ü ikilik düzene çevirdiğimizde yuvarlanmamış olduğunu farketmişsinizdir. Yani bu rutini kullandığınızda yuvarlama işlemi otomatik olarak yapılmaz. Ama bu konuda gereken bilgiler gene de size iletilecektir. Tablo 1'de gerekli baytları açıklarken bir de yuvarlama baytından bahsetmiştim. Bu bayt işte burada işimize yarayacak... Şimdi 0.4 örneğini tekrar çalıştırın ve $0070 adresindeki değere bir göz atın. Burada $80 değerini göreceksiniz. Bu değer sonucun tam olarak bitmediğini ve son biti bir artırmanızı söyler size. Tabii ki bu işle de sizin ilgilenmeniz gerekmez ROM'da bu baytı kontrol eden ve gerekli durumda sayının son bitini bir artıran bir rutin mevcuttur. Deminki programı, yuvarlama işlemini de yapacak şekilde değiştirmek için aşağıdaki satırları programınıza ekleyin ve tekrar assemble edin.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 13
Bu programda 0.4 örneğini denediğimizde şu sonucu elde ederiz:
30061 TF CC CD 00
Gördüğünüz gibi sayı otomatik olarak yuvarlandı. Merak edenler için söyleyeyim, yuvarlama rutini bu işi yaparken yuvarlama baytını da temizler. Yani, hiçbir zaman yuvarlanmış bir sayının son bitinin tekrar artırılması söz konusu olmaz. Nasıl? Sayıları ikilik düzene çevirmek pek de zor değil, değil mi? Emin olun bu işin tersini yaptırmak daha da kolay. Tüm yapmanız gereken ikilik düzendeki bir sayıyı $0061'e yerleştirmek ve $BDDD adresinde bulunan FLOATASC adlı rutine sıçramak. Bütün işlemler bilgisayarınız tarafından gerçekleştirilecektir. Sonucu nasıl mı göreceğiz? $0100'a bir göz atarsanız sonucun ASCII değerlerini burada görebilirsiniz. İsterseniz bu konuda da biraz örnek çizelim:
30061 90 8F 00 00 00 80 girip $BDDD'ye sıçrayın (JSR $BDDD; BRK komutlarını monitörden kullanarak). Şimdi $0100'da yazılı olanlara bir bakalım:
30100 2D 33 36 36 30 38 00 00
Bu sonucu kullanıcıya kolayca iletebilmemiz için en sona $00 bile eklenmiş. Bütün yapmamız gereken Y, A'ya $0100 verip $AB1E'ye sıçramak. Bir sayıyı ikilik düzenden ASCII formatına çeviren ve bunu ekrana basan programcığı aşağıda bulabilirsiniz:
Bu programla ikilik düzenden ASCII'ye çevirdiklerinizi kolayca ekrana basabilirsiniz.
Bu aylık da yerimiz buraya kadar izin veriyor. Gelecek ay, ROM'da bulunan değişik rutinlerden bazılarının kullanılışını açıklamak istiyorum. Eğer yerimiz kalırsa basit matematik işlemlerinin adreslerini öğrenmeye de başlayabiliriz. Gelecek ay görüşene dek hoşçakalın.