Commodore sayı 73, sayfa 11

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 11

Neredeyse iki aydır “ROM rutinlerini açıklayacağım” deyip deyip teorik bilgileri sıralıyordum. Ama emin olun bütün teorik bilgiler birazdan vermeye başlayacağım rutinlerin ne olduğunu anlamanıza yardım edecek. Eğer doğrudan rutinlere kalkışsaydım, herkesin kafasında koca koca soru işaretleri kalacaktı (dediğimde bunun Floating Point Accumulator'u! -Bir Ayan Nokta Değişkeni diyebiliriz mesela- olduğunu kaçınız tahmin edebilirdiniz?). Teorik bilgilerle sizi neden sıktığımı da anlatıp içimi rahatlattıktan sonra, bu ay neleri anlatacağımı kısaca özetleyeyim: Hepinizin makine dilinde çarpma, bölme, sinüs alma vb. işlemlerini yapmak için öldüğünüzü biliyorum, ama canınızı biraz daha sıkabilmek için ilk olarak sayıları değişik tam sayı formatlarından kesirli sayılara çeviren rutinlere değinmek istiyorum. Bu konu gerçekten de önemli sayılabilir, çünkü program hızlandırmak istediğiniz her yerde basit işlemleri ROM'a yaptırmak yerine kendiniz yapmak zorunda kalırsınız. Bu işlemleri de tam sayılar üzerinden yapmak çok daha kolaydır. İsterseniz size daha somut bir örnek vereyim: Diyelim ki, bir ile yüz arasında değişen tam sayıların ortalamasını alacak bir program yapacaksınız. İlk olarak kullanıcıdan aldığınız tüm sayıları birer baytlık tam sayı olarak saklarsınız. Sonra bunları basit ADC komutlarıyla iki baytlık bir yerde toplarsınız. Daha sonra bu sayıları birazdan vereceğim ROM rutinlerinden uygun olanıyla ikilik kesirli sayıya çevirirsiniz ve son olarak da -umarım bu ay verebileceğim- bölme rutiniyle girilen sayı miktarına bölersiniz. Bu sayede yapacağınız ortalama alma işlemi, kesirli sayılarla yapılandan hem daha hızlı olacaktır, hem de daha az bellek işgal edecektir.

Vedat Hallaç

Bu rutinleri bilmenin gerekliliğine ikna olduğunuza göre, adresleri vermeye başlayabilirim: Tam Sayıdan Kesirli Sayılara Geçiş

1. İşaretli bir bayt sayı - $BC3C: Aşağıdaki rutin bir baytlık işaretli bir sayıyı (-128..+127) kesirli sayıya çevirir. Negatif değerler -geçen sayıda da bahsettiğim gibi- A'da (akümülatörde) bulunan pozitif sayıya:

CLC ADC #$0L komutlarının uygulanmasıyla elde edilir. Sayının mutlak değeri de aynı işlemler sonucu bulunabilir. Aşağıdaki rutini çağırdığınızda sonucu FAC'a yerleştirirsiniz:

LDA (-127..128) SR $BC3C

A'da bulunan $80 -128'e, $FF -1'e, $7F +127'ye çevrilecektir. 2. İşaretsiz bir bayt sayı - $B3A2: Eğer baytın işareti yoksa, değeri 0-255 arasındaysa bu rutin kullanılır. Bu rutinde dikkat etmeniz gereken şey, baytı A'yla (akümülatörle) değil Y registeriyle iletmeniz:

LDY Hsayı (0..255) JSR $B3A2

Sonuçta $00 0'a, $80 128'e, $FF 255'e çevrilir. 3. İşaretli iki bayt sayı - $B395: İşaretini de bulunduran iki baytlık bir sayı (-32768..+32767) aşağıdaki basit rutin kullanılarak yerleştirilir: LDY #Alçak LDA #Yüksek JSR $B395

Bu rutinde de alçak ve yüksek baytın yerini karıştırmamaya bakın. Eğer 32767'yi çevirecekseniz:

32767 -$TFFF, LDY HSFF LDA JSR $B395

rutini kullanın. Y'de hep düşük değerlilik (alçak bayt) bulunmalıdır. Aşağıdaki sayılar sanırım konuyu tam olarak anlamanıza yardımcı olacaktır.

A Y Sonuç 00 00 0 00 01 1 00 FF +255 01 00 +256 7F FE +32767 80 00 -32768 FF FF -1 4. İşaretsiz iki bayt sayı - $BC49: Eğer iki baytlık sayınız her zaman pozitif değerler alacaksa aşağıdaki rutini kullanmalısınız. Yalnız bu rutinlere biraz dikkat edin, gittikçe karmaşıklaşıyor çünkü

LDY LDA gYüksek STY $63 STA $62 LDX SEC JSR $BC49

Bu rutin, sayınızın hep pozitif olduğunu varsayarak 0..65535 arasında bir sayı yerleştirir. İsterseniz A ve Y'ye verilen tipik değerler sonucunda ne sonuçlar alacağımıza bir göz atalım:

Klavyeyle gezinmek için ← ve → tuşları.